Commit 45e950cdac5cea5412707a1265abfab10833449f

Authored by zhongnanhuang
2 parents 2fd6e5cb 2ca7483f

Merge branch 'znh' into 'develop'

Znh



See merge request !15
.umirc.ts
@@ -39,6 +39,13 @@ export default defineConfig({ @@ -39,6 +39,13 @@ export default defineConfig({
39 icon: 'ProfileOutlined', 39 icon: 'ProfileOutlined',
40 }, 40 },
41 { 41 {
  42 + name: '订单报表',
  43 + path: '/orderReport',
  44 + component: './OrderReport',
  45 + icon: 'LineChartOutlined',
  46 + access: 'canReadAdmin',
  47 + },
  48 + {
42 name: '打印', 49 name: '打印',
43 path: '/print', 50 path: '/print',
44 component: './OrderPrint', 51 component: './OrderPrint',
package.json
@@ -12,6 +12,7 @@ @@ -12,6 +12,7 @@
12 "start": "npm run dev" 12 "start": "npm run dev"
13 }, 13 },
14 "dependencies": { 14 "dependencies": {
  15 + "@ant-design/charts": "^1.4.3",
15 "@ant-design/icons": "^5.2.6", 16 "@ant-design/icons": "^5.2.6",
16 "@ant-design/pro-components": "^2.6.32", 17 "@ant-design/pro-components": "^2.6.32",
17 "@inspir/assembly-css": "1.0.0-alpha", 18 "@inspir/assembly-css": "1.0.0-alpha",
src/access.ts
1 export default (initialState: API.UserInfo) => { 1 export default (initialState: API.UserInfo) => {
2 // 在这里按照初始化数据定义项目中的权限,统一管理 2 // 在这里按照初始化数据定义项目中的权限,统一管理
3 // 参考文档 https://umijs.org/docs/max/access 3 // 参考文档 https://umijs.org/docs/max/access
4 - const canSeeAdmin = !!(  
5 - initialState && initialState.name !== 'dontHaveAccess'  
6 - ); 4 + const { roleSmallVO } = initialState;
  5 +
  6 + console.log(roleSmallVO?.code === 'admin');
7 return { 7 return {
8 - canSeeAdmin, 8 + canReadAdmin: roleSmallVO?.code === 'admin',
9 }; 9 };
10 }; 10 };
src/app.ts
@@ -7,12 +7,12 @@ import { message } from 'antd'; @@ -7,12 +7,12 @@ import { message } from 'antd';
7 import { RESPONSE_CODE } from './constants/enum'; 7 import { RESPONSE_CODE } from './constants/enum';
8 8
9 import './style/global.css'; 9 import './style/global.css';
  10 +import { getUserInfo } from './utils';
10 11
11 // 全局初始化数据配置,用于 Layout 用户信息和权限初始化 12 // 全局初始化数据配置,用于 Layout 用户信息和权限初始化
12 // 更多信息见文档:https://umijs.org/docs/api/runtime-config#getinitialstate 13 // 更多信息见文档:https://umijs.org/docs/api/runtime-config#getinitialstate
13 -export async function getInitialState(): Promise<{ name: string }> {  
14 - // getUserInfo();  
15 - return { name: '' }; 14 +export async function getInitialState() {
  15 + return getUserInfo();
16 } 16 }
17 17
18 export const layout = () => { 18 export const layout = () => {
@@ -24,7 +24,7 @@ export const layout = () =&gt; { @@ -24,7 +24,7 @@ export const layout = () =&gt; {
24 // rightContentRender: () => <RightContent />, 24 // rightContentRender: () => <RightContent />,
25 // footerRender: () => <Footer />, 25 // footerRender: () => <Footer />,
26 }, 26 },
27 - collapsed: true, 27 + // collapsed: true,
28 }; 28 };
29 }; 29 };
30 30
src/assets/icons/down.svg 0 → 100644
  1 +<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1702266081134" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1723" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M866.742857 762.148571l-20.48-170.788571a6.948571 6.948571 0 0 0-11.702857-4.022857l-50.834286 51.2-232.594285-232.594286a14.262857 14.262857 0 0 0-19.382858 0l-87.04 87.04L207.36 256a6.948571 6.948571 0 0 0-9.508571 0L159.085714 294.765714a6.948571 6.948571 0 0 0 0 9.508572l275.748572 276.114285a13.531429 13.531429 0 0 0 19.382857 0l87.405714-87.405714 193.828572 193.828572-50.834286 50.834285a6.948571 6.948571 0 0 0 4.022857 11.702857l170.422857 20.48a6.582857 6.582857 0 0 0 7.68-7.68z" p-id="1724" fill="#1DB302"></path></svg>
0 \ No newline at end of file 2 \ No newline at end of file
src/assets/icons/up.svg 0 → 100644
  1 +<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1702266075667" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1549" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M859.062857 256l-170.788571 20.48a6.948571 6.948571 0 0 0-4.022857 11.702857l50.834285 49.005714-193.462857 193.828572-87.405714-87.405714a13.897143 13.897143 0 0 0-19.382857 0l-275.748572 275.748571a7.314286 7.314286 0 0 0 0 9.874286L197.851429 768a6.948571 6.948571 0 0 0 9.508571 0l237.348571-236.982857 87.04 87.04a14.262857 14.262857 0 0 0 19.382858 0l232.594285-232.594286 50.834286 50.834286a6.948571 6.948571 0 0 0 11.702857-4.022857l20.48-170.788572a6.582857 6.582857 0 0 0-7.68-5.485714z" p-id="1550" fill="#d81e06"></path></svg>
0 \ No newline at end of file 2 \ No newline at end of file
src/pages/Login/index.tsx
@@ -9,7 +9,7 @@ import { @@ -9,7 +9,7 @@ import {
9 ProConfigProvider, 9 ProConfigProvider,
10 ProFormText, 10 ProFormText,
11 } from '@ant-design/pro-components'; 11 } from '@ant-design/pro-components';
12 -import { history, useModel } from '@umijs/max'; 12 +import { useModel } from '@umijs/max';
13 import { Button, theme } from 'antd'; 13 import { Button, theme } from 'antd';
14 import { useEffect, useState } from 'react'; 14 import { useEffect, useState } from 'react';
15 15
@@ -27,6 +27,7 @@ export default () =&gt; { @@ -27,6 +27,7 @@ export default () =&gt; {
27 useEffect(() => { 27 useEffect(() => {
28 fetchCode(); 28 fetchCode();
29 }, []); 29 }, []);
  30 +
30 return ( 31 return (
31 <ProConfigProvider hashed={false}> 32 <ProConfigProvider hashed={false}>
32 <div 33 <div
@@ -43,7 +44,10 @@ export default () =&gt; { @@ -43,7 +44,10 @@ export default () =&gt; {
43 44
44 if (res.result === RESPONSE_CODE.SUCCESS) { 45 if (res.result === RESPONSE_CODE.SUCCESS) {
45 setUserLocalInfo(res.data.token, res.data?.user); 46 setUserLocalInfo(res.data.token, res.data?.user);
46 - history.push('/order'); 47 + /**
  48 + * 使用history.push或者history.replace会导致菜单路由无法更新,需要再次刷新页面
  49 + */
  50 + window.location.href = '/order';
47 } else { 51 } else {
48 fetchCode(); 52 fetchCode();
49 } 53 }
src/pages/Order/components/CheckModal.tsx
1 import { RESPONSE_CODE } from '@/constants/enum'; 1 import { RESPONSE_CODE } from '@/constants/enum';
2 -import { postServiceOrderCheckOrder } from '@/services'; 2 +import {
  3 + postServiceOrderCheckOrder,
  4 + postServiceOrderFinanceCheckOrder,
  5 +} from '@/services';
3 import { ModalForm, ProFormTextArea } from '@ant-design/pro-components'; 6 import { ModalForm, ProFormTextArea } from '@ant-design/pro-components';
4 import { Button, Form, message } from 'antd'; 7 import { Button, Form, message } from 'antd';
5 -export default ({ setCheckVisible, data, subOrders, onClose }) => { 8 +import { CHECK_TYPE } from '../constant';
  9 +export default ({
  10 + setCheckVisible,
  11 + data,
  12 + subOrders,
  13 + orderCheckType,
  14 + onClose,
  15 +}) => {
6 const [form] = Form.useForm<{ name: string; company: string }>(); 16 const [form] = Form.useForm<{ name: string; company: string }>();
7 let subOrderIds: any[] = []; 17 let subOrderIds: any[] = [];
8 //是单条子订单审核 18 //是单条子订单审核
@@ -11,6 +21,7 @@ export default ({ setCheckVisible, data, subOrders, onClose }) =&gt; { @@ -11,6 +21,7 @@ export default ({ setCheckVisible, data, subOrders, onClose }) =&gt; {
11 } else { 21 } else {
12 subOrderIds = subOrders.map((subOrder) => subOrder.id); 22 subOrderIds = subOrders.map((subOrder) => subOrder.id);
13 } 23 }
  24 +
14 async function doCheck(body: object) { 25 async function doCheck(body: object) {
15 const data = await postServiceOrderCheckOrder({ 26 const data = await postServiceOrderCheckOrder({
16 data: body, 27 data: body,
@@ -20,6 +31,31 @@ export default ({ setCheckVisible, data, subOrders, onClose }) =&gt; { @@ -20,6 +31,31 @@ export default ({ setCheckVisible, data, subOrders, onClose }) =&gt; {
20 onClose(); 31 onClose();
21 } 32 }
22 } 33 }
  34 +
  35 + /**
  36 + *
  37 + * @param body 财务审核
  38 + */
  39 + async function doFinancailCheck(body: object) {
  40 + const data = await postServiceOrderFinanceCheckOrder({
  41 + data: body,
  42 + });
  43 + if (data.result === RESPONSE_CODE.SUCCESS) {
  44 + message.success(data.message);
  45 + onClose();
  46 + }
  47 + }
  48 +
  49 + /**
  50 + * 审核类型
  51 + */
  52 + function checkType(check: string) {
  53 + if (orderCheckType === check) {
  54 + return true;
  55 + }
  56 + return false;
  57 + }
  58 +
23 return ( 59 return (
24 <ModalForm<{ 60 <ModalForm<{
25 name: string; 61 name: string;
@@ -40,30 +76,74 @@ export default ({ setCheckVisible, data, subOrders, onClose }) =&gt; { @@ -40,30 +76,74 @@ export default ({ setCheckVisible, data, subOrders, onClose }) =&gt; {
40 }} 76 }}
41 submitter={{ 77 submitter={{
42 render: (props, defaultDoms) => { 78 render: (props, defaultDoms) => {
43 - return [ 79 + let myDoms = [];
  80 + myDoms.push(
44 <Button 81 <Button
45 key="驳回" 82 key="驳回"
46 onClick={() => { 83 onClick={() => {
47 - doCheck({  
48 - flag: false,  
49 - ids: subOrderIds, 84 + if (checkType(CHECK_TYPE.NORMAL)) {
  85 + doCheck({
  86 + flag: false,
  87 + ids: subOrderIds,
  88 + externalProcurement: 0,
  89 + checkNotes: form.getFieldValue('name'),
  90 + });
  91 + return;
  92 + }
  93 +
  94 + //财务审核
  95 + doFinancailCheck({
50 checkNotes: form.getFieldValue('name'), 96 checkNotes: form.getFieldValue('name'),
  97 + ids: subOrderIds,
  98 + checkPassOrReject: false,
51 }); 99 });
52 }} 100 }}
53 > 101 >
54 驳回 102 驳回
55 </Button>, 103 </Button>,
56 - defaultDoms[1],  
57 - ]; 104 + );
  105 +
  106 + //如果不是财务审核,那么显示这个外部采购
  107 + if (checkType(CHECK_TYPE.NORMAL)) {
  108 + myDoms.push(
  109 + <Button
  110 + key="外部采购"
  111 + onClick={() => {
  112 + doCheck({
  113 + flag: false,
  114 + ids: subOrderIds,
  115 + externalProcurement: 1,
  116 + checkNotes: form.getFieldValue('name'),
  117 + });
  118 + }}
  119 + >
  120 + 外部采购
  121 + </Button>,
  122 + );
  123 + }
  124 +
  125 + //确认
  126 + myDoms.push(defaultDoms[1]);
  127 + return myDoms;
58 }, 128 },
59 }} 129 }}
60 submitTimeout={2000} 130 submitTimeout={2000}
61 onFinish={async (values) => { 131 onFinish={async (values) => {
62 - //审核通过  
63 - return doCheck({  
64 - flag: true,  
65 - ids: subOrderIds, 132 + if (checkType(CHECK_TYPE.NORMAL)) {
  133 + //审核通过
  134 + return doCheck({
  135 + flag: true,
  136 + ids: subOrderIds,
  137 + externalProcurement: 0,
  138 + checkNotes: values.name,
  139 + });
  140 + }
  141 +
  142 + //财务审核
  143 + return doFinancailCheck({
66 checkNotes: values.name, 144 checkNotes: values.name,
  145 + ids: subOrderIds,
  146 + checkPassOrReject: true,
67 }); 147 });
68 }} 148 }}
69 onOpenChange={setCheckVisible} 149 onOpenChange={setCheckVisible}
src/pages/Order/components/DeliverModal.tsx
1 import { RESPONSE_CODE } from '@/constants/enum'; 1 import { RESPONSE_CODE } from '@/constants/enum';
2 -import { postServiceOrderSendProduct } from '@/services'; 2 +import {
  3 + postServiceOrderSendProduct,
  4 + postServiceOrderSupplierSendOrder,
  5 +} from '@/services';
3 import { enumToSelect } from '@/utils'; 6 import { enumToSelect } from '@/utils';
4 import { 7 import {
5 ProColumns, 8 ProColumns,
@@ -11,17 +14,31 @@ import { @@ -11,17 +14,31 @@ import {
11 import { Button, Input, InputNumber, Modal, Select, message } from 'antd'; 14 import { Button, Input, InputNumber, Modal, Select, message } from 'antd';
12 import { cloneDeep } from 'lodash'; 15 import { cloneDeep } from 'lodash';
13 import { useEffect, useRef, useState } from 'react'; 16 import { useEffect, useRef, useState } from 'react';
14 -import { LOGISTICS_STATUS_OPTIONS } from '../constant'; 17 +import { CHECK_TYPE, LOGISTICS_STATUS_OPTIONS } from '../constant';
15 18
16 const DeliverModal = ({ 19 const DeliverModal = ({
17 data: propsData, 20 data: propsData,
18 isSendProduct, 21 isSendProduct,
19 setVisible, 22 setVisible,
  23 + sendType,
20 onClose, 24 onClose,
21 }) => { 25 }) => {
22 const [data, setData] = useState(propsData || {}); 26 const [data, setData] = useState(propsData || {});
23 const form = useRef(); 27 const form = useRef();
24 28
  29 + /**
  30 + * 是供应商发货还是普通发货
  31 + * @param typeString
  32 + * @returns
  33 + */
  34 + function optType(typeString: string) {
  35 + if (sendType === typeString) {
  36 + return true;
  37 + }
  38 +
  39 + return false;
  40 + }
  41 +
25 useEffect(() => { 42 useEffect(() => {
26 setData(propsData); 43 setData(propsData);
27 }, [propsData]); 44 }, [propsData]);
@@ -126,7 +143,9 @@ const DeliverModal = ({ @@ -126,7 +143,9 @@ const DeliverModal = ({
126 logisticsMethod: item.logisticsMethod, 143 logisticsMethod: item.logisticsMethod,
127 serialNumber: item.serialNumber, 144 serialNumber: item.serialNumber,
128 packageNumber: 145 packageNumber:
129 - item.packageNumber === undefined ? 1 : item.packageNumber, 146 + item.packageNumber === null || item.packageNumber === undefined
  147 + ? 1
  148 + : item.packageNumber,
130 }; 149 };
131 }); 150 });
132 let body = { id: data[0].mainOrderId, list: list, flag: false }; 151 let body = { id: data[0].mainOrderId, list: list, flag: false };
@@ -134,7 +153,13 @@ const DeliverModal = ({ @@ -134,7 +153,13 @@ const DeliverModal = ({
134 body.flag = true; 153 body.flag = true;
135 } 154 }
136 //发货请求 155 //发货请求
137 - const res = await postServiceOrderSendProduct({ data: body }); 156 + let res;
  157 + if (optType(CHECK_TYPE.SUPPLIER)) {
  158 + res = await postServiceOrderSupplierSendOrder({ data: body });
  159 + } else {
  160 + res = await postServiceOrderSendProduct({ data: body });
  161 + }
  162 +
138 if (res.result === RESPONSE_CODE.SUCCESS) { 163 if (res.result === RESPONSE_CODE.SUCCESS) {
139 message.success(res.message); 164 message.success(res.message);
140 onClose(); 165 onClose();
src/pages/Order/components/FinancialDrawer.tsx
@@ -4,17 +4,35 @@ import { @@ -4,17 +4,35 @@ import {
4 postServiceOrderEditOrder, 4 postServiceOrderEditOrder,
5 postServiceOrderInvoicing, 5 postServiceOrderInvoicing,
6 } from '@/services'; 6 } from '@/services';
  7 +import { enumToSelect } from '@/utils';
7 import { 8 import {
8 DrawerForm, 9 DrawerForm,
9 ProFormDatePicker, 10 ProFormDatePicker,
  11 + ProFormSelect,
10 ProFormText, 12 ProFormText,
11 ProFormTextArea, 13 ProFormTextArea,
12 } from '@ant-design/pro-components'; 14 } from '@ant-design/pro-components';
13 import { Form, message } from 'antd'; 15 import { Form, message } from 'antd';
  16 +import { useEffect, useState } from 'react';
  17 +import { INVOCING_STATUS_OPTIONS_OLD } from '../constant';
14 18
15 -export default ({ mainOrder, subOrders, isEdit, onClose }) => { 19 +export default ({
  20 + mainOrder,
  21 + subOrders,
  22 + isEdit,
  23 + isMainOrder,
  24 + cancel,
  25 + onClose,
  26 +}) => {
  27 + const [invoicingStatus, setInvoicingStatus] = useState('');
16 const subIds = subOrders.map((item) => item.id); 28 const subIds = subOrders.map((item) => item.id);
17 - console.log(subOrders); 29 + useEffect(() => {
  30 + // 在组件挂载或数据变化时,更新组件状态
  31 + if (mainOrder) {
  32 + setInvoicingStatus(subOrders[0]?.invoicingStatus);
  33 + }
  34 + }, [mainOrder]);
  35 +
18 const [form] = Form.useForm<{ name: string; company: string }>(); 36 const [form] = Form.useForm<{ name: string; company: string }>();
19 return ( 37 return (
20 <DrawerForm<{ 38 <DrawerForm<{
@@ -44,6 +62,8 @@ export default ({ mainOrder, subOrders, isEdit, onClose }) =&gt; { @@ -44,6 +62,8 @@ export default ({ mainOrder, subOrders, isEdit, onClose }) =&gt; {
44 subIds: subIds, 62 subIds: subIds,
45 collectMoneyTime: form.getFieldValue('collectMoneyTime'), 63 collectMoneyTime: form.getFieldValue('collectMoneyTime'),
46 invoicingNotes: form.getFieldValue('invoicingNotes'), 64 invoicingNotes: form.getFieldValue('invoicingNotes'),
  65 + invoicingStatus: form.getFieldValue('invoicingStatus'),
  66 + mainorderOrSubOrderInvoicing: isMainOrder,
47 }; 67 };
48 if (isEdit) { 68 if (isEdit) {
49 res = await postServiceOrderEditOrder({ data: body }); 69 res = await postServiceOrderEditOrder({ data: body });
@@ -56,9 +76,25 @@ export default ({ mainOrder, subOrders, isEdit, onClose }) =&gt; { @@ -56,9 +76,25 @@ export default ({ mainOrder, subOrders, isEdit, onClose }) =&gt; {
56 } 76 }
57 }} 77 }}
58 onOpenChange={(val) => { 78 onOpenChange={(val) => {
59 - return !val && onClose(); 79 + return !val && cancel();
60 }} 80 }}
61 > 81 >
  82 + {isMainOrder ? (
  83 + <ProFormSelect
  84 + placeholder="选择是否需要开票"
  85 + name="invoicingStatus"
  86 + width="lg"
  87 + label="是否需要开票"
  88 + options={enumToSelect(INVOCING_STATUS_OPTIONS_OLD)}
  89 + onChange={setInvoicingStatus}
  90 + initialValue={subOrders[0]?.invoicingStatus}
  91 + // disabled={mainInfoDisbled}
  92 + rules={[{ required: true, message: '是否需要开票必填' }]}
  93 + />
  94 + ) : (
  95 + ''
  96 + )}
  97 +
62 <ProFormText 98 <ProFormText
63 width="lg" 99 width="lg"
64 name="invoiceIdentificationNumber" 100 name="invoiceIdentificationNumber"
@@ -80,26 +116,35 @@ export default ({ mainOrder, subOrders, isEdit, onClose }) =&gt; { @@ -80,26 +116,35 @@ export default ({ mainOrder, subOrders, isEdit, onClose }) =&gt; {
80 placeholder="请输入开户银行账号" 116 placeholder="请输入开户银行账号"
81 disabled 117 disabled
82 /> 118 />
83 - <ProFormDatePicker  
84 - width="lg"  
85 - name="invoicingTime"  
86 - label="开票时间"  
87 - disabled={isEdit}  
88 - rules={[{ required: !isEdit ? true : false, message: '这是必填项' }]}  
89 - initialValue={subOrders[0].invoicingTime}  
90 - />  
91 - <ProFormDatePicker  
92 - width="lg"  
93 - name="collectMoneyTime"  
94 - label="收款时间"  
95 - initialValue={subOrders[0].collectMoneyTime}  
96 - /> 119 +
  120 + {invoicingStatus !== 'UN_INVOICE'
  121 + ? [
  122 + <ProFormDatePicker
  123 + key="invoicingTime"
  124 + width="lg"
  125 + name="invoicingTime"
  126 + label="开票时间"
  127 + disabled={isEdit}
  128 + rules={[
  129 + { required: !isEdit ? true : false, message: '这是必填项' },
  130 + ]}
  131 + initialValue={subOrders[0]?.invoicingTime}
  132 + />,
  133 + <ProFormDatePicker
  134 + key="collectMoneyTime"
  135 + width="lg"
  136 + name="collectMoneyTime"
  137 + label="收款时间"
  138 + initialValue={subOrders[0]?.collectMoneyTime}
  139 + />,
  140 + ]
  141 + : ''}
97 142
98 <ProFormTextArea 143 <ProFormTextArea
99 width="lg" 144 width="lg"
100 name="invoicingNotes" 145 name="invoicingNotes"
101 label="备注" 146 label="备注"
102 - initialValue={subOrders[0].invoicingNotes} 147 + initialValue={subOrders[0]?.invoicingNotes}
103 /> 148 />
104 </DrawerForm> 149 </DrawerForm>
105 ); 150 );
src/pages/Order/components/HistoryModal.tsx
@@ -2,7 +2,11 @@ import { postServiceOrderQueryHistoryOrderRecord } from &#39;@/services&#39;; @@ -2,7 +2,11 @@ import { postServiceOrderQueryHistoryOrderRecord } from &#39;@/services&#39;;
2 import { enumValueToLabel, formatDateTime } from '@/utils'; 2 import { enumValueToLabel, formatDateTime } from '@/utils';
3 import { Button, Col, Empty, Flex, Modal, Row, Spin } from 'antd'; 3 import { Button, Col, Empty, Flex, Modal, Row, Spin } from 'antd';
4 import { useEffect, useState } from 'react'; 4 import { useEffect, useState } from 'react';
5 -import { HISTORY_OPT_TYPE, ORDER_STATUS_OPTIONS } from '../constant'; 5 +import {
  6 + FINANCIAL_STATUS_OPTIONS,
  7 + HISTORY_OPT_TYPE,
  8 + ORDER_STATUS_OPTIONS,
  9 +} from '../constant';
6 10
7 export default ({ subOrders, onClose }) => { 11 export default ({ subOrders, onClose }) => {
8 let subOrderIds = subOrders?.map((subOrder: any) => { 12 let subOrderIds = subOrders?.map((subOrder: any) => {
@@ -50,7 +54,7 @@ export default ({ subOrders, onClose }) =&gt; { @@ -50,7 +54,7 @@ export default ({ subOrders, onClose }) =&gt; {
50 <Row className="max-h-[500px] overflow-auto" gutter={[0, 14]}> 54 <Row className="max-h-[500px] overflow-auto" gutter={[0, 14]}>
51 {data.map((item) => { 55 {data.map((item) => {
52 return ( 56 return (
53 - <Col span={24} key="key"> 57 + <Col span={24} key={i}>
54 <Flex vertical> 58 <Flex vertical>
55 <div> 59 <div>
56 <span className="py-2 text-[#5E5E5E]"> 60 <span className="py-2 text-[#5E5E5E]">
@@ -64,7 +68,7 @@ export default ({ subOrders, onClose }) =&gt; { @@ -64,7 +68,7 @@ export default ({ subOrders, onClose }) =&gt; {
64 <Flex vertical> 68 <Flex vertical>
65 {item.historySubOrderRecordDto?.map((history) => { 69 {item.historySubOrderRecordDto?.map((history) => {
66 return ( 70 return (
67 - <div className="py-1" key="key"> 71 + <div className="py-1" key={history.id}>
68 <span className="pr-2 text-[#5E5E5E]"> 72 <span className="pr-2 text-[#5E5E5E]">
69 {formatDateTime(history.createTime)} 73 {formatDateTime(history.createTime)}
70 </span> 74 </span>
@@ -88,7 +92,10 @@ export default ({ subOrders, onClose }) =&gt; { @@ -88,7 +92,10 @@ export default ({ subOrders, onClose }) =&gt; {
88 history.status, 92 history.status,
89 ORDER_STATUS_OPTIONS, 93 ORDER_STATUS_OPTIONS,
90 ) === undefined 94 ) === undefined
91 - ? '已开票' 95 + ? enumValueToLabel(
  96 + history.status,
  97 + FINANCIAL_STATUS_OPTIONS,
  98 + )
92 : enumValueToLabel( 99 : enumValueToLabel(
93 history.status, 100 history.status,
94 ORDER_STATUS_OPTIONS, 101 ORDER_STATUS_OPTIONS,
src/pages/Order/components/OrderDrawer.tsx
@@ -27,6 +27,7 @@ import { cloneDeep } from &#39;lodash&#39;; @@ -27,6 +27,7 @@ import { cloneDeep } from &#39;lodash&#39;;
27 import { useEffect, useRef, useState } from 'react'; 27 import { useEffect, useRef, useState } from 'react';
28 import { 28 import {
29 INVOCING_STATUS_OPTIONS, 29 INVOCING_STATUS_OPTIONS,
  30 + INVOCING_STATUS_OPTIONS_OLD,
30 PAYMENT_CHANNEL_OPTIONS, 31 PAYMENT_CHANNEL_OPTIONS,
31 PAYMENT_METHOD_OPTIONS, 32 PAYMENT_METHOD_OPTIONS,
32 PRODUCT_BELONG_DEPARTMENT_OPTIONS, 33 PRODUCT_BELONG_DEPARTMENT_OPTIONS,
@@ -44,6 +45,17 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; { @@ -44,6 +45,17 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; {
44 return orderOptType === type; 45 return orderOptType === type;
45 } 46 }
46 47
  48 + /**
  49 + *
  50 + * @returns 获取开票选项
  51 + */
  52 + function getInvoicingSelect() {
  53 + if (optType('edit') || optType('copy')) {
  54 + return enumToSelect(INVOCING_STATUS_OPTIONS_OLD);
  55 + }
  56 + return enumToSelect(INVOCING_STATUS_OPTIONS);
  57 + }
  58 +
47 const fileList: any = []; 59 const fileList: any = [];
48 60
49 useEffect(() => { 61 useEffect(() => {
@@ -77,6 +89,11 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; { @@ -77,6 +89,11 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; {
77 }); 89 });
78 } 90 }
79 91
  92 + //复制的时候,如果是不需要开票,要把开票信息清空
  93 + if (optType('copy') && data.invoicingStatus === 'UN_INVOICE') {
  94 + data.invoiceIdentificationNumber = undefined;
  95 + }
  96 +
80 if (subOrders !== undefined && subOrders.length > 0) { 97 if (subOrders !== undefined && subOrders.length > 0) {
81 data.list = subOrders; 98 data.list = subOrders;
82 } 99 }
@@ -259,6 +276,7 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; { @@ -259,6 +276,7 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; {
259 > 276 >
260 <h2>订单基本信息</h2> 277 <h2>订单基本信息</h2>
261 <ProFormText 278 <ProFormText
  279 + key="id"
262 name="id" 280 name="id"
263 width="lg" 281 width="lg"
264 disabled 282 disabled
@@ -268,6 +286,7 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; { @@ -268,6 +286,7 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; {
268 /> 286 />
269 <ProFormSelect 287 <ProFormSelect
270 name="salesCode" 288 name="salesCode"
  289 + key="salesCode"
271 width="lg" 290 width="lg"
272 showSearch 291 showSearch
273 label="销售代表" 292 label="销售代表"
@@ -277,7 +296,7 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; { @@ -277,7 +296,7 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; {
277 // disabled={mainInfoDisbled} 296 // disabled={mainInfoDisbled}
278 /> 297 />
279 <ProFormSelect 298 <ProFormSelect
280 - key="key" 299 + key="customerName"
281 label="收货人" 300 label="收货人"
282 width="lg" 301 width="lg"
283 showSearch 302 showSearch
@@ -372,6 +391,7 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; { @@ -372,6 +391,7 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; {
372 /> 391 />
373 <ProFormText 392 <ProFormText
374 width="lg" 393 width="lg"
  394 + key="customerContactNumber"
375 name="customerContactNumber" 395 name="customerContactNumber"
376 label="联系方式" 396 label="联系方式"
377 placeholder="请输入联系方式" 397 placeholder="请输入联系方式"
@@ -380,6 +400,7 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; { @@ -380,6 +400,7 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; {
380 /> 400 />
381 <ProFormText 401 <ProFormText
382 width="lg" 402 width="lg"
  403 + key="institution"
383 name="institution" 404 name="institution"
384 label="单位" 405 label="单位"
385 placeholder="请输入单位" 406 placeholder="请输入单位"
@@ -388,6 +409,7 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; { @@ -388,6 +409,7 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; {
388 /> 409 />
389 <ProFormText 410 <ProFormText
390 width="lg" 411 width="lg"
  412 + key="institutionContactName"
391 name="institutionContactName" 413 name="institutionContactName"
392 label="单位联系人" 414 label="单位联系人"
393 placeholder="请输入单位联系人" 415 placeholder="请输入单位联系人"
@@ -396,6 +418,7 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; { @@ -396,6 +418,7 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; {
396 /> 418 />
397 <ProFormTextArea 419 <ProFormTextArea
398 width="lg" 420 width="lg"
  421 + key="customerShippingAddress"
399 name="customerShippingAddress" 422 name="customerShippingAddress"
400 label="收货地址" 423 label="收货地址"
401 placeholder="请输入收货地址" 424 placeholder="请输入收货地址"
@@ -406,6 +429,7 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; { @@ -406,6 +429,7 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; {
406 <ProFormDigit 429 <ProFormDigit
407 name="totalPayment" 430 name="totalPayment"
408 width="lg" 431 width="lg"
  432 + key="totalPayment"
409 label="支付总额(¥)" 433 label="支付总额(¥)"
410 rules={[{ required: true, message: '支付总额必填' }]} 434 rules={[{ required: true, message: '支付总额必填' }]}
411 tooltip="点击计算,合计所有子订单金额" 435 tooltip="点击计算,合计所有子订单金额"
@@ -428,6 +452,7 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; { @@ -428,6 +452,7 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; {
428 placeholder="请输入支付渠道" 452 placeholder="请输入支付渠道"
429 name="paymentChannel" 453 name="paymentChannel"
430 width="lg" 454 width="lg"
  455 + key="paymentChannel"
431 label="支付渠道" 456 label="支付渠道"
432 options={enumToSelect(PAYMENT_CHANNEL_OPTIONS)} 457 options={enumToSelect(PAYMENT_CHANNEL_OPTIONS)}
433 rules={[{ required: true, message: '支付渠道必填' }]} 458 rules={[{ required: true, message: '支付渠道必填' }]}
@@ -437,6 +462,7 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; { @@ -437,6 +462,7 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; {
437 placeholder="请输入支付方式" 462 placeholder="请输入支付方式"
438 name="paymentMethod" 463 name="paymentMethod"
439 width="lg" 464 width="lg"
  465 + key="paymentMethod"
440 label="支付方式" 466 label="支付方式"
441 options={enumToSelect(PAYMENT_METHOD_OPTIONS)} 467 options={enumToSelect(PAYMENT_METHOD_OPTIONS)}
442 rules={[{ required: true, message: '支付方式必填' }]} 468 rules={[{ required: true, message: '支付方式必填' }]}
@@ -446,8 +472,9 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; { @@ -446,8 +472,9 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; {
446 placeholder="选择是否需要开票" 472 placeholder="选择是否需要开票"
447 name="invoicingStatus" 473 name="invoicingStatus"
448 width="lg" 474 width="lg"
  475 + key="invoicingStatus"
449 label="是否需要开票" 476 label="是否需要开票"
450 - options={enumToSelect(INVOCING_STATUS_OPTIONS)} 477 + options={getInvoicingSelect()}
451 // disabled={mainInfoDisbled} 478 // disabled={mainInfoDisbled}
452 onChange={(_, option) => { 479 onChange={(_, option) => {
453 setInvoicingStatus(option.value); 480 setInvoicingStatus(option.value);
@@ -463,6 +490,7 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; { @@ -463,6 +490,7 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; {
463 width="lg" 490 width="lg"
464 name="invoiceIdentificationNumber" 491 name="invoiceIdentificationNumber"
465 label="开票信息" 492 label="开票信息"
  493 + key="invoiceIdentificationNumber"
466 // disabled={mainInfoDisbled} 494 // disabled={mainInfoDisbled}
467 hidden={invoicingStatus === 'UN_INVOICE'} 495 hidden={invoicingStatus === 'UN_INVOICE'}
468 placeholder="请输入开票信息" 496 placeholder="请输入开票信息"
@@ -477,6 +505,7 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; { @@ -477,6 +505,7 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; {
477 {getUserInfo().roleSmallVO?.code === 'admin' ? ( 505 {getUserInfo().roleSmallVO?.code === 'admin' ? (
478 <ProFormDateTimePicker 506 <ProFormDateTimePicker
479 width="lg" 507 width="lg"
  508 + key="invoicingTime"
480 name="invoicingTime" 509 name="invoicingTime"
481 // disabled={mainInfoDisbled} 510 // disabled={mainInfoDisbled}
482 hidden={invoicingStatus === 'UN_INVOICE'} 511 hidden={invoicingStatus === 'UN_INVOICE'}
@@ -489,6 +518,7 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; { @@ -489,6 +518,7 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; {
489 <ProFormText 518 <ProFormText
490 width="lg" 519 width="lg"
491 name="bank" 520 name="bank"
  521 + key="bank"
492 label="开户银行" 522 label="开户银行"
493 // disabled={mainInfoDisbled} 523 // disabled={mainInfoDisbled}
494 hidden={invoicingStatus === 'UN_INVOICE'} 524 hidden={invoicingStatus === 'UN_INVOICE'}
@@ -496,6 +526,7 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; { @@ -496,6 +526,7 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; {
496 /> 526 />
497 <ProFormText 527 <ProFormText
498 width="lg" 528 width="lg"
  529 + key="bankAccountNumber"
499 name="bankAccountNumber" 530 name="bankAccountNumber"
500 hidden={invoicingStatus === 'UN_INVOICE'} 531 hidden={invoicingStatus === 'UN_INVOICE'}
501 label="银行账号" 532 label="银行账号"
@@ -506,6 +537,7 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; { @@ -506,6 +537,7 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; {
506 width="lg" 537 width="lg"
507 name="notes" 538 name="notes"
508 label="备注" 539 label="备注"
  540 + key="notes"
509 // disabled={mainInfoDisbled} 541 // disabled={mainInfoDisbled}
510 placeholder="请输入备注" 542 placeholder="请输入备注"
511 rules={[ 543 rules={[
@@ -651,7 +683,7 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; { @@ -651,7 +683,7 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; {
651 }} 683 }}
652 />, 684 />,
653 <ProFormText 685 <ProFormText
654 - key="productCode" 686 + key={'productCode' + listMeta.index}
655 width="lg" 687 width="lg"
656 name="productCode" 688 name="productCode"
657 disabled 689 disabled
@@ -666,7 +698,7 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; { @@ -666,7 +698,7 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; {
666 placeholder="未输入商品名称" 698 placeholder="未输入商品名称"
667 />, 699 />,
668 <ProFormText 700 <ProFormText
669 - key="parameters" 701 + key={'parameters' + listMeta.index}
670 width="lg" 702 width="lg"
671 name="parameters" 703 name="parameters"
672 label="商品参数" 704 label="商品参数"
@@ -674,7 +706,7 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; { @@ -674,7 +706,7 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; {
674 rules={[{ required: true, message: '商品参数必填' }]} 706 rules={[{ required: true, message: '商品参数必填' }]}
675 />, 707 />,
676 <ProFormDigit 708 <ProFormDigit
677 - key="quantity" 709 + key={'quantity' + listMeta.index}
678 width="lg" 710 width="lg"
679 name="quantity" 711 name="quantity"
680 label="商品数量" 712 label="商品数量"
@@ -688,7 +720,7 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; { @@ -688,7 +720,7 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; {
688 rules={[{ required: true, message: '商品数量必填' }]} 720 rules={[{ required: true, message: '商品数量必填' }]}
689 />, 721 />,
690 <ProFormDigit 722 <ProFormDigit
691 - key="productPrice" 723 + key={'productPrice' + listMeta.index}
692 width="lg" 724 width="lg"
693 name="productPrice" 725 name="productPrice"
694 label="商品单价" 726 label="商品单价"
@@ -702,7 +734,7 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; { @@ -702,7 +734,7 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; {
702 rules={[{ required: true, message: '商品单价必填' }]} 734 rules={[{ required: true, message: '商品单价必填' }]}
703 />, 735 />,
704 <ProFormText 736 <ProFormText
705 - key="unit" 737 + key={'unit' + listMeta.index}
706 width="lg" 738 width="lg"
707 name="unit" 739 name="unit"
708 label="商品单位" 740 label="商品单位"
@@ -712,7 +744,7 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; { @@ -712,7 +744,7 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; {
712 744
713 <ProFormDigit 745 <ProFormDigit
714 width="lg" 746 width="lg"
715 - key="subOrderPayment" 747 + key={'subOrderPayment' + listMeta.index}
716 name="subOrderPayment" 748 name="subOrderPayment"
717 label="子订单金额" 749 label="子订单金额"
718 placeholder="请输入子订单金额" 750 placeholder="请输入子订单金额"
@@ -720,7 +752,7 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; { @@ -720,7 +752,7 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; {
720 rules={[{ required: true, message: '子订单金额必填' }]} 752 rules={[{ required: true, message: '子订单金额必填' }]}
721 />, 753 />,
722 <ProFormSelect 754 <ProFormSelect
723 - key="productBelongBusiness" 755 + key={'productBelongBusiness' + listMeta.index}
724 placeholder="请输入所属事业部" 756 placeholder="请输入所属事业部"
725 name="productBelongBusiness" 757 name="productBelongBusiness"
726 width="lg" 758 width="lg"
@@ -731,7 +763,7 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; { @@ -731,7 +763,7 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; {
731 // disabled={mainInfoDisbled} 763 // disabled={mainInfoDisbled}
732 />, 764 />,
733 <ProFormText 765 <ProFormText
734 - key="notes" 766 + key={'notes' + listMeta.index}
735 width="lg" 767 width="lg"
736 name="notes" 768 name="notes"
737 label="备注" 769 label="备注"
@@ -745,7 +777,7 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; { @@ -745,7 +777,7 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; {
745 />, 777 />,
746 <> 778 <>
747 <ProFormUploadDragger 779 <ProFormUploadDragger
748 - key="filePaths" 780 + key={'filePaths' + listMeta.index}
749 label="附件" 781 label="附件"
750 name="filePaths" 782 name="filePaths"
751 action="/api/service/order/fileProcess" 783 action="/api/service/order/fileProcess"
src/pages/Order/constant.ts
@@ -9,10 +9,12 @@ export const PAYMENT_CHANNEL_OPTIONS = { @@ -9,10 +9,12 @@ export const PAYMENT_CHANNEL_OPTIONS = {
9 }; 9 };
10 10
11 export const PAYMENT_METHOD_OPTIONS = { 11 export const PAYMENT_METHOD_OPTIONS = {
12 - PAYMENT_IN_ADVANCE: '预付',  
13 - CASH_ON_DELIVERY: '货到付款',  
14 UNPAID: '未付款', 12 UNPAID: '未付款',
  13 + TAOBAO_ORDER_HAS_BEEN_PAID: '淘宝订单已付款',
  14 + PAYMENT_IN_ADVANCE: '预付款',
  15 + WITHHOLDING_ADVANCE_DEPOSIT: '扣预存',
15 PLATFORM_SETTLEMENT: '平台结算', 16 PLATFORM_SETTLEMENT: '平台结算',
  17 + CASH_ON_DELIVERY: '货到付款',
16 }; 18 };
17 19
18 export const PRODUCT_BELONG_DEPARTMENT_OPTIONS = { 20 export const PRODUCT_BELONG_DEPARTMENT_OPTIONS = {
@@ -23,13 +25,19 @@ export const PRODUCT_BELONG_DEPARTMENT_OPTIONS = { @@ -23,13 +25,19 @@ export const PRODUCT_BELONG_DEPARTMENT_OPTIONS = {
23 EXPERIMENTAL_CONSUMABLES: '实验耗材事业部门', 25 EXPERIMENTAL_CONSUMABLES: '实验耗材事业部门',
24 }; 26 };
25 27
26 -export const INVOCING_STATUS_OPTIONS = { 28 +export const INVOCING_STATUS_OPTIONS_OLD = {
27 UN_INVOICE: '不需开票', 29 UN_INVOICE: '不需开票',
28 SPECIALLY_INVOICED: '专票', 30 SPECIALLY_INVOICED: '专票',
29 COMMON_INVOICED: '普票', 31 COMMON_INVOICED: '普票',
30 INVOICED: '需要开票', 32 INVOICED: '需要开票',
31 }; 33 };
32 34
  35 +export const INVOCING_STATUS_OPTIONS = {
  36 + UN_INVOICE: '不需开票',
  37 + SPECIALLY_INVOICED: '专票',
  38 + COMMON_INVOICED: '普票',
  39 +};
  40 +
33 export const INVOCING_STATUS = { 41 export const INVOCING_STATUS = {
34 UN_INVOICE: '不需开票', 42 UN_INVOICE: '不需开票',
35 SPECIALLY_INVOICED: '专票', 43 SPECIALLY_INVOICED: '专票',
@@ -38,11 +46,23 @@ export const INVOCING_STATUS = { @@ -38,11 +46,23 @@ export const INVOCING_STATUS = {
38 }; 46 };
39 47
40 /** 48 /**
  49 + * 普通审核
  50 + * 财务审核
  51 + * 采购审核
  52 + */
  53 +export const CHECK_TYPE = {
  54 + NORMAL: 'NORMAL',
  55 + FINALCIAL: 'FINALCIAL',
  56 + PROCURE: 'PROCURE',
  57 + SUPPLIER: 'SUPPLIER',
  58 +};
  59 +
  60 +/**
41 * 是否需要开票 61 * 是否需要开票
42 * @param subOrder 62 * @param subOrder
43 */ 63 */
44 export const getNeedInvoicing = (subOrder: any) => { 64 export const getNeedInvoicing = (subOrder: any) => {
45 - if (subOrder.invoicingTime !== undefined) { 65 + if (subOrder.invoicingTime !== null && subOrder.invoicingTime !== undefined) {
46 return '已开票'; 66 return '已开票';
47 } 67 }
48 if (subOrder.invoicingStatus === 'UN_INVOICE') { 68 if (subOrder.invoicingStatus === 'UN_INVOICE') {
@@ -73,15 +93,26 @@ export const LOGISTICS_STATUS_OPTIONS = { @@ -73,15 +93,26 @@ export const LOGISTICS_STATUS_OPTIONS = {
73 JINGDONG_LOGISTICS: '京东', 93 JINGDONG_LOGISTICS: '京东',
74 SF_EXPRESS: '顺丰', 94 SF_EXPRESS: '顺丰',
75 DEBANG_LOGISTICS: '德邦物流', 95 DEBANG_LOGISTICS: '德邦物流',
  96 + OTHER_LOGISTICS: '其他物流方式',
76 }; 97 };
77 98
78 export const ORDER_STATUS_OPTIONS = { 99 export const ORDER_STATUS_OPTIONS = {
79 UNAUDITED: '未审核', 100 UNAUDITED: '未审核',
80 - AUDIT_FAILED: '审核失败', 101 + FINANCE_PROCESS: '财务已审核',
81 AUDITED: '已审核', 102 AUDITED: '已审核',
  103 + PROCURE_UN_PROCESS: '采购未审核',
  104 + PROCURE_PROCESS: '采购已审核',
  105 + SUPPLIER_WAIT_SHIP: '供应商-待发货',
  106 + SUPPLIER_SHIPPED: '供应商-已发货',
82 WAIT_SHIP: '待发货', 107 WAIT_SHIP: '待发货',
83 SHIPPED: '已发货', 108 SHIPPED: '已发货',
84 CONFIRM_RECEIPT: '确认收货', 109 CONFIRM_RECEIPT: '确认收货',
  110 + AUDIT_FAILED: '审核失败',
  111 +};
  112 +
  113 +export const FINANCIAL_STATUS_OPTIONS = {
  114 + INVOICING: '已开票',
  115 + UN_INVOICING: '取消开票',
85 }; 116 };
86 117
87 export const TAGS_COLOR = new Map<string, string>([ 118 export const TAGS_COLOR = new Map<string, string>([
@@ -95,7 +126,12 @@ export const TAGS_COLOR = new Map&lt;string, string&gt;([ @@ -95,7 +126,12 @@ export const TAGS_COLOR = new Map&lt;string, string&gt;([
95 ['WAIT_SHIP', 'processing'], 126 ['WAIT_SHIP', 'processing'],
96 ['SHIPPED', 'processing'], 127 ['SHIPPED', 'processing'],
97 ['AUDIT_FAILED', 'error'], 128 ['AUDIT_FAILED', 'error'],
98 - ['CONFIRM_RECEIPT', 'success'], 129 + ['CONFIRM_RECEIPT', 'processing'],
  130 + ['FINANCE_PROCESS', 'processing'],
  131 + ['PROCURE_UN_PROCESS', 'processing'],
  132 + ['PROCURE_PROCESS', 'processing'],
  133 + ['SUPPLIER_WAIT_SHIP', 'processing'],
  134 + ['SUPPLIER_SHIPPED', 'processing'],
99 ]); 135 ]);
100 136
101 export const SALES_CODE_OPTIONS = [ 137 export const SALES_CODE_OPTIONS = [
@@ -108,6 +144,7 @@ export const SALES_CODE_OPTIONS = [ @@ -108,6 +144,7 @@ export const SALES_CODE_OPTIONS = [
108 { label: 'HQ-6_smile', value: 'HQ-6_smile' }, 144 { label: 'HQ-6_smile', value: 'HQ-6_smile' },
109 { label: 'HQ-7_Yvonne', value: 'HQ-7_Yvonne' }, 145 { label: 'HQ-7_Yvonne', value: 'HQ-7_Yvonne' },
110 { label: 'HQ-8_Daniel', value: 'HQ-8_Daniel' }, 146 { label: 'HQ-8_Daniel', value: 'HQ-8_Daniel' },
  147 + { label: 'HQ-9_Wendy', value: 'HQ-9_Wendy' },
111 { label: 'W_strong', value: 'W_strong' }, 148 { label: 'W_strong', value: 'W_strong' },
112 { label: 'W-1_Alice', value: 'W-1_Alice' }, 149 { label: 'W-1_Alice', value: 'W-1_Alice' },
113 { label: 'W-2_Demi', value: 'W-2_Demi' }, 150 { label: 'W-2_Demi', value: 'W-2_Demi' },
@@ -133,12 +170,14 @@ export const SALES_CODE_OPTIONS = [ @@ -133,12 +170,14 @@ export const SALES_CODE_OPTIONS = [
133 { label: 'GW-4_Lynn', value: 'GW-4_Lynn' }, 170 { label: 'GW-4_Lynn', value: 'GW-4_Lynn' },
134 { label: 'GW-6_smile', value: 'GW-6_smile' }, 171 { label: 'GW-6_smile', value: 'GW-6_smile' },
135 { label: 'GW-7_Yvonne', value: 'GW-7_Yvonne' }, 172 { label: 'GW-7_Yvonne', value: 'GW-7_Yvonne' },
  173 + { label: 'GW-9_Wendy', value: 'GW-9_Wendy' },
136 { label: 'W-9_Jack', value: 'W-9_Jack' }, 174 { label: 'W-9_Jack', value: 'W-9_Jack' },
137 { label: 'W-8_Andy', value: 'W-8_Andy' }, 175 { label: 'W-8_Andy', value: 'W-8_Andy' },
138 { label: 'CQ_Peter', value: 'CQ_Peter' }, 176 { label: 'CQ_Peter', value: 'CQ_Peter' },
139 { label: 'MA_A_Mao', value: 'MA_A_Mao' }, 177 { label: 'MA_A_Mao', value: 'MA_A_Mao' },
140 { label: 'CQ-2', value: 'CQ-2' }, 178 { label: 'CQ-2', value: 'CQ-2' },
141 { label: 'JJ', value: 'JJ' }, 179 { label: 'JJ', value: 'JJ' },
  180 + { label: 'CQ-3', value: 'CQ-3' },
142 ]; 181 ];
143 182
144 export const HISTORY_OPT_TYPE = new Map<string, string>([ 183 export const HISTORY_OPT_TYPE = new Map<string, string>([
@@ -152,6 +191,11 @@ export const HISTORY_OPT_TYPE = new Map&lt;string, string&gt;([ @@ -152,6 +191,11 @@ export const HISTORY_OPT_TYPE = new Map&lt;string, string&gt;([
152 ['INVOICING', '财务开票'], 191 ['INVOICING', '财务开票'],
153 ['EDIT_ORDER', '财务编辑'], 192 ['EDIT_ORDER', '财务编辑'],
154 ['MODIFY_SEN_INFORMATION', '发货信息编辑'], 193 ['MODIFY_SEN_INFORMATION', '发货信息编辑'],
  194 + ['UN_INVOICING', '财务取消开票'],
  195 + ['FINANCE_CHECK_ORDER', '财务审核'],
  196 + ['PROCURE_CHECK_ORDER', '采购审核'],
  197 + ['SUPPLIER_PRINT', '供应商打印'],
  198 + ['EXTERNAL_PROCUREMENT', '仓库操作外部采购子订单'],
155 ]); 199 ]);
156 200
157 export const MAIN_ORDER_COLUMNS = [ 201 export const MAIN_ORDER_COLUMNS = [
@@ -265,7 +309,7 @@ export const MAIN_ORDER_COLUMNS = [ @@ -265,7 +309,7 @@ export const MAIN_ORDER_COLUMNS = [
265 { 309 {
266 title: '创建日期', 310 title: '创建日期',
267 dataIndex: 'createTime', 311 dataIndex: 'createTime',
268 - valueType: 'dateRange', 312 + valueType: 'dateTimeRange',
269 hideInTable: true, 313 hideInTable: true,
270 search: { 314 search: {
271 transform: (value) => { 315 transform: (value) => {
src/pages/Order/index.less
@@ -91,3 +91,8 @@ @@ -91,3 +91,8 @@
91 border-bottom: 1px solid #d7d6d6; /* 设置行与行之间分割线的颜色 */ 91 border-bottom: 1px solid #d7d6d6; /* 设置行与行之间分割线的颜色 */
92 border-right: 1px solid #d7d6d6; /* 设置行与行之间分割线的颜色 */ 92 border-right: 1px solid #d7d6d6; /* 设置行与行之间分割线的颜色 */
93 } 93 }
  94 +
  95 +//tooltip字体颜色自定义
  96 +// .order-tooltip .ant-tooltip-inner{
  97 +// color: black !important;
  98 +// }
src/pages/Order/index.tsx
@@ -6,6 +6,7 @@ import { @@ -6,6 +6,7 @@ import {
6 } from '@/services'; 6 } from '@/services';
7 import { orderExport } from '@/services/order'; 7 import { orderExport } from '@/services/order';
8 import { enumValueToLabel, formatDateTime } from '@/utils'; 8 import { enumValueToLabel, formatDateTime } from '@/utils';
  9 +import { getUserInfo } from '@/utils/user';
9 import { 10 import {
10 ClockCircleTwoTone, 11 ClockCircleTwoTone,
11 ContainerTwoTone, 12 ContainerTwoTone,
@@ -46,8 +47,10 @@ import HistoryModal from &#39;./components/HistoryModal&#39;; @@ -46,8 +47,10 @@ import HistoryModal from &#39;./components/HistoryModal&#39;;
46 import ImportModal from './components/ImportModal'; 47 import ImportModal from './components/ImportModal';
47 import OrderDrawer from './components/OrderDrawer'; 48 import OrderDrawer from './components/OrderDrawer';
48 import OrderNotesEditModal from './components/OrderNotesEditModal'; 49 import OrderNotesEditModal from './components/OrderNotesEditModal';
  50 +import ProcureCheckModal from './components/ProcureCheckModal';
49 import SubOrderComfirmReceiptImagesModal from './components/SubOrderComfirmReceiptImagesModal'; 51 import SubOrderComfirmReceiptImagesModal from './components/SubOrderComfirmReceiptImagesModal';
50 import { 52 import {
  53 + CHECK_TYPE,
51 LOGISTICS_STATUS_OPTIONS, 54 LOGISTICS_STATUS_OPTIONS,
52 MAIN_ORDER_COLUMNS, 55 MAIN_ORDER_COLUMNS,
53 ORDER_STATUS_OPTIONS, 56 ORDER_STATUS_OPTIONS,
@@ -79,6 +82,8 @@ const OrderPage = () =&gt; { @@ -79,6 +82,8 @@ const OrderPage = () =&gt; {
79 const [isSendProduct, setIsSendProduct] = useState<boolean>(false); 82 const [isSendProduct, setIsSendProduct] = useState<boolean>(false);
80 const [isMainOrder, setIsMainOrder] = useState<boolean>(false); 83 const [isMainOrder, setIsMainOrder] = useState<boolean>(false);
81 const [importModalVisible, setImportModalVisible] = useState<boolean>(false); 84 const [importModalVisible, setImportModalVisible] = useState<boolean>(false);
  85 + const [procureCheckModalVisible, setProcureCheckModalVisible] =
  86 + useState<boolean>(false);
82 const [confirmReceiptVisible, setConfirmReceiptVisible] = 87 const [confirmReceiptVisible, setConfirmReceiptVisible] =
83 useState<boolean>(false); 88 useState<boolean>(false);
84 const [deliverVisible, setDeliverVisible] = useState<boolean>(false); 89 const [deliverVisible, setDeliverVisible] = useState<boolean>(false);
@@ -90,7 +95,7 @@ const OrderPage = () =&gt; { @@ -90,7 +95,7 @@ const OrderPage = () =&gt; {
90 const [orderRow, setOrderRow] = useState<Partial<OrderType>>({}); 95 const [orderRow, setOrderRow] = useState<Partial<OrderType>>({});
91 const [mainOrderAllItemKeys, setMainOrderAllItemKeys] = useState([]); 96 const [mainOrderAllItemKeys, setMainOrderAllItemKeys] = useState([]);
92 const [rolePath, setRolePath] = useState([]); //当前角色权限(新增跟打印按钮) 97 const [rolePath, setRolePath] = useState([]); //当前角色权限(新增跟打印按钮)
93 - const userInfo = JSON.parse(localStorage.getItem('userInfo')); 98 + const userInfo = getUserInfo();
94 // const [tableHeight, setTableHeight] = useState(200); 99 // const [tableHeight, setTableHeight] = useState(200);
95 const [selectedRows, setSelectedRows] = useState({}); 100 const [selectedRows, setSelectedRows] = useState({});
96 const [selectedRowObj, setSelectedRowObj] = useState({}); 101 const [selectedRowObj, setSelectedRowObj] = useState({});
@@ -98,6 +103,7 @@ const OrderPage = () =&gt; { @@ -98,6 +103,7 @@ const OrderPage = () =&gt; {
98 const [selectedRowKeys, setSelectedRowKeys] = useState([]); 103 const [selectedRowKeys, setSelectedRowKeys] = useState([]);
99 const [pageSize, setPageSize] = useState(10); 104 const [pageSize, setPageSize] = useState(10);
100 const [currentPage, setCurrentPage] = useState(1); 105 const [currentPage, setCurrentPage] = useState(1);
  106 + const [orderCheckType, setOrderCheckType] = useState('');
101 const mainTableRef = useRef(); 107 const mainTableRef = useRef();
102 const [messageApi, contextHolder] = message.useMessage(); 108 const [messageApi, contextHolder] = message.useMessage();
103 109
@@ -158,11 +164,31 @@ const OrderPage = () =&gt; { @@ -158,11 +164,31 @@ const OrderPage = () =&gt; {
158 // window.addEventListener('resize', resize); 164 // window.addEventListener('resize', resize);
159 // }); 165 // });
160 166
161 - const onCheckboxChange = (itemKey: never) => {  
162 - const newSelectedItems = selectedItems.includes(itemKey)  
163 - ? selectedItems.filter((key) => key !== itemKey)  
164 - : [...selectedItems, itemKey];  
165 - 167 + const onCheckboxChange = (record: never) => {
  168 + let newSelectedItems = [];
  169 + if (selectedItems.includes(record.id)) {
  170 + newSelectedItems = selectedItems.filter((key) => key !== record.id);
  171 + setSelectedRowKeys([]);
  172 + setSelectedRowObj({
  173 + ...setSelectedRowObj,
  174 + [record.id]: [],
  175 + });
  176 + selectedRowObj[record.id] = [];
  177 + setSelectedRows([]);
  178 + } else {
  179 + newSelectedItems = [...selectedItems, record.id];
  180 + //子订单全部自动选中
  181 + let subIds = record.subOrderInformationLists?.map((item) => {
  182 + return item.id;
  183 + });
  184 + setSelectedRowKeys(subIds);
  185 + setSelectedRowObj({
  186 + ...setSelectedRowObj,
  187 + [record.id]: record.subOrderInformationLists,
  188 + });
  189 + selectedRowObj[record.id] = record.subOrderInformationLists;
  190 + setSelectedRows(record.subOrderInformationLists);
  191 + }
166 setSelectedItems(newSelectedItems); 192 setSelectedItems(newSelectedItems);
167 }; 193 };
168 const handleTableExpand = (mainOrderIds: any) => { 194 const handleTableExpand = (mainOrderIds: any) => {
@@ -306,6 +332,7 @@ const OrderPage = () =&gt; { @@ -306,6 +332,7 @@ const OrderPage = () =&gt; {
306 <div className="whitespace-no-wrap overflow-hidden overflow-ellipsis"> 332 <div className="whitespace-no-wrap overflow-hidden overflow-ellipsis">
307 <Tag 333 <Tag
308 color={ 334 color={
  335 + optRecord.invoicingTime === null ||
309 optRecord.invoicingTime === undefined 336 optRecord.invoicingTime === undefined
310 ? TAGS_COLOR.get(optRecord.invoicingStatus) 337 ? TAGS_COLOR.get(optRecord.invoicingStatus)
311 : 'success' 338 : 'success'
@@ -360,6 +387,7 @@ const OrderPage = () =&gt; { @@ -360,6 +387,7 @@ const OrderPage = () =&gt; {
360 setSelectedRows([cloneDeep(optRecord)]); //克隆一份数据,避免后续修改污染 387 setSelectedRows([cloneDeep(optRecord)]); //克隆一份数据,避免后续修改污染
361 setDeliverVisible(true); 388 setDeliverVisible(true);
362 setIsSendProduct(true); 389 setIsSendProduct(true);
  390 + setOrderCheckType(CHECK_TYPE.NORMAL);
363 }} 391 }}
364 > 392 >
365 发货 393 发货
@@ -368,7 +396,26 @@ const OrderPage = () =&gt; { @@ -368,7 +396,26 @@ const OrderPage = () =&gt; {
368 '' 396 ''
369 )} 397 )}
370 398
371 - {optRecord.subPath.includes('queryAnnex') ? ( 399 + {optRecord.subPath.includes('supplierSendOrder') ? (
  400 + <Button
  401 + className="p-0"
  402 + type="link"
  403 + onClick={() => {
  404 + optRecord.mainOrderId = record.id;
  405 + setSelectedRows([cloneDeep(optRecord)]); //克隆一份数据,避免后续修改污染
  406 + setDeliverVisible(true);
  407 + setIsSendProduct(true);
  408 + setOrderCheckType(CHECK_TYPE.SUPPLIER);
  409 + }}
  410 + >
  411 + 供应商发货
  412 + </Button>
  413 + ) : (
  414 + ''
  415 + )}
  416 +
  417 + {optRecord.subPath.includes('queryAnnex') &&
  418 + optRecord.listAnnex?.length > 0 ? (
372 <Button 419 <Button
373 className="p-0" 420 className="p-0"
374 type="link" 421 type="link"
@@ -409,6 +456,24 @@ const OrderPage = () =&gt; { @@ -409,6 +456,24 @@ const OrderPage = () =&gt; {
409 setOrderPrintVisible(true); 456 setOrderPrintVisible(true);
410 setSelectedRows([optRecord]); 457 setSelectedRows([optRecord]);
411 setOrderRow(record); 458 setOrderRow(record);
  459 + setOrderCheckType(CHECK_TYPE.NORMAL);
  460 + }}
  461 + >
  462 + 打印
  463 + </Button>
  464 + ) : (
  465 + ''
  466 + )}
  467 +
  468 + {optRecord.subPath.includes('supplierPrint') ? (
  469 + <Button
  470 + className="p-0"
  471 + type="link"
  472 + onClick={async () => {
  473 + setOrderPrintVisible(true);
  474 + setSelectedRows([optRecord]);
  475 + setOrderRow(record);
  476 + setOrderCheckType(CHECK_TYPE.SUPPLIER);
412 }} 477 }}
413 > 478 >
414 打印 479 打印
@@ -416,6 +481,7 @@ const OrderPage = () =&gt; { @@ -416,6 +481,7 @@ const OrderPage = () =&gt; {
416 ) : ( 481 ) : (
417 '' 482 ''
418 )} 483 )}
  484 +
419 {optRecord.subPath.includes('editOrder') ? ( 485 {optRecord.subPath.includes('editOrder') ? (
420 <Button 486 <Button
421 className="p-0" 487 className="p-0"
@@ -441,6 +507,7 @@ const OrderPage = () =&gt; { @@ -441,6 +507,7 @@ const OrderPage = () =&gt; {
441 setIsFinalcialEdit(false); 507 setIsFinalcialEdit(false);
442 setOrderRow(record); 508 setOrderRow(record);
443 setSelectedRows([optRecord]); 509 setSelectedRows([optRecord]);
  510 + setIsMainOrder(false);
444 }} 511 }}
445 > 512 >
446 开票 513 开票
@@ -456,6 +523,7 @@ const OrderPage = () =&gt; { @@ -456,6 +523,7 @@ const OrderPage = () =&gt; {
456 setOrderRow(optRecord); 523 setOrderRow(optRecord);
457 setCheckVisible(true); 524 setCheckVisible(true);
458 setSelectedRows([optRecord]); 525 setSelectedRows([optRecord]);
  526 + setOrderCheckType(CHECK_TYPE.NORMAL);
459 }} 527 }}
460 > 528 >
461 审核 529 审核
@@ -464,6 +532,40 @@ const OrderPage = () =&gt; { @@ -464,6 +532,40 @@ const OrderPage = () =&gt; {
464 '' 532 ''
465 )} 533 )}
466 534
  535 + {optRecord.subPath.includes('financeCheckOrder') ? (
  536 + <Button
  537 + className="p-0"
  538 + type="link"
  539 + onClick={() => {
  540 + setOrderRow(optRecord);
  541 + setCheckVisible(true);
  542 + setSelectedRows([optRecord]);
  543 + setOrderCheckType(CHECK_TYPE.FINALCIAL);
  544 + }}
  545 + >
  546 + 财务审核
  547 + </Button>
  548 + ) : (
  549 + ''
  550 + )}
  551 +
  552 + {optRecord.subPath.includes('procureCheckOrder') ? (
  553 + <Button
  554 + className="p-0"
  555 + type="link"
  556 + onClick={() => {
  557 + setOrderRow(optRecord);
  558 + setSelectedRows([optRecord]);
  559 + setOrderCheckType(CHECK_TYPE.PROCURE);
  560 + setProcureCheckModalVisible(true);
  561 + }}
  562 + >
  563 + 采购审核
  564 + </Button>
  565 + ) : (
  566 + ''
  567 + )}
  568 +
467 {optRecord.subPath.includes('rePrintOrder') ? ( 569 {optRecord.subPath.includes('rePrintOrder') ? (
468 <Button 570 <Button
469 className="p-0" 571 className="p-0"
@@ -591,7 +693,7 @@ const OrderPage = () =&gt; { @@ -591,7 +693,7 @@ const OrderPage = () =&gt; {
591 <Flex> 693 <Flex>
592 <Flex> 694 <Flex>
593 <Checkbox 695 <Checkbox
594 - onChange={() => onCheckboxChange(record.id)} 696 + onChange={() => onCheckboxChange(record)}
595 checked={selectedItems.includes(record.id)} 697 checked={selectedItems.includes(record.id)}
596 > 698 >
597 <Space split={<Divider type="vertical" />}> 699 <Space split={<Divider type="vertical" />}>
@@ -607,21 +709,32 @@ const OrderPage = () =&gt; { @@ -607,21 +709,32 @@ const OrderPage = () =&gt; {
607 <span className="text-[#8C8C8C]">代表:</span> 709 <span className="text-[#8C8C8C]">代表:</span>
608 <span className="text-slate-700">{record.salesCode}</span> 710 <span className="text-slate-700">{record.salesCode}</span>
609 </div> 711 </div>
610 - <span> 712 + <div
  713 + title={record.institution}
  714 + className="whitespace-no-wrap overflow-hidden overflow-ellipsis max-w-[150px]"
  715 + >
611 <span className="text-[#8C8C8C]">单位:</span> 716 <span className="text-[#8C8C8C]">单位:</span>
612 <span className="text-slate-700">{record.institution}</span> 717 <span className="text-slate-700">{record.institution}</span>
613 - </span> 718 + </div>
614 <span> 719 <span>
615 <span className="text-[#8C8C8C]">联系人:</span> 720 <span className="text-[#8C8C8C]">联系人:</span>
616 <span className="text-slate-700"> 721 <span className="text-slate-700">
617 {record.institutionContactName + ' '} 722 {record.institutionContactName + ' '}
618 - <ContainerTwoTone  
619 - className="hover:curcor-pointer"  
620 - onClick={() => {  
621 - setDeliverInfoDrawerVisible(true);  
622 - setOrderRow(record);  
623 - }}  
624 - /> 723 + </span>
  724 + </span>
  725 + <span>
  726 + <span className="text-[#8C8C8C]">收货人:</span>
  727 + <span className="text-slate-700">
  728 + {record.customerName + ' '}
  729 + <Tooltip className="order-tooltip" title="详情">
  730 + <ContainerTwoTone
  731 + className="hover:curcor-pointer"
  732 + onClick={() => {
  733 + setDeliverInfoDrawerVisible(true);
  734 + setOrderRow(record);
  735 + }}
  736 + />
  737 + </Tooltip>
625 </span> 738 </span>
626 </span> 739 </span>
627 </Space> 740 </Space>
@@ -636,14 +749,16 @@ const OrderPage = () =&gt; { @@ -636,14 +749,16 @@ const OrderPage = () =&gt; {
636 </span> 749 </span>
637 </div> 750 </div>
638 </div> 751 </div>
639 - <EditTwoTone  
640 - className="hover:curcor-pointer"  
641 - onClick={() => {  
642 - setNotesEditVisible(true);  
643 - setOrderRow(record);  
644 - setIsMainOrder(true);  
645 - }}  
646 - /> 752 + <Tooltip title="编辑">
  753 + <EditTwoTone
  754 + className="hover:curcor-pointer"
  755 + onClick={() => {
  756 + setNotesEditVisible(true);
  757 + setOrderRow(record);
  758 + setIsMainOrder(true);
  759 + }}
  760 + />
  761 + </Tooltip>
647 </Flex> 762 </Flex>
648 </Flex> 763 </Flex>
649 <Flex wrap="wrap" gap="middle" vertical> 764 <Flex wrap="wrap" gap="middle" vertical>
@@ -656,34 +771,38 @@ const OrderPage = () =&gt; { @@ -656,34 +771,38 @@ const OrderPage = () =&gt; {
656 </span> 771 </span>
657 </div> 772 </div>
658 {rolePath?.includes('addOrder') ? ( 773 {rolePath?.includes('addOrder') ? (
659 - <CopyTwoTone  
660 - className="hover:cursor-pointer"  
661 - onClick={() => {  
662 - setOrderOptType('copy');  
663 - setOrderDrawerVisible(true);  
664 - let copy = cloneDeep(record);  
665 - copy.id = undefined;  
666 - copy.subOrderInformationLists?.forEach((item) => {  
667 - item.id = undefined;  
668 - });  
669 - setOrderRow(copy);  
670 - }}  
671 - /> 774 + <Tooltip title="复制">
  775 + <CopyTwoTone
  776 + className="hover:cursor-pointer"
  777 + onClick={() => {
  778 + setOrderOptType('copy');
  779 + setOrderDrawerVisible(true);
  780 + let copy = cloneDeep(record);
  781 + copy.id = undefined;
  782 + copy.subOrderInformationLists?.forEach((item) => {
  783 + item.id = undefined;
  784 + });
  785 + setOrderRow(copy);
  786 + }}
  787 + />
  788 + </Tooltip>
672 ) : ( 789 ) : (
673 '' 790 ''
674 )} 791 )}
675 792
676 - <ClockCircleTwoTone  
677 - className="hover:cursor-pointer"  
678 - onClick={() => {  
679 - setHistoryModalVisible(true);  
680 - if (selectedRowObj[record.id]?.length) {  
681 - setSelectedRows(selectedRowObj[record.id]);  
682 - } else {  
683 - setSelectedRows(record.subOrderInformationLists);  
684 - }  
685 - }}  
686 - /> 793 + <Tooltip title="历史">
  794 + <ClockCircleTwoTone
  795 + className="hover:cursor-pointer"
  796 + onClick={() => {
  797 + setHistoryModalVisible(true);
  798 + if (selectedRowObj[record.id]?.length) {
  799 + setSelectedRows(selectedRowObj[record.id]);
  800 + } else {
  801 + setSelectedRows(record.subOrderInformationLists);
  802 + }
  803 + }}
  804 + />
  805 + </Tooltip>
687 </Flex> 806 </Flex>
688 </Flex> 807 </Flex>
689 <Flex justify="flex-end"> 808 <Flex justify="flex-end">
@@ -700,6 +819,7 @@ const OrderPage = () =&gt; { @@ -700,6 +819,7 @@ const OrderPage = () =&gt; {
700 setSelectedRows(selectedRowObj[record.id]); 819 setSelectedRows(selectedRowObj[record.id]);
701 setDeliverVisible(true); 820 setDeliverVisible(true);
702 setIsSendProduct(true); 821 setIsSendProduct(true);
  822 + setOrderCheckType(CHECK_TYPE.NORMAL);
703 }} 823 }}
704 > 824 >
705 发货 825 发货
@@ -707,6 +827,27 @@ const OrderPage = () =&gt; { @@ -707,6 +827,27 @@ const OrderPage = () =&gt; {
707 ) : ( 827 ) : (
708 '' 828 ''
709 )} 829 )}
  830 +
  831 + {/* 供应商发货 */}
  832 + {record.mainPath.includes('supplierSendOrder') ? (
  833 + <Button
  834 + className="p-0"
  835 + type="link"
  836 + onClick={() => {
  837 + if (!selectedRowObj[record.id]?.length) {
  838 + return message.error('请选择选择子订单');
  839 + }
  840 + setSelectedRows(selectedRowObj[record.id]);
  841 + setDeliverVisible(true);
  842 + setIsSendProduct(true);
  843 + setOrderCheckType(CHECK_TYPE.SUPPLIER);
  844 + }}
  845 + >
  846 + 供应商发货
  847 + </Button>
  848 + ) : (
  849 + ''
  850 + )}
710 {record.mainPath.includes('printOrder') ? ( 851 {record.mainPath.includes('printOrder') ? (
711 <Button 852 <Button
712 className="p-0" 853 className="p-0"
@@ -718,6 +859,27 @@ const OrderPage = () =&gt; { @@ -718,6 +859,27 @@ const OrderPage = () =&gt; {
718 setSelectedRows(selectedRowObj[record.id]); 859 setSelectedRows(selectedRowObj[record.id]);
719 setOrderRow(record); 860 setOrderRow(record);
720 setOrderPrintVisible(true); 861 setOrderPrintVisible(true);
  862 + setOrderCheckType(CHECK_TYPE.NORMAL);
  863 + }}
  864 + >
  865 + 打印
  866 + </Button>
  867 + ) : (
  868 + ''
  869 + )}
  870 +
  871 + {record.mainPath.includes('supplierPrint') ? (
  872 + <Button
  873 + className="p-0"
  874 + type="link"
  875 + onClick={() => {
  876 + if (!selectedRowObj[record.id]?.length) {
  877 + return message.error('请选择选择子订单');
  878 + }
  879 + setSelectedRows(selectedRowObj[record.id]);
  880 + setOrderRow(record);
  881 + setOrderPrintVisible(true);
  882 + setOrderCheckType(CHECK_TYPE.SUPPLIER);
721 }} 883 }}
722 > 884 >
723 打印 885 打印
@@ -725,6 +887,7 @@ const OrderPage = () =&gt; { @@ -725,6 +887,7 @@ const OrderPage = () =&gt; {
725 ) : ( 887 ) : (
726 '' 888 ''
727 )} 889 )}
  890 +
728 {record.mainPath.includes('rePrintOrder') ? ( 891 {record.mainPath.includes('rePrintOrder') ? (
729 <Button 892 <Button
730 className="p-0" 893 className="p-0"
@@ -782,10 +945,14 @@ const OrderPage = () =&gt; { @@ -782,10 +945,14 @@ const OrderPage = () =&gt; {
782 let selectedSubOrders = selectedRowObj[record.id]; 945 let selectedSubOrders = selectedRowObj[record.id];
783 setSelectedRows(selectedSubOrders); 946 setSelectedRows(selectedSubOrders);
784 if (selectedSubOrders === undefined) { 947 if (selectedSubOrders === undefined) {
  948 + setIsMainOrder(true);
785 setSelectedRows(record.subOrderInformationLists); 949 setSelectedRows(record.subOrderInformationLists);
  950 + } else {
  951 + setIsMainOrder(false);
786 } 952 }
787 setOrderRow(record); 953 setOrderRow(record);
788 setFinancialVisible(true); 954 setFinancialVisible(true);
  955 + setIsFinalcialEdit(false);
789 }} 956 }}
790 > 957 >
791 开票 958 开票
@@ -845,6 +1012,38 @@ const OrderPage = () =&gt; { @@ -845,6 +1012,38 @@ const OrderPage = () =&gt; {
845 setSelectedRows(selectedSubOrders); 1012 setSelectedRows(selectedSubOrders);
846 if (selectedSubOrders === undefined) { 1013 if (selectedSubOrders === undefined) {
847 setSelectedRows(record.subOrderInformationLists); 1014 setSelectedRows(record.subOrderInformationLists);
  1015 + }
  1016 + console.log(selectedRows);
  1017 + for (let i = 0; i < selectedRows.length; i++) {
  1018 + if (
  1019 + selectedRows[i].orderStatus !== 'UNAUDITED' &&
  1020 + selectedRows[i].orderStatus !== 'FINANCE_PROCESS'
  1021 + ) {
  1022 + message.error('请选择未审核的子订单进行审核');
  1023 + return;
  1024 + }
  1025 + }
  1026 + setOrderRow(record);
  1027 + setCheckVisible(true);
  1028 + setOrderCheckType(CHECK_TYPE.NORMAL);
  1029 + }}
  1030 + >
  1031 + 审核
  1032 + </Button>
  1033 + ) : (
  1034 + ''
  1035 + )}
  1036 +
  1037 + {/* 财务审核:主订单暂无 */}
  1038 + {record.mainPath.includes('financeCheckOrder') ? (
  1039 + <Button
  1040 + className="p-0"
  1041 + type="link"
  1042 + onClick={() => {
  1043 + let selectedSubOrders = selectedRowObj[record.id];
  1044 + setSelectedRows(selectedSubOrders);
  1045 + if (selectedSubOrders === undefined) {
  1046 + setSelectedRows(record.subOrderInformationLists);
848 console.log( 1047 console.log(
849 'subOrderInformationLists:' + 1048 'subOrderInformationLists:' +
850 record.subOrderInformationLists, 1049 record.subOrderInformationLists,
@@ -853,19 +1052,52 @@ const OrderPage = () =&gt; { @@ -853,19 +1052,52 @@ const OrderPage = () =&gt; {
853 for (let i = 0; i < selectedRows.length; i++) { 1052 for (let i = 0; i < selectedRows.length; i++) {
854 if ( 1053 if (
855 selectedRows[i].orderStatus !== 'UNAUDITED' && 1054 selectedRows[i].orderStatus !== 'UNAUDITED' &&
856 - selectedRows[i].orderStatus !== 'AUDIT_FAILED' 1055 + selectedRows[i].orderStatus !== 'FINANCE_PROCESS'
857 ) { 1056 ) {
858 - message.error(  
859 - '请选择未审核或者审核失败的子订单进行审核',  
860 - ); 1057 + message.error('请选择未审核的子订单进行审核');
861 return; 1058 return;
862 } 1059 }
863 } 1060 }
864 setOrderRow(record); 1061 setOrderRow(record);
865 setCheckVisible(true); 1062 setCheckVisible(true);
  1063 + setOrderCheckType(CHECK_TYPE.FINALCIAL);
866 }} 1064 }}
867 > 1065 >
868 - 审核 1066 + 财务审核
  1067 + </Button>
  1068 + ) : (
  1069 + ''
  1070 + )}
  1071 +
  1072 + {/* 采购审核 */}
  1073 + {record.mainPath.includes('procureCheckOrder') ? (
  1074 + <Button
  1075 + className="p-0"
  1076 + type="link"
  1077 + onClick={() => {
  1078 + let selectedSubOrders = selectedRowObj[record.id];
  1079 + setSelectedRows(selectedSubOrders);
  1080 + if (selectedSubOrders === undefined) {
  1081 + setSelectedRows(record.subOrderInformationLists);
  1082 + console.log(
  1083 + 'subOrderInformationLists:' +
  1084 + record.subOrderInformationLists,
  1085 + );
  1086 + }
  1087 + for (let i = 0; i < selectedRows.length; i++) {
  1088 + if (
  1089 + selectedRows[i].orderStatus !== 'PROCURE_UN_PROCESS'
  1090 + ) {
  1091 + message.error('请选择未审核的子订单进行审核');
  1092 + return;
  1093 + }
  1094 + }
  1095 + setOrderRow(record);
  1096 + setProcureCheckModalVisible(true);
  1097 + setOrderCheckType(CHECK_TYPE.PROCURE);
  1098 + }}
  1099 + >
  1100 + 采购审核
869 </Button> 1101 </Button>
870 ) : ( 1102 ) : (
871 '' 1103 ''
@@ -1153,6 +1385,7 @@ const OrderPage = () =&gt; { @@ -1153,6 +1385,7 @@ const OrderPage = () =&gt; {
1153 setCheckVisible={setCheckVisible} 1385 setCheckVisible={setCheckVisible}
1154 data={orderRow} 1386 data={orderRow}
1155 subOrders={selectedRows} 1387 subOrders={selectedRows}
  1388 + orderCheckType={orderCheckType}
1156 onClose={() => { 1389 onClose={() => {
1157 setCheckVisible(false); 1390 setCheckVisible(false);
1158 setOrderRow({}); 1391 setOrderRow({});
@@ -1182,6 +1415,7 @@ const OrderPage = () =&gt; { @@ -1182,6 +1415,7 @@ const OrderPage = () =&gt; {
1182 setVisible={(b: boolean) => { 1415 setVisible={(b: boolean) => {
1183 setDeliverVisible(b); 1416 setDeliverVisible(b);
1184 }} 1417 }}
  1418 + sendType={orderCheckType}
1185 onClose={() => { 1419 onClose={() => {
1186 setDeliverVisible(false); 1420 setDeliverVisible(false);
1187 setOrderRow({}); 1421 setOrderRow({});
@@ -1196,10 +1430,19 @@ const OrderPage = () =&gt; { @@ -1196,10 +1430,19 @@ const OrderPage = () =&gt; {
1196 isEdit={isFinalcialEdit} 1430 isEdit={isFinalcialEdit}
1197 mainOrder={orderRow} 1431 mainOrder={orderRow}
1198 subOrders={selectedRows} 1432 subOrders={selectedRows}
  1433 + isMainOrder={isMainOrder}
  1434 + cancel={() => {
  1435 + setFinancialVisible(false);
  1436 + setOrderRow({});
  1437 + setIsMainOrder(false);
  1438 + setIsFinalcialEdit(false);
  1439 + }}
1199 onClose={() => { 1440 onClose={() => {
1200 setFinancialVisible(false); 1441 setFinancialVisible(false);
1201 setOrderRow({}); 1442 setOrderRow({});
1202 refreshTable(); 1443 refreshTable();
  1444 + setIsMainOrder(false);
  1445 + setIsFinalcialEdit(false);
1203 }} 1446 }}
1204 /> 1447 />
1205 )} 1448 )}
@@ -1212,6 +1455,7 @@ const OrderPage = () =&gt; { @@ -1212,6 +1455,7 @@ const OrderPage = () =&gt; {
1212 setVisible={(b: boolean) => { 1455 setVisible={(b: boolean) => {
1213 setOrderPrintVisible(b); 1456 setOrderPrintVisible(b);
1214 }} 1457 }}
  1458 + printOptType={orderCheckType}
1215 onClose={() => { 1459 onClose={() => {
1216 setOrderPrintVisible(false); 1460 setOrderPrintVisible(false);
1217 setOrderRow({}); 1461 setOrderRow({});
@@ -1281,6 +1525,30 @@ const OrderPage = () =&gt; { @@ -1281,6 +1525,30 @@ const OrderPage = () =&gt; {
1281 /> 1525 />
1282 )} 1526 )}
1283 1527
  1528 + {deliverInfoDrawerVisible && (
  1529 + <DeliverInfoDrawer
  1530 + data={orderRow}
  1531 + onClose={() => {
  1532 + setDeliverInfoDrawerVisible(false);
  1533 + setOrderRow({});
  1534 + }}
  1535 + />
  1536 + )}
  1537 +
  1538 + {procureCheckModalVisible && (
  1539 + <ProcureCheckModal
  1540 + setCheckVisible={setProcureCheckModalVisible}
  1541 + data={orderRow}
  1542 + subOrders={selectedRows}
  1543 + onClose={() => {
  1544 + setProcureCheckModalVisible(false);
  1545 + setOrderRow({});
  1546 + setSelectedRows({});
  1547 + refreshTable();
  1548 + }}
  1549 + />
  1550 + )}
  1551 +
1284 {contextHolder} 1552 {contextHolder}
1285 </PageContainer> 1553 </PageContainer>
1286 ); 1554 );
src/pages/OrderPrint/OrderPrintModal.tsx
1 import { RESPONSE_CODE } from '@/constants/enum'; 1 import { RESPONSE_CODE } from '@/constants/enum';
2 import '@/pages/OrderPrint/index.less'; 2 import '@/pages/OrderPrint/index.less';
3 -import { postServiceOrderPrintOrder } from '@/services'; 3 +import {
  4 + postServiceOrderPrintOrder,
  5 + postServiceOrderSupplierPrint,
  6 +} from '@/services';
4 import { ExclamationCircleFilled } from '@ant-design/icons'; 7 import { ExclamationCircleFilled } from '@ant-design/icons';
5 import { Modal, Select, Space, message } from 'antd'; 8 import { Modal, Select, Space, message } from 'antd';
6 import printJS from 'print-js'; 9 import printJS from 'print-js';
7 import { useState } from 'react'; 10 import { useState } from 'react';
  11 +import { CHECK_TYPE } from '../Order/constant';
8 import { printerCSS } from './PrinterCSS'; 12 import { printerCSS } from './PrinterCSS';
9 import DalangPrinter from './components/DalangPrinter'; 13 import DalangPrinter from './components/DalangPrinter';
10 import HoujiePrinter from './components/HoujiePrinter'; 14 import HoujiePrinter from './components/HoujiePrinter';
11 import ZhuguangPrinter from './components/ZhuguangPrinter'; 15 import ZhuguangPrinter from './components/ZhuguangPrinter';
12 16
13 -export default ({ mainOrder, subOrders, isRePrint, setVisible, onClose }) => { 17 +export default ({
  18 + mainOrder,
  19 + subOrders,
  20 + isRePrint,
  21 + setVisible,
  22 + printOptType,
  23 + onClose,
  24 +}) => {
14 const [printerType, setPrinterType] = useState('Houjie'); 25 const [printerType, setPrinterType] = useState('Houjie');
15 const { confirm } = Modal; 26 const { confirm } = Modal;
16 const handleChange = (value: string) => { 27 const handleChange = (value: string) => {
17 setPrinterType(value); 28 setPrinterType(value);
18 }; 29 };
  30 + /**
  31 + * 是供应商打印还是普通打印
  32 + * @param typeString
  33 + * @returns
  34 + */
  35 + function optType(typeString: string) {
  36 + if (printOptType === typeString) {
  37 + return true;
  38 + }
  39 +
  40 + return false;
  41 + }
19 const showPropsConfirm = () => { 42 const showPropsConfirm = () => {
20 if (isRePrint) { 43 if (isRePrint) {
21 return; 44 return;
@@ -34,7 +57,19 @@ export default ({ mainOrder, subOrders, isRePrint, setVisible, onClose }) =&gt; { @@ -34,7 +57,19 @@ export default ({ mainOrder, subOrders, isRePrint, setVisible, onClose }) =&gt; {
34 return item.id; 57 return item.id;
35 }), 58 }),
36 }; 59 };
37 - const res = await postServiceOrderPrintOrder({ data: body }); 60 + let res;
  61 + if (optType(CHECK_TYPE.SUPPLIER)) {
  62 + res = await postServiceOrderSupplierPrint({
  63 + data: {
  64 + ids: subOrders.map((item) => {
  65 + return item.id;
  66 + }),
  67 + },
  68 + });
  69 + } else {
  70 + res = await postServiceOrderPrintOrder({ data: body });
  71 + }
  72 +
38 if (res.result === RESPONSE_CODE.SUCCESS) { 73 if (res.result === RESPONSE_CODE.SUCCESS) {
39 message.success(res.message); 74 message.success(res.message);
40 onClose(); 75 onClose();
src/pages/OrderPrint/PrinterCSS.tsx
@@ -8,6 +8,7 @@ export function printerCSS2() { @@ -8,6 +8,7 @@ export function printerCSS2() {
8 8
9 export function printerCSS() { 9 export function printerCSS() {
10 return ` 10 return `
  11 + @page { margin: 0; }
11 body{ 12 body{
12 zoom:1.5 13 zoom:1.5
13 } 14 }
src/pages/OrderPrint/components/HoujiePrinter.tsx
@@ -12,7 +12,7 @@ export default ({ mainOrder, subOrders }) =&gt; { @@ -12,7 +12,7 @@ export default ({ mainOrder, subOrders }) =&gt; {
12 <tr height="30" style={{ height: '15.00pt' }}> 12 <tr height="30" style={{ height: '15.00pt' }}>
13 <td height="30" style={{ height: '15.00pt' }}></td> 13 <td height="30" style={{ height: '15.00pt' }}></td>
14 <td className="xl72">{i + 1}</td> 14 <td className="xl72">{i + 1}</td>
15 - <td className="xl72">{subOrder.id}</td> 15 + <td className="xl72">{mainOrder.id}</td>
16 <td className="xl72">{subOrder.productName}</td> 16 <td className="xl72">{subOrder.productName}</td>
17 <td className="xl72">{subOrder.parameters}</td> 17 <td className="xl72">{subOrder.parameters}</td>
18 <td className="xl72">{subOrder.unit}</td> 18 <td className="xl72">{subOrder.unit}</td>
src/pages/OrderReport/components/OrderDualAxes.tsx 0 → 100644
  1 +import { DualAxes } from '@ant-design/charts';
  2 +
  3 +const OrderDualAxes = ({ data, statisticMethod }) => {
  4 + let yFiledString = '';
  5 + if (statisticMethod === 'MONTH_STATISTICS') {
  6 + yFiledString = 'curTime';
  7 + } else {
  8 + yFiledString = 'curMonth';
  9 + }
  10 + const config = {
  11 + data: [
  12 + data.targetAndTotalPaymentDtoList === undefined
  13 + ? []
  14 + : data.targetAndTotalPaymentDtoList,
  15 + data.orderNumberDtoList === undefined ? [] : data.orderNumberDtoList,
  16 + ],
  17 + xField: yFiledString,
  18 + yField: ['curDayTotalPayment', 'curDayTotalOrderNumber'],
  19 + geometryOptions: [
  20 + {
  21 + geometry: 'line',
  22 + seriesField: 'type',
  23 + lineStyle: {
  24 + lineWidth: 3,
  25 + lineDash: [5, 5],
  26 + },
  27 + smooth: true,
  28 + },
  29 + {
  30 + geometry: 'line',
  31 + seriesField: 'name',
  32 + point: {},
  33 + },
  34 + ],
  35 + };
  36 + return <DualAxes {...config} />;
  37 +};
  38 +
  39 +export default OrderDualAxes;
src/pages/OrderReport/components/OrderStatisticCard.tsx 0 → 100644
  1 +import { RESPONSE_CODE } from '@/constants/enum';
  2 +import { postServiceOrderUpdateReportFormsTarget } from '@/services';
  3 +import Icon, { EditTwoTone } from '@ant-design/icons';
  4 +import { ModalForm, ProCard, ProFormDigit } from '@ant-design/pro-components';
  5 +import { Flex, Form, message } from 'antd';
  6 +import { useState } from 'react';
  7 +
  8 +export default ({ data, statisticsMethod, reFreshData }) => {
  9 + const [edit, setEdit] = useState(false);
  10 + const [form] = Form.useForm<{
  11 + statisticsMethod: string;
  12 + target: number;
  13 + daysOfMonth: number;
  14 + }>();
  15 + const [targetValue, setTargetValue] = useState(0);
  16 +
  17 + const UpBig = () => (
  18 + <svg width="44" height="auto" fill="#d81e06" viewBox="0 0 1024 1024">
  19 + <path
  20 + d="M255.857413 855.291523h-58.175337c-16.996324 0-30.798708-13.802384-30.798707-30.798708V166.084884c0-16.996324 13.802384-30.798708 30.798707-30.798708h58.175337c16.996324 0 30.798708 13.802384 30.798708 30.798708v658.293862c0 16.996324-13.916453 30.912777-30.798708 30.912777z m-54.867327-34.220787h51.331179V169.506962h-51.331179v651.563774zM442.816977 855.291523h-58.175337c-16.996324 0-30.798708-13.802384-30.798708-30.798708V348.367606c0-16.996324 13.802384-30.798708 30.798708-30.798708h58.175337c16.996324 0 30.798708 13.802384 30.798708 30.798708v476.01114c0 16.996324-13.802384 30.912777-30.798708 30.912777z m-54.753259-34.220787h51.33118V351.789685h-51.33118v469.281051zM629.890609 855.291523h-58.175337c-16.996324 0-30.798708-13.802384-30.798707-30.798708V525.517211c0-16.996324 13.802384-30.798708 30.798707-30.798708h58.175337c16.996324 0 30.798708 13.802384 30.798708 30.798708v298.975604c0 16.882255-13.802384 30.798708-30.798708 30.798708z m-54.753258-34.220787h51.33118V528.939289h-51.33118v292.131447zM816.964242 855.291523h-58.175337c-16.996324 0-30.798708-13.802384-30.798708-30.798708V702.552746c0-16.996324 13.802384-30.798708 30.798708-30.798708h58.175337c16.996324 0 30.798708 13.802384 30.798708 30.798708v121.940069c0 16.882255-13.802384 30.798708-30.798708 30.798708z m-54.753258-34.220787h51.331179V705.974825h-51.331179v115.095911zM830.652557 589.167873c-6.38788 0-12.547622-3.650217-15.513424-9.809958l-71.977721-152.168431-162.206527-45.855854c-6.844157-1.939178-11.863206-7.98485-12.433553-15.057146l-10.950651-133.803275-143.271026-77.567116c-8.327058-4.448702-11.406929-14.829007-6.844158-23.156065 4.448702-8.327058 14.829007-11.406929 23.156066-6.844157l151.484015 82.015818c5.133118 2.737663 8.441127 7.870781 8.897404 13.688314l10.722513 131.179682 158.328172 44.715161c4.79091 1.368831 8.669266 4.676841 10.836583 9.125543l75.28573 159.126657c3.992425 8.555197 0.342208 18.707363-8.09892 22.813857-2.509524 1.026624-5.019049 1.59697-7.414503 1.59697z"
  21 + fill="#d81e06"
  22 + ></path>
  23 + <path d="M456.163083 261.903086c-6.844157 0-13.232037-4.106494-15.855631-10.722513l-42.433775-106.426646c-1.825109-4.676841-1.59697-10.038097 0.798485-14.4868 2.395455-4.448702 6.616019-7.642642 11.635068-8.669266l130.153057-26.692213c9.239612-1.939178 18.251086 4.106494 20.190264 13.346106 1.939178 9.239612-4.106494 18.251086-13.346106 20.190264l-110.076863 22.58572 34.905202 87.377074c3.536148 8.783335-0.798485 18.707363-9.58182 22.243511-2.053247 0.798485-4.220564 1.254762-6.387881 1.254763z" />
  24 + </svg>
  25 + );
  26 +
  27 + const DownBig = () => (
  28 + <svg width="44" height="auto" fill="#1DB302" viewBox="0 0 1024 1024">
  29 + <path
  30 + d="M727.990197 852.667929V194.374067c0-16.996324 13.802384-30.798708 30.798708-30.798708h58.175337c16.996324 0 30.798708 13.802384 30.798708 30.798708v658.293862c0 16.996324-13.802384 30.798708-30.798708 30.798708h-58.175337c-16.996324 0-30.798708-13.802384-30.798708-30.798708z m85.551966-654.871783h-51.331179v651.449705h51.331179V197.796146zM540.916565 852.667929V376.65679c0-16.996324 13.802384-30.798708 30.798707-30.798708h58.175337c16.996324 0 30.798708 13.802384 30.798708 30.798708v476.011139c0 16.996324-13.802384 30.798708-30.798708 30.798708h-58.175337c-16.996324 0-30.798708-13.802384-30.798707-30.798708z m85.551966-472.589061h-51.33118v469.166983h51.33118V380.078868zM353.842932 852.667929v-298.861535c0-16.996324 13.802384-30.798708 30.798708-30.798708h58.175337c16.996324 0 30.798708 13.802384 30.798708 30.798708v298.975604c0 16.996324-13.802384 30.798708-30.798708 30.798708h-58.175337c-16.996324-0.114069-30.798708-13.916453-30.798708-30.912777z m85.551966-295.439456h-51.33118v292.131447h51.33118V557.228473zM166.769299 852.667929V730.72786c0-16.996324 13.802384-30.798708 30.798708-30.798708h58.175337c16.996324 0 30.798708 13.802384 30.798708 30.798708v121.940069c0 16.996324-13.802384 30.798708-30.798708 30.798708h-58.175337c-16.882255 0-30.798708-13.802384-30.798708-30.798708z m85.666036-118.51799h-51.33118v115.095912h51.33118V734.149939zM660.347109 189.012811c-0.684416 6.38788-4.904979 12.091345-11.406929 14.37273l-158.898518 55.437674-62.738108 156.503063c-2.623594 6.616019-9.125543 10.950652-16.311909 10.722513l-134.145483-3.308009-92.282054 134.259552c-5.361257 7.756712-15.9697 9.809959-23.840481 4.448702-7.756712-5.361257-9.809959-15.9697-4.448702-23.840481l97.529241-141.902194c3.308009-4.79091 8.783335-7.528573 14.4868-7.414504l131.521889 3.308009 61.255208-152.738777c1.825109-4.562772 5.589395-8.212989 10.266236-9.809958L637.647321 171.103932c8.897404-3.079871 18.707363 1.59697 21.787234 10.494375 0.912554 2.509524 1.140693 5.019049 0.912554 7.414504z"
  31 + fill="#1DB302"
  32 + ></path>
  33 + <path
  34 + d="M295.211318 526.771973c-0.684416 6.730088-5.475326 12.77576-12.433553 14.714938l-110.305001 30.912777c-4.904979 1.368831-10.152167 0.456277-14.258661-2.395455-4.220564-2.851732-6.844157-7.414504-7.414504-12.433552l-12.661691-132.206305c-0.912554-9.353682 6.045672-17.794809 15.399354-18.707364 9.353682-0.912554 17.794809 6.045672 18.707363 15.399354l10.722513 111.901972 90.571015-25.437451c9.125543-2.509524 18.593294 2.737663 21.102818 11.863206 0.684416 2.053247 0.798485 4.220564 0.570347 6.38788z"
  35 + fill="#1DB302"
  36 + />
  37 + </svg>
  38 + );
  39 +
  40 + const UpSmall = () => (
  41 + <svg width="14" height="auto" fill="#d81e06" viewBox="0 0 1024 1024">
  42 + <path d="M511.976976 945.959599c-239.47514 0-433.597349-194.300264-433.597349-433.964716 0-239.677754 194.122209-433.955506 433.597349-433.955506s433.642374 194.277752 433.642374 433.955506C945.61935 751.659335 751.453139 945.959599 511.976976 945.959599zM666.05312 408.869155l-131.822304-132.292002c-2.899026-4.303003-7.091512-7.870248-12.509918-9.766434-2.876514-1.137916-5.952572-1.64957-9.119705-1.582031-0.222057 0-0.401136-0.112564-0.623193-0.112564-0.289596 0-0.535189 0.13303-0.847298 0.156566-3.03308-0.044002-6.021134 0.423649-8.830109 1.515516-5.507434 1.918699-9.787924 5.528923-12.664438 9.945513L357.945857 408.869155c-9.275247 9.29776-8.562003 25.061792 1.560542 35.184337 10.168594 10.146081 25.463951 10.413164 34.739199 1.11438 0.73678-0.735757 1.471514-1.248434 2.073218-2.073218l89.747024-89.456405 0.245593 399.136489c-0.155543 0.936325 0 1.783623 0 2.76395 0 12.352329 10.992355 22.342868 25.352411 22.342868 14.314007 0 25.976628-9.990538 25.976628-22.342868l0.289596-401.923976 89.771583 89.478917c0.599657 0.825808 1.335415 1.337461 2.049682 2.073218 9.29776 9.29776 24.595164 9.030677 34.740222-1.11438C674.615123 433.930947 675.351903 418.166915 666.05312 408.869155z" />{' '}
  43 + </svg>
  44 + );
  45 +
  46 + const DownSmall = () => (
  47 + <svg width="14" height="auto" fill="#1DB302" viewBox="0 0 1024 1024">
  48 + <path d="M945.61935 512.005117c0 239.677754-194.166211 433.955506-433.642374 433.955506S78.379627 751.682871 78.379627 512.005117c0-239.664452 194.122209-433.964716 433.597349-433.964716S945.61935 272.340665 945.61935 512.005117zM664.492578 579.947532c-10.145058-10.146081-25.442462-10.413164-34.740222-1.115404-0.714268 0.735757-1.450025 1.248434-2.049682 2.073218l-89.771583 89.478917-0.289596-401.923976c0-12.352329-11.661597-22.342868-25.976628-22.342868-14.360056 0-25.352411 9.990538-25.352411 22.342868 0 0.980327-0.155543 1.827625 0 2.76395l-0.245593 399.136489-89.747024-89.456405c-0.602727-0.825808-1.337461-1.338485-2.073218-2.073218-9.275247-9.29776-24.571628-9.030677-34.739199 1.115404-10.123568 10.122545-10.836813 25.886577-1.560542 35.184337l131.689275 132.135436c2.876514 4.415566 7.157004 8.027837 12.664438 9.945513 2.808976 1.091868 5.79703 1.559519 8.830109 1.515516 0.312108 0.022513 0.557702 0.155543 0.847298 0.155543 0.223081 0 0.402159-0.11154 0.623193-0.11154 3.167133 0.067538 6.244214-0.445138 9.119705-1.583055 5.418406-1.895163 9.610892-5.462408 12.509918-9.765411l131.822304-132.292002C675.351903 605.833085 674.615123 590.069053 664.492578 579.947532z" />{' '}
  49 + </svg>
  50 + );
  51 +
  52 + const CardTitle = ({ title }) => {
  53 + return <span className="text-sm text-stone-600">{title}</span>;
  54 + };
  55 +
  56 + const CardContent = ({
  57 + unit = '',
  58 + content = 0,
  59 + sameMonthPercentageChange = -1000,
  60 + editable = false,
  61 + }) => {
  62 + //如果是可编辑的说明是指标,设置指标值,可用在弹窗中的回显
  63 + if (editable) {
  64 + setTargetValue(content);
  65 + }
  66 +
  67 + let trendIcon;
  68 + let trendPercentage;
  69 + if (sameMonthPercentageChange > 0) {
  70 + trendIcon = <Icon component={UpBig} />;
  71 + trendPercentage = (
  72 + <div style={{ minWidth: '130px' }}>
  73 + <span className="text-xs text-stone-500">
  74 + 同比上
  75 + {statisticsMethod === 'MONTH_STATISTICS' ? '个月' : '年'}
  76 + </span>
  77 + <Icon component={UpSmall} />
  78 + <span className="text-[#d81e06]">+{sameMonthPercentageChange}%</span>
  79 + </div>
  80 + );
  81 + }
  82 +
  83 + if (sameMonthPercentageChange < 0) {
  84 + trendIcon = <Icon component={DownBig} />;
  85 + trendPercentage = (
  86 + <div style={{ minWidth: '130px' }}>
  87 + <span className="text-xs text-stone-500">
  88 + 同比上
  89 + {statisticsMethod === 'MONTH_STATISTICS' ? '个月' : '年'}
  90 + </span>
  91 + <Icon component={DownSmall} />
  92 + <span className="text-[#1DB302]">{sameMonthPercentageChange}%</span>
  93 + </div>
  94 + );
  95 + }
  96 +
  97 + if (sameMonthPercentageChange === -1000) {
  98 + trendIcon = '';
  99 + trendPercentage = '';
  100 + }
  101 +
  102 + return (
  103 + <Flex vertical>
  104 + <Flex>
  105 + <Flex align="center">
  106 + <span className="text-base pr-1">{unit}</span>
  107 + <div style={{ width: 'max-content', display: 'flex' }}>
  108 + <span className="text-2xl">
  109 + {content}
  110 + {editable ? (
  111 + <span className="text-xs pl-1">
  112 + {statisticsMethod === 'YEAR_STATISTICS' ? '每年' : '每月'}
  113 + </span>
  114 + ) : (
  115 + ''
  116 + )}
  117 + </span>
  118 + {editable ? (
  119 + <EditTwoTone
  120 + style={{ fontSize: '20px' }}
  121 + onClick={() => {
  122 + setEdit(true);
  123 + }}
  124 + />
  125 + ) : (
  126 + ''
  127 + )}
  128 +
  129 + {/* {editable ? (
  130 + edit ? (
  131 + <InputNumber
  132 + placeholder="请输入指标(¥)"
  133 + width={200}
  134 + value={targetValue}
  135 + max={100000000}
  136 + onChange={(value) => {
  137 + setTargetValue(value);
  138 + }}
  139 + />
  140 + ) : (
  141 + <span className="text-2xl">
  142 + {content}
  143 + {editable ? <span className="text-xs px-1">每月</span> : ''}
  144 + </span>
  145 + )
  146 + ) : (
  147 + ''
  148 + )}
  149 +
  150 + {!editable ? (
  151 + <span className="text-2xl">
  152 + {content}
  153 + {editable ? <span className="text-xs pl-1">每月</span> : ''}
  154 + </span>
  155 + ) : (
  156 + ''
  157 + )} */}
  158 +
  159 + {/* {editable ? (
  160 + edit ? (
  161 + [
  162 + <CheckCircleTwoTone
  163 + key="confirm"
  164 + style={{ fontSize: '20px', paddingLeft: '5px' }}
  165 + onClick={async () => {
  166 + let body = {
  167 + statisticsMethod: statisticsMethod,
  168 + target: targetValue,
  169 + };
  170 + let res = await postServiceOrderUpdateReportFormsTarget(
  171 + { data: body },
  172 + );
  173 + if (res.result === RESPONSE_CODE.SUCCESS) {
  174 + message.success(res.message);
  175 + setEdit(false);
  176 + reFreshData();
  177 + }
  178 + }}
  179 + />,
  180 + <CloseCircleTwoTone
  181 + key="cancel"
  182 + style={{ fontSize: '20px', paddingLeft: '5px' }}
  183 + onClick={async () => {
  184 + setEdit(false);
  185 + }}
  186 + />,
  187 + ]
  188 + ) : (
  189 + <EditTwoTone
  190 + style={{ fontSize: '20px' }}
  191 + onClick={() => {
  192 + setEdit(true);
  193 + }}
  194 + />
  195 + )
  196 + ) : (
  197 + ''
  198 + )} */}
  199 + </div>
  200 + </Flex>
  201 + {trendIcon}
  202 + </Flex>
  203 +
  204 + {trendPercentage}
  205 + </Flex>
  206 + );
  207 + };
  208 +
  209 + return (
  210 + <>
  211 + <ProCard title="" ghost gutter={8}>
  212 + <ProCard
  213 + className="order-statictis-card"
  214 + bordered
  215 + title={<CardTitle title={'总收入'} />}
  216 + >
  217 + <CardContent
  218 + unit="¥"
  219 + content={data.totalPayment}
  220 + sameMonthPercentageChange={data.totalPaymentTrend}
  221 + />
  222 + </ProCard>
  223 + <ProCard
  224 + className="order-statictis-card"
  225 + title={<CardTitle title={'指标'} />}
  226 + bordered
  227 + >
  228 + <CardContent unit="¥" content={data.target} editable={true} />
  229 + </ProCard>
  230 + <ProCard
  231 + className="order-statictis-card"
  232 + title={<CardTitle title={'总订单量'} />}
  233 + bordered
  234 + >
  235 + <CardContent
  236 + unit="单"
  237 + content={data.totalOrderNumber}
  238 + sameMonthPercentageChange={data.totalOrderNumberTrend}
  239 + />
  240 + </ProCard>
  241 + <ProCard
  242 + className="order-statictis-card"
  243 + title={<CardTitle title={'总子订单量'} />}
  244 + bordered
  245 + >
  246 + <CardContent unit="单" content={data.subTotalOrderNumber} />
  247 + </ProCard>
  248 + <ProCard
  249 + className="order-statictis-card"
  250 + title={<CardTitle title={'未审核子订单'} />}
  251 + bordered
  252 + >
  253 + <CardContent unit="单" content={data.unCheckOrderNumber} />
  254 + </ProCard>
  255 + <ProCard
  256 + className="order-statictis-card"
  257 + title={<CardTitle title={'待发货子订单'} />}
  258 + bordered
  259 + >
  260 + <CardContent unit="单" content={data.unSendOrderNumber} />
  261 + </ProCard>
  262 + </ProCard>
  263 +
  264 + <ModalForm<{
  265 + statisticsMethod: string;
  266 + target: number;
  267 + daysOfMonth: number;
  268 + }>
  269 + title="编辑指标"
  270 + width={500}
  271 + form={form}
  272 + open={edit}
  273 + autoFocusFirstInput
  274 + modalProps={{
  275 + destroyOnClose: true,
  276 + onCancel: () => setEdit(false),
  277 + }}
  278 + onFinish={async (values) => {
  279 + values.statisticsMethod = statisticsMethod;
  280 + let res = await postServiceOrderUpdateReportFormsTarget({
  281 + data: values,
  282 + });
  283 + if (res.result === RESPONSE_CODE.SUCCESS) {
  284 + message.success(res.message);
  285 + setEdit(false);
  286 + reFreshData();
  287 + }
  288 + }}
  289 + >
  290 + <ProFormDigit
  291 + width="md"
  292 + name="target"
  293 + label="指标(¥)"
  294 + min={0}
  295 + initialValue={targetValue}
  296 + placeholder="请输入指标"
  297 + rules={[{ required: true, message: '指标必填' }]}
  298 + />
  299 +
  300 + {statisticsMethod === 'MONTH_STATISTICS' ? (
  301 + <ProFormDigit
  302 + width="md"
  303 + name="weekday"
  304 + label={
  305 + statisticsMethod === 'YEAR_STATISTICS'
  306 + ? '每月工作日天数'
  307 + : '本月工作日天数'
  308 + }
  309 + min={0}
  310 + placeholder="工作日天数"
  311 + rules={[{ required: true, message: '工作日天数必填' }]}
  312 + />
  313 + ) : (
  314 + ''
  315 + )}
  316 + </ModalForm>
  317 + </>
  318 + );
  319 +};
src/pages/OrderReport/index.less 0 → 100644
  1 +.order-statictis-card .ant-pro-card-body {
  2 + padding-top: 0;
  3 +}
  4 +
  5 +.order-statictis-card {
  6 + height: 100%;
  7 +}
  8 +
  9 +//将报表卡片的extra左边内容调到适中位置
  10 +#order-dual-axes-card .ant-pro-card-extra {
  11 + width: 60%;
  12 + max-height: 24px;
  13 +}
  14 +
  15 +//报表卡片中tabs作为单选项,去掉多余的margin
  16 +#order-dual-axes-card .ant-tabs-nav {
  17 + margin: 0;
  18 +}
src/pages/OrderReport/index.tsx 0 → 100644
  1 +import { postServiceOrderQueryReportFormsInformation } from '@/services';
  2 +import { enumToSelect } from '@/utils';
  3 +import { getUserInfo } from '@/utils/user';
  4 +import { EllipsisOutlined } from '@ant-design/icons';
  5 +import {
  6 + PageContainer,
  7 + ProCard,
  8 + ProFormSelect,
  9 + QueryFilter,
  10 +} from '@ant-design/pro-components';
  11 +import { history } from '@umijs/max';
  12 +import {
  13 + Avatar,
  14 + Button,
  15 + Dropdown,
  16 + Flex,
  17 + Form,
  18 + Space,
  19 + Spin,
  20 + Tabs,
  21 + TabsProps,
  22 + Tag,
  23 +} from 'antd';
  24 +import { useEffect, useState } from 'react';
  25 +import {
  26 + PRODUCT_BELONG_DEPARTMENT_OPTIONS,
  27 + SALES_CODE_OPTIONS,
  28 +} from '../Order/constant';
  29 +import OrderDualAxes from './components/OrderDualAxes';
  30 +import OrderStatisticCard from './components/OrderStatisticCard';
  31 +import './index.less';
  32 +const userInfo = getUserInfo();
  33 +
  34 +const OrderReportPage = () => {
  35 + const [form] = Form.useForm<{
  36 + salesCode: '';
  37 + productBelongBusiness: '';
  38 + dateRange: '';
  39 + }>();
  40 + const [statisticData, setStatisticData] = useState([]);
  41 + const [loading, setLoading] = useState(false);
  42 + const [statisticsMethod, setStatisticsMethod] = useState('MONTH_STATISTICS');
  43 + const onChange = (key: string) => {
  44 + setStatisticsMethod(key);
  45 + };
  46 +
  47 + /**
  48 + * 加载页面数据
  49 + */
  50 + const loadData = async () => {
  51 + setLoading(true);
  52 + let body = {
  53 + statisticsMethod: '',
  54 + salesCode: form.getFieldValue('salesCode'),
  55 + productBelongBusiness: form.getFieldValue('productBelongBusiness'),
  56 + // beginTime:"",
  57 + // endTime:""
  58 + };
  59 +
  60 + // if(form.getFieldValue("dateRange")!==undefined){
  61 + // body.beginTime=formatDate(form.getFieldValue("dateRange")[0]),
  62 + // body.endTime=formatDate(form.getFieldValue("dateRange")[1])
  63 + // }
  64 + body.statisticsMethod = statisticsMethod;
  65 + const { data } = await postServiceOrderQueryReportFormsInformation({
  66 + data: body,
  67 + });
  68 + if (data !== undefined) {
  69 + setStatisticData(data);
  70 + }
  71 +
  72 + setLoading(false);
  73 + };
  74 +
  75 + useEffect(() => {
  76 + loadData();
  77 + }, [statisticsMethod]);
  78 +
  79 + useEffect(() => {
  80 + loadData();
  81 + }, []);
  82 +
  83 + const items: TabsProps['items'] = [
  84 + {
  85 + key: 'MONTH_STATISTICS',
  86 + label: '本月统计',
  87 + children: '',
  88 + },
  89 + {
  90 + key: 'YEAR_STATISTICS',
  91 + label: '本年统计',
  92 + children: '',
  93 + },
  94 + ];
  95 + return (
  96 + <PageContainer
  97 + header={{
  98 + title: '订单汇总',
  99 + extra: [
  100 + <Avatar key="0" style={{ verticalAlign: 'middle' }} size="large">
  101 + {userInfo?.username}
  102 + </Avatar>,
  103 + <Tag key="nickName">{userInfo?.nickName}</Tag>,
  104 + <Dropdown
  105 + key="dropdown"
  106 + trigger={['click']}
  107 + menu={{
  108 + items: [
  109 + {
  110 + label: '退出登录',
  111 + key: '1',
  112 + onClick: () => {
  113 + localStorage.removeItem('token');
  114 + history.push('/login');
  115 + },
  116 + },
  117 + // {
  118 + // label: '修改密码',
  119 + // key: '2',
  120 + // },
  121 + ],
  122 + }}
  123 + >
  124 + <Button key="4" style={{ padding: '0 8px' }}>
  125 + <EllipsisOutlined />
  126 + </Button>
  127 + </Dropdown>,
  128 + ],
  129 + }}
  130 + >
  131 + <Space direction="vertical" size="middle" className="flex">
  132 + <Spin spinning={loading}>
  133 + <OrderStatisticCard
  134 + data={statisticData}
  135 + statisticsMethod={statisticsMethod}
  136 + reFreshData={loadData}
  137 + />
  138 + </Spin>
  139 +
  140 + <ProCard tooltip="这是提示" bordered>
  141 + <QueryFilter
  142 + split
  143 + className="!p-0 order-statistic-search"
  144 + labelWidth="auto"
  145 + form={form}
  146 + onFinish={async () => {
  147 + loadData();
  148 + return true;
  149 + }}
  150 + >
  151 + <ProFormSelect
  152 + name="salesCode"
  153 + key="salesCode"
  154 + showSearch
  155 + label="销售代表"
  156 + placeholder="请输入销售代表"
  157 + options={SALES_CODE_OPTIONS}
  158 + />
  159 + <ProFormSelect
  160 + key="productBelongBusiness"
  161 + placeholder="请输入所属事业部"
  162 + name="productBelongBusiness"
  163 + label="所属事业部"
  164 + options={enumToSelect(PRODUCT_BELONG_DEPARTMENT_OPTIONS)}
  165 + />
  166 + {/* <ProFormDateRangePicker
  167 + key="dateRange"
  168 + name="dateRange"
  169 + label="时间"
  170 + /> */}
  171 + </QueryFilter>
  172 + </ProCard>
  173 +
  174 + <ProCard
  175 + id="order-dual-axes-card"
  176 + title="统计图表"
  177 + extra={
  178 + <Flex>
  179 + <Tabs defaultActiveKey="1" items={items} onChange={onChange} />
  180 + </Flex>
  181 + }
  182 + bordered
  183 + >
  184 + <Spin spinning={loading}>
  185 + <OrderDualAxes
  186 + data={statisticData}
  187 + statisticMethod={statisticsMethod}
  188 + />
  189 + </Spin>
  190 + </ProCard>
  191 + </Space>
  192 + </PageContainer>
  193 + );
  194 +};
  195 +
  196 +export default OrderReportPage;
src/services/definition.ts
@@ -691,6 +691,19 @@ export interface OrderUpdateVO { @@ -691,6 +691,19 @@ export interface OrderUpdateVO {
691 trackStageInfo?: OrderTrackStageVO; 691 trackStageInfo?: OrderTrackStageVO;
692 } 692 }
693 693
  694 +export interface ProcureCheckOrderDto {
  695 + /**
  696 + * @description
  697 + * 子订单集合
  698 + */
  699 + ids?: Array<number>;
  700 + /**
  701 + * @description
  702 + * 采购人姓名
  703 + */
  704 + supplier?: string;
  705 +}
  706 +
694 export interface ProductInformationDto { 707 export interface ProductInformationDto {
695 /** 708 /**
696 * @description 709 * @description
@@ -730,6 +743,24 @@ export interface QueryMainOrderDto { @@ -730,6 +743,24 @@ export interface QueryMainOrderDto {
730 customerName?: string; 743 customerName?: string;
731 } 744 }
732 745
  746 +export interface QueryReportFormsDto {
  747 + /**
  748 + * @description
  749 + * 所属部门
  750 + */
  751 + productBelongBusiness?: string;
  752 + /**
  753 + * @description
  754 + * 销售代表
  755 + */
  756 + salesCode?: string;
  757 + /**
  758 + * @description
  759 + * 统计方式
  760 + */
  761 + statisticsMethod?: string;
  762 +}
  763 +
733 export interface ResetPwdVO { 764 export interface ResetPwdVO {
734 /** @format int64 */ 765 /** @format int64 */
735 userId?: number; 766 userId?: number;
src/services/demo/typings.d.ts
@@ -54,6 +54,8 @@ declare namespace API { @@ -54,6 +54,8 @@ declare namespace API {
54 /** email */ 54 /** email */
55 email?: string; 55 email?: string;
56 gender?: UserGenderEnum; 56 gender?: UserGenderEnum;
  57 + /**role */
  58 + roleSmallVO: { code: string; id: string; name: string };
57 } 59 }
58 60
59 interface UserInfoVO { 61 interface UserInfoVO {
src/services/request.ts
@@ -35,10 +35,12 @@ import type { @@ -35,10 +35,12 @@ import type {
35 OrderProfitAnalysisVo, 35 OrderProfitAnalysisVo,
36 OrderUnlockFieldApplyVO, 36 OrderUnlockFieldApplyVO,
37 OrderUpdateVO, 37 OrderUpdateVO,
  38 + ProcureCheckOrderDto,
38 ProductInformationDto, 39 ProductInformationDto,
39 QueryAnnexDto, 40 QueryAnnexDto,
40 QueryHistoryRecordDto, 41 QueryHistoryRecordDto,
41 QueryMainOrderDto, 42 QueryMainOrderDto,
  43 + QueryReportFormsDto,
42 ResetPwdVO, 44 ResetPwdVO,
43 ServerResult, 45 ServerResult,
44 SysLogQueryVO, 46 SysLogQueryVO,
@@ -5336,6 +5338,77 @@ export const postServiceOrderFileProcess = /* #__PURE__ */ (() =&gt; { @@ -5336,6 +5338,77 @@ export const postServiceOrderFileProcess = /* #__PURE__ */ (() =&gt; {
5336 return request; 5338 return request;
5337 })(); 5339 })();
5338 5340
  5341 +/** @description request parameter type for postServiceOrderFinanceCheckOrder */
  5342 +export interface PostServiceOrderFinanceCheckOrderOption {
  5343 + /**
  5344 + * @description
  5345 + * dto
  5346 + */
  5347 + body: {
  5348 + /**
  5349 + @description
  5350 + dto */
  5351 + dto: Dto;
  5352 + };
  5353 +}
  5354 +
  5355 +/** @description response type for postServiceOrderFinanceCheckOrder */
  5356 +export interface PostServiceOrderFinanceCheckOrderResponse {
  5357 + /**
  5358 + * @description
  5359 + * OK
  5360 + */
  5361 + 200: ServerResult;
  5362 + /**
  5363 + * @description
  5364 + * Created
  5365 + */
  5366 + 201: any;
  5367 + /**
  5368 + * @description
  5369 + * Unauthorized
  5370 + */
  5371 + 401: any;
  5372 + /**
  5373 + * @description
  5374 + * Forbidden
  5375 + */
  5376 + 403: any;
  5377 + /**
  5378 + * @description
  5379 + * Not Found
  5380 + */
  5381 + 404: any;
  5382 +}
  5383 +
  5384 +export type PostServiceOrderFinanceCheckOrderResponseSuccess =
  5385 + PostServiceOrderFinanceCheckOrderResponse[200];
  5386 +/**
  5387 + * @description
  5388 + * 财务审核订单
  5389 + * @tags 内部订单
  5390 + * @produces *
  5391 + * @consumes application/json
  5392 + */
  5393 +export const postServiceOrderFinanceCheckOrder = /* #__PURE__ */ (() => {
  5394 + const method = 'post';
  5395 + const url = '/service/order/financeCheckOrder';
  5396 + function request(
  5397 + option: PostServiceOrderFinanceCheckOrderOption,
  5398 + ): Promise<PostServiceOrderFinanceCheckOrderResponseSuccess> {
  5399 + return requester(request.url, {
  5400 + method: request.method,
  5401 + ...option,
  5402 + }) as unknown as Promise<PostServiceOrderFinanceCheckOrderResponseSuccess>;
  5403 + }
  5404 +
  5405 + /** http method */
  5406 + request.method = method;
  5407 + /** request url */
  5408 + request.url = url;
  5409 + return request;
  5410 +})();
  5411 +
5339 /** @description request parameter type for postServiceOrderImportExcel */ 5412 /** @description request parameter type for postServiceOrderImportExcel */
5340 export interface PostServiceOrderImportExcelOption { 5413 export interface PostServiceOrderImportExcelOption {
5341 /** 5414 /**
@@ -5620,6 +5693,77 @@ export const postServiceOrderPrintOrder = /* #__PURE__ */ (() =&gt; { @@ -5620,6 +5693,77 @@ export const postServiceOrderPrintOrder = /* #__PURE__ */ (() =&gt; {
5620 return request; 5693 return request;
5621 })(); 5694 })();
5622 5695
  5696 +/** @description request parameter type for postServiceOrderProcureCheckOrder */
  5697 +export interface PostServiceOrderProcureCheckOrderOption {
  5698 + /**
  5699 + * @description
  5700 + * dto
  5701 + */
  5702 + body: {
  5703 + /**
  5704 + @description
  5705 + dto */
  5706 + dto: ProcureCheckOrderDto;
  5707 + };
  5708 +}
  5709 +
  5710 +/** @description response type for postServiceOrderProcureCheckOrder */
  5711 +export interface PostServiceOrderProcureCheckOrderResponse {
  5712 + /**
  5713 + * @description
  5714 + * OK
  5715 + */
  5716 + 200: ServerResult;
  5717 + /**
  5718 + * @description
  5719 + * Created
  5720 + */
  5721 + 201: any;
  5722 + /**
  5723 + * @description
  5724 + * Unauthorized
  5725 + */
  5726 + 401: any;
  5727 + /**
  5728 + * @description
  5729 + * Forbidden
  5730 + */
  5731 + 403: any;
  5732 + /**
  5733 + * @description
  5734 + * Not Found
  5735 + */
  5736 + 404: any;
  5737 +}
  5738 +
  5739 +export type PostServiceOrderProcureCheckOrderResponseSuccess =
  5740 + PostServiceOrderProcureCheckOrderResponse[200];
  5741 +/**
  5742 + * @description
  5743 + * 采购审核订单
  5744 + * @tags 内部订单
  5745 + * @produces *
  5746 + * @consumes application/json
  5747 + */
  5748 +export const postServiceOrderProcureCheckOrder = /* #__PURE__ */ (() => {
  5749 + const method = 'post';
  5750 + const url = '/service/order/procureCheckOrder';
  5751 + function request(
  5752 + option: PostServiceOrderProcureCheckOrderOption,
  5753 + ): Promise<PostServiceOrderProcureCheckOrderResponseSuccess> {
  5754 + return requester(request.url, {
  5755 + method: request.method,
  5756 + ...option,
  5757 + }) as unknown as Promise<PostServiceOrderProcureCheckOrderResponseSuccess>;
  5758 + }
  5759 +
  5760 + /** http method */
  5761 + request.method = method;
  5762 + /** request url */
  5763 + request.url = url;
  5764 + return request;
  5765 +})();
  5766 +
5623 /** @description response type for getServiceOrderProvideInvoicingStatus */ 5767 /** @description response type for getServiceOrderProvideInvoicingStatus */
5624 export interface GetServiceOrderProvideInvoicingStatusResponse { 5768 export interface GetServiceOrderProvideInvoicingStatusResponse {
5625 /** 5769 /**
@@ -6219,6 +6363,78 @@ export const postServiceOrderQueryProductInformation = /* #__PURE__ */ (() =&gt; { @@ -6219,6 +6363,78 @@ export const postServiceOrderQueryProductInformation = /* #__PURE__ */ (() =&gt; {
6219 return request; 6363 return request;
6220 })(); 6364 })();
6221 6365
  6366 +/** @description request parameter type for postServiceOrderQueryReportFormsInformation */
  6367 +export interface PostServiceOrderQueryReportFormsInformationOption {
  6368 + /**
  6369 + * @description
  6370 + * dto
  6371 + */
  6372 + body: {
  6373 + /**
  6374 + @description
  6375 + dto */
  6376 + dto: QueryReportFormsDto;
  6377 + };
  6378 +}
  6379 +
  6380 +/** @description response type for postServiceOrderQueryReportFormsInformation */
  6381 +export interface PostServiceOrderQueryReportFormsInformationResponse {
  6382 + /**
  6383 + * @description
  6384 + * OK
  6385 + */
  6386 + 200: ServerResult;
  6387 + /**
  6388 + * @description
  6389 + * Created
  6390 + */
  6391 + 201: any;
  6392 + /**
  6393 + * @description
  6394 + * Unauthorized
  6395 + */
  6396 + 401: any;
  6397 + /**
  6398 + * @description
  6399 + * Forbidden
  6400 + */
  6401 + 403: any;
  6402 + /**
  6403 + * @description
  6404 + * Not Found
  6405 + */
  6406 + 404: any;
  6407 +}
  6408 +
  6409 +export type PostServiceOrderQueryReportFormsInformationResponseSuccess =
  6410 + PostServiceOrderQueryReportFormsInformationResponse[200];
  6411 +/**
  6412 + * @description
  6413 + * 查询报表
  6414 + * @tags 内部订单
  6415 + * @produces *
  6416 + * @consumes application/json
  6417 + */
  6418 +export const postServiceOrderQueryReportFormsInformation =
  6419 + /* #__PURE__ */ (() => {
  6420 + const method = 'post';
  6421 + const url = '/service/order/queryReportFormsInformation';
  6422 + function request(
  6423 + option: PostServiceOrderQueryReportFormsInformationOption,
  6424 + ): Promise<PostServiceOrderQueryReportFormsInformationResponseSuccess> {
  6425 + return requester(request.url, {
  6426 + method: request.method,
  6427 + ...option,
  6428 + }) as unknown as Promise<PostServiceOrderQueryReportFormsInformationResponseSuccess>;
  6429 + }
  6430 +
  6431 + /** http method */
  6432 + request.method = method;
  6433 + /** request url */
  6434 + request.url = url;
  6435 + return request;
  6436 + })();
  6437 +
6222 /** @description request parameter type for postServiceOrderQueryServiceOrder */ 6438 /** @description request parameter type for postServiceOrderQueryServiceOrder */
6223 export interface PostServiceOrderQueryServiceOrderOption { 6439 export interface PostServiceOrderQueryServiceOrderOption {
6224 /** 6440 /**
@@ -6290,6 +6506,60 @@ export const postServiceOrderQueryServiceOrder = /* #__PURE__ */ (() =&gt; { @@ -6290,6 +6506,60 @@ export const postServiceOrderQueryServiceOrder = /* #__PURE__ */ (() =&gt; {
6290 return request; 6506 return request;
6291 })(); 6507 })();
6292 6508
  6509 +/** @description response type for postServiceOrderQuerySupplier */
  6510 +export interface PostServiceOrderQuerySupplierResponse {
  6511 + /**
  6512 + * @description
  6513 + * OK
  6514 + */
  6515 + 200: ServerResult;
  6516 + /**
  6517 + * @description
  6518 + * Created
  6519 + */
  6520 + 201: any;
  6521 + /**
  6522 + * @description
  6523 + * Unauthorized
  6524 + */
  6525 + 401: any;
  6526 + /**
  6527 + * @description
  6528 + * Forbidden
  6529 + */
  6530 + 403: any;
  6531 + /**
  6532 + * @description
  6533 + * Not Found
  6534 + */
  6535 + 404: any;
  6536 +}
  6537 +
  6538 +export type PostServiceOrderQuerySupplierResponseSuccess =
  6539 + PostServiceOrderQuerySupplierResponse[200];
  6540 +/**
  6541 + * @description
  6542 + * 提供供应商名单
  6543 + * @tags 内部订单
  6544 + * @produces *
  6545 + * @consumes application/json
  6546 + */
  6547 +export const postServiceOrderQuerySupplier = /* #__PURE__ */ (() => {
  6548 + const method = 'post';
  6549 + const url = '/service/order/querySupplier';
  6550 + function request(): Promise<PostServiceOrderQuerySupplierResponseSuccess> {
  6551 + return requester(request.url, {
  6552 + method: request.method,
  6553 + }) as unknown as Promise<PostServiceOrderQuerySupplierResponseSuccess>;
  6554 + }
  6555 +
  6556 + /** http method */
  6557 + request.method = method;
  6558 + /** request url */
  6559 + request.url = url;
  6560 + return request;
  6561 +})();
  6562 +
6293 /** @description request parameter type for postServiceOrderSendProduct */ 6563 /** @description request parameter type for postServiceOrderSendProduct */
6294 export interface PostServiceOrderSendProductOption { 6564 export interface PostServiceOrderSendProductOption {
6295 /** 6565 /**
@@ -6361,6 +6631,148 @@ export const postServiceOrderSendProduct = /* #__PURE__ */ (() =&gt; { @@ -6361,6 +6631,148 @@ export const postServiceOrderSendProduct = /* #__PURE__ */ (() =&gt; {
6361 return request; 6631 return request;
6362 })(); 6632 })();
6363 6633
  6634 +/** @description request parameter type for postServiceOrderSupplierPrint */
  6635 +export interface PostServiceOrderSupplierPrintOption {
  6636 + /**
  6637 + * @description
  6638 + * dto
  6639 + */
  6640 + body: {
  6641 + /**
  6642 + @description
  6643 + dto */
  6644 + dto: Dto;
  6645 + };
  6646 +}
  6647 +
  6648 +/** @description response type for postServiceOrderSupplierPrint */
  6649 +export interface PostServiceOrderSupplierPrintResponse {
  6650 + /**
  6651 + * @description
  6652 + * OK
  6653 + */
  6654 + 200: ServerResult;
  6655 + /**
  6656 + * @description
  6657 + * Created
  6658 + */
  6659 + 201: any;
  6660 + /**
  6661 + * @description
  6662 + * Unauthorized
  6663 + */
  6664 + 401: any;
  6665 + /**
  6666 + * @description
  6667 + * Forbidden
  6668 + */
  6669 + 403: any;
  6670 + /**
  6671 + * @description
  6672 + * Not Found
  6673 + */
  6674 + 404: any;
  6675 +}
  6676 +
  6677 +export type PostServiceOrderSupplierPrintResponseSuccess =
  6678 + PostServiceOrderSupplierPrintResponse[200];
  6679 +/**
  6680 + * @description
  6681 + * 供应商打印
  6682 + * @tags 内部订单
  6683 + * @produces *
  6684 + * @consumes application/json
  6685 + */
  6686 +export const postServiceOrderSupplierPrint = /* #__PURE__ */ (() => {
  6687 + const method = 'post';
  6688 + const url = '/service/order/supplierPrint';
  6689 + function request(
  6690 + option: PostServiceOrderSupplierPrintOption,
  6691 + ): Promise<PostServiceOrderSupplierPrintResponseSuccess> {
  6692 + return requester(request.url, {
  6693 + method: request.method,
  6694 + ...option,
  6695 + }) as unknown as Promise<PostServiceOrderSupplierPrintResponseSuccess>;
  6696 + }
  6697 +
  6698 + /** http method */
  6699 + request.method = method;
  6700 + /** request url */
  6701 + request.url = url;
  6702 + return request;
  6703 +})();
  6704 +
  6705 +/** @description request parameter type for postServiceOrderSupplierSendOrder */
  6706 +export interface PostServiceOrderSupplierSendOrderOption {
  6707 + /**
  6708 + * @description
  6709 + * dto
  6710 + */
  6711 + body: {
  6712 + /**
  6713 + @description
  6714 + dto */
  6715 + dto: Dto;
  6716 + };
  6717 +}
  6718 +
  6719 +/** @description response type for postServiceOrderSupplierSendOrder */
  6720 +export interface PostServiceOrderSupplierSendOrderResponse {
  6721 + /**
  6722 + * @description
  6723 + * OK
  6724 + */
  6725 + 200: ServerResult;
  6726 + /**
  6727 + * @description
  6728 + * Created
  6729 + */
  6730 + 201: any;
  6731 + /**
  6732 + * @description
  6733 + * Unauthorized
  6734 + */
  6735 + 401: any;
  6736 + /**
  6737 + * @description
  6738 + * Forbidden
  6739 + */
  6740 + 403: any;
  6741 + /**
  6742 + * @description
  6743 + * Not Found
  6744 + */
  6745 + 404: any;
  6746 +}
  6747 +
  6748 +export type PostServiceOrderSupplierSendOrderResponseSuccess =
  6749 + PostServiceOrderSupplierSendOrderResponse[200];
  6750 +/**
  6751 + * @description
  6752 + * 供应商发货
  6753 + * @tags 内部订单
  6754 + * @produces *
  6755 + * @consumes application/json
  6756 + */
  6757 +export const postServiceOrderSupplierSendOrder = /* #__PURE__ */ (() => {
  6758 + const method = 'post';
  6759 + const url = '/service/order/supplierSendOrder';
  6760 + function request(
  6761 + option: PostServiceOrderSupplierSendOrderOption,
  6762 + ): Promise<PostServiceOrderSupplierSendOrderResponseSuccess> {
  6763 + return requester(request.url, {
  6764 + method: request.method,
  6765 + ...option,
  6766 + }) as unknown as Promise<PostServiceOrderSupplierSendOrderResponseSuccess>;
  6767 + }
  6768 +
  6769 + /** http method */
  6770 + request.method = method;
  6771 + /** request url */
  6772 + request.url = url;
  6773 + return request;
  6774 +})();
  6775 +
6364 /** @description request parameter type for postServiceOrderUpdateAnnex */ 6776 /** @description request parameter type for postServiceOrderUpdateAnnex */
6365 export interface PostServiceOrderUpdateAnnexOption { 6777 export interface PostServiceOrderUpdateAnnexOption {
6366 /** 6778 /**
@@ -6503,6 +6915,77 @@ export const postServiceOrderUpdateOrder = /* #__PURE__ */ (() =&gt; { @@ -6503,6 +6915,77 @@ export const postServiceOrderUpdateOrder = /* #__PURE__ */ (() =&gt; {
6503 return request; 6915 return request;
6504 })(); 6916 })();
6505 6917
  6918 +/** @description request parameter type for postServiceOrderUpdateReportFormsTarget */
  6919 +export interface PostServiceOrderUpdateReportFormsTargetOption {
  6920 + /**
  6921 + * @description
  6922 + * dto
  6923 + */
  6924 + body: {
  6925 + /**
  6926 + @description
  6927 + dto */
  6928 + dto: Dto;
  6929 + };
  6930 +}
  6931 +
  6932 +/** @description response type for postServiceOrderUpdateReportFormsTarget */
  6933 +export interface PostServiceOrderUpdateReportFormsTargetResponse {
  6934 + /**
  6935 + * @description
  6936 + * OK
  6937 + */
  6938 + 200: ServerResult;
  6939 + /**
  6940 + * @description
  6941 + * Created
  6942 + */
  6943 + 201: any;
  6944 + /**
  6945 + * @description
  6946 + * Unauthorized
  6947 + */
  6948 + 401: any;
  6949 + /**
  6950 + * @description
  6951 + * Forbidden
  6952 + */
  6953 + 403: any;
  6954 + /**
  6955 + * @description
  6956 + * Not Found
  6957 + */
  6958 + 404: any;
  6959 +}
  6960 +
  6961 +export type PostServiceOrderUpdateReportFormsTargetResponseSuccess =
  6962 + PostServiceOrderUpdateReportFormsTargetResponse[200];
  6963 +/**
  6964 + * @description
  6965 + * 修改指标
  6966 + * @tags 内部订单
  6967 + * @produces *
  6968 + * @consumes application/json
  6969 + */
  6970 +export const postServiceOrderUpdateReportFormsTarget = /* #__PURE__ */ (() => {
  6971 + const method = 'post';
  6972 + const url = '/service/order/updateReportFormsTarget';
  6973 + function request(
  6974 + option: PostServiceOrderUpdateReportFormsTargetOption,
  6975 + ): Promise<PostServiceOrderUpdateReportFormsTargetResponseSuccess> {
  6976 + return requester(request.url, {
  6977 + method: request.method,
  6978 + ...option,
  6979 + }) as unknown as Promise<PostServiceOrderUpdateReportFormsTargetResponseSuccess>;
  6980 + }
  6981 +
  6982 + /** http method */
  6983 + request.method = method;
  6984 + /** request url */
  6985 + request.url = url;
  6986 + return request;
  6987 +})();
  6988 +
6506 /** @description request parameter type for postServiceOrderViewImages */ 6989 /** @description request parameter type for postServiceOrderViewImages */
6507 export interface PostServiceOrderViewImagesOption { 6990 export interface PostServiceOrderViewImagesOption {
6508 /** 6991 /**
src/utils/index.ts
@@ -55,11 +55,23 @@ function formatDateTime(inputDateTime: string) { @@ -55,11 +55,23 @@ function formatDateTime(inputDateTime: string) {
55 return formattedDateTime; 55 return formattedDateTime;
56 } 56 }
57 57
  58 +function formatdate(inputDateTime: string) {
  59 + const parsedDateTime = new Date(inputDateTime);
  60 +
  61 + const year = parsedDateTime.getFullYear();
  62 + const month = String(parsedDateTime.getMonth() + 1).padStart(2, '0');
  63 + const day = String(parsedDateTime.getDate()).padStart(2, '0');
  64 +
  65 + const formattedDate = `${year}-${month}-${day}`;
  66 + return formattedDate;
  67 +}
  68 +
58 function formatSalesCode(salesCode: any) { 69 function formatSalesCode(salesCode: any) {
  70 + console.log('in');
59 let newSalesCode = salesCode; 71 let newSalesCode = salesCode;
60 if (newSalesCode.indexOf('_')) { 72 if (newSalesCode.indexOf('_')) {
61 newSalesCode = newSalesCode.split('_'); 73 newSalesCode = newSalesCode.split('_');
62 - if (salesCode?.length === 2) { 74 + if (newSalesCode?.length === 2) {
63 newSalesCode = newSalesCode[1] + '(' + newSalesCode[0] + ')'; 75 newSalesCode = newSalesCode[1] + '(' + newSalesCode[0] + ')';
64 } 76 }
65 } 77 }
@@ -143,6 +155,7 @@ export { @@ -143,6 +155,7 @@ export {
143 enumValueToLabel, 155 enumValueToLabel,
144 formatDateTime, 156 formatDateTime,
145 formatSalesCode, 157 formatSalesCode,
  158 + formatdate,
146 getAliYunOSSFileNameFromUrl, 159 getAliYunOSSFileNameFromUrl,
147 getUserInfo, 160 getUserInfo,
148 }; 161 };
src/utils/user.ts 0 → 100644
  1 +/**
  2 + *
  3 + * @returns 获取本地用户信息
  4 + */
  5 +export const getUserInfo = () => {
  6 + let localUserInfo = localStorage.getItem('userInfo');
  7 +
  8 + if (localUserInfo === null || localUserInfo === undefined) {
  9 + localUserInfo = '{}';
  10 + }
  11 + const userInfo = JSON.parse(localUserInfo);
  12 +
  13 + return userInfo;
  14 +};