Commit 318b94d2d943fd0a3ffca27c2da25c5b38571087

Authored by zhongnanhuang
2 parents 5cec63a4 15b4d1c2

Merge branch 'znh' into 'develop'

Znh



See merge request !17
src/pages/Order/components/AfterSalesDrawer.tsx 0 → 100644
  1 +import { RESPONSE_CODE } from '@/constants/enum';
  2 +import { postServiceOrderApplyAfterSales } from '@/services';
  3 +import { enumToSelect } from '@/utils';
  4 +import {
  5 + DrawerForm,
  6 + ProFormDigit,
  7 + ProFormSelect,
  8 + ProFormTextArea,
  9 +} from '@ant-design/pro-components';
  10 +import { Form, message } from 'antd';
  11 +import { AFTE_SALES_PLAN_OPTIONS } from '../constant';
  12 +export default ({ setVisible, mainOrder, subOrders, onClose }) => {
  13 + let subOrderIds = subOrders?.map((item: { id: any }) => {
  14 + return item.id;
  15 + });
  16 + let mainOrderId = mainOrder.id;
  17 + const [form] = Form.useForm<{
  18 + afterSalesNotes: string;
  19 + afterSalesPlan: string;
  20 + ids: [];
  21 + totalPayment: number;
  22 + }>();
  23 +
  24 + return (
  25 + <DrawerForm<{
  26 + afterSalesNotes: string;
  27 + afterSalesPlan: string;
  28 + subOrderIds: [];
  29 + totalPayment: number;
  30 + mainId: number;
  31 + }>
  32 + title="申请售后"
  33 + open
  34 + resize={{
  35 + onResize() {
  36 + console.log('resize!');
  37 + },
  38 + maxWidth: window.innerWidth * 0.8,
  39 + minWidth: 500,
  40 + }}
  41 + form={form}
  42 + autoFocusFirstInput
  43 + drawerProps={{
  44 + destroyOnClose: true,
  45 + onClose: () => {
  46 + setVisible(false);
  47 + },
  48 + }}
  49 + onFinish={async (values) => {
  50 + values.subOrderIds = subOrderIds;
  51 + values.mainId = mainOrderId;
  52 + let res = await postServiceOrderApplyAfterSales({ data: values });
  53 + if (res?.result === RESPONSE_CODE.SUCCESS) {
  54 + message.success(res.message);
  55 + onClose();
  56 + }
  57 + }}
  58 + >
  59 + <ProFormSelect
  60 + key="key"
  61 + label="售后方案"
  62 + width="lg"
  63 + showSearch
  64 + name="afterSalesPlan"
  65 + options={enumToSelect(AFTE_SALES_PLAN_OPTIONS)}
  66 + placeholder="请搜索"
  67 + rules={[{ required: true, message: '售后方案必填' }]}
  68 + ></ProFormSelect>
  69 + <ProFormDigit
  70 + width="lg"
  71 + name="totalPayment"
  72 + label="总金额调整"
  73 + min={0}
  74 + initialValue={mainOrder.totalPayment}
  75 + rules={[{ required: true, message: '总金额必填' }]}
  76 + />
  77 + <ProFormTextArea
  78 + width="lg"
  79 + label="售后原因"
  80 + name="afterSalesNotes"
  81 + rules={[{ required: true, message: '售后原因必填' }]}
  82 + />
  83 + </DrawerForm>
  84 + );
  85 +};
... ...
src/pages/Order/components/DeliverModal.tsx
1 1 import { RESPONSE_CODE } from '@/constants/enum';
2 2 import {
  3 + postServiceOrderProcureSend,
3 4 postServiceOrderSendProduct,
4 5 postServiceOrderSupplierSendOrder,
5 6 } from '@/services';
... ... @@ -156,6 +157,8 @@ const DeliverModal = ({
156 157 let res;
157 158 if (optType(CHECK_TYPE.SUPPLIER)) {
158 159 res = await postServiceOrderSupplierSendOrder({ data: body });
  160 + } else if (optType(CHECK_TYPE.PROCURE)) {
  161 + res = await postServiceOrderProcureSend({ data: body });
159 162 } else {
160 163 res = await postServiceOrderSendProduct({ data: body });
161 164 }
... ...
src/pages/Order/components/FinancialDrawer.tsx
... ... @@ -140,6 +140,17 @@ export default ({
140 140 ]
141 141 : ''}
142 142  
  143 + {/* <ProFormSelect
  144 + placeholder="是否完全开票"
  145 + name="invoicingType"
  146 + width="lg"
  147 + label="是否完全开票"
  148 + options={[{label:'部分开票',value:'部分开票'},{label:'完全开票',value:'完全开票'}]}
  149 + onChange={setInvoicingStatus}
  150 + initialValue={'完全开票'}
  151 + // disabled={mainInfoDisbled}
  152 + rules={[{ required: true, message: '是否需要开票必填' }]}
  153 + /> */}
143 154 <ProFormTextArea
144 155 width="lg"
145 156 name="invoicingNotes"
... ...
src/pages/Order/components/HistoryModal.tsx
... ... @@ -8,10 +8,11 @@ import {
8 8 ORDER_STATUS_OPTIONS,
9 9 } from '../constant';
10 10  
11   -export default ({ subOrders, onClose }) => {
  11 +export default ({ subOrders, isCancelledOrder, onClose }) => {
12 12 let subOrderIds = subOrders?.map((subOrder: any) => {
13 13 return subOrder.id;
14 14 });
  15 +
15 16 const [data, setData] = useState([]);
16 17 const [loading, setLoading] = useState(true);
17 18 let i = 0;
... ... @@ -22,7 +23,7 @@ export default ({ subOrders, onClose }) =&gt; {
22 23  
23 24 const getHistory = async () => {
24 25 let res = await postServiceOrderQueryHistoryOrderRecord({
25   - data: { ids: subOrderIds },
  26 + data: { ids: subOrderIds, isDeleteQueryOrder: isCancelledOrder },
26 27 });
27 28 setData(res.data);
28 29 setLoading(false);
... ...
src/pages/Order/components/ProcureCheckModal.tsx
... ... @@ -49,10 +49,14 @@ export default ({ setCheckVisible, data, subOrders, onClose }) =&gt; {
49 49 }}
50 50 submitTimeout={2000}
51 51 onFinish={async (values) => {
  52 + let procureIsPrintAndSend = false;
  53 + if (values.name === '采购自行发货') {
  54 + procureIsPrintAndSend = true;
  55 + }
52 56 return doCheck({
53 57 ids: subOrderIds,
54 58 supplier: values.name,
55   - procureIsPrintAndSend: false,
  59 + procureIsPrintAndSend: procureIsPrintAndSend,
56 60 });
57 61 }}
58 62 onOpenChange={setCheckVisible}
... ...
src/pages/Order/constant.ts
... ... @@ -102,12 +102,23 @@ export const ORDER_STATUS_OPTIONS = {
102 102 AUDITED: '已审核',
103 103 PROCURE_UN_PROCESS: '采购未审核',
104 104 PROCURE_PROCESS: '采购已审核',
105   - SUPPLIER_WAIT_SHIP: '供应商-待发货',
106   - SUPPLIER_SHIPPED: '供应商-已发货',
  105 + PROCURE_PROCESS_FOR_MINE: '采购待打印',
  106 + PROCURE_WAIT_SHIP: '采购待发货',
  107 + SUPPLIER_WAIT_SHIP: '供应商待发货',
107 108 WAIT_SHIP: '待发货',
108 109 SHIPPED: '已发货',
109 110 CONFIRM_RECEIPT: '确认收货',
110 111 AUDIT_FAILED: '审核失败',
  112 + IN_AFTER_SALES: '售后中',
  113 + AFTER_SALES_COMPLETION: '售后完成',
  114 + NO_NEED_SEND: '无需发货',
  115 +};
  116 +
  117 +export const AFTE_SALES_PLAN_OPTIONS = {
  118 + RETURNS_OR_REFUNDS: '退货/退款',
  119 + EXCHANGE_GOODS: '换货',
  120 + FREE_ORDER: '免单',
  121 + DISCOUNT: '折扣',
111 122 };
112 123  
113 124 export const FINANCIAL_STATUS_OPTIONS = {
... ... @@ -132,6 +143,11 @@ export const TAGS_COLOR = new Map&lt;string, string&gt;([
132 143 ['PROCURE_PROCESS', 'processing'],
133 144 ['SUPPLIER_WAIT_SHIP', 'processing'],
134 145 ['SUPPLIER_SHIPPED', 'processing'],
  146 + ['IN_AFTER_SALES', 'red'],
  147 + ['AFTER_SALES_COMPLETION', 'red'],
  148 + ['PROCURE_PROCESS_FOR_MINE', 'processing'],
  149 + ['PROCURE_WAIT_SHIP', 'processing'],
  150 + ['NO_NEED_SEND', 'success'],
135 151 ]);
136 152  
137 153 export const SALES_CODE_OPTIONS = [
... ... @@ -196,6 +212,10 @@ export const HISTORY_OPT_TYPE = new Map&lt;string, string&gt;([
196 212 ['PROCURE_CHECK_ORDER', '采购审核'],
197 213 ['SUPPLIER_PRINT', '供应商打印'],
198 214 ['EXTERNAL_PROCUREMENT', '仓库操作外部采购子订单'],
  215 + ['APPLY_AFTER_SALES', '申请售后子订单'],
  216 + ['AFTER_SALES_COMPLETION', '完成售后子订单'],
  217 + ['PROCURE_PRINT', '采购打印子订单'],
  218 + ['PROCURE_SEND', '采购发货子订单'],
199 219 ]);
200 220  
201 221 export const MAIN_ORDER_COLUMNS = [
... ... @@ -208,7 +228,7 @@ export const MAIN_ORDER_COLUMNS = [
208 228 {
209 229 title: '订单编号',
210 230 dataIndex: 'id',
211   - valueType: 'digit',
  231 + valueType: 'text',
212 232 hideInTable: true,
213 233 },
214 234 {
... ... @@ -254,6 +274,18 @@ export const MAIN_ORDER_COLUMNS = [
254 274 hideInTable: true,
255 275 },
256 276 {
  277 + title: '主订单备注',
  278 + dataIndex: 'mainNotes',
  279 + valueType: 'text',
  280 + hideInTable: true,
  281 + },
  282 + {
  283 + title: '子订单备注',
  284 + dataIndex: 'subNotes',
  285 + valueType: 'text',
  286 + hideInTable: true,
  287 + },
  288 + {
257 289 title: '商品参数',
258 290 dataIndex: 'parameters',
259 291 valueType: 'text',
... ...
src/pages/Order/index.tsx
1 1 import ButtonConfirm from '@/components/ButtomConfirm';
2 2 import { RESPONSE_CODE } from '@/constants/enum';
3 3 import {
  4 + postServiceOrderAfterSalesCompletion,
  5 + postServiceOrderNoNeedSend,
4 6 postServiceOrderOrderCancel,
5 7 postServiceOrderQueryServiceOrder,
6 8 } from '@/services';
... ... @@ -14,6 +16,7 @@ import {
14 16 DownOutlined,
15 17 EditTwoTone,
16 18 EllipsisOutlined,
  19 + QuestionCircleOutlined,
17 20 } from '@ant-design/icons';
18 21 import {
19 22 PageContainer,
... ... @@ -37,6 +40,7 @@ import {
37 40 import { cloneDeep } from 'lodash';
38 41 import { Key, useRef, useState } from 'react';
39 42 import OrderPrintModal from '../OrderPrint/OrderPrintModal';
  43 +import AfterSalesDrawer from './components/AfterSalesDrawer';
40 44 import AttachmentModal from './components/AttachmentModal';
41 45 import CheckModal from './components/CheckModal';
42 46 import ConfirmReceiptModal from './components/ConfirmReceiptModal';
... ... @@ -50,6 +54,7 @@ import OrderNotesEditModal from &#39;./components/OrderNotesEditModal&#39;;
50 54 import ProcureCheckModal from './components/ProcureCheckModal';
51 55 import SubOrderComfirmReceiptImagesModal from './components/SubOrderComfirmReceiptImagesModal';
52 56 import {
  57 + AFTE_SALES_PLAN_OPTIONS,
53 58 CHECK_TYPE,
54 59 LOGISTICS_STATUS_OPTIONS,
55 60 MAIN_ORDER_COLUMNS,
... ... @@ -76,6 +81,8 @@ const OrderPage = () =&gt; {
76 81 const [attachmentModalVisible, setAttachmentModalVisible] =
77 82 useState<boolean>(false);
78 83 const [financialVisible, setFinancialVisible] = useState<boolean>(false);
  84 + const [afterSalesDrawerVisible, setAfterSalesDrawerVisible] =
  85 + useState<boolean>(false);
79 86 const [historyModalVisible, setHistoryModalVisible] =
80 87 useState<boolean>(false);
81 88 const [isRePrintOrder, setIsRePrintOrder] = useState<boolean>(false);
... ... @@ -104,7 +111,9 @@ const OrderPage = () =&gt; {
104 111 const [pageSize, setPageSize] = useState(10);
105 112 const [currentPage, setCurrentPage] = useState(1);
106 113 const [orderCheckType, setOrderCheckType] = useState('');
  114 + const [onlyShowCancelOrder, setOnlyShowCancelOrder] = useState(false);
107 115 const mainTableRef = useRef();
  116 + let [searchParams, setSearchParam] = useState(Object); //表格的查询条件存储
108 117 const [messageApi, contextHolder] = message.useMessage();
109 118  
110 119 // const openCheckNotes = (checkNotes: string) => {
... ... @@ -139,6 +148,11 @@ const OrderPage = () =&gt; {
139 148 setSelectedRowKeys([]);
140 149 };
141 150  
  151 + function changeCancelOrderShow(e: any) {
  152 + setOnlyShowCancelOrder(e.target.checked);
  153 + refreshTable();
  154 + }
  155 +
142 156 // const resize = () => {
143 157 // // 计算元素底部到视口顶部的距离
144 158 // let bottomDistance = document
... ... @@ -164,6 +178,18 @@ const OrderPage = () =&gt; {
164 178 // window.addEventListener('resize', resize);
165 179 // });
166 180  
  181 + const MyToolTip = ({ title, content }) => {
  182 + return (
  183 + <Tooltip
  184 + color="#FFFFFF"
  185 + placement="bottom"
  186 + title={<div className="px-5 py-4 text-black">{title}</div>}
  187 + >
  188 + {content}
  189 + </Tooltip>
  190 + );
  191 + };
  192 +
167 193 const onCheckboxChange = (record: never) => {
168 194 let newSelectedItems = [];
169 195 if (selectedItems.includes(record.id)) {
... ... @@ -222,20 +248,87 @@ const OrderPage = () =&gt; {
222 248 };
223 249 //子订单内容渲染
224 250 const SubOderRander = ({ record, optRecord }) => {
  251 + /**
  252 + * 获取订单状态标签
  253 + * @param optRecord
  254 + */
  255 + function getOrderStatusTag(optRecord: any): import('react').ReactNode {
  256 + const orderStatus = optRecord.orderStatus;
  257 + if (orderStatus === 'AUDIT_FAILED') {
  258 + return (
  259 + <MyToolTip
  260 + title={optRecord.checkNotes}
  261 + content={
  262 + <>
  263 + <Tag
  264 + color={TAGS_COLOR.get(optRecord.orderStatus)}
  265 + style={{ marginRight: '4px' }}
  266 + >
  267 + {enumValueToLabel(
  268 + optRecord.orderStatus,
  269 + ORDER_STATUS_OPTIONS,
  270 + )}
  271 + </Tag>
  272 + <QuestionCircleOutlined style={{ color: '#C1C1C1' }} />
  273 + </>
  274 + }
  275 + />
  276 + );
  277 + }
  278 +
  279 + if (
  280 + orderStatus === 'AFTER_SALES_COMPLETION' ||
  281 + orderStatus === 'IN_AFTER_SALES'
  282 + ) {
  283 + return (
  284 + <MyToolTip
  285 + title={
  286 + enumValueToLabel(
  287 + optRecord.afterSalesPlan,
  288 + AFTE_SALES_PLAN_OPTIONS,
  289 + ) +
  290 + ' ' +
  291 + optRecord.afterSalesNotes
  292 + }
  293 + content={
  294 + <>
  295 + <Tag
  296 + color={TAGS_COLOR.get(optRecord.orderStatus)}
  297 + style={{ marginRight: '4px' }}
  298 + >
  299 + {enumValueToLabel(
  300 + optRecord.orderStatus,
  301 + ORDER_STATUS_OPTIONS,
  302 + )}
  303 + </Tag>
  304 + <QuestionCircleOutlined style={{ color: '#C1C1C1' }} />
  305 + </>
  306 + }
  307 + />
  308 + );
  309 + }
  310 +
  311 + return (
  312 + <Tag color={TAGS_COLOR.get(optRecord.orderStatus)}>
  313 + {enumValueToLabel(optRecord.orderStatus, ORDER_STATUS_OPTIONS)}
  314 + </Tag>
  315 + );
  316 + }
  317 +
225 318 return (
226 319 <Flex className="w-full border-b-indigo-500">
227 320 <Flex vertical className="w-[31%]" gap="small">
228 321 {/* 商品名称 */}
229 322 <div
230   - className="whitespace-no-wrap overflow-hidden overflow-ellipsis"
  323 + className="overflow-hidden whitespace-no-wrap overflow-ellipsis"
231 324 title={optRecord.productName}
232 325 >
233   - <span className="text-black font-medium ">
  326 + <span className="font-medium text-black ">
234 327 {optRecord.productName}
235 328 </span>
236 329 </div>
237 330 <div
238   - className="whitespace-no-wrap overflow-hidden overflow-ellipsis"
  331 + className="overflow-hidden whitespace-no-wrap overflow-ellipsis"
239 332 title={optRecord.parameters}
240 333 >
241 334 <span className="text-[#8C8C8C]">参数:{optRecord.parameters}</span>
... ... @@ -256,24 +349,40 @@ const OrderPage = () =&gt; {
256 349 }}
257 350 />
258 351 </Flex>
  352 +
  353 + <Flex title={optRecord.notes}>
  354 + <div className="max-w-[90%] whitespace-no-wrap overflow-hidden overflow-ellipsis">
  355 + <span className="text-[#8C8C8C]">
  356 + 开票备注:请将2312210003,2312210002,2312210001订单合并开票
  357 + </span>
  358 + </div>
  359 + {/* 编辑备注按钮 */}
  360 + <EditTwoTone
  361 + onClick={() => {
  362 + setNotesEditVisible(true);
  363 + setOrderRow(optRecord);
  364 + setIsMainOrder(false);
  365 + }}
  366 + />
  367 + </Flex>
259 368 </Flex>
260 369 <Flex className="w-[16%]" vertical gap="small">
261 370 <div
262   - className="whitespace-no-wrap overflow-hidden overflow-ellipsis"
  371 + className="overflow-hidden whitespace-no-wrap overflow-ellipsis"
263 372 title={optRecord.productPrice}
264 373 >
265 374 <span className="text-[#8C8C8C]">单价:</span>
266 375 <span className="text-slate-700">¥{optRecord.productPrice}</span>
267 376 </div>
268 377 <div
269   - className="whitespace-no-wrap overflow-hidden overflow-ellipsis"
  378 + className="overflow-hidden whitespace-no-wrap overflow-ellipsis"
270 379 title={optRecord.quantity}
271 380 >
272 381 <span className="text-[#8C8C8C]">数量:</span>
273 382 <span className="text-slate-700">x{optRecord.quantity}</span>
274 383 </div>
275 384 <div
276   - className="whitespace-no-wrap overflow-hidden overflow-ellipsis"
  385 + className="overflow-hidden whitespace-no-wrap overflow-ellipsis"
277 386 title={optRecord.subOrderPayment}
278 387 >
279 388 <span className="text-[#8C8C8C]">合计:</span>
... ... @@ -284,7 +393,7 @@ const OrderPage = () =&gt; {
284 393 </Flex>
285 394 <Flex className="w-[10%]" vertical gap="small">
286 395 {/* 支付方式 */}
287   - <div className="whitespace-no-wrap overflow-hidden overflow-ellipsis">
  396 + <div className="overflow-hidden whitespace-no-wrap overflow-ellipsis">
288 397 <span className="text-slate-700">
289 398 {enumValueToLabel(
290 399 optRecord.paymentMethod,
... ... @@ -293,7 +402,7 @@ const OrderPage = () =&gt; {
293 402 </span>
294 403 </div>
295 404 {/* 支付渠道 */}
296   - <div className="whitespace-no-wrap overflow-hidden overflow-ellipsis">
  405 + <div className="overflow-hidden whitespace-no-wrap overflow-ellipsis">
297 406 <span className="text-slate-700">
298 407 {enumValueToLabel(
299 408 optRecord.paymentChannel,
... ... @@ -305,7 +414,7 @@ const OrderPage = () =&gt; {
305 414 <Flex className="w-[15%]" vertical gap="small">
306 415 {/* 所属部门 */}
307 416 <div
308   - className="whitespace-no-wrap overflow-hidden overflow-ellipsis"
  417 + className="overflow-hidden whitespace-no-wrap overflow-ellipsis"
309 418 title={enumValueToLabel(
310 419 optRecord.productBelongBusiness,
311 420 PRODUCT_BELONG_DEPARTMENT_OPTIONS,
... ... @@ -320,16 +429,23 @@ const OrderPage = () =&gt; {
320 429 </div>
321 430  
322 431 {/* 开票类型 */}
323   - <div className="whitespace-no-wrap overflow-hidden overflow-ellipsis">
  432 + <div className="overflow-hidden whitespace-no-wrap overflow-ellipsis">
324 433 <span className="text-slate-700">
325 434 {getInvoicingType(optRecord)}
326 435 </span>
327 436 </div>
  437 +
  438 + {/* 开票状态 */}
  439 + {/* <div className="overflow-hidden whitespace-no-wrap overflow-ellipsis">
  440 + <span className="text-slate-700">
  441 + 部分开票
  442 + </span>
  443 + </div> */}
328 444 </Flex>
329 445  
330 446 <Flex className="w-[10%]" vertical gap="small">
331 447 {/* 开票状态 */}
332   - <div className="whitespace-no-wrap overflow-hidden overflow-ellipsis">
  448 + <div className="overflow-hidden whitespace-no-wrap overflow-ellipsis">
333 449 <Tag
334 450 color={
335 451 optRecord.invoicingTime === null ||
... ... @@ -342,43 +458,40 @@ const OrderPage = () =&gt; {
342 458 </Tag>
343 459 </div>
344 460 {/* 订单状态 */}
345   - <div className="whitespace-no-wrap overflow-hidden overflow-ellipsis">
346   - <Tag color={TAGS_COLOR.get(optRecord.orderStatus)}>
347   - {enumValueToLabel(optRecord.orderStatus, ORDER_STATUS_OPTIONS)}
348   - </Tag>
  461 + <div className="overflow-hidden whitespace-no-wrap overflow-ellipsis">
  462 + {getOrderStatusTag(optRecord)}
349 463 </div>
350 464  
351 465 {/* 物流信息 */}
352   - <div className="whitespace-no-wrap overflow-hidden overflow-ellipsis">
  466 + <div className="overflow-hidden whitespace-no-wrap overflow-ellipsis">
353 467 {optRecord.orderStatus === 'CONFIRM_RECEIPT' ||
  468 + optRecord.orderStatus === 'AFTER_SALES_COMPLETION' ||
  469 + optRecord.orderStatus === 'IN_AFTER_SALES' ||
354 470 optRecord.orderStatus === 'SHIPPED' ? (
355   - <Tooltip
356   - color="#FFFFFF"
357   - placement="bottom"
  471 + <MyToolTip
358 472 title={
359   - <div className="text-black px-5 py-4">
360   - {optRecord.serialNumber === undefined
361   - ? '暂无物流信息'
362   - : enumValueToLabel(
363   - optRecord.logisticsMethod,
364   - LOGISTICS_STATUS_OPTIONS,
365   - ) +
366   - ' ' +
367   - optRecord.serialNumber}
368   - </div>
  473 + optRecord.serialNumber === undefined
  474 + ? '暂无物流信息'
  475 + : enumValueToLabel(
  476 + optRecord.logisticsMethod,
  477 + LOGISTICS_STATUS_OPTIONS,
  478 + ) +
  479 + ' ' +
  480 + optRecord.serialNumber
369 481 }
370   - >
371   - <Button type="link" size="small" style={{ padding: 0 }}>
372   - 物流信息
373   - </Button>
374   - </Tooltip>
  482 + content={
  483 + <Button type="link" size="small" style={{ padding: 0 }}>
  484 + 物流信息
  485 + </Button>
  486 + }
  487 + />
375 488 ) : (
376 489 ''
377 490 )}
378 491 </div>
379 492 </Flex>
380 493 <Flex className="w-[18%]" wrap="wrap" gap="small">
381   - {optRecord.subPath.includes('sendProduct') ? (
  494 + {optRecord.subPath?.includes('sendProduct') ? (
382 495 <Button
383 496 className="p-0"
384 497 type="link"
... ... @@ -390,13 +503,13 @@ const OrderPage = () =&gt; {
390 503 setOrderCheckType(CHECK_TYPE.NORMAL);
391 504 }}
392 505 >
393   - 发货
  506 + 仓库发货
394 507 </Button>
395 508 ) : (
396 509 ''
397 510 )}
398 511  
399   - {optRecord.subPath.includes('supplierSendOrder') ? (
  512 + {optRecord.subPath?.includes('supplierSendOrder') ? (
400 513 <Button
401 514 className="p-0"
402 515 type="link"
... ... @@ -414,7 +527,25 @@ const OrderPage = () =&gt; {
414 527 ''
415 528 )}
416 529  
417   - {optRecord.subPath.includes('queryAnnex') &&
  530 + {optRecord.subPath?.includes('procureSend') ? (
  531 + <Button
  532 + className="p-0"
  533 + type="link"
  534 + onClick={() => {
  535 + optRecord.mainOrderId = record.id;
  536 + setSelectedRows([cloneDeep(optRecord)]); //克隆一份数据,避免后续修改污染
  537 + setDeliverVisible(true);
  538 + setIsSendProduct(true);
  539 + setOrderCheckType(CHECK_TYPE.PROCURE);
  540 + }}
  541 + >
  542 + 采购发货
  543 + </Button>
  544 + ) : (
  545 + ''
  546 + )}
  547 +
  548 + {optRecord.subPath?.includes('queryAnnex') &&
418 549 optRecord.listAnnex?.length > 0 ? (
419 550 <Button
420 551 className="p-0"
... ... @@ -431,7 +562,7 @@ const OrderPage = () =&gt; {
431 562 ''
432 563 )}
433 564  
434   - {optRecord.subPath.includes('modifySendInformation') ? (
  565 + {optRecord.subPath?.includes('modifySendInformation') ? (
435 566 <Button
436 567 className="p-0"
437 568 type="link"
... ... @@ -448,7 +579,7 @@ const OrderPage = () =&gt; {
448 579 ''
449 580 )}
450 581  
451   - {optRecord.subPath.includes('printOrder') ? (
  582 + {optRecord.subPath?.includes('printOrder') ? (
452 583 <Button
453 584 className="p-0"
454 585 type="link"
... ... @@ -459,13 +590,13 @@ const OrderPage = () =&gt; {
459 590 setOrderCheckType(CHECK_TYPE.NORMAL);
460 591 }}
461 592 >
462   - 打印
  593 + 仓库打印
463 594 </Button>
464 595 ) : (
465 596 ''
466 597 )}
467 598  
468   - {optRecord.subPath.includes('supplierPrint') ? (
  599 + {optRecord.subPath?.includes('supplierPrint') ? (
469 600 <Button
470 601 className="p-0"
471 602 type="link"
... ... @@ -476,13 +607,30 @@ const OrderPage = () =&gt; {
476 607 setOrderCheckType(CHECK_TYPE.SUPPLIER);
477 608 }}
478 609 >
479   - 打印
  610 + 供应商打印
  611 + </Button>
  612 + ) : (
  613 + ''
  614 + )}
  615 +
  616 + {optRecord.subPath?.includes('procurePrint') ? (
  617 + <Button
  618 + className="p-0"
  619 + type="link"
  620 + onClick={async () => {
  621 + setOrderPrintVisible(true);
  622 + setSelectedRows([optRecord]);
  623 + setOrderRow(record);
  624 + setOrderCheckType(CHECK_TYPE.PROCURE);
  625 + }}
  626 + >
  627 + 采购打印
480 628 </Button>
481 629 ) : (
482 630 ''
483 631 )}
484 632  
485   - {optRecord.subPath.includes('editOrder') ? (
  633 + {optRecord.subPath?.includes('editOrder') ? (
486 634 <Button
487 635 className="p-0"
488 636 type="link"
... ... @@ -498,7 +646,7 @@ const OrderPage = () =&gt; {
498 646 ) : (
499 647 ''
500 648 )}
501   - {optRecord.subPath.includes('invoicing') ? (
  649 + {optRecord.subPath?.includes('invoicing') ? (
502 650 <Button
503 651 className="p-0"
504 652 type="link"
... ... @@ -515,7 +663,7 @@ const OrderPage = () =&gt; {
515 663 ) : (
516 664 ''
517 665 )}
518   - {optRecord.subPath.includes('checkOrder') ? (
  666 + {optRecord.subPath?.includes('checkOrder') ? (
519 667 <Button
520 668 className="p-0"
521 669 type="link"
... ... @@ -532,7 +680,7 @@ const OrderPage = () =&gt; {
532 680 ''
533 681 )}
534 682  
535   - {optRecord.subPath.includes('financeCheckOrder') ? (
  683 + {optRecord.subPath?.includes('financeCheckOrder') ? (
536 684 <Button
537 685 className="p-0"
538 686 type="link"
... ... @@ -549,7 +697,7 @@ const OrderPage = () =&gt; {
549 697 ''
550 698 )}
551 699  
552   - {optRecord.subPath.includes('procureCheckOrder') ? (
  700 + {optRecord.subPath?.includes('procureCheckOrder') ? (
553 701 <Button
554 702 className="p-0"
555 703 type="link"
... ... @@ -566,7 +714,7 @@ const OrderPage = () =&gt; {
566 714 ''
567 715 )}
568 716  
569   - {optRecord.subPath.includes('rePrintOrder') ? (
  717 + {optRecord.subPath?.includes('rePrintOrder') ? (
570 718 <Button
571 719 className="p-0"
572 720 type="link"
... ... @@ -583,7 +731,7 @@ const OrderPage = () =&gt; {
583 731 ''
584 732 )}
585 733  
586   - {optRecord.subPath.includes('confirmReceipt') ? (
  734 + {optRecord.subPath?.includes('confirmReceipt') ? (
587 735 <Button
588 736 className="p-0"
589 737 type="link"
... ... @@ -597,7 +745,64 @@ const OrderPage = () =&gt; {
597 745 ) : (
598 746 ''
599 747 )}
600   - {optRecord.subPath.includes('viewImages') ? (
  748 +
  749 + {optRecord.subPath?.includes('applyAfterSales') ? (
  750 + <Button
  751 + className="p-0"
  752 + type="link"
  753 + onClick={() => {
  754 + setAfterSalesDrawerVisible(true);
  755 + setSelectedRows([optRecord]);
  756 + setOrderRow(record);
  757 + }}
  758 + >
  759 + 申请售后
  760 + </Button>
  761 + ) : (
  762 + ''
  763 + )}
  764 +
  765 + {optRecord.subPath?.includes('afterSalesCompletion') ? (
  766 + <ButtonConfirm
  767 + className="p-0"
  768 + title="是否完成售后?"
  769 + text="完成售后"
  770 + onConfirm={async () => {
  771 + let res = await postServiceOrderAfterSalesCompletion({
  772 + data: { ids: [optRecord.id] },
  773 + });
  774 + if (res.result === RESPONSE_CODE.SUCCESS) {
  775 + message.success(res.message);
  776 + refreshTable();
  777 + return true;
  778 + }
  779 + }}
  780 + />
  781 + ) : (
  782 + ''
  783 + )}
  784 +
  785 + {optRecord.subPath?.includes('noNeedSend') ? (
  786 + <ButtonConfirm
  787 + className="p-0"
  788 + title="此订单是否无需发货?"
  789 + text="无需发货"
  790 + onConfirm={async () => {
  791 + let res = await postServiceOrderNoNeedSend({
  792 + data: { ids: [optRecord.id] },
  793 + });
  794 + if (res.result === RESPONSE_CODE.SUCCESS) {
  795 + message.success(res.message);
  796 + refreshTable();
  797 + return true;
  798 + }
  799 + }}
  800 + />
  801 + ) : (
  802 + ''
  803 + )}
  804 +
  805 + {optRecord.subPath?.includes('viewImages') ? (
601 806 <Button
602 807 className="p-0"
603 808 type="link"
... ... @@ -612,7 +817,7 @@ const OrderPage = () =&gt; {
612 817 ''
613 818 )}
614 819  
615   - {optRecord.subPath.includes('orderCancel') ? (
  820 + {optRecord.subPath?.includes('orderCancel') ? (
616 821 <ButtonConfirm
617 822 className="p-0"
618 823 title="确认作废?"
... ... @@ -641,7 +846,7 @@ const OrderPage = () =&gt; {
641 846 return (
642 847 <ProTable
643 848 id="sub-table"
644   - className=" w-full"
  849 + className="w-full "
645 850 showHeader={false}
646 851 columns={[
647 852 {
... ... @@ -686,7 +891,7 @@ const OrderPage = () =&gt; {
686 891 <Flex vertical={true}>
687 892 {/* 编号、时间、销售信息 */}
688 893 <Flex
689   - className="px-4 py-4 bg-white bg-white rounded-t-lg"
  894 + className="px-4 py-4 bg-white rounded-t-lg"
690 895 justify="space-between"
691 896 >
692 897 <Flex wrap="wrap" gap="middle" vertical>
... ... @@ -742,7 +947,7 @@ const OrderPage = () =&gt; {
742 947 </Flex>
743 948 <Flex className="pl-6" align="center">
744 949 <div title={record.notes}>
745   - <div className="max-w-md whitespace-no-wrap overflow-hidden overflow-ellipsis">
  950 + <div className="max-w-md overflow-hidden whitespace-no-wrap overflow-ellipsis">
746 951 <span className="text-[#8C8C8C]">备注:</span>
747 952 <span className="ml-2">
748 953 {record.notes === undefined ? '暂无备注' : record.notes}
... ... @@ -808,7 +1013,7 @@ const OrderPage = () =&gt; {
808 1013 <Flex justify="flex-end">
809 1014 <Space.Compact direction="vertical" align="end">
810 1015 <Space>
811   - {record.mainPath.includes('sendProduct') ? (
  1016 + {record.mainPath?.includes('sendProduct') ? (
812 1017 <Button
813 1018 className="p-0"
814 1019 type="link"
... ... @@ -822,14 +1027,14 @@ const OrderPage = () =&gt; {
822 1027 setOrderCheckType(CHECK_TYPE.NORMAL);
823 1028 }}
824 1029 >
825   - 发货
  1030 + 仓库发货
826 1031 </Button>
827 1032 ) : (
828 1033 ''
829 1034 )}
830 1035  
831 1036 {/* 供应商发货 */}
832   - {record.mainPath.includes('supplierSendOrder') ? (
  1037 + {record.mainPath?.includes('supplierSendOrder') ? (
833 1038 <Button
834 1039 className="p-0"
835 1040 type="link"
... ... @@ -848,7 +1053,28 @@ const OrderPage = () =&gt; {
848 1053 ) : (
849 1054 ''
850 1055 )}
851   - {record.mainPath.includes('printOrder') ? (
  1056 +
  1057 + {record.mainPath?.includes('procureSend') ? (
  1058 + <Button
  1059 + className="p-0"
  1060 + type="link"
  1061 + onClick={() => {
  1062 + if (!selectedRowObj[record.id]?.length) {
  1063 + return message.error('请选择选择子订单');
  1064 + }
  1065 + setSelectedRows(selectedRowObj[record.id]);
  1066 + setDeliverVisible(true);
  1067 + setIsSendProduct(true);
  1068 + setOrderCheckType(CHECK_TYPE.PROCURE);
  1069 + }}
  1070 + >
  1071 + 采购发货
  1072 + </Button>
  1073 + ) : (
  1074 + ''
  1075 + )}
  1076 +
  1077 + {record.mainPath?.includes('printOrder') ? (
852 1078 <Button
853 1079 className="p-0"
854 1080 type="link"
... ... @@ -862,13 +1088,13 @@ const OrderPage = () =&gt; {
862 1088 setOrderCheckType(CHECK_TYPE.NORMAL);
863 1089 }}
864 1090 >
865   - 打印
  1091 + 仓库打印
866 1092 </Button>
867 1093 ) : (
868 1094 ''
869 1095 )}
870 1096  
871   - {record.mainPath.includes('supplierPrint') ? (
  1097 + {record.mainPath?.includes('supplierPrint') ? (
872 1098 <Button
873 1099 className="p-0"
874 1100 type="link"
... ... @@ -882,13 +1108,13 @@ const OrderPage = () =&gt; {
882 1108 setOrderCheckType(CHECK_TYPE.SUPPLIER);
883 1109 }}
884 1110 >
885   - 打印
  1111 + 供应商打印
886 1112 </Button>
887 1113 ) : (
888 1114 ''
889 1115 )}
890 1116  
891   - {record.mainPath.includes('rePrintOrder') ? (
  1117 + {record.mainPath?.includes('rePrintOrder') ? (
892 1118 <Button
893 1119 className="p-0"
894 1120 type="link"
... ... @@ -907,7 +1133,7 @@ const OrderPage = () =&gt; {
907 1133 ) : (
908 1134 ''
909 1135 )}
910   - {record.mainPath.includes('modifySendInformation') ? (
  1136 + {record.mainPath?.includes('modifySendInformation') ? (
911 1137 <Button
912 1138 className="p-0"
913 1139 type="link"
... ... @@ -937,7 +1163,7 @@ const OrderPage = () =&gt; {
937 1163 ) : (
938 1164 ''
939 1165 )}
940   - {record.mainPath.includes('invoicing') ? (
  1166 + {record.mainPath?.includes('invoicing') ? (
941 1167 <Button
942 1168 type="link"
943 1169 className="p-0"
... ... @@ -960,7 +1186,7 @@ const OrderPage = () =&gt; {
960 1186 ) : (
961 1187 ''
962 1188 )}
963   - {record.mainPath.includes('updateOrder') ? (
  1189 + {record.mainPath?.includes('updateOrder') ? (
964 1190 <Button
965 1191 className="p-0"
966 1192 type="link"
... ... @@ -1003,7 +1229,7 @@ const OrderPage = () =&gt; {
1003 1229 ''
1004 1230 )}
1005 1231  
1006   - {record.mainPath.includes('checkOrder') ? (
  1232 + {record.mainPath?.includes('checkOrder') ? (
1007 1233 <Button
1008 1234 className="p-0"
1009 1235 type="link"
... ... @@ -1034,8 +1260,48 @@ const OrderPage = () =&gt; {
1034 1260 ''
1035 1261 )}
1036 1262  
  1263 + {record.mainPath?.includes('noNeedSend') ? (
  1264 + <ButtonConfirm
  1265 + className="p-0"
  1266 + title="此订单是否无需发货?"
  1267 + text="无需发货"
  1268 + onConfirm={async () => {
  1269 + let selectedSubOrders = selectedRowObj[record.id];
  1270 + if (selectedSubOrders === undefined) {
  1271 + selectedSubOrders = record.subOrderInformationLists;
  1272 + }
  1273 + setSelectedRows(selectedSubOrders);
  1274 + for (let i = 0; i < selectedSubOrders.length; i++) {
  1275 + if (
  1276 + selectedSubOrders[i].orderStatus !==
  1277 + 'CONFIRM_RECEIPT'
  1278 + ) {
  1279 + message.error(
  1280 + '请选择未发货的子订单进行无需发货操作',
  1281 + );
  1282 + return;
  1283 + }
  1284 + }
  1285 +
  1286 + const data = await postServiceOrderNoNeedSend({
  1287 + data: {
  1288 + ids: selectedSubOrders.map((item) => {
  1289 + return item.id;
  1290 + }),
  1291 + },
  1292 + });
  1293 + if (data.result === RESPONSE_CODE.SUCCESS) {
  1294 + message.success(data.message);
  1295 + refreshTable();
  1296 + }
  1297 + }}
  1298 + />
  1299 + ) : (
  1300 + ''
  1301 + )}
  1302 +
1037 1303 {/* 财务审核:主订单暂无 */}
1038   - {record.mainPath.includes('financeCheckOrder') ? (
  1304 + {record.mainPath?.includes('financeCheckOrder') ? (
1039 1305 <Button
1040 1306 className="p-0"
1041 1307 type="link"
... ... @@ -1070,7 +1336,7 @@ const OrderPage = () =&gt; {
1070 1336 )}
1071 1337  
1072 1338 {/* 采购审核 */}
1073   - {record.mainPath.includes('procureCheckOrder') ? (
  1339 + {record.mainPath?.includes('procureCheckOrder') ? (
1074 1340 <Button
1075 1341 className="p-0"
1076 1342 type="link"
... ... @@ -1103,7 +1369,80 @@ const OrderPage = () =&gt; {
1103 1369 ''
1104 1370 )}
1105 1371  
1106   - {record.mainPath.includes('orderCancel') ? (
  1372 + {record.mainPath?.includes('applyAfterSales') ? (
  1373 + <Button
  1374 + className="p-0"
  1375 + type="link"
  1376 + onClick={() => {
  1377 + let selectedSubOrders = selectedRowObj[record.id];
  1378 + if (selectedSubOrders === undefined) {
  1379 + selectedSubOrders = record.subOrderInformationLists;
  1380 + }
  1381 + setSelectedRows(selectedSubOrders);
  1382 + for (let i = 0; i < selectedSubOrders.length; i++) {
  1383 + if (
  1384 + selectedSubOrders[i].orderStatus !==
  1385 + 'CONFIRM_RECEIPT'
  1386 + ) {
  1387 + message.error('请选择确认收货状态的子订单进行售后');
  1388 + return;
  1389 + }
  1390 + }
  1391 + setAfterSalesDrawerVisible(true);
  1392 + setOrderRow(record);
  1393 + }}
  1394 + >
  1395 + 申请售后
  1396 + </Button>
  1397 + ) : (
  1398 + ''
  1399 + )}
  1400 +
  1401 + {record.mainPath?.includes('afterSalesCompletion') ? (
  1402 + <ButtonConfirm
  1403 + className="p-0"
  1404 + title="售后是否已完成?"
  1405 + text="完成售后"
  1406 + onConfirm={async () => {
  1407 + let selectedSubOrders = selectedRowObj[record.id];
  1408 + if (selectedSubOrders === undefined) {
  1409 + selectedSubOrders = record.subOrderInformationLists;
  1410 + }
  1411 + for (let i = 0; i < selectedSubOrders.length; i++) {
  1412 + if (
  1413 + selectedSubOrders[i].orderStatus !==
  1414 + 'IN_AFTER_SALES'
  1415 + ) {
  1416 + message.error(
  1417 + '请选择售后中状态的子订单进行完成售后',
  1418 + );
  1419 + return false;
  1420 + }
  1421 + }
  1422 +
  1423 + const ids = selectedSubOrders?.map((item) => {
  1424 + return item.id;
  1425 + });
  1426 +
  1427 + let body = {
  1428 + ids: ids,
  1429 + };
  1430 + const data = await postServiceOrderAfterSalesCompletion(
  1431 + {
  1432 + data: body,
  1433 + },
  1434 + );
  1435 + if (data.result === RESPONSE_CODE.SUCCESS) {
  1436 + message.success(data.message);
  1437 + refreshTable();
  1438 + }
  1439 + }}
  1440 + />
  1441 + ) : (
  1442 + ''
  1443 + )}
  1444 +
  1445 + {record.mainPath?.includes('orderCancel') ? (
1107 1446 <ButtonConfirm
1108 1447 className="p-0"
1109 1448 title="确认作废?"
... ... @@ -1125,6 +1464,26 @@ const OrderPage = () =&gt; {
1125 1464 ) : (
1126 1465 ''
1127 1466 )}
  1467 +
  1468 + {record.mainPath?.includes('procurePrint') ? (
  1469 + <Button
  1470 + className="p-0"
  1471 + type="link"
  1472 + onClick={() => {
  1473 + if (!selectedRowObj[record.id]?.length) {
  1474 + return message.error('请选择选择子订单');
  1475 + }
  1476 + setSelectedRows(selectedRowObj[record.id]);
  1477 + setOrderRow(record);
  1478 + setOrderPrintVisible(true);
  1479 + setOrderCheckType(CHECK_TYPE.PROCURE);
  1480 + }}
  1481 + >
  1482 + 采购打印
  1483 + </Button>
  1484 + ) : (
  1485 + ''
  1486 + )}
1128 1487 </Space>
1129 1488 </Space.Compact>
1130 1489 </Flex>
... ... @@ -1157,9 +1516,22 @@ const OrderPage = () =&gt; {
1157 1516 function toolBarRender() {
1158 1517 let toolBtns = [];
1159 1518  
  1519 + toolBtns.push(
  1520 + <Checkbox onChange={changeCancelOrderShow}>只看作废</Checkbox>,
  1521 + );
  1522 +
1160 1523 //导出按钮配置
1161 1524 const items: MenuProps['items'] = [
1162 1525 {
  1526 + label: '导出查询结果订单',
  1527 + key: '2',
  1528 + onClick: async () => {
  1529 + let body = { flag: 50, ...searchParams };
  1530 + exportLoading();
  1531 + orderExport('/api/service/order/export', body, exportLoadingDestory);
  1532 + },
  1533 + },
  1534 + {
1163 1535 label: '导出已选中订单',
1164 1536 key: '1',
1165 1537 onClick: async () => {
... ... @@ -1172,15 +1544,24 @@ const OrderPage = () =&gt; {
1172 1544 orderExport('/api/service/order/export', body, exportLoadingDestory);
1173 1545 },
1174 1546 },
  1547 + // {
  1548 + // label: '导出当前页订单',
  1549 + // key: '2',
  1550 + // onClick: async () => {
  1551 + // if (mainOrderAllItemKeys.length === 0) {
  1552 + // message.error('当前没有订单');
  1553 + // return;
  1554 + // }
  1555 + // let body = { flag: 20, ids: mainOrderAllItemKeys };
  1556 + // exportLoading();
  1557 + // orderExport('/api/service/order/export', body, exportLoadingDestory);
  1558 + // },
  1559 + // },
1175 1560 {
1176   - label: '导出当前页订单',
1177   - key: '2',
  1561 + label: '导出当天订单',
  1562 + key: '4',
1178 1563 onClick: async () => {
1179   - if (mainOrderAllItemKeys.length === 0) {
1180   - message.error('当前没有订单');
1181   - return;
1182   - }
1183   - let body = { flag: 20, ids: mainOrderAllItemKeys };
  1564 + let body = { flag: 40, ids: [] };
1184 1565 exportLoading();
1185 1566 orderExport('/api/service/order/export', body, exportLoadingDestory);
1186 1567 },
... ... @@ -1194,15 +1575,6 @@ const OrderPage = () =&gt; {
1194 1575 orderExport('/api/service/order/export', body, exportLoadingDestory);
1195 1576 },
1196 1577 },
1197   - {
1198   - label: '导出当天订单',
1199   - key: '4',
1200   - onClick: async () => {
1201   - let body = { flag: 40, ids: [] };
1202   - exportLoading();
1203   - orderExport('/api/service/order/export', body, exportLoadingDestory);
1204   - },
1205   - },
1206 1578 ];
1207 1579  
1208 1580 const menuProps = {
... ... @@ -1238,16 +1610,18 @@ const OrderPage = () =&gt; {
1238 1610 );
1239 1611 }
1240 1612  
1241   - toolBtns.push(
1242   - <Dropdown menu={menuProps}>
1243   - <Button>
1244   - <Space>
1245   - 导出
1246   - <DownOutlined />
1247   - </Space>
1248   - </Button>
1249   - </Dropdown>,
1250   - );
  1613 + if (rolePath?.includes('export')) {
  1614 + toolBtns.push(
  1615 + <Dropdown menu={menuProps}>
  1616 + <Button>
  1617 + <Space>
  1618 + 导出
  1619 + <DownOutlined />
  1620 + </Space>
  1621 + </Button>
  1622 + </Dropdown>,
  1623 + );
  1624 + }
1251 1625  
1252 1626 // toolBtns.push(
1253 1627 // <Button
... ... @@ -1338,13 +1712,15 @@ const OrderPage = () =&gt; {
1338 1712 sorter,
1339 1713 filter,
1340 1714 ) => {
  1715 + //保存这个搜索条件
  1716 + setSearchParam(params);
1341 1717 const { data } = await postServiceOrderQueryServiceOrder({
1342 1718 // ...params,
1343 1719 // FIXME: remove @ts-ignore
1344 1720 // @ts-ignore
1345 1721 sorter,
1346 1722 filter,
1347   - data: params,
  1723 + data: { ...params, isDeleteQueryOrder: onlyShowCancelOrder },
1348 1724 });
1349 1725  
1350 1726 let mainOrderIds = data?.data?.map((d) => d.id);
... ... @@ -1508,6 +1884,7 @@ const OrderPage = () =&gt; {
1508 1884 {historyModalVisible && (
1509 1885 <HistoryModal
1510 1886 subOrders={selectedRows}
  1887 + isCancelledOrder={onlyShowCancelOrder}
1511 1888 onClose={() => {
1512 1889 setHistoryModalVisible(false);
1513 1890 setSelectedRows({});
... ... @@ -1549,6 +1926,20 @@ const OrderPage = () =&gt; {
1549 1926 />
1550 1927 )}
1551 1928  
  1929 + {afterSalesDrawerVisible && (
  1930 + <AfterSalesDrawer
  1931 + setVisible={setAfterSalesDrawerVisible}
  1932 + mainOrder={orderRow}
  1933 + subOrders={selectedRows}
  1934 + onClose={() => {
  1935 + setAfterSalesDrawerVisible(false);
  1936 + setSelectedRows({});
  1937 + setOrderRow({});
  1938 + refreshTable();
  1939 + }}
  1940 + />
  1941 + )}
  1942 +
1552 1943 {contextHolder}
1553 1944 </PageContainer>
1554 1945 );
... ...
src/pages/OrderPrint/OrderPrintModal.tsx
... ... @@ -2,6 +2,7 @@ import { RESPONSE_CODE } from &#39;@/constants/enum&#39;;
2 2 import '@/pages/OrderPrint/index.less';
3 3 import {
4 4 postServiceOrderPrintOrder,
  5 + postServiceOrderProcurePrint,
5 6 postServiceOrderSupplierPrint,
6 7 } from '@/services';
7 8 import { ExclamationCircleFilled } from '@ant-design/icons';
... ... @@ -66,6 +67,14 @@ export default ({
66 67 }),
67 68 },
68 69 });
  70 + } else if (optType(CHECK_TYPE.PROCURE)) {
  71 + res = await postServiceOrderProcurePrint({
  72 + data: {
  73 + ids: subOrders.map((item) => {
  74 + return item.id;
  75 + }),
  76 + },
  77 + });
69 78 } else {
70 79 res = await postServiceOrderPrintOrder({ data: body });
71 80 }
... ...
src/services/definition.ts
... ... @@ -699,11 +699,24 @@ export interface ProcureCheckOrderDto {
699 699 ids?: Array<number>;
700 700 /**
701 701 * @description
702   - * 采购人姓名
  702 + * true表示采购走打印发货流程,false表示选择供应商进行发货
  703 + */
  704 + procureIsPrintAndSend?: boolean;
  705 + /**
  706 + * @description
  707 + * 供应商姓名
703 708 */
704 709 supplier?: string;
705 710 }
706 711  
  712 +export interface ProcurePrintDto {
  713 + /**
  714 + * @description
  715 + * 子订单id集合
  716 + */
  717 + ids?: Array<number>;
  718 +}
  719 +
707 720 export interface ProductInformationDto {
708 721 /**
709 722 * @description
... ...
src/services/request.ts
... ... @@ -26,7 +26,6 @@ import type {
26 26 DictionaryQueryVO,
27 27 DictionaryVO,
28 28 Dto,
29   - ModelAndView,
30 29 OrderAddVO,
31 30 OrderAuditLogQueryVO,
32 31 OrderBaseInfoQueryVO,
... ... @@ -36,6 +35,7 @@ import type {
36 35 OrderUnlockFieldApplyVO,
37 36 OrderUpdateVO,
38 37 ProcureCheckOrderDto,
  38 + ProcurePrintDto,
39 39 ProductInformationDto,
40 40 QueryAnnexDto,
41 41 QueryHistoryRecordDto,
... ... @@ -223,7 +223,9 @@ export interface GetErrorResponse {
223 223 * @description
224 224 * OK
225 225 */
226   - 200: ModelAndView;
  226 + 200: {
  227 + [propertyName: string]: any;
  228 + };
227 229 /**
228 230 * @description
229 231 * Unauthorized
... ... @@ -244,9 +246,9 @@ export interface GetErrorResponse {
244 246 export type GetErrorResponseSuccess = GetErrorResponse[200];
245 247 /**
246 248 * @description
247   - * errorHtml
  249 + * error
248 250 * @tags basic-error-controller
249   - * @produces text/html
  251 + * @produces *
250 252 */
251 253 export const getError = /* #__PURE__ */ (() => {
252 254 const method = 'get';
... ... @@ -270,7 +272,9 @@ export interface PutErrorResponse {
270 272 * @description
271 273 * OK
272 274 */
273   - 200: ModelAndView;
  275 + 200: {
  276 + [propertyName: string]: any;
  277 + };
274 278 /**
275 279 * @description
276 280 * Created
... ... @@ -296,9 +300,9 @@ export interface PutErrorResponse {
296 300 export type PutErrorResponseSuccess = PutErrorResponse[200];
297 301 /**
298 302 * @description
299   - * errorHtml
  303 + * error
300 304 * @tags basic-error-controller
301   - * @produces text/html
  305 + * @produces *
302 306 * @consumes application/json
303 307 */
304 308 export const putError = /* #__PURE__ */ (() => {
... ... @@ -323,7 +327,9 @@ export interface PostErrorResponse {
323 327 * @description
324 328 * OK
325 329 */
326   - 200: ModelAndView;
  330 + 200: {
  331 + [propertyName: string]: any;
  332 + };
327 333 /**
328 334 * @description
329 335 * Created
... ... @@ -349,9 +355,9 @@ export interface PostErrorResponse {
349 355 export type PostErrorResponseSuccess = PostErrorResponse[200];
350 356 /**
351 357 * @description
352   - * errorHtml
  358 + * error
353 359 * @tags basic-error-controller
354   - * @produces text/html
  360 + * @produces *
355 361 * @consumes application/json
356 362 */
357 363 export const postError = /* #__PURE__ */ (() => {
... ... @@ -376,7 +382,9 @@ export interface DeleteErrorResponse {
376 382 * @description
377 383 * OK
378 384 */
379   - 200: ModelAndView;
  385 + 200: {
  386 + [propertyName: string]: any;
  387 + };
380 388 /**
381 389 * @description
382 390 * No Content
... ... @@ -397,9 +405,9 @@ export interface DeleteErrorResponse {
397 405 export type DeleteErrorResponseSuccess = DeleteErrorResponse[200];
398 406 /**
399 407 * @description
400   - * errorHtml
  408 + * error
401 409 * @tags basic-error-controller
402   - * @produces text/html
  410 + * @produces *
403 411 */
404 412 export const deleteError = /* #__PURE__ */ (() => {
405 413 const method = 'delete';
... ... @@ -423,7 +431,9 @@ export interface OptionsErrorResponse {
423 431 * @description
424 432 * OK
425 433 */
426   - 200: ModelAndView;
  434 + 200: {
  435 + [propertyName: string]: any;
  436 + };
427 437 /**
428 438 * @description
429 439 * No Content
... ... @@ -444,9 +454,9 @@ export interface OptionsErrorResponse {
444 454 export type OptionsErrorResponseSuccess = OptionsErrorResponse[200];
445 455 /**
446 456 * @description
447   - * errorHtml
  457 + * error
448 458 * @tags basic-error-controller
449   - * @produces text/html
  459 + * @produces *
450 460 * @consumes application/json
451 461 */
452 462 export const optionsError = /* #__PURE__ */ (() => {
... ... @@ -471,7 +481,9 @@ export interface HeadErrorResponse {
471 481 * @description
472 482 * OK
473 483 */
474   - 200: ModelAndView;
  484 + 200: {
  485 + [propertyName: string]: any;
  486 + };
475 487 /**
476 488 * @description
477 489 * No Content
... ... @@ -492,9 +504,9 @@ export interface HeadErrorResponse {
492 504 export type HeadErrorResponseSuccess = HeadErrorResponse[200];
493 505 /**
494 506 * @description
495   - * errorHtml
  507 + * error
496 508 * @tags basic-error-controller
497   - * @produces text/html
  509 + * @produces *
498 510 * @consumes application/json
499 511 */
500 512 export const headError = /* #__PURE__ */ (() => {
... ... @@ -519,7 +531,9 @@ export interface PatchErrorResponse {
519 531 * @description
520 532 * OK
521 533 */
522   - 200: ModelAndView;
  534 + 200: {
  535 + [propertyName: string]: any;
  536 + };
523 537 /**
524 538 * @description
525 539 * No Content
... ... @@ -540,9 +554,9 @@ export interface PatchErrorResponse {
540 554 export type PatchErrorResponseSuccess = PatchErrorResponse[200];
541 555 /**
542 556 * @description
543   - * errorHtml
  557 + * error
544 558 * @tags basic-error-controller
545   - * @produces text/html
  559 + * @produces *
546 560 * @consumes application/json
547 561 */
548 562 export const patchError = /* #__PURE__ */ (() => {
... ... @@ -4771,6 +4785,148 @@ export const postServiceOrderAddOrder = /* #__PURE__ */ (() =&gt; {
4771 4785 return request;
4772 4786 })();
4773 4787  
  4788 +/** @description request parameter type for postServiceOrderAfterSalesCompletion */
  4789 +export interface PostServiceOrderAfterSalesCompletionOption {
  4790 + /**
  4791 + * @description
  4792 + * dto
  4793 + */
  4794 + body: {
  4795 + /**
  4796 + @description
  4797 + dto */
  4798 + dto: Dto;
  4799 + };
  4800 +}
  4801 +
  4802 +/** @description response type for postServiceOrderAfterSalesCompletion */
  4803 +export interface PostServiceOrderAfterSalesCompletionResponse {
  4804 + /**
  4805 + * @description
  4806 + * OK
  4807 + */
  4808 + 200: ServerResult;
  4809 + /**
  4810 + * @description
  4811 + * Created
  4812 + */
  4813 + 201: any;
  4814 + /**
  4815 + * @description
  4816 + * Unauthorized
  4817 + */
  4818 + 401: any;
  4819 + /**
  4820 + * @description
  4821 + * Forbidden
  4822 + */
  4823 + 403: any;
  4824 + /**
  4825 + * @description
  4826 + * Not Found
  4827 + */
  4828 + 404: any;
  4829 +}
  4830 +
  4831 +export type PostServiceOrderAfterSalesCompletionResponseSuccess =
  4832 + PostServiceOrderAfterSalesCompletionResponse[200];
  4833 +/**
  4834 + * @description
  4835 + * 售后完成
  4836 + * @tags 内部订单
  4837 + * @produces *
  4838 + * @consumes application/json
  4839 + */
  4840 +export const postServiceOrderAfterSalesCompletion = /* #__PURE__ */ (() => {
  4841 + const method = 'post';
  4842 + const url = '/service/order/afterSalesCompletion';
  4843 + function request(
  4844 + option: PostServiceOrderAfterSalesCompletionOption,
  4845 + ): Promise<PostServiceOrderAfterSalesCompletionResponseSuccess> {
  4846 + return requester(request.url, {
  4847 + method: request.method,
  4848 + ...option,
  4849 + }) as unknown as Promise<PostServiceOrderAfterSalesCompletionResponseSuccess>;
  4850 + }
  4851 +
  4852 + /** http method */
  4853 + request.method = method;
  4854 + /** request url */
  4855 + request.url = url;
  4856 + return request;
  4857 +})();
  4858 +
  4859 +/** @description request parameter type for postServiceOrderApplyAfterSales */
  4860 +export interface PostServiceOrderApplyAfterSalesOption {
  4861 + /**
  4862 + * @description
  4863 + * dto
  4864 + */
  4865 + body: {
  4866 + /**
  4867 + @description
  4868 + dto */
  4869 + dto: Dto;
  4870 + };
  4871 +}
  4872 +
  4873 +/** @description response type for postServiceOrderApplyAfterSales */
  4874 +export interface PostServiceOrderApplyAfterSalesResponse {
  4875 + /**
  4876 + * @description
  4877 + * OK
  4878 + */
  4879 + 200: ServerResult;
  4880 + /**
  4881 + * @description
  4882 + * Created
  4883 + */
  4884 + 201: any;
  4885 + /**
  4886 + * @description
  4887 + * Unauthorized
  4888 + */
  4889 + 401: any;
  4890 + /**
  4891 + * @description
  4892 + * Forbidden
  4893 + */
  4894 + 403: any;
  4895 + /**
  4896 + * @description
  4897 + * Not Found
  4898 + */
  4899 + 404: any;
  4900 +}
  4901 +
  4902 +export type PostServiceOrderApplyAfterSalesResponseSuccess =
  4903 + PostServiceOrderApplyAfterSalesResponse[200];
  4904 +/**
  4905 + * @description
  4906 + * 申请售后
  4907 + * @tags 内部订单
  4908 + * @produces *
  4909 + * @consumes application/json
  4910 + */
  4911 +export const postServiceOrderApplyAfterSales = /* #__PURE__ */ (() => {
  4912 + const method = 'post';
  4913 + const url = '/service/order/applyAfterSales';
  4914 + function request(
  4915 + option: PostServiceOrderApplyAfterSalesOption,
  4916 + ): Promise<PostServiceOrderApplyAfterSalesResponseSuccess> {
  4917 + return requester(request.url, {
  4918 + method: request.method,
  4919 + ...option,
  4920 + }) as unknown as Promise<PostServiceOrderApplyAfterSalesResponseSuccess>;
  4921 + }
  4922 +
  4923 + /** http method */
  4924 + request.method = method;
  4925 + /** request url */
  4926 + request.url = url;
  4927 + return request;
  4928 +})();
  4929 +
4774 4930 /** @description request parameter type for postServiceOrderCheckOrder */
4775 4931 export interface PostServiceOrderCheckOrderOption {
4776 4932 /**
... ... @@ -5551,6 +5707,77 @@ export const postServiceOrderInvoicing = /* #__PURE__ */ (() =&gt; {
5551 5707 return request;
5552 5708 })();
5553 5709  
  5710 +/** @description request parameter type for postServiceOrderNoNeedSend */
  5711 +export interface PostServiceOrderNoNeedSendOption {
  5712 + /**
  5713 + * @description
  5714 + * dto
  5715 + */
  5716 + body: {
  5717 + /**
  5718 + @description
  5719 + dto */
  5720 + dto: Dto;
  5721 + };
  5722 +}
  5723 +
  5724 +/** @description response type for postServiceOrderNoNeedSend */
  5725 +export interface PostServiceOrderNoNeedSendResponse {
  5726 + /**
  5727 + * @description
  5728 + * OK
  5729 + */
  5730 + 200: ServerResult;
  5731 + /**
  5732 + * @description
  5733 + * Created
  5734 + */
  5735 + 201: any;
  5736 + /**
  5737 + * @description
  5738 + * Unauthorized
  5739 + */
  5740 + 401: any;
  5741 + /**
  5742 + * @description
  5743 + * Forbidden
  5744 + */
  5745 + 403: any;
  5746 + /**
  5747 + * @description
  5748 + * Not Found
  5749 + */
  5750 + 404: any;
  5751 +}
  5752 +
  5753 +export type PostServiceOrderNoNeedSendResponseSuccess =
  5754 + PostServiceOrderNoNeedSendResponse[200];
  5755 +/**
  5756 + * @description
  5757 + * 无需发货
  5758 + * @tags 内部订单
  5759 + * @produces *
  5760 + * @consumes application/json
  5761 + */
  5762 +export const postServiceOrderNoNeedSend = /* #__PURE__ */ (() => {
  5763 + const method = 'post';
  5764 + const url = '/service/order/noNeedSend';
  5765 + function request(
  5766 + option: PostServiceOrderNoNeedSendOption,
  5767 + ): Promise<PostServiceOrderNoNeedSendResponseSuccess> {
  5768 + return requester(request.url, {
  5769 + method: request.method,
  5770 + ...option,
  5771 + }) as unknown as Promise<PostServiceOrderNoNeedSendResponseSuccess>;
  5772 + }
  5773 +
  5774 + /** http method */
  5775 + request.method = method;
  5776 + /** request url */
  5777 + request.url = url;
  5778 + return request;
  5779 +})();
  5780 +
5554 5781 /** @description request parameter type for postServiceOrderOrderCancel */
5555 5782 export interface PostServiceOrderOrderCancelOption {
5556 5783 /**
... ... @@ -5764,6 +5991,148 @@ export const postServiceOrderProcureCheckOrder = /* #__PURE__ */ (() =&gt; {
5764 5991 return request;
5765 5992 })();
5766 5993  
  5994 +/** @description request parameter type for postServiceOrderProcurePrint */
  5995 +export interface PostServiceOrderProcurePrintOption {
  5996 + /**
  5997 + * @description
  5998 + * dto
  5999 + */
  6000 + body: {
  6001 + /**
  6002 + @description
  6003 + dto */
  6004 + dto: ProcurePrintDto;
  6005 + };
  6006 +}
  6007 +
  6008 +/** @description response type for postServiceOrderProcurePrint */
  6009 +export interface PostServiceOrderProcurePrintResponse {
  6010 + /**
  6011 + * @description
  6012 + * OK
  6013 + */
  6014 + 200: ServerResult;
  6015 + /**
  6016 + * @description
  6017 + * Created
  6018 + */
  6019 + 201: any;
  6020 + /**
  6021 + * @description
  6022 + * Unauthorized
  6023 + */
  6024 + 401: any;
  6025 + /**
  6026 + * @description
  6027 + * Forbidden
  6028 + */
  6029 + 403: any;
  6030 + /**
  6031 + * @description
  6032 + * Not Found
  6033 + */
  6034 + 404: any;
  6035 +}
  6036 +
  6037 +export type PostServiceOrderProcurePrintResponseSuccess =
  6038 + PostServiceOrderProcurePrintResponse[200];
  6039 +/**
  6040 + * @description
  6041 + * 采购打印订单
  6042 + * @tags 内部订单
  6043 + * @produces *
  6044 + * @consumes application/json
  6045 + */
  6046 +export const postServiceOrderProcurePrint = /* #__PURE__ */ (() => {
  6047 + const method = 'post';
  6048 + const url = '/service/order/procurePrint';
  6049 + function request(
  6050 + option: PostServiceOrderProcurePrintOption,
  6051 + ): Promise<PostServiceOrderProcurePrintResponseSuccess> {
  6052 + return requester(request.url, {
  6053 + method: request.method,
  6054 + ...option,
  6055 + }) as unknown as Promise<PostServiceOrderProcurePrintResponseSuccess>;
  6056 + }
  6057 +
  6058 + /** http method */
  6059 + request.method = method;
  6060 + /** request url */
  6061 + request.url = url;
  6062 + return request;
  6063 +})();
  6064 +
  6065 +/** @description request parameter type for postServiceOrderProcureSend */
  6066 +export interface PostServiceOrderProcureSendOption {
  6067 + /**
  6068 + * @description
  6069 + * dto
  6070 + */
  6071 + body: {
  6072 + /**
  6073 + @description
  6074 + dto */
  6075 + dto: Dto;
  6076 + };
  6077 +}
  6078 +
  6079 +/** @description response type for postServiceOrderProcureSend */
  6080 +export interface PostServiceOrderProcureSendResponse {
  6081 + /**
  6082 + * @description
  6083 + * OK
  6084 + */
  6085 + 200: ServerResult;
  6086 + /**
  6087 + * @description
  6088 + * Created
  6089 + */
  6090 + 201: any;
  6091 + /**
  6092 + * @description
  6093 + * Unauthorized
  6094 + */
  6095 + 401: any;
  6096 + /**
  6097 + * @description
  6098 + * Forbidden
  6099 + */
  6100 + 403: any;
  6101 + /**
  6102 + * @description
  6103 + * Not Found
  6104 + */
  6105 + 404: any;
  6106 +}
  6107 +
  6108 +export type PostServiceOrderProcureSendResponseSuccess =
  6109 + PostServiceOrderProcureSendResponse[200];
  6110 +/**
  6111 + * @description
  6112 + * 采购发送订单
  6113 + * @tags 内部订单
  6114 + * @produces *
  6115 + * @consumes application/json
  6116 + */
  6117 +export const postServiceOrderProcureSend = /* #__PURE__ */ (() => {
  6118 + const method = 'post';
  6119 + const url = '/service/order/procureSend';
  6120 + function request(
  6121 + option: PostServiceOrderProcureSendOption,
  6122 + ): Promise<PostServiceOrderProcureSendResponseSuccess> {
  6123 + return requester(request.url, {
  6124 + method: request.method,
  6125 + ...option,
  6126 + }) as unknown as Promise<PostServiceOrderProcureSendResponseSuccess>;
  6127 + }
  6128 +
  6129 + /** http method */
  6130 + request.method = method;
  6131 + /** request url */
  6132 + request.url = url;
  6133 + return request;
  6134 +})();
  6135 +
5767 6136 /** @description response type for getServiceOrderProvideInvoicingStatus */
5768 6137 export interface GetServiceOrderProvideInvoicingStatusResponse {
5769 6138 /**
... ...