Commit 6329b78d0bd16017a0620e840ecacbdb07da4d71

Authored by boyang
2 parents 0c438830 c816aaf1

Merge branch 'feature-PrivatePocket' into dev

.umirc.ts
... ... @@ -131,10 +131,30 @@ export default defineConfig({
131 131 },
132 132 {
133 133 name: '预存管理',
134   - path: '/prepaidManage',
135   - component: './Prepaid',
  134 + path: '/prepaid',
136 135 icon: 'AccountBookOutlined',
137 136 access: 'canReadAdminAndFinanceAndSales',
  137 + routes: [
  138 + {
  139 + path: '',
  140 + component: './Prepaid',
  141 + },
  142 + {
  143 + name: '预存充值',
  144 + path: 'recharge',
  145 + component: './Prepaid/PrepaidRecharge',
  146 + },
  147 + {
  148 + name: '账号列表',
  149 + path: 'account',
  150 + component: './Prepaid/PrepaidAccount',
  151 + },
  152 + {
  153 + name: '隐私钱包',
  154 + path: 'privatePocket',
  155 + component: './Prepaid/PrivatePocket',
  156 + },
  157 + ],
138 158 },
139 159 {
140 160 name: '课题组管理',
... ...
src/pages/Order/FeedBack/OrderList.tsx
... ... @@ -1193,8 +1193,8 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) => {
1193 1193 <div className="overflow-hidden whitespace-no-wrap overflow-ellipsis">
1194 1194 <Tag
1195 1195 color={
1196   - optRecord.invoicingTime === null ||
1197   - optRecord.invoicingTime === undefined
  1196 + optRecord.afterInvoicingStatus !== 'COMPLETE_INVOICING' &&
  1197 + optRecord.afterInvoicingStatus !== 'PARTIAL_INVOICING'
1198 1198 ? TAGS_COLOR.get(optRecord.invoicingStatus)
1199 1199 : 'success'
1200 1200 }
... ...
src/pages/Order/FeedBack/constant.ts
... ... @@ -121,10 +121,10 @@ export const CHECK_TYPE = {
121 121 * @param subOrder
122 122 */
123 123 export const getNeedInvoicing = (subOrder: any) => {
124   - if (subOrder.invoicingTime !== null && subOrder.invoicingTime !== undefined) {
125   - return '已开票';
126   - }
127   - if (subOrder.afterInvoicingStatus === 'COMPLETE_INVOICING') {
  124 + if (
  125 + subOrder.afterInvoicingStatus === 'COMPLETE_INVOICING' ||
  126 + subOrder.afterInvoicingStatus === 'PARTIAL_INVOICING'
  127 + ) {
128 128 return '已开票';
129 129 }
130 130 if (subOrder.afterInvoicingStatus === 'REISSUE') {
... ... @@ -133,6 +133,12 @@ export const getNeedInvoicing = (subOrder: any) =&gt; {
133 133 if (subOrder.invoicingStatus === 'UN_INVOICE') {
134 134 return '不需开票';
135 135 }
  136 + if (subOrder.afterInvoicingStatus === 'WAIT_FLUSH') {
  137 + return '待冲红';
  138 + }
  139 + if (subOrder.afterInvoicingStatus === 'FLUSHED') {
  140 + return '已冲红';
  141 + }
136 142 return '需要开票';
137 143 };
138 144  
... ...
src/pages/Order/Order/components/CheckModal.tsx
... ... @@ -85,12 +85,37 @@ export default ({
85 85 // data: { subOrderIds: subOrderIds },
86 86 // });
87 87  
  88 + // 检查subOrders是否存在且有元素
  89 + if (!subOrders || !subOrders.length) {
  90 + // 如果是预存审核类型,直接返回,不需要处理售后信息
  91 + if (checkType(CHECK_TYPE.PREPAID_AUDIT)) {
  92 + return;
  93 + }
  94 +
  95 + // 对于其他类型,设置一个空的售后信息
  96 + setAfterSalesInfo(
  97 + <div className="my-5">
  98 + <Row gutter={[16, 24]}>
  99 + <Col span={24}>
  100 + <span>暂无售后信息</span>
  101 + </Col>
  102 + </Row>
  103 + </div>,
  104 + );
  105 + return;
  106 + }
  107 +
88 108 //附件
89   - let annex = subOrders[0].afterSalesAnnexList;
  109 + let annex = subOrders[0]?.afterSalesAnnexList || [];
90 110 let index = 1;
91 111 let annexLinks = annex?.map((f) => {
92 112 return (
93   - <Button className="p-0 pr-1" type="link" key="key" href={f}>
  113 + <Button
  114 + className="p-0 pr-1"
  115 + type="link"
  116 + key={`annex-${index}`}
  117 + href={f}
  118 + >
94 119 {'附件' + index++}
95 120 </Button>
96 121 );
... ... @@ -126,27 +151,36 @@ export default ({
126 151 useEffect(() => {
127 152 if (checkType(CHECK_TYPE.CONFIRM_DELIVER)) {
128 153 setAPopoverTitle('确认发货');
  154 + } else if (checkType(CHECK_TYPE.PREPAID_AUDIT)) {
  155 + setAPopoverTitle('预存审核');
129 156 }
130 157 getOrderAfterSalesInfo();
131 158  
132 159 let paymentReceiptsImagesList: any[] = [];
133 160 subOrders?.forEach((item: any) => {
134   - if (item.paymentReceiptAnnexList) {
135   - paymentReceiptsImagesList.push(...item.paymentReceiptAnnexList);
  161 + if (
  162 + item?.paymentReceiptsImages !== null &&
  163 + item?.paymentReceiptsImages !== undefined
  164 + ) {
  165 + paymentReceiptsImagesList.push(...item.paymentReceiptsImages);
136 166 }
137 167 });
138   - //去重
139   - paymentReceiptsImagesList = [...new Set(paymentReceiptsImagesList)];
140 168 setPymentReceiptsImages(paymentReceiptsImagesList);
141 169  
142   - //预存审核的凭证
143 170 let proofImages: any[] = [];
  171 + // 从subOrders获取凭证图片
144 172 subOrders?.forEach((item) => {
145   - let images = item.proofImages;
  173 + let images = item?.proofImages;
146 174 if (images !== null && images !== undefined) {
147 175 proofImages.push(...images);
148 176 }
149 177 });
  178 +
  179 + // 对于预存审核,从data对象中获取凭证图片
  180 + if (checkType(CHECK_TYPE.PREPAID_AUDIT) && data?.proofImages) {
  181 + proofImages = [...data.proofImages];
  182 + }
  183 +
150 184 setPrepaidProofImages(proofImages);
151 185 }, []);
152 186  
... ... @@ -374,12 +408,25 @@ export default ({
374 408 * @param body
375 409 */
376 410 async function doPrepaidAudit(body: any) {
377   - const data = await postPrepaidAudit({
378   - data: body,
  411 + // 确保传递了需要审核的记录ID
  412 + const auditData = {
  413 + ...body,
  414 + ids: [data?.id], // 使用当前记录的ID
  415 + checkPassOrReject: body.checkPassOrReject, // 通过或驳回
  416 + checkNotes: body.name, // 审核意见
  417 + };
  418 +
  419 + console.log('预存审核参数:', auditData);
  420 +
  421 + const result = await postPrepaidAudit({
  422 + data: auditData,
379 423 });
380   - if (data.result === RESPONSE_CODE.SUCCESS) {
381   - message.success(data.message);
  424 +
  425 + if (result.result === RESPONSE_CODE.SUCCESS) {
  426 + message.success(result.message);
382 427 onClose();
  428 + } else {
  429 + message.error(result.message || '审核失败');
383 430 }
384 431 }
385 432  
... ...
src/pages/Order/OrderList/OrderDrawer.tsx
... ... @@ -230,7 +230,11 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; {
230 230  
231 231 // 查询当前手机号允许使用的预存账号
232 232 if (phone) {
233   - let res = await postPrepaidPhoneAvailableList({ data: { phone: phone } });
  233 + // 从表单中获取 salesCode
  234 + const salesCode = form.getFieldValue('salesCode');
  235 + let res = await postPrepaidPhoneAvailableList({
  236 + data: { phone: phone, salesCode: salesCode },
  237 + });
234 238 if (res && res.result === RESPONSE_CODE.SUCCESS) {
235 239 let uidDetails = res.data;
236 240 for (let detail of uidDetails) {
... ... @@ -890,9 +894,44 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; {
890 894 if (typeof values.erpCustomerId !== 'string') {
891 895 values.erpCustomerId = values.erpCustomerId?.id;
892 896 }
893   - values.province = province;
894   - values.city = city;
895   - values.district = district;
  897 +
  898 + // Handle the prepaidUid and privatePocket values for API submission
  899 + if (
  900 + values.paymentMethod === 'WITHHOLDING_ADVANCE_DEPOSIT' &&
  901 + values.prepaidUid
  902 + ) {
  903 + console.log('5656原始表单数据:', {
  904 + prepaidUid: values.prepaidUid,
  905 + realPrepaidUid: values.realPrepaidUid,
  906 + privatePocket: values.privatePocket,
  907 + });
  908 +
  909 + // 从选项值中提取原始UID (不包含索引后缀)
  910 + const prepaidUidParts = values.prepaidUid.split('_');
  911 + if (prepaidUidParts.length > 0) {
  912 + // 直接使用第一部分作为实际UID值 (不使用realPrepaidUid)
  913 + values.prepaidUid = parseInt(prepaidUidParts[0], 10);
  914 + console.log('5656使用原始UID进行API提交:', values.prepaidUid);
  915 + }
  916 +
  917 + // 确保privatePocket字段被正确设置
  918 + // 表单中存储的是字符串'true'或'false',需要转换成布尔值
  919 + if (values.privatePocket === 'true') {
  920 + values.privatePocket = true;
  921 + console.log('设置privatePocket=true用于API提交');
  922 + } else {
  923 + values.privatePocket = false;
  924 + console.log('设置privatePocket=false用于API提交');
  925 + }
  926 +
  927 + console.log('最终API提交数据:', {
  928 + prepaidUid: values.prepaidUid,
  929 + privatePocket: values.privatePocket,
  930 + });
  931 + }
  932 +
  933 + console.log(values, '5656values');
  934 +
896 935 //新增
897 936 if (optType('add') || optType('copy')) {
898 937 res = await postServiceOrderAddOrder({ data: values });
... ... @@ -1709,6 +1748,10 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; {
1709 1748 rules={[{ required: true, message: '支付方式必填' }]}
1710 1749 disabled={optType('after-sales-check')}
1711 1750 />
  1751 + {/* 隐藏字段用于存储真实UID和privatePocket标志 */}
  1752 + <ProFormText name="realPrepaidUid" hidden />
  1753 + <ProFormText name="privatePocket" hidden />
  1754 +
1712 1755 <ProFormSelect
1713 1756 name="prepaidUid"
1714 1757 key="prepaidUid"
... ... @@ -1716,15 +1759,55 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; {
1716 1759 hidden={paymentMethod !== 'WITHHOLDING_ADVANCE_DEPOSIT'}
1717 1760 showSearch
1718 1761 label="预存账号"
1719   - onChange={(value: any) => {
  1762 + onChange={(value: any, option: any) => {
  1763 + console.log(value, '5656value');
  1764 + console.log(option, '5656option');
  1765 +
  1766 + if (!option) {
  1767 + form.setFieldValue('prepaidUid', undefined);
  1768 + form.setFieldValue('privatePocket', false);
  1769 + return;
  1770 + }
  1771 +
  1772 + // 从选项中获取真实UID和机构信息
  1773 + const selectedData = option || {};
  1774 + const realUid = selectedData.uid;
  1775 + const institution = selectedData.institution;
  1776 +
  1777 + console.log('选中账户信息:', {
  1778 + value: value,
  1779 + realUid: realUid,
  1780 + institution: institution,
  1781 + });
  1782 +
1720 1783 //检查用户额度
1721 1784 let valid = checkAccountMoney(
1722   - value,
  1785 + realUid, // 使用真实UID检查额度
1723 1786 form.getFieldValue('totalPayment'),
1724 1787 );
  1788 +
1725 1789 if (!valid) {
1726 1790 form.setFieldValue('prepaidUid', undefined);
  1791 + form.setFieldValue('privatePocket', false);
  1792 + return;
1727 1793 }
  1794 +
  1795 + // 如果机构是"隐私钱包",则设置privatePocket为true
  1796 + const isPrivacyWallet = institution === '隐私钱包';
  1797 +
  1798 + // 设置真实UID和privatePocket标志
  1799 + form.setFieldValue('realPrepaidUid', realUid);
  1800 + // 存储为字符串'true'或'false',这样在表单中能正确保存
  1801 + form.setFieldValue(
  1802 + 'privatePocket',
  1803 + isPrivacyWallet ? 'true' : 'false',
  1804 + );
  1805 +
  1806 + console.log('设置表单数据:', {
  1807 + prepaidUid: value,
  1808 + realPrepaidUid: realUid,
  1809 + privatePocket: isPrivacyWallet,
  1810 + });
1728 1811 }}
1729 1812 placeholder="请选择预存账号"
1730 1813 rules={[
... ... @@ -1770,7 +1853,17 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; {
1770 1853 // });
1771 1854 // return options;
1772 1855 // }}
1773   - options={accountOptions}
  1856 + options={accountOptions.map((item, index) => ({
  1857 + ...item,
  1858 + // Use index to create unique value
  1859 + value: `${item.value}_${index}`,
  1860 + // Store original values as custom attributes
  1861 + data: {
  1862 + uid: item.value,
  1863 + institution: item.institution,
  1864 + index: index,
  1865 + },
  1866 + }))}
1774 1867 />
1775 1868 <ProFormSelect
1776 1869 placeholder="选择是否需要开票"
... ... @@ -2244,7 +2337,6 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; {
2244 2337 name="proxy"
2245 2338 label="是否代买代购"
2246 2339 //hidden={true}
2247   - initialValue={true}
2248 2340 options={[
2249 2341 {
2250 2342 label: '是',
... ...
src/pages/Order/OrderList/OrderList.tsx
... ... @@ -1219,8 +1219,8 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) =&gt; {
1219 1219 <div className="overflow-hidden whitespace-no-wrap overflow-ellipsis">
1220 1220 <Tag
1221 1221 color={
1222   - optRecord.invoicingTime === null ||
1223   - optRecord.invoicingTime === undefined
  1222 + optRecord.afterInvoicingStatus !== 'COMPLETE_INVOICING' &&
  1223 + optRecord.afterInvoicingStatus !== 'PARTIAL_INVOICING'
1224 1224 ? TAGS_COLOR.get(optRecord.invoicingStatus)
1225 1225 : 'success'
1226 1226 }
... ...
src/pages/Order/constant.ts
... ... @@ -74,6 +74,7 @@ export const PAYEE_OPTIONS = {
74 74 INNOVATION_PUBLIC_ACCOUNT: '东莞科路得创新科技有限公司',
75 75 JIANTU_PUBLIC_ACCOUNT: '东莞市坚途新材料科技有限公司',
76 76 HUIZHOU_JIANTU_PUBLIC_ACCOUNT: '惠州市坚途新材料科技有限公司',
  77 + KEYAN_ACCOUNT: '东莞科沿科技有限公司',
77 78 HUIZHOU_EXPERIMENT_PUBLIC_ACCOUNT: '惠州市科路得新材料科技有限公司',
78 79 KNOWLEDGE_PUBLIC_ACCOUNT: '东莞市科路得知识产权代理有限公司',
79 80 // ZHUGUANG_ACCEPTANCE_DRAFT: '烛光承兑汇票',
... ... @@ -135,10 +136,10 @@ export const CHECK_TYPE = {
135 136 * @param subOrder
136 137 */
137 138 export const getNeedInvoicing = (subOrder: any) => {
138   - if (subOrder.invoicingTime !== null && subOrder.invoicingTime !== undefined) {
139   - return '已开票';
140   - }
141   - if (subOrder.afterInvoicingStatus === 'COMPLETE_INVOICING') {
  139 + if (
  140 + subOrder.afterInvoicingStatus === 'COMPLETE_INVOICING' ||
  141 + subOrder.afterInvoicingStatus === 'PARTIAL_INVOICING'
  142 + ) {
142 143 return '已开票';
143 144 }
144 145 if (subOrder.afterInvoicingStatus === 'REISSUE') {
... ...
src/pages/Prepaid/PrepaidAccount/index.less 0 → 100644
  1 +.prepaid-account {
  2 + width: 100%;
  3 + padding: 24px;
  4 +
  5 + td {
  6 + font-family: 'San Francisco', 'Helvetica Neue', Helvetica, Arial,
  7 + 'Microsoft YaHei', 'PingFang SC', 'Hiragino Sans GB', 'Heiti SC',
  8 + 'WenQuanYi Micro Hei', sans-serif;
  9 + font-size: 13px;
  10 + }
  11 +}
... ...
src/pages/Prepaid/PrepaidAccount/index.tsx 0 → 100644
  1 +import EllipsisDiv from '@/components/Div/EllipsisDiv';
  2 +import { postCanrdApiUserList } from '@/services';
  3 +import { getUserInfo } from '@/utils/user';
  4 +import { ActionType, ProTable } from '@ant-design/pro-components';
  5 +import { Button } from 'antd';
  6 +import { useRef, useState } from 'react';
  7 +import BalanceChangeRecordsModal from '../components/BalanceChangeRecordsModal';
  8 +import PointsExchangeModal from '../components/PointsExchangeModal';
  9 +import PointsExchangeRecordsModal from '../components/PointsExchangeRecordsModal';
  10 +import { ACCOUNT_COLUMNS } from '../constant';
  11 +import './index.less';
  12 +
  13 +const PrepaidAccountPage = () => {
  14 + const user = getUserInfo();
  15 + const accountActionRef = useRef<ActionType>();
  16 + const [currentOptUserObj, setCurrentOptUserObj] = useState(null);
  17 + const [
  18 + balanceChangeRecordsModalVisible,
  19 + setBalanceChangeRecordsModalVisible,
  20 + ] = useState<boolean>(false);
  21 + const [pointsExchangeModalVisible, setPointsExchangeModalVisible] =
  22 + useState<boolean>(false);
  23 + const [
  24 + pointsExchangeRecordsModalVisible,
  25 + setPointsExchangeRecordsModalVisible,
  26 + ] = useState<boolean>(false);
  27 +
  28 + const reloadAccountTable = () => {
  29 + accountActionRef.current?.reload();
  30 + };
  31 +
  32 + const getTableCellText = (target: any) => {
  33 + if (!target) {
  34 + return '';
  35 + }
  36 +
  37 + if (target.props) {
  38 + return target.props.text;
  39 + }
  40 +
  41 + return target;
  42 + };
  43 +
  44 + const accountColumnsInit = () => {
  45 + let columns = ACCOUNT_COLUMNS.map((item) => {
  46 + let newItem = { ...item };
  47 + let dataIndex = item.dataIndex;
  48 +
  49 + newItem.render = (text, record) => {
  50 + let textValue = record[dataIndex];
  51 + return <EllipsisDiv text={getTableCellText(textValue)} />;
  52 + };
  53 +
  54 + return newItem;
  55 + });
  56 +
  57 + columns.push({
  58 + title: '操作',
  59 + valueType: 'option',
  60 + key: 'option',
  61 + fixed: 'right',
  62 + width: 240,
  63 + render: (text, record) => {
  64 + let btns = [];
  65 + btns.push(
  66 + <Button
  67 + className="p-0 ml-2"
  68 + key="points"
  69 + type="link"
  70 + onClick={() => {
  71 + setCurrentOptUserObj(record);
  72 + setPointsExchangeModalVisible(true);
  73 + }}
  74 + >
  75 + 积分兑换
  76 + </Button>,
  77 + );
  78 + btns.push(
  79 + <Button
  80 + className="p-0"
  81 + key="view"
  82 + type="link"
  83 + onClick={() => {
  84 + setCurrentOptUserObj(record);
  85 + setBalanceChangeRecordsModalVisible(true);
  86 + }}
  87 + >
  88 + 消费记录
  89 + </Button>,
  90 + );
  91 + btns.push(
  92 + <Button
  93 + className="p-0 ml-2"
  94 + key="pointsRecords"
  95 + type="link"
  96 + onClick={() => {
  97 + setCurrentOptUserObj(record);
  98 + setPointsExchangeRecordsModalVisible(true);
  99 + }}
  100 + >
  101 + 积分兑换记录
  102 + </Button>,
  103 + );
  104 + return btns;
  105 + },
  106 + });
  107 +
  108 + return columns;
  109 + };
  110 +
  111 + return (
  112 + <div className="prepaid-account">
  113 + <ProTable
  114 + columns={accountColumnsInit()}
  115 + actionRef={accountActionRef}
  116 + cardBordered
  117 + pagination={{
  118 + pageSize: 10,
  119 + }}
  120 + request={async (params) => {
  121 + const res = await postCanrdApiUserList({
  122 + data: { ...params },
  123 + });
  124 + const data = res?.data?.data || [];
  125 + const targetPhones = [
  126 + '18550286106',
  127 + '15286038815',
  128 + '15202597163',
  129 + '13267086260',
  130 + '15900392469',
  131 + '13529047645',
  132 + ];
  133 +
  134 + const processedData = data.map((item) => {
  135 + const isAdmin = user.roles.includes('ADMIN');
  136 + const isSalesManager = user.roles.includes('SALES_MANAGER');
  137 + if (
  138 + targetPhones.includes(item.phone) &&
  139 + !(isAdmin || isSalesManager)
  140 + ) {
  141 + return {
  142 + ...item,
  143 + nowMoney: '****',
  144 + };
  145 + }
  146 + return item;
  147 + });
  148 + return {
  149 + data: processedData,
  150 + total: res?.data?.total || 0,
  151 + };
  152 + }}
  153 + columnsState={{
  154 + persistenceKey: 'pro-table-singe-account',
  155 + persistenceType: 'localStorage',
  156 + defaultValue: {
  157 + option: { fixed: 'right', disable: true },
  158 + },
  159 + onChange(value) {
  160 + console.log('value: ', value);
  161 + },
  162 + }}
  163 + rowKey="id"
  164 + search={{
  165 + labelWidth: 'auto',
  166 + }}
  167 + options={{
  168 + setting: {
  169 + listsHeight: 400,
  170 + },
  171 + }}
  172 + form={{}}
  173 + dateFormatter="string"
  174 + headerTitle="账号列表"
  175 + scroll={{ x: 1400 }}
  176 + toolBarRender={() => []}
  177 + />
  178 +
  179 + {balanceChangeRecordsModalVisible && (
  180 + <BalanceChangeRecordsModal
  181 + setVisible={setBalanceChangeRecordsModalVisible}
  182 + userInfoObj={currentOptUserObj}
  183 + onClose={() => {
  184 + setBalanceChangeRecordsModalVisible(false);
  185 + reloadAccountTable();
  186 + }}
  187 + />
  188 + )}
  189 +
  190 + {pointsExchangeModalVisible && (
  191 + <PointsExchangeModal
  192 + setVisible={setPointsExchangeModalVisible}
  193 + userInfoObj={
  194 + currentOptUserObj
  195 + ? { ...currentOptUserObj, relationEntityType: 'USER' }
  196 + : { uid: '', relationEntityType: 'USER' }
  197 + }
  198 + onClose={() => {
  199 + setPointsExchangeModalVisible(false);
  200 + reloadAccountTable();
  201 + }}
  202 + />
  203 + )}
  204 +
  205 + {pointsExchangeRecordsModalVisible && (
  206 + <PointsExchangeRecordsModal
  207 + setVisible={setPointsExchangeRecordsModalVisible}
  208 + userInfoObj={
  209 + currentOptUserObj
  210 + ? { ...currentOptUserObj, relationEntityType: 'USER' }
  211 + : { uid: '', relationEntityType: 'USER' }
  212 + }
  213 + onClose={() => {
  214 + setPointsExchangeRecordsModalVisible(false);
  215 + }}
  216 + />
  217 + )}
  218 + </div>
  219 + );
  220 +};
  221 +
  222 +export default PrepaidAccountPage;
... ...
src/pages/Prepaid/PrepaidRecharge/index.less 0 → 100644
  1 +.prepaid-recharge {
  2 + width: 100%;
  3 + padding: 24px;
  4 +
  5 + td {
  6 + font-family: 'San Francisco', 'Helvetica Neue', Helvetica, Arial,
  7 + 'Microsoft YaHei', 'PingFang SC', 'Hiragino Sans GB', 'Heiti SC',
  8 + 'WenQuanYi Micro Hei', sans-serif;
  9 + font-size: 13px;
  10 + }
  11 +}
... ...
src/pages/Prepaid/PrepaidRecharge/index.tsx 0 → 100644
  1 +import ButtonConfirm from '@/components/ButtomConfirm';
  2 +import EllipsisDiv from '@/components/Div/EllipsisDiv';
  3 +import { RESPONSE_CODE } from '@/constants/enum';
  4 +import { postPrepaidDelete, postPrepaidList } from '@/services';
  5 +import { enumValueToLabel, formatDateTime } from '@/utils';
  6 +import { PlusOutlined } from '@ant-design/icons';
  7 +import { ActionType, ProTable } from '@ant-design/pro-components';
  8 +import { Button, Divider, Image, message } from 'antd';
  9 +import { cloneDeep } from 'lodash';
  10 +import React, { useRef, useState } from 'react';
  11 +import CheckModal from '../../Order/Order/components/CheckModal';
  12 +import { CHECK_TYPE } from '../../Order/constant';
  13 +import RechargePrepaymentModal from '../components/RechargePrepaymentModal';
  14 +import {
  15 + PREPAID_STATUS_OPTIONS,
  16 + SALES_RECHARGE_PREPAYMENT_COLUMNS,
  17 +} from '../constant';
  18 +import './index.less';
  19 +
  20 +const PrepaidRechargePage = () => {
  21 + const prepaidActionRef = useRef<ActionType>();
  22 + const [rechargePrepaymentModalVisible, setRechargePrepaymentModalVisible] =
  23 + useState<boolean>(false);
  24 + const [currentOptPrepaymentObj, setCurrentOptPrepaymentObj] = useState(null);
  25 + const [checkVisible, setCheckVisible] = useState<boolean>(false);
  26 +
  27 + const reloadPrepaidTable = () => {
  28 + prepaidActionRef.current?.reload();
  29 + };
  30 +
  31 + /**
  32 + * 加载预存充值表格的各个列格式
  33 + */
  34 + const prepaidColumnsInit = () => {
  35 + let columns = SALES_RECHARGE_PREPAYMENT_COLUMNS.map((item) => {
  36 + let newItem = { ...item };
  37 + let dataIndex = item.dataIndex;
  38 +
  39 + newItem.render = (text, record) => {
  40 + let textValue = record[dataIndex];
  41 +
  42 + if (dataIndex === 'status') {
  43 + textValue = enumValueToLabel(textValue, PREPAID_STATUS_OPTIONS);
  44 + }
  45 +
  46 + if (dataIndex.endsWith('Time')) {
  47 + textValue = formatDateTime(textValue);
  48 + }
  49 +
  50 + if (
  51 + dataIndex === 'proofImages' &&
  52 + textValue !== null &&
  53 + textValue !== undefined
  54 + ) {
  55 + return (
  56 + <Image.PreviewGroup
  57 + className="mr-10"
  58 + preview={{
  59 + onChange: (current, prev) =>
  60 + console.log(`current index: ${current}, prev index: ${prev}`),
  61 + }}
  62 + >
  63 + {textValue.map((item, index) => (
  64 + <React.Fragment key={index}>
  65 + {index > 0 ? <Divider type="vertical" /> : ''}
  66 + <Image
  67 + className="max-h-[35px] max-w-[45px]"
  68 + src={item}
  69 + title={item}
  70 + />{' '}
  71 + </React.Fragment>
  72 + ))}
  73 + </Image.PreviewGroup>
  74 + );
  75 + }
  76 +
  77 + return <EllipsisDiv text={textValue} />;
  78 + };
  79 +
  80 + return newItem;
  81 + });
  82 +
  83 + columns.push({
  84 + title: '操作',
  85 + valueType: 'option',
  86 + key: 'option',
  87 + fixed: 'right',
  88 + width: 120,
  89 + render: (text, record) => {
  90 + let btns = [];
  91 + let opts = record.operations;
  92 + if (opts?.includes('modify')) {
  93 + btns.push(
  94 + <Button
  95 + className="p-0"
  96 + key="modify"
  97 + type="link"
  98 + onClick={() => {
  99 + setRechargePrepaymentModalVisible(true);
  100 + setCurrentOptPrepaymentObj(cloneDeep(record));
  101 + }}
  102 + >
  103 + 编辑
  104 + </Button>,
  105 + );
  106 + }
  107 +
  108 + if (opts?.includes('audit')) {
  109 + btns.push(
  110 + <Button
  111 + className="p-0"
  112 + key="view"
  113 + type="link"
  114 + onClick={() => {
  115 + setCurrentOptPrepaymentObj(record);
  116 + setCheckVisible(true);
  117 + }}
  118 + >
  119 + 审核
  120 + </Button>,
  121 + );
  122 + }
  123 +
  124 + if (opts?.includes('delete')) {
  125 + btns.push(
  126 + <ButtonConfirm
  127 + key="delete"
  128 + className="p-0"
  129 + title={'确认删除这条预存记录吗?'}
  130 + text="删除"
  131 + onConfirm={async () => {
  132 + let res = await postPrepaidDelete({
  133 + data: { ids: [record.id] },
  134 + });
  135 + if (res && res.result === RESPONSE_CODE.SUCCESS) {
  136 + message.success(res.message);
  137 + reloadPrepaidTable();
  138 + }
  139 + }}
  140 + />,
  141 + );
  142 + }
  143 + return btns;
  144 + },
  145 + });
  146 +
  147 + return columns;
  148 + };
  149 +
  150 + return (
  151 + <div className="prepaid-recharge">
  152 + <ProTable
  153 + columns={prepaidColumnsInit()}
  154 + actionRef={prepaidActionRef}
  155 + cardBordered
  156 + pagination={{
  157 + pageSize: 10,
  158 + }}
  159 + request={async (params) => {
  160 + const res = await postPrepaidList({
  161 + data: { ...params },
  162 + });
  163 + return {
  164 + data: res?.data?.data || [],
  165 + total: res?.data?.total || 0,
  166 + };
  167 + }}
  168 + columnsState={{
  169 + persistenceKey: 'pro-table-singe-prepaid',
  170 + persistenceType: 'localStorage',
  171 + defaultValue: {
  172 + option: { fixed: 'right', disable: true },
  173 + },
  174 + onChange(value) {
  175 + console.log('value: ', value);
  176 + },
  177 + }}
  178 + rowKey="id"
  179 + search={{
  180 + labelWidth: 'auto',
  181 + }}
  182 + options={{
  183 + setting: {
  184 + listsHeight: 400,
  185 + },
  186 + }}
  187 + form={{}}
  188 + dateFormatter="string"
  189 + headerTitle="预存充值"
  190 + scroll={{ x: 1400 }}
  191 + toolBarRender={() => [
  192 + <Button
  193 + key="button"
  194 + icon={<PlusOutlined />}
  195 + onClick={() => {
  196 + setCurrentOptPrepaymentObj(null);
  197 + setRechargePrepaymentModalVisible(true);
  198 + }}
  199 + type="primary"
  200 + >
  201 + 新增充值
  202 + </Button>,
  203 + ]}
  204 + />
  205 +
  206 + {rechargePrepaymentModalVisible && (
  207 + <RechargePrepaymentModal
  208 + setVisible={setRechargePrepaymentModalVisible}
  209 + prepaymentObject={currentOptPrepaymentObj}
  210 + onClose={() => {
  211 + setRechargePrepaymentModalVisible(false);
  212 + reloadPrepaidTable();
  213 + }}
  214 + />
  215 + )}
  216 +
  217 + {checkVisible && (
  218 + <CheckModal
  219 + setCheckVisible={setCheckVisible}
  220 + data={currentOptPrepaymentObj}
  221 + subOrders={[]}
  222 + orderCheckType={CHECK_TYPE.PREPAID_AUDIT}
  223 + openOrderDrawer={null}
  224 + onClose={() => {
  225 + setCheckVisible(false);
  226 + reloadPrepaidTable();
  227 + }}
  228 + />
  229 + )}
  230 + </div>
  231 + );
  232 +};
  233 +
  234 +export default PrepaidRechargePage;
... ...
src/pages/Prepaid/PrivatePocket/components/AddPrivatePocketModal.tsx 0 → 100644
  1 +import {
  2 + postCanrdPrivatePocketSave,
  3 + postServiceOrderQuerySalesCode,
  4 +} from '@/services';
  5 +import { getUserInfo } from '@/utils/user';
  6 +import { Form, Input, Modal, Select, message } from 'antd';
  7 +import React, { useEffect, useState } from 'react';
  8 +
  9 +interface AddPrivatePocketModalProps {
  10 + visible: boolean;
  11 + onCancel: () => void;
  12 + onSuccess: () => void;
  13 +}
  14 +
  15 +interface SalesCodeItem {
  16 + number: string | null;
  17 + userName: string;
  18 +}
  19 +
  20 +const AddPrivatePocketModal: React.FC<AddPrivatePocketModalProps> = ({
  21 + visible,
  22 + onCancel,
  23 + onSuccess,
  24 +}) => {
  25 + const [form] = Form.useForm();
  26 + const [salesCodeList, setSalesCodeList] = useState<SalesCodeItem[]>([]);
  27 + const [loading, setLoading] = useState<boolean>(false);
  28 + const userInfo = getUserInfo();
  29 + const userName = userInfo?.username || '';
  30 +
  31 + const fetchSalesCodeList = async () => {
  32 + try {
  33 + const res = await postServiceOrderQuerySalesCode();
  34 + if (res?.data) {
  35 + setSalesCodeList(res.data);
  36 + }
  37 + } catch (error) {
  38 + console.error('获取销售编码列表失败:', error);
  39 + message.error('获取销售编码列表失败');
  40 + }
  41 + };
  42 +
  43 + useEffect(() => {
  44 + if (visible) {
  45 + fetchSalesCodeList();
  46 + form.resetFields();
  47 + }
  48 + }, [visible, form]);
  49 +
  50 + const handleSubmit = async () => {
  51 + try {
  52 + const values = await form.validateFields();
  53 + setLoading(true);
  54 +
  55 + const res = await postCanrdPrivatePocketSave({
  56 + data: {
  57 + account: values.account,
  58 + salesCode: values.salesCode,
  59 + createByName: userName,
  60 + },
  61 + });
  62 +
  63 + if (res?.result === 0 || res?.code === 200 || res?.success) {
  64 + message.success('添加隐私钱包成功');
  65 + onSuccess();
  66 + } else {
  67 + message.error(res?.message || '添加失败');
  68 + }
  69 + } catch (error) {
  70 + console.error('添加隐私钱包失败:', error);
  71 + } finally {
  72 + setLoading(false);
  73 + }
  74 + };
  75 +
  76 + return (
  77 + <Modal
  78 + title="添加隐私钱包"
  79 + open={visible}
  80 + onCancel={onCancel}
  81 + onOk={handleSubmit}
  82 + confirmLoading={loading}
  83 + destroyOnClose
  84 + >
  85 + <Form form={form} layout="vertical">
  86 + <Form.Item
  87 + name="account"
  88 + label="绑定普通账户"
  89 + rules={[{ required: true, message: '请输入手机号' }]}
  90 + >
  91 + <Input placeholder="请输入手机号" />
  92 + </Form.Item>
  93 + <Form.Item
  94 + name="salesCode"
  95 + label="负责销售"
  96 + rules={[{ required: true, message: '请选择负责销售' }]}
  97 + >
  98 + <Select
  99 + placeholder="请选择负责销售"
  100 + showSearch
  101 + optionFilterProp="children"
  102 + filterOption={(input, option) =>
  103 + (option?.label?.toString() || '')
  104 + .toLowerCase()
  105 + .includes(input.toLowerCase())
  106 + }
  107 + options={salesCodeList.map((item) => ({
  108 + value: item.userName,
  109 + label: item.userName,
  110 + }))}
  111 + />
  112 + </Form.Item>
  113 + </Form>
  114 + </Modal>
  115 + );
  116 +};
  117 +
  118 +export default AddPrivatePocketModal;
... ...
src/pages/Prepaid/PrivatePocket/constant.tsx 0 → 100644
  1 +export const PRIVATE_POCKET_COLUMNS = [
  2 + {
  3 + title: '用户ID',
  4 + dataIndex: 'uid',
  5 + key: 'uid',
  6 + valueType: 'text',
  7 + hideInTable: true,
  8 + hideInSearch: true,
  9 + },
  10 + {
  11 + title: '用户账号',
  12 + dataIndex: 'account',
  13 + key: 'account',
  14 + valueType: 'text',
  15 + fieldProps: {
  16 + placeholder: '请输入用户账号',
  17 + },
  18 + },
  19 + {
  20 + title: '真实姓名',
  21 + dataIndex: 'realName',
  22 + key: 'realName',
  23 + valueType: 'text',
  24 + hideInSearch: true,
  25 + },
  26 + {
  27 + title: '用户余额',
  28 + dataIndex: 'nowMoney',
  29 + key: 'nowMoney',
  30 + valueType: 'money',
  31 + hideInSearch: true,
  32 + },
  33 + {
  34 + title: '隐私余额',
  35 + dataIndex: 'privateMoney',
  36 + key: 'privateMoney',
  37 + valueType: 'money',
  38 + hideInSearch: true,
  39 + },
  40 + {
  41 + title: '负责销售',
  42 + dataIndex: 'salesCode',
  43 + key: 'salesCode',
  44 + valueType: 'text',
  45 + fieldProps: {
  46 + placeholder: '请输入负责销售',
  47 + },
  48 + },
  49 + {
  50 + title: '创建人',
  51 + dataIndex: 'createByName',
  52 + key: 'createByName',
  53 + valueType: 'text',
  54 + hideInSearch: true,
  55 + },
  56 + {
  57 + title: '创建时间',
  58 + dataIndex: 'createTime',
  59 + key: 'createTime',
  60 + valueType: 'dateTime',
  61 + hideInSearch: true,
  62 + },
  63 + // {
  64 + // title: '更新时间',
  65 + // dataIndex: 'updateTime',
  66 + // key: 'updateTime',
  67 + // valueType: 'dateTime',
  68 + // hideInSearch: true,
  69 + // },
  70 +];
... ...
src/pages/Prepaid/PrivatePocket/index.less 0 → 100644
  1 +.private-pocket-index {
  2 + width: 100%;
  3 + padding: 24px;
  4 +
  5 + td {
  6 + font-family: 'San Francisco', 'Helvetica Neue', Helvetica, Arial,
  7 + 'Microsoft YaHei', 'PingFang SC', 'Hiragino Sans GB', 'Heiti SC',
  8 + 'WenQuanYi Micro Hei', sans-serif;
  9 + font-size: 13px;
  10 + }
  11 +}
... ...
src/pages/Prepaid/PrivatePocket/index.tsx 0 → 100644
  1 +import ButtonConfirm from '@/components/ButtomConfirm';
  2 +import EllipsisDiv from '@/components/Div/EllipsisDiv';
  3 +import { RESPONSE_CODE } from '@/constants/enum';
  4 +import {
  5 + postCanrdPrivatePocketDelete,
  6 + postCanrdPrivatePocketList,
  7 +} from '@/services';
  8 +import { formatDateTime } from '@/utils';
  9 +import { ActionType, ProTable } from '@ant-design/pro-components';
  10 +import { Button, message } from 'antd';
  11 +import { useRef, useState } from 'react';
  12 +import AddPrivatePocketModal from './components/AddPrivatePocketModal';
  13 +import { PRIVATE_POCKET_COLUMNS } from './constant';
  14 +import './index.less';
  15 +
  16 +const PrivatePocketPage = () => {
  17 + const actionRef = useRef<ActionType>();
  18 + const [addModalVisible, setAddModalVisible] = useState<boolean>(false);
  19 +
  20 + const reloadTable = () => {
  21 + actionRef.current?.reload();
  22 + };
  23 +
  24 + const getTableCellText = (target: any) => {
  25 + if (!target) {
  26 + return '';
  27 + }
  28 +
  29 + if (target.props) {
  30 + return target.props.text;
  31 + }
  32 +
  33 + return target;
  34 + };
  35 +
  36 + const columnsInit = () => {
  37 + let columns = PRIVATE_POCKET_COLUMNS.map((item) => {
  38 + let newItem = { ...item };
  39 + let dataIndex = item.dataIndex;
  40 +
  41 + newItem.render = (text: any, record: any) => {
  42 + let textValue = record[dataIndex];
  43 +
  44 + if (dataIndex.endsWith('Time')) {
  45 + textValue = formatDateTime(textValue);
  46 + }
  47 +
  48 + return <EllipsisDiv text={getTableCellText(textValue)} />;
  49 + };
  50 +
  51 + return newItem;
  52 + });
  53 +
  54 + columns.push({
  55 + title: '操作',
  56 + valueType: 'option',
  57 + key: 'option',
  58 + width: 120,
  59 + render: (text: any, record: any) => {
  60 + let btns = [];
  61 +
  62 + btns.push(
  63 + <ButtonConfirm
  64 + key="delete"
  65 + className="p-0"
  66 + title={'确认删除这条隐私钱包记录吗?'}
  67 + text="删除"
  68 + onConfirm={async () => {
  69 + let res = await postCanrdPrivatePocketDelete({
  70 + data: { uid: record.uid },
  71 + });
  72 + if (res && res.result === RESPONSE_CODE.SUCCESS) {
  73 + message.success('删除成功');
  74 + reloadTable();
  75 + }
  76 + }}
  77 + />,
  78 + );
  79 +
  80 + return btns;
  81 + },
  82 + });
  83 +
  84 + return columns;
  85 + };
  86 +
  87 + return (
  88 + <div className="private-pocket-index">
  89 + <ProTable
  90 + columns={columnsInit()}
  91 + actionRef={actionRef}
  92 + cardBordered
  93 + pagination={{
  94 + pageSize: 10,
  95 + }}
  96 + request={async (params) => {
  97 + const res = await postCanrdPrivatePocketList({
  98 + data: { ...params },
  99 + });
  100 + const list = res?.data?.data || [];
  101 + return {
  102 + data: list,
  103 + success: true,
  104 + total: res?.data?.total || 0,
  105 + };
  106 + }}
  107 + columnsState={{
  108 + persistenceKey: 'pro-table-private-pocket',
  109 + persistenceType: 'localStorage',
  110 + defaultValue: {
  111 + option: { fixed: 'right', disable: true },
  112 + },
  113 + onChange(value) {
  114 + console.log('value: ', value);
  115 + },
  116 + }}
  117 + rowKey="uid"
  118 + search={{
  119 + labelWidth: 'auto',
  120 + }}
  121 + options={{
  122 + setting: {
  123 + listsHeight: 400,
  124 + },
  125 + }}
  126 + form={{}}
  127 + dateFormatter="string"
  128 + headerTitle="隐私钱包"
  129 + scroll={{ x: 1400 }}
  130 + toolBarRender={() => [
  131 + <Button
  132 + key="add"
  133 + type="primary"
  134 + onClick={() => setAddModalVisible(true)}
  135 + >
  136 + 添加
  137 + </Button>,
  138 + ]}
  139 + />
  140 +
  141 + {addModalVisible && (
  142 + <AddPrivatePocketModal
  143 + visible={addModalVisible}
  144 + onCancel={() => setAddModalVisible(false)}
  145 + onSuccess={() => {
  146 + setAddModalVisible(false);
  147 + reloadTable();
  148 + }}
  149 + />
  150 + )}
  151 + </div>
  152 + );
  153 +};
  154 +
  155 +export default PrivatePocketPage;
... ...
src/pages/Prepaid/components/RechargePrepaymentModal.tsx
... ... @@ -30,8 +30,10 @@ export default ({ setVisible, prepaymentObject, onClose }) =&gt; {
30 30 salesCode: string;
31 31 rechargeAmount: number;
32 32 notes: string;
  33 + rechargeType: string; // 充值类型
33 34 }>();
34 35 const [salesCodeOptions, setSalesCodeOptions] = useState([]);
  36 + const [setRechargeType] = useState<string>('normal'); // 默认普通充值
35 37 const [isCreate, setIsCreate] = useState(true);
36 38 const [fileList, setFileList] = useState<UploadFile[]>([]);
37 39 const [previewOpen, setPreviewOpen] = useState(false);
... ... @@ -243,7 +245,8 @@ export default ({ setVisible, prepaymentObject, onClose }) =&gt; {
243 245 },
244 246 }}
245 247 onFinish={async (values) => {
246   - if (fileList.length <= 0) {
  248 + // 隐私钱包充值不需要凭证
  249 + if (values.rechargeType !== 'privatePocket' && fileList.length <= 0) {
247 250 message.error('凭证不能为空');
248 251 return;
249 252 }
... ... @@ -278,6 +281,12 @@ export default ({ setVisible, prepaymentObject, onClose }) =&gt; {
278 281 }
279 282 }
280 283 }
  284 + // 所有充值类型都传递rechargeType参数
  285 + // 如果是隐私钱包充值且不需要凭证,直接创建空凭证数组
  286 + if (values.rechargeType === 'privatePocket' && fileList.length <= 0) {
  287 + values.proofImages = [];
  288 + }
  289 + // 普通充值流程
281 290 let res = await postServiceOrderFileProcess({
282 291 data: formData,
283 292 });
... ... @@ -302,6 +311,8 @@ export default ({ setVisible, prepaymentObject, onClose }) =&gt; {
302 311 data: {
303 312 ...values,
304 313 customerName: form.getFieldValue('customerNameString'),
  314 + // 传递充值类型参数
  315 + rechargeType: values.rechargeType || 'normal',
305 316 },
306 317 });
307 318 } else {
... ... @@ -312,7 +323,11 @@ export default ({ setVisible, prepaymentObject, onClose }) =&gt; {
312 323 body.customerName = customerNameString;
313 324 }
314 325 res = await postPrepaidUpdate({
315   - data: body,
  326 + data: {
  327 + ...body,
  328 + // 传递充值类型参数
  329 + rechargeType: values.rechargeType || 'normal',
  330 + },
316 331 });
317 332 }
318 333  
... ... @@ -416,6 +431,21 @@ export default ({ setVisible, prepaymentObject, onClose }) =&gt; {
416 431 rules={[{ required: true, message: '销售代表必填' }]}
417 432 options={salesCodeOptions}
418 433 />
  434 + <ProFormSelect
  435 + name="rechargeType"
  436 + label="充值类型"
  437 + initialValue="normal"
  438 + valueEnum={{
  439 + normal: '普通充值',
  440 + privatePocket: '隐私钱包充值',
  441 + }}
  442 + fieldProps={{
  443 + onChange: (value) => {
  444 + setRechargeType(value);
  445 + },
  446 + }}
  447 + rules={[{ required: true, message: '请选择充值类型' }]}
  448 + />
419 449 <ProFormDigit
420 450 name="rechargeAmount"
421 451 label="充值金额(¥)"
... ...
src/pages/Prepaid/index.less
1   -.prepaid-index td {
2   - font-family: 'San Francisco', 'Helvetica Neue', Helvetica, Arial,
3   - 'Microsoft YaHei', 'PingFang SC', 'Hiragino Sans GB', 'Heiti SC',
4   - 'WenQuanYi Micro Hei', sans-serif;
5   - font-size: 13px;
  1 +.prepaid-index {
  2 + width: 100%;
  3 + padding: 24px;
  4 +
  5 + .prepaid-card {
  6 + height: 180px;
  7 + transition: all 0.3s;
  8 +
  9 + &:hover {
  10 + transform: translateY(-5px);
  11 + box-shadow: 0 5px 15px rgba(0, 0, 0, 10%);
  12 + }
  13 +
  14 + .card-content {
  15 + display: flex;
  16 + flex-direction: column;
  17 + align-items: center;
  18 + justify-content: center;
  19 + height: 100%;
  20 +
  21 + .card-icon {
  22 + font-size: 36px;
  23 + margin-bottom: 16px;
  24 + color: #1890ff;
  25 + }
  26 +
  27 + .card-title {
  28 + font-size: 18px;
  29 + font-weight: 500;
  30 + margin-bottom: 12px;
  31 + }
  32 +
  33 + .card-desc {
  34 + color: rgba(0, 0, 0, 45%);
  35 + text-align: center;
  36 + padding: 0 12px;
  37 + }
  38 + }
  39 + }
  40 +
  41 + td {
  42 + font-family: 'San Francisco', 'Helvetica Neue', Helvetica, Arial,
  43 + 'Microsoft YaHei', 'PingFang SC', 'Hiragino Sans GB', 'Heiti SC',
  44 + 'WenQuanYi Micro Hei', sans-serif;
  45 + font-size: 13px;
  46 + }
6 47 }
... ...
src/pages/Prepaid/index.tsx
1   -import ButtonConfirm from '@/components/ButtomConfirm';
2   -import EllipsisDiv from '@/components/Div/EllipsisDiv';
3   -import { RESPONSE_CODE } from '@/constants/enum';
4   -import {} from '@/pages/Invoice/constant';
5 1 import {
6   - postCanrdApiUserList,
7   - postPrepaidDelete,
8   - postPrepaidList,
9   -} from '@/services';
10   -import { enumValueToLabel, formatDateTime } from '@/utils';
11   -import { getUserInfo } from '@/utils/user';
12   -import { PlusOutlined } from '@ant-design/icons';
13   -import { ActionType, ProTable } from '@ant-design/pro-components';
14   -import { Button, Divider, Image, Tabs, message } from 'antd';
15   -import { cloneDeep } from 'lodash';
16   -import React, { useRef, useState } from 'react';
17   -import CheckModal from '../Order/Order/components/CheckModal';
18   -import { CHECK_TYPE } from '../Order/constant';
19   -import BalanceChangeRecordsModal from './components/BalanceChangeRecordsModal';
20   -import PointsExchangeModal from './components/PointsExchangeModal';
21   -import PointsExchangeRecordsModal from './components/PointsExchangeRecordsModal';
22   -import RechargePrepaymentModal from './components/RechargePrepaymentModal';
23   -import {
24   - ACCOUNT_COLUMNS,
25   - PREPAID_STATUS_OPTIONS,
26   - SALES_RECHARGE_PREPAYMENT_COLUMNS,
27   -} from './constant';
  2 + CreditCardOutlined,
  3 + MoneyCollectOutlined,
  4 + UserOutlined,
  5 +} from '@ant-design/icons';
  6 +import { Card, Col, Row } from 'antd';
  7 +import { history } from 'umi';
28 8 import './index.less';
29 9  
30 10 const PrepaidPage = () => {
31   - const user = getUserInfo();
32   - const prepaidActionRef = useRef<ActionType>();
33   - const accountActionRef = useRef<ActionType>();
34   - const [rechargePrepaymentModalVisible, setRechargePrepaymentModalVisible] =
35   - useState<boolean>(false);
36   - const [currentOptPrepaymentObj, setCurrentOptPrepaymentObj] = useState(null);
37   - const [currentOptUserObj, setCurrentOptUserObj] = useState(null);
38   - const [checkVisible, setCheckVisible] = useState<boolean>(false);
39   - const [
40   - balanceChangeRecordsModalVisible,
41   - setBalanceChangeRecordsModalVisible,
42   - ] = useState<boolean>(false);
43   - const [pointsExchangeModalVisible, setPointsExchangeModalVisible] =
44   - useState<boolean>(false);
45   - const [
46   - pointsExchangeRecordsModalVisible,
47   - setPointsExchangeRecordsModalVisible,
48   - ] = useState<boolean>(false);
49   -
50   - const reloadPrepaidTable = () => {
51   - prepaidActionRef.current?.reload();
52   - };
53   -
54   - const reloadAccountTable = () => {
55   - accountActionRef.current?.reload();
56   - };
57   -
58   - const getTableCellText = (target: any) => {
59   - if (!target) {
60   - return '';
61   - }
62   -
63   - if (target.props) {
64   - return target.props.text;
65   - }
66   -
67   - return target;
68   - };
69   -
70   - /**
71   - * 加载发票列表表格的各个列格式
72   - */
73   - const prepaidColumnsInit = () => {
74   - let columns = SALES_RECHARGE_PREPAYMENT_COLUMNS.map((item) => {
75   - let newItem = { ...item };
76   - let dataIndex = item.dataIndex;
77   -
78   - newItem.render = (text, record) => {
79   - let textValue = record[dataIndex];
80   -
81   - if (dataIndex === 'status') {
82   - textValue = enumValueToLabel(textValue, PREPAID_STATUS_OPTIONS);
83   - }
84   -
85   - if (dataIndex.endsWith('Time')) {
86   - textValue = formatDateTime(textValue);
87   - }
88   -
89   - if (
90   - dataIndex === 'proofImages' &&
91   - textValue !== null &&
92   - textValue !== undefined
93   - ) {
94   - console.log(textValue);
95   - return (
96   - <Image.PreviewGroup
97   - className="mr-10"
98   - preview={{
99   - onChange: (current, prev) =>
100   - console.log(`current index: ${current}, prev index: ${prev}`),
101   - }}
102   - >
103   - {textValue.map((item, index) => (
104   - <React.Fragment key={index}>
105   - {index > 0 ? <Divider type="vertical" /> : ''}
106   - <Image
107   - className="max-h-[35px] max-w-[45px]"
108   - src={item}
109   - title={item}
110   - />{' '}
111   - </React.Fragment>
112   - ))}
113   - </Image.PreviewGroup>
114   - );
115   - }
116   -
117   - return <EllipsisDiv text={textValue} />;
118   - };
119   -
120   - return newItem;
121   - });
122   -
123   - columns.push({
124   - title: '操作',
125   - valueType: 'option',
126   - key: 'option',
127   - fixed: 'right',
128   - width: 120,
129   - render: (text, record) => {
130   - let btns = [];
131   - let opts = record.operations;
132   - if (opts?.includes('modify')) {
133   - btns.push(
134   - <Button
135   - className="p-0"
136   - key="modify"
137   - type="link"
138   - onClick={() => {
139   - setRechargePrepaymentModalVisible(true);
140   - setCurrentOptPrepaymentObj(cloneDeep(record));
141   - }}
142   - >
143   - 编辑
144   - </Button>,
145   - );
146   - }
147   -
148   - if (opts?.includes('audit')) {
149   - btns.push(
150   - <Button
151   - className="p-0"
152   - key="view"
153   - type="link"
154   - onClick={() => {
155   - setCurrentOptPrepaymentObj(record);
156   - setCheckVisible(true);
157   - }}
158   - >
159   - 审核
160   - </Button>,
161   - );
162   - }
163   -
164   - if (opts?.includes('delete')) {
165   - btns.push(
166   - <ButtonConfirm
167   - key="delete"
168   - className="p-0"
169   - title={'确认删除这条预存记录吗?'}
170   - text="删除"
171   - onConfirm={async () => {
172   - let res = await postPrepaidDelete({
173   - data: { ids: [record.id] },
174   - });
175   - if (res && res.result === RESPONSE_CODE.SUCCESS) {
176   - message.success(res.message);
177   - reloadPrepaidTable();
178   - }
179   - }}
180   - />,
181   - );
182   - }
183   - return btns;
184   - },
185   - });
186   -
187   - return columns;
  11 + const handleCardClick = (path: string) => {
  12 + history.push(path);
188 13 };
189 14  
190   - const accountColumnsInit = () => {
191   - let columns = ACCOUNT_COLUMNS.map((item) => {
192   - let newItem = { ...item };
193   - let dataIndex = item.dataIndex;
194   -
195   - newItem.render = (text, record) => {
196   - let textValue = record[dataIndex];
197   - return <EllipsisDiv text={getTableCellText(textValue)} />;
198   - };
199   -
200   - return newItem;
201   - });
202   -
203   - columns.push({
204   - title: '操作',
205   - valueType: 'option',
206   - key: 'option',
207   - fixed: 'right',
208   - width: 240,
209   - render: (text, record) => {
210   - let btns = [];
211   - btns.push(
212   - <Button
213   - className="p-0 ml-2"
214   - key="points"
215   - type="link"
216   - onClick={() => {
217   - setCurrentOptUserObj(record);
218   - setPointsExchangeModalVisible(true);
219   - }}
  15 + return (
  16 + <div className="prepaid-index">
  17 + <Row gutter={16}>
  18 + <Col span={8}>
  19 + <Card
  20 + hoverable
  21 + className="prepaid-card"
  22 + onClick={() => handleCardClick('/prepaid/recharge')}
220 23 >
221   - 积分兑换
222   - </Button>,
223   - );
224   - btns.push(
225   - <Button
226   - className="p-0"
227   - key="view"
228   - type="link"
229   - onClick={() => {
230   - setCurrentOptUserObj(record);
231   - setBalanceChangeRecordsModalVisible(true);
232   - }}
  24 + <div className="card-content">
  25 + <CreditCardOutlined className="card-icon" />
  26 + <div className="card-title">预存充值</div>
  27 + <div className="card-desc">管理预存充值记录、审核及编辑操作</div>
  28 + </div>
  29 + </Card>
  30 + </Col>
  31 + <Col span={8}>
  32 + <Card
  33 + hoverable
  34 + className="prepaid-card"
  35 + onClick={() => handleCardClick('/prepaid/account')}
233 36 >
234   - 消费记录
235   - </Button>,
236   - );
237   - btns.push(
238   - <Button
239   - className="p-0 ml-2"
240   - key="pointsRecords"
241   - type="link"
242   - onClick={() => {
243   - setCurrentOptUserObj(record);
244   - setPointsExchangeRecordsModalVisible(true);
245   - }}
  37 + <div className="card-content">
  38 + <UserOutlined className="card-icon" />
  39 + <div className="card-title">账号列表</div>
  40 + <div className="card-desc">查看账户信息、积分兑换及消费记录</div>
  41 + </div>
  42 + </Card>
  43 + </Col>
  44 + <Col span={8}>
  45 + <Card
  46 + hoverable
  47 + className="prepaid-card"
  48 + onClick={() => handleCardClick('/prepaid/privatePocket')}
246 49 >
247   - 积分兑换记录
248   - </Button>,
249   - );
250   - return btns;
251   - },
252   - });
253   -
254   - return columns;
255   - };
256   -
257   - const tabsItems = [
258   - {
259   - key: 1,
260   - label: '预存充值',
261   - children: (
262   - <ProTable
263   - columns={prepaidColumnsInit()}
264   - actionRef={prepaidActionRef}
265   - cardBordered
266   - pagination={{
267   - pageSize: 10,
268   - }}
269   - request={async (params) => {
270   - const res = await postPrepaidList({
271   - data: { ...params },
272   - });
273   - return {
274   - data: res?.data?.data || [],
275   - total: res?.data?.total || 0,
276   - };
277   - }}
278   - columnsState={{
279   - persistenceKey: 'pro-table-singe-prepaid',
280   - persistenceType: 'localStorage',
281   - defaultValue: {
282   - option: { fixed: 'right', disable: true },
283   - },
284   - onChange(value) {
285   - console.log('value: ', value);
286   - },
287   - }}
288   - rowKey="id"
289   - search={{
290   - labelWidth: 'auto',
291   - }}
292   - options={{
293   - setting: {
294   - listsHeight: 400,
295   - },
296   - }}
297   - form={{}}
298   - dateFormatter="string"
299   - headerTitle="预存充值"
300   - scroll={{ x: 1400 }}
301   - toolBarRender={() => [
302   - <Button
303   - key="button"
304   - icon={<PlusOutlined />}
305   - onClick={() => {
306   - setCurrentOptPrepaymentObj(null);
307   - setRechargePrepaymentModalVisible(true);
308   - }}
309   - type="primary"
310   - >
311   - 新增充值
312   - </Button>,
313   - ]}
314   - />
315   - ),
316   - },
317   - {
318   - key: 2,
319   - label: '账号列表',
320   - children: (
321   - <ProTable
322   - columns={accountColumnsInit()}
323   - actionRef={accountActionRef}
324   - cardBordered
325   - pagination={{
326   - pageSize: 10,
327   - }}
328   - request={async (params) => {
329   - const res = await postCanrdApiUserList({
330   - data: { ...params },
331   - });
332   - const data = res?.data?.data || [];
333   - const targetPhones = [
334   - '18550286106',
335   - '15286038815',
336   - '15202597163',
337   - '13267086260',
338   - '15900392469',
339   - '13529047645',
340   - ];
341   -
342   - const processedData = data.map((item) => {
343   - const isAdmin = user.roles.includes('ADMIN');
344   - const isSalesManager = user.roles.includes('SALES_MANAGER');
345   - if (
346   - targetPhones.includes(item.phone) &&
347   - !(isAdmin || isSalesManager)
348   - ) {
349   - return {
350   - ...item,
351   - nowMoney: '****',
352   - };
353   - }
354   - return item;
355   - });
356   - return {
357   - data: processedData,
358   - total: res?.data?.total || 0,
359   - };
360   - }}
361   - columnsState={{
362   - persistenceKey: 'pro-table-singe-account',
363   - persistenceType: 'localStorage',
364   - defaultValue: {
365   - option: { fixed: 'right', disable: true },
366   - },
367   - onChange(value) {
368   - console.log('value: ', value);
369   - },
370   - }}
371   - rowKey="id"
372   - search={{
373   - labelWidth: 'auto',
374   - }}
375   - options={{
376   - setting: {
377   - listsHeight: 400,
378   - },
379   - }}
380   - form={{}}
381   - dateFormatter="string"
382   - headerTitle="账号列表"
383   - scroll={{ x: 1400 }}
384   - toolBarRender={() => []}
385   - />
386   - ),
387   - },
388   - ];
389   - return (
390   - <div className="prepaid-index">
391   - <Tabs
392   - defaultActiveKey="1"
393   - items={tabsItems}
394   - onChange={(value) => {
395   - if (value === '1') {
396   - reloadPrepaidTable();
397   - } else {
398   - reloadAccountTable();
399   - }
400   - }}
401   - />
402   -
403   - {rechargePrepaymentModalVisible && (
404   - <RechargePrepaymentModal
405   - setVisible={setRechargePrepaymentModalVisible}
406   - onClose={() => {
407   - setRechargePrepaymentModalVisible(false);
408   - reloadPrepaidTable();
409   - }}
410   - prepaymentObject={currentOptPrepaymentObj}
411   - />
412   - )}
413   -
414   - {checkVisible && (
415   - <CheckModal
416   - setCheckVisible={(val: boolean) => {
417   - setCheckVisible(val);
418   - }}
419   - data={[currentOptPrepaymentObj]}
420   - subOrders={[currentOptPrepaymentObj]}
421   - orderCheckType={CHECK_TYPE.PREPAID_AUDIT}
422   - openOrderDrawer={false}
423   - onClose={() => {
424   - setCheckVisible(false);
425   - reloadPrepaidTable();
426   - }}
427   - />
428   - )}
429   -
430   - {balanceChangeRecordsModalVisible && (
431   - <BalanceChangeRecordsModal
432   - setVisible={(val: boolean) => {
433   - setBalanceChangeRecordsModalVisible(val);
434   - }}
435   - userInfoObj={currentOptUserObj}
436   - onClose={() => {
437   - setBalanceChangeRecordsModalVisible(false);
438   - }}
439   - />
440   - )}
441   -
442   - {pointsExchangeModalVisible && currentOptUserObj && (
443   - <PointsExchangeModal
444   - setVisible={(val: boolean) => {
445   - setPointsExchangeModalVisible(val);
446   - }}
447   - userInfoObj={currentOptUserObj}
448   - onClose={() => {
449   - setPointsExchangeModalVisible(false);
450   - reloadAccountTable();
451   - }}
452   - />
453   - )}
454   -
455   - {pointsExchangeRecordsModalVisible && currentOptUserObj && (
456   - <PointsExchangeRecordsModal
457   - setVisible={(val: boolean) => {
458   - setPointsExchangeRecordsModalVisible(val);
459   - }}
460   - userInfoObj={currentOptUserObj}
461   - onClose={() => {
462   - setPointsExchangeRecordsModalVisible(false);
463   - }}
464   - />
465   - )}
  50 + <div className="card-content">
  51 + <MoneyCollectOutlined className="card-icon" />
  52 + <div className="card-title">隐私钱包</div>
  53 + <div className="card-desc">管理用户隐私钱包信息</div>
  54 + </div>
  55 + </Card>
  56 + </Col>
  57 + </Row>
466 58 </div>
467 59 );
468 60 };
... ...
src/services/definition.ts
... ... @@ -4849,6 +4849,136 @@ export interface UserNowMoneyCheckRequest {
4849 4849 uid?: number;
4850 4850 }
4851 4851  
  4852 +export interface UserPrivatePocketBalanceUpdateRequest {
  4853 + /**
  4854 + * @description
  4855 + * 用户账号
  4856 + */
  4857 + account: string;
  4858 + /**
  4859 + * @description
  4860 + * 创建人
  4861 + */
  4862 + createByName?: string;
  4863 + /**
  4864 + * @description
  4865 + * 用户余额
  4866 + */
  4867 + nowMoney?: number;
  4868 + /**
  4869 + * @description
  4870 + * 隐私余额
  4871 + */
  4872 + privateMoney?: number;
  4873 + /**
  4874 + * @description
  4875 + * 真实姓名
  4876 + */
  4877 + realName?: string;
  4878 + /**
  4879 + * @description
  4880 + * 负责销售
  4881 + */
  4882 + salesCode: string;
  4883 + /**
  4884 + * @description
  4885 + * 用户id
  4886 + * @format int32
  4887 + */
  4888 + uid?: number;
  4889 +}
  4890 +
  4891 +export interface UserPrivatePocketDeleteRequest {
  4892 + /**
  4893 + * @description
  4894 + * 用户id
  4895 + * @format int32
  4896 + */
  4897 + uid: number;
  4898 +}
  4899 +
  4900 +export interface UserPrivatePocketDetailRequest {
  4901 + /**
  4902 + * @description
  4903 + * 用户id
  4904 + * @format int32
  4905 + */
  4906 + uid: number;
  4907 +}
  4908 +
  4909 +export interface UserPrivatePocketListRequest {
  4910 + /**
  4911 + * @description
  4912 + * 用户账号
  4913 + */
  4914 + account?: string;
  4915 + /**
  4916 + * @description
  4917 + * 当前页
  4918 + * @format int32
  4919 + * @example
  4920 + * 1
  4921 + */
  4922 + current?: number;
  4923 + /**
  4924 + * @description
  4925 + * 每页大小
  4926 + * @format int32
  4927 + * @example
  4928 + * 10
  4929 + */
  4930 + pageSize?: number;
  4931 + /**
  4932 + * @description
  4933 + * 真实姓名
  4934 + */
  4935 + realName?: string;
  4936 + /**
  4937 + * @description
  4938 + * 负责销售
  4939 + */
  4940 + salesCode?: string;
  4941 +}
  4942 +
  4943 +export interface UserPrivatePocketUpdateRequest {
  4944 + /**
  4945 + * @description
  4946 + * 用户账号
  4947 + */
  4948 + account: string;
  4949 + /**
  4950 + * @description
  4951 + * 创建人
  4952 + */
  4953 + createByName?: string;
  4954 + /**
  4955 + * @description
  4956 + * 用户余额
  4957 + */
  4958 + nowMoney?: number;
  4959 + /**
  4960 + * @description
  4961 + * 隐私余额
  4962 + */
  4963 + privateMoney?: number;
  4964 + /**
  4965 + * @description
  4966 + * 真实姓名
  4967 + */
  4968 + realName?: string;
  4969 + /**
  4970 + * @description
  4971 + * 负责销售
  4972 + */
  4973 + salesCode: string;
  4974 + /**
  4975 + * @description
  4976 + * 用户id
  4977 + * @format int32
  4978 + */
  4979 + uid?: number;
  4980 +}
  4981 +
4852 4982 export interface View {
4853 4983 contentType?: string;
4854 4984 }
... ... @@ -5471,6 +5601,11 @@ export interface SalesRechargePrepaymentAuditRequest {
5471 5601 * 手机号
5472 5602 */
5473 5603 phone?: string;
  5604 + /**
  5605 + * @description
  5606 + * 销售代表编码
  5607 + */
  5608 + salescode?: string;
5474 5609 }
5475 5610  
5476 5611 export interface SalesRechargePrepaymentCreateRequest {
... ... @@ -5511,6 +5646,13 @@ export interface SalesRechargePrepaymentCreateRequest {
5511 5646 rechargeSource?: string;
5512 5647 /**
5513 5648 * @description
  5649 + * 充值类型
  5650 + * @example
  5651 + * normal
  5652 + */
  5653 + rechargeType?: string;
  5654 + /**
  5655 + * @description
5514 5656 * 销售代表
5515 5657 */
5516 5658 salesCode?: string;
... ...
src/services/request.ts
... ... @@ -168,6 +168,11 @@ import type {
168 168 UserDetailRequest,
169 169 UserListRequest,
170 170 UserNowMoneyCheckRequest,
  171 + UserPrivatePocketBalanceUpdateRequest,
  172 + UserPrivatePocketDeleteRequest,
  173 + UserPrivatePocketDetailRequest,
  174 + UserPrivatePocketListRequest,
  175 + UserPrivatePocketUpdateRequest,
171 176 WarningOrderWhiteListDto,
172 177 WarningUserWhiteListDto,
173 178 } from './definition';
... ... @@ -3142,6 +3147,361 @@ export const postCanrdApiUserNowMoneyCheck = /* #__PURE__ */ (() =&gt; {
3142 3147 return request;
3143 3148 })();
3144 3149  
  3150 +/** @description request parameter type for postCanrdPrivatePocketDelete */
  3151 +export interface PostCanrdPrivatePocketDeleteOption {
  3152 + /**
  3153 + * @description
  3154 + * request
  3155 + */
  3156 + body: {
  3157 + /**
  3158 + @description
  3159 + request */
  3160 + request: UserPrivatePocketDeleteRequest;
  3161 + };
  3162 +}
  3163 +
  3164 +/** @description response type for postCanrdPrivatePocketDelete */
  3165 +export interface PostCanrdPrivatePocketDeleteResponse {
  3166 + /**
  3167 + * @description
  3168 + * OK
  3169 + */
  3170 + 200: ServerResult;
  3171 + /**
  3172 + * @description
  3173 + * Created
  3174 + */
  3175 + 201: any;
  3176 + /**
  3177 + * @description
  3178 + * Unauthorized
  3179 + */
  3180 + 401: any;
  3181 + /**
  3182 + * @description
  3183 + * Forbidden
  3184 + */
  3185 + 403: any;
  3186 + /**
  3187 + * @description
  3188 + * Not Found
  3189 + */
  3190 + 404: any;
  3191 +}
  3192 +
  3193 +export type PostCanrdPrivatePocketDeleteResponseSuccess =
  3194 + PostCanrdPrivatePocketDeleteResponse[200];
  3195 +/**
  3196 + * @description
  3197 + * 删除用户隐私钱包
  3198 + * @tags user-private-pocket-controller
  3199 + * @produces *
  3200 + * @consumes application/json
  3201 + */
  3202 +export const postCanrdPrivatePocketDelete = /* #__PURE__ */ (() => {
  3203 + const method = 'post';
  3204 + const url = '/canrd/privatePocket/delete';
  3205 + function request(
  3206 + option: PostCanrdPrivatePocketDeleteOption,
  3207 + ): Promise<PostCanrdPrivatePocketDeleteResponseSuccess> {
  3208 + return requester(request.url, {
  3209 + method: request.method,
  3210 + ...option,
  3211 + }) as unknown as Promise<PostCanrdPrivatePocketDeleteResponseSuccess>;
  3212 + }
  3213 +
  3214 + /** http method */
  3215 + request.method = method;
  3216 + /** request url */
  3217 + request.url = url;
  3218 + return request;
  3219 +})();
  3220 +
  3221 +/** @description request parameter type for postCanrdPrivatePocketDetail */
  3222 +export interface PostCanrdPrivatePocketDetailOption {
  3223 + /**
  3224 + * @description
  3225 + * request
  3226 + */
  3227 + body: {
  3228 + /**
  3229 + @description
  3230 + request */
  3231 + request: UserPrivatePocketDetailRequest;
  3232 + };
  3233 +}
  3234 +
  3235 +/** @description response type for postCanrdPrivatePocketDetail */
  3236 +export interface PostCanrdPrivatePocketDetailResponse {
  3237 + /**
  3238 + * @description
  3239 + * OK
  3240 + */
  3241 + 200: ServerResult;
  3242 + /**
  3243 + * @description
  3244 + * Created
  3245 + */
  3246 + 201: any;
  3247 + /**
  3248 + * @description
  3249 + * Unauthorized
  3250 + */
  3251 + 401: any;
  3252 + /**
  3253 + * @description
  3254 + * Forbidden
  3255 + */
  3256 + 403: any;
  3257 + /**
  3258 + * @description
  3259 + * Not Found
  3260 + */
  3261 + 404: any;
  3262 +}
  3263 +
  3264 +export type PostCanrdPrivatePocketDetailResponseSuccess =
  3265 + PostCanrdPrivatePocketDetailResponse[200];
  3266 +/**
  3267 + * @description
  3268 + * 获取用户隐私钱包详情
  3269 + * @tags user-private-pocket-controller
  3270 + * @produces *
  3271 + * @consumes application/json
  3272 + */
  3273 +export const postCanrdPrivatePocketDetail = /* #__PURE__ */ (() => {
  3274 + const method = 'post';
  3275 + const url = '/canrd/privatePocket/detail';
  3276 + function request(
  3277 + option: PostCanrdPrivatePocketDetailOption,
  3278 + ): Promise<PostCanrdPrivatePocketDetailResponseSuccess> {
  3279 + return requester(request.url, {
  3280 + method: request.method,
  3281 + ...option,
  3282 + }) as unknown as Promise<PostCanrdPrivatePocketDetailResponseSuccess>;
  3283 + }
  3284 +
  3285 + /** http method */
  3286 + request.method = method;
  3287 + /** request url */
  3288 + request.url = url;
  3289 + return request;
  3290 +})();
  3291 +
  3292 +/** @description request parameter type for postCanrdPrivatePocketList */
  3293 +export interface PostCanrdPrivatePocketListOption {
  3294 + /**
  3295 + * @description
  3296 + * request
  3297 + */
  3298 + body: {
  3299 + /**
  3300 + @description
  3301 + request */
  3302 + request: UserPrivatePocketListRequest;
  3303 + };
  3304 +}
  3305 +
  3306 +/** @description response type for postCanrdPrivatePocketList */
  3307 +export interface PostCanrdPrivatePocketListResponse {
  3308 + /**
  3309 + * @description
  3310 + * OK
  3311 + */
  3312 + 200: ServerResult;
  3313 + /**
  3314 + * @description
  3315 + * Created
  3316 + */
  3317 + 201: any;
  3318 + /**
  3319 + * @description
  3320 + * Unauthorized
  3321 + */
  3322 + 401: any;
  3323 + /**
  3324 + * @description
  3325 + * Forbidden
  3326 + */
  3327 + 403: any;
  3328 + /**
  3329 + * @description
  3330 + * Not Found
  3331 + */
  3332 + 404: any;
  3333 +}
  3334 +
  3335 +export type PostCanrdPrivatePocketListResponseSuccess =
  3336 + PostCanrdPrivatePocketListResponse[200];
  3337 +/**
  3338 + * @description
  3339 + * 获取用户隐私钱包列表
  3340 + * @tags user-private-pocket-controller
  3341 + * @produces *
  3342 + * @consumes application/json
  3343 + */
  3344 +export const postCanrdPrivatePocketList = /* #__PURE__ */ (() => {
  3345 + const method = 'post';
  3346 + const url = '/canrd/privatePocket/list';
  3347 + function request(
  3348 + option: PostCanrdPrivatePocketListOption,
  3349 + ): Promise<PostCanrdPrivatePocketListResponseSuccess> {
  3350 + return requester(request.url, {
  3351 + method: request.method,
  3352 + ...option,
  3353 + }) as unknown as Promise<PostCanrdPrivatePocketListResponseSuccess>;
  3354 + }
  3355 +
  3356 + /** http method */
  3357 + request.method = method;
  3358 + /** request url */
  3359 + request.url = url;
  3360 + return request;
  3361 +})();
  3362 +
  3363 +/** @description request parameter type for postCanrdPrivatePocketSave */
  3364 +export interface PostCanrdPrivatePocketSaveOption {
  3365 + /**
  3366 + * @description
  3367 + * request
  3368 + */
  3369 + body: {
  3370 + /**
  3371 + @description
  3372 + request */
  3373 + request: UserPrivatePocketUpdateRequest;
  3374 + };
  3375 +}
  3376 +
  3377 +/** @description response type for postCanrdPrivatePocketSave */
  3378 +export interface PostCanrdPrivatePocketSaveResponse {
  3379 + /**
  3380 + * @description
  3381 + * OK
  3382 + */
  3383 + 200: ServerResult;
  3384 + /**
  3385 + * @description
  3386 + * Created
  3387 + */
  3388 + 201: any;
  3389 + /**
  3390 + * @description
  3391 + * Unauthorized
  3392 + */
  3393 + 401: any;
  3394 + /**
  3395 + * @description
  3396 + * Forbidden
  3397 + */
  3398 + 403: any;
  3399 + /**
  3400 + * @description
  3401 + * Not Found
  3402 + */
  3403 + 404: any;
  3404 +}
  3405 +
  3406 +export type PostCanrdPrivatePocketSaveResponseSuccess =
  3407 + PostCanrdPrivatePocketSaveResponse[200];
  3408 +/**
  3409 + * @description
  3410 + * 保存或更新用户隐私钱包
  3411 + * @tags user-private-pocket-controller
  3412 + * @produces *
  3413 + * @consumes application/json
  3414 + */
  3415 +export const postCanrdPrivatePocketSave = /* #__PURE__ */ (() => {
  3416 + const method = 'post';
  3417 + const url = '/canrd/privatePocket/save';
  3418 + function request(
  3419 + option: PostCanrdPrivatePocketSaveOption,
  3420 + ): Promise<PostCanrdPrivatePocketSaveResponseSuccess> {
  3421 + return requester(request.url, {
  3422 + method: request.method,
  3423 + ...option,
  3424 + }) as unknown as Promise<PostCanrdPrivatePocketSaveResponseSuccess>;
  3425 + }
  3426 +
  3427 + /** http method */
  3428 + request.method = method;
  3429 + /** request url */
  3430 + request.url = url;
  3431 + return request;
  3432 +})();
  3433 +
  3434 +/** @description request parameter type for postCanrdPrivatePocketUpdateBalance */
  3435 +export interface PostCanrdPrivatePocketUpdateBalanceOption {
  3436 + /**
  3437 + * @description
  3438 + * request
  3439 + */
  3440 + body: {
  3441 + /**
  3442 + @description
  3443 + request */
  3444 + request: UserPrivatePocketBalanceUpdateRequest;
  3445 + };
  3446 +}
  3447 +
  3448 +/** @description response type for postCanrdPrivatePocketUpdateBalance */
  3449 +export interface PostCanrdPrivatePocketUpdateBalanceResponse {
  3450 + /**
  3451 + * @description
  3452 + * OK
  3453 + */
  3454 + 200: ServerResult;
  3455 + /**
  3456 + * @description
  3457 + * Created
  3458 + */
  3459 + 201: any;
  3460 + /**
  3461 + * @description
  3462 + * Unauthorized
  3463 + */
  3464 + 401: any;
  3465 + /**
  3466 + * @description
  3467 + * Forbidden
  3468 + */
  3469 + 403: any;
  3470 + /**
  3471 + * @description
  3472 + * Not Found
  3473 + */
  3474 + 404: any;
  3475 +}
  3476 +
  3477 +export type PostCanrdPrivatePocketUpdateBalanceResponseSuccess =
  3478 + PostCanrdPrivatePocketUpdateBalanceResponse[200];
  3479 +/**
  3480 + * @description
  3481 + * 更新用户隐私钱包余额
  3482 + * @tags user-private-pocket-controller
  3483 + * @produces *
  3484 + * @consumes application/json
  3485 + */
  3486 +export const postCanrdPrivatePocketUpdateBalance = /* #__PURE__ */ (() => {
  3487 + const method = 'post';
  3488 + const url = '/canrd/privatePocket/updateBalance';
  3489 + function request(
  3490 + option: PostCanrdPrivatePocketUpdateBalanceOption,
  3491 + ): Promise<PostCanrdPrivatePocketUpdateBalanceResponseSuccess> {
  3492 + return requester(request.url, {
  3493 + method: request.method,
  3494 + ...option,
  3495 + }) as unknown as Promise<PostCanrdPrivatePocketUpdateBalanceResponseSuccess>;
  3496 + }
  3497 +
  3498 + /** http method */
  3499 + request.method = method;
  3500 + /** request url */
  3501 + request.url = url;
  3502 + return request;
  3503 +})();
  3504 +
3145 3505 /** @description request parameter type for postCommonAudit */
3146 3506 export interface PostCommonAuditOption {
3147 3507 /**
... ...