Commit 5f62387d8d01926b79066cb8b7811b9f8f63fcbd

Authored by PurelzMgnead
1 parent 1b65ce07

feat: 售后优化

src/pages/Order/FeedBack/CheckModal.tsx
... ... @@ -102,8 +102,6 @@ export default ({
102 102 );
103 103 });
104 104  
105   - console.log(annexLinks);
106   -
107 105 setAfterSalesInfo(
108 106 <div className="my-5">
109 107 <Row gutter={[16, 24]}>
... ... @@ -676,7 +674,7 @@ export default ({
676 674 <ProFormTextArea
677 675 width="lg"
678 676 name="name"
679   - placeholder="若驳回,请填写驳回理由"
  677 + // placeholder="若驳回,请填写驳回理由"
680 678 />
681 679 ) : (
682 680 <></>
... ...
src/pages/Order/FeedBack/OrderList.tsx
... ... @@ -8,7 +8,6 @@ import {
8 8 postKingdeeRepSalOrderSave,
9 9 postServiceConstCanApplyAfterInvoicingStatus,
10 10 postServiceInvoiceCancelApply,
11   - postServiceOrderAfterSalesCheck,
12 11 postServiceOrderCancelSend,
13 12 postServiceOrderConfirmInvoice,
14 13 postServiceOrderGetCurrentOptNode,
... ... @@ -100,6 +99,7 @@ import ProcureCheckModal from &#39;./ProcureCheckModal&#39;;
100 99 import ProcureConvertModal from './ProcureConvertModal';
101 100 import ProductionTimeModal from './ProductionTimeModal';
102 101 import ShippingWarehouseChangeModal from './ShippingWarehouseChangeModal';
  102 +import StoreCheckModal from './StoreCheckModal';
103 103 import UploadPayBillModal from './UploadPayBillModal';
104 104 import {
105 105 AFTER_INVOICING_STATUS,
... ... @@ -128,6 +128,8 @@ import { OrderListItemType, OrderType } from &#39;./type.d&#39;;
128 128 const OrderList = ({ paramsNew, searchShow, toolbarShow }) => {
129 129 const [orderDrawerVisible, setOrderDrawerVisible] = useState<boolean>(false);
130 130 const [checkVisible, setCheckVisible] = useState<boolean>(false);
  131 + const [storeCheckModalVisible, setStoreCheckModalVisible] =
  132 + useState<boolean>(false);
131 133 const [orderPrintVisible, setOrderPrintVisible] = useState<boolean>(false);
132 134 const [allMainChecked, setAllMainChecked] = useState(false);
133 135 const [imagesViewerModalVisible, setImagesViewerModalVisible] =
... ... @@ -413,15 +415,15 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) =&gt; {
413 415 return null;
414 416 }
415 417  
416   - async function doAfterSalesCheck(body: object) {
417   - const data = await postServiceOrderAfterSalesCheck({
418   - data: body,
419   - });
420   - console.log(data);
421   - if (data.data) {
422   - refreshTable();
423   - }
424   - }
  418 + // async function doAfterSalesCheck(body: object) {
  419 + // const data = await postServiceOrderAfterSalesCheck({
  420 + // data: body,
  421 + // });
  422 + // console.log(data);
  423 + // if (data.data) {
  424 + // refreshTable();
  425 + // }
  426 + // }
425 427  
426 428 /**
427 429 * 返回当前操作的主订单数据
... ... @@ -1914,6 +1916,23 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) =&gt; {
1914 1916 )}
1915 1917  
1916 1918 {optRecord.paths?.includes('afterSalesConfirm') ? (
  1919 + <Button
  1920 + className="p-0"
  1921 + type="link"
  1922 + onClick={() => {
  1923 + setCurrentMainId(record.id);
  1924 + createOptObject(optRecord.id, record.id);
  1925 + setStoreCheckModalVisible(true);
  1926 + setOrderCheckType(CHECK_TYPE.AFTER_SALES);
  1927 + }}
  1928 + >
  1929 + 仓库确认
  1930 + </Button>
  1931 + ) : (
  1932 + ''
  1933 + )}
  1934 +
  1935 + {/* {optRecord.paths?.includes('afterSalesConfirm') ? (
1917 1936 <ButtonConfirm
1918 1937 className="p-0"
1919 1938 title="确认通过?"
... ... @@ -1925,8 +1944,8 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) =&gt; {
1925 1944 isAfterSalesSuccess: true,
1926 1945 subOrderIds: isMainOrder
1927 1946 ? [...record.subOrderInformationLists]
1928   - .flat()
1929   - ?.map((subOrder) => subOrder.id)
  1947 + .flat()
  1948 + ?.map((subOrder) => subOrder.id)
1930 1949 : [optRecord.id],
1931 1950 mainId: record.id,
1932 1951 });
... ... @@ -1934,7 +1953,7 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) =&gt; {
1934 1953 />
1935 1954 ) : (
1936 1955 ''
1937   - )}
  1956 + )} */}
1938 1957  
1939 1958 {optRecord.paths?.includes('financeCheckOrder') ? (
1940 1959 <Button
... ... @@ -2022,7 +2041,7 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) =&gt; {
2022 2041 onClick={() => {
2023 2042 createOptObject(optRecord.id, record.id);
2024 2043 setOrderDrawerVisible(true);
2025   - setOrderOptType('after_sales');
  2044 + setOrderOptType('after-sales');
2026 2045 }}
2027 2046 >
2028 2047 申请售后
... ... @@ -3673,23 +3692,35 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) =&gt; {
3673 3692 )}
3674 3693  
3675 3694 {record.paths?.includes('afterSalesConfirm') ? (
3676   - <ButtonConfirm
  3695 + <Button
3677 3696 className="p-0"
3678   - title="确认通过?"
3679   - text="仓库确认"
3680   - onConfirm={() => {
3681   - setIsMainOrder(true);
3682   - doAfterSalesCheck({
3683   - applyType: 'after-sales',
3684   - isAfterSalesSuccess: true,
3685   - subOrderIds: [...record.subOrderInformationLists]
3686   - .flat()
3687   - ?.map((subOrder) => subOrder.id),
3688   - mainId: record.id,
3689   - });
  3697 + type="link"
  3698 + onClick={() => {
  3699 + setCurrentMainId(record.id);
  3700 + createOptObject(null, record.id);
  3701 + setStoreCheckModalVisible(true);
  3702 + setOrderCheckType(CHECK_TYPE.AFTER_SALES);
3690 3703 }}
3691   - />
  3704 + >
  3705 + 仓库确认
  3706 + </Button>
3692 3707 ) : (
  3708 + // <ButtonConfirm
  3709 + // className="p-0"
  3710 + // title="确认通过?"
  3711 + // text="仓库确认"
  3712 + // onConfirm={() => {
  3713 + // setIsMainOrder(true);
  3714 + // doAfterSalesCheck({
  3715 + // applyType: 'after-sales',
  3716 + // isAfterSalesSuccess: true,
  3717 + // subOrderIds: [...record.subOrderInformationLists]
  3718 + // .flat()
  3719 + // ?.map((subOrder) => subOrder.id),
  3720 + // mainId: record.id,
  3721 + // });
  3722 + // }}
  3723 + // />
3693 3724 ''
3694 3725 )}
3695 3726  
... ... @@ -3876,7 +3907,9 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) =&gt; {
3876 3907 selectedSubOrders[i].orderStatus !==
3877 3908 'CONFIRM_RECEIPT' &&
3878 3909 selectedSubOrders[i].orderStatus !==
3879   - 'AFTER_SALES_FAILURE'
  3910 + 'AFTER_SALES_FAILURE' &&
  3911 + selectedSubOrders[i].orderStatus !==
  3912 + 'AFTER_SALES_COMPLETION'
3880 3913 ) {
3881 3914 message.error('请选择确认收货状态的子订单进行售后');
3882 3915 return;
... ... @@ -4857,6 +4890,34 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) =&gt; {
4857 4890 />
4858 4891 )}
4859 4892  
  4893 + {storeCheckModalVisible && (
  4894 + <StoreCheckModal
  4895 + setCheckVisible={(val: boolean) => {
  4896 + setStoreCheckModalVisible(val);
  4897 + if (!val) {
  4898 + clearOptObject();
  4899 + }
  4900 + }}
  4901 + data={isMainOrder ? getFirstMainOrder() : buildMainOrder()}
  4902 + subOrders={
  4903 + isMainOrder
  4904 + ? [...subOrderSelectedMap.values()].flat()
  4905 + : buildSubOrders()
  4906 + }
  4907 + orderCheckType={orderCheckType}
  4908 + openOrderDrawer={(type: any, id: any) => {
  4909 + setCurrentMainId(id);
  4910 + setOrderOptType(type);
  4911 + setOrderDrawerVisible(true);
  4912 + }}
  4913 + onClose={() => {
  4914 + clearOptObject();
  4915 + setStoreCheckModalVisible(false);
  4916 + refreshTable();
  4917 + }}
  4918 + />
  4919 + )}
  4920 +
4860 4921 {applyForInvoicingVisible && (
4861 4922 <ApplyForInvoicingModal
4862 4923 setCheckVisible={(val: boolean) => {
... ...
src/pages/Order/FeedBack/StoreCheckModal.tsx 0 → 100644
  1 +import { RESPONSE_CODE } from '@/constants/enum';
  2 +import {
  3 + postPrepaidAudit,
  4 + postServiceOrderAfterSalesStoreSure,
  5 + postServiceOrderAudit,
  6 + postServiceOrderFileProcess,
  7 + postServiceOrderFinanceCheckOrder,
  8 + postServiceOrderLeaderAudit,
  9 + postServiceOrderToProcureAudit,
  10 +} from '@/services';
  11 +import {
  12 + ModalForm,
  13 + ProFormText,
  14 + ProFormTextArea,
  15 + ProList,
  16 +} from '@ant-design/pro-components';
  17 +import {
  18 + Button,
  19 + Col,
  20 + Divider,
  21 + Form,
  22 + Image,
  23 + Modal,
  24 + Row,
  25 + Space,
  26 + Tag,
  27 + UploadFile,
  28 + message,
  29 +} from 'antd';
  30 +import Upload, { RcFile, UploadProps } from 'antd/es/upload';
  31 +import { useEffect, useRef, useState } from 'react';
  32 +import {
  33 + AFTE_SALES_PLAN_OPTIONS,
  34 + CHECK_TYPE,
  35 + COMFIR_RECEIPT_IMAGES_NUMBER,
  36 +} from './constant';
  37 +// import { cloneDeep } from 'lodash';
  38 +import InvoiceSubOrderInfoTable from '@/pages/Order/Order/components/InvoiceSubOrderInfoTable';
  39 +import { enumValueToLabel, transImageFile } from '@/utils';
  40 +import { PlusOutlined } from '@ant-design/icons';
  41 +import { cloneDeep } from 'lodash';
  42 +
  43 +export default ({
  44 + setCheckVisible,
  45 + data,
  46 + subOrders,
  47 + orderCheckType,
  48 + openOrderDrawer,
  49 + onClose,
  50 +}) => {
  51 + const [previewOpen, setPreviewOpen] = useState(false);
  52 + const [aPopoverTitle, setAPopoverTitle] = useState('审核');
  53 + const [previewImage, setPreviewImage] = useState('');
  54 + const [previewTitle, setPreviewTitle] = useState('');
  55 + const [paymentReceiptsImages, setPymentReceiptsImages] = useState<any[]>([]);
  56 + const fileListObj = useRef<UploadFile[]>([]); //使用引用类型,使得在useEffect里面设置监听事件后,不用更新监听事件也能保持obj与外界一致
  57 + const getBase64 = (file: RcFile): Promise<string> =>
  58 + new Promise((resolve, reject) => {
  59 + const reader = new FileReader();
  60 + reader.readAsDataURL(file);
  61 + reader.onload = () => resolve(reader.result as string);
  62 + reader.onerror = (error) => reject(error);
  63 + });
  64 + const [fileList, setFileList] = useState<UploadFile[]>([]);
  65 + const handleCancel = () => setPreviewOpen(false);
  66 + const [messageApi, contextHolder] = message.useMessage();
  67 + const [form] = Form.useForm<{ name: string; company: string }>();
  68 + let subOrderIds: any[] = subOrders?.map((subOrder) => subOrder.id);
  69 + const [mainOrderId] = useState(data?.id || null);
  70 +
  71 + const [afterSalesInfo, setAfterSalesInfo] = useState<any>();
  72 + const [prepaidProofImages, setPrepaidProofImages] = useState<any[]>([]);
  73 + /**
  74 + * 审核类型
  75 + */
  76 + function checkType(check: string) {
  77 + if (orderCheckType === check) {
  78 + return true;
  79 + }
  80 + return false;
  81 + }
  82 +
  83 + const getOrderAfterSalesInfo = async () => {
  84 + // let res = await postServiceOrderQueryAfterSalesInfoSnapshot({
  85 + // data: { subOrderIds: subOrderIds },
  86 + // });
  87 +
  88 + //附件
  89 + let annex = subOrders[0].afterSalesAnnexList;
  90 + let index = 1;
  91 + let annexLinks = annex?.map((f) => {
  92 + return (
  93 + <Button
  94 + className="p-0 pr-1"
  95 + type="link"
  96 + key="key"
  97 + href={f}
  98 + onClick={console.log(data)}
  99 + >
  100 + {'附件' + index++}
  101 + </Button>
  102 + );
  103 + });
  104 +
  105 + setAfterSalesInfo(
  106 + <div className="my-5">
  107 + <Row gutter={[16, 24]}>
  108 + <Col span={6}>
  109 + <span className="text-[#333333]">售后方案</span>
  110 + </Col>
  111 + <Col span={18}>
  112 + {enumValueToLabel(
  113 + subOrders[0]?.afterSalesPlan,
  114 + AFTE_SALES_PLAN_OPTIONS,
  115 + )}
  116 + </Col>
  117 + <Col span={6}>
  118 + <span className="className='text-[#333333]'">售后原因</span>
  119 + </Col>
  120 + <Col span={18}>{subOrders[0]?.afterSalesNotes}</Col>
  121 + <Col span={6}>
  122 + <span className="className='text-[#333333]'">附件</span>
  123 + </Col>
  124 + <Col span={18}>{annexLinks}</Col>
  125 + </Row>
  126 + </div>,
  127 + );
  128 + };
  129 +
  130 + useEffect(() => {
  131 + if (checkType(CHECK_TYPE.CONFIRM_DELIVER)) {
  132 + setAPopoverTitle('确认发货');
  133 + }
  134 + getOrderAfterSalesInfo();
  135 +
  136 + let paymentReceiptsImagesList: any[] = [];
  137 + subOrders?.forEach((item: any) => {
  138 + if (item.paymentReceiptAnnexList) {
  139 + paymentReceiptsImagesList.push(...item.paymentReceiptAnnexList);
  140 + }
  141 + });
  142 + //去重
  143 + paymentReceiptsImagesList = [...new Set(paymentReceiptsImagesList)];
  144 + setPymentReceiptsImages(paymentReceiptsImagesList);
  145 +
  146 + //预存审核的凭证
  147 + let proofImages: any[] = [];
  148 + subOrders?.forEach((item) => {
  149 + let images = item.proofImages;
  150 + if (images !== null && images !== undefined) {
  151 + proofImages.push(...images);
  152 + }
  153 + });
  154 + setPrepaidProofImages(proofImages);
  155 + }, []);
  156 +
  157 + const handleChange: UploadProps['onChange'] = ({ fileList: newFileList }) => {
  158 + //fileListObj得在change里变化,change的参数是已经处理过的file数组
  159 + //beforeUpload中的参数file是未处理过,还需要Base64拿到文件数据处理
  160 + fileListObj.current = newFileList;
  161 + setFileList(newFileList);
  162 + };
  163 +
  164 + /** 粘贴快捷键的回调 */
  165 + const onPaste = async (e: any) => {
  166 + /** 获取剪切板的数据clipboardData */
  167 + let clipboardData = e.clipboardData,
  168 + i = 0,
  169 + items,
  170 + item,
  171 + types;
  172 +
  173 + /** 为空判断 */
  174 + if (clipboardData) {
  175 + items = clipboardData.items;
  176 + if (!items) {
  177 + message.info('您的剪贴板中没有照片');
  178 + return;
  179 + }
  180 +
  181 + item = items[0];
  182 + types = clipboardData.types || [];
  183 + /** 遍历剪切板的数据 */
  184 + for (; i < types.length; i++) {
  185 + if (types[i] === 'Files') {
  186 + item = items[i];
  187 + break;
  188 + }
  189 + }
  190 +
  191 + /** 判断文件是否为图片 */
  192 + if (item && item.kind === 'file' && item.type.match(/^image\//i)) {
  193 + const imgItem = item.getAsFile();
  194 + const newFileList = cloneDeep(fileListObj.current);
  195 + let filteredArray = newFileList.filter(
  196 + (obj) => obj.status !== 'removed',
  197 + ); //过滤掉状态为已删除的照片
  198 + const listItem = {
  199 + ...imgItem,
  200 + status: 'done',
  201 + url: await getBase64(imgItem),
  202 + originFileObj: imgItem,
  203 + };
  204 +
  205 + if (filteredArray.length >= COMFIR_RECEIPT_IMAGES_NUMBER) {
  206 + message.info('发货照片数量不能超过3');
  207 + return;
  208 + }
  209 + fileListObj.current = filteredArray;
  210 + filteredArray.push(listItem);
  211 + setFileList(filteredArray);
  212 + return;
  213 + }
  214 + }
  215 +
  216 + message.info('您的剪贴板中没有照片');
  217 + };
  218 + useEffect(() => {
  219 + //回显售后信息
  220 + // if (checkType(CHECK_TYPE.AFTER_SALES)) {
  221 + // getOrderAfterSalesInfo();
  222 + // }
  223 +
  224 + document.addEventListener('paste', onPaste);
  225 + return () => {
  226 + document.removeEventListener('paste', onPaste);
  227 + };
  228 + }, []);
  229 + const uploadButton = (
  230 + <div>
  231 + <PlusOutlined />
  232 + <div style={{ marginTop: 8 }}>上传凭证</div>
  233 + </div>
  234 + );
  235 + const handlePreview = async (file: UploadFile) => {
  236 + if (!file.url && !file.preview) {
  237 + file.preview = await getBase64(file.originFileObj as RcFile);
  238 + }
  239 + setPreviewImage(file.url || (file.preview as string));
  240 + setPreviewOpen(true);
  241 + setPreviewTitle(
  242 + file.name ||
  243 + file.originFileObj?.name ||
  244 + file.url!.substring(file.url!.lastIndexOf('/') + 1),
  245 + );
  246 + };
  247 +
  248 + const handleBeforeUpload = (file: any) => {
  249 + setFileList([...fileList, file]);
  250 + return false;
  251 + };
  252 +
  253 + const props: UploadProps = {
  254 + onRemove: (file) => {
  255 + const index = fileList.indexOf(file);
  256 + const newFileList = fileList.slice();
  257 + newFileList.splice(index, 1);
  258 + setFileList(newFileList);
  259 + },
  260 + beforeUpload: handleBeforeUpload,
  261 + listType: 'picture-card',
  262 + onPreview: handlePreview,
  263 + fileList,
  264 + onChange: handleChange,
  265 + accept: 'image/png, image/jpeg, image/png',
  266 + // action: '/api/service/order/fileProcess',
  267 + name: 'files',
  268 + headers: { Authorization: localStorage.getItem('token') },
  269 + };
  270 +
  271 + //仓库审核
  272 + async function doCheck(body: object) {
  273 + const data = await postServiceOrderAudit({
  274 + data: body,
  275 + });
  276 + if (data.result === RESPONSE_CODE.SUCCESS) {
  277 + message.success(data.message);
  278 + onClose();
  279 + }
  280 + }
  281 +
  282 + /**
  283 + *
  284 + * @param body 财务审核
  285 + */
  286 + async function doFinancailCheck(values: any, isAgree: boolean) {
  287 + if (fileList.length <= 0) {
  288 + message.error('凭证不能为空');
  289 + return;
  290 + }
  291 + messageApi.open({
  292 + type: 'loading',
  293 + content: '正在上传图片...',
  294 + duration: 0,
  295 + });
  296 + //附件处理
  297 + let formData = new FormData();
  298 + //附件处理
  299 + for (let file of fileList) {
  300 + if (file.originFileObj) {
  301 + formData.append('files', file.originFileObj as RcFile);
  302 + } else {
  303 + //有url的话取url(源文件),没url取thumbUrl。有url的时候thumbUrl是略缩图
  304 + if (file?.url === undefined || file?.url === null) {
  305 + formData.append(
  306 + 'files',
  307 + transImageFile(file?.thumbUrl),
  308 + file?.originFileObj?.name,
  309 + );
  310 + } else {
  311 + formData.append(
  312 + 'files',
  313 + transImageFile(file?.url),
  314 + file?.originFileObj?.name,
  315 + );
  316 + }
  317 + }
  318 + }
  319 + let res = await postServiceOrderFileProcess({
  320 + data: formData,
  321 + });
  322 + messageApi.destroy();
  323 + if (res.result === RESPONSE_CODE.SUCCESS) {
  324 + message.success('上传成功!');
  325 +
  326 + let fileUrls = res?.data?.map((item) => {
  327 + return { url: item };
  328 + });
  329 + //财务审核
  330 + const data = await postServiceOrderFinanceCheckOrder({
  331 + data: {
  332 + ...values,
  333 + checkNotes: values.name,
  334 + ids: subOrderIds,
  335 + checkPassOrReject: isAgree,
  336 + invoicingCheckAnnex: fileUrls,
  337 + },
  338 + });
  339 + if (data.result === RESPONSE_CODE.SUCCESS) {
  340 + message.success(data.message);
  341 + onClose();
  342 + }
  343 + } else {
  344 + message.success('上传失败');
  345 + }
  346 + }
  347 +
  348 + /**
  349 + *
  350 + * @param body 售后审核
  351 + */
  352 + async function doAfterSalesCheck(body: object) {
  353 + const data = await postServiceOrderAfterSalesStoreSure({
  354 + data: body,
  355 + });
  356 + if (data.result === RESPONSE_CODE.SUCCESS) {
  357 + message.success(data.message);
  358 + onClose();
  359 + }
  360 + }
  361 +
  362 + /**
  363 + *
  364 + * @param body 领导审核
  365 + */
  366 + async function doLeaderCheck(body: object) {
  367 + const data = await postServiceOrderLeaderAudit({
  368 + data: body,
  369 + });
  370 + if (data.result === RESPONSE_CODE.SUCCESS) {
  371 + message.success(data.message);
  372 + onClose();
  373 + }
  374 + }
  375 +
  376 + /**
  377 + * 预存审核
  378 + * @param body
  379 + */
  380 + async function doPrepaidAudit(body: any) {
  381 + const data = await postPrepaidAudit({
  382 + data: body,
  383 + });
  384 + if (data.result === RESPONSE_CODE.SUCCESS) {
  385 + message.success(data.message);
  386 + onClose();
  387 + }
  388 + }
  389 +
  390 + function computeType() {
  391 + let type: string = '';
  392 + if (checkType(CHECK_TYPE.CONFIRM_DELIVER)) {
  393 + type = 'confirm_deliver';
  394 + }
  395 + if (checkType(CHECK_TYPE.WEARHOUSE_KEEPER)) {
  396 + type = 'warehouse_audit';
  397 + }
  398 + if (checkType(CHECK_TYPE.WAITING_FOR_POST_AUDIT)) {
  399 + type = 'post_audit';
  400 + }
  401 + if (checkType(CHECK_TYPE.NODE_OPERATING_AUDIT)) {
  402 + type = 'node_operating_audit';
  403 + }
  404 + if (checkType(CHECK_TYPE.MODIFY_LEADER_AUDIT)) {
  405 + type = 'modify_leader_audit';
  406 + }
  407 + if (checkType(CHECK_TYPE.URGENT_INVOICE_AUDITING)) {
  408 + type = 'urgent_invoice_audit';
  409 + }
  410 + if (checkType(CHECK_TYPE.PAYMENT_RECEIPTS_AUDIT)) {
  411 + type = 'payment_receipt_audit';
  412 + }
  413 + if (checkType(CHECK_TYPE.CONFIRM_REISSUE)) {
  414 + type = 'confirm_reissue';
  415 + }
  416 + if (checkType(CHECK_TYPE.CREDIT_AUDIT)) {
  417 + type = 'credit_audit';
  418 + }
  419 + if (checkType(CHECK_TYPE.URGENT_INVOICE_AUDITING_OLD)) {
  420 + type = 'urgent_invoice_audit_old';
  421 + }
  422 + if (checkType(CHECK_TYPE.CONFIRM_REISSUE_OLD)) {
  423 + type = 'confirm_reissue_old';
  424 + }
  425 + return type;
  426 + }
  427 +
  428 + return (
  429 + <>
  430 + <ModalForm<{
  431 + name: string;
  432 + company: string;
  433 + }>
  434 + width={500}
  435 + open
  436 + title={aPopoverTitle}
  437 + form={form}
  438 + autoFocusFirstInput
  439 + modalProps={{
  440 + okText: '通过',
  441 + cancelText: '取消',
  442 + destroyOnClose: true,
  443 + onCancel: () => {
  444 + setCheckVisible(false);
  445 + },
  446 + }}
  447 + submitter={{
  448 + render: () => {
  449 + let myDoms = [];
  450 + if (!checkType(CHECK_TYPE.CONFIRM_DELIVER)) {
  451 + myDoms
  452 + .push
  453 + // <Button
  454 + // key="驳回"
  455 + // onClick={async () => {
  456 + // if (checkType(CHECK_TYPE.AFTER_SALES)) {
  457 + // doAfterSalesCheck({
  458 + // applyType: 'after-sales',
  459 + // isAfterSalesSuccess: false,
  460 + // subOrderIds: subOrderIds,
  461 + // mainId: mainOrderId,
  462 + // afterSalesRejectionNotes: form.getFieldValue('name'),
  463 + // });
  464 + // return;
  465 + // }
  466 +
  467 + // if (checkType(CHECK_TYPE.FINALCIAL)) {
  468 + // let values = { name: form.getFieldValue('name') };
  469 + // doFinancailCheck(values, false);
  470 + // return;
  471 + // }
  472 +
  473 + // if (checkType(CHECK_TYPE.LEADER_AUDIT)) {
  474 + // doLeaderCheck({
  475 + // pass: false,
  476 + // subOrderIds: subOrderIds,
  477 + // reason: form.getFieldValue('name'),
  478 + // });
  479 + // return;
  480 + // }
  481 +
  482 + // if (checkType(CHECK_TYPE.MODIFY_APPLY_WAIT_FOR_AUDIT)) {
  483 + // doAfterSalesCheck({
  484 + // applyType: 'order-change-normal',
  485 + // isAfterSalesSuccess: false,
  486 + // subOrderIds: subOrderIds,
  487 + // mainId: mainOrderId,
  488 + // afterSalesRejectionNotes: form.getFieldValue('name'),
  489 + // });
  490 + // return;
  491 + // }
  492 +
  493 + // //预存审核,先暂时共用同一个审核弹窗
  494 + // if (checkType(CHECK_TYPE.PREPAID_AUDIT)) {
  495 + // return doPrepaidAudit({
  496 + // pass: false,
  497 + // ids: subOrderIds,
  498 + // auditNotes: form.getFieldValue('name'),
  499 + // });
  500 + // }
  501 +
  502 + // let type = '';
  503 + // type = computeType();
  504 + // console.log('type:' + type);
  505 + // doCheck({
  506 + // pass: false,
  507 + // subOrderIds: subOrderIds,
  508 + // type: type,
  509 + // notes: form.getFieldValue('name'),
  510 + // });
  511 + // }}
  512 + // >
  513 + // 驳回
  514 + // </Button>,
  515 + ();
  516 + }
  517 +
  518 + //如果是仓库审核,那么显示这个外部采购
  519 + if (checkType(CHECK_TYPE.WEARHOUSE_KEEPER)) {
  520 + myDoms.push(
  521 + <Button
  522 + key="外部采购"
  523 + onClick={async () => {
  524 + let res = await postServiceOrderToProcureAudit({
  525 + data: {
  526 + subOrderIds: subOrderIds,
  527 + },
  528 + });
  529 +
  530 + if (res && res.result === RESPONSE_CODE.SUCCESS) {
  531 + message.success(res.message);
  532 + onClose();
  533 + }
  534 + }}
  535 + >
  536 + 外部采购
  537 + </Button>,
  538 + );
  539 + }
  540 +
  541 + //确认
  542 + // myDoms.push(defaultDoms[1]);
  543 + return myDoms;
  544 + },
  545 + }}
  546 + submitTimeout={2000}
  547 + onFinish={async (values) => {
  548 + if (checkType(CHECK_TYPE.AFTER_SALES)) {
  549 + //审核通过
  550 + return doAfterSalesCheck({
  551 + applyType: 'after-sales',
  552 + isAfterSalesSuccess: true,
  553 + subOrderIds: subOrderIds,
  554 + mainId: mainOrderId,
  555 + afterSalesRejectionNotes: values.name,
  556 + afterSalesStoreNotes: values.sure,
  557 + });
  558 + }
  559 + console.log('h');
  560 + if (checkType(CHECK_TYPE.FINALCIAL)) {
  561 + doFinancailCheck(values, true);
  562 + return;
  563 + }
  564 +
  565 + if (checkType(CHECK_TYPE.LEADER_AUDIT)) {
  566 + doLeaderCheck({
  567 + pass: true,
  568 + subOrderIds: subOrderIds,
  569 + reason: values.name,
  570 + });
  571 + return;
  572 + }
  573 +
  574 + if (checkType(CHECK_TYPE.MODIFY_APPLY_WAIT_FOR_AUDIT)) {
  575 + //审核通过
  576 + return doAfterSalesCheck({
  577 + applyType: 'order-change-normal',
  578 + isAfterSalesSuccess: true,
  579 + subOrderIds: subOrderIds,
  580 + mainId: mainOrderId,
  581 + afterSalesRejectionNotes: values.name,
  582 + afterSalesStoreNotes: values.sure,
  583 + });
  584 + }
  585 +
  586 + //预存审核,先暂时共用同一个审核弹窗
  587 + if (checkType(CHECK_TYPE.PREPAID_AUDIT)) {
  588 + return doPrepaidAudit({
  589 + pass: true,
  590 + ids: subOrderIds,
  591 + auditNotes: form.getFieldValue('name'),
  592 + });
  593 + }
  594 +
  595 + let type = '';
  596 + type = computeType();
  597 + doCheck({
  598 + ...values,
  599 + pass: true,
  600 + subOrderIds: subOrderIds,
  601 + type: type,
  602 + notes: form.getFieldValue('name'),
  603 + });
  604 + }}
  605 + onOpenChange={setCheckVisible}
  606 + >
  607 + {checkType(CHECK_TYPE.AFTER_SALES) ? (
  608 + <>
  609 + {afterSalesInfo}
  610 + <Button
  611 + className="px-0"
  612 + type="link"
  613 + onClick={() => {
  614 + console.log(data);
  615 + openOrderDrawer('after-sales-check', mainOrderId);
  616 + }}
  617 + >
  618 + 查看旧订单
  619 + </Button>
  620 + </>
  621 + ) : (
  622 + ''
  623 + )}
  624 + {checkType(CHECK_TYPE.PAYMENT_RECEIPTS_AUDIT) ? (
  625 + <>
  626 + <Divider orientation="center">
  627 + <span className="text-sm">回款凭证</span>
  628 + </Divider>
  629 + <Image.PreviewGroup
  630 + className="mr-10"
  631 + preview={{
  632 + onChange: (current, prev) =>
  633 + console.log(`current index: ${current}, prev index: ${prev}`),
  634 + }}
  635 + >
  636 + {paymentReceiptsImages.map((url) => (
  637 + <>
  638 + <Image width={120} src={url} /> <Divider type="vertical" />
  639 + </>
  640 + ))}
  641 + </Image.PreviewGroup>
  642 + <Divider></Divider>
  643 + </>
  644 + ) : (
  645 + ''
  646 + )}
  647 +
  648 + {checkType(CHECK_TYPE.PREPAID_AUDIT) && (
  649 + <>
  650 + <Divider orientation="center">
  651 + <span className="text-sm">凭证</span>
  652 + </Divider>
  653 + <Image.PreviewGroup
  654 + className="mr-10"
  655 + preview={{
  656 + onChange: (current, prev) =>
  657 + console.log(`current index: ${current}, prev index: ${prev}`),
  658 + }}
  659 + >
  660 + {prepaidProofImages.map((url) => (
  661 + <>
  662 + <Image width={120} src={url} /> <Divider type="vertical" />
  663 + </>
  664 + ))}
  665 + </Image.PreviewGroup>
  666 + <Divider></Divider>
  667 + </>
  668 + )}
  669 +
  670 + {/* {checkType('prepaidAudit') ? (
  671 + <div>请特别注意手机号码和充值金额。</div>
  672 + ) : (
  673 + <div>请特别注意订单总金额与订单金额。</div>
  674 + )} */}
  675 + {!checkType(CHECK_TYPE.CONFIRM_DELIVER) ? (
  676 + <ProFormTextArea
  677 + width="lg"
  678 + name="name"
  679 + readonly
  680 + initialValue={subOrders?.find((order) => order.notes)?.notes || ''}
  681 + // placeholder="若驳回,请填写驳回理由"
  682 + />
  683 + ) : (
  684 + <></>
  685 + )}
  686 +
  687 + <ProFormTextArea
  688 + width="lg"
  689 + name="sure"
  690 + label="确认原因 :"
  691 + rules={[
  692 + {
  693 + required: true,
  694 + message: '请输入确认原因!',
  695 + },
  696 + ]}
  697 + // placeholder="若驳回,请填写驳回理由"
  698 + />
  699 +
  700 + {checkType(CHECK_TYPE.FINALCIAL) ? (
  701 + <>
  702 + <ProFormText
  703 + width="md"
  704 + name="bankStatementSerialNumbersText"
  705 + label="流水号"
  706 + rules={[
  707 + {
  708 + required: true,
  709 + message: '请输入流水号!',
  710 + },
  711 + ]}
  712 + placeholder={'多个流水号用逗号隔开'}
  713 + />
  714 + <div className="pb-4 text-xs decoration-gray-50">
  715 + 可复制照片粘贴
  716 + </div>
  717 + <Upload {...props}>
  718 + {fileList.length < COMFIR_RECEIPT_IMAGES_NUMBER
  719 + ? uploadButton
  720 + : ''}
  721 + </Upload>
  722 + </>
  723 + ) : (
  724 + ''
  725 + )}
  726 + {checkType(CHECK_TYPE.CONFIRM_REISSUE) && (
  727 + <>
  728 + <InvoiceSubOrderInfoTable
  729 + subOrderIds={subOrderIds}
  730 + ></InvoiceSubOrderInfoTable>
  731 + </>
  732 + )}
  733 + {checkType(CHECK_TYPE.URGENT_INVOICE_AUDITING) ? (
  734 + <>
  735 + <ProList
  736 + rowKey="id"
  737 + headerTitle="发票信息"
  738 + metas={{
  739 + title: {
  740 + dataIndex: 'name',
  741 + },
  742 + avatar: {
  743 + dataIndex: 'image',
  744 + editable: false,
  745 + },
  746 + description: {
  747 + dataIndex: 'desc',
  748 + },
  749 + subTitle: {
  750 + render: () => {
  751 + return (
  752 + <Space size={0}>
  753 + <Tag color="blue">Ant Design</Tag>
  754 + <Tag color="#5BD8A6">TechUI</Tag>
  755 + </Space>
  756 + );
  757 + },
  758 + },
  759 + actions: {
  760 + render: (text, row, index, action) => [
  761 + <a
  762 + onClick={() => {
  763 + action?.startEditable(row.id);
  764 + }}
  765 + key="link"
  766 + >
  767 + 编辑
  768 + </a>,
  769 + ],
  770 + },
  771 + }}
  772 + ></ProList>
  773 + </>
  774 + ) : (
  775 + ''
  776 + )}
  777 +
  778 + <Form.Item>
  779 + <Button type="primary" htmlType="submit">
  780 + 确认
  781 + </Button>
  782 + </Form.Item>
  783 + </ModalForm>
  784 +
  785 + <Modal
  786 + open={previewOpen}
  787 + title={previewTitle}
  788 + footer={null}
  789 + onCancel={handleCancel}
  790 + >
  791 + <img alt="图片预览" style={{ width: '100%' }} src={previewImage} />
  792 + </Modal>
  793 + {contextHolder}
  794 + </>
  795 + );
  796 +};
... ...
src/pages/Order/Order/components/ProcureCheckModal.tsx
... ... @@ -2,6 +2,7 @@ import { RESPONSE_CODE } from &#39;@/constants/enum&#39;;
2 2 import {
3 3 postServiceOrderProcureCheckOrder,
4 4 postServiceOrderProcureConvertWarehouseKeeper,
  5 + postServiceOrderPurchaseRejectionToSale,
5 6 postServiceOrderQuerySupplier,
6 7 } from '@/services';
7 8 import {
... ... @@ -13,7 +14,7 @@ import { Button, Form, Input, Popconfirm, message } from &#39;antd&#39;;
13 14 import { useState } from 'react';
14 15 export default ({ setCheckVisible, isMainOrder, orders, onClose }) => {
15 16 const [form] = Form.useForm<{ supplier: string }>();
16   - const [checkNotes, setCheckNotes] = useState<string>('');
  17 + const [procureNotes, setProcureNotes] = useState<string>('');
17 18  
18 19 console.log(isMainOrder);
19 20  
... ... @@ -50,7 +51,38 @@ export default ({ setCheckVisible, isMainOrder, orders, onClose }) =&gt; {
50 51 return [
51 52 defaultDoms[0],
52 53 <>
53   - <Button>驳回至销售</Button>
  54 + <Popconfirm
  55 + title="是否驳回至销售"
  56 + description={
  57 + <div>
  58 + <Input.TextArea
  59 + placeholder="请填写备注"
  60 + onChange={(e: any) => {
  61 + setProcureNotes(e.target.value);
  62 + }}
  63 + rows={4}
  64 + ></Input.TextArea>
  65 + </div>
  66 + }
  67 + onConfirm={async () => {
  68 + let res = await postServiceOrderPurchaseRejectionToSale({
  69 + data: {
  70 + subIds: ids,
  71 + procureNotes: procureNotes,
  72 + },
  73 + });
  74 +
  75 + if (res?.result === RESPONSE_CODE.SUCCESS) {
  76 + message.success(res.message);
  77 + onClose();
  78 + return true;
  79 + }
  80 + }}
  81 + okText="确定"
  82 + cancelText="取消"
  83 + >
  84 + <Button type="primary">驳回至销售</Button>
  85 + </Popconfirm>
54 86 <Popconfirm
55 87 title="是否转回仓库"
56 88 description={
... ... @@ -61,7 +93,7 @@ export default ({ setCheckVisible, isMainOrder, orders, onClose }) =&gt; {
61 93 <Input.TextArea
62 94 placeholder="请填写备注"
63 95 onChange={(e: any) => {
64   - setCheckNotes(e.target.value);
  96 + setProcureNotes(e.target.value);
65 97 }}
66 98 rows={4}
67 99 ></Input.TextArea>
... ... @@ -72,7 +104,7 @@ export default ({ setCheckVisible, isMainOrder, orders, onClose }) =&gt; {
72 104 {
73 105 data: {
74 106 subIds: ids,
75   - checkNotes: checkNotes,
  107 + procureNotes: procureNotes,
76 108 },
77 109 },
78 110 );
... ...
src/pages/Order/Order/index copy.tsx
... ... @@ -2003,7 +2003,7 @@ const OrderPage = () =&gt; {
2003 2003 onClick={() => {
2004 2004 createOptObject(optRecord.id, record.id);
2005 2005 setOrderDrawerVisible(true);
2006   - setOrderOptType('after_sales');
  2006 + setOrderOptType('after-sales');
2007 2007 }}
2008 2008 >
2009 2009 申请售后
... ... @@ -3835,7 +3835,9 @@ const OrderPage = () =&gt; {
3835 3835 selectedSubOrders[i].orderStatus !==
3836 3836 'CONFIRM_RECEIPT' &&
3837 3837 selectedSubOrders[i].orderStatus !==
3838   - 'AFTER_SALES_FAILURE'
  3838 + 'AFTER_SALES_FAILURE' &&
  3839 + selectedSubOrders[i].orderStatus !==
  3840 + 'AFTER_SALES_COMPLETION'
3839 3841 ) {
3840 3842 message.error('请选择确认收货状态的子订单进行售后');
3841 3843 return;
... ...
src/pages/Order/OrderList/OrderList.tsx
... ... @@ -9,7 +9,6 @@ import {
9 9 postKingdeeRepSalOrderSave,
10 10 postServiceConstCanApplyAfterInvoicingStatus,
11 11 postServiceInvoiceCancelApply,
12   - postServiceOrderAfterSalesCheck,
13 12 postServiceOrderCancelSend,
14 13 postServiceOrderConfirmInvoice,
15 14 postServiceOrderGetCurrentOptNode,
... ... @@ -81,6 +80,7 @@ import Base64 from &#39;base-64&#39;;
81 80 import { cloneDeep } from 'lodash';
82 81 import React, { Key, useEffect, useMemo, useRef, useState } from 'react';
83 82 import OrderPrintModal from '../../OrderPrint/OrderPrintModal';
  83 +import StoreCheckModal from '../FeedBack/StoreCheckModal';
84 84 import {
85 85 AFTER_INVOICING_STATUS,
86 86 CHECK_TYPE,
... ... @@ -156,6 +156,8 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) =&gt; {
156 156 useState<boolean>(false);
157 157 const [afterSalesDrawerVisible, setAfterSalesDrawerVisible] =
158 158 useState<boolean>(false);
  159 + const [storeCheckModalVisible, setStoreCheckModalVisible] =
  160 + useState<boolean>(false);
159 161 const [historyModalVisible, setHistoryModalVisible] =
160 162 useState<boolean>(false);
161 163 const [isRePrintOrder, setIsRePrintOrder] = useState<boolean>(false);
... ... @@ -563,15 +565,15 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) =&gt; {
563 565 }
564 566 };
565 567  
566   - async function doAfterSalesCheck(body: object) {
567   - const data = await postServiceOrderAfterSalesCheck({
568   - data: body,
569   - });
570   - console.log(data);
571   - if (data.data) {
572   - refreshTable();
573   - }
574   - }
  568 + // async function doAfterSalesCheck(body: object) {
  569 + // const data = await postServiceOrderAfterSalesCheck({
  570 + // data: body,
  571 + // });
  572 + // console.log(data);
  573 + // if (data.data) {
  574 + // refreshTable();
  575 + // }
  576 + // }
575 577  
576 578 const onCheckboxChange = (record: never) => {
577 579 let newSelectedMainOrderKeys = [];
... ... @@ -1238,6 +1240,16 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) =&gt; {
1238 1240 ) : (
1239 1241 ''
1240 1242 )}
  1243 + {/* 后置审核状态 */}
  1244 + {optRecord.orderStatus === 'PROCURE_REJECT' ? (
  1245 + <div className="overflow-hidden whitespace-no-wrap overflow-ellipsis">
  1246 + <Tag color={'red'} style={{ marginRight: '4px' }}>
  1247 + {'采购驳回'}
  1248 + </Tag>
  1249 + </div>
  1250 + ) : (
  1251 + ''
  1252 + )}
1241 1253  
1242 1254 {/**采购是否已下单状态 */}
1243 1255 {optRecord.procureOrderStatus !== null &&
... ... @@ -1924,24 +1936,18 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) =&gt; {
1924 1936 )}
1925 1937  
1926 1938 {optRecord.paths?.includes('afterSalesConfirm') ? (
1927   - <ButtonConfirm
  1939 + <Button
1928 1940 className="p-0"
1929   - title="确认通过?"
1930   - text="仓库确认"
1931   - onConfirm={() => {
1932   - setIsMainOrder(false);
1933   - doAfterSalesCheck({
1934   - applyType: 'after-sales',
1935   - isAfterSalesSuccess: true,
1936   - subOrderIds: isMainOrder
1937   - ? [...record.subOrderInformationLists]
1938   - .flat()
1939   - ?.map((subOrder) => subOrder.id)
1940   - : [optRecord.id],
1941   - mainId: record.id,
1942   - });
  1941 + type="link"
  1942 + onClick={() => {
  1943 + setCurrentMainId(record.id);
  1944 + createOptObject(optRecord.id, record.id);
  1945 + setStoreCheckModalVisible(true);
  1946 + setOrderCheckType(CHECK_TYPE.AFTER_SALES);
1943 1947 }}
1944   - />
  1948 + >
  1949 + 仓库确认
  1950 + </Button>
1945 1951 ) : (
1946 1952 ''
1947 1953 )}
... ... @@ -2032,7 +2038,7 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) =&gt; {
2032 2038 onClick={() => {
2033 2039 createOptObject(optRecord.id, record.id);
2034 2040 setOrderDrawerVisible(true);
2035   - setOrderOptType('after_sales');
  2041 + setOrderOptType('after-sales');
2036 2042 }}
2037 2043 >
2038 2044 申请售后
... ... @@ -3682,22 +3688,18 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) =&gt; {
3682 3688 )}
3683 3689  
3684 3690 {record.paths?.includes('afterSalesConfirm') ? (
3685   - <ButtonConfirm
  3691 + <Button
3686 3692 className="p-0"
3687   - title="确认通过?"
3688   - text="仓库确认"
3689   - onConfirm={() => {
3690   - setIsMainOrder(true);
3691   - doAfterSalesCheck({
3692   - applyType: 'after-sales',
3693   - isAfterSalesSuccess: true,
3694   - subOrderIds: [...record.subOrderInformationLists]
3695   - .flat()
3696   - ?.map((subOrder) => subOrder.id),
3697   - mainId: record.id,
3698   - });
  3693 + type="link"
  3694 + onClick={() => {
  3695 + setCurrentMainId(record.id);
  3696 + createOptObject(null, record.id);
  3697 + setStoreCheckModalVisible(true);
  3698 + setOrderCheckType(CHECK_TYPE.AFTER_SALES);
3699 3699 }}
3700   - />
  3700 + >
  3701 + 仓库确认
  3702 + </Button>
3701 3703 ) : (
3702 3704 ''
3703 3705 )}
... ... @@ -3885,7 +3887,9 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) =&gt; {
3885 3887 selectedSubOrders[i].orderStatus !==
3886 3888 'CONFIRM_RECEIPT' &&
3887 3889 selectedSubOrders[i].orderStatus !==
3888   - 'AFTER_SALES_FAILURE'
  3890 + 'AFTER_SALES_FAILURE' &&
  3891 + selectedSubOrders[i].orderStatus !==
  3892 + 'AFTER_SALES_COMPLETION'
3889 3893 ) {
3890 3894 message.error('请选择确认收货状态的子订单进行售后');
3891 3895 return;
... ... @@ -4836,6 +4840,34 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) =&gt; {
4836 4840 />
4837 4841 )}
4838 4842  
  4843 + {storeCheckModalVisible && (
  4844 + <StoreCheckModal
  4845 + setCheckVisible={(val: boolean) => {
  4846 + setStoreCheckModalVisible(val);
  4847 + if (!val) {
  4848 + clearOptObject();
  4849 + }
  4850 + }}
  4851 + data={isMainOrder ? getFirstMainOrder() : buildMainOrder()}
  4852 + subOrders={
  4853 + isMainOrder
  4854 + ? [...subOrderSelectedMap.values()].flat()
  4855 + : buildSubOrders()
  4856 + }
  4857 + orderCheckType={orderCheckType}
  4858 + openOrderDrawer={(type: any, id: any) => {
  4859 + setCurrentMainId(id);
  4860 + setOrderOptType(type);
  4861 + setOrderDrawerVisible(true);
  4862 + }}
  4863 + onClose={() => {
  4864 + clearOptObject();
  4865 + setStoreCheckModalVisible(false);
  4866 + refreshTable();
  4867 + }}
  4868 + />
  4869 + )}
  4870 +
4839 4871 {applyForInvoicingVisible && (
4840 4872 <ApplyForInvoicingModal
4841 4873 setCheckVisible={(val: boolean) => {
... ...
src/pages/Order/OrderList/ProcureCheckModal.tsx
... ... @@ -14,7 +14,7 @@ import { Button, Form, Input, Popconfirm, message } from &#39;antd&#39;;
14 14 import { useState } from 'react';
15 15 export default ({ setCheckVisible, isMainOrder, orders, onClose }) => {
16 16 const [form] = Form.useForm<{ supplier: string }>();
17   - const [checkNotes, setCheckNotes] = useState<string>('');
  17 + const [procureNotes, setProcureNotes] = useState<string>('');
18 18  
19 19 console.log(isMainOrder);
20 20  
... ... @@ -51,13 +51,24 @@ export default ({ setCheckVisible, isMainOrder, orders, onClose }) =&gt; {
51 51 return [
52 52 defaultDoms[0],
53 53 <>
54   - <Button
55   - type="primary"
56   - onClick={async () => {
  54 + <Popconfirm
  55 + title="是否驳回至销售"
  56 + description={
  57 + <div>
  58 + <Input.TextArea
  59 + placeholder="请填写备注"
  60 + onChange={(e: any) => {
  61 + setProcureNotes(e.target.value);
  62 + }}
  63 + rows={4}
  64 + ></Input.TextArea>
  65 + </div>
  66 + }
  67 + onConfirm={async () => {
57 68 let res = await postServiceOrderPurchaseRejectionToSale({
58 69 data: {
59 70 subIds: ids,
60   - checkNotes: checkNotes,
  71 + procureNotes: procureNotes,
61 72 },
62 73 });
63 74  
... ... @@ -67,9 +78,11 @@ export default ({ setCheckVisible, isMainOrder, orders, onClose }) =&gt; {
67 78 return true;
68 79 }
69 80 }}
  81 + okText="确定"
  82 + cancelText="取消"
70 83 >
71   - 驳回至销售
72   - </Button>
  84 + <Button type="primary">驳回至销售</Button>
  85 + </Popconfirm>
73 86 <Popconfirm
74 87 title="是否转回仓库"
75 88 description={
... ... @@ -80,7 +93,7 @@ export default ({ setCheckVisible, isMainOrder, orders, onClose }) =&gt; {
80 93 <Input.TextArea
81 94 placeholder="请填写备注"
82 95 onChange={(e: any) => {
83   - setCheckNotes(e.target.value);
  96 + setProcureNotes(e.target.value);
84 97 }}
85 98 rows={4}
86 99 ></Input.TextArea>
... ... @@ -91,7 +104,7 @@ export default ({ setCheckVisible, isMainOrder, orders, onClose }) =&gt; {
91 104 {
92 105 data: {
93 106 subIds: ids,
94   - checkNotes: checkNotes,
  107 + procureNotes: procureNotes,
95 108 },
96 109 },
97 110 );
... ...
src/pages/Order/OrderWarning/index copy.tsx
... ... @@ -1939,7 +1939,7 @@ const OrderPage = () =&gt; {
1939 1939 onClick={() => {
1940 1940 createOptObject(optRecord.id, record.id);
1941 1941 setOrderDrawerVisible(true);
1942   - setOrderOptType('after_sales');
  1942 + setOrderOptType('after-sales');
1943 1943 }}
1944 1944 >
1945 1945 申请售后
... ... @@ -3793,7 +3793,9 @@ const OrderPage = () =&gt; {
3793 3793 selectedSubOrders[i].orderStatus !==
3794 3794 'CONFIRM_RECEIPT' &&
3795 3795 selectedSubOrders[i].orderStatus !==
3796   - 'AFTER_SALES_FAILURE'
  3796 + 'AFTER_SALES_FAILURE' &&
  3797 + selectedSubOrders[i].orderStatus !==
  3798 + 'AFTER_SALES_COMPLETION'
3797 3799 ) {
3798 3800 message.error('请选择确认收货状态的子订单进行售后');
3799 3801 return;
... ...
src/services/request.ts
... ... @@ -18868,6 +18868,77 @@ export const postServiceOrderAfterSalesQuerySnapshotOrder =
18868 18868 return request;
18869 18869 })();
18870 18870  
  18871 +/** @description request parameter type for postServiceOrderAfterSalesStoreSure */
  18872 +export interface PostServiceOrderAfterSalesStoreSureOption {
  18873 + /**
  18874 + * @description
  18875 + * dto
  18876 + */
  18877 + body: {
  18878 + /**
  18879 + @description
  18880 + dto */
  18881 + dto: Dto;
  18882 + };
  18883 +}
  18884 +
  18885 +/** @description response type for postServiceOrderAfterSalesStoreSure */
  18886 +export interface PostServiceOrderAfterSalesStoreSureResponse {
  18887 + /**
  18888 + * @description
  18889 + * OK
  18890 + */
  18891 + 200: ServerResult;
  18892 + /**
  18893 + * @description
  18894 + * Created
  18895 + */
  18896 + 201: any;
  18897 + /**
  18898 + * @description
  18899 + * Unauthorized
  18900 + */
  18901 + 401: any;
  18902 + /**
  18903 + * @description
  18904 + * Forbidden
  18905 + */
  18906 + 403: any;
  18907 + /**
  18908 + * @description
  18909 + * Not Found
  18910 + */
  18911 + 404: any;
  18912 +}
  18913 +
  18914 +export type PostServiceOrderAfterSalesStoreSureResponseSuccess =
  18915 + PostServiceOrderAfterSalesStoreSureResponse[200];
  18916 +/**
  18917 + * @description
  18918 + * 仓库确认售后订单
  18919 + * @tags 内部订单
  18920 + * @produces *
  18921 + * @consumes application/json
  18922 + */
  18923 +export const postServiceOrderAfterSalesStoreSure = /* #__PURE__ */ (() => {
  18924 + const method = 'post';
  18925 + const url = '/service/order/afterSalesStoreSure';
  18926 + function request(
  18927 + option: PostServiceOrderAfterSalesStoreSureOption,
  18928 + ): Promise<PostServiceOrderAfterSalesStoreSureResponseSuccess> {
  18929 + return requester(request.url, {
  18930 + method: request.method,
  18931 + ...option,
  18932 + }) as unknown as Promise<PostServiceOrderAfterSalesStoreSureResponseSuccess>;
  18933 + }
  18934 +
  18935 + /** http method */
  18936 + request.method = method;
  18937 + /** request url */
  18938 + request.url = url;
  18939 + return request;
  18940 +})();
  18941 +
18871 18942 /** @description request parameter type for postServiceOrderApplyAfterSales */
18872 18943 export interface PostServiceOrderApplyAfterSalesOption {
18873 18944 /**
... ...