Commit 117c264429c6e1acec3e12cad9a4602e4895a9aa

Authored by zhongnanhuang
1 parent e800745d

feat: update v1.1

.umirc.ts
... ... @@ -14,6 +14,7 @@ export default defineConfig({
14 14 proxy: {
15 15 '/api/': {
16 16 target: 'http://localhost:8085/',
  17 + // target: 'http://192.168.1.6:8085/',
17 18 // target: 'http://39.108.227.113:8085/',
18 19 changeOrigin: true,
19 20 pathRewrite: { '^/api': '' },
... ...
src/app.ts
... ... @@ -98,7 +98,10 @@ export const request: RequestConfig = {
98 98 (response) => {
99 99 // 不再需要异步处理读取返回体内容,可直接在data中读出,部分字段可在 config 中找到
100 100 const { data = {} as any } = response;
101   - if (data.result !== RESPONSE_CODE.SUCCESS) {
  101 + if (
  102 + data.result !== RESPONSE_CODE.SUCCESS &&
  103 + data.result !== undefined
  104 + ) {
102 105 message.error(data.message);
103 106 }
104 107  
... ...
src/pages/Order/components/AttachmentModal.tsx 0 → 100644
  1 +import { getAliYunOSSFileNameFromUrl } from '@/utils';
  2 +import { ModalForm, ProFormUploadDragger } from '@ant-design/pro-components';
  3 +import { Button, Form } from 'antd';
  4 +import { cloneDeep } from 'lodash';
  5 +import { useEffect, useState } from 'react';
  6 +
  7 +export default ({ data, onClose }) => {
  8 + let newData = cloneDeep(data);
  9 + const [fileList, setFileList] = useState<[]>([]);
  10 + const [form] = Form.useForm<{
  11 + subOrderId: '';
  12 + listAnnex: [];
  13 + }>();
  14 +
  15 + let newListAnnex = newData.listAnnex?.map((path) => {
  16 + let i = 0;
  17 + return {
  18 + uid: i++,
  19 + name: getAliYunOSSFileNameFromUrl(path),
  20 + status: 'uploaded',
  21 + url: path,
  22 + response: { data: [path] },
  23 + };
  24 + });
  25 + newData.listAnnex = newListAnnex;
  26 + useEffect(() => {
  27 + setFileList(newData.listAnnex);
  28 + }, []);
  29 +
  30 + return (
  31 + <ModalForm
  32 + width={500}
  33 + open
  34 + title="查看附件"
  35 + initialValues={newData}
  36 + form={form}
  37 + modalProps={{
  38 + onCancel: onClose,
  39 + }}
  40 + submitter={{
  41 + render: () => {
  42 + return [
  43 + <Button
  44 + key="back"
  45 + onClick={() => {
  46 + onClose();
  47 + }}
  48 + >
  49 + 返回
  50 + </Button>,
  51 + ];
  52 + },
  53 + }}
  54 + >
  55 + <ProFormUploadDragger
  56 + name="listAnnex"
  57 + action="/api/service/order/fileProcess"
  58 + disabled
  59 + fieldProps={{
  60 + headers: { Authorization: localStorage.getItem('token') },
  61 + // onRemove: (file) => {
  62 + // const index = fileList[listMeta.index].indexOf(file);
  63 + // console.log(index);
  64 + // const newFileList = fileList.slice();
  65 + // newFileList.splice(index, 1);
  66 + // setFileList(newFileList);
  67 + // },
  68 + // beforeUpload: (file) => {
  69 + // fileList[listMeta.index] = [...fileList[listMeta.index], file as RcFile];
  70 + // setFileList(fileList);
  71 + // return true;
  72 + // },
  73 + fileList,
  74 + // defaultFileList: itemFileList
  75 + }}
  76 + />
  77 + </ModalForm>
  78 + );
  79 +};
... ...
src/pages/Order/components/ConfirmReceiptModal.tsx
... ... @@ -3,12 +3,15 @@ import { postServiceOrderConfirmReceipt } from &#39;@/services&#39;;
3 3 import { PlusOutlined } from '@ant-design/icons';
4 4 import { Button, Modal, Upload, message } from 'antd';
5 5 import { RcFile, UploadFile, UploadProps } from 'antd/es/upload';
6   -import { useState } from 'react';
  6 +import { cloneDeep } from 'lodash';
  7 +import { useEffect, useRef, useState } from 'react';
  8 +import { COMFIR_RECEIPT_IMAGES_NUMBER } from '../constant';
7 9 export default ({ data, onClose }) => {
8 10 // const [form] = Form.useForm<{ name: string; company: string }>();
9 11 const [previewOpen, setPreviewOpen] = useState(false);
10 12 const [previewImage, setPreviewImage] = useState('');
11 13 const [previewTitle, setPreviewTitle] = useState('');
  14 + const fileListObj = useRef<UploadFile[]>([]); //使用引用类型,使得在useEffect里面设置监听事件后,不用更新监听事件也能保持obj与外界一致
12 15 const getBase64 = (file: RcFile): Promise<string> =>
13 16 new Promise((resolve, reject) => {
14 17 const reader = new FileReader();
... ... @@ -19,9 +22,74 @@ export default ({ data, onClose }) =&gt; {
19 22 const [fileList, setFileList] = useState<UploadFile[]>([]);
20 23 const [uploading, setUploading] = useState(false);
21 24 const handleCancel = () => setPreviewOpen(false);
22   - const handleChange: UploadProps['onChange'] = ({ fileList: newFileList }) =>
  25 +
  26 + const handleChange: UploadProps['onChange'] = ({ fileList: newFileList }) => {
  27 + //fileListObj得在change里变化,change的参数是已经处理过的file数组
  28 + //beforeUpload中的参数file是未处理过,还需要Base64拿到文件数据处理
  29 + fileListObj.current = newFileList;
23 30 setFileList(newFileList);
  31 + };
  32 +
  33 + /** 粘贴快捷键的回调 */
  34 + const onPaste = async (e: any) => {
  35 + /** 获取剪切板的数据clipboardData */
  36 + let clipboardData = e.clipboardData,
  37 + i = 0,
  38 + items,
  39 + item,
  40 + types;
  41 +
  42 + /** 为空判断 */
  43 + if (clipboardData) {
  44 + items = clipboardData.items;
  45 + if (!items) {
  46 + message.info('您的剪贴板中没有照片');
  47 + return;
  48 + }
  49 +
  50 + item = items[0];
  51 + types = clipboardData.types || [];
  52 + /** 遍历剪切板的数据 */
  53 + for (; i < types.length; i++) {
  54 + if (types[i] === 'Files') {
  55 + item = items[i];
  56 + break;
  57 + }
  58 + }
  59 +
  60 + /** 判断文件是否为图片 */
  61 + if (item && item.kind === 'file' && item.type.match(/^image\//i)) {
  62 + const imgItem = item.getAsFile();
  63 + const newFileList = cloneDeep(fileListObj.current);
  64 + let filteredArray = newFileList.filter(
  65 + (obj) => obj.status !== 'removed',
  66 + ); //过滤掉状态为已删除的照片
  67 + const listItem = {
  68 + ...imgItem,
  69 + status: 'done',
  70 + url: await getBase64(imgItem),
  71 + originFileObj: imgItem,
  72 + };
24 73  
  74 + if (filteredArray.length >= COMFIR_RECEIPT_IMAGES_NUMBER) {
  75 + message.info('发货凭证照片数量不能超过3');
  76 + return;
  77 + }
  78 + fileListObj.current = filteredArray;
  79 + filteredArray.push(listItem);
  80 + setFileList(filteredArray);
  81 + return;
  82 + }
  83 + }
  84 +
  85 + message.info('您的剪贴板中没有照片');
  86 + };
  87 + useEffect(() => {
  88 + document.addEventListener('paste', onPaste);
  89 + return () => {
  90 + document.removeEventListener('paste', onPaste);
  91 + };
  92 + }, []);
25 93 const uploadButton = (
26 94 <div>
27 95 <PlusOutlined />
... ... @@ -32,11 +100,12 @@ export default ({ data, onClose }) =&gt; {
32 100 if (!file.url && !file.preview) {
33 101 file.preview = await getBase64(file.originFileObj as RcFile);
34 102 }
35   -
36 103 setPreviewImage(file.url || (file.preview as string));
37 104 setPreviewOpen(true);
38 105 setPreviewTitle(
39   - file.name || file.url!.substring(file.url!.lastIndexOf('/') + 1),
  106 + file.name ||
  107 + file.originFileObj?.name ||
  108 + file.url!.substring(file.url!.lastIndexOf('/') + 1),
40 109 );
41 110 };
42 111  
... ... @@ -76,13 +145,13 @@ export default ({ data, onClose }) =&gt; {
76 145 },
77 146 beforeUpload: (file) => {
78 147 setFileList([...fileList, file]);
79   -
80 148 return false;
81 149 },
82 150 listType: 'picture-card',
83 151 onPreview: handlePreview,
84 152 fileList,
85 153 onChange: handleChange,
  154 + accept: 'image/png, image/jpeg, image/png',
86 155 };
87 156  
88 157 return (
... ... @@ -109,8 +178,11 @@ export default ({ data, onClose }) =&gt; {
109 178 onClose();
110 179 }}
111 180 >
112   - <div className="py-4 font-semibold">请将买家确认收货的凭证照片上传</div>
113   - <Upload {...props}>{fileList.length < 3 ? uploadButton : ''}</Upload>
  181 + <div className="pt-4 font-semibold">请将买家确认收货的凭证照片上传</div>
  182 + <div className="pb-4 text-xs decoration-gray-50">可复制照片粘贴</div>
  183 + <Upload {...props}>
  184 + {fileList.length < COMFIR_RECEIPT_IMAGES_NUMBER ? uploadButton : ''}
  185 + </Upload>
114 186 </Modal>
115 187 <Modal
116 188 open={previewOpen}
... ... @@ -118,7 +190,7 @@ export default ({ data, onClose }) =&gt; {
118 190 footer={null}
119 191 onCancel={handleCancel}
120 192 >
121   - <img alt="example" style={{ width: '100%' }} src={previewImage} />
  193 + <img alt="图片预览" style={{ width: '100%' }} src={previewImage} />
122 194 </Modal>
123 195 </>
124 196 );
... ...
src/pages/Order/components/ImportModal.tsx 0 → 100644
  1 +import { RESPONSE_CODE } from '@/constants/enum';
  2 +import { postServiceOrderImportExcel } from '@/services';
  3 +import { orderExport } from '@/services/order';
  4 +import { UploadOutlined } from '@ant-design/icons';
  5 +import { Button, Modal, Upload, message } from 'antd';
  6 +import { RcFile, UploadFile, UploadProps } from 'antd/es/upload';
  7 +import { useState } from 'react';
  8 +export default ({ onClose }) => {
  9 + // const [form] = Form.useForm<{ name: string; company: string }>();
  10 + const [messageApi, contextHolder] = message.useMessage();
  11 + const [fileList, setFileList] = useState<UploadFile[]>([]);
  12 + const [uploading, setUploading] = useState(false);
  13 + const handleChange: UploadProps['onChange'] = ({ fileList: newFileList }) =>
  14 + setFileList(newFileList);
  15 +
  16 + const exportLoading = (content: string) => {
  17 + messageApi.open({
  18 + type: 'loading',
  19 + content: content,
  20 + duration: 0,
  21 + });
  22 + };
  23 +
  24 + const exportLoadingDestory = () => {
  25 + messageApi.destroy();
  26 + };
  27 + const downloadTemplate = async () => {
  28 + exportLoading('正在下载模板...');
  29 + orderExport('/api/service/order/exportTemplate', {}, exportLoadingDestory);
  30 + };
  31 +
  32 + const handleUpload = async () => {
  33 + const formData = new FormData();
  34 + fileList.forEach((file) => {
  35 + //originFileObj二进制文件
  36 + formData.append('file', file.originFileObj as RcFile);
  37 + });
  38 + // console.log(fileList[0] as RcFile)
  39 + // formData.append('file', fileList[0] as RcFile);
  40 + setUploading(true);
  41 + // You can use any AJAX library you like
  42 + const res = await postServiceOrderImportExcel({
  43 + data: formData,
  44 + headers: {
  45 + 'Content-Type':
  46 + 'multipart/form-data; boundary=----WebKitFormBoundarynl6gT1BKdPWIejNq',
  47 + },
  48 + });
  49 +
  50 + console.log(res);
  51 + if (res.result === RESPONSE_CODE.SUCCESS) {
  52 + message.success(res.message);
  53 + onClose();
  54 + } else {
  55 + if (res.message === '表格中没有数据') {
  56 + setUploading(false);
  57 + return;
  58 + }
  59 + //存在错误信息,下载错误信息模板
  60 + exportLoading('正在下载错误信息...');
  61 + orderExport(
  62 + '/api/service/order/errorExcelInformation',
  63 + formData,
  64 + exportLoadingDestory,
  65 + );
  66 + }
  67 +
  68 + setUploading(false);
  69 + };
  70 +
  71 + const props: UploadProps = {
  72 + onRemove: (file) => {
  73 + const index = fileList.indexOf(file);
  74 + const newFileList = fileList.slice();
  75 + newFileList.splice(index, 1);
  76 + setFileList(newFileList);
  77 + },
  78 + beforeUpload: (file) => {
  79 + setFileList([...fileList, file]);
  80 +
  81 + return false;
  82 + },
  83 + fileList,
  84 + onChange: handleChange,
  85 + accept: '.xlsx',
  86 + };
  87 +
  88 + return (
  89 + <>
  90 + <Modal
  91 + width={500}
  92 + open
  93 + title="导入"
  94 + footer={[
  95 + <Button key="cancel" onClick={onClose}>
  96 + 取消
  97 + </Button>,
  98 + <Button
  99 + type="primary"
  100 + key="ok"
  101 + onClick={handleUpload}
  102 + disabled={fileList.length === 0}
  103 + loading={uploading}
  104 + >
  105 + {uploading ? '上传中' : '提交'}
  106 + </Button>,
  107 + ]}
  108 + onCancel={async () => {
  109 + onClose();
  110 + }}
  111 + >
  112 + <div className="py-4 font-semibold">
  113 + 导入发货信息
  114 + <Button type="link" onClick={downloadTemplate}>
  115 + 下载模板
  116 + </Button>
  117 + </div>
  118 + <Upload {...props}>
  119 + <Button icon={<UploadOutlined />} disabled={fileList.length > 0}>
  120 + 点击选择文件
  121 + </Button>
  122 + </Upload>
  123 + </Modal>
  124 + {contextHolder}
  125 + </>
  126 + );
  127 +};
... ...
src/pages/Order/components/OrderDrawer.tsx
... ... @@ -4,7 +4,11 @@ import {
4 4 postServiceOrderQueryProductInformation,
5 5 postServiceOrderUpdateOrder,
6 6 } from '@/services';
7   -import { enumToSelect, getUserInfo } from '@/utils';
  7 +import {
  8 + enumToSelect,
  9 + getAliYunOSSFileNameFromUrl,
  10 + getUserInfo,
  11 +} from '@/utils';
8 12 import {
9 13 DrawerForm,
10 14 FormListActionType,
... ... @@ -15,6 +19,7 @@ import {
15 19 ProFormSelect,
16 20 ProFormText,
17 21 ProFormTextArea,
  22 + ProFormUploadDragger,
18 23 } from '@ant-design/pro-components';
19 24 import { Form, message } from 'antd';
20 25 import { cloneDeep } from 'lodash';
... ... @@ -37,15 +42,8 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; {
37 42 function optType(type: string) {
38 43 return orderOptType === type;
39 44 }
40   - // 页码,及搜索值变化时,发请求
41   - // const fatchData = async (params:string) => {
42   - // console.log(params);
43   - // const res =
44   - // await postServiceOrderQueryProductInformation({
45   - // data: { productName: params.filter }
46   - // });
47   - // return res;
48   - // }
  45 +
  46 + const fileList: any = [];
49 47  
50 48 useEffect(() => {
51 49 // 在组件挂载或数据变化时,更新组件状态
... ... @@ -62,7 +60,22 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; {
62 60 data.paymentMethod = data.list[0].paymentMethod;
63 61 data.paymentChannel = data.list[0].paymentChannel;
64 62 data.invoicingStatus = data.list[0].invoicingStatus;
  63 +
  64 + data.list = data.list?.map((item) => {
  65 + item.filePaths = item.listAnnex?.map((path) => {
  66 + let i = 0;
  67 + return {
  68 + uid: i++,
  69 + name: getAliYunOSSFileNameFromUrl(path),
  70 + status: 'uploaded',
  71 + url: path,
  72 + response: { data: [path] },
  73 + };
  74 + });
  75 + return item;
  76 + });
65 77 }
  78 +
66 79 if (subOrders !== undefined && subOrders.length > 0) {
67 80 data.list = subOrders;
68 81 }
... ... @@ -114,7 +127,6 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; {
114 127 * @param currentRowData list中当前行的数据
115 128 */
116 129 function autoFillProductInfo(option: any, currentRowData: any) {
117   - console.log(option);
118 130 let copyList = form.getFieldValue('list');
119 131 let currentData = copyList[currentRowData.field.key];
120 132 currentData.productCode = option?.productCode;
... ... @@ -122,7 +134,6 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; {
122 134 currentData.unit = option?.unit;
123 135 form.setFieldValue('list', copyList);
124 136 }
125   -
126 137 return (
127 138 <DrawerForm<{
128 139 deleteSubOrderLists: any;
... ... @@ -137,6 +148,7 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; {
137 148 if (optType('edit') || optType('copy')) {
138 149 return data;
139 150 }
  151 + return {};
140 152 }}
141 153 resize={{
142 154 onResize() {
... ... @@ -156,6 +168,18 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; {
156 168 submitTimeout={2000}
157 169 onFinish={async (values) => {
158 170 let res = {};
  171 + //附件处理
  172 + let list = values.list;
  173 + // console.log(list);
  174 + list = list.map((item) => {
  175 + item.filePaths = item.filePaths?.map((file) => {
  176 + console.log(file);
  177 + return { url: file.response.data[0] };
  178 + });
  179 + return item;
  180 + });
  181 +
  182 + values.list = list;
159 183 if (optType('add') || optType('copy')) {
160 184 res = await postServiceOrderAddOrder({ data: values });
161 185 } else {
... ... @@ -163,11 +187,9 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; {
163 187 const originIds = originSubOrders.map((item) => {
164 188 return item.id;
165 189 });
166   - console.log('originIds:' + originIds);
167 190 const curIds = form.getFieldValue('list')?.map((item) => {
168 191 return item.id;
169 192 });
170   - console.log('curIds:' + curIds);
171 193 let diff = originIds.filter((item) => !curIds.includes(item));
172 194 values.deleteSubOrderLists = diff;
173 195 res = await postServiceOrderUpdateOrder({ data: values });
... ... @@ -269,15 +291,6 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; {
269 291 // disabled={mainInfoDisbled}
270 292 />
271 293 <ProFormSelect
272   - placeholder="请输入所属事业部"
273   - name="productBelongBusiness"
274   - width="lg"
275   - label="所属事业部"
276   - options={enumToSelect(PRODUCT_BELONG_DEPARTMENT_OPTIONS)}
277   - rules={[{ required: true, message: '所属事业部必填' }]}
278   - // disabled={mainInfoDisbled}
279   - />
280   - <ProFormSelect
281 294 placeholder="选择是否需要开票"
282 295 name="invoicingStatus"
283 296 width="lg"
... ... @@ -286,7 +299,6 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; {
286 299 // disabled={mainInfoDisbled}
287 300 onChange={(_, option) => {
288 301 setInvoicingStatus(option.value);
289   - console.log(option.value);
290 302 if (option.value === 'UN_INVOICE') {
291 303 form.setFieldValue('invoiceIdentificationNumber', undefined);
292 304 form.setFieldValue('bank', undefined);
... ... @@ -351,6 +363,7 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; {
351 363 creatorButtonProps={{ disabled: false }}
352 364 name="list"
353 365 label=""
  366 + copyIconProps={false} //复制按钮不显示
354 367 initialValue={[
355 368 {
356 369 productCode: '',
... ... @@ -362,11 +375,6 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; {
362 375 },
363 376 ]}
364 377 actionGuard={{
365   - // beforeAddRow: async () => {
366   - // return new Promise((resolve) => {
367   - // setTimeout(() => resolve(true), 1000);
368   - // });
369   - // },
370 378 beforeRemoveRow: async (index) => {
371 379 return new Promise((resolve) => {
372 380 if (index === 0) {
... ... @@ -382,6 +390,20 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; {
382 390 }}
383 391 itemRender={(doms, listMeta) => {
384 392 // const list = actionRef.current?.getList();
  393 + if (optType('edit')) {
  394 + let i = 0;
  395 + let defaultFileList = listMeta.record?.listAnnex?.map((annex) => {
  396 + return {
  397 + uid: i++,
  398 + name: annex,
  399 + status: 'uploaded',
  400 + url: annex,
  401 + response: { data: [annex] },
  402 + };
  403 + });
  404 + fileList[listMeta.index] = defaultFileList;
  405 + }
  406 + let itemFileList = fileList[listMeta.index];
385 407 return (
386 408 <ProCard
387 409 bordered
... ... @@ -392,8 +414,6 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; {
392 414 }}
393 415 >
394 416 {[
395   - // <LazySelect query={fatchData} pageSize={10}></LazySelect>
396   - // ,
397 417 <ProFormSelect
398 418 key="key"
399 419 label="商品名称"
... ... @@ -407,9 +427,6 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; {
407 427 autoFillProductInfo(option, listMeta);
408 428 }}
409 429 fieldProps={{
410   - // filterOption:false,
411   - // onSearch: searchDataset,
412   - // onPopupScroll: scrollEnd,
413 430 optionItemRender(item) {
414 431 if (item.type === 'add') {
415 432 return (
... ... @@ -460,7 +477,7 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; {
460 477 return {
461 478 ...p,
462 479 label: p.productName,
463   - value: p.productName,
  480 + value: p.id + '|' + p.productName,
464 481 key: p.id,
465 482 };
466 483 });
... ... @@ -479,6 +496,17 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; {
479 496 }}
480 497 />,
481 498 doms.listDom,
  499 + <>
  500 + <ProFormUploadDragger
  501 + label="附件"
  502 + name="filePaths"
  503 + action="/api/service/order/fileProcess"
  504 + fieldProps={{
  505 + headers: { Authorization: localStorage.getItem('token') },
  506 + itemFileList,
  507 + }}
  508 + />
  509 + </>,
482 510 ]}
483 511 </ProCard>
484 512 );
... ... @@ -535,12 +563,16 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; {
535 563 placeholder="请输入子订单金额"
536 564 rules={[{ required: true, message: '子订单金额必填' }]}
537 565 />
538   - {/* <ProFormText
  566 + <ProFormSelect
  567 + placeholder="请输入所属事业部"
  568 + name="productBelongBusiness"
539 569 width="lg"
540   - name="serialNumber"
541   - label="物流单号"
542   - placeholder="请输入物流单号"
543   - /> */}
  570 + label="所属事业部"
  571 + options={enumToSelect(PRODUCT_BELONG_DEPARTMENT_OPTIONS)}
  572 + initialValue={'EXPERIMENTAL_CONSUMABLES'}
  573 + rules={[{ required: true, message: '所属事业部必填' }]}
  574 + // disabled={mainInfoDisbled}
  575 + />
544 576 <ProFormText
545 577 width="lg"
546 578 name="notes"
... ... @@ -548,38 +580,6 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; {
548 580 placeholder="请输入备注"
549 581 />
550 582 </ProFormList>
551   -
552   - {/* <ProFormDateRangePicker name="contractTime" label="合同生效时间" /> */}
553   - {/* <ProForm.Group>
554   - <ProFormSelect
555   - options={[
556   - {
557   - value: 'chapter',
558   - label: '盖章后生效',
559   - },
560   - ]}
561   - width="xs"
562   - name="useMode"
563   - label="合同约定生效方式"
564   - />
565   - <ProFormSelect
566   - width="xs"
567   - options={[
568   - {
569   - value: 'time',
570   - label: '履行完终止',
571   - },
572   - ]}
573   - formItemProps={{
574   - style: {
575   - margin: 0,
576   - },
577   - }}
578   - name="unusedMode"
579   - label="合同约定失效效方式"
580   - />
581   - </ProForm.Group>
582   - */}
583 583 </DrawerForm>
584 584 );
585 585 };
... ...
src/pages/Order/constant.ts
1 1 import { enumToProTableEnumValue } from '@/utils';
2 2  
  3 +export const COMFIR_RECEIPT_IMAGES_NUMBER = 3;
  4 +
3 5 export const PAYMENT_CHANNEL_OPTIONS = {
4 6 ALIPAY: '支付宝',
5 7 WECHAT: '微信',
... ... @@ -33,12 +35,12 @@ export const LOGISTICS_STATUS_OPTIONS = {
33 35 };
34 36  
35 37 export const ORDER_STATUS_OPTIONS = {
36   - CONFIRM_RECEIPT: '确认收货',
37 38 UNAUDITED: '未审核',
  39 + AUDIT_FAILED: '审核失败',
38 40 AUDITED: '已审核',
39 41 WAIT_SHIP: '待发货',
40   - AUDIT_FAILED: '审核失败',
41 42 SHIPPED: '已发货',
  43 + CONFIRM_RECEIPT: '确认收货',
42 44 };
43 45  
44 46 export const TAGS_COLOR = new Map<string, string>([
... ... @@ -54,36 +56,44 @@ export const TAGS_COLOR = new Map&lt;string, string&gt;([
54 56 ]);
55 57  
56 58 export const SALES_CODE_OPTIONS = [
57   - { label: 'HQ_唐华琼', value: 'HQ_唐华琼' },
58   - { label: 'HQ-1_陆金丽', value: 'HQ-1_陆金丽' },
59   - { label: 'HQ-2_易琼', value: 'HQ-2_易琼' },
60   - { label: 'HQ-3_梁董玲', value: 'HQ-3_梁董玲' },
61   - { label: 'HQ-4_麦倩莹', value: 'HQ-4_麦倩莹' },
62   - { label: 'HQ-5_刘璐', value: 'HQ-5_刘璐' },
63   - { label: 'HQ-6_李云', value: 'HQ-6_李云' },
64   - { label: 'HQ-7_陈方', value: 'HQ-7_陈方' },
65   - { label: 'HQ-8_袁友辉', value: 'HQ-8_袁友辉' },
66   - { label: 'TB_储能淘宝店铺', value: 'TB_储能淘宝店铺' },
  59 + { label: 'HQ_Linda', value: 'HQ_Linda' },
  60 + { label: 'HQ-1_Rita', value: 'HQ-1_Rita' },
  61 + { label: 'HQ-2_Lisa', value: 'HQ-2_Lisa' },
  62 + { label: 'HQ-3_iris', value: 'HQ-3_iris' },
  63 + { label: 'HQ-4_Lynn', value: 'HQ-4_Lynn' },
  64 + { label: 'HQ-5_Jessica', value: 'HQ-5_Jessica' },
  65 + { label: 'HQ-6_smile', value: 'HQ-6_smile' },
  66 + { label: 'HQ-7_Yvonne', value: 'HQ-7_Yvonne' },
  67 + { label: 'HQ-8_Daniel', value: 'HQ-8_Daniel' },
  68 + { label: 'W_strong', value: 'W_strong' },
67 69 { label: 'W-1_Alice', value: 'W-1_Alice' },
68   - { label: 'W-4_龙青', value: 'W-4_龙青' },
69   - { label: 'HCTB_耗材淘宝店铺', value: 'HCTB_耗材淘宝店铺' },
70   - { label: 'TBC_电池品牌店', value: 'TBC_电池品牌店' },
71   - { label: 'W-3_田菁菁', value: 'W-3_田菁菁' },
72   - { label: 'W-2_黄宁', value: 'W-2_黄宁' },
73   - { label: 'W_宋学文', value: 'W_宋学文' },
74   - { label: 'W-5_黎艳', value: 'W-5_黎艳' },
75   - { label: 'W-6_黄丹', value: 'W-6_黄丹' },
76   - { label: 'W-7_黄花梅', value: 'W-7_黄花梅' },
  70 + { label: 'W-2_Demi', value: 'W-2_Demi' },
  71 + { label: 'W-3_Nico', value: 'W-3_Nico' },
  72 + { label: 'W-4_kk', value: 'W-4_kk' },
  73 + { label: 'W-5_Alma', value: 'W-5_Alma' },
  74 + { label: 'W-6_Dream', value: 'W-6_Dream' },
  75 + { label: 'W-7_Aimee', value: 'W-7_Aimee' },
77 76 { label: 'XX_Tina', value: 'XX_Tina' },
78   - { label: 'XX-P_校平台共用代码', value: 'XX-P_校平台共用代码' },
79 77 { label: 'XX-2_Vivi', value: 'XX-2_Vivi' },
80   - { label: 'XX-N1_Nancy', value: 'XX-N1_Nancy' },
81   - { label: 'XX-N2_Sara', value: 'XX-N2_Sara' },
82 78 { label: 'XX-A1_Ada', value: 'XX-A1_Ada' },
83 79 { label: 'XX-A2_Amy', value: 'XX-A2_Amy' },
  80 + { label: 'XX-N1_Nancy', value: 'XX-N1_Nancy' },
  81 + { label: 'XX-N2_Sara', value: 'XX-N2_Sara' },
84 82 { label: 'XX-C_CC', value: 'XX-C_CC' },
85 83 { label: 'XX-L1_Lucy', value: 'XX-L1_Lucy' },
86 84 { label: 'XX-L2_Lulu', value: 'XX-L2_Lulu' },
  85 + { label: 'XX-P', value: 'XX-P' },
  86 + { label: 'TB', value: 'TB' },
  87 + { label: 'HCTB', value: 'HCTB' },
  88 + { label: 'TBC', value: 'TBC' },
  89 + { label: 'GW-3_iris', value: 'GW-3_iris' },
  90 + { label: 'GW-4_Lynn', value: 'GW-4_Lynn' },
  91 + { label: 'GW-6_smile', value: 'GW-6_smile' },
  92 + { label: 'GW-7_Yvonne', value: 'GW-7_Yvonne' },
  93 + { label: 'W-9_Jack', value: 'W-9_Jack' },
  94 + { label: 'W-8_Andy', value: 'W-8_Andy' },
  95 + { label: 'CQ_Peter', value: 'CQ_Peter' },
  96 + { label: 'MA_A_Mao', value: 'MA_A_Mao' },
87 97 ];
88 98  
89 99 export const MAIN_ORDER_COLUMNS = [
... ... @@ -254,6 +264,12 @@ export const SUB_ORDER_COLUMNS = [
254 264 width: 80,
255 265 },
256 266 {
  267 + title: '所属事业部',
  268 + dataIndex: 'productBelongBusiness',
  269 + key: 'productBelongBusiness',
  270 + width: 80,
  271 + },
  272 + {
257 273 title: '支付方式',
258 274 dataIndex: 'paymentMethod',
259 275 key: 'paymentMethod',
... ...
src/pages/Order/index.tsx
... ... @@ -6,7 +6,11 @@ import {
6 6 } from '@/services';
7 7 import { orderExport } from '@/services/order';
8 8 import { enumValueToLabel, formatDateTime } from '@/utils';
9   -import { DownOutlined, EllipsisOutlined } from '@ant-design/icons';
  9 +import {
  10 + DownOutlined,
  11 + EllipsisOutlined,
  12 + QuestionCircleOutlined,
  13 +} from '@ant-design/icons';
10 14 import {
11 15 PageContainer,
12 16 ProColumns,
... ... @@ -21,17 +25,21 @@ import {
21 25 Dropdown,
22 26 Flex,
23 27 MenuProps,
  28 + Modal,
24 29 Space,
25 30 Tag,
  31 + Tooltip,
26 32 message,
27 33 } from 'antd';
28 34 import { cloneDeep } from 'lodash';
29 35 import { Key, useEffect, useRef, useState } from 'react';
30 36 import OrderPrintModal from '../OrderPrint/OrderPrintModal';
  37 +import AttachmentModal from './components/AttachmentModal';
31 38 import CheckModal from './components/CheckModal';
32 39 import ConfirmReceiptModal from './components/ConfirmReceiptModal';
33 40 import DeliverModal from './components/DeliverModal';
34 41 import FinancialDrawer from './components/FinancialDrawer';
  42 +import ImportModal from './components/ImportModal';
35 43 import OrderDrawer from './components/OrderDrawer';
36 44 import OrderNotesEditModal from './components/OrderNotesEditModal';
37 45 import SubOrderComfirmReceiptImagesModal from './components/SubOrderComfirmReceiptImagesModal';
... ... @@ -42,6 +50,7 @@ import {
42 50 ORDER_STATUS_OPTIONS,
43 51 PAYMENT_CHANNEL_OPTIONS,
44 52 PAYMENT_METHOD_OPTIONS,
  53 + PRODUCT_BELONG_DEPARTMENT_OPTIONS,
45 54 SUB_ORDER_COLUMNS,
46 55 TAGS_COLOR,
47 56 } from './constant';
... ... @@ -57,10 +66,13 @@ const OrderPage = () =&gt; {
57 66 setSubOrderConfirmReceiptImagesVisible,
58 67 ] = useState<boolean>(false);
59 68 const [notesEditVisible, setNotesEditVisible] = useState<boolean>(false);
  69 + const [attachmentModalVisible, setAttachmentModalVisible] =
  70 + useState<boolean>(false);
60 71 const [financialVisible, setFinancialVisible] = useState<boolean>(false);
61 72 const [isRePrintOrder, setIsRePrintOrder] = useState<boolean>(false);
62 73 const [isSendProduct, setIsSendProduct] = useState<boolean>(false);
63 74 const [isMainOrder, setIsMainOrder] = useState<boolean>(false);
  75 + const [importModalVisible, setImportModalVisible] = useState<boolean>(false);
64 76 const [confirmReceiptVisible, setConfirmReceiptVisible] =
65 77 useState<boolean>(false);
66 78 const [deliverVisible, setDeliverVisible] = useState<boolean>(false);
... ... @@ -76,9 +88,23 @@ const OrderPage = () =&gt; {
76 88 const [selectedRowObj, setSelectedRowObj] = useState({});
77 89 const [selectedItems, setSelectedItems] = useState([]);
78 90 const [selectedRowKeys, setSelectedRowKeys] = useState([]);
  91 + const [pageSize, setPageSize] = useState(10);
  92 + const [currentPage, setCurrentPage] = useState(1);
79 93 const mainTableRef = useRef();
80 94 const [messageApi, contextHolder] = message.useMessage();
81 95  
  96 + const openCheckNotes = (checkNotes: string) => {
  97 + Modal.info({
  98 + title: '驳回备注',
  99 + content: (
  100 + <div>
  101 + <p>{checkNotes}</p>
  102 + </div>
  103 + ),
  104 + onOk() {},
  105 + });
  106 + };
  107 +
82 108 const exportLoading = () => {
83 109 messageApi.open({
84 110 type: 'loading',
... ... @@ -506,6 +532,23 @@ const OrderPage = () =&gt; {
506 532 label = '已开票';
507 533 newText = 'AFTER_INVOICED';
508 534 }
  535 + //审核失败点击标签可以弹出驳回备注信息
  536 + if (text === 'AUDIT_FAILED') {
  537 + return (
  538 + <Tooltip placement="top" title="点击查看备注">
  539 + <Tag
  540 + color={TAGS_COLOR.get(newText)}
  541 + className="mr-1 cursor-pointer"
  542 + onClick={() => {
  543 + openCheckNotes(optRecord.checkNotes);
  544 + }}
  545 + >
  546 + {label}
  547 + </Tag>
  548 + <QuestionCircleOutlined />
  549 + </Tooltip>
  550 + );
  551 + }
509 552 return <Tag color={TAGS_COLOR.get(newText)}>{label}</Tag>;
510 553 },
511 554 };
... ... @@ -513,7 +556,8 @@ const OrderPage = () =&gt; {
513 556 //枚举字段处理
514 557 item.key === 'paymentMethod' ||
515 558 item.key === 'paymentChannel' ||
516   - item.key === 'logisticsMethod'
  559 + item.key === 'logisticsMethod' ||
  560 + item.key === 'productBelongBusiness'
517 561 ) {
518 562 return {
519 563 ...item,
... ... @@ -525,6 +569,12 @@ const OrderPage = () =&gt; {
525 569 if (label === undefined) {
526 570 label = enumValueToLabel(text, LOGISTICS_STATUS_OPTIONS);
527 571 }
  572 + if (label === undefined) {
  573 + label = enumValueToLabel(
  574 + text,
  575 + PRODUCT_BELONG_DEPARTMENT_OPTIONS,
  576 + );
  577 + }
528 578 return label;
529 579 },
530 580 };
... ... @@ -564,6 +614,22 @@ const OrderPage = () =&gt; {
564 614 ''
565 615 )}
566 616  
  617 + {optRecord.subPath.includes('queryAnnex') ? (
  618 + <Button
  619 + className="p-0"
  620 + type="link"
  621 + onClick={() => {
  622 + optRecord.mainOrderId = record.id;
  623 + setAttachmentModalVisible(true);
  624 + setOrderRow(optRecord);
  625 + }}
  626 + >
  627 + 附件
  628 + </Button>
  629 + ) : (
  630 + ''
  631 + )}
  632 +
567 633 {optRecord.subPath.includes('modifySendInformation') ? (
568 634 <Button
569 635 className="p-0"
... ... @@ -753,7 +819,7 @@ const OrderPage = () =&gt; {
753 819 }
754 820 let body = { flag: true, ids: selectedItems };
755 821 exportLoading();
756   - orderExport(body, exportLoadingDestory);
  822 + orderExport('/api/service/order/export', body, exportLoadingDestory);
757 823 },
758 824 },
759 825 {
... ... @@ -766,7 +832,7 @@ const OrderPage = () =&gt; {
766 832 }
767 833 let body = { flag: true, ids: mainOrderAllItemKeys };
768 834 exportLoading();
769   - orderExport(body, exportLoadingDestory);
  835 + orderExport('/api/service/order/export', body, exportLoadingDestory);
770 836 },
771 837 },
772 838 {
... ... @@ -775,7 +841,7 @@ const OrderPage = () =&gt; {
775 841 onClick: async () => {
776 842 let body = { flag: false, ids: [] };
777 843 exportLoading();
778   - orderExport(body, exportLoadingDestory);
  844 + orderExport('/api/service/order/export', body, exportLoadingDestory);
779 845 },
780 846 },
781 847 ];
... ... @@ -799,6 +865,19 @@ const OrderPage = () =&gt; {
799 865 </Button>,
800 866 );
801 867 }
  868 + if (rolePath?.includes('importExcel')) {
  869 + toolBtns.push(
  870 + <Button
  871 + type="primary"
  872 + key="out"
  873 + onClick={() => {
  874 + setImportModalVisible(true);
  875 + }}
  876 + >
  877 + 导入
  878 + </Button>,
  879 + );
  880 + }
802 881  
803 882 toolBtns.push(
804 883 <Dropdown menu={menuProps}>
... ... @@ -874,7 +953,13 @@ const OrderPage = () =&gt; {
874 953 rowKey="id"
875 954 pagination={{
876 955 showQuickJumper: true,
877   - pageSize: 10,
  956 + pageSize: pageSize,
  957 + current: currentPage,
  958 + showSizeChanger: true,
  959 + onChange: (page, size) => {
  960 + setPageSize(size);
  961 + setCurrentPage(page);
  962 + },
878 963 }}
879 964 expandedRowKeys={expandedRowKeys}
880 965 expandable={{ expandedRowRender }}
... ... @@ -1021,6 +1106,25 @@ const OrderPage = () =&gt; {
1021 1106 />
1022 1107 )}
1023 1108  
  1109 + {importModalVisible && (
  1110 + <ImportModal
  1111 + onClose={() => {
  1112 + setImportModalVisible(false);
  1113 + refreshTable();
  1114 + }}
  1115 + />
  1116 + )}
  1117 +
  1118 + {attachmentModalVisible && (
  1119 + <AttachmentModal
  1120 + data={orderRow}
  1121 + onClose={() => {
  1122 + setAttachmentModalVisible(false);
  1123 + setOrderRow({});
  1124 + }}
  1125 + />
  1126 + )}
  1127 +
1024 1128 {contextHolder}
1025 1129 </PageContainer>
1026 1130 );
... ...
src/pages/OrderPrint/OrderPrintModal.tsx
... ... @@ -5,6 +5,7 @@ import { ExclamationCircleFilled } from &#39;@ant-design/icons&#39;;
5 5 import { Modal, Select, Space, message } from 'antd';
6 6 import printJS from 'print-js';
7 7 import { useState } from 'react';
  8 +import { printerCSS } from './PrinterCSS';
8 9 import DalangPrinter from './components/DalangPrinter';
9 10 import HoujiePrinter from './components/HoujiePrinter';
10 11 import ZhuguangPrinter from './components/ZhuguangPrinter';
... ... @@ -54,14 +55,11 @@ export default ({ mainOrder, subOrders, isRePrint, onClose }) =&gt; {
54 55 //printJS打印出货单
55 56 printJS({
56 57 printable: 'printArea', // 元素id,不支持多个
57   - scanStyles: true,
  58 + scanStyles: false,
58 59 type: 'html',
59 60 targetStyle: ['* '],
60 61 targetStyles: ['*'],
61   - style:
62   - '@page{size:auto;margin: 0mm;}' +
63   - '@media print { body{margin:0 auto;padding:0;#title{font-size:24px}}' +
64   - 'body{zoom:1.6;margin:0;', // landscape 默认横向打印
  62 + style: printerCSS(),
65 63 onPrintDialogClose: () => {
66 64 showPropsConfirm();
67 65 },
... ...
src/pages/OrderPrint/PrinterCSS.tsx 0 → 100644
  1 +export function printerCSS2() {
  2 + return `
  3 + .x165{
  4 + font-size:13.5pt
  5 + }
  6 + `;
  7 +}
  8 +
  9 +export function printerCSS() {
  10 + return `
  11 + body{
  12 + zoom:1.5
  13 + }
  14 + tr {
  15 + // mso-height-source: auto;
  16 + // mso-ruby-visibility: none;
  17 + }
  18 +
  19 + col {
  20 + // mso-width-source: auto;
  21 + // mso-ruby-visibility: none;
  22 + }
  23 +
  24 + br {
  25 + // mso-data-placement: same-cell;
  26 + }
  27 +
  28 + .font0 {
  29 + color: windowtext;
  30 + font-size: 12px;
  31 + font-weight: 400;
  32 + font-style: normal;
  33 + text-decoration: none;
  34 + font-family: "微软雅黑", sans-serif;
  35 + // //mso-generic-font-family: auto;
  36 + // //mso-font-charset: 134;
  37 + }
  38 +
  39 + .font1 {
  40 + color: windowtext;
  41 + font-size: 16px;
  42 + font-weight: 400;
  43 + font-style: normal;
  44 + text-decoration: none;
  45 + font-family: "微软雅黑", sans-serif;
  46 + // //mso-generic-font-family: auto;
  47 + // mso-font-charset: 134;
  48 + }
  49 +
  50 + .font2 {
  51 + color: windowtext;
  52 + font-size: 10px;
  53 + font-weight: 400;
  54 + font-style: normal;
  55 + text-decoration: none;
  56 + font-family: "微软雅黑", sans-serif;
  57 + ////mso-generic-font-family: auto;
  58 + //mso-font-charset: 134;
  59 + }
  60 +
  61 + .font3 {
  62 + color: windowtext;
  63 + font-size: 10.5pt;
  64 + font-weight: 400;
  65 + font-style: normal;
  66 + text-decoration: none;
  67 + font-family: "微软雅黑", sans-serif;
  68 + ////mso-generic-font-family: auto;
  69 + //mso-font-charset: 134;
  70 + }
  71 +
  72 + .font4 {
  73 + color: windowtext;
  74 + font-size: 8px;
  75 + font-weight: 400;
  76 + font-style: normal;
  77 + text-decoration: none;
  78 + font-family: "微软雅黑", sans-serif;
  79 + ////mso-generic-font-family: auto;
  80 + //mso-font-charset: 134;
  81 + }
  82 +
  83 + .font5 {
  84 + color: #00f;
  85 + font-size: 11px;
  86 + font-weight: 400;
  87 + font-style: normal;
  88 + text-decoration: underline;
  89 + //text-underline-style: single;
  90 + font-family: "微软雅黑", sans-serif;
  91 + ////mso-generic-font-family: auto;
  92 + //mso-font-charset: 134;
  93 + }
  94 +
  95 + .font6 {
  96 + color: #800080;
  97 + font-size: 11px;
  98 + font-weight: 400;
  99 + font-style: normal;
  100 + text-decoration: underline;
  101 + //text-underline-style: single;
  102 + font-family: "微软雅黑", sans-serif;
  103 + ////mso-generic-font-family: auto;
  104 + //mso-font-charset: 134;
  105 + }
  106 +
  107 + .font7 {
  108 + color: #000;
  109 + font-size: 11px;
  110 + font-weight: 400;
  111 + font-style: normal;
  112 + text-decoration: none;
  113 + font-family: "微软雅黑", sans-serif;
  114 + ////mso-generic-font-family: auto;
  115 + //mso-font-charset: 134;
  116 + }
  117 +
  118 + .font8 {
  119 + color: #f00;
  120 + font-size: 11px;
  121 + font-weight: 400;
  122 + font-style: normal;
  123 + text-decoration: none;
  124 + font-family: "微软雅黑", sans-serif;
  125 + ////mso-generic-font-family: auto;
  126 + //mso-font-charset: 134;
  127 + }
  128 +
  129 + .font9 {
  130 + color: #44546a;
  131 + font-size: 13.5pt;
  132 + font-weight: 700;
  133 + font-style: normal;
  134 + text-decoration: none;
  135 + font-family: "微软雅黑", sans-serif;
  136 + ////mso-generic-font-family: auto;
  137 + //mso-font-charset: 134;
  138 + }
  139 +
  140 + .font10 {
  141 + color: #7f7f7f;
  142 + font-size: 11px;
  143 + font-weight: 400;
  144 + font-style: italic;
  145 + text-decoration: none;
  146 + font-family: "微软雅黑", sans-serif;
  147 + ////mso-generic-font-family: auto;
  148 + //mso-font-charset: 134;
  149 + }
  150 +
  151 + .font11 {
  152 + color: #44546a;
  153 + font-size: 15px;
  154 + font-weight: 700;
  155 + font-style: normal;
  156 + text-decoration: none;
  157 + font-family: "微软雅黑", sans-serif;
  158 + ////mso-generic-font-family: auto;
  159 + //mso-font-charset: 134;
  160 + }
  161 +
  162 + .font12 {
  163 + color: #44546a;
  164 + font-size: 13px;
  165 + font-weight: 700;
  166 + font-style: normal;
  167 + text-decoration: none;
  168 + font-family: "微软雅黑", sans-serif;
  169 + ////mso-generic-font-family: auto;
  170 + //mso-font-charset: 134;
  171 + }
  172 +
  173 + .font13 {
  174 + color: #44546a;
  175 + font-size: 11px;
  176 + font-weight: 700;
  177 + font-style: normal;
  178 + text-decoration: none;
  179 + font-family: "微软雅黑", sans-serif;
  180 + ////mso-generic-font-family: auto;
  181 + //mso-font-charset: 134;
  182 + }
  183 +
  184 + .font14 {
  185 + color: #3f3f76;
  186 + font-size: 11px;
  187 + font-weight: 400;
  188 + font-style: normal;
  189 + text-decoration: none;
  190 + font-family: "微软雅黑", sans-serif;
  191 + ////mso-generic-font-family: auto;
  192 + //mso-font-charset: 134;
  193 + }
  194 +
  195 + .font15 {
  196 + color: #3f3f3f;
  197 + font-size: 11px;
  198 + font-weight: 700;
  199 + font-style: normal;
  200 + text-decoration: none;
  201 + font-family: "微软雅黑", sans-serif;
  202 + ////mso-generic-font-family: auto;
  203 + //mso-font-charset: 134;
  204 + }
  205 +
  206 + .font16 {
  207 + color: #fa7d00;
  208 + font-size: 11px;
  209 + font-weight: 700;
  210 + font-style: normal;
  211 + text-decoration: none;
  212 + font-family: "微软雅黑", sans-serif;
  213 + ////mso-generic-font-family: auto;
  214 + //mso-font-charset: 134;
  215 + }
  216 +
  217 + .font17 {
  218 + color: #fff;
  219 + font-size: 11px;
  220 + font-weight: 700;
  221 + font-style: normal;
  222 + text-decoration: none;
  223 + font-family: "微软雅黑", sans-serif;
  224 + ////mso-generic-font-family: auto;
  225 + //mso-font-charset: 134;
  226 + }
  227 +
  228 + .font18 {
  229 + color: #fa7d00;
  230 + font-size: 11px;
  231 + font-weight: 400;
  232 + font-style: normal;
  233 + text-decoration: none;
  234 + font-family: "微软雅黑", sans-serif;
  235 + ////mso-generic-font-family: auto;
  236 + //mso-font-charset: 134;
  237 + }
  238 +
  239 + .font19 {
  240 + color: #000;
  241 + font-size: 11px;
  242 + font-weight: 700;
  243 + font-style: normal;
  244 + text-decoration: none;
  245 + font-family: "微软雅黑", sans-serif;
  246 + ////mso-generic-font-family: auto;
  247 + //mso-font-charset: 134;
  248 + }
  249 +
  250 + .font20 {
  251 + color: #006100;
  252 + font-size: 11px;
  253 + font-weight: 400;
  254 + font-style: normal;
  255 + text-decoration: none;
  256 + font-family: "微软雅黑", sans-serif;
  257 + ////mso-generic-font-family: auto;
  258 + //mso-font-charset: 134;
  259 + }
  260 +
  261 + .font21 {
  262 + color: #9c0006;
  263 + font-size: 11px;
  264 + font-weight: 400;
  265 + font-style: normal;
  266 + text-decoration: none;
  267 + font-family: "微软雅黑", sans-serif;
  268 + ////mso-generic-font-family: auto;
  269 + //mso-font-charset: 134;
  270 + }
  271 +
  272 + .font22 {
  273 + color: #9c6500;
  274 + font-size: 11px;
  275 + font-weight: 400;
  276 + font-style: normal;
  277 + text-decoration: none;
  278 + font-family: "微软雅黑", sans-serif;
  279 + ////mso-generic-font-family: auto;
  280 + //mso-font-charset: 134;
  281 + }
  282 +
  283 + .font23 {
  284 + color: #fff;
  285 + font-size: 11px;
  286 + font-weight: 400;
  287 + font-style: normal;
  288 + text-decoration: none;
  289 + font-family: "微软雅黑", sans-serif;
  290 + ////mso-generic-font-family: auto;
  291 + //mso-font-charset: 134;
  292 + }
  293 +
  294 + .font24 {
  295 + color: #000;
  296 + font-size: 11px;
  297 + font-weight: 400;
  298 + font-style: normal;
  299 + text-decoration: none;
  300 + font-family: "微软雅黑", sans-serif;
  301 + ////mso-generic-font-family: auto;
  302 + //mso-font-charset: 134;
  303 + }
  304 +
  305 + .style0 {
  306 + //mso-number-format: "General";
  307 + text-align: general;
  308 + vertical-align: middle;
  309 + white-space: nowrap;
  310 + // mso-rotate: 0;
  311 + // //mso-pattern: auto;
  312 + // mso-background-source: auto;
  313 + color: windowtext;
  314 + font-size: 12px;
  315 + font-weight: 400;
  316 + font-style: normal;
  317 + text-decoration: none;
  318 + font-family: "微软雅黑", sans-serif;
  319 + ////mso-generic-font-family: auto;
  320 + //mso-font-charset: 134;
  321 + border: none;
  322 + //mso-protection: locked visible;
  323 + // mso-style-name: "常规";
  324 + // mso-style-id: 0;
  325 + }
  326 +
  327 +
  328 + .style18 {
  329 + // mso-number-format: "0%";
  330 + // mso-style-name: "百分比";
  331 + // mso-style-id: 5;
  332 + }
  333 + .style21 {
  334 + color: #00f;
  335 + font-size: 11px;
  336 + font-weight: 400;
  337 + font-style: normal;
  338 + text-decoration: underline;
  339 + //text-underline-style: single;
  340 + font-family: "微软雅黑", sans-serif;
  341 + ////mso-generic-font-family: auto;
  342 + //mso-font-charset: 134;
  343 + // mso-style-name: "超链接";
  344 + // mso-style-id: 8;
  345 + }
  346 +
  347 + .style22 {
  348 + color: #800080;
  349 + font-size: 11px;
  350 + font-weight: 400;
  351 + font-style: normal;
  352 + text-decoration: underline;
  353 + //text-underline-style: single;
  354 + font-family: "微软雅黑", sans-serif;
  355 + ////mso-generic-font-family: auto;
  356 + //mso-font-charset: 134;
  357 + // mso-style-name: "已访问的超链接";
  358 + // mso-style-id: 9;
  359 + }
  360 +
  361 + .style23 {
  362 + // //mso-pattern: auto none;
  363 + background: #ffc;
  364 + border: 0.5px solid #b2b2b2;
  365 + // mso-style-name: "注释";
  366 + }
  367 +
  368 + .style24 {
  369 + color: #f00;
  370 + font-size: 11px;
  371 + font-weight: 400;
  372 + font-style: normal;
  373 + text-decoration: none;
  374 + font-family: "微软雅黑", sans-serif;
  375 + ////mso-generic-font-family: auto;
  376 + //mso-font-charset: 134;
  377 + // mso-style-name: "警告文本";
  378 + }
  379 +
  380 + .style25 {
  381 + color: #44546a;
  382 + font-size: 13.5pt;
  383 + font-weight: 700;
  384 + font-style: normal;
  385 + text-decoration: none;
  386 + font-family: "微软雅黑", sans-serif;
  387 + ////mso-generic-font-family: auto;
  388 + //mso-font-charset: 134;
  389 + // mso-style-name: "标题";
  390 + }
  391 +
  392 + .style26 {
  393 + color: #7f7f7f;
  394 + font-size: 11px;
  395 + font-weight: 400;
  396 + font-style: italic;
  397 + text-decoration: none;
  398 + font-family: "微软雅黑", sans-serif;
  399 + ////mso-generic-font-family: auto;
  400 + //mso-font-charset: 134;
  401 + // mso-style-name: "解释性文本";
  402 + }
  403 +
  404 + .style27 {
  405 + color: #44546a;
  406 + font-size: 15px;
  407 + font-weight: 700;
  408 + font-style: normal;
  409 + text-decoration: none;
  410 + font-family: "微软雅黑", sans-serif;
  411 + ////mso-generic-font-family: auto;
  412 + //mso-font-charset: 134;
  413 + border-bottom: 1px solid #5b9bd5;
  414 + // mso-style-name: "标题 1";
  415 + }
  416 +
  417 + .style28 {
  418 + color: #44546a;
  419 + font-size: 13px;
  420 + font-weight: 700;
  421 + font-style: normal;
  422 + text-decoration: none;
  423 + font-family: "微软雅黑", sans-serif;
  424 + ////mso-generic-font-family: auto;
  425 + //mso-font-charset: 134;
  426 + border-bottom: 1px solid #5b9bd5;
  427 + // mso-style-name: "标题 2";
  428 + }
  429 +
  430 + .style29 {
  431 + color: #44546a;
  432 + font-size: 11px;
  433 + font-weight: 700;
  434 + font-style: normal;
  435 + text-decoration: none;
  436 + font-family: "微软雅黑", sans-serif;
  437 + ////mso-generic-font-family: auto;
  438 + //mso-font-charset: 134;
  439 + border-bottom: 1px solid #acccea;
  440 + //mso-style-name: "标题 3";
  441 + }
  442 +
  443 + .style30 {
  444 + color: #44546a;
  445 + font-size: 11px;
  446 + font-weight: 700;
  447 + font-style: normal;
  448 + text-decoration: none;
  449 + font-family: "微软雅黑", sans-serif;
  450 + ////mso-generic-font-family: auto;
  451 + //mso-font-charset: 134;
  452 + //mso-style-name: "标题 4";
  453 + }
  454 +
  455 + .style31 {
  456 + ////mso-pattern: auto none;
  457 + background: #fc9;
  458 + color: #3f3f76;
  459 + font-size: 11px;
  460 + font-weight: 400;
  461 + font-style: normal;
  462 + text-decoration: none;
  463 + font-family: "微软雅黑", sans-serif;
  464 + ////mso-generic-font-family: auto;
  465 + //mso-font-charset: 134;
  466 + border: 0.5px solid #7f7f7f;
  467 + //mso-style-name: "输入";
  468 + }
  469 +
  470 + .style32 {
  471 + ////mso-pattern: auto none;
  472 + background: #f2f2f2;
  473 + color: #3f3f3f;
  474 + font-size: 11px;
  475 + font-weight: 700;
  476 + font-style: normal;
  477 + text-decoration: none;
  478 + font-family: "微软雅黑", sans-serif;
  479 + ////mso-generic-font-family: auto;
  480 + //mso-font-charset: 134;
  481 + border: 0.5px solid #3f3f3f;
  482 + //mso-style-name: "输出";
  483 + }
  484 +
  485 + .style33 {
  486 + ////mso-pattern: auto none;
  487 + background: #f2f2f2;
  488 + color: #fa7d00;
  489 + font-size: 11px;
  490 + font-weight: 700;
  491 + font-style: normal;
  492 + text-decoration: none;
  493 + font-family: "微软雅黑", sans-serif;
  494 + ////mso-generic-font-family: auto;
  495 + //mso-font-charset: 134;
  496 + border: 0.5px solid #7f7f7f;
  497 + //mso-style-name: "计算";
  498 + }
  499 +
  500 + .style34 {
  501 + ////mso-pattern: auto none;
  502 + background: #a5a5a5;
  503 + color: #fff;
  504 + font-size: 11px;
  505 + font-weight: 700;
  506 + font-style: normal;
  507 + text-decoration: none;
  508 + font-family: "微软雅黑", sans-serif;
  509 + ////mso-generic-font-family: auto;
  510 + //mso-font-charset: 134;
  511 + border: 2px double #3f3f3f;
  512 + //mso-style-name: "检查单元格";
  513 + }
  514 +
  515 + .style35 {
  516 + color: #fa7d00;
  517 + font-size: 11px;
  518 + font-weight: 400;
  519 + font-style: normal;
  520 + text-decoration: none;
  521 + font-family: "微软雅黑", sans-serif;
  522 + ////mso-generic-font-family: auto;
  523 + //mso-font-charset: 134;
  524 + border-bottom: 2px double #ff8001;
  525 + //mso-style-name: "链接单元格";
  526 + }
  527 +
  528 + .style36 {
  529 + color: #000;
  530 + font-size: 11px;
  531 + font-weight: 700;
  532 + font-style: normal;
  533 + text-decoration: none;
  534 + font-family: "微软雅黑", sans-serif;
  535 + ////mso-generic-font-family: auto;
  536 + //mso-font-charset: 134;
  537 + border-top: 0.5px solid #5b9bd5;
  538 + border-bottom: 2px double #5b9bd5;
  539 + //mso-style-name: "汇总";
  540 + }
  541 +
  542 + .style37 {
  543 + ////mso-pattern: auto none;
  544 + background: #c6efce;
  545 + color: #006100;
  546 + font-size: 11px;
  547 + font-weight: 400;
  548 + font-style: normal;
  549 + text-decoration: none;
  550 + font-family: "微软雅黑", sans-serif;
  551 + ////mso-generic-font-family: auto;
  552 + //mso-font-charset: 134;
  553 + //mso-style-name: "好";
  554 + }
  555 +
  556 + .style38 {
  557 + ////mso-pattern: auto none;
  558 + background: #ffc7ce;
  559 + color: #9c0006;
  560 + font-size: 11px;
  561 + font-weight: 400;
  562 + font-style: normal;
  563 + text-decoration: none;
  564 + font-family: "微软雅黑", sans-serif;
  565 + ////mso-generic-font-family: auto;
  566 + //mso-font-charset: 134;
  567 + //mso-style-name: "差";
  568 + }
  569 +
  570 + .style39 {
  571 + ////mso-pattern: auto none;
  572 + background: #ffeb9c;
  573 + color: #9c6500;
  574 + font-size: 11px;
  575 + font-weight: 400;
  576 + font-style: normal;
  577 + text-decoration: none;
  578 + font-family: "微软雅黑", sans-serif;
  579 + ////mso-generic-font-family: auto;
  580 + //mso-font-charset: 134;
  581 + //mso-style-name: "适中";
  582 + }
  583 +
  584 + .style40 {
  585 + ////mso-pattern: auto none;
  586 + background: #5b9bd5;
  587 + color: #fff;
  588 + font-size: 11px;
  589 + font-weight: 400;
  590 + font-style: normal;
  591 + text-decoration: none;
  592 + font-family: "微软雅黑", sans-serif;
  593 + ////mso-generic-font-family: auto;
  594 + //mso-font-charset: 134;
  595 + //mso-style-name: "强调文字颜色 1";
  596 + }
  597 +
  598 + .style41 {
  599 + ////mso-pattern: auto none;
  600 + background: #ddebf7;
  601 + color: #000;
  602 + font-size: 11px;
  603 + font-weight: 400;
  604 + font-style: normal;
  605 + text-decoration: none;
  606 + font-family: "微软雅黑", sans-serif;
  607 + ////mso-generic-font-family: auto;
  608 + //mso-font-charset: 134;
  609 + //mso-style-name: "20% - 强调文字颜色 1";
  610 + }
  611 +
  612 + .style42 {
  613 + ////mso-pattern: auto none;
  614 + background: #bdd7ee;
  615 + color: #000;
  616 + font-size: 11px;
  617 + font-weight: 400;
  618 + font-style: normal;
  619 + text-decoration: none;
  620 + font-family: "微软雅黑", sans-serif;
  621 + ////mso-generic-font-family: auto;
  622 + //mso-font-charset: 134;
  623 + //mso-style-name: "40% - 强调文字颜色 1";
  624 + }
  625 +
  626 + .style43 {
  627 + ////mso-pattern: auto none;
  628 + background: #9bc2e6;
  629 + color: #fff;
  630 + font-size: 11px;
  631 + font-weight: 400;
  632 + font-style: normal;
  633 + text-decoration: none;
  634 + font-family: "微软雅黑", sans-serif;
  635 + ////mso-generic-font-family: auto;
  636 + //mso-font-charset: 134;
  637 + //mso-style-name: "60% - 强调文字颜色 1";
  638 + }
  639 +
  640 + .style44 {
  641 + ////mso-pattern: auto none;
  642 + background: #ed7d31;
  643 + color: #fff;
  644 + font-size: 11px;
  645 + font-weight: 400;
  646 + font-style: normal;
  647 + text-decoration: none;
  648 + font-family: "微软雅黑", sans-serif;
  649 + ////mso-generic-font-family: auto;
  650 + //mso-font-charset: 134;
  651 + //mso-style-name: "强调文字颜色 2";
  652 + }
  653 +
  654 + .style45 {
  655 + ////mso-pattern: auto none;
  656 + background: #fce4d6;
  657 + color: #000;
  658 + font-size: 11px;
  659 + font-weight: 400;
  660 + font-style: normal;
  661 + text-decoration: none;
  662 + font-family: "微软雅黑", sans-serif;
  663 + ////mso-generic-font-family: auto;
  664 + //mso-font-charset: 134;
  665 + //mso-style-name: "20% - 强调文字颜色 2";
  666 + }
  667 +
  668 + .style46 {
  669 + ////mso-pattern: auto none;
  670 + background: #f8cbad;
  671 + color: #000;
  672 + font-size: 11px;
  673 + font-weight: 400;
  674 + font-style: normal;
  675 + text-decoration: none;
  676 + font-family: "微软雅黑", sans-serif;
  677 + ////mso-generic-font-family: auto;
  678 + //mso-font-charset: 134;
  679 + //mso-style-name: "40% - 强调文字颜色 2";
  680 + }
  681 +
  682 + .style47 {
  683 + ////mso-pattern: auto none;
  684 + background: #f4b084;
  685 + color: #fff;
  686 + font-size: 11px;
  687 + font-weight: 400;
  688 + font-style: normal;
  689 + text-decoration: none;
  690 + font-family: "微软雅黑", sans-serif;
  691 + ////mso-generic-font-family: auto;
  692 + //mso-font-charset: 134;
  693 + //mso-style-name: "60% - 强调文字颜色 2";
  694 + }
  695 +
  696 + .style48 {
  697 + //mso-pattern: auto none;
  698 + background: #a5a5a5;
  699 + color: #fff;
  700 + font-size: 11px;
  701 + font-weight: 400;
  702 + font-style: normal;
  703 + text-decoration: none;
  704 + font-family: "微软雅黑", sans-serif;
  705 + ////mso-generic-font-family: auto;
  706 + //mso-font-charset: 134;
  707 + //mso-style-name: "强调文字颜色 3";
  708 + }
  709 +
  710 + .style49 {
  711 + //mso-pattern: auto none;
  712 + background: #ededed;
  713 + color: #000;
  714 + font-size: 11px;
  715 + font-weight: 400;
  716 + font-style: normal;
  717 + text-decoration: none;
  718 + font-family: "微软雅黑", sans-serif;
  719 + ////mso-generic-font-family: auto;
  720 + //mso-font-charset: 134;
  721 + //mso-style-name: "20% - 强调文字颜色 3";
  722 + }
  723 +
  724 + .style50 {
  725 + //mso-pattern: auto none;
  726 + background: #dbdbdb;
  727 + color: #000;
  728 + font-size: 11px;
  729 + font-weight: 400;
  730 + font-style: normal;
  731 + text-decoration: none;
  732 + font-family: "微软雅黑", sans-serif;
  733 + ////mso-generic-font-family: auto;
  734 + //mso-font-charset: 134;
  735 + //mso-style-name: "40% - 强调文字颜色 3";
  736 + }
  737 +
  738 + .style51 {
  739 + //mso-pattern: auto none;
  740 + background: #c9c9c9;
  741 + color: #fff;
  742 + font-size: 11px;
  743 + font-weight: 400;
  744 + font-style: normal;
  745 + text-decoration: none;
  746 + font-family: "微软雅黑", sans-serif;
  747 + ////mso-generic-font-family: auto;
  748 + //mso-font-charset: 134;
  749 + //mso-style-name: "60% - 强调文字颜色 3";
  750 + }
  751 +
  752 + .style52 {
  753 + //mso-pattern: auto none;
  754 + background: #ffc000;
  755 + color: #fff;
  756 + font-size: 11px;
  757 + font-weight: 400;
  758 + font-style: normal;
  759 + text-decoration: none;
  760 + font-family: "微软雅黑", sans-serif;
  761 + ////mso-generic-font-family: auto;
  762 + //mso-font-charset: 134;
  763 + //mso-style-name: "强调文字颜色 4";
  764 + }
  765 +
  766 + .style53 {
  767 + //mso-pattern: auto none;
  768 + background: #fff2cc;
  769 + color: #000;
  770 + font-size: 11px;
  771 + font-weight: 400;
  772 + font-style: normal;
  773 + text-decoration: none;
  774 + font-family: "微软雅黑", sans-serif;
  775 + ////mso-generic-font-family: auto;
  776 + //mso-font-charset: 134;
  777 + //mso-style-name: "20% - 强调文字颜色 4";
  778 + }
  779 +
  780 + .style54 {
  781 + //mso-pattern: auto none;
  782 + background: #ffe699;
  783 + color: #000;
  784 + font-size: 11px;
  785 + font-weight: 400;
  786 + font-style: normal;
  787 + text-decoration: none;
  788 + font-family: "微软雅黑", sans-serif;
  789 + ////mso-generic-font-family: auto;
  790 + //mso-font-charset: 134;
  791 + //mso-style-name: "40% - 强调文字颜色 4";
  792 + }
  793 +
  794 + .style55 {
  795 + //mso-pattern: auto none;
  796 + background: #ffd966;
  797 + color: #fff;
  798 + font-size: 11px;
  799 + font-weight: 400;
  800 + font-style: normal;
  801 + text-decoration: none;
  802 + font-family: "微软雅黑", sans-serif;
  803 + ////mso-generic-font-family: auto;
  804 + //mso-font-charset: 134;
  805 + //mso-style-name: "60% - 强调文字颜色 4";
  806 + }
  807 +
  808 + .style56 {
  809 + //mso-pattern: auto none;
  810 + background: #4472c4;
  811 + color: #fff;
  812 + font-size: 11px;
  813 + font-weight: 400;
  814 + font-style: normal;
  815 + text-decoration: none;
  816 + font-family: "微软雅黑", sans-serif;
  817 + ////mso-generic-font-family: auto;
  818 + //mso-font-charset: 134;
  819 + //mso-style-name: "强调文字颜色 5";
  820 + }
  821 +
  822 + .style57 {
  823 + //mso-pattern: auto none;
  824 + background: #d9e1f2;
  825 + color: #000;
  826 + font-size: 11px;
  827 + font-weight: 400;
  828 + font-style: normal;
  829 + text-decoration: none;
  830 + font-family: "微软雅黑", sans-serif;
  831 + ////mso-generic-font-family: auto;
  832 + //mso-font-charset: 134;
  833 + //mso-style-name: "20% - 强调文字颜色 5";
  834 + }
  835 +
  836 + .style58 {
  837 + //mso-pattern: auto none;
  838 + background: #b4c6e7;
  839 + color: #000;
  840 + font-size: 11px;
  841 + font-weight: 400;
  842 + font-style: normal;
  843 + text-decoration: none;
  844 + font-family: "微软雅黑", sans-serif;
  845 + ////mso-generic-font-family: auto;
  846 + //mso-font-charset: 134;
  847 + //mso-style-name: "40% - 强调文字颜色 5";
  848 + }
  849 +
  850 + .style59 {
  851 + //mso-pattern: auto none;
  852 + background: #8ea9db;
  853 + color: #fff;
  854 + font-size: 11px;
  855 + font-weight: 400;
  856 + font-style: normal;
  857 + text-decoration: none;
  858 + font-family: "微软雅黑", sans-serif;
  859 + ////mso-generic-font-family: auto;
  860 + //mso-font-charset: 134;
  861 + //mso-style-name: "60% - 强调文字颜色 5";
  862 + }
  863 +
  864 + .style60 {
  865 + //mso-pattern: auto none;
  866 + background: #70ad47;
  867 + color: #fff;
  868 + font-size: 11px;
  869 + font-weight: 400;
  870 + font-style: normal;
  871 + text-decoration: none;
  872 + font-family: "微软雅黑", sans-serif;
  873 + ////mso-generic-font-family: auto;
  874 + //mso-font-charset: 134;
  875 + //mso-style-name: "强调文字颜色 6";
  876 + }
  877 +
  878 + .style61 {
  879 + //mso-pattern: auto none;
  880 + background: #e2efda;
  881 + color: #000;
  882 + font-size: 11px;
  883 + font-weight: 400;
  884 + font-style: normal;
  885 + text-decoration: none;
  886 + font-family: "微软雅黑", sans-serif;
  887 + ////mso-generic-font-family: auto;
  888 + //mso-font-charset: 134;
  889 + //mso-style-name: "20% - 强调文字颜色 6";
  890 + }
  891 +
  892 + .style62 {
  893 + //mso-pattern: auto none;
  894 + background: #c6e0b4;
  895 + color: #000;
  896 + font-size: 11px;
  897 + font-weight: 400;
  898 + font-style: normal;
  899 + text-decoration: none;
  900 + font-family: "微软雅黑", sans-serif;
  901 + ////mso-generic-font-family: auto;
  902 + //mso-font-charset: 134;
  903 + //mso-style-name: "40% - 强调文字颜色 6";
  904 + }
  905 +
  906 + .style63 {
  907 + //mso-pattern: auto none;
  908 + background: #a9d08e;
  909 + color: #fff;
  910 + font-size: 11px;
  911 + font-weight: 400;
  912 + font-style: normal;
  913 + text-decoration: none;
  914 + font-family: "微软雅黑", sans-serif;
  915 + ////mso-generic-font-family: auto;
  916 + ////mso-font-charset: 134;
  917 + //mso-style-name: "60% - 强调文字颜色 6";
  918 + }
  919 +
  920 + td {
  921 + //mso-style-parent: style0;
  922 + padding-top: 1px;
  923 + padding-right: 1px;
  924 + padding-left: 1px;
  925 + // mso-ignore: padding;
  926 + //mso-number-format: "General";
  927 + text-align: general;
  928 + vertical-align: middle;
  929 + white-space: nowrap;
  930 + // mso-rotate: 0;
  931 + //mso-pattern: auto;
  932 + // mso-background-source: auto;
  933 + color: windowtext;
  934 +
  935 + font-weight: 400;
  936 + font-style: normal;
  937 + text-decoration: none;
  938 + font-family: "微软雅黑", sans-serif;
  939 + //mso-generic-font-family: auto;
  940 + ////mso-font-charset: 134;
  941 + border: none;
  942 + //mso-protection: locked visible;
  943 + }
  944 +
  945 + .xl65 {
  946 + //mso-style-parent: style0;
  947 + text-align: center;
  948 + font-size: 16.5pt;
  949 + ////mso-font-charset: 134;
  950 + }
  951 +
  952 + .xl66 {
  953 + //mso-style-parent: style0;
  954 + text-align: center;
  955 + font-size: 10.5pt;
  956 + ////mso-font-charset: 134;
  957 + }
  958 +
  959 + .xl67 {
  960 + //mso-style-parent: style0;
  961 + text-align: center;
  962 + font-size: 13.5pt;
  963 + //mso-font-charset: 134;
  964 + }
  965 +
  966 + .xl68 {
  967 + //mso-style-parent: style0;
  968 + text-align: center;
  969 + font-size: 10.5pt;
  970 + //mso-font-charset: 134;
  971 + }
  972 +
  973 + .xl69 {
  974 + //mso-style-parent: style0;
  975 + text-align: left;
  976 + font-size: 10.5pt;
  977 + //mso-font-charset: 134;
  978 + }
  979 +
  980 + .xl70 {
  981 + //mso-style-parent: style0;
  982 + text-align: left;
  983 + font-size: 8px;
  984 + //mso-font-charset: 134;
  985 + }
  986 +
  987 + .xl71 {
  988 + //mso-style-parent: style0;
  989 + text-align: center;
  990 + font-size: 10.5pt;
  991 + //mso-font-charset: 134;
  992 + border: 0.5px solid windowtext;
  993 + }
  994 +
  995 + .xl72 {
  996 + //mso-style-parent: style0;
  997 + text-align: center;
  998 + font-size: 10.5pt;
  999 + //mso-font-charset: 134;
  1000 + border: 0.5px solid windowtext;
  1001 + white-space: normal;
  1002 + }
  1003 +
  1004 + .xl73 {
  1005 + //mso-style-parent: style0;
  1006 + white-space: normal;
  1007 + font-size: 10.5pt;
  1008 + //mso-font-charset: 134;
  1009 + border: 0.5px solid windowtext;
  1010 + }
  1011 +
  1012 + .xl74 {
  1013 + //mso-style-parent: style0;
  1014 + text-align: center;
  1015 + white-space: normal;
  1016 + font-size: 10.5pt;
  1017 + //mso-font-charset: 134;
  1018 + border: 0.5px solid windowtext;
  1019 + }
  1020 +
  1021 + .xl75 {
  1022 + //mso-style-parent: style0;
  1023 + text-align: center;
  1024 + white-space: normal;
  1025 + font-size: 8px;
  1026 + //mso-font-charset: 134;
  1027 + border: 0.5px solid windowtext;
  1028 + }
  1029 +
  1030 + .xl76 {
  1031 + //mso-style-parent: style0;
  1032 + font-size: 10.5pt;
  1033 + //mso-font-charset: 134;
  1034 + }
  1035 +
  1036 + .xl77 {
  1037 + //mso-style-parent: style0;
  1038 + font-size: 8px;
  1039 + //mso-font-charset: 134;
  1040 + }
  1041 +
  1042 + .xl78 {
  1043 + //mso-style-parent: style0;
  1044 + text-align: center;
  1045 + font-size: 10.5pt;
  1046 + //mso-font-charset: 134;
  1047 + }
  1048 + `;
  1049 +}
... ...
src/pages/OrderPrint/components/DalangPrinter.tsx
1 1 import '@/pages/OrderPrint/index.less';
2   -import { formatDateTime } from '@/utils';
  2 +import { formatDateTime, formatSalesCode } from '@/utils';
3 3  
4 4 export default ({ mainOrder, subOrders }) => {
5   - console.log(subOrders);
  5 + //业务员:英文名称(销售代码)
  6 + let salesCode = mainOrder.salesCode;
  7 + salesCode = formatSalesCode(salesCode);
  8 + //订单总额计算
  9 + let totalPayment = 0;
  10 + for (let order of subOrders) {
  11 + let subOrderPayment = order.subOrderPayment;
  12 + totalPayment += subOrderPayment === undefined ? 0 : subOrderPayment;
  13 + }
6 14 let columns = [];
7 15 for (let i = 0; i < subOrders.length; i++) {
8 16 let subOrder = subOrders[i];
... ... @@ -81,9 +89,7 @@ export default ({ mainOrder, subOrders }) =&gt; {
81 89 <col width="57" />
82 90 <col width="57" />
83 91 <col width="57" />
84   - <tr height="42" style={{ height: '21.00pt' }}></tr>
85   - <tr height="42" style={{ height: '21.00pt' }}></tr>
86   - <tr height="42" style={{ height: '21.00pt' }}></tr>
  92 + <tr height="42" style={{ height: '15.00pt' }}></tr>
87 93 <tr height="42" style={{ height: '21.00pt' }}>
88 94 <td height="42" colSpan={5} style={{ height: '21.00pt' }}></td>
89 95 <td
... ... @@ -241,7 +247,7 @@ export default ({ mainOrder, subOrders }) =&gt; {
241 247 borderBottom: '0.5pt solid windowtext',
242 248 }}
243 249 >
244   - 199
  250 + {totalPayment}
245 251 </td>
246 252 </tr>
247 253  
... ... @@ -323,7 +329,7 @@ export default ({ mainOrder, subOrders }) =&gt; {
323 329 colSpan={4}
324 330 style={{ borderRight: 'none', borderBottom: 'none' }}
325 331 >
326   - 业务员:Linda
  332 + 业务员:{salesCode}
327 333 </td>
328 334 <td
329 335 className="xl78"
... ...
src/pages/OrderPrint/components/HoujiePrinter.tsx
1 1 import '@/pages/OrderPrint/index.less';
2   -import { formatDateTime } from '@/utils';
  2 +import { formatDateTime, formatSalesCode } from '@/utils';
3 3  
4 4 export default ({ mainOrder, subOrders }) => {
5   - console.log(subOrders);
  5 + //业务员:英文名称(销售代码)
  6 + let salesCode = mainOrder.salesCode;
  7 + salesCode = formatSalesCode(salesCode);
6 8 let columns = [];
7 9 for (let i = 0; i < subOrders.length; i++) {
8 10 let subOrder = subOrders[i];
... ... @@ -225,7 +227,7 @@ export default ({ mainOrder, subOrders }) =&gt; {
225 227 colSpan={2}
226 228 style={{ borderRight: 'none', borderBottom: 'none' }}
227 229 >
228   - 业务员:Peter
  230 + 业务员:{salesCode}
229 231 </td>
230 232 <td
231 233 className="xl78"
... ...
src/pages/OrderPrint/components/ZhuguangPrinter.tsx
1 1 import '@/pages/OrderPrint/index.less';
2   -import { formatDateTime } from '@/utils';
  2 +import { formatDateTime, formatSalesCode } from '@/utils';
3 3  
4 4 export default ({ mainOrder, subOrders }) => {
5   - console.log(subOrders);
  5 + //合计数量
  6 + let totalQuantity = 0;
  7 + //业务员:英文名称(销售代码)
  8 + let salesCode = mainOrder.salesCode;
  9 + salesCode = formatSalesCode(salesCode);
  10 + for (let order of subOrders) {
  11 + let subOrderQuantity = parseInt(order.quantity);
  12 + totalQuantity += subOrderQuantity === undefined ? 0 : subOrderQuantity;
  13 + }
6 14 let columns = [];
7 15 for (let i = 0; i < subOrders.length; i++) {
8 16 let subOrder = subOrders[i];
... ... @@ -73,9 +81,7 @@ export default ({ mainOrder, subOrders }) =&gt; {
73 81 <col width="57" />
74 82 <col width="57" />
75 83 <col width="57" />
76   - <tr height="42" style={{ height: '21.00pt' }}></tr>
77   - <tr height="42" style={{ height: '21.00pt' }}></tr>
78   - <tr height="42" style={{ height: '21.00pt' }}></tr>
  84 + <tr height="42" style={{ height: '15.00pt' }}></tr>
79 85 <tr height="42" style={{ height: '21.00pt' }}>
80 86 <td height="42" colSpan={5} style={{ height: '21.00pt' }}></td>
81 87 <td
... ... @@ -226,7 +232,7 @@ export default ({ mainOrder, subOrders }) =&gt; {
226 232 borderBottom: '0.5pt solid windowtext',
227 233 }}
228 234 >
229   - 199
  235 + {totalQuantity}
230 236 </td>
231 237 </tr>
232 238  
... ... @@ -308,7 +314,7 @@ export default ({ mainOrder, subOrders }) =&gt; {
308 314 colSpan={4}
309 315 style={{ borderRight: 'none', borderBottom: 'none' }}
310 316 >
311   - 业务员:Tina
  317 + 业务员:{salesCode}
312 318 </td>
313 319 <td
314 320 className="xl78"
... ...
src/pages/OrderPrint/index.less
... ... @@ -11,17 +11,6 @@ col {
11 11 br {
12 12 // mso-data-placement: same-cell;
13 13 }
14   -@media print {
15   - body {
16   - color: black;
17   - }
18   - .printed-text {
19   - color: #333;
20   - }
21   - .printed-background {
22   - background-color: #fff;
23   - }
24   -}
25 14  
26 15 .font0 {
27 16 color: windowtext;
... ...
src/services/definition.ts
... ... @@ -365,6 +365,10 @@ export interface DictionaryVO {
365 365 sort?: number;
366 366 }
367 367  
  368 +export interface FilePathDto {
  369 + url?: string;
  370 +}
  371 +
368 372 export interface ModelAndView {
369 373 empty?: boolean;
370 374 model?: any;
... ... @@ -700,6 +704,28 @@ export interface ProductInformationDto {
700 704 productName?: string;
701 705 }
702 706  
  707 +export interface QueryAnnexDto {
  708 + /**
  709 + * @description
  710 + * 附件集合
  711 + */
  712 + filePaths?: Array<FilePathDto>;
  713 + /**
  714 + * @description
  715 + * 子订单id
  716 + * @format int64
  717 + */
  718 + subId?: number;
  719 +}
  720 +
  721 +export interface QueryMainOrderDto {
  722 + /**
  723 + * @description
  724 + * 收货人姓名
  725 + */
  726 + customerName?: string;
  727 +}
  728 +
703 729 export interface ResetPwdVO {
704 730 /** @format int64 */
705 731 userId?: number;
... ... @@ -757,6 +783,11 @@ export interface Dto {
757 783 collectMoneyTime?: string;
758 784 /**
759 785 * @description
  786 + * 财务备注
  787 + */
  788 + invoicingNotes?: string;
  789 + /**
  790 + * @description
760 791 * 子订单id集合
761 792 */
762 793 subIds?: Array<number>;
... ...
src/services/order.ts
1 1 import axios from 'axios';
2 2  
3 3 export const orderExport = async (
  4 + url: any = '',
4 5 data: any = {},
5 6 exportLoadingDestory: any,
6 7 ) => {
7 8 axios({
8   - url: '/api/service/order/export',
  9 + url: url,
9 10 method: 'post',
10 11 responseType: 'blob',
11 12 headers: { Authorization: localStorage.getItem('token') },
... ...
src/services/request.ts
... ... @@ -35,6 +35,8 @@ import type {
35 35 OrderUnlockFieldApplyVO,
36 36 OrderUpdateVO,
37 37 ProductInformationDto,
  38 + QueryAnnexDto,
  39 + QueryMainOrderDto,
38 40 ResetPwdVO,
39 41 ServerResult,
40 42 SysLogQueryVO,
... ... @@ -5150,6 +5152,77 @@ export const postServiceOrderEditOrder = /* #__PURE__ */ (() =&gt; {
5150 5152 return request;
5151 5153 })();
5152 5154  
  5155 +/** @description request parameter type for postServiceOrderErrorExcelInformation */
  5156 +export interface PostServiceOrderErrorExcelInformationOption {
  5157 + /**
  5158 + * @description
  5159 + * file
  5160 + */
  5161 + formData: {
  5162 + /**
  5163 + @description
  5164 + file */
  5165 + file: File;
  5166 + };
  5167 +}
  5168 +
  5169 +/** @description response type for postServiceOrderErrorExcelInformation */
  5170 +export interface PostServiceOrderErrorExcelInformationResponse {
  5171 + /**
  5172 + * @description
  5173 + * OK
  5174 + */
  5175 + 200: ServerResult;
  5176 + /**
  5177 + * @description
  5178 + * Created
  5179 + */
  5180 + 201: any;
  5181 + /**
  5182 + * @description
  5183 + * Unauthorized
  5184 + */
  5185 + 401: any;
  5186 + /**
  5187 + * @description
  5188 + * Forbidden
  5189 + */
  5190 + 403: any;
  5191 + /**
  5192 + * @description
  5193 + * Not Found
  5194 + */
  5195 + 404: any;
  5196 +}
  5197 +
  5198 +export type PostServiceOrderErrorExcelInformationResponseSuccess =
  5199 + PostServiceOrderErrorExcelInformationResponse[200];
  5200 +/**
  5201 + * @description
  5202 + * 错误表格导入
  5203 + * @tags 内部订单
  5204 + * @produces *
  5205 + * @consumes multipart/form-data
  5206 + */
  5207 +export const postServiceOrderErrorExcelInformation = /* #__PURE__ */ (() => {
  5208 + const method = 'post';
  5209 + const url = '/service/order/errorExcelInformation';
  5210 + function request(
  5211 + option: PostServiceOrderErrorExcelInformationOption,
  5212 + ): Promise<PostServiceOrderErrorExcelInformationResponseSuccess> {
  5213 + return requester(request.url, {
  5214 + method: request.method,
  5215 + ...option,
  5216 + }) as unknown as Promise<PostServiceOrderErrorExcelInformationResponseSuccess>;
  5217 + }
  5218 +
  5219 + /** http method */
  5220 + request.method = method;
  5221 + /** request url */
  5222 + request.url = url;
  5223 + return request;
  5224 +})();
  5225 +
5153 5226 /** @description request parameter type for postServiceOrderExport */
5154 5227 export interface PostServiceOrderExportOption {
5155 5228 /**
... ... @@ -5221,6 +5294,202 @@ export const postServiceOrderExport = /* #__PURE__ */ (() =&gt; {
5221 5294 return request;
5222 5295 })();
5223 5296  
  5297 +/** @description response type for postServiceOrderExportTemplate */
  5298 +export interface PostServiceOrderExportTemplateResponse {
  5299 + /**
  5300 + * @description
  5301 + * OK
  5302 + */
  5303 + 200: any;
  5304 + /**
  5305 + * @description
  5306 + * Created
  5307 + */
  5308 + 201: any;
  5309 + /**
  5310 + * @description
  5311 + * Unauthorized
  5312 + */
  5313 + 401: any;
  5314 + /**
  5315 + * @description
  5316 + * Forbidden
  5317 + */
  5318 + 403: any;
  5319 + /**
  5320 + * @description
  5321 + * Not Found
  5322 + */
  5323 + 404: any;
  5324 +}
  5325 +
  5326 +export type PostServiceOrderExportTemplateResponseSuccess =
  5327 + PostServiceOrderExportTemplateResponse[200];
  5328 +/**
  5329 + * @description
  5330 + * 下载模板
  5331 + * @tags 内部订单
  5332 + * @produces *
  5333 + * @consumes application/json
  5334 + */
  5335 +export const postServiceOrderExportTemplate = /* #__PURE__ */ (() => {
  5336 + const method = 'post';
  5337 + const url = '/service/order/exportTemplate';
  5338 + function request(): Promise<PostServiceOrderExportTemplateResponseSuccess> {
  5339 + return requester(request.url, {
  5340 + method: request.method,
  5341 + }) as unknown as Promise<PostServiceOrderExportTemplateResponseSuccess>;
  5342 + }
  5343 +
  5344 + /** http method */
  5345 + request.method = method;
  5346 + /** request url */
  5347 + request.url = url;
  5348 + return request;
  5349 +})();
  5350 +
  5351 +/** @description request parameter type for postServiceOrderFileProcess */
  5352 +export interface PostServiceOrderFileProcessOption {
  5353 + /**
  5354 + * @description
  5355 + * files
  5356 + */
  5357 + formData: {
  5358 + /**
  5359 + @description
  5360 + files */
  5361 + files: Array<File>;
  5362 + };
  5363 +}
  5364 +
  5365 +/** @description response type for postServiceOrderFileProcess */
  5366 +export interface PostServiceOrderFileProcessResponse {
  5367 + /**
  5368 + * @description
  5369 + * OK
  5370 + */
  5371 + 200: ServerResult;
  5372 + /**
  5373 + * @description
  5374 + * Created
  5375 + */
  5376 + 201: any;
  5377 + /**
  5378 + * @description
  5379 + * Unauthorized
  5380 + */
  5381 + 401: any;
  5382 + /**
  5383 + * @description
  5384 + * Forbidden
  5385 + */
  5386 + 403: any;
  5387 + /**
  5388 + * @description
  5389 + * Not Found
  5390 + */
  5391 + 404: any;
  5392 +}
  5393 +
  5394 +export type PostServiceOrderFileProcessResponseSuccess =
  5395 + PostServiceOrderFileProcessResponse[200];
  5396 +/**
  5397 + * @description
  5398 + * 统一文件处理接口
  5399 + * @tags 内部订单
  5400 + * @produces *
  5401 + * @consumes application/json
  5402 + */
  5403 +export const postServiceOrderFileProcess = /* #__PURE__ */ (() => {
  5404 + const method = 'post';
  5405 + const url = '/service/order/fileProcess';
  5406 + function request(
  5407 + option: PostServiceOrderFileProcessOption,
  5408 + ): Promise<PostServiceOrderFileProcessResponseSuccess> {
  5409 + return requester(request.url, {
  5410 + method: request.method,
  5411 + ...option,
  5412 + }) as unknown as Promise<PostServiceOrderFileProcessResponseSuccess>;
  5413 + }
  5414 +
  5415 + /** http method */
  5416 + request.method = method;
  5417 + /** request url */
  5418 + request.url = url;
  5419 + return request;
  5420 +})();
  5421 +
  5422 +/** @description request parameter type for postServiceOrderImportExcel */
  5423 +export interface PostServiceOrderImportExcelOption {
  5424 + /**
  5425 + * @description
  5426 + * file
  5427 + */
  5428 + formData: {
  5429 + /**
  5430 + @description
  5431 + file */
  5432 + file: File;
  5433 + };
  5434 +}
  5435 +
  5436 +/** @description response type for postServiceOrderImportExcel */
  5437 +export interface PostServiceOrderImportExcelResponse {
  5438 + /**
  5439 + * @description
  5440 + * OK
  5441 + */
  5442 + 200: ServerResult;
  5443 + /**
  5444 + * @description
  5445 + * Created
  5446 + */
  5447 + 201: any;
  5448 + /**
  5449 + * @description
  5450 + * Unauthorized
  5451 + */
  5452 + 401: any;
  5453 + /**
  5454 + * @description
  5455 + * Forbidden
  5456 + */
  5457 + 403: any;
  5458 + /**
  5459 + * @description
  5460 + * Not Found
  5461 + */
  5462 + 404: any;
  5463 +}
  5464 +
  5465 +export type PostServiceOrderImportExcelResponseSuccess =
  5466 + PostServiceOrderImportExcelResponse[200];
  5467 +/**
  5468 + * @description
  5469 + * 表格导入
  5470 + * @tags 内部订单
  5471 + * @produces *
  5472 + * @consumes multipart/form-data
  5473 + */
  5474 +export const postServiceOrderImportExcel = /* #__PURE__ */ (() => {
  5475 + const method = 'post';
  5476 + const url = '/service/order/importExcel';
  5477 + function request(
  5478 + option: PostServiceOrderImportExcelOption,
  5479 + ): Promise<PostServiceOrderImportExcelResponseSuccess> {
  5480 + return requester(request.url, {
  5481 + method: request.method,
  5482 + ...option,
  5483 + }) as unknown as Promise<PostServiceOrderImportExcelResponseSuccess>;
  5484 + }
  5485 +
  5486 + /** http method */
  5487 + request.method = method;
  5488 + /** request url */
  5489 + request.url = url;
  5490 + return request;
  5491 +})();
  5492 +
5224 5493 /** @description request parameter type for postServiceOrderInvoicing */
5225 5494 export interface PostServiceOrderInvoicingOption {
5226 5495 /**
... ... @@ -5748,6 +6017,78 @@ export const getServiceOrderProvideToken = /* #__PURE__ */ (() =&gt; {
5748 6017 return request;
5749 6018 })();
5750 6019  
  6020 +/** @description request parameter type for postServiceOrderQueryCustomerNameInformation */
  6021 +export interface PostServiceOrderQueryCustomerNameInformationOption {
  6022 + /**
  6023 + * @description
  6024 + * dto
  6025 + */
  6026 + body: {
  6027 + /**
  6028 + @description
  6029 + dto */
  6030 + dto: QueryMainOrderDto;
  6031 + };
  6032 +}
  6033 +
  6034 +/** @description response type for postServiceOrderQueryCustomerNameInformation */
  6035 +export interface PostServiceOrderQueryCustomerNameInformationResponse {
  6036 + /**
  6037 + * @description
  6038 + * OK
  6039 + */
  6040 + 200: ServerResult;
  6041 + /**
  6042 + * @description
  6043 + * Created
  6044 + */
  6045 + 201: any;
  6046 + /**
  6047 + * @description
  6048 + * Unauthorized
  6049 + */
  6050 + 401: any;
  6051 + /**
  6052 + * @description
  6053 + * Forbidden
  6054 + */
  6055 + 403: any;
  6056 + /**
  6057 + * @description
  6058 + * Not Found
  6059 + */
  6060 + 404: any;
  6061 +}
  6062 +
  6063 +export type PostServiceOrderQueryCustomerNameInformationResponseSuccess =
  6064 + PostServiceOrderQueryCustomerNameInformationResponse[200];
  6065 +/**
  6066 + * @description
  6067 + * 根据收货人查询主订单信息
  6068 + * @tags 内部订单
  6069 + * @produces *
  6070 + * @consumes application/json
  6071 + */
  6072 +export const postServiceOrderQueryCustomerNameInformation =
  6073 + /* #__PURE__ */ (() => {
  6074 + const method = 'post';
  6075 + const url = '/service/order/queryCustomerNameInformation';
  6076 + function request(
  6077 + option: PostServiceOrderQueryCustomerNameInformationOption,
  6078 + ): Promise<PostServiceOrderQueryCustomerNameInformationResponseSuccess> {
  6079 + return requester(request.url, {
  6080 + method: request.method,
  6081 + ...option,
  6082 + }) as unknown as Promise<PostServiceOrderQueryCustomerNameInformationResponseSuccess>;
  6083 + }
  6084 +
  6085 + /** http method */
  6086 + request.method = method;
  6087 + /** request url */
  6088 + request.url = url;
  6089 + return request;
  6090 + })();
  6091 +
5751 6092 /** @description request parameter type for postServiceOrderQueryProductInformation */
5752 6093 export interface PostServiceOrderQueryProductInformationOption {
5753 6094 /**
... ... @@ -5961,6 +6302,77 @@ export const postServiceOrderSendProduct = /* #__PURE__ */ (() =&gt; {
5961 6302 return request;
5962 6303 })();
5963 6304  
  6305 +/** @description request parameter type for postServiceOrderUpdateAnnex */
  6306 +export interface PostServiceOrderUpdateAnnexOption {
  6307 + /**
  6308 + * @description
  6309 + * dto
  6310 + */
  6311 + body: {
  6312 + /**
  6313 + @description
  6314 + dto */
  6315 + dto: QueryAnnexDto;
  6316 + };
  6317 +}
  6318 +
  6319 +/** @description response type for postServiceOrderUpdateAnnex */
  6320 +export interface PostServiceOrderUpdateAnnexResponse {
  6321 + /**
  6322 + * @description
  6323 + * OK
  6324 + */
  6325 + 200: ServerResult;
  6326 + /**
  6327 + * @description
  6328 + * Created
  6329 + */
  6330 + 201: any;
  6331 + /**
  6332 + * @description
  6333 + * Unauthorized
  6334 + */
  6335 + 401: any;
  6336 + /**
  6337 + * @description
  6338 + * Forbidden
  6339 + */
  6340 + 403: any;
  6341 + /**
  6342 + * @description
  6343 + * Not Found
  6344 + */
  6345 + 404: any;
  6346 +}
  6347 +
  6348 +export type PostServiceOrderUpdateAnnexResponseSuccess =
  6349 + PostServiceOrderUpdateAnnexResponse[200];
  6350 +/**
  6351 + * @description
  6352 + * 修改附件信息
  6353 + * @tags 内部订单
  6354 + * @produces *
  6355 + * @consumes application/json
  6356 + */
  6357 +export const postServiceOrderUpdateAnnex = /* #__PURE__ */ (() => {
  6358 + const method = 'post';
  6359 + const url = '/service/order/updateAnnex';
  6360 + function request(
  6361 + option: PostServiceOrderUpdateAnnexOption,
  6362 + ): Promise<PostServiceOrderUpdateAnnexResponseSuccess> {
  6363 + return requester(request.url, {
  6364 + method: request.method,
  6365 + ...option,
  6366 + }) as unknown as Promise<PostServiceOrderUpdateAnnexResponseSuccess>;
  6367 + }
  6368 +
  6369 + /** http method */
  6370 + request.method = method;
  6371 + /** request url */
  6372 + request.url = url;
  6373 + return request;
  6374 +})();
  6375 +
5964 6376 /** @description request parameter type for postServiceOrderUpdateOrder */
5965 6377 export interface PostServiceOrderUpdateOrderOption {
5966 6378 /**
... ...
src/utils/index.ts
... ... @@ -54,11 +54,95 @@ function formatDateTime(inputDateTime: string) {
54 54 const formattedDateTime = `${year}-${month}-${day} ${hour}:${minute}:${second}`;
55 55 return formattedDateTime;
56 56 }
  57 +
  58 +function formatSalesCode(salesCode: any) {
  59 + let newSalesCode = salesCode;
  60 + if (newSalesCode.indexOf('_')) {
  61 + newSalesCode = newSalesCode.split('_');
  62 + if (salesCode?.length === 2) {
  63 + newSalesCode = newSalesCode[1] + '(' + newSalesCode[0] + ')';
  64 + }
  65 + }
  66 + return newSalesCode;
  67 +}
  68 +
  69 +// 将二进制流的字符串转换成 Blob 对象
  70 +function dataURItoBlob(dataURI) {
  71 + const byteString = atob(dataURI.split(',')[1]);
  72 + const mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0];
  73 + const ab = new ArrayBuffer(byteString.length);
  74 + const ia = new Uint8Array(ab);
  75 + for (let i = 0; i < byteString.length; i++) {
  76 + ia[i] = byteString.charCodeAt(i);
  77 + }
  78 + return new Blob([ab], { type: mimeString });
  79 +}
  80 +
  81 +// 将 Blob 对象转换成 File 对象
  82 +function blobToFile(blob, fileName) {
  83 + return new File([blob], fileName, { type: blob.type });
  84 +}
  85 +
  86 +function appendFormData(formData, data, parentKey = null) {
  87 + for (const key in data) {
  88 + if (data.hasOwnProperty(key)) {
  89 + const value = data[key];
  90 + const formKey = parentKey ? `${parentKey}[${key}]` : key;
  91 +
  92 + if (Array.isArray(value)) {
  93 + // 处理数组
  94 + value.forEach((item, index) => {
  95 + const arrayKey = `${formKey}[${index}]`;
  96 + if (typeof item === 'object' && !Array.isArray(item)) {
  97 + // 递归处理对象
  98 + appendFormData(formData, item, arrayKey);
  99 + } else {
  100 + // 直接添加到 FormData
  101 + formData.append(arrayKey, item);
  102 + }
  103 + });
  104 + } else if (typeof value === 'object' && !Array.isArray(value)) {
  105 + // 递归处理对象
  106 + appendFormData(formData, value, formKey);
  107 + } else {
  108 + // 直接添加到 FormData
  109 + formData.append(formKey, value);
  110 + }
  111 + }
  112 + }
  113 +}
  114 +
  115 +function getAliYunOSSFileNameFromUrl(url: string) {
  116 + try {
  117 + // 使用URL对象解析链接
  118 + let urlObject = new URL(url);
  119 +
  120 + // 从路径中获取最后一个斜杠后的部分,即文件名
  121 + let pathParts = urlObject.pathname.split('/');
  122 + let fileName = pathParts[pathParts.length - 1];
  123 +
  124 + // 检查文件名是否包含至少一个点(.)以确保是一个合法的文件名
  125 + if (fileName.includes('.')) {
  126 + return fileName;
  127 + } else {
  128 + throw new Error('Invalid file name in the URL');
  129 + }
  130 + } catch (error: any) {
  131 + // 如果解析失败或文件名不符合预期,返回原始链接
  132 + console.error('Error extracting file name:', error.message);
  133 + return url;
  134 + }
  135 +}
57 136 export {
  137 + appendFormData,
  138 + blobToFile,
58 139 customMessage,
  140 + dataURItoBlob,
59 141 enumToProTableEnumValue,
60 142 enumToSelect,
61 143 enumValueToLabel,
62 144 formatDateTime,
  145 + formatSalesCode,
  146 + getAliYunOSSFileNameFromUrl,
63 147 getUserInfo,
64 148 };
... ...