Commit 65b3cb5a61b29d47acee4ce6a8f9820e9b92283d

Authored by 曾国涛
1 parent 4fff2654

feat(product): 新增产品申领功能

- 添加产品申领页面和相关组件
- 实现产品申领的新增、修改和删除功能
- 添加产品申领的审核功能
- 优化产品申领列表的展示和搜索功能
src/pages/product/procure/components/AddOrUpdate.tsx
1 -import { postProcureBillAddOrModify } from '@/services'; 1 +import {
  2 + postOrderErpTicketsUpload,
  3 + postProcureBillAddOrModify,
  4 +} from '@/services';
2 import { useModel } from '@@/exports'; 5 import { useModel } from '@@/exports';
  6 +import { UploadOutlined } from '@ant-design/icons';
3 import { 7 import {
  8 + ActionType,
4 EditableProTable, 9 EditableProTable,
5 ModalForm, 10 ModalForm,
6 ProCard, 11 ProCard,
@@ -11,7 +16,7 @@ import { @@ -11,7 +16,7 @@ import {
11 ProFormSwitch, 16 ProFormSwitch,
12 ProFormTextArea, 17 ProFormTextArea,
13 } from '@ant-design/pro-components'; 18 } from '@ant-design/pro-components';
14 -import { Button, Form, message } from 'antd'; 19 +import { Button, Form, Upload, message } from 'antd';
15 import React, { useEffect, useRef, useState } from 'react'; 20 import React, { useEffect, useRef, useState } from 'react';
16 21
17 export default ({ record, onfinish }) => { 22 export default ({ record, onfinish }) => {
@@ -21,7 +26,7 @@ export default ({ record, onfinish }) => { @@ -21,7 +26,7 @@ export default ({ record, onfinish }) => {
21 const formRef = useRef(null); 26 const formRef = useRef(null);
22 const editorFormRef = useRef(null); 27 const editorFormRef = useRef(null);
23 const { getProducts } = useModel('enum'); 28 const { getProducts } = useModel('enum');
24 - 29 + const actionRef = useRef<ActionType>();
25 // 使用 useEffect 为 procureBillDetailList 中的每个元素添加 key 30 // 使用 useEffect 为 procureBillDetailList 中的每个元素添加 key
26 useEffect(() => { 31 useEffect(() => {
27 if (record?.procureBillDetailList) { 32 if (record?.procureBillDetailList) {
@@ -90,14 +95,133 @@ export default ({ record, onfinish }) =&gt; { @@ -90,14 +95,133 @@ export default ({ record, onfinish }) =&gt; {
90 }, 95 },
91 { 96 {
92 title: '备注', 97 title: '备注',
93 - dataIndex: 'created_at', 98 + dataIndex: 'notes',
94 valueType: 'textarea', 99 valueType: 'textarea',
95 }, 100 },
96 { 101 {
97 title: '附件', 102 title: '附件',
98 - dataIndex: 'annex',  
99 - render: () => {},  
100 - renderFormItem: () => {}, 103 + dataIndex: 'annexUpload',
  104 + renderFormItem: (_, { record }) => (
  105 + <Upload
  106 + fileList={
  107 + record.annexList?.map((url) => ({
  108 + uid: url,
  109 + name: url.split('/').pop(),
  110 + status: 'done',
  111 + url,
  112 + })) || []
  113 + }
  114 + onPreview={(file) => {
  115 + window.open(file.url || file.thumbUrl); // 打开文件预览
  116 + }}
  117 + customRequest={async (options) => {
  118 + const { file, onSuccess, onError } = options;
  119 +
  120 + const formData = new FormData();
  121 + formData.append('file', file);
  122 +
  123 + try {
  124 + const res = await postOrderErpTicketsUpload({
  125 + data: formData,
  126 + headers: { 'Content-Type': 'multipart/form-data' },
  127 + });
  128 +
  129 + if (res.message === '成功') {
  130 + message.success(`${file.name} 上传成功`);
  131 +
  132 + // 更新文件列表
  133 + const currentData = formRef.current?.getFieldValue(
  134 + 'procureBillDetailList',
  135 + );
  136 + const currentRow = currentData.find(
  137 + (row) => row.key === record.key,
  138 + );
  139 + const existingAnnex = currentRow?.annexList || []; // 取现有的 annex 数据
  140 +
  141 + const updatedAnnex = [...existingAnnex, res.data]; // 合并新的文件 URL
  142 +
  143 + // 更新表单数据
  144 + const updatedData = currentData.map((row) =>
  145 + row.key === record.key
  146 + ? { ...row, annexList: updatedAnnex }
  147 + : row,
  148 + );
  149 + formRef.current?.setFieldValue(
  150 + 'procureBillDetailList',
  151 + updatedData,
  152 + );
  153 +
  154 + onSuccess?.('上传成功');
  155 + } else {
  156 + message.error(`${file.name} 上传失败`);
  157 + onError?.(new Error('上传失败'));
  158 + }
  159 + } catch (error) {
  160 + message.error(`${file.name} 上传错误`);
  161 + onError?.(error);
  162 + }
  163 + }}
  164 + onRemove={(file) => {
  165 + const currentData =
  166 + formRef.current?.getFieldValue('procureBillDetailList') || [];
  167 + const updatedData = currentData.map((row) => {
  168 + if (row.key === record.key) {
  169 + return {
  170 + ...row,
  171 + annexList: row.annexList.filter((url) => url !== file.url), // 移除对应文件 URL
  172 + };
  173 + }
  174 + return row;
  175 + });
  176 +
  177 + formRef.current?.setFieldsValue({
  178 + procureBillDetailList: updatedData,
  179 + });
  180 +
  181 + // 触发状态更新
  182 + setProcessedRecord((prevRecord) => ({
  183 + ...prevRecord,
  184 + procureBillDetailList: updatedData,
  185 + }));
  186 + }}
  187 + >
  188 + <Button icon={<UploadOutlined />}>上传附件</Button>
  189 + </Upload>
  190 + ),
  191 + render: (_, record) => (
  192 + <div>
  193 + {record.annexList?.map((url, index) => {
  194 + const shortName =
  195 + url.split('/').pop()?.slice(0, 15) || `附件 ${index + 1}`;
  196 + return (
  197 + <a
  198 + key={index}
  199 + href={url}
  200 + target="_blank"
  201 + rel="noopener noreferrer"
  202 + title={url} // 悬停显示完整链接
  203 + style={{
  204 + display: 'block',
  205 + marginBottom: '4px',
  206 + whiteSpace: 'nowrap',
  207 + overflow: 'hidden',
  208 + textOverflow: 'ellipsis',
  209 + maxWidth: '200px', // 限制显示宽度
  210 + }}
  211 + >
  212 + {shortName.length < url.split('/').pop()?.length
  213 + ? `${shortName}...`
  214 + : shortName}
  215 + </a>
  216 + );
  217 + })}
  218 + </div>
  219 + ),
  220 + },
  221 + {
  222 + title: '附件',
  223 + hideInTable: true,
  224 + dataIndex: 'annexList',
101 }, 225 },
102 { 226 {
103 title: '操作', 227 title: '操作',
@@ -144,6 +268,7 @@ export default ({ record, onfinish }) =&gt; { @@ -144,6 +268,7 @@ export default ({ record, onfinish }) =&gt; {
144 } 268 }
145 form={form} 269 form={form}
146 autoFocusFirstInput 270 autoFocusFirstInput
  271 + width={1500}
147 modalProps={{ 272 modalProps={{
148 destroyOnClose: true, 273 destroyOnClose: true,
149 onCancel: () => console.log('run'), 274 onCancel: () => console.log('run'),
@@ -179,6 +304,7 @@ export default ({ record, onfinish }) =&gt; { @@ -179,6 +304,7 @@ export default ({ record, onfinish }) =&gt; {
179 key: `key-${Math.random().toString(36).substr(2, 9)}`, 304 key: `key-${Math.random().toString(36).substr(2, 9)}`,
180 }), 305 }),
181 }} 306 }}
  307 + actionRef={actionRef}
182 toolBarRender={() => [ 308 toolBarRender={() => [
183 <ProFormSwitch 309 <ProFormSwitch
184 key="render" 310 key="render"
src/pages/product/procure/components/Audit.tsx 0 → 100644
  1 +import { RESPONSE_CODE } from '@/constants/enum';
  2 +import { postProcureBillAudit } from '@/services';
  3 +import { ModalForm, ProFormTextArea } from '@ant-design/pro-components';
  4 +import { Button, Form, message } from 'antd';
  5 +
  6 +export default ({ recordId, onClose }) => {
  7 + const [form] = Form.useForm<{ name: string; company: string }>();
  8 + return (
  9 + <ModalForm
  10 + title="审核"
  11 + trigger={<Button type="link">审核</Button>}
  12 + form={form}
  13 + autoFocusFirstInput
  14 + modalProps={{
  15 + destroyOnClose: true,
  16 + onCancel: () => console.log('run'),
  17 + }}
  18 + submitTimeout={2000}
  19 + submitter={{
  20 + searchConfig: {
  21 + submitText: '通过',
  22 + resetText: '取消',
  23 + },
  24 + render: (props, defaultDoms) => {
  25 + return [
  26 + defaultDoms[0],
  27 + <Button
  28 + type={'primary'}
  29 + key="ok"
  30 + onClick={async () => {
  31 + const res = await postProcureBillAudit({
  32 + data: {
  33 + ...form.getFieldsValue(),
  34 + id: recordId,
  35 + passed: false,
  36 + },
  37 + });
  38 + if (res.result === RESPONSE_CODE.SUCCESS) {
  39 + message.success('提交成功');
  40 + }
  41 + props.submit();
  42 + }}
  43 + >
  44 + 驳回
  45 + </Button>,
  46 + <Button
  47 + type={'primary'}
  48 + key="ok"
  49 + onClick={async () => {
  50 + const res = await postProcureBillAudit({
  51 + data: {
  52 + ...form.getFieldsValue(),
  53 + id: recordId,
  54 + passed: true,
  55 + },
  56 + });
  57 + if (res.result === RESPONSE_CODE.SUCCESS) {
  58 + message.success('提交成功');
  59 + }
  60 + props.submit();
  61 + }}
  62 + >
  63 + 通过
  64 + </Button>,
  65 + ];
  66 + },
  67 + }}
  68 + onFinish={async () => {
  69 + onClose();
  70 + return true;
  71 + }}
  72 + >
  73 + <ProFormTextArea name="auditRemarks" label="备注" />
  74 + </ModalForm>
  75 + );
  76 +};
src/pages/product/product/index.tsx
@@ -14,7 +14,6 @@ export default () =&gt; { @@ -14,7 +14,6 @@ export default () =&gt; {
14 title: '编号', 14 title: '编号',
15 dataIndex: 'id', 15 dataIndex: 'id',
16 ellipsis: true, 16 ellipsis: true,
17 - hideInSearch: true,  
18 }, 17 },
19 { 18 {
20 title: '商品名称', 19 title: '商品名称',
@@ -23,6 +22,12 @@ export default () =&gt; { @@ -23,6 +22,12 @@ export default () =&gt; {
23 hideInSearch: true, 22 hideInSearch: true,
24 }, 23 },
25 { 24 {
  25 + title: '商品名称',
  26 + dataIndex: 'nameLike',
  27 + ellipsis: true,
  28 + hideInTable: true,
  29 + },
  30 + {
26 title: '单位', 31 title: '单位',
27 dataIndex: 'baseUnitName', 32 dataIndex: 'baseUnitName',
28 ellipsis: true, 33 ellipsis: true,
@@ -40,33 +45,38 @@ export default () =&gt; { @@ -40,33 +45,38 @@ export default () =&gt; {
40 ellipsis: true, 45 ellipsis: true,
41 hideInSearch: true, 46 hideInSearch: true,
42 }, 47 },
  48 +
43 { 49 {
44 title: '操作', 50 title: '操作',
45 valueType: 'option', 51 valueType: 'option',
46 key: 'option', 52 key: 'option',
47 render: (text, record) => [ 53 render: (text, record) => [
48 - <AddOrUpdate  
49 - key={'addOrUpdate'}  
50 - record={record}  
51 - onFinish={() => {  
52 - actionRef.current?.reload();  
53 - }}  
54 - />,  
55 - <ButtonConfirm  
56 - key="delete"  
57 - className="p-0"  
58 - title={'确认删除该记录?'}  
59 - text="删除"  
60 - onConfirm={async () => {  
61 - let res = await postProductDelete({  
62 - query: { id: record.id },  
63 - });  
64 - if (res) {  
65 - message.success(res.message); 54 + record.paths?.includes('UPDATE') && (
  55 + <AddOrUpdate
  56 + key={'addOrUpdate'}
  57 + record={record}
  58 + onFinish={() => {
66 actionRef.current?.reload(); 59 actionRef.current?.reload();
67 - }  
68 - }}  
69 - />, 60 + }}
  61 + />
  62 + ),
  63 + record.paths?.includes('UPDATE') && (
  64 + <ButtonConfirm
  65 + key="delete"
  66 + className="p-0"
  67 + title={'确认删除该记录?'}
  68 + text="删除"
  69 + onConfirm={async () => {
  70 + let res = await postProductDelete({
  71 + query: { id: record.id },
  72 + });
  73 + if (res) {
  74 + message.success(res.message);
  75 + actionRef.current?.reload();
  76 + }
  77 + }}
  78 + />
  79 + ),
70 ], 80 ],
71 }, 81 },
72 ]; 82 ];
src/pages/product/productCollect/index.tsx
1 import ButtonConfirm from '@/components/ButtomConfirm'; 1 import ButtonConfirm from '@/components/ButtomConfirm';
2 import { RESPONSE_CODE } from '@/constants/enum'; 2 import { RESPONSE_CODE } from '@/constants/enum';
3 import AddOrUpdate from '@/pages/product/productCollect/components/AddOrUpdate'; 3 import AddOrUpdate from '@/pages/product/productCollect/components/AddOrUpdate';
4 -import Audit from '@/pages/product/productCollect/components/Audit';  
5 import { 4 import {
6 postProductCollectBillDelete, 5 postProductCollectBillDelete,
7 postProductCollectBillPage, 6 postProductCollectBillPage,
8 postServiceConstProductCollectBillStatus, 7 postServiceConstProductCollectBillStatus,
9 - postServiceConstStores,  
10 } from '@/services'; 8 } from '@/services';
11 import { enumToSelect } from '@/utils'; 9 import { enumToSelect } from '@/utils';
12 -import type { ActionType, ProColumns } from '@ant-design/pro-components';  
13 -import { ProTable } from '@ant-design/pro-components'; 10 +import {
  11 + ProTable,
  12 + type ActionType,
  13 + type ProColumns,
  14 +} from '@ant-design/pro-components';
14 import { message } from 'antd'; 15 import { message } from 'antd';
15 import { useRef } from 'react'; 16 import { useRef } from 'react';
  17 +import Audit from './components/Audit';
16 18
17 export default () => { 19 export default () => {
18 const actionRef = useRef<ActionType>(); 20 const actionRef = useRef<ActionType>();
@@ -23,20 +25,6 @@ export default () =&gt; { @@ -23,20 +25,6 @@ export default () =&gt; {
23 width: 48, 25 width: 48,
24 }, 26 },
25 { 27 {
26 - title: '商品名称',  
27 - dataIndex: 'productName',  
28 - ellipsis: true,  
29 - width: 180,  
30 - hideInSearch: true,  
31 - },  
32 - {  
33 - title: '申领数量',  
34 - dataIndex: 'productNumber',  
35 - ellipsis: true,  
36 - width: 180,  
37 - hideInSearch: true,  
38 - },  
39 - {  
40 title: '申领人', 28 title: '申领人',
41 dataIndex: 'createByName', 29 dataIndex: 'createByName',
42 ellipsis: true, 30 ellipsis: true,
@@ -51,13 +39,6 @@ export default () =&gt; { @@ -51,13 +39,6 @@ export default () =&gt; {
51 hideInSearch: true, 39 hideInSearch: true,
52 }, 40 },
53 { 41 {
54 - title: '申领仓库',  
55 - dataIndex: 'warehouseText',  
56 - ellipsis: true,  
57 - width: 180,  
58 - hideInSearch: true,  
59 - },  
60 - {  
61 title: '审核状态', 42 title: '审核状态',
62 dataIndex: 'auditStatusText', 43 dataIndex: 'auditStatusText',
63 ellipsis: true, 44 ellipsis: true,
@@ -82,24 +63,13 @@ export default () =&gt; { @@ -82,24 +63,13 @@ export default () =&gt; {
82 }, 63 },
83 64
84 { 65 {
85 - title: '商品名称', 66 + title: '申领物品',
86 dataIndex: 'productNameLike', 67 dataIndex: 'productNameLike',
  68 + ellipsis: true,
  69 + width: 180,
87 hideInTable: true, 70 hideInTable: true,
88 }, 71 },
89 { 72 {
90 - title: '申领仓库',  
91 - valueType: 'select',  
92 - key: 'warehouse',  
93 - dataIndex: 'warehouse',  
94 - filters: true,  
95 - onFilter: true,  
96 - hideInTable: true,  
97 - request: async () => {  
98 - const res = await postServiceConstStores();  
99 - return enumToSelect(res.data);  
100 - },  
101 - },  
102 - {  
103 title: '申领人', 73 title: '申领人',
104 dataIndex: 'createByNameLike', 74 dataIndex: 'createByNameLike',
105 hideInTable: true, 75 hideInTable: true,
@@ -129,8 +99,6 @@ export default () =&gt; { @@ -129,8 +99,6 @@ export default () =&gt; {
129 hideInTable: true, 99 hideInTable: true,
130 request: async () => { 100 request: async () => {
131 const res = await postServiceConstProductCollectBillStatus(); 101 const res = await postServiceConstProductCollectBillStatus();
132 - console.log('auditStaus' + JSON.stringify(res));  
133 - console.log('auditStaus' + JSON.stringify(res.data));  
134 return enumToSelect(res.data); 102 return enumToSelect(res.data);
135 }, 103 },
136 }, 104 },
@@ -142,7 +110,7 @@ export default () =&gt; { @@ -142,7 +110,7 @@ export default () =&gt; {
142 record.paths?.includes('UPDATE') && ( 110 record.paths?.includes('UPDATE') && (
143 <AddOrUpdate 111 <AddOrUpdate
144 record={record} 112 record={record}
145 - onFinish={() => { 113 + onfinish={() => {
146 actionRef.current?.reload(); 114 actionRef.current?.reload();
147 }} 115 }}
148 /> 116 />
@@ -175,11 +143,11 @@ export default () =&gt; { @@ -175,11 +143,11 @@ export default () =&gt; {
175 ], 143 ],
176 }, 144 },
177 ]; 145 ];
  146 +
178 return ( 147 return (
179 <ProTable 148 <ProTable
180 - columns={columns}  
181 actionRef={actionRef} 149 actionRef={actionRef}
182 - cardBordered 150 + columns={columns}
183 request={async (params) => { 151 request={async (params) => {
184 const res = await postProductCollectBillPage({ 152 const res = await postProductCollectBillPage({
185 data: { 153 data: {
@@ -197,54 +165,38 @@ export default () =&gt; { @@ -197,54 +165,38 @@ export default () =&gt; {
197 success: false, 165 success: false,
198 }; 166 };
199 }} 167 }}
200 - editable={{  
201 - type: 'multiple',  
202 - }}  
203 - columnsState={{  
204 - persistenceKey: 'pro-table-singe-demos',  
205 - persistenceType: 'localStorage',  
206 - defaultValue: {  
207 - option: { fixed: 'right', disable: true },  
208 - },  
209 - onChange(value) {  
210 - console.log('value: ', value);  
211 - },  
212 - }}  
213 rowKey="id" 168 rowKey="id"
214 - search={{  
215 - labelWidth: 'auto',  
216 - }}  
217 - options={{  
218 - setting: {  
219 - listsHeight: 400,  
220 - },  
221 - }}  
222 - form={{  
223 - // 由于配置了 transform,提交的参数与定义的不同这里需要转化一下  
224 - syncToUrl: (values, type) => {  
225 - if (type === 'get') {  
226 - return {  
227 - ...values,  
228 - created_at: [values.startTime, values.endTime],  
229 - };  
230 - }  
231 - return values;  
232 - },  
233 - }}  
234 pagination={{ 169 pagination={{
235 - pageSize: 5,  
236 - onChange: (page) => console.log(page), 170 + showQuickJumper: true,
  171 + }}
  172 + expandable={{
  173 + expandedRowRender: (record) => (
  174 + <ProTable
  175 + columns={[
  176 + {
  177 + title: '商品名称',
  178 + dataIndex: 'productName',
  179 + key: 'productName',
  180 + },
  181 + { title: '数量', dataIndex: 'number', key: 'number' },
  182 + { title: '备注', dataIndex: 'notes', key: 'notes' },
  183 + ]}
  184 + headerTitle={false}
  185 + search={false}
  186 + options={false}
  187 + dataSource={record.details}
  188 + pagination={false}
  189 + />
  190 + ),
237 }} 191 }}
238 dateFormatter="string" 192 dateFormatter="string"
239 - headerTitle="高级表格"  
240 - scroll={{ x: 'max-content' }} 193 + headerTitle="采购管理"
  194 + options={false}
241 toolBarRender={() => [ 195 toolBarRender={() => [
242 <AddOrUpdate 196 <AddOrUpdate
243 - key="AddOrUpdate"  
244 - record={null}  
245 - onFinish={() => {  
246 - actionRef.current?.reload();  
247 - }} 197 + key="add"
  198 + record={undefined}
  199 + onfinish={() => actionRef.current?.reload()}
248 />, 200 />,
249 ]} 201 ]}
250 /> 202 />
src/pages/product/productCollect/indexcopy.tsx 0 → 100644
  1 +import ButtonConfirm from '@/components/ButtomConfirm';
  2 +import { RESPONSE_CODE } from '@/constants/enum';
  3 +import AddOrUpdate from '@/pages/product/productCollect/components/AddOrUpdate';
  4 +import Audit from '@/pages/product/productCollect/components/Audit';
  5 +import {
  6 + postProductCollectBillDelete,
  7 + postProductCollectBillPage,
  8 + postServiceConstProductCollectBillStatus,
  9 + postServiceConstStores,
  10 +} from '@/services';
  11 +import { enumToSelect } from '@/utils';
  12 +import type { ActionType, ProColumns } from '@ant-design/pro-components';
  13 +import { ProTable } from '@ant-design/pro-components';
  14 +import { message } from 'antd';
  15 +import { useRef } from 'react';
  16 +
  17 +export default () => {
  18 + const actionRef = useRef<ActionType>();
  19 + const columns: ProColumns[] = [
  20 + {
  21 + dataIndex: 'index',
  22 + valueType: 'indexBorder',
  23 + width: 48,
  24 + },
  25 + {
  26 + title: '商品名称',
  27 + dataIndex: 'productName',
  28 + ellipsis: true,
  29 + width: 180,
  30 + hideInSearch: true,
  31 + },
  32 + {
  33 + title: '申领数量',
  34 + dataIndex: 'productNumber',
  35 + ellipsis: true,
  36 + width: 180,
  37 + hideInSearch: true,
  38 + },
  39 + {
  40 + title: '申领人',
  41 + dataIndex: 'createByName',
  42 + ellipsis: true,
  43 + width: 180,
  44 + hideInSearch: true,
  45 + },
  46 + {
  47 + title: '申请时间',
  48 + dataIndex: 'createTime',
  49 + ellipsis: true,
  50 + width: 180,
  51 + hideInSearch: true,
  52 + },
  53 + {
  54 + title: '申领仓库',
  55 + dataIndex: 'warehouseText',
  56 + ellipsis: true,
  57 + width: 180,
  58 + hideInSearch: true,
  59 + },
  60 + {
  61 + title: '审核状态',
  62 + dataIndex: 'auditStatusText',
  63 + ellipsis: true,
  64 + width: 180,
  65 + hideInSearch: true,
  66 + },
  67 + {
  68 + title: '申领备注',
  69 + dataIndex: 'applyRemarks',
  70 + valueType: 'textarea',
  71 + ellipsis: true,
  72 + width: 180,
  73 + hideInSearch: true,
  74 + },
  75 + {
  76 + title: '审核备注',
  77 + dataIndex: 'auditRemarks',
  78 + valueType: 'textarea',
  79 + ellipsis: true,
  80 + width: 180,
  81 + hideInSearch: true,
  82 + },
  83 +
  84 + {
  85 + title: '商品名称',
  86 + dataIndex: 'productNameLike',
  87 + hideInTable: true,
  88 + },
  89 + {
  90 + title: '申领仓库',
  91 + valueType: 'select',
  92 + key: 'warehouse',
  93 + dataIndex: 'warehouse',
  94 + filters: true,
  95 + onFilter: true,
  96 + hideInTable: true,
  97 + request: async () => {
  98 + const res = await postServiceConstStores();
  99 + return enumToSelect(res.data);
  100 + },
  101 + },
  102 + {
  103 + title: '申领人',
  104 + dataIndex: 'createByNameLike',
  105 + hideInTable: true,
  106 + },
  107 + {
  108 + title: '申请时间',
  109 + valueType: 'dateTimeRange',
  110 + hideInTable: true,
  111 + search: {
  112 + transform: (value) => {
  113 + if (value) {
  114 + return {
  115 + createTimeGe: value[0],
  116 + createTimeLe: value[1],
  117 + };
  118 + }
  119 + },
  120 + },
  121 + },
  122 + {
  123 + title: '审核状态',
  124 + valueType: 'select',
  125 + key: 'auditStatus',
  126 + dataIndex: 'auditStatus',
  127 + filters: true,
  128 + onFilter: true,
  129 + hideInTable: true,
  130 + request: async () => {
  131 + const res = await postServiceConstProductCollectBillStatus();
  132 + return enumToSelect(res.data);
  133 + },
  134 + },
  135 + {
  136 + title: '操作',
  137 + valueType: 'option',
  138 + key: 'option',
  139 + render: (text, record) => [
  140 + record.paths?.includes('UPDATE') && (
  141 + <AddOrUpdate
  142 + record={record}
  143 + onFinish={() => {
  144 + actionRef.current?.reload();
  145 + }}
  146 + />
  147 + ),
  148 + record.paths?.includes('UPDATE') && (
  149 + <ButtonConfirm
  150 + key="delete"
  151 + className="p-0"
  152 + title={'确认删除该记录?'}
  153 + text="删除"
  154 + onConfirm={async () => {
  155 + let res = await postProductCollectBillDelete({
  156 + query: { id: record.id },
  157 + });
  158 + if (res) {
  159 + message.success(res.message);
  160 + actionRef.current?.reload();
  161 + }
  162 + }}
  163 + />
  164 + ),
  165 + record.paths?.includes('AUDIT') && (
  166 + <Audit
  167 + recordId={record.id}
  168 + onClose={() => {
  169 + actionRef.current?.reload();
  170 + }}
  171 + />
  172 + ),
  173 + ],
  174 + },
  175 + ];
  176 + return (
  177 + <ProTable
  178 + columns={columns}
  179 + actionRef={actionRef}
  180 + cardBordered
  181 + request={async (params) => {
  182 + const res = await postProductCollectBillPage({
  183 + data: {
  184 + ...params,
  185 + },
  186 + });
  187 + if (res.result === RESPONSE_CODE.SUCCESS) {
  188 + return {
  189 + data: res?.data?.data,
  190 + total: res?.data?.total || 0,
  191 + };
  192 + }
  193 + return {
  194 + data: [],
  195 + success: false,
  196 + };
  197 + }}
  198 + editable={{
  199 + type: 'multiple',
  200 + }}
  201 + columnsState={{
  202 + persistenceKey: 'pro-table-singe-demos',
  203 + persistenceType: 'localStorage',
  204 + defaultValue: {
  205 + option: { fixed: 'right', disable: true },
  206 + },
  207 + onChange(value) {
  208 + console.log('value: ', value);
  209 + },
  210 + }}
  211 + rowKey="id"
  212 + search={{
  213 + labelWidth: 'auto',
  214 + }}
  215 + options={{
  216 + setting: {
  217 + listsHeight: 400,
  218 + },
  219 + }}
  220 + form={{
  221 + // 由于配置了 transform,提交的参数与定义的不同这里需要转化一下
  222 + syncToUrl: (values, type) => {
  223 + if (type === 'get') {
  224 + return {
  225 + ...values,
  226 + created_at: [values.startTime, values.endTime],
  227 + };
  228 + }
  229 + return values;
  230 + },
  231 + }}
  232 + pagination={{
  233 + pageSize: 5,
  234 + onChange: (page) => console.log(page),
  235 + }}
  236 + dateFormatter="string"
  237 + headerTitle="高级表格"
  238 + scroll={{ x: 'max-content' }}
  239 + toolBarRender={() => [
  240 + <AddOrUpdate
  241 + key="AddOrUpdate"
  242 + record={null}
  243 + onFinish={() => {
  244 + actionRef.current?.reload();
  245 + }}
  246 + />,
  247 + ]}
  248 + />
  249 + );
  250 +};
src/services/definition.ts
@@ -2825,6 +2825,17 @@ export interface OrderZoNingProvinceUserDo { @@ -2825,6 +2825,17 @@ export interface OrderZoNingProvinceUserDo {
2825 zoning?: string; 2825 zoning?: string;
2826 } 2826 }
2827 2827
  2828 +export interface ProcureBillAuditDto {
  2829 + /**
  2830 + * @description
  2831 + * 审核备注
  2832 + */
  2833 + auditRemarks?: string;
  2834 + /** @format int64 */
  2835 + id?: number;
  2836 + passed?: boolean;
  2837 +}
  2838 +
2828 export interface ProcureConvertProcureDto { 2839 export interface ProcureConvertProcureDto {
2829 /** 2840 /**
2830 * @description 2841 * @description
@@ -4894,7 +4905,8 @@ export interface InvoiceReissueRecord { @@ -4894,7 +4905,8 @@ export interface InvoiceReissueRecord {
4894 } 4905 }
4895 4906
4896 export interface ProcureBillDetail { 4907 export interface ProcureBillDetail {
4897 - annex?: string; 4908 + annexList?: Array<string>;
  4909 + annexs?: string;
4898 createByName?: string; 4910 createByName?: string;
4899 /** @format date-time */ 4911 /** @format date-time */
4900 createTime?: string; 4912 createTime?: string;
src/services/request.ts
@@ -70,7 +70,6 @@ import type { @@ -70,7 +70,6 @@ import type {
70 MeasureUnitListRes, 70 MeasureUnitListRes,
71 MergeIntegralDto, 71 MergeIntegralDto,
72 MessageQueryDTO, 72 MessageQueryDTO,
73 - ModelAndView,  
74 OrderAddVO, 73 OrderAddVO,
75 OrderAuditLogQueryVO, 74 OrderAuditLogQueryVO,
76 OrderBaseInfoQueryVO, 75 OrderBaseInfoQueryVO,
@@ -89,6 +88,7 @@ import type { @@ -89,6 +88,7 @@ import type {
89 OrderUnlockFieldApplyVO, 88 OrderUnlockFieldApplyVO,
90 OrderUpdateVO, 89 OrderUpdateVO,
91 OrderZoNingProvinceUserDo, 90 OrderZoNingProvinceUserDo,
  91 + ProcureBillAuditDto,
92 ProcureBillInfo, 92 ProcureBillInfo,
93 ProcureConvertProcureDto, 93 ProcureConvertProcureDto,
94 ProcureOrderDto, 94 ProcureOrderDto,
@@ -236,6 +236,77 @@ export const postProcureBillAddOrModify = /* #__PURE__ */ (() =&gt; { @@ -236,6 +236,77 @@ export const postProcureBillAddOrModify = /* #__PURE__ */ (() =&gt; {
236 return request; 236 return request;
237 })(); 237 })();
238 238
  239 +/** @description request parameter type for postProcureBillAudit */
  240 +export interface PostProcureBillAuditOption {
  241 + /**
  242 + * @description
  243 + * dto
  244 + */
  245 + body: {
  246 + /**
  247 + @description
  248 + dto */
  249 + dto: ProcureBillAuditDto;
  250 + };
  251 +}
  252 +
  253 +/** @description response type for postProcureBillAudit */
  254 +export interface PostProcureBillAuditResponse {
  255 + /**
  256 + * @description
  257 + * OK
  258 + */
  259 + 200: ServerResult;
  260 + /**
  261 + * @description
  262 + * Created
  263 + */
  264 + 201: any;
  265 + /**
  266 + * @description
  267 + * Unauthorized
  268 + */
  269 + 401: any;
  270 + /**
  271 + * @description
  272 + * Forbidden
  273 + */
  274 + 403: any;
  275 + /**
  276 + * @description
  277 + * Not Found
  278 + */
  279 + 404: any;
  280 +}
  281 +
  282 +export type PostProcureBillAuditResponseSuccess =
  283 + PostProcureBillAuditResponse[200];
  284 +/**
  285 + * @description
  286 + * 审核
  287 + * @tags 采购管理
  288 + * @produces *
  289 + * @consumes application/json
  290 + */
  291 +export const postProcureBillAudit = /* #__PURE__ */ (() => {
  292 + const method = 'post';
  293 + const url = '/ProcureBill/audit';
  294 + function request(
  295 + option: PostProcureBillAuditOption,
  296 + ): Promise<PostProcureBillAuditResponseSuccess> {
  297 + return requester(request.url, {
  298 + method: request.method,
  299 + ...option,
  300 + }) as unknown as Promise<PostProcureBillAuditResponseSuccess>;
  301 + }
  302 +
  303 + /** http method */
  304 + request.method = method;
  305 + /** request url */
  306 + request.url = url;
  307 + return request;
  308 +})();
  309 +
239 /** @description request parameter type for postProcureBillDelete */ 310 /** @description request parameter type for postProcureBillDelete */
240 export interface PostProcureBillDeleteOption { 311 export interface PostProcureBillDeleteOption {
241 /** 312 /**
@@ -3757,7 +3828,9 @@ export interface GetErrorResponse { @@ -3757,7 +3828,9 @@ export interface GetErrorResponse {
3757 * @description 3828 * @description
3758 * OK 3829 * OK
3759 */ 3830 */
3760 - 200: ModelAndView; 3831 + 200: {
  3832 + [propertyName: string]: any;
  3833 + };
3761 /** 3834 /**
3762 * @description 3835 * @description
3763 * Unauthorized 3836 * Unauthorized
@@ -3778,9 +3851,9 @@ export interface GetErrorResponse { @@ -3778,9 +3851,9 @@ export interface GetErrorResponse {
3778 export type GetErrorResponseSuccess = GetErrorResponse[200]; 3851 export type GetErrorResponseSuccess = GetErrorResponse[200];
3779 /** 3852 /**
3780 * @description 3853 * @description
3781 - * errorHtml 3854 + * error
3782 * @tags basic-error-controller 3855 * @tags basic-error-controller
3783 - * @produces text/html 3856 + * @produces *
3784 */ 3857 */
3785 export const getError = /* #__PURE__ */ (() => { 3858 export const getError = /* #__PURE__ */ (() => {
3786 const method = 'get'; 3859 const method = 'get';
@@ -3804,7 +3877,9 @@ export interface PutErrorResponse { @@ -3804,7 +3877,9 @@ export interface PutErrorResponse {
3804 * @description 3877 * @description
3805 * OK 3878 * OK
3806 */ 3879 */
3807 - 200: ModelAndView; 3880 + 200: {
  3881 + [propertyName: string]: any;
  3882 + };
3808 /** 3883 /**
3809 * @description 3884 * @description
3810 * Created 3885 * Created
@@ -3830,9 +3905,9 @@ export interface PutErrorResponse { @@ -3830,9 +3905,9 @@ export interface PutErrorResponse {
3830 export type PutErrorResponseSuccess = PutErrorResponse[200]; 3905 export type PutErrorResponseSuccess = PutErrorResponse[200];
3831 /** 3906 /**
3832 * @description 3907 * @description
3833 - * errorHtml 3908 + * error
3834 * @tags basic-error-controller 3909 * @tags basic-error-controller
3835 - * @produces text/html 3910 + * @produces *
3836 * @consumes application/json 3911 * @consumes application/json
3837 */ 3912 */
3838 export const putError = /* #__PURE__ */ (() => { 3913 export const putError = /* #__PURE__ */ (() => {
@@ -3857,7 +3932,9 @@ export interface PostErrorResponse { @@ -3857,7 +3932,9 @@ export interface PostErrorResponse {
3857 * @description 3932 * @description
3858 * OK 3933 * OK
3859 */ 3934 */
3860 - 200: ModelAndView; 3935 + 200: {
  3936 + [propertyName: string]: any;
  3937 + };
3861 /** 3938 /**
3862 * @description 3939 * @description
3863 * Created 3940 * Created
@@ -3883,9 +3960,9 @@ export interface PostErrorResponse { @@ -3883,9 +3960,9 @@ export interface PostErrorResponse {
3883 export type PostErrorResponseSuccess = PostErrorResponse[200]; 3960 export type PostErrorResponseSuccess = PostErrorResponse[200];
3884 /** 3961 /**
3885 * @description 3962 * @description
3886 - * errorHtml 3963 + * error
3887 * @tags basic-error-controller 3964 * @tags basic-error-controller
3888 - * @produces text/html 3965 + * @produces *
3889 * @consumes application/json 3966 * @consumes application/json
3890 */ 3967 */
3891 export const postError = /* #__PURE__ */ (() => { 3968 export const postError = /* #__PURE__ */ (() => {
@@ -3910,7 +3987,9 @@ export interface DeleteErrorResponse { @@ -3910,7 +3987,9 @@ export interface DeleteErrorResponse {
3910 * @description 3987 * @description
3911 * OK 3988 * OK
3912 */ 3989 */
3913 - 200: ModelAndView; 3990 + 200: {
  3991 + [propertyName: string]: any;
  3992 + };
3914 /** 3993 /**
3915 * @description 3994 * @description
3916 * No Content 3995 * No Content
@@ -3931,9 +4010,9 @@ export interface DeleteErrorResponse { @@ -3931,9 +4010,9 @@ export interface DeleteErrorResponse {
3931 export type DeleteErrorResponseSuccess = DeleteErrorResponse[200]; 4010 export type DeleteErrorResponseSuccess = DeleteErrorResponse[200];
3932 /** 4011 /**
3933 * @description 4012 * @description
3934 - * errorHtml 4013 + * error
3935 * @tags basic-error-controller 4014 * @tags basic-error-controller
3936 - * @produces text/html 4015 + * @produces *
3937 */ 4016 */
3938 export const deleteError = /* #__PURE__ */ (() => { 4017 export const deleteError = /* #__PURE__ */ (() => {
3939 const method = 'delete'; 4018 const method = 'delete';
@@ -3957,7 +4036,9 @@ export interface OptionsErrorResponse { @@ -3957,7 +4036,9 @@ export interface OptionsErrorResponse {
3957 * @description 4036 * @description
3958 * OK 4037 * OK
3959 */ 4038 */
3960 - 200: ModelAndView; 4039 + 200: {
  4040 + [propertyName: string]: any;
  4041 + };
3961 /** 4042 /**
3962 * @description 4043 * @description
3963 * No Content 4044 * No Content
@@ -3978,9 +4059,9 @@ export interface OptionsErrorResponse { @@ -3978,9 +4059,9 @@ export interface OptionsErrorResponse {
3978 export type OptionsErrorResponseSuccess = OptionsErrorResponse[200]; 4059 export type OptionsErrorResponseSuccess = OptionsErrorResponse[200];
3979 /** 4060 /**
3980 * @description 4061 * @description
3981 - * errorHtml 4062 + * error
3982 * @tags basic-error-controller 4063 * @tags basic-error-controller
3983 - * @produces text/html 4064 + * @produces *
3984 * @consumes application/json 4065 * @consumes application/json
3985 */ 4066 */
3986 export const optionsError = /* #__PURE__ */ (() => { 4067 export const optionsError = /* #__PURE__ */ (() => {
@@ -4005,7 +4086,9 @@ export interface HeadErrorResponse { @@ -4005,7 +4086,9 @@ export interface HeadErrorResponse {
4005 * @description 4086 * @description
4006 * OK 4087 * OK
4007 */ 4088 */
4008 - 200: ModelAndView; 4089 + 200: {
  4090 + [propertyName: string]: any;
  4091 + };
4009 /** 4092 /**
4010 * @description 4093 * @description
4011 * No Content 4094 * No Content
@@ -4026,9 +4109,9 @@ export interface HeadErrorResponse { @@ -4026,9 +4109,9 @@ export interface HeadErrorResponse {
4026 export type HeadErrorResponseSuccess = HeadErrorResponse[200]; 4109 export type HeadErrorResponseSuccess = HeadErrorResponse[200];
4027 /** 4110 /**
4028 * @description 4111 * @description
4029 - * errorHtml 4112 + * error
4030 * @tags basic-error-controller 4113 * @tags basic-error-controller
4031 - * @produces text/html 4114 + * @produces *
4032 * @consumes application/json 4115 * @consumes application/json
4033 */ 4116 */
4034 export const headError = /* #__PURE__ */ (() => { 4117 export const headError = /* #__PURE__ */ (() => {
@@ -4053,7 +4136,9 @@ export interface PatchErrorResponse { @@ -4053,7 +4136,9 @@ export interface PatchErrorResponse {
4053 * @description 4136 * @description
4054 * OK 4137 * OK
4055 */ 4138 */
4056 - 200: ModelAndView; 4139 + 200: {
  4140 + [propertyName: string]: any;
  4141 + };
4057 /** 4142 /**
4058 * @description 4143 * @description
4059 * No Content 4144 * No Content
@@ -4074,9 +4159,9 @@ export interface PatchErrorResponse { @@ -4074,9 +4159,9 @@ export interface PatchErrorResponse {
4074 export type PatchErrorResponseSuccess = PatchErrorResponse[200]; 4159 export type PatchErrorResponseSuccess = PatchErrorResponse[200];
4075 /** 4160 /**
4076 * @description 4161 * @description
4077 - * errorHtml 4162 + * error
4078 * @tags basic-error-controller 4163 * @tags basic-error-controller
4079 - * @produces text/html 4164 + * @produces *
4080 * @consumes application/json 4165 * @consumes application/json
4081 */ 4166 */
4082 export const patchError = /* #__PURE__ */ (() => { 4167 export const patchError = /* #__PURE__ */ (() => {
@@ -16238,6 +16323,60 @@ export const postServiceConstPlatformType = /* #__PURE__ */ (() =&gt; { @@ -16238,6 +16323,60 @@ export const postServiceConstPlatformType = /* #__PURE__ */ (() =&gt; {
16238 return request; 16323 return request;
16239 })(); 16324 })();
16240 16325
  16326 +/** @description response type for postServiceConstProcureBillAuditStatus */
  16327 +export interface PostServiceConstProcureBillAuditStatusResponse {
  16328 + /**
  16329 + * @description
  16330 + * OK
  16331 + */
  16332 + 200: ServerResult;
  16333 + /**
  16334 + * @description
  16335 + * Created
  16336 + */
  16337 + 201: any;
  16338 + /**
  16339 + * @description
  16340 + * Unauthorized
  16341 + */
  16342 + 401: any;
  16343 + /**
  16344 + * @description
  16345 + * Forbidden
  16346 + */
  16347 + 403: any;
  16348 + /**
  16349 + * @description
  16350 + * Not Found
  16351 + */
  16352 + 404: any;
  16353 +}
  16354 +
  16355 +export type PostServiceConstProcureBillAuditStatusResponseSuccess =
  16356 + PostServiceConstProcureBillAuditStatusResponse[200];
  16357 +/**
  16358 + * @description
  16359 + * 采购单审核状态
  16360 + * @tags front-const-controller
  16361 + * @produces *
  16362 + * @consumes application/json
  16363 + */
  16364 +export const postServiceConstProcureBillAuditStatus = /* #__PURE__ */ (() => {
  16365 + const method = 'post';
  16366 + const url = '/service/const/procureBillAuditStatus';
  16367 + function request(): Promise<PostServiceConstProcureBillAuditStatusResponseSuccess> {
  16368 + return requester(request.url, {
  16369 + method: request.method,
  16370 + }) as unknown as Promise<PostServiceConstProcureBillAuditStatusResponseSuccess>;
  16371 + }
  16372 +
  16373 + /** http method */
  16374 + request.method = method;
  16375 + /** request url */
  16376 + request.url = url;
  16377 + return request;
  16378 +})();
  16379 +
16241 /** @description response type for postServiceConstProcureReturnBills */ 16380 /** @description response type for postServiceConstProcureReturnBills */
16242 export interface PostServiceConstProcureReturnBillsResponse { 16381 export interface PostServiceConstProcureReturnBillsResponse {
16243 /** 16382 /**