Commit 115f576e authored by Bill's avatar Bill

feat: 平台优惠券结算

parent 890e9e54
......@@ -574,4 +574,6 @@ export default {
'balance.jisongriqi':'Delivery date',
'balance.fapiaohaoma':'Invoice number',
'balance.querenduizhangdan':'Confirm the statement',
'balance.coupon.amout': 'couponAmount',
'balance.coupon.couponNo': 'couponNo',
}
\ No newline at end of file
......@@ -575,4 +575,6 @@ export default {
'balance.jisongriqi': '발송 일자',
'balance.fapiaohaoma': '영수증 번호',
'balance.querenduizhangdan': '청구서 확인',
'balance.coupon.amout': '쿠폰 금액',
'balance.coupon.couponNo': '쿠폰 쿠폰',
}
......@@ -762,5 +762,7 @@ export default {
'balance.businessRequestFunds.detail.columns.canWriteOffAmount' : '可核销金额',
'balance.businessRequestFunds.search.columns.payee' : '收款方',
'balance.coupon.amout': '优惠券金额',
'balance.coupon.couponNo': '优惠券券码',
}
import EyePreview from '@/components/EyePreview';
// import StatusTag from '../components/StatusTag';
// import { TO_BE_RECONCILED, TO_BE_PAY, TO_BE_COLLECTED, COMPLETED, PRODUCT_NOTICE_SETTLEMENT_DETAIL, LOGISTICS_DETAIL, ORDER_DETAIL, CONTRACT_FUND_BILL } from '../common/constants';
import { priceFormat } from '@/utils/numberFomat'
import { numFormat, priceFormat } from '@/utils/numberFomat'
import StatusTag, { STATUS_TYPE } from '@/components/StatusTag';
import React, { useMemo, useState } from 'react';
// import { payStatus } from '../common';
......@@ -66,36 +66,31 @@ function useHandleSettlementList() {
render: (text, record) => {
return (
<EyePreview
url={`/memberCenter/balance/platformSettlement/integral/detail?id=${record.id}`}
url={`/memberCenter/balance/platformSettlement/coupon/detail?id=${record.id}`}
>{record.settlementNo}</EyePreview>
)
}
},
{ title: intl.formatMessage({ id: 'balance.platformSettlement.integral.columns.settlementDate' }), dataIndex: 'settlementDate' },
{ title: intl.formatMessage({ id: 'balance.platformSettlement.integral.columns.settlementWayName' }), dataIndex: 'settlementWayName' },
{ title: intl.formatMessage({ id: '结算方' }), dataIndex: 'settlementName' },
{ title: intl.formatMessage({ id: 'balance.platformSettlement.integral.columns.settlementDate' }), dataIndex: 'settlementDate' },
{ title: intl.formatMessage({ id: 'balance.platformSettlement.integral.columns.totalCount' }), dataIndex: 'totalCount' },
// { title: intl.formatMessage({ id: 'balance.platformSettlement.integral.columns.score' }), dataIndex: 'score' },
// {
// title: intl.formatMessage({ id: 'balance.platformSettlement.integral.columns.ratio' }),
// dataIndex: 'ratio',
// render: (text, record) => {
// return (record.ratio + "%");
// }
// },
{ title: intl.formatMessage({ id: 'balance.platformSettlement.integral.columns.amount' }), dataIndex: 'amount' },
{
title: intl.formatMessage({ id: 'balance.platformSettlement.integral.columns.amount' }),
dataIndex: 'amount',
render: (text) => `¥${priceFormat(text)}`
},
{ title: intl.formatMessage({ id: 'balance.platformSettlement.integral.columns.settlementTime' }), dataIndex: 'settlementTime' },
{ title: intl.formatMessage({ id: 'balance.platformSettlement.integral.columns.payWayName' }), dataIndex: 'payWayName' },
{ title: '预计付款时间', dataIndex: 'payTime' },
{ title: '实际付款时间', dataIndex: 'actualPayTime' },
{
title: intl.formatMessage({ id: 'balance.platformSettlement.integral.columns.status' }), dataIndex: 'status',
filters: payStatus,
onFilter: (value: number, record: any) => record.status == value,
render: (text, record) => {
return (
// <StatusTag status={record.status || 1} />
<StatusTag type={STATUS_TYPE[record.status] as 'success'} title={STATUS_TEXT[record.status]} />
<StatusTag type={STATUS_TYPE[record.status] as 'success'} title={record.statusName} />
)
}
},
......
......@@ -13,7 +13,14 @@ import { useAsyncSelect } from '@/formSchema/effects/useAsyncSelect';
import Voucher from '../../components/Voucher';
import ConfirmAccount from '../../components/ConfirmAccount';
import useSetSearchValueInTable from '@/hooks/useSetSearchValueInTable';
import { getSettleAccountsCommonGetSettlementStatus, getSettleAccountsPlatformScoreSettlementGetReceivablePayProve, getSettleAccountsPlatformScoreSettlementPageReceivableSettlement, GetSettleAccountsPlatformScoreSettlementPageReceivableSettlementRequest, postSettleAccountsPlatformScoreSettlementConfirmAccountComplete, postSettleAccountsPlatformScoreSettlementConfirmPayProve } from '@/services/SettleV2Api';
import {
getSettleAccountsCommonGetSettlementStatus,
getSettleAccountsPlatformCouponSettlementGetReceivablePayProve,
getSettleAccountsPlatformCouponSettlementPageReceivableSettlement,
GetSettleAccountsPlatformCouponSettlementPageReceivableSettlementRequest,
postSettleAccountsPlatformCouponSettlementConfirmAccountComplete,
postSettleAccountsPlatformCouponSettlementConfirmPayProve,
} from '@/services/SettleV2Api';
import useHandleSettlementList from './hooks/useHandleSettlementList';
import ViewUniversalPay from '../../components/ViewUniversalPay';
......@@ -33,7 +40,7 @@ const CouponSettlement: React.FC = () => {
}), [itemInfo])
const fetchListData = async (params: GetSettleAccountsPlatformScoreSettlementPageReceivableSettlementRequest) => {
const fetchListData = async (params: GetSettleAccountsPlatformCouponSettlementPageReceivableSettlementRequest) => {
const searchParams = {
...searchData,
...params,
......@@ -43,7 +50,7 @@ const CouponSettlement: React.FC = () => {
status: searchParams.status || '0',
}
// /settle/accounts/platform/score/settlement/pageReceivableSettlement
const { data } = await getSettleAccountsPlatformScoreSettlementPageReceivableSettlement(postData);
const { data } = await getSettleAccountsPlatformCouponSettlementPageReceivableSettlement(postData);
return data
}
......@@ -51,7 +58,7 @@ const CouponSettlement: React.FC = () => {
* 确认对账
*/
const handleConfirm = async (params: { id: number }) => {
const { code } = await postSettleAccountsPlatformScoreSettlementConfirmAccountComplete({ settlementId: params.id })
const { code } = await postSettleAccountsPlatformCouponSettlementConfirmAccountComplete({ settlementId: params.id })
if (code === 1000) {
// reconciliationOnCancel();
handleClose('reconciledComfirm')
......@@ -63,7 +70,7 @@ const CouponSettlement: React.FC = () => {
* 确认付款凭证
*/
const handleConfirmPayStatus = async (params: { status: 0 | 1, id: number }) => {
const { code } = await postSettleAccountsPlatformScoreSettlementConfirmPayProve({ id: params.id, status: params.status });
const { code } = await postSettleAccountsPlatformCouponSettlementConfirmPayProve({ id: params.id, status: params.status });
if (code) {
// confirmPayOnCancel();
handleClose('confirmCompletePaymentStatus')
......@@ -72,7 +79,7 @@ const CouponSettlement: React.FC = () => {
}
const fetchVouchers = useCallback(async (id: number) => {
const { code, data } = await getSettleAccountsPlatformScoreSettlementGetReceivablePayProve({ id: id.toString() })
const { code, data } = await getSettleAccountsPlatformCouponSettlementGetReceivablePayProve({ id: id.toString() })
if (code === 1000) {
setFiles(data);
}
......@@ -108,8 +115,7 @@ const CouponSettlement: React.FC = () => {
controlRender={
<NiceForm
actions={formActions}
components={{ DatePicker }}
expressionScope={{}}
components={{ RangePicker: DatePicker.RangePicker }}
effects={($, actions) => {
useStateFilterSearchLinkageEffect($, actions, 'megaLayout.settlementNo', FORM_FILTER_PATH);
useAsyncSelect(
......@@ -121,8 +127,6 @@ const CouponSettlement: React.FC = () => {
onSubmit={handleSearch}
onReset={() => {
clear()
// formActions.setFieldValue('startTime', null);
// formActions.setFieldValue('endTime', null);
}}
{...formatInitialValue}
/>
......
import React, { useRef, useState, useEffect, useMemo } from 'react';
import { PageHeaderWrapper } from '@ant-design/pro-layout'
import { Card, PageHeader, Descriptions, Button, message } from 'antd';
import { history, useIntl, getIntl } from 'umi';
import NiceForm from '@/components/NiceForm';
import { FORM_FILTER_PATH } from '@/formSchema/const';
import { createFormActions } from '@formily/antd';
import StandardTable from '@/components/StandardTable';
import { useStateFilterSearchLinkageEffect } from '@/formSchema/effects/useFilterSearch';
import { detailSchema } from './schema';
import moment from 'moment';
import { usePageStatus } from '@/hooks/usePageStatus';
import useInitialValue from '@/pages/member/common/hooks/useInitialValue';
import useBalanceInfo from '../../hooks/useBalanceInfo';
import {
getSettleAccountsPlatformCouponSettlementGetReceivableDetail,
GetSettleAccountsPlatformCouponSettlementGetReceivableDetailResponse,
getSettleAccountsPlatformCouponSettlementPageReceivableSettlementDetail,
getSettleAccountsPlatformCouponSettlementReceivableExport,
} from '@/services/SettleV2Api';
import CustomizeColumn from '@/components/CustomizeColumn';
import { priceFormat } from '@/utils/numberFomat';
const intl = getIntl();
const formActions = createFormActions();
const columns = [
{ title: intl.formatMessage({ id: 'balance.platformSettlement.integral.info.columns.orderNo' }), dataIndex: 'orderNo' },
{ title: intl.formatMessage({ id: 'balance.platformSettlement.integral.info.columns.orderAbstract' }), dataIndex: 'orderAbstract' },
{ title: intl.formatMessage({ id: 'balance.platformSettlement.integral.info.columns.settlementOrderTypeName' }), dataIndex: 'settlementOrderTypeName' },
{ title: intl.formatMessage({ id: 'balance.platformSettlement.integral.info.columns.orderTime' }), dataIndex: 'orderTime' },
{ title: intl.formatMessage({ id: 'balance.platformSettlement.integral.info.columns.orderTypeName' }), dataIndex: 'orderTypeName' },
{ title: intl.formatMessage({ id: 'balance.common.columns.productNoticecolumns.orderAmount' }), dataIndex: 'orderAmount', render: (text) => `¥${priceFormat(text)}` },
{ title: intl.formatMessage({ id: 'balance.coupon.amount' }), dataIndex: 'couponAmount', render: (text) => `¥${priceFormat(text)}` },
{ title: intl.formatMessage({ id: 'balance.coupon.couponNo' }), dataIndex: 'couponNo' },
{ title: intl.formatMessage({ id: 'balance.platformSettlement.integral.info.columns.payTime' }), dataIndex: 'payTime' },
{ title: intl.formatMessage({ id: 'balance.platformSettlement.integral.info.columns.settlementAmount' }), dataIndex: 'settlementAmount' }
]
const Info: React.FC = () => {
const ref = useRef<any>({});
const intl = useIntl();
const { id, preview } = usePageStatus();
const params = useMemo(() => { return id ? { id: id.toString() } : null }, [id]);
const { loading, initialValue } = useInitialValue<GetSettleAccountsPlatformCouponSettlementGetReceivableDetailResponse, { id: string }>(getSettleAccountsPlatformCouponSettlementGetReceivableDetail, params)
const { infoList } = useBalanceInfo(initialValue, { type: "score" })
const fetchListData = async (params) => {
const postData = {
settlementId: id,
...params
}
const res = await getSettleAccountsPlatformCouponSettlementPageReceivableSettlementDetail(postData)
return res.data
}
/**
* 搜索
*/
const handleSearch = (values) => {
console.log(values);
ref.current.reload({ ...values });
}
const handleExport = async () => {
const loadingMsg = message.loading('正在导出', 0)
const { data } = await getSettleAccountsPlatformCouponSettlementReceivableExport(
{ settlementId: id } as any,
{ responseType: 'blob', getResponse: true }
);
loadingMsg();
let blob = new Blob([data as any]);
let downloadFilename = `${moment().format('YYYY-MM-DD HH:mm:ss')}.xlsx`;//设置导出的文件名
createDownloadLink(blob, downloadFilename)
}
const createDownloadLink = (blob: Blob, fileName: string) => {
let url = window.URL.createObjectURL(blob);
let downloadElement = document.createElement("a");
downloadElement.style.display = "none";
downloadElement.href = url;
downloadElement.download = fileName;
document.body.appendChild(downloadElement);
downloadElement.click();
document.body.removeChild(downloadElement);
window.URL.revokeObjectURL(url);
}
return (
<PageHeaderWrapper
title={intl.formatMessage({ id: 'balance.platformSettlement.integral.info.title' }, { data: initialValue?.settlementNo })}
>
<div style={{ marginBottom: '16px' }}>
<CustomizeColumn data={infoList} title="" column={3} />
</div>
<Card>
<StandardTable
tableProps={{
rowKey: record => (`${record.orderNo}-${record.payTime}`),
}}
columns={columns}
currentRef={ref}
fetchTableData={(params: any) => fetchListData(params)}
keepAlive={false}
controlRender={
<NiceForm
actions={formActions}
components={{
ExportBtn: () => {
return (
<div>
<Button onClick={handleExport}>{intl.formatMessage({ id: 'balance.platformSettlement.integral.info.exportBtn' })}</Button>
</div>
)
}
}}
effects={($, actions) => {
useStateFilterSearchLinkageEffect($, actions, 'megaLayout.topLayout.orderNo', FORM_FILTER_PATH);
}}
schema={detailSchema}
onSubmit={handleSearch}
/>
}
/>
</Card>
</PageHeaderWrapper>
)
}
export default Info
......@@ -42,8 +42,7 @@ export const schema: ISchema = {
},
properties: {
"[startTime, endTime]": {
type: 'object',
"x-component": 'RangePicker',
type: 'daterange',
'x-component-props': {
allowClear: true,
placeholder: [intl.formatMessage({ id: 'balance.platformSettlement.integral.schema.schema.startTime' }), intl.formatMessage({ id: 'balance.platformSettlement.integral.schema.schema.endTime' })],
......@@ -112,10 +111,7 @@ export const detailSchema: ISchema = {
properties: {
ctl: {
type: 'object',
'x-component': 'Children',
'x-component-props': {
children: '{{exportBtn}}',
},
'x-component': 'ExportBtn',
},
orderNo: {
type: 'string',
......@@ -141,19 +137,18 @@ export const detailSchema: ISchema = {
placeholder: intl.formatMessage({ id: 'balance.platformSettlement.integral.schema.detailSchema.orderAbstract' })
}
},
orderTime: {
type: 'string',
enum: orderTime,
'[orderStartTime, orderEndTime]': {
type: 'daterange',
// enum: orderTime,
'x-component-props': {
placeholder: intl.formatMessage({ id: 'balance.platformSettlement.integral.schema.detailSchema.orderTime' }),
placeholder: [intl.formatMessage({ id: 'balance.accountsReceivable.invoice.schema.orderStartTime' }), intl.formatMessage({ id: 'balance.accountsReceivable.invoice.schema.orderEndTime' })],
allowClear: true,
},
},
payTime: {
type: 'string',
enum: payTime,
'[payStartTime, payEndTime]': {
type: 'daterange',
'x-component-props': {
placeholder: intl.formatMessage({ id: 'balance.platformSettlement.integral.schema.detailSchema.payTime' }),
placeholder: [intl.formatMessage({ id: 'balance.platformSettlement.integral.schema.detailSchema.payStartTime' }), intl.formatMessage({ id: 'balance.platformSettlement.integral.schema.detailSchema.payStartTime' })],
allowClear: true,
},
},
......
......@@ -51,7 +51,6 @@ const Integral: React.FC = () => {
}
/**
* TODO 需要换成优惠券结算
* 确认对账
*/
const handleConfirm = async (params: { id: number }) => {
......@@ -65,7 +64,6 @@ const Integral: React.FC = () => {
/**
* 确认付款凭证
* TODO 需要换成优惠券结算
*/
const handleConfirmPayStatus = async (params: { status: 0 | 1, id: number }) => {
const { code } = await postSettleAccountsPlatformScoreSettlementConfirmPayProve({ id: params.id, status: params.status });
......@@ -77,7 +75,6 @@ const Integral: React.FC = () => {
}
/**
* TODO 需要换成优惠券结算
*/
const fetchVouchers = useCallback(async (id: number) => {
const { code, data } = await getSettleAccountsPlatformScoreSettlementGetReceivablePayProve({ id: id.toString() })
......@@ -116,8 +113,7 @@ const Integral: React.FC = () => {
controlRender={
<NiceForm
actions={formActions}
components={{ DatePicker }}
expressionScope={{}}
components={{ RangePicker: DatePicker.RangePicker }}
effects={($, actions) => {
useStateFilterSearchLinkageEffect($, actions, 'megaLayout.settlementNo', FORM_FILTER_PATH);
useAsyncSelect(
......
......@@ -138,7 +138,7 @@ const Announcements = () => {
? (
<Dropdown overlay={menu}>
<a>
{intl.formatMessage({ id: 'common.text.most' })} <DownOutlined />
{intl.formatMessage({ id: 'common.text.more' })} <DownOutlined />
</a>
</Dropdown>
)
......
......@@ -125,7 +125,7 @@ const Infomation = () => {
CAN_MODIFY.includes(record.status)
? <Dropdown overlay={menu}>
<a>
{intl.formatMessage({ id: 'common.text.most' })} <DownOutlined />
{intl.formatMessage({ id: 'common.text.more' })} <DownOutlined />
</a>
</Dropdown>
: null
......
......@@ -13,15 +13,15 @@ type HeadersType = {
[key: string]: any,
}
type Ires = {
type Ires<T> = {
code: number,
data: { [key: string]: any },
data: T,
message: string
}
function useInitialValue<T, P extends Object>(api: (params: P, headers?: HeadersType) => Promise<T & Ires>, params: P, headers?: HeadersType): { loading: boolean, initialValue: T, refresh: (params: P) => void, setInitialValue: any} {
function useInitialValue<T, P extends Object>(api: (params: P, headers?: HeadersType) => Promise<Ires<T>>, params: P, headers?: HeadersType): { loading: boolean, initialValue: T, refresh: (params: P) => void, setInitialValue: any} {
const [loading, setLoading] = useState<boolean>(false);
const [initialValue, setInitialValue] = useState<null | Ires["data"]>(null);
const [initialValue, setInitialValue] = useState<null | T>(null);
const fetchData = useCallback(async (params) => {
setLoading(true)
......
......@@ -36,10 +36,11 @@ const WEB_FIXTURE_LINK = `/memberCenter/marketingAbility/activityPages/managemen
const PENDIGN_ONLINE = 1;
const ONLINE = 2;
/** 进行中 */
const IN_PROGRESS = 3;
/** 下线 */
const OFFLINE = 4;
/** 借宿 */
/** 结束 */
const END = 5;
const format = 'YYYY-MM-DD HH:mm:ss';
......@@ -114,7 +115,7 @@ const ActiveItem: React.FC<Iprops> = (props: Iprops) => {
)
}
{
[PENDIGN_ONLINE, OFFLINE].includes(status) && (
[PENDIGN_ONLINE, IN_PROGRESS, ONLINE, OFFLINE].includes(status) && (
// <Link to={`/memberCenter/marketingAbility/activityPages/management/edit?id=${id}`}>
<Link to={`${environment === WEB ? WEB_FIXTURE_LINK : APP_FIXTURE_LINK}?id=${id}`}>
{/* <Button icon={<EditOutlined />}></Button> */}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment