Commit e0f5a7c0 authored by 前端-钟卫鹏's avatar 前端-钟卫鹏

Merge branch 'dev' into test

parents 3d34555e b005eb1c
......@@ -36,17 +36,35 @@ const router = {
hidePageHeader: true,
hideInMenu: true,
},
// 代账款结算列表
// 代账款结算列表
{
path: '/balanced/accountReceivable',
name: 'accountReceivableList',
component: '@/pages/platformSettlement/accountReceivable',
path: '/balanced/accountPayable',
name: 'accountPayableList',
component: '@/pages/platformSettlement/accountPayable',
hidePageHeader: true,
},
// 代收账款结算明细
{
path: '/balanced/accountReceivable/detail',
name: 'accountReceivableDetail',
component: '@/pages/platformSettlement/accountReceivable/info',
path: '/balanced/accountPayable/detail',
name: 'accountPayableDetail',
component: '@/pages/platformSettlement/accountPayable/info',
hidePageHeader: true,
hideInMenu: true
},
// 积分代付账款结算列表
{
path: '/balanced/scorePayable',
name: 'scorePayable',
component: '@/pages/platformSettlement/score/list',
hidePageHeader: true,
},
// 积分代付账款结算详情页
{
path: '/balanced/scorePayable/detail',
name: 'scorePayableDetail',
component: '@/pages/platformSettlement/score/info',
hidePageHeader: true,
hideInMenu: true,
}
]
}
......
This source diff could not be displayed because it is too large. You can view the blob instead.
......@@ -34,6 +34,7 @@ export interface PayInitializeConfig {
export interface PayPlatformPayConfig {
id: number;
way: string;
wayId?: any;
payType: number;
isPitchOn: number;
}
......@@ -49,7 +50,7 @@ export interface ShopInfo {
type: number;
environment: number;
logoUrl: string;
describe: string;
describe?: any;
state: number;
url: string;
}
......
......@@ -2,7 +2,7 @@
* @Author: LeeJiancong
* @Date: 2020-08-04 15:05:52
* @LastEditors: Please set LastEditors
* @LastEditTime: 2020-10-22 18:53:15
* @LastEditTime: 2020-10-30 17:21:09
*/
import utils from '@/utils'
import menu from '../en-US/menu'
......@@ -178,8 +178,11 @@ export default {
'menu.balanced.receipt': '发票管理',
'menu.balanced.receiptAdd': '新建发票',
'menu.balanced.receiptDetail': '发票详情',
'menu.balanced.accountReceivableList': '代收账款结算',
'menu.balanced.accountReceivableDetail': '代收账款明细',
'menu.balanced.accountPayableList': '代付账款结算',
'menu.balanced.accountPayableDetail': '代付账款明细',
'menu.balanced.scorePayable': '积分结算',
'menu.balanced.scorePayableDetail': '积分结算详情',
// 会员资金账户
'menu.capitalAccount': '会员资金账户',
......
import React, { useState, useRef, ReactNode, useEffect } from 'react'
import { history } from 'umi'
import { Button, Steps, Card, Space, Modal, Form, Row, Col, Descriptions, Table, Tabs, Tag, Divider, Radio, Input } from 'antd'
import { Button, Steps, Card, Space, Modal, Form, Row, Col, Descriptions, Table, Tabs, Tag, Divider, Radio, Input, Image } from 'antd'
import { PageHeaderWrapper } from '@ant-design/pro-layout'
import {
CaretDownOutlined,
......@@ -673,8 +673,13 @@ const viewProducts: React.FC<{}> = () => {
<div className={styles.productImgBox}>
{
productDetail?.unitPriceAndPicList[0].commodityPic.length>0 && productDetail?.unitPriceAndPicList[0].commodityPic.map((_item, index) =>
<div key={index} className={styles.imgItem}><img className={styles.pic} src={_item} alt=""/>
</div>)
<Image
key={index}
width={104}
src={_item}
alt="商品图片描述"
className={styles.imgItem}
/>)
}
</div>
</> : <>
......@@ -701,8 +706,13 @@ const viewProducts: React.FC<{}> = () => {
<div className={styles.productImgBox}>
{
imageArrByImageRender.length>0 && imageArrByImageRender[index].map((_item, _index) =>
<div key={_index} className={styles.imgItem}><img className={styles.pic} src={_item} alt=""/>
</div>)
<Image
key={_index}
width={104}
src={_item}
alt="商品图片描述"
className={styles.imgItem}
/>)
}
</div>
</div>)
......@@ -742,9 +752,14 @@ const viewProducts: React.FC<{}> = () => {
productDetail?.commodityRemark?.image?.length>0 &&
<div className={styles.descriptionBox}>
{
productDetail?.commodityRemark?.image.map((_item, _index)=> _item && <div key={_index} className={styles.imgItem}>
<img src={_item} />
</div>)
productDetail?.commodityRemark?.image.map((_item, _index)=> _item &&
<Image
key={_index}
width={180}
src={_item}
alt="商品图片描述"
className={styles.imgItem}
/>)
}
</div>
}
......
......@@ -139,6 +139,7 @@
height:104px;
margin-left: 16px;
border:1px solid rgba(235,236,240,1);
object-fit: fill;
}
p{
padding: 16px;
......@@ -154,6 +155,7 @@
height:104px;
margin-right: 16px;
border:1px solid rgba(235,236,240,1);
object-fit: fill;
.pic{
width: 100%;
height: 100%;
......
......@@ -185,6 +185,9 @@
top: 50%;
transform: translate(-50%, -50%);
}
img{
object-fit: fill;
}
}
}
.pruduct-status{
......
import React, { useState, useRef, ReactNode, useEffect } from 'react'
import { history } from 'umi'
import { Button, Steps, Card, Space, Radio, Row, Col, Descriptions, Table, Tabs, Tag, Divider } from 'antd'
import { Button, Steps, Card, Space, Radio, Row, Col, Descriptions, Table, Tabs, Tag, Divider, Image } from 'antd'
import { PageHeaderWrapper } from '@ant-design/pro-layout'
import { ColumnType } from 'antd/lib/table/interface'
import cx from 'classnames'
......@@ -617,7 +617,6 @@ const viewProducts: React.FC<{}> = () => {
<Space direction="vertical" style={{width:'100%'}}>
<Card headStyle={{borderBottom:'none'}} title="商品图片">
{
// productDetail?.unitPriceAndPicList[0].attributeAndValueList.length === 0 ? <>
productDetail?.isAllAttributePic ? <>
<Row>
<Col span={3}>
......@@ -631,8 +630,13 @@ const viewProducts: React.FC<{}> = () => {
<div className={styles.productImgBox}>
{
productDetail?.unitPriceAndPicList[0].commodityPic.length>0 && productDetail?.unitPriceAndPicList[0].commodityPic.map((_item, index) =>
<div key={index} className={styles.imgItem}><img className={styles.pic} src={_item} alt=""/>
</div>)
<Image
key={index}
className={styles.imgItem}
width={104}
src={_item}
alt="商品图片"
/>)
}
</div>
</> : <>
......@@ -659,8 +663,13 @@ const viewProducts: React.FC<{}> = () => {
<div className={styles.productImgBox}>
{
imageArrByImageRender.length>0 && imageArrByImageRender[index].map((_item, _index) =>
<div key={_index} className={styles.imgItem}><img className={styles.pic} src={_item} alt=""/>
</div>)
<Image
key={_index}
className={styles.imgItem}
width={104}
src={_item}
alt="商品图片"
/>)
}
</div>
</div>)
......@@ -700,9 +709,14 @@ const viewProducts: React.FC<{}> = () => {
productDetail?.commodityRemark?.image?.length>0 &&
<div className={styles.descriptionBox}>
{
productDetail?.commodityRemark?.image.map((_item, _index)=> _item && <div key={_index} className={styles.imgItem}>
<img src={_item} />
</div>)
productDetail?.commodityRemark?.image.map((_item, _index)=> _item &&
<Image
key={_index}
width={180}
src={_item}
alt="商品图片描述"
className={styles.imgItem}
/>)
}
</div>
}
......
/*
* @Author: Bill
* @Date: 2020-10-20 11:04:07
* @Description: 应付账款结算
*/
import React, { useRef } from 'react';
import { PageHeaderWrapper } from '@ant-design/pro-layout'
import { Card, Button, Modal, DatePicker, Tag, Space } from 'antd';
import NiceForm from '@/components/NiceForm';
import { FORM_FILTER_PATH } from '@/formSchema/const';
import { ISchema, createFormActions } from '@formily/antd';
import { StandardTable } from 'god';
import { useStateFilterSearchLinkageEffect } from '@/formSchema/effects/useFilterSearch';
import { useAsyncInitSelect } from '@/formSchema/effects/useAsyncInitSelect';
import { schema } from './schema';
import StatusActions from '../components/StatusActions';
import StatusTag from '../components/StatusTag';
import { PublicApi } from '@/services/api'
import { Moment } from 'moment';
import { ColumnsType } from 'antd/es/table';
import EyePreview from '@/components/EyePreview';
interface SearchParams {
settlementName?: string,
payName?: string,
isSettlement: number,
startTime?: Moment,
endTime?: Moment,
orderType?: number,
status?: number,
current: number,
pageSize: number,
}
const formActions = createFormActions();
const PLATFORM_PAYER = 4;
const SettlementList = () => {
const ref = useRef<any>({})
const fetchListData = async (params) => {
// /settle/accounts/platform/settlement/pagePayableSettlement
const searchData = {
...params,
status: typeof params.status == 'undefined' ? 0 : params.status,
}
console.log(searchData);
const res = await PublicApi.getSettleAccountsPlatformSettlementPagePayableSettlement(searchData)
return res.data;
}
const columns: ColumnsType<any> = [
{
title: '结算单号',
dataIndex: 'settlementNo',
render: (text, record) => {
const url = `/balanced/accountPayable/detail?id=${record.id}`;
return (
<EyePreview url={url}>
{text}
</EyePreview>
)
}
},
{title: '结算日期', dataIndex: 'settlementDate'},
{title: '结算方式', dataIndex: 'settlementWayName'},
{title: '结算方', dataIndex: 'settlementName'},
{title: '总单数', dataIndex: 'totalCount'},
{title: '代收金额', dataIndex: 'collectAmount'},
{title: '佣金', dataIndex: 'brokerage'},
{title: '结算金额', dataIndex: 'amount'},
{title: '结算时间', dataIndex: 'settlementTime'},
{title: '支付方式', dataIndex: 'payWayName'},
{
title: '结算状态', dataIndex: 'status',
filters: [
{ text: '待对账', value: 1 },
{ text: '待付款', value: 2 },
{ text: '待收款', value: 3 },
{ text: '以完成', value: 4 },
],
onFilter: (value, record: any) => record.status == value,
render: (text, record: any) => {
return (
<StatusTag status={record.status} />
)
}
},
{
title: '操作',
render: (text, record: any) => {
return (
<StatusActions
status={record.status <= 2 ? record.status : 4 }
id={record.id}
excludes={[1, 3]}
settlementId={record.memberId || 1}
handleUpload={handleUploadVoucher}
type={PLATFORM_PAYER}
/>
)
}
}
]
/**
* 上传凭证
* @param params
*/
const handleUploadVoucher = (params: any) => {
console.log(params);
PublicApi.postSettleAccountsPlatformSettlementPay({id: params.id, proveList: params.fileList})
.then((data) => {
if(data.code === 1000) {
formActions.submit();
params.onCancel()
}
})
}
/**
* 搜索
*/
const handleSearch = (values: SearchParams) => {
const format = 'YYYY-MM-DD'
const startTime = values.startTime?.format(format);
const endTime = values.endTime?.format(format);
ref.current.reload({...values, startTime, endTime});
}
return (
<PageHeaderWrapper>
<Card>
<StandardTable
tableProps={{
rowKey: 'id',
}}
columns={columns}
currentRef={ref}
fetchTableData={(params: any) => fetchListData(params)}
controlRender={
<NiceForm
components={{DatePicker}}
actions={formActions}
expressionScope={{}}
effects={($, actions) => {
useStateFilterSearchLinkageEffect($, actions, 'megaLayout.settlementName', FORM_FILTER_PATH);
// useAsyncInitSelect(
// ['innerStatus', 'outerStatus'],
// fetchSelectOptions,
// );
}}
schema={schema}
onSubmit={handleSearch}
/>
}
/>
</Card>
</PageHeaderWrapper>
)
}
export default SettlementList
/*
* @Author: Bill
* @Date: 2020-10-20 10:54:00
* @Description: 积分结算详情页
*/
import React, { useRef, useState, useEffect } from 'react';
import { PageHeaderWrapper } from '@ant-design/pro-layout'
import { Card, PageHeader, Descriptions, Button} from 'antd';
import { history } from 'umi';
import AvatarWrap from '@/components/AvatarWrap';
import NiceForm from '@/components/NiceForm';
import { FORM_FILTER_PATH } from '@/formSchema/const';
import { ISchema, createFormActions } from '@formily/antd';
import { StandardTable } from 'god';
import { useStateFilterSearchLinkageEffect } from '@/formSchema/effects/useFilterSearch';
import { useAsyncInitSelect } from '@/formSchema/effects/useAsyncInitSelect';
import { detailSchema } from './schema'
import { usePageStatus } from '@/hooks/usePageStatus';
import StatusTag from '../components/StatusTag';
import { timeRange } from '@/utils/index';
import moment from 'moment';
import { PublicApi } from '@/services/api';
const formActions = createFormActions();
const columns = [
{title: '单据号', dataIndex: 'orderNo'},
{title: '单据摘要', dataIndex: 'orderAbstract'},
{title: '单据类型', dataIndex: 'settlementOrderTypeName'},
{title: '单据时间', dataIndex: 'orderTime'},
{title: '订单类型', dataIndex: 'orderTypeName'},
{title: '单据总额', dataIndex: 'orderAmount'},
{title: '代收金额', dataIndex: 'collectAmount'},
{title: '支付时间', dataIndex: 'payTime'},
{
title: '佣金比率',
dataIndex: 'ratio',
render: (text,record) => {
return (record.ratio + '%');
}
},
{title: '扣减佣金', dataIndex: 'brokerage'},
{title: '本期结算金额', dataIndex: 'settlementAmount'},
]
const logisticsDetail: React.FC = () => {
const ref = useRef<any>({});
const { id } = usePageStatus();
const [infoDetail, setInfoDetail] = useState<any>();
const fetchListData = async (params) => {
const postData = {
settlementId: id,
...params
}
// /settle/accounts/platform/settlement/pagePayableSettlementDetail
const res = await PublicApi.getSettleAccountsPlatformSettlementPagePayableSettlementDetail(postData)
return res.data
}
useEffect(() => {
if(id) {
// 获取详情
async function fetchDetail() {
const { data, code } = await PublicApi.getSettleAccountsPlatformSettlementGetPayableDetail({id})
if(code == 1000) {
setInfoDetail(data);
}
}
fetchDetail();
}
}, [id])
/**
* 搜索
*/
const handleSearch = (values) => {
const format = 'YYYY-MM-DD'
const { payTime, orderTime, ...rest } = values;
const payTimeRange = payTime ? timeRange(values.payTime): null;
const payStartTime = payTimeRange ? moment(payTimeRange.st * 1000).format(format) : null;
const payEndTime = payTimeRange ? moment(payTimeRange.et * 1000).format(format) : null;
const orderTimeRange = orderTime ? timeRange(values.orderTime) : null;
const orderStartTime = orderTimeRange ? moment(orderTimeRange.st * 1000).format(format) : null;
const orderEndTime = orderTimeRange ? moment(orderTimeRange.et * 1000).format(format) : null;
ref.current.reload({...rest, payStartTime, payEndTime, orderStartTime, orderEndTime});
}
return (
<PageHeaderWrapper
title={
<>
<PageHeader
style={{ padding: '0' }}
onBack={() => history.goBack()}
title={
<AvatarWrap
info={{
aloneTxt: '单',
name: "结算单号:"
}}
extra={(
<span style={{ fontSize: 12, fontWeight: 'normal' }}>{infoDetail?.settlementNo}</span>
)}
/>
}
>
<Descriptions
column={3}
style={{
padding: '0 32px',
}}
>
<Descriptions.Item label="结算日期:">{infoDetail?.settlementDate}</Descriptions.Item>
<Descriptions.Item label="结算单数:">{infoDetail?.totalCount }</Descriptions.Item>
<Descriptions.Item label="结算金额:">{infoDetail?.amount}</Descriptions.Item>
<Descriptions.Item label="结算方式:">{infoDetail?.settlementWayName}</Descriptions.Item>
<Descriptions.Item label="外部状态:">
<StatusTag text={infoDetail?.statusName} />
</Descriptions.Item>
</Descriptions>
</PageHeader>
</>
}
>
<Card>
<StandardTable
tableProps={{
rowKey: record => (record.orderNo + "-" + record.payTime),
}}
columns={columns}
currentRef={ref}
fetchTableData={(params: any) => fetchListData(params)}
controlRender={
<NiceForm
actions={formActions}
expressionScope={{
exportBtn: (
<div>
<Button>导出</Button>
</div>
)
}}
effects={($, actions) => {
useStateFilterSearchLinkageEffect($, actions, 'megaLayout.topLayout.orderNo', FORM_FILTER_PATH);
// useAsyncInitSelect(
// ['innerStatus', 'outerStatus'],
// fetchSelectOptions,
// );
}}
schema={detailSchema}
onSubmit={handleSearch}
/>
}
/>
</Card>
</PageHeaderWrapper>
)
}
export default logisticsDetail
\ No newline at end of file
......@@ -17,13 +17,13 @@ export const schema: ISchema = {
type: 'object',
'x-component': 'mega-layout',
properties: {
name: {
settlementName: {
type: 'string',
'x-component': 'Search',
'x-component-props': {
placeholder: '搜索',
placeholder: '搜索(结算方)',
align: 'flex-left',
tip: '输入通知单号、通知单摘要进行搜索',
tip: '输入 结算方 进行搜索',
},
},
[FORM_FILTER_PATH]: {
......@@ -52,21 +52,28 @@ export const schema: ISchema = {
},
status: {
type: 'string',
enum: [],
enum: [
{ label: '结算状态(所有)', value: 0 },
{ label: '待对账', value: 1 },
{ label: '待付款', value: 2 },
{ label: '代收款', value: 3 },
{ label: '已完成', value: 4 },
],
default: 0,
'x-component-props': {
placeholder: '结算状态(全部)',
allowClear: true,
},
},
// submit: {
// 'x-component': 'Submit',
// 'x-mega-props': {
// span: 1,
// },
// 'x-component-props': {
// children: '查询',
// },
// },
submit: {
'x-component': 'Submit',
'x-mega-props': {
span: 1,
},
'x-component-props': {
children: '查询',
},
},
},
},
},
......@@ -74,6 +81,18 @@ export const schema: ISchema = {
},
};
const commonTimeList = [
{ label: '今天', value: 1},
{ label: '一周内', value: 2},
{ label: '一个月内', value: 3},
{ label: '三个月内', value: 4},
{ label: '六个月内', value: 5},
{ label: '一年内', value: 6 },
{ label: '一年前', value: 7}
];
const orderTime = [{label: '下单时间(所有)', value: 0}].concat(commonTimeList);
const payTime = [{label: '支付时间(所有)', value: 0}].concat(commonTimeList);
/**
* 应收账款管理--物流单结算明细详情, 生产通知单结算明细
*/
......@@ -99,11 +118,11 @@ export const detailSchema: ISchema = {
children: '{{exportBtn}}',
},
},
search: {
orderNo: {
type: 'string',
'x-component': 'Search',
'x-component-props': {
placeholder: '搜索',
placeholder: '搜索(单据号)',
},
},
},
......@@ -119,30 +138,32 @@ export const detailSchema: ISchema = {
properties: {
orderTime: {
type: 'string',
enum: [],
enum: orderTime,
default: 0,
'x-component-props': {
placeholder: '下单时间(全部)',
allowClear: true,
},
},
payTime: {
type: 'string',
enum: [],
enum: payTime,
default: 0,
'x-component-props': {
placeholder: '支付时间(全部)',
allowClear: true,
},
},
// submit: {
// 'x-component': 'Submit',
// 'x-mega-props': {
// span: 1,
// },
// 'x-component-props': {
// children: '查询',
// },
// },
submit: {
'x-component': 'Submit',
'x-mega-props': {
span: 1,
},
'x-component-props': {
children: '查询',
},
},
},
},
},
......
/*
* @Author: Bill
* @Date: 2020-10-20 11:04:07
* @Description: 应付账款结算
*/
import React, { useRef } from 'react';
import { PageHeaderWrapper } from '@ant-design/pro-layout'
import { Card, Button, Modal, DatePicker, Tag, Space } from 'antd';
import NiceForm from '@/components/NiceForm';
import { FORM_FILTER_PATH } from '@/formSchema/const';
import { ISchema, createFormActions } from '@formily/antd';
import { StandardTable } from 'god';
import { useStateFilterSearchLinkageEffect } from '@/formSchema/effects/useFilterSearch';
import { useAsyncInitSelect } from '@/formSchema/effects/useAsyncInitSelect';
import { schema } from './schema';
import ModalContainer from '../components/ModalContainer';
import ConfirmAccount from '../components/ConfirmAccount';
import Voucher from '../components/Voucher';
import UploadPayVoucher from '../components/UploadPayVoucher';
const formActions = createFormActions();
const SettlementList = () => {
const ref = useRef<any>({})
const fetchListData = async (params) => {
return {
data: [{id: 1}],
totalCount: 1
}
}
const columns = [
{title: '结算单号', dataIndex: 'num'},
{title: '结算日期', dataIndex: 'num'},
{title: '结算方式', dataIndex: 'num'},
{title: '总单数', dataIndex: 'num'},
{title: '代收金额', dataIndex: 'num'},
{title: '佣金', dataIndex: 'num'},
{title: '结算金额', dataIndex: 'num'},
{title: '结算日期', dataIndex: 'num'},
{title: '支付方式', dataIndex: 'payMethod'},
{
title: '结算状态', dataIndex: 'status',
render: (text, record) => {
return (
<Tag>待对账</Tag>
)
}
},
{
title: '操作',
render: (text, record) => {
return (
<>
<ModalContainer>
{
({visible, show, cancel}) => {
return (
<>
<Modal width={400} title="确认对账完成" visible={visible} onCancel={cancel} onOk={() => handleConfirm(cancel)}>
<ConfirmAccount />
</Modal>
<div onClick={show}>确认对账完成</div>
</>
)
}
}
</ModalContainer>
<ModalContainer>
{
({visible, show, cancel}) => {
return (
<>
<Modal width={548} title="查看付款凭证" onCancel={cancel} visible={visible} footer={null}>
<Voucher />
</Modal>
<div onClick={show}>查看付款凭证</div>
</>
)
}
}
</ModalContainer>
<ModalContainer>
{
({visible, show, cancel}) => {
return (
<>
<Modal width={548} title="上传付款凭证" onCancel={cancel} visible={visible}
footer={(
<Space>
<Button>取消</Button>
<Button>确认未到款</Button>
<Button>确认到款</Button>
</Space>
)}
>
<UploadPayVoucher />
</Modal>
<div onClick={show}>上传付款凭证</div>
</>
)
}
}
</ModalContainer>
</>
)
}
}
]
/**
* 确认对账
* @param cancel 关闭回调函数
*/
const handleConfirm = (cancel) => {
console.log(123)
cancel();
}
return (
<PageHeaderWrapper>
<Card>
<StandardTable
tableProps={{
rowKey: 'id',
}}
columns={columns}
currentRef={ref}
fetchTableData={(params: any) => fetchListData(params)}
controlRender={
<NiceForm
components={{DatePicker}}
actions={formActions}
expressionScope={{}}
effects={($, actions) => {
useStateFilterSearchLinkageEffect($, actions, 'megaLayout.name', FORM_FILTER_PATH);
// useAsyncInitSelect(
// ['innerStatus', 'outerStatus'],
// fetchSelectOptions,
// );
}}
schema={schema}
onSubmit={values => ref.current.reload(values)}
/>
}
/>
</Card>
</PageHeaderWrapper>
)
}
export default SettlementList
/*
* @Author: Bill
* @Date: 2020-10-20 10:54:00
* @Description: 积分结算详情页
*/
import React, { useRef } from 'react';
import { PageHeaderWrapper } from '@ant-design/pro-layout'
import { Card, PageHeader, Descriptions, Button} from 'antd';
import { history } from 'umi';
import AvatarWrap from '@/components/AvatarWrap';
import NiceForm from '@/components/NiceForm';
import { FORM_FILTER_PATH } from '@/formSchema/const';
import { ISchema, createFormActions } from '@formily/antd';
import { StandardTable } from 'god';
import { useStateFilterSearchLinkageEffect } from '@/formSchema/effects/useFilterSearch';
import { useAsyncInitSelect } from '@/formSchema/effects/useAsyncInitSelect';
import { detailSchema } from './schema'
const formActions = createFormActions();
const columns = [
{title: '单据号', dataIndex: 'no'},
{title: '单据摘要', dataIndex: 'desc'},
{title: '单据类型', dataIndex: 'type'},
{title: '单据时间', dataIndex: 'time'},
{title: '总箱数', dataIndex: 'box'},
{title: '总重量', dataIndex: 'weight'},
{title: '总体积', dataIndex: 'volumn'},
{title: '接单金额', dataIndex: 'price'},
{title: '支付时间', dataIndex: 'payTime'},
{title: '结算金额', dataIndex: 'payPrice'},
]
const logisticsDetail: React.FC = () => {
const ref = useRef<any>({});
const fetchListData = async (params) => {
return {}
}
return (
<PageHeaderWrapper
title={
<>
<PageHeader
style={{ padding: '0' }}
onBack={() => history.goBack()}
title={
<AvatarWrap
info={{
aloneTxt: '单',
name: "结算单号:"
}}
extra={(
<span style={{ fontSize: 12, fontWeight: 'normal' }}>{"TPTY12"}</span>
)}
/>
}
>
<Descriptions
column={3}
style={{
padding: '0 32px',
}}
>
<Descriptions.Item label="通知单摘要">{"进口头层黄牛皮荔枝纹"}</Descriptions.Item>
<Descriptions.Item label="供应会员:">{"广州白马皮具交易中心"}</Descriptions.Item>
<Descriptions.Item label="单据时间:">{"2020-09-09 12:58:25"}</Descriptions.Item>
<Descriptions.Item label="通知单来源:">{"订单加工"}</Descriptions.Item>
<Descriptions.Item label="外部状态:">{"以完成通知单"}</Descriptions.Item>
<Descriptions.Item label="内部状态:">{"审核通过"}</Descriptions.Item>
</Descriptions>
</PageHeader>
</>
}
>
<Card>
<StandardTable
tableProps={{
rowKey: 'id',
}}
columns={columns}
currentRef={ref}
fetchTableData={(params: any) => fetchListData(params)}
controlRender={
<NiceForm
actions={formActions}
expressionScope={{
exportBtn: (
<div>
<Button>导出</Button>
</div>
)
}}
effects={($, actions) => {
useStateFilterSearchLinkageEffect($, actions, 'megaLayout.topLayout.search', FORM_FILTER_PATH);
// useAsyncInitSelect(
// ['innerStatus', 'outerStatus'],
// fetchSelectOptions,
// );
}}
schema={detailSchema}
onSubmit={values => ref.current.reload(values)}
/>
}
/>
</Card>
</PageHeaderWrapper>
)
}
export default logisticsDetail
\ No newline at end of file
......@@ -6,17 +6,30 @@
import React from 'react';
const ConfirmAccount = () => {
interface Iprops {
/**
* 结算日期
*/
settlementDate: string,
/**
* 付款方
*/
payName: string
}
const ConfirmAccount: React.FC<Iprops> = (props) => {
const { settlementDate, payName } = props
return (
<div>
<h3 style={{margin: 0}}>是否确认以下对账已完成?</h3>
<div style={{margin: '24px 0'}}>
<span style={{color: '#909399', width: '60px', display: 'inline-block'}}>结算日期:</span>
<span>2020-08-25</span>
<span>{settlementDate}</span>
</div>
<div>
<span style={{color: '#909399', width: '60px', display: 'inline-block'}}>付款方:</span>
<span>平台</span>
<span>{payName}</span>
</div>
</div>
)
......
.modalBtn {
color: @main-color;
cursor: pointer;
}
\ No newline at end of file
/*
* @Author: your name
* @Date: 2020-10-23 17:24:23
* @Description: 结算能力列表操作
*/
import React, { useState, useEffect } from 'react';
import ModalContainer from '../ModalContainer';
import { Modal, Space, Button } from 'antd';
import ConfirmAccount from '../../components/ConfirmAccount';
import Voucher from '../../components/Voucher';
import { StatusEnum, TO_BE_RECONCILED, TO_BE_PAY, TO_BE_COLLECTED, COMPLETED } from '../../components/StatusTag';
import styles from './index.less';
import UploadPayVoucher from '../../components/UploadPayVoucher';
import { PublicApi } from '@/services/api';
interface Iprops {
status: StatusEnum,
id: number, // 应付,应收账款id
settlementDate?: string, // 结算日期
settlementId?: number, // 结算方id
payName?: string, //付款方
excludes: number[], // 排除数组,比如当应付的时候,只留下查看凭证跟付款, 应收账款的时候保留三个
type?: number, // 1 -> 应付账款结算 2-> 应收账款结算, 用于判断 查看付款凭证
handleReconciledComfirm?: (params: any) => void // 对账确定回调
handleComfirmInCompletePayment?: (params: any) => void, // 确认未到款回调
handleComfirmCompletePayment?: (params:any) => void, //确认到款回调
handleUpload?: (params: any) => void, // 上传凭证
}
// 应付账款 - 付款方查看凭证, 能力中心
const PAYABLE_PAYER = 1;
// 应收账款管理-收款方查看凭证, 能力中心
const RECEIABLE_BENEFICIARY = 2;
// 平台代收账款结算 - 收款方查看凭证 能力中心
const PLATFORM_BENEFICIARY = 3;
// 平台代收账款结算 - 付款方查看凭证 这是平台后台
const PLATFORM_PAYER = 4;
// 平台积分结算-收款方查看凭证, 能力中心
const SCORE_BENEFINCIARY = 5;
// 平台积分结算-付款方查看凭证 , 这是平台后天
const SCORE_PAYER = 6;
// 显示确认对账
const ConfirmAccountComponent: React.FC<Iprops> = (props) => {
const { settlementDate, payName } = props;
const onOk = (params) => {
!!props.handleReconciledComfirm && props.handleReconciledComfirm(params)
}
return (
<ModalContainer>
{
({visible, show, cancel}) => {
return (
<>
<Modal
width={400}
title="确认对账完成"
visible={visible}
onCancel={cancel}
onOk={() => onOk({onCancel: cancel, id: props.id})}
>
<ConfirmAccount settlementDate={settlementDate || ''} payName={payName || ''} />
</Modal>
<div className={styles.modalBtn} onClick={show}>确认对账完成</div>
</>
)
}
}
</ModalContainer>
)
}
// 确认付款凭证
const ConfirmCollected = (props) => {
return (
<ModalContainer>
{
({visible, show, cancel}) => {
return (
<>
<Modal width={548} title="确认付款凭证" onCancel={cancel} visible={visible}
footer={(
<Space>
<Button onClick={cancel}>取消</Button>
<Button
danger
onClick={() => props.handleComfirmInCompletePayment({onCancel: cancel, status: 0, id: props.id})}
>确认未到款</Button>
<Button
type={"primary"}
onClick={() => props.handleComfirmCompletePayment({onCancel: cancel, status: 1, id: props.id})}
>确认到款</Button>
</Space>
)}
>
<WrapVoucher id={props.id} type={props.type} />
</Modal>
<div className={styles.modalBtn} onClick={show}>确认付款凭证</div>
</>
)
}
}
</ModalContainer>
)
}
const WrapVoucher = ({ id, type}) => {
const [files, setFiles] = useState<any>([]);
console.log(id);
const SERVICES_MAP = {
// /settle/accounts/member/settlement/getPayablePayProve
[PAYABLE_PAYER]: PublicApi.getSettleAccountsMemberSettlementGetPayablePayProve,
[RECEIABLE_BENEFICIARY]: PublicApi.getSettleAccountsMemberSettlementGetReceivablePayProve,
///settle/accounts/platform/settlement/getReceivablePayProve
[PLATFORM_BENEFICIARY]: PublicApi.getSettleAccountsPlatformSettlementGetReceivablePayProve,
[PLATFORM_PAYER]: PublicApi.getSettleAccountsPlatformSettlementGetPayablePayProve,
// /settle/accounts/platform/score/settlement/getReceivablePayProve
[SCORE_BENEFINCIARY]: PublicApi.getSettleAccountsPlatformScoreSettlementGetReceivablePayProve,
[SCORE_PAYER]: PublicApi.getSettleAccountsPlatformScoreSettlementGetPayablePayProve
}
useEffect(() => {
if(id) {
const service = SERVICES_MAP[type];
service({id}).then((data) => {
if(data.code == 1000) {
setFiles(data.data)
}
})
}
}, [id])
return (
<Voucher files={files} />
)
}
// 显示查看付款凭证
const ViewPaymentVoucher = (props) => {
return (
<ModalContainer>
{
({visible, show, cancel}) => {
return (
<>
<Modal width={548} title="查看付款凭证" onCancel={cancel} visible={visible} footer={null}>
<WrapVoucher id={props.id} type={props.type} />
</Modal>
<div className={styles.modalBtn} onClick={show}>查看付款凭证</div>
</>
)
}
}
</ModalContainer>
)
}
interface UploadVocherProps {
settlementId: number,
id: number
handleUpload: (params: any) => void
}
interface FileType {
name: string,
proveUrl: string
}
// 待付款 状态 上传付款凭证
const UploadVoucher: React.FC<UploadVocherProps> = (props) => {
const { settlementId } = props;
const [fileList, setFileList] = useState<FileType[]>([]);
const getFileList = (list: FileType[]) => {
setFileList(list);
}
return (
<ModalContainer>
{
({visible, show, cancel}) => {
return (
<>
<Modal
width={548}
title="上传付款凭证"
onCancel={cancel}
visible={visible}
footer={(
<Space>
<Button onClick={cancel}>取消</Button>
<Button
type={"primary"}
onClick={() => props.handleUpload({onCancel: cancel, id: props.id, fileList: fileList})}
>确认</Button>
</Space>
)}
>
<UploadPayVoucher id={settlementId} getFileList={getFileList} />
</Modal>
<div className={styles.modalBtn} onClick={show}>付款</div>
</>
)
}
}
</ModalContainer>
)
}
// 待对账时显示确认对账, 待付款 什么都不显示, 代收款显示确认付款凭证, 以完成显示 查看付款凭证
const ChildrenComponent = {
[TO_BE_RECONCILED]: ConfirmAccountComponent,
[TO_BE_PAY]: UploadVoucher,
[TO_BE_COLLECTED]: ConfirmCollected,
[COMPLETED]: ViewPaymentVoucher
}
const StatusActions: React.FC<Iprops> = (props: Iprops) => {
const { status, excludes = [] } = props;
const Component = excludes.includes(status) ? null : ChildrenComponent[status];
return (
<>
{Component && <Component {...props} />}
</>
)
}
export default StatusActions
\ No newline at end of file
.tag-out-border {
border: none;
}
\ No newline at end of file
import React from 'react';
import { Tag } from 'antd';
import './index.less';
export const TO_BE_RECONCILED = 1; // 待对账
export const TO_BE_PAY = 2 // 待付款
export const TO_BE_COLLECTED = 3; // 待收款
export const COMPLETED = 4 // 以完成
export enum StatusEnum {
TO_BE_RECONCILED,
TO_BE_PAY,
TO_BE_COLLECTED,
COMPLETED
}
const COLOR = [
"", // 随意给一个
"gold", // 待对账
"red", // 待付款
"blue", // 代收款,
"green", // 以完成
]
/**
* 以下用于 应收账款管理, 应付账款管理 列表页, 以及应收,应付款详情页状态
*/
const STATUS_TEXT = [
"无",
"待对账",
"待付款",
"待收款",
"已完成"
]
const STATUS_TEXT_MAP = {
"待对账": 1,
"待付款": 2,
"待收款": 3,
"已完成": 4
}
/**
* 开票管理, 开票类型, 其中 value 的值对应上面 COLOR 的值
*/
const INVOICE_TYPE = {
"生产通知单": 0,
"积分订单": 1,
"退货申请单": 2,
"订单": 3,
"物流单": 4,
}
/**
* 开票管理, 开票状态
*/
const INVOICE_STATUS = {
"未开票": 3,
"已开票": 4,
}
/**
* 将开票类型跟 应收应付账款管理合并
*/
const ALL_COLOR_MAP = {
...INVOICE_TYPE,
...STATUS_TEXT_MAP,
...INVOICE_STATUS
}
interface Iprops {
status?: StatusEnum,
text?: string
}
const StatusTag: React.FC<Iprops> = (props: Iprops) => {
const { status, text } = props
return (
<Tag
className="tag-out-border"
color={
text
? COLOR[ALL_COLOR_MAP[text]]
: COLOR[status]
}
>
{
text || STATUS_TEXT[status]
}
</Tag>
)
}
// StatusTag.defaultProps = {
// status: 1
// }
export default StatusTag
\ No newline at end of file
.container {
.formItem {
display: flex;
flex-direction: row;
align-items: center;
font-size: 12px;
margin-bottom: 24px;
.label {
margin-right: 20px;
color: #909399;
width: 70px;
}
}
.voucherText {
color: #909399;
font-size: 14px;
}
.upload {
margin-top: 16px;
.tips {
margin-top: 12px;
font-size: 12px;
color: #909399;
}
}
}
\ No newline at end of file
......@@ -4,26 +4,129 @@
* @Description: 上传付款凭证
*/
import React from 'react';
import React, { useState, useEffect } from 'react';
import Voucher from '../Voucher';
import styles from './index.less';
import { Upload, Button, message } from 'antd';
import { UploadOutlined } from '@ant-design/icons'
import { UploadFile, UploadChangeParam } from 'antd/lib/upload/interface';
import { UPLOAD_TYPE } from '@/constants'
// import { VoucherFileProps } from '../../common/type';
import { PublicApi } from '@/services/api';
interface VoucherFileProps {
name: string,
proveUrl: string
}
interface Iprops {
fileList?: VoucherFileProps[],
id: number, // 结算方id
getFileList: (params: any[]) => void
}
interface AccountInfo {
bankAccount: string,
name: string,
bankDeposit: string
}
const UploadPayVoucher: React.FC<Iprops> = (props) => {
const [fileList, setFileList] = useState<VoucherFileProps[]>([]);
const [loading, setLoading] = useState(false);
const [accountInfo, setAccountInfo] = useState<AccountInfo | null>(null)
// 进来设置fileList
// useEffect(() => {
// setFileList(props.fileList)
// }, [props.fileList])
/**
* 获取账户名称等
*/
useEffect(() => {
async function getAccountInfo() {
///settle/accounts/corporate/account/config
const { data, code } = await PublicApi.getSettleAccountsCorporateAccountConfig({memberId: props.id.toString()});
if(code == 1000) {
setAccountInfo(data);
}
}
getAccountInfo()
}, [props.id])
/***
* 上传前检查
*/
const fileMaxSize = 200;
const beforeUpload = (file: UploadFile) => {
const isSizeLimit = file.size / 1024 < fileMaxSize;
if (!isSizeLimit) {
message.error(`上传文件大小不超过${fileMaxSize}K!`);
}
return isSizeLimit;
}
/**
* 上传配置
*/
const uploadProps = {
name: 'file',
action: '/api/file/file/upload',
headers: {},
data: {
fileType: UPLOAD_TYPE, // 指定类型是本地还是线上,
},
disabled: loading,
showUploadList: false,
onChange(info: UploadChangeParam) {
if (info.file.status === 'uploading') {
setLoading(true)
return;
}
if (info.file.status === 'done') {
// 图片回显
const { code, data } = info.file.response
if (code === 1000) {
console.log('upload success')
// onChange(data)
const temp: VoucherFileProps[] = [...fileList];
const filename = info.file.name
temp.push({
name: filename,
proveUrl: data
})
setFileList(temp);
props.getFileList(temp)
}
setLoading(false)
}
},
beforeUpload
};
const UploadPayVoucher = () => {
return (
<div>
<div>
<span>账户名称</span>
<span>温州市隆昌皮具有限公司</span>
<div className={styles.container}>
<div className={styles.formItem}>
<span className={styles.label}>账户名称</span>
<span className={styles.value}>{accountInfo?.name}</span>
</div>
<div className={styles.formItem}>
<span className={styles.label}>银行账号</span>
<span className={styles.value}>{accountInfo?.bankAccount}</span>
</div>
<div>
<span>银行账号</span>
<span>3214 454646 145 46 1231</span>
<div className={styles.formItem}>
<span className={styles.label}>开户行</span>
<span className={styles.value}>{accountInfo?.bankDeposit}</span>
</div>
<div>
<span>开户行</span>
<span>中国建设银行广州市分行营业部</span>
<p className={styles.voucherText}>上传支付凭证</p>
<Voucher files={fileList} />
<div className={styles.upload}>
<Upload {...uploadProps}>
<Button icon={<UploadOutlined />}>上传凭证</Button>
<p className={styles.tips}>单个凭证文件大小不能超过200K</p>
</Upload>
</div>
<h1>上传支付凭证</h1>
<Voucher />
</div>
)
}
......
......@@ -23,5 +23,10 @@
.view {
margin-left: auto;
cursor: pointer;
}
.text {
cursor: pointer;
}
}
\ No newline at end of file
......@@ -8,16 +8,38 @@ import React from 'react';
import styles from './index.less'
import image_icon from '@/asserts/image_icon.png';
const Voucher = () => {
interface VoucherFileProps {
name: string,
proveUrl: string
}
interface Iprops {
files: VoucherFileProps[]
}
const Voucher: React.FC<Iprops> = (props) => {
const { files = [] } = props;
console.log(files);
return (
<div className={styles.container}>
{/* <div></div>/ */}
<div className={styles.image}>
<img src={image_icon} className={styles.icon} />
</div>
<div className={styles.text}>20187878.jpg</div>
<div className={styles.view}>预览</div>
</div>
<>
{
files.map((item: VoucherFileProps, key: number) => {
return (
<div className={styles.container} key={key}>
{/* <div></div>/ */}
<div className={styles.image}>
<img src={image_icon} className={styles.icon} />
</div>
<div className={styles.text}>
<a href={item.proveUrl} target={"_blank"}>{item.name}</a>
</div>
<div className={styles.view}>
<a href={item.proveUrl} target={"_blank"}>预览</a>
</div>
</div>
)
})
}
</>
)
}
......
/*
* @Author: Bill
* @Date: 2020-10-20 10:54:00
* @Description: 积分结算详情页
*/
import React, { useRef, useState, useEffect } from 'react';
import { PageHeaderWrapper } from '@ant-design/pro-layout'
import { Card, PageHeader, Descriptions, Button} from 'antd';
import { history } from 'umi';
import AvatarWrap from '@/components/AvatarWrap';
import NiceForm from '@/components/NiceForm';
import { FORM_FILTER_PATH } from '@/formSchema/const';
import { createFormActions } from '@formily/antd';
import { StandardTable } from 'god';
import { useStateFilterSearchLinkageEffect } from '@/formSchema/effects/useFilterSearch';
import { useAsyncInitSelect } from '@/formSchema/effects/useAsyncInitSelect';
import { detailSchema } from './schema'
import { usePageStatus } from '@/hooks/usePageStatus';
import StatusTag from '../../components/StatusTag';
import { timeRange } from '@/utils/index';
import moment from 'moment';
import { PublicApi } from '@/services/api';
const formActions = createFormActions();
const columns = [
{title: '单据号', dataIndex: 'orderNo'},
{title: '单据摘要', dataIndex: 'orderAbstract'},
{title: '单据类型', dataIndex: 'settlementOrderTypeName'},
{title: '单据时间', dataIndex: 'orderTime'},
{title: '订单类型', dataIndex: 'orderTypeName'},
{title: '所需积分', dataIndex: 'orderScore'},
{title: '支付积分', dataIndex: 'payScore'},
{title: '支付时间', dataIndex: 'payTime'},
{
title: '兑换比率',
dataIndex: 'ratio',
render: (text,record) => {
return (record.ratio + '%');
}
},
{title: '本期结算金额', dataIndex: 'settlementAmount'},
]
const ScoreInfo: React.FC = () => {
const ref = useRef<any>({});
const { id } = usePageStatus();
const [infoDetail, setInfoDetail] = useState<any>();
const fetchListData = async (params) => {
const postData = {
settlementId: id,
...params
}
// /settle/accounts/platform/settlement/pagePayableSettlementDetail
///settle/accounts/platform/score/settlement/pagePayableSettlementDetail
const res = await PublicApi.getSettleAccountsPlatformScoreSettlementPagePayableSettlementDetail(postData)
return res.data
}
useEffect(() => {
if(id) {
// 获取详情
async function fetchDetail() {
const { data, code } = await PublicApi.getSettleAccountsPlatformScoreSettlementGetPayableDetail({id})
if(code == 1000) {
setInfoDetail(data);
}
}
fetchDetail();
}
}, [id])
/**
* 搜索
*/
const handleSearch = (values) => {
const format = 'YYYY-MM-DD'
const { payTime, orderTime, ...rest } = values;
const payTimeRange = payTime ? timeRange(values.payTime): null;
const payStartTime = payTimeRange ? moment(payTimeRange.st * 1000).format(format) : null;
const payEndTime = payTimeRange ? moment(payTimeRange.et * 1000).format(format) : null;
const orderTimeRange = orderTime ? timeRange(values.orderTime) : null;
const orderStartTime = orderTimeRange ? moment(orderTimeRange.st * 1000).format(format) : null;
const orderEndTime = orderTimeRange ? moment(orderTimeRange.et * 1000).format(format) : null;
ref.current.reload({...rest, payStartTime, payEndTime, orderStartTime, orderEndTime});
}
return (
<PageHeaderWrapper
title={
<>
<PageHeader
style={{ padding: '0' }}
onBack={() => history.goBack()}
title={
<AvatarWrap
info={{
aloneTxt: '单',
name: "结算单号:"
}}
extra={(
<span style={{ fontSize: 12, fontWeight: 'normal' }}>{infoDetail?.settlementNo}</span>
)}
/>
}
>
<Descriptions
column={3}
style={{
padding: '0 32px',
}}
>
<Descriptions.Item label="结算日期:">{infoDetail?.settlementDate}</Descriptions.Item>
<Descriptions.Item label="结算单数:">{infoDetail?.totalCount }</Descriptions.Item>
<Descriptions.Item label="结算金额:">{infoDetail?.amount}</Descriptions.Item>
<Descriptions.Item label="结算方式:">{infoDetail?.settlementWayName}</Descriptions.Item>
<Descriptions.Item label="外部状态:">
<StatusTag text={infoDetail?.statusName} />
</Descriptions.Item>
</Descriptions>
</PageHeader>
</>
}
>
<Card>
<StandardTable
tableProps={{
rowKey: record => (record.orderNo + "-" + record.payTime),
}}
columns={columns}
currentRef={ref}
fetchTableData={(params: any) => fetchListData(params)}
controlRender={
<NiceForm
actions={formActions}
expressionScope={{
exportBtn: (
<div>
<Button>导出</Button>
</div>
)
}}
effects={($, actions) => {
useStateFilterSearchLinkageEffect($, actions, 'megaLayout.topLayout.orderNo', FORM_FILTER_PATH);
// useAsyncInitSelect(
// ['innerStatus', 'outerStatus'],
// fetchSelectOptions,
// );
}}
schema={detailSchema}
onSubmit={handleSearch}
/>
}
/>
</Card>
</PageHeaderWrapper>
)
}
export default ScoreInfo
\ No newline at end of file
import { FORM_FILTER_PATH } from '@/formSchema/const';
import { ISchema } from '@formily/antd';
const commonTimeList = [
{ label: '今天', value: 1},
{ label: '一周内', value: 2},
{ label: '一个月内', value: 3},
{ label: '三个月内', value: 4},
{ label: '六个月内', value: 5},
{ label: '一年内', value: 6 },
{ label: '一年前', value: 7}
];
const orderTime = [{label: '下单时间(所有)', value: 0}].concat(commonTimeList);
const payTime = [{label: '支付时间(所有)', value: 0}].concat(commonTimeList);
/**
* 应收账款管理--物流单结算明细详情, 生产通知单结算明细
*/
export const detailSchema: ISchema = {
type: 'object',
properties: {
megaLayout: {
type: 'object',
'x-component': 'mega-layout',
properties: {
topLayout: {
type: 'object',
'x-component': 'Mega-Layout',
'x-component-props': {
grid: true,
},
properties: {
ctl: {
type: 'object',
'x-component': 'Children',
'x-component-props': {
children: '{{exportBtn}}',
},
},
orderNo: {
type: 'string',
'x-component': 'Search',
'x-component-props': {
placeholder: '搜索(单据号)',
},
},
},
},
[FORM_FILTER_PATH]: {
type: 'object',
'x-component': 'flex-layout',
'x-component-props': {
colStyle: {
marginLeft: 20,
},
},
properties: {
orderTime: {
type: 'string',
enum: orderTime,
default: 0,
'x-component-props': {
placeholder: '下单时间(全部)',
allowClear: true,
},
},
payTime: {
type: 'string',
enum: payTime,
default: 0,
'x-component-props': {
placeholder: '支付时间(全部)',
allowClear: true,
},
},
submit: {
'x-component': 'Submit',
'x-mega-props': {
span: 1,
},
'x-component-props': {
children: '查询',
},
},
},
},
},
},
},
};
\ No newline at end of file
/*
* @Author: Bill
* @Date: 2020-10-20 11:04:07
* @Description: 应付账款结算
*/
import React, { useRef } from 'react';
import { PageHeaderWrapper } from '@ant-design/pro-layout'
import { Card, Button, Modal, DatePicker, Tag, Space } from 'antd';
import NiceForm from '@/components/NiceForm';
import { FORM_FILTER_PATH } from '@/formSchema/const';
import { ISchema, createFormActions } from '@formily/antd';
import { StandardTable } from 'god';
import { useStateFilterSearchLinkageEffect } from '@/formSchema/effects/useFilterSearch';
import { useAsyncInitSelect } from '@/formSchema/effects/useAsyncInitSelect';
import { schema } from './schema';
import StatusActions from '../../components/StatusActions';
import StatusTag from '../../components/StatusTag';
import { PublicApi } from '@/services/api'
import { Moment } from 'moment';
import { ColumnsType } from 'antd/es/table';
import EyePreview from '@/components/EyePreview';
interface SearchParams {
settlementName?: string,
payName?: string,
isSettlement: number,
startTime?: Moment,
endTime?: Moment,
orderType?: number,
status?: number,
current: number,
pageSize: number,
}
const formActions = createFormActions();
const SCORE_PAYER = 6;
const SettlementList = () => {
const ref = useRef<any>({})
const fetchListData = async (params) => {
// /settle/accounts/platform/settlement/pagePayableSettlement
const searchData = {
...params,
status: typeof params.status == 'undefined' ? 0 : params.status,
}
console.log(searchData);
///settle/accounts/platform/score/settlement/pagePayableSettlement
const res = await PublicApi.getSettleAccountsPlatformScoreSettlementPagePayableSettlement(searchData)
return res.data;
}
const columns: ColumnsType<any> = [
{
title: '结算单号',
dataIndex: 'settlementNo',
render: (text, record) => {
const url = `/balanced/scorePayable/detail?id=${record.id}`;
return (
<EyePreview url={url}>
{text}
</EyePreview>
)
}
},
{title: '结算日期', dataIndex: 'settlementDate'},
{title: '结算方式', dataIndex: 'settlementWayName'},
{title: '结算方', dataIndex: 'settlementName'},
{title: '总单数', dataIndex: 'totalCount'},
{title: '结算积分', dataIndex: 'score'},
{
title: '兑换比率',
dataIndex: 'ratio',
render: (text, record) => {
return (record.ratio * 100) + "%";
}
},
{title: '结算金额', dataIndex: 'amount'},
{title: '结算时间', dataIndex: 'settlementTime'},
{title: '支付方式', dataIndex: 'payWayName'},
{
title: '结算状态', dataIndex: 'status',
filters: [
{ text: '待对账', value: 1 },
{ text: '待付款', value: 2 },
{ text: '待收款', value: 3 },
{ text: '以完成', value: 4 },
],
onFilter: (value, record: any) => record.status == value,
render: (text, record: any) => {
return (
<StatusTag status={record.status || 1} />
)
}
},
{
title: '操作',
render: (text, record: any) => {
return (
<StatusActions
status={record.status <= 2 ? record.status : 4 }
id={record.id}
excludes={[1, 3]}
settlementId={record.memberId || 1}
handleUpload={handleUploadVoucher}
type={SCORE_PAYER}
/>
)
}
}
]
/**
* 上传凭证
* @param params
*/
const handleUploadVoucher = (params: any) => {
console.log(params);
PublicApi.postSettleAccountsPlatformScoreSettlementPay({id: params.id, proveList: params.fileList})
.then((data) => {
if(data.code === 1000) {
formActions.submit();
params.onCancel()
}
})
}
/**
* 搜索
*/
const handleSearch = (values: SearchParams) => {
const format = 'YYYY-MM-DD'
const startTime = values.startTime?.format(format);
const endTime = values.endTime?.format(format);
ref.current.reload({...values, startTime, endTime});
}
return (
<PageHeaderWrapper>
<Card>
<StandardTable
tableProps={{
rowKey: 'id',
}}
columns={columns}
currentRef={ref}
fetchTableData={(params: any) => fetchListData(params)}
controlRender={
<NiceForm
components={{DatePicker}}
actions={formActions}
expressionScope={{}}
effects={($, actions) => {
useStateFilterSearchLinkageEffect($, actions, 'megaLayout.settlementName', FORM_FILTER_PATH);
// useAsyncInitSelect(
// ['innerStatus', 'outerStatus'],
// fetchSelectOptions,
// );
}}
schema={schema}
onSubmit={handleSearch}
/>
}
/>
</Card>
</PageHeaderWrapper>
)
}
export default SettlementList
\ No newline at end of file
/*
* @Author: Bill
* @Date: 2020-10-22 09:52:10
* @Description: 应收账款结算 schema集合
*/
import { FORM_FILTER_PATH } from '@/formSchema/const';
import { ISchema } from '@formily/antd';
/**
* 应收账款 index.tsx 列表页schema
*/
export const schema: ISchema = {
type: 'object',
properties: {
megaLayout: {
type: 'object',
'x-component': 'mega-layout',
properties: {
settlementName: {
type: 'string',
'x-component': 'Search',
'x-component-props': {
placeholder: '搜索(结算方)',
align: 'flex-left',
tip: '输入 结算方 进行搜索',
},
},
[FORM_FILTER_PATH]: {
type: 'object',
'x-component': 'mega-layout',
'x-component-props': {
grid: true,
full: true,
autoRow: true,
columns: 6,
},
properties: {
startTime: {
type: 'string',
'x-component': 'DatePicker',
'x-component-props': {
allowClear: true
}
},
endTime: {
type: 'string',
'x-component': 'DatePicker',
'x-component-props': {
allowClear: true
}
},
status: {
type: 'string',
enum: [
{ label: '结算状态(所有)', value: 0 },
{ label: '待对账', value: 1 },
{ label: '待付款', value: 2 },
{ label: '代收款', value: 3 },
{ label: '已完成', value: 4 },
],
default: 0,
'x-component-props': {
placeholder: '结算状态(全部)',
allowClear: true,
},
},
submit: {
'x-component': 'Submit',
'x-mega-props': {
span: 1,
},
'x-component-props': {
children: '查询',
},
},
},
},
},
},
},
};
\ No newline at end of file
import React, { useState, useRef, ReactNode, useEffect } from 'react'
import { history } from 'umi'
import { Button, Steps, Card, Space, Tooltip, Row, Col, Descriptions, Table } from 'antd'
import { Button, Steps, Card, Space, Tooltip, Row, Col, Descriptions, Table, Image } from 'antd'
import { PageHeaderWrapper } from '@ant-design/pro-layout'
import {
QuestionCircleOutlined,
......@@ -119,7 +119,12 @@ const viewBrand: React.FC<{}> = () => {
let imgArray = Object.values(proveInfo)
return imgArray.map((item: any, index: number) => <Col key={index} span={3} xxl={3} xl={4} lg={4}>
<div className={styles.proveBox}>
<img src={item} alt=""/>
<Image
width={175}
height={120}
src={item}
alt="品牌相关证明材料"
/>
</div>
</Col>
)
......
import React, { useState, useRef, ReactNode, useEffect } from 'react'
import { history } from 'umi'
import { Button, Steps, Card, Space, Tooltip, Row, Col, Descriptions, Table, Form, Modal, Radio, Input } from 'antd'
import { Button, Steps, Card, Space, Tooltip, Row, Col, Descriptions, Table, Form, Modal, Radio, Input, Image } from 'antd'
import { PageHeaderWrapper } from '@ant-design/pro-layout'
import {
QuestionCircleOutlined,
......@@ -129,7 +129,12 @@ const CheckBrand: React.FC<{}> = () => {
let imgArray = Object.values(proveInfo)
return imgArray.map((item: any, index: number) => <Col key={index} span={3} xxl={3} xl={4} lg={4}>
<div className={styles.proveBox}>
<img src={item} alt=""/>
<Image
width={175}
height={120}
src={item}
alt="品牌相关证明材料"
/>
</div>
</Col>
)
......
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