Commit 5217f0c3 authored by GuanHua's avatar GuanHua
parents 6932d66a f41c8893
import common from './ko_KR/common'
import menu from './ko_KR/menu'
import home from './ko_KR/home'
import order from './ko_KR/order'
import shop from './ko_KR/shop'
import priceManage from './ko_KR/priceManage'
import handling from './ko_KR/handling'
import classAndProperty from './ko_KR/classAndProperty'
import member from './ko_KR/member'
import purchase from './ko_KR/purchase'
import editor from './ko_KR/editor'
import authConfig from './ko_KR/system/authConfig'
import systemSetting from './ko_KR/system/systemSetting'
import accountSetting from './ko_KR/system/accountSetting'
import activityPage from './ko_KR/marketingAbility/activityPage'
import merchantCoupon from './ko_KR/marketingAbility/merchantCoupon'
import paltformSign from './ko_KR/marketingAbility/paltformSign'
import selfManagement from './ko_KR/marketingAbility/selfManagement'
import logistics from './ko_KR/logistics'
import dealAbility from './ko_KR/dealAbility'
import purchaserEvaluation from './ko_KR/purchaserEvaluation'
import stockSellStorage from './ko_KR/stockSellStorage'
import supplierEvaluation from './ko_KR/supplierEvaluation'
import transactionComponents from './ko_KR/transaction_components'
import user from './ko_KR/user'
import contract from './ko_KR/contract'
import components from './ko_KR/components'
import content from './ko_KR/content'
import commodity from './ko_KR/commodity'
import trademark from './ko_KR/trademark'
import repositories from './ko_KR/repositories'
import payandSettle from './ko_KR/payandSettle'
import balance from './ko_KR/balance'
import processRuleSetting from './ko_KR/system/processRuleSetting'
import afterService from './ko_KR/afterService';
import marketing from './ko_KR/marketing'
import common from './ko-KR/common'
import menu from './ko-KR/menu'
import home from './ko-KR/home'
import order from './ko-KR/order'
import shop from './ko-KR/shop'
import priceManage from './ko-KR/priceManage'
import handling from './ko-KR/handling'
import classAndProperty from './ko-KR/classAndProperty'
import member from './ko-KR/member'
import purchase from './ko-KR/purchase'
import editor from './ko-KR/editor'
import authConfig from './ko-KR/system/authConfig'
import systemSetting from './ko-KR/system/systemSetting'
import accountSetting from './ko-KR/system/accountSetting'
import activityPage from './ko-KR/marketingAbility/activityPage'
import merchantCoupon from './ko-KR/marketingAbility/merchantCoupon'
import paltformSign from './ko-KR/marketingAbility/paltformSign'
import selfManagement from './ko-KR/marketingAbility/selfManagement'
import logistics from './ko-KR/logistics'
import dealAbility from './ko-KR/dealAbility'
import purchaserEvaluation from './ko-KR/purchaserEvaluation'
import stockSellStorage from './ko-KR/stockSellStorage'
import supplierEvaluation from './ko-KR/supplierEvaluation'
import transactionComponents from './ko-KR/transaction_components'
import user from './ko-KR/user'
import contract from './ko-KR/contract'
import components from './ko-KR/components'
import content from './ko-KR/content'
import commodity from './ko-KR/commodity'
import trademark from './ko-KR/trademark'
import repositories from './ko-KR/repositories'
import payandSettle from './ko-KR/payandSettle'
import balance from './ko-KR/balance'
import processRuleSetting from './ko-KR/system/processRuleSetting'
import afterService from './ko-KR/afterService';
import marketing from './ko-KR/marketing'
export default {
'global.siteName': '瓴犀',
......
......@@ -14,11 +14,11 @@ export default {
'repositories.columns.option.button' : '재고 조달',
'repositories.modalSchema.type.1' : '창고 재고 직접 수정(기본값)',
'repositories.modalSchema.type.2' : '비율에 따라 창고 재고를 조정하다.',
'repositories.modalSchema.inventoryAmount' : ''재고품', '창고 재고를 입력한 , 확인을 클릭하여 새로 입력한 창고 재고로 원래의 창고 재고를 대량으로 조정합니다'',
'repositories.modalSchema.inventoryAmount' : "'재고품', '창고 재고를 입력한 후, 확인을 클릭하여 새로 입력한 창고 재고로 원래의 창고 재고를 대량으로 조정합니다'",
'repositories.modalSchema.inventoryAmount.placeholder' : '창고 재고를 기입해 주십시오',
'repositories.modalSchema.inventoryAmount.message.1' : '창고 재고를 기입해 주십시오',
'repositories.modalSchema.inventoryAmount.message.2' : '소수점 세 자리만',
'repositories.modalSchema.inventoryRate' : ''창고 재고 조정 비율', '백분율을 입력하면 원래 창고의 재고에 따라 백분율을 증가하거나 감소할 있습니다. 감소는 마이너스를 입력하십시오.'',
'repositories.modalSchema.inventoryRate' : "'창고 재고 조정 비율', '백분율을 입력하면 원래 창고의 재고에 따라 백분율을 증가하거나 감소할 수 있습니다. 감소는 마이너스를 입력하십시오.'",
'repositories.modalSchema.inventoryRate.placeholder' : '창고 재고 조정 비율을 기입해 주십시오',
'repositories.modalSchema.inventoryRate.message.1' : '창고 재고 조정 비율을 기입해 주십시오',
'repositories.modalSchema.inventoryRate.message.2' : '숫자를 기입하시고, 최대 3자리의 소수점을 보존하십시오',
......
......@@ -11,7 +11,7 @@ export default {
'supplierEvaluation.zhichiJPGPNGJPEG': 'JPG/PNG/JPEG 지원',
'supplierEvaluation.meizhangzuidabuchaoguo': '매 장당 최대 10M 이하, 사이즈 제한 없음',
'supplierEvaluation.zuidashuliangxianzhi4': '최대 수량 4장 제한',
'supplierEvaluation.ninhaiyouweibaocunde': ''아직 저장하지 않은 내용이 있습니다. 떠나시겠습니까?'',
'supplierEvaluation.ninhaiyouweibaocunde': "'아직 저장하지 않은 내용이 있습니다. 떠나시겠습니까?'",
'supplierEvaluation.fabu': '발포',
'supplierEvaluation.dingdanhao': '주문 번호',
'supplierEvaluation.waibuzhuangtai': '외부 상태',
......
......@@ -330,6 +330,10 @@ export const RETURN_GOODS_OUTER_DELIVERY_CONTRACT = 43;
*/
export const RETURN_GOODS_MANUAL_DELIVERY_CONTRACT = 44;
/**
* 售后退货简单流程-平台审核
*/
export const RETURN_GOODS_SIMPLE_PLATFORM = 63;
/**
* 售后换货默认流程-合同订单
*/
export const EXCHANGE_GOODS_OUTER_DELIVERY_CONTRACT = 45;
......
......@@ -12,7 +12,7 @@ import { postAsReturnGoodsManualReturnDeliveryGoods } from '@/services/AfterServ
import { SettingOutlined } from '@ant-design/icons';
import moment from 'moment';
import { usePageStatus } from '@/hooks/usePageStatus';
import { RETURN_GOODS_MANUAL_DELIVERY, RETURN_GOODS_MANUAL_DELIVERY_CONTRACT } from '../../constants';
import { RETURN_GOODS_MANUAL_DELIVERY, RETURN_GOODS_MANUAL_DELIVERY_CONTRACT, RETURN_GOODS_SIMPLE_PLATFORM } from '../../constants';
import DetailInfo from '../components/DetailInfo';
import ReturnDeliverDrawer, { ValuesType } from '../../components/DeliverDrawer';
......@@ -68,7 +68,13 @@ const ReturnPrDeliverVerify: React.FC = () => {
id={id}
headExtra={info => (
<>
{(info && (info.taskType === RETURN_GOODS_MANUAL_DELIVERY || info.taskType === RETURN_GOODS_MANUAL_DELIVERY_CONTRACT)) && (
{(
info
&& (
info.taskType === RETURN_GOODS_MANUAL_DELIVERY
|| info.taskType === RETURN_GOODS_MANUAL_DELIVERY_CONTRACT
|| info.taskType === RETURN_GOODS_SIMPLE_PLATFORM
)) && (
<Button
type="default"
icon={<SettingOutlined />}
......
......@@ -13,10 +13,11 @@ interface Iprops {
// onResendCode: () => void,
/** 商户订单号 */
tradeCode: string
onClose?: () => void
}
const GetCodeModal: React.FC<Iprops> = (props: Iprops) => {
const { title = '验证码', onOk, visible, tradeCode } = props;
const { title = '验证码', onOk, visible, tradeCode, onClose } = props;
const [code, setCode] = useState<string>("");
const { text, isActive, start } = useCountDown({
maxTime: 60,
......@@ -46,6 +47,9 @@ const GetCodeModal: React.FC<Iprops> = (props: Iprops) => {
start();
}
}
const handleClose = () => {
onClose?.()
}
return (
<Modal
......@@ -53,6 +57,7 @@ const GetCodeModal: React.FC<Iprops> = (props: Iprops) => {
width={360}
title={title}
onOk={handleOk}
onCancel={handleClose}
>
<div className={styles.container}>
<div className={styles.formItem}>
......
......@@ -5,7 +5,7 @@
.wrapContainer {
background-color: #FAFBFC;
padding: 12px;
padding: 12px 12px 0px 12px;
margin-top: 8px;
font-size: 14px;
......
import { getSettleAccountsPlatformSettlementChannelList } from '@/services/SettleV2Api';
import { Modal, Radio } from 'antd';
import { message, Modal, Radio } from 'antd';
import React, { useState, useEffect, useCallback } from 'react';
import styles from './index.less';
import PayItem from './payItem';
......@@ -59,6 +59,7 @@ const OtherPayModal: React.FC<Iprops> = (props: Iprops) => {
]
const getPayChannel = useCallback(async () => {
// message.info("正在加载支付渠道")
const { data, code } = await getSettleAccountsPlatformSettlementChannelList();
if (code === 1000) {
setPayChannelOptions(data.map((_item) => ({
......
......@@ -7,7 +7,8 @@ import alipay from '@/assets/imgs/alipay_icon.png';
interface Iprops {
mode: 'wechat' | 'alipay'
visible: boolean,
qrcode: string
qrcode: string,
onClose: () => void
}
const MODE_TEXT = {
......@@ -15,12 +16,17 @@ const MODE_TEXT = {
alipay: '支付宝'
}
const QrcodeModal: React.FC<Iprops> = (props: Iprops) => {
const { mode, visible, qrcode } = props;
const { mode, visible, qrcode, onClose } = props;
const currentImage = mode === 'wechat' ? wechat : alipay;
const handleClose = () => {
onClose?.()
}
return (
<Modal
visible={visible}
title={`请用${MODE_TEXT[mode]}支付`}
onCancel={handleClose}
>
<div className={styles.container}>
<div className={styles.tips}>
......
import { postSettleAccountsMemberSettlementCommunicationPayResult } from '@/services/SettleV2Api';
import React, { useEffect, useRef, useState } from 'react';
type Options = {
/** 间隔秒 */
offsetTime: number
/** 达到多少次就停止 */
endCount: number,
}
const useCycleRequest = (options: Options) => {
const { offsetTime = 3, endCount = 10 } = options || {}
const times = useRef(0);
const interval = useRef<null | ReturnType<typeof setInterval>>(null);
const [result, setResult] = useState(null);
const start = (fn: (params) => Promise<any>, params) => {
interval.current = setInterval(async () => {
// const res = await postSettleAccountsMemberSettlementCommunicationPayResult();
const res = await fn(params);
setResult(res);
times.current += 1;
if (times.current > endCount) {
cancel();
}
}, offsetTime * 1000)
}
const cancel = () => {
if (interval.current) {
clearInterval(interval.current)
}
}
useEffect(() => {
return () => {
cancel()
}
}, [])
return { cycleStart: start, cycleCancel: cancel, result }
}
export default useCycleRequest;
......@@ -12,6 +12,9 @@ import { useCallback } from 'react';
import { GetSettleAccountsMemberSettlementPagePayableSettlementResponseDetail } from '@/services/SettleV2Api';
import { ColumnsType } from 'antd/lib/table';
import { getIntl } from 'umi';
import { getPayAllInPayGetUserInfo, postPayAllInPayGetUserInfo } from '@/services/PayV2Api';
import { message } from 'antd';
import { getAuth } from '@/utils/auth';
const intl = getIntl();
const format = "YYYY-MM-DD HH:mm:ss"
const URL_MAP = {
......@@ -23,6 +26,23 @@ const URL_MAP = {
const STATUS_COLOR = ["default", "warning", "primary", "danger", "success"];
/** 通联支付 个人会员 */
const USER_MEMBER_TYPE = 3
/** 通联支付企业会员 */
const ENTERPRISE_MERBER_TYPE = 2
/** 通联支付 未认证提示 */
const BALANCE_UNVERIFY_TIPS = {
[USER_MEMBER_TYPE]: '该结算方会员未进行通联实名认证,暂不可收款',
[ENTERPRISE_MERBER_TYPE]: '该结算方会员暂未完成企业信息审核,暂不可收款;',
}
/** 付款方 */
const PAY_UNVERIFY_TIPS = {
[USER_MEMBER_TYPE]: '该会员未进行通联实名认证,暂不可收款',
[ENTERPRISE_MERBER_TYPE]: '该会员暂未完成企业信息审核,暂不可收款;',
}
type ModalsType = {
/** 查看付款 */
viewPay: boolean,
......@@ -41,6 +61,7 @@ type ModalsType = {
}
function useHandleSettlementList() {
const auth = getAuth()
const [itemInfo, setItemInfo] = useState<GetSettleAccountsMemberSettlementPagePayableSettlementResponseDetail | null>(null)
const [modals, setModals] = useState<ModalsType>({
viewPay: false,
......@@ -67,9 +88,43 @@ function useHandleSettlementList() {
})
}, [])
const handleAction = (record: GetSettleAccountsMemberSettlementPagePayableSettlementResponseDetail, key: keyof ModalsType) => {
const valifyUser = async (params: { memberRoleId: number, memberId: number }, mode: "balance" | 'pay') => {
const { code, data, message: msg } = await postPayAllInPayGetUserInfo(params, { ctlType: 'none' });
if (code !== 1000) {
message.error(msg);
return false;
}
const tips = mode === 'balance' ? BALANCE_UNVERIFY_TIPS : PAY_UNVERIFY_TIPS
if (!(data.memberType === USER_MEMBER_TYPE && data.isIdentityChecked === 1 || data.memberType === ENTERPRISE_MERBER_TYPE && data.status === 2)) {
message.error(tips[data.memberType])
return false;
}
return true
}
const handleAction = async (record: GetSettleAccountsMemberSettlementPagePayableSettlementResponseDetail, key: keyof ModalsType) => {
setItemInfo(record);
console.log("key", key);
if (key === 'universalPay') {
const res = await valifyUser({
memberId: record.memberId,
memberRoleId: record.roleId
}, 'balance');
// 结算方没验证
if (!res) {
return;
}
const payRes = await valifyUser({
memberId: auth.memberId,
memberRoleId: auth.memberRoleId
}, 'pay');
// 付款方没验证
if (!payRes) {
return;
}
}
handleOpen(key);
/** 通联支付 */
// if (record.payWay === 2 && record.status === COMPLETED) {
......
......@@ -15,7 +15,7 @@ import { fetchOptions } from '../../common'
import UploadVoucherModal from '../../components/UploadVoucherModal';
import Voucher from '../../components/Voucher';
import useSetSearchValueInTable from '@/hooks/useSetSearchValueInTable';
import { getSettleAccountsCommonGetSettlementOrderType, getSettleAccountsCommonGetSettlementStatus, getSettleAccountsMemberSettlementGetPayablePayProve, getSettleAccountsMemberSettlementPagePayableSettlement, GetSettleAccountsMemberSettlementPagePayableSettlementRequest, postSettleAccountsMemberSettlementCommunicationPay, postSettleAccountsMemberSettlementPay } from '@/services/SettleV2Api';
import { getSettleAccountsCommonGetSettlementOrderType, getSettleAccountsCommonGetSettlementStatus, getSettleAccountsMemberSettlementGetPayablePayProve, getSettleAccountsMemberSettlementPagePayableSettlement, GetSettleAccountsMemberSettlementPagePayableSettlementRequest, postSettleAccountsMemberSettlementCommunicationPay, postSettleAccountsMemberSettlementCommunicationPayResult, postSettleAccountsMemberSettlementPay } from '@/services/SettleV2Api';
import { postReportSettlementMemberManualSettlement } from '@/services/ReportV2Api';
import OtherPayModal from '../components/OtherPayModal';
import useHandleSettlementList from './hooks/useHandleSettlementList';
......@@ -24,6 +24,7 @@ import { UNIVERSAL_PAY_ALIPAY, UNIVERSAL_PAY_BALANCE, UNIVERSAL_PAY_QUICK, UNIVE
import GetCodeModal from '../components/GetCodeModal';
import { postPayEAccountAllInPayConfirmPay } from '@/services/PayV2Api';
import QrcodeModal from '../components/QrcodeModal';
import useCycleRequest from './hooks/useCycleRequest';
const { onFieldValueChange$ } = FormEffectHooks
const { RangePicker } = DatePicker;
......@@ -54,6 +55,9 @@ const SettlementList = () => {
const [qrcodeUrl, setQrcodeUrl] = useState<string>("");
const [currentUniversalPay, setCurrentUniversalPay] = useState<UniversalPay | null>(null);
/** 轮询请求支付状态 */
const { cycleCancel, cycleStart, result } = useCycleRequest({ offsetTime: 3, endCount: 10 });
const universalPayInfo1 = useMemo(() => ({
name: itemInfo?.settlementName,
amount: itemInfo?.amount,
......@@ -151,6 +155,7 @@ const SettlementList = () => {
return;
}
handleClose('smsCodeModal');
formActions.submit();
}
/** 通联支付, 付款 */
......@@ -189,17 +194,25 @@ const SettlementList = () => {
}
} finally {
setUniversalPayLoading(true)
setUniversalPayLoading(false)
}
}
/** 轮询接口 */
useEffect(() => {
if (modals.qrcodeModal) {
cycleStart(postSettleAccountsMemberSettlementCommunicationPayResult, { settlementNo: itemInfo.settlementNo });
}
}, [modals])
useEffect(() => {
if (result && result.code === 1000 && result.data ) {
message.success('支付成功')
cycleCancel();
formActions.submit();
}
}, [result])
/**
* 搜索
*/
......@@ -284,11 +297,14 @@ const SettlementList = () => {
mode={currentUniversalPay === UNIVERSAL_PAY_WECHAT ? 'wechat' : 'alipay' }
// mode={'wechat'}
qrcode={qrcodeUrl}
onClose={() => handleClose('qrcodeModal')}
/>
<GetCodeModal
visible={modals.smsCodeModal}
onOk={handleCompleteSmsCode}
tradeCode={itemInfo?.settlementNo}
onClose={() => handleClose('smsCodeModal')}
/>
</PageHeaderWrapper>
)
......
/*
* @Author: Bill
* @Date: 2020-10-28 13:46:19
* @Description: 开票管理, 发票自增
*/
import React from 'react';
import { useIntl, getIntl } from 'umi'
import { toArr, isFn, FormPath } from '@formily/shared'
import { Button, Input } from 'antd'
import styled from 'styled-components'
import {
SchemaForm,
SchemaField,
SchemaMarkupField as Field
} from '@formily/antd'
import { ArrayList } from '@formily/react-shared-components';
import { PlusOutlined, MinusOutlined } from '@ant-design/icons'
const ArrayComponents = {
CircleButton: props => <Button {...props} />,
TextButton: props => <Button {...props} />,
AdditionIcon: () => <div>+</div>,
RemoveIcon: () => <div>-</div>,
MoveDownIcon: () => <div>{getIntl().formatMessage({ id: 'balance.components.invoiceCreate.invoiceArray.arrayComponents.moveDownIcon' })}</div>,
MoveUpIcon: () => <div>{getIntl().formatMessage({ id: 'balance.components.invoiceCreate.invoiceArray.arrayComponents.moveUpIcon' })}</div>
}
const RowStyleLayout = styled(props => <div {...props} />)`
.ant-btn {
margin-right: 16px;
}
.ant-form-item {
display: inline-flex;
margin-right: 16px;
margin-bottom: 10px;
}
> .ant-form-item {
margin-bottom: 0;
margin-right: 0;
}
`
const InvoiceArray = (props) => {
const { value, schema, className, editable, path, mutators } = props
const {
renderAddition,
renderRemove,
renderMoveDown,
renderMoveUp,
renderEmpty,
renderExtraOperations,
...componentProps
} = schema.getExtendsComponentProps() || {}
const intl = useIntl();
const onAdd = () => {
const items = Array.isArray(schema.items)
? schema.items[schema.items.length - 1]
: schema.items
mutators.push(items.getEmptyValue())
}
const length = toArr(value).length;
return (
<ArrayList
value={value}
minItems={schema.minItems}
maxItems={schema.maxItems}
editable={editable}
components={ArrayComponents}
renders={{
renderAddition,
renderRemove,
renderMoveDown,
renderMoveUp,
renderEmpty // 允许开发者覆盖默认
}}
>
{toArr(value).map((item, index) => {
return (
<RowStyleLayout {...componentProps} key={index}>
<div style={{ display: 'flex', position: 'relative' }}>
<SchemaField path={FormPath.parse(path).concat(index)} />
{
length - 1 === index
? <Button onClick={onAdd} style={{ marginLeft: '-16px' }}><PlusOutlined width={44} /></Button>
: null
}
<Button
style={{ marginLeft: length - 1 === index ? '0' : '-16px' }}
onClick={() => mutators.remove(index)}
>
<MinusOutlined width={44} />
</Button>
</div>
</RowStyleLayout>
)
})}
<ArrayList.Empty>
{({ children }) => {
return (
<div className="array-cards-addition" onClick={onAdd}>
{/* {children} */}
<Button>{intl.formatMessage({ id: 'balance.components.invoiceCreate.invoiceArray.button' })}</Button>
</div>
)
}}
</ArrayList.Empty>
<ArrayList.Addition>
{({ children, isEmpty }) => {
if (!isEmpty) {
return null
}
}}
</ArrayList.Addition>
</ArrayList>
)
}
InvoiceArray.isFieldComponent = true;
export default InvoiceArray
/*
* @Author: Bill
* @Date: 2020-10-28 14:11:55
* @Description: 开票详情 drawer
*/
import React, { useEffect, useState } from 'react';
import { useIntl, getIntl } from 'umi'
import { Drawer, Input, DatePicker, message } from 'antd';
import InvoiceInfo from './InvoiceInfo';
import {
SchemaForm,
SchemaMarkupField as Field
} from '@formily/antd'
import InvoiceArray from './InvoiceArray';
import { Button, Table } from 'antd';
import { createFormActions, FormMegaLayout, FormSlot, createVirtualBox } from '@formily/antd';
import { InvoiceInfoProps, ProveListProps } from '../../common/type';
import { Moment } from 'moment';
import styles from './index.less';
import {
getSettleAccountsMemberSettlementGetInvoiceProveDetail,
getSettleAccountsMemberSettlementGetReturnInvoiceProveDetail,
postSettleAccountsMemberSettlementInvoiceByReturn,
postSettleAccountsMemberSettlementInvoiceProve
} from '@/services/SettleV2Api';
const formActions = createFormActions();
interface Iprops {
visible: boolean,
title: string,
width: number,
type: number, // 0 -> 开票, 1-> 查看
id: string, // 开票管理id,
/** 1-生产通知单,2-物流单,3-订单,4-积分订单,5-退货申请单 */
settlementOrderType: 1 | 2 | 3 | 4 | 5,
// payRoleId: number,
// payMemberId: number,
onCancel: () => void,
refresh: () => void
}
interface SubmitProps {
[key: string]: {
number: string,
remark: string,
invoiceDate: Moment
}[]
}
enum TypeEnum {
edit = 0,
view = 1
}
const columns = [
{ title: getIntl().formatMessage({ id: 'balance.components.invoiceCreate.invoiceDrawer.columns.number' }), dataIndex: 'number' },
{ title: getIntl().formatMessage({ id: 'balance.components.invoiceCreate.invoiceDrawer.columns.invoiceDate' }), dataIndex: 'invoiceDate' },
{ title: getIntl().formatMessage({ id: 'balance.components.invoiceCreate.invoiceDrawer.columns.remark' }), dataIndex: 'remark' },
]
const InvoiceComponent = createVirtualBox('InvoiceComponent', ({ infos }) => {
return (
<div >
<InvoiceInfo infos={infos} />
</div>
)
})
const TabelHeader = createVirtualBox('TabelHeader', ({ infos }) => {
return (
<div >
<div className={styles.formHeader}>
<div className={styles.invoiceNum}>{getIntl().formatMessage({ id: 'balance.components.invoiceCreate.invoiceDrawer.tabelHeader.text.1' })}<span style={{ color: "#ff4d4f" }}>*</span></div>
<div className={styles.invoiceDate}>{getIntl().formatMessage({ id: 'balance.components.invoiceCreate.invoiceDrawer.tabelHeader.text.2' })}<span style={{ color: "#ff4d4f" }}>*</span></div>
<div>{getIntl().formatMessage({ id: 'balance.components.invoiceCreate.invoiceDrawer.tabelHeader.text.3' })}</div>
</div>
</div>
)
})
const InvoiceDrawer: React.FC<Iprops> = (props) => {
const { visible, title, onCancel, width, type, id, settlementOrderType } = props;
const intl = useIntl();
const [invoiceInfo, setInvoiceInfo] = useState<any[]>([]);
const [submitLoading, setSubmitLoading] = useState<boolean>(false);
const isEdit = type === TypeEnum.edit;
const handleSubmit = () => {
// // 如果当前type==0为开票, 1为查看,那么直接关闭
if (type === TypeEnum.edit) {
formActions.submit()
} else {
// 查看类型的话,按确认直接关掉窗口
onCancel();
}
}
const handleForm = (value: SubmitProps) => {
console.log(value);
const keys = Object.keys(value);
if (keys.length === 0) {
message.error({
content: intl.formatMessage({ id: 'balance.components.invoiceCreate.invoiceDrawer.error' })
})
return;
}
let res = {}
keys.map((item) => {
const array = value[item];
res[item] = array.map((_row) => {
const { number, remark, invoiceDate } = _row;
return { number: number, remark: remark, invoiceDate: invoiceDate.format('YYYY-MM-DD') }
})
})
if (settlementOrderType === 5) {
console.log(value);
const postDataList = {
receiptInvoiceId: parseInt(id),
addList: invoiceInfo.map((_item, key) => {
const { kindName, typeName, ...rest } = _item;
return {
...rest,
kind: kindName == intl.formatMessage({ id: 'balance.components.invoiceCreate.invoiceDrawer.kindName' }) ? 1 : 2,
type: typeName == intl.formatMessage({ id: 'balance.components.invoiceCreate.invoiceDrawer.typeName' }) ? 1 : 2,
proveList: res[`list-${key}`]
}
})
}
console.log(postDataList);
postSettleAccountsMemberSettlementInvoiceByReturn(postDataList)
.then(({ code, data }) => {
if (code === 1000) {
setSubmitLoading(false)
props.refresh();
onCancel();
}
})
return;
}
const { kindName, typeName, ...rest } = invoiceInfo[0]
const postData = {
...rest,
proveList: res[`list-0`],
kind: kindName == intl.formatMessage({ id: 'balance.components.invoiceCreate.invoiceDrawer.kindName' }) ? 1 : 2,
type: typeName == intl.formatMessage({ id: 'balance.components.invoiceCreate.invoiceDrawer.typeName' }) ? 1 : 2,
receiptInvoiceId: parseInt(id)
}
setSubmitLoading(true)
console.log(postData);
// /settle/accounts/member/settlement/invoiceProve
postSettleAccountsMemberSettlementInvoiceProve(postData)
.then((data) => {
if (data.code === 1000) {
setSubmitLoading(false)
props.refresh();
onCancel();
}
})
}
useEffect(() => {
if (props.visible) {
console.log(settlementOrderType)
if (settlementOrderType === 5) {
getSettleAccountsMemberSettlementGetReturnInvoiceProveDetail({ id: id })
.then(({ code, data }) => {
if (code === 1000) {
setInvoiceInfo(data)
}
})
return;
}
getSettleAccountsMemberSettlementGetInvoiceProveDetail({ id: id })
.then((data) => {
if (data.code === 1000) {
setInvoiceInfo([data.data])
}
})
}
}, [id, visible, settlementOrderType])
// const tableList = invoiceInfo?.proveList?.map((item, key) => ({...item, id: key}));
const renderFooter = () => {
if (type === TypeEnum.view) {
return null
}
return (
<div style={{ textAlign: 'right' }}>
<Button onClick={onCancel} style={{ marginRight: 8 }}>
{intl.formatMessage({ id: 'balance.components.invoiceCreate.invoiceDrawer.renderFooter.button.1' })}
</Button>
<Button onClick={handleSubmit} type="primary">
{intl.formatMessage({ id: 'balance.components.invoiceCreate.invoiceDrawer.renderFooter.button.2' })}
</Button>
</div>
)
}
const renderOnly = () => {
return (
<SchemaForm onSubmit={handleForm} actions={formActions} components={{ InvoiceArray, Input, DatePicker }} >
{
invoiceInfo.map((item, unique) => {
const infos = item;
const tableList = item?.proveList?.map((item, key) => ({ ...item, id: key }));
return (
<div key={unique}>
<InvoiceComponent infos={infos} />
{
isEdit
? (
<>
<TabelHeader />
<Field
name={`list-${unique}`}
type="array"
x-component="InvoiceArray"
>
<Field type="object">
<Field name="number" x-component="Input" x-rules={[{ required: true, message: intl.formatMessage({ id: 'balance.components.invoiceCreate.invoiceDrawer.field.number' }) }]} />
<Field name="invoiceDate" x-component-props={{
getPopupContainer: (triggernode) => triggernode.parentElement
}} x-component="DatePicker" x-rules={[{ required: true, message: intl.formatMessage({ id: 'balance.components.invoiceCreate.invoiceDrawer.field.invoiceDate' }) }]} />
<Field name="remark" x-component="Input" x-component-props={{ style: { width: '240px' } }} />
</Field>
</Field>
</>
)
: (
<Table
columns={columns}
dataSource={tableList}
rowKey={record => record.id}
/>
)
}
</div>
)
})
}
</SchemaForm>
)
}
return (
<Drawer
getContainer={false}
destroyOnClose
visible={visible}
bodyStyle={{ overflow: 'auto' }}
title={title}
width={width}
onClose={onCancel}
footer={renderFooter()}
>
<div style={{ display: 'flex', flexDirection: 'column' }}>
{
renderOnly()
}
</div>
</Drawer>
)
}
export default InvoiceDrawer
/*
* @Author: Bill
* @Date: 2020-10-28 13:46:39
* @Description: 开票详情 内容
*/
import React from 'react';
import { getIntl } from 'umi'
import { Row, Col } from 'antd';
import { InvoiceInfoProps } from '../../common/type';
import styles from './index.less';
const intl = getIntl()
interface Iprops {
infos: InvoiceInfoProps
}
const infoList = [
{ title: intl.formatMessage({ id: 'balance.components.invoiceCreate.invoiceInfo.infoList.typeName' }), dataIndex: 'typeName' },
{ title: intl.formatMessage({ id: 'balance.components.invoiceCreate.invoiceInfo.infoList.kindName' }), dataIndex: 'kindName' },
{ title: intl.formatMessage({ id: 'balance.components.invoiceCreate.invoiceInfo.infoList.invoiceTitle' }), dataIndex: 'invoiceTitle' },
{ title: intl.formatMessage({ id: 'balance.components.invoiceCreate.invoiceInfo.infoList.taxNo' }), dataIndex: 'taxNo' },
{ title: intl.formatMessage({ id: 'balance.components.invoiceCreate.invoiceInfo.infoList.bankOfDeposit' }), dataIndex: 'bankOfDeposit' },
{ title: intl.formatMessage({ id: 'balance.components.invoiceCreate.invoiceInfo.infoList.account' }), dataIndex: 'account' },
{ title: intl.formatMessage({ id: 'balance.components.invoiceCreate.invoiceInfo.infoList.address' }), dataIndex: 'address' },
{ title: intl.formatMessage({ id: 'balance.components.invoiceCreate.invoiceInfo.infoList.tel' }), dataIndex: 'tel' }
]
const InvoiceInfo: React.FC<Iprops> = (props) => {
const { infos } = props;
return (
<>
{
infoList.map((item) => {
return (
<Row className={styles.row} key={item.dataIndex}>
<Col span={3} className={styles.label}>{item.title}</Col>
<Col span={16}>{infos && infos[item.dataIndex]}</Col>
</Row>
)
})
}
</>
)
}
export default InvoiceInfo
......@@ -27,23 +27,32 @@ const ArrayCustom = props => {
value={value}
minItems={schema.minItems}
maxItems={schema.maxItems}
editable={editable}
// editable={editable}
>
{xComponentProps?.header || null}
{toArr(value).map((item, index) => {
return (
<div className={styles.container} key={index}>
<SchemaField path={FormPath.parse(path).concat(index)} />
<div className={styles.remove} onClick={() => mutators.remove(index)}>
<MinusOutlined />
</div>
{
!xComponentProps.disabled && (
<div className={styles.remove} onClick={() => mutators.remove(index)}>
<MinusOutlined />
</div>
)
}
</div>
)
})}
<div className={styles.add} onClick={onAdd}>
<PlusOutlined size={12} />
<span className={styles.addText}>{intl.formatMessage({id: 'balance.tianjia'})}</span>
</div>
{
!xComponentProps.disabled && (
<div className={styles.add} onClick={onAdd}>
<PlusOutlined size={12} />
<span className={styles.addText}>{intl.formatMessage({id: 'balance.tianjia'})}</span>
</div>
)
}
</ArrayList>
)
......
......@@ -7,7 +7,7 @@
.header-item {
width: 128px;
margin-right: 20px;
margin-right: 18px;
}
}
......
......@@ -5,7 +5,7 @@ import {
SchemaMarkupField as Field
} from '@formily/antd'
import { Button, Drawer } from 'antd';
import React, { useEffect, useState } from 'react';
import React, { useEffect, useMemo, useState } from 'react';
import ArrayList from './arrayList';
import { Input, DatePicker } from '@formily/antd-components';
import styles from './invoiceDrawerInfo.less';
......@@ -32,6 +32,7 @@ type ProveListType = {
const InvoiceDrawerInfo: React.FC<Iprops> = (props: Iprops) => {
const { visible, onCancel, invoiceInfoData, onSubmit, mode } = props;
const [initialValue, setInitialValue] = useState<{ [key: string]: ProveListType }>({});
const disabled = useMemo(() => mode === 'view', [mode])
const handleCancel = () => {
onCancel?.()
......@@ -56,7 +57,7 @@ const InvoiceDrawerInfo: React.FC<Iprops> = (props: Iprops) => {
}
useEffect(() => {
if (mode === 'view' && invoiceInfoData) {
if (invoiceInfoData) {
const data = {};
invoiceInfoData?.forEach((_item, index) => {
const { proveList } = _item;
......@@ -66,10 +67,11 @@ const InvoiceDrawerInfo: React.FC<Iprops> = (props: Iprops) => {
}
}, [mode, invoiceInfoData])
return (
<Drawer
visible={visible}
width={800}
width={820}
title={intl.formatMessage({ id: 'balance.kaijufapiao' })}
onClose={handleCancel}
footer={renderFooter()}
......@@ -79,7 +81,7 @@ const InvoiceDrawerInfo: React.FC<Iprops> = (props: Iprops) => {
onSubmit={handleSubmit}
components={{ ArrayCustom: ArrayList, Input: Input, DatePicker, InvoiceInfo }}
actions={formActions}
editable={mode === 'edit'}
// editable={mode === 'edit'}
>
{
invoiceInfoData?.map((_item, key) => {
......@@ -114,7 +116,8 @@ const InvoiceDrawerInfo: React.FC<Iprops> = (props: Iprops) => {
</div>
<div className={styles['header-item']}>{intl.formatMessage({ id: 'balance.beizhu' })}</div>
</div>
)
),
disabled: disabled,
}}
>
<Field type="object">
......@@ -125,7 +128,8 @@ const InvoiceDrawerInfo: React.FC<Iprops> = (props: Iprops) => {
x-component-props={{
style: {
width: '128px'
}
},
disabled: disabled
}}
x-rules={
[
......@@ -136,6 +140,9 @@ const InvoiceDrawerInfo: React.FC<Iprops> = (props: Iprops) => {
<Field
name="invoiceDate"
x-component="DatePicker"
x-component-props={{
disabled: disabled
}}
x-rules={
[
{ required: true, message: intl.formatMessage({ id: 'balance.qingtianxiekaipiaoriqi' }) }
......@@ -148,7 +155,8 @@ const InvoiceDrawerInfo: React.FC<Iprops> = (props: Iprops) => {
x-component-props={{
style: {
width: '128px'
}
},
disabled: disabled,
}}
x-rules={
[
......@@ -162,7 +170,8 @@ const InvoiceDrawerInfo: React.FC<Iprops> = (props: Iprops) => {
x-component-props={{
style: {
width: '268px'
}
},
disabled: disabled
}}
/>
</FormMegaLayout>
......
......@@ -44,37 +44,37 @@ const FormilyCoupon: React.FC<Iprops> & { isFieldComponent: boolean } = (props:
const columns: ColumnType<any>[] = [
{
title: intl.formatMessage({ id: 'activityPages.id' }),
title: intl.formatMessage({ id: 'activityPage.id' }),
dataIndex: 'id'
},
{
title: intl.formatMessage({ id: 'activityPages.CouponName' }),
title: intl.formatMessage({ id: 'activityPage.CouponName' }),
dataIndex: 'name'
},
{
title: intl.formatMessage({ id: 'activityPages.couponTypeName' }),
title: intl.formatMessage({ id: 'activityPage.couponTypeName' }),
dataIndex: 'typeName'
},
{
title: intl.formatMessage({ id: 'activityPages.getWayName' }),
title: intl.formatMessage({ id: 'activityPage.getWayName' }),
dataIndex: 'getWayName'
},
{
title: intl.formatMessage({ id: 'activityPages.denomination' }),
title: intl.formatMessage({ id: 'activityPage.denomination' }),
dataIndex: 'denomination'
},
{
title: intl.formatMessage({ id: 'activityPages.useConditionMoney' }),
title: intl.formatMessage({ id: 'activityPage.useConditionMoney' }),
dataIndex: 'useConditionMoney'
},
{
title: intl.formatMessage({ id: 'activityPages.time' }),
title: intl.formatMessage({ id: 'activityPage.time' }),
dataIndex: 'validityTime',
render: (_text, _record) => {
return (
<div>
<span>{_record?.releaseTimeStart && moment(_record?.releaseTimeStar).format(format)}</span>
{intl.formatMessage({ id: 'activityPages.to' })}
{intl.formatMessage({ id: 'activityPage.to' })}
<span>{_record?.releaseTimeEnd && moment(_record?.releaseTimeEnd).format(format)}</span>
</div>
);
......@@ -118,7 +118,7 @@ const FormilyCoupon: React.FC<Iprops> & { isFieldComponent: boolean } = (props:
<div className={styles.container}>
<div className={styles.content}>
<div className={styles.module}>
<Button onClick={() => setDrawerVisible(true)}>{intl.formatMessage({ id: 'activityPages.chooseCoupon' })}</Button>
<Button onClick={() => setDrawerVisible(true)}>{intl.formatMessage({ id: 'activityPage.chooseCoupon' })}</Button>
</div>
<div className={styles.info}>
{
......
......@@ -106,12 +106,13 @@ const CommodityItem: React.FC<Iprops> = (props: Iprops) => {
onClick, onDrag, onDragEnd, onDragEnter, onDragStart, onMouseOver,
};
const { productName: name, productImgUrl: image, mode = "horizontal", price: originalPrice, discount, activityPrice, ...otherRestProps } = rest as any;
const { productName: name, productImgUrl: image, mode = "horizontal", price: originalPrice, discount, activityPrice, label, ...otherRestProps } = rest as any;
const withLabel = label ? {label: [label]} : {};
const horizontalData = {
name,
image,
mode,
tags: [intl.formatMessage({ id: 'activityPage.fill300remove20' })],
...withLabel,
originalPrice: originalPrice,
discountPrice: discount || activityPrice
};
......@@ -122,7 +123,7 @@ const CommodityItem: React.FC<Iprops> = (props: Iprops) => {
mode,
discountPrice: discount || activityPrice,
buyBtn: false,
tags: [intl.formatMessage({ id: 'activityPage.fill300remove20' })],
...withLabel,
sold: 0
};
......
......@@ -57,7 +57,7 @@ const schema: ISchema = {
},
},
},
'[startTime2, endTime2]': {
'[effectiveTimeStart, effectiveTimeEnd]': {
type: 'object',
'x-component': 'RangePicker',
'x-component-props': {
......
......@@ -51,7 +51,7 @@ export const querySchema: ISchema = {
type: 'string',
'x-component': 'RangePicker',
'x-component-props': {
placeholder: [intl.formatMessage({ id: 'merchantCoupon.giveCouponStartTime' }) + ',' + intl.formatMessage({ id: 'merchantCoupon.giveCouponEndTime' })],
placeholder: [intl.formatMessage({ id: 'merchantCoupon.giveCouponStartTime' }), intl.formatMessage({ id: 'merchantCoupon.giveCouponEndTime' })],
allowEmpty: [true, true],
},
},
......
......@@ -350,7 +350,7 @@ const createSchema = (relatedType: RelatedType, billType: number, orderType: num
'x-component-props': {
ellipsis: true,
style: {
width: 400,
width: 90,
},
},
},
......
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