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

Merge branch 'dev-srm' of http://10.0.0.22:3000/lingxi/lingxi-business-paltform into dev-srm

parents f84badea 3cde9dd2
/**
* @description: 交易能力 确认询价报价
* @param {type}
* @return {type}
*/
export default [
{
path:'/memberCenter/tranactionAbility/confirmOffer',
name: '确认询价报价',
routes: [
{
/** 报价单查询 */
path: '/memberCenter/tranactionAbility/confirmOffer/offerSearch',
name: '报价单查询',
component: '@/pages/transaction/dealAbility/confirmOffer/offerSearch',
},
{
/** 待提交审核报价单 */
path: '/memberCenter/tranactionAbility/confirmOffer/waitSubmitAuditOffer',
name: '待提交审核报价单',
component: '@/pages/transaction/dealAbility/confirmOffer/waitSubmitAuditOffer',
},
{
/** 待审核询价单(一级) */
path: '/memberCenter/tranactionAbility/confirmOffer/waitAuditInquiryOne',
name: '待审核询价单(一级)',
component: '@/pages/transaction/dealAbility/confirmOffer/waitAuditInquiryOne',
},
{
/** 待审核询价单(二级) */
path: '/memberCenter/tranactionAbility/confirmOffer/waitAuditInquiryTwo',
name: '待审核询价单(二级)',
component: '@/pages/transaction/dealAbility/confirmOffer/waitAuditInquiryTwo',
},
{
/** 待提交报价单 */
path: '/memberCenter/tranactionAbility/confirmOffer/waitSubmitOffer',
name: '待提交报价单',
component: '@/pages/transaction/dealAbility/confirmOffer/waitSubmitOffer',
},
]
}
]
import productInquiry from './productInquiry';
import inquiryOffer from './inquiryOffer';
import confirmOffer from './confirmOffer';
const TranactionRoute = {
path: '/memberCenter/tranactionAbility',
name: '交易能力',
icon: 'transcation',
routes: [
/** 商品询价 */
...productInquiry,
/** 询价报价 */
...inquiryOffer,
/** 确认询价报价 */
...confirmOffer,
]
}
export default TranactionRoute;
/**
* @description: 交易能力 询价报价
* @param {type}
* @return {type}
*/
export default [
{
path:'/memberCenter/tranactionAbility/inquiryOffer',
name: '询价报价',
routes: [
{
/** 询价单查询 */
path: '/memberCenter/tranactionAbility/inquiryOffer/inquirySearch',
name: '询价单查询',
component: '@/pages/transaction/dealAbility/inquiryOffer/inquirySearch',
},
{
/** 报价单查询 */
path: '/memberCenter/tranactionAbility/inquiryOffer/offerSearch',
name: '报价单查询',
component: '@/pages/transaction/dealAbility/inquiryOffer/offerSearch',
},
{
/** 待新增报价单 */
path: '/memberCenter/tranactionAbility/inquiryOffer/waitAddOffer',
name: '待新增报价单',
component: '@/pages/transaction/dealAbility/inquiryOffer/waitAddOffer',
},
{
/** 待审核报价单(一级) */
path: '/memberCenter/tranactionAbility/inquiryOffer/waitAuditOfferOne',
name: '待审核报价单(一级)',
component: '@/pages/transaction/dealAbility/inquiryOffer/waitAuditOfferOne',
},
{
/** 待审核报价单(二级) */
path: '/memberCenter/tranactionAbility/inquiryOffer/waitAuditOfferTwo',
name: '待审核报价单(二级)',
component: '@/pages/transaction/dealAbility/inquiryOffer/waitAuditOfferTwo',
},
{
/** 待提交报价单 */
path: '/memberCenter/tranactionAbility/inquiryOffer/waitSubmitOffer',
name: '待提交报价单',
component: '@/pages/transaction/dealAbility/inquiryOffer/waitSubmitOffer',
},
]
}
]
/**
* @description: 交易能力 商品询价
* @param {type}
* @return {type}
*/
export default [
{
path:'/memberCenter/tranactionAbility/productInquiry',
name: '商品询价',
routes: [
{
/** 询价单查询 */
path: '/memberCenter/tranactionAbility/productInquiry/inquirySearch',
name: '询价单查询',
component: '@/pages/transaction/dealAbility/productInquiry/inquirySearch',
},
{
/** 询价单查询 查看详情 */
path: '/memberCenter/tranactionAbility/productInquiry/inquirySearch/preview',
name: '询价单查询详情',
component: '@/pages/transaction/dealAbility/productInquiry/detail',
hideInMenu: true,
noMargin: true,
},
{
/** 待新增询价单 */
path: '/memberCenter/tranactionAbility/productInquiry/waitAddInquiry',
name: '待新增询价单',
component: '@/pages/transaction/dealAbility/productInquiry/waitAddInquiry',
},
{
/** 待新增询价单 查看详情 */
path: '/memberCenter/tranactionAbility/productInquiry/waitAddInquiry/preview',
name: '待新增询价单详情',
component: '@/pages/transaction/dealAbility/productInquiry/detail',
hideInMenu: true,
noMargin: true,
},
// 立即询价 - 从商城跳转而来;
{
path: '/memberCenter/tranactionAbility/productInquiry/waitAddInquiry/rfq',
name: '立即询价',
hideInMenu: true,
component: '@/pages/transaction/dealAbility/productInquiry/waitAddInquiry/rfq'
},
// 新建询价单
{
path: '/memberCenter/tranactionAbility/productInquiry/waitAddInquiry/add',
name: '新建询价单',
hideInMenu: true,
component: '@/pages/transaction/dealAbility/productInquiry/waitAddInquiry/add'
},
// 编辑询价单
{
path: '/memberCenter/tranactionAbility/productInquiry/waitAddInquiry/edit',
name: '编辑询价单',
hideInMenu: true,
component: '@/pages/transaction/dealAbility/productInquiry/waitAddInquiry/edit'
},
{
/** 待审核询价单(一级) */
path: '/memberCenter/tranactionAbility/productInquiry/waitAuditInquiryOne',
name: '待审核询价单(一级)',
component: '@/pages/transaction/dealAbility/productInquiry/waitAuditInquiryOne',
},
{
/** 待审核询价单(一级) 查看详情 */
path: '/memberCenter/tranactionAbility/productInquiry/waitAuditInquiryOne/preview',
name: '待审核询价单(一级)详情',
component: '@/pages/transaction/dealAbility/productInquiry/detail',
hideInMenu: true,
noMargin: true,
},
{
/** 待审核询价单(一级) 查看详情 */
path: '/memberCenter/tranactionAbility/productInquiry/waitAuditInquiryOne/detail',
name: '待审核询价单(一级)详情',
component: '@/pages/transaction/dealAbility/productInquiry/detail',
hideInMenu: true,
noMargin: true,
},
{
/** 待审核询价单(二级) */
path: '/memberCenter/tranactionAbility/productInquiry/waitAuditInquiryTwo',
name: '待审核询价单(二级)',
component: '@/pages/transaction/dealAbility/productInquiry/waitAuditInquiryTwo',
},
{
/** 待审核询价单(二级) 查看详情 */
path: '/memberCenter/tranactionAbility/productInquiry/waitAuditInquiryTwo/preview',
name: '待审核询价单(二级)详情',
component: '@/pages/transaction/dealAbility/productInquiry/detail',
hideInMenu: true,
noMargin: true,
},
{
/** 待审核询价单(二级) 查看详情 */
path: '/memberCenter/tranactionAbility/productInquiry/waitAuditInquiryTwo/detail',
name: '待审核询价单(二级)详情',
component: '@/pages/transaction/dealAbility/productInquiry/detail',
hideInMenu: true,
noMargin: true,
},
{
/** 待提交询价单 */
path: '/memberCenter/tranactionAbility/productInquiry/waitSubmitInquiry',
name: '待提交询价单',
component: '@/pages/transaction/dealAbility/productInquiry/waitSubmitInquiry',
},
{
/** 待提交询价单 查看详情 */
path: '/memberCenter/tranactionAbility/productInquiry/waitSubmitInquiry/preview',
name: '待提交询价单详情',
component: '@/pages/transaction/dealAbility/productInquiry/detail',
hideInMenu: true,
noMargin: true,
},
]
}
]
......@@ -133,7 +133,7 @@ const normalizeFileList = fileList => {
...file,
uid: file.uid || `${index}`,
status: getState(file.response) || getState(file),
url: getURL(file) || getURL(file?.response),
url: getURL(file) || getURL(file?.response)|| getURL(file?.response?.data),
thumbUrl: getImageByUrl(
getThumbURL(file) || getThumbURL(file?.response),
{
......
......@@ -121,11 +121,13 @@ const QueryList = () => {
dataIndex: 'state',
align: 'left',
render: (text, record) => {
console.log(record.outerStatus)
return (
<div>
{
record.outerStatus != 7 || record.outerStatus != 9 ? <span style={{ color: '#00B37A', marginRight: 20, cursor: 'pointer', }} onClick={() => invalid(record.id)}>作废</span> : <span> </span>
record.outerStatus != 7 && record.outerStatus != 9 && <span style={{ color: '#00B37A', marginRight: 20, cursor: 'pointer', }} onClick={() => invalid(record.id)}>作废</span>
}
{
record.outerStatus == 6 ? <span style={{ color: '#00B37A', marginRight: 20, cursor: 'pointer', }} onClick={() => like(record)}>合同变更</span> : <span> </span>
}
......
......@@ -697,7 +697,7 @@ const CommodityDetail = (props) => {
const sessionKey = `inquiry${selectCommodityId}${new Date().getTime()}`
updateOrderInfo(inquiryParam, sessionKey).then(() => {
window.location.href = `/memberCenter/tranactionAbility/goodsOffer/addEnquiryOrder/rfq?id=${id}&memberId=${memberId}&spam_id=${sessionKey}&commodityId=${id}`
window.location.href = `/memberCenter/tranactionAbility/productInquiry/waitAddInquiry/rfq?id=${id}&memberId=${memberId}&spam_id=${sessionKey}&commodityId=${id}`
})
}
......
/*
* @Author: XieZhiXiong
* @Date: 2021-06-15 13:38:56
* @LastEditors: XieZhiXiong
* @LastEditTime: 2021-06-15 14:10:11
* @Description: 联动逻辑
*/
import { FormEffectHooks, FormPath } from '@formily/antd';
const {
onFieldInputChange$,
} = FormEffectHooks;
export const useBusinessEffects = (context, actions, fieldName: string) => {
const {
setFieldState,
} = actions;
// 如果勾选了长期有效,则清空 到期日
onFieldInputChange$(`${fieldName}.*.permanent`).subscribe(fieldState => {
const { name, value } = fieldState;
if (value && value.length) {
setFieldState(
FormPath.transform(name, /\d/, $1 => {
return `${fieldName}.${$1}.expireDay`
}),
state => {
state.value = '';
}
);
}
});
// 如果选择了到期日,则清空 有效期
onFieldInputChange$(`${fieldName}.*.expireDay`).subscribe(fieldState => {
const { name, value } = fieldState;
if (value && value.length) {
setFieldState(
FormPath.transform(name, /\d/, $1 => {
return `${fieldName}.${$1}.permanent`
}),
state => {
state.value = [];
}
);
}
});
}
\ No newline at end of file
......@@ -14,4 +14,9 @@
&:hover {
background-color: @descriptions-bg;
}
}
.del-btn {
position: relative;
top: -10px;
}
\ No newline at end of file
......@@ -2,12 +2,12 @@
* @Author: XieZhiXiong
* @Date: 2021-06-01 16:13:35
* @LastEditors: XieZhiXiong
* @LastEditTime: 2021-06-07 16:18:24
* @LastEditTime: 2021-06-15 11:53:20
* @Description: 资质证明上传组件
*/
import React from 'react';
import { Row, Col, Button } from 'antd';
import { PlusOutlined } from '@ant-design/icons';
import { PlusOutlined, CloseCircleOutlined } from '@ant-design/icons';
import { ArrayList } from '@formily/react-shared-components';
import { Schema, SchemaField } from '@formily/antd';
import { toArr, FormPath } from '@formily/shared';
......@@ -16,6 +16,12 @@ import {
} from '@/constants';
import styles from './index.less';
const expireDayTitle = (
<span style={{ marginTop: 40 }}>
到期日
</span>
);
const schema = new Schema({
type: 'object',
properties: {
......@@ -39,6 +45,12 @@ const schema = new Schema({
},
accept: '.doc, .docx, .xls, .xlsx, .pot, .pps, .vsd, .wps, .dps, .pdf, .txt, .png, .jpg, .rar, .zip',
},
'x-rules': [
{
required: true,
message: '请上传资质证明',
},
],
},
MEGA_LAYOUT2: {
type: 'object',
......@@ -46,8 +58,13 @@ const schema = new Schema({
properties: {
expireDay: {
type: 'string',
title: '到期日',
title: expireDayTitle,
'x-component': 'DatePicker',
'x-component-props': {
style: {
marginTop: 20,
},
},
},
permanent: {
type: 'string',
......@@ -75,7 +92,8 @@ const QualitiesUploadFormItem = (props) => {
} = props;
const { colSpan } = (props.props['x-component-props'] || {});
const onAdd = () => mutators.push(schema.getEmptyValue())
const onAdd = () => mutators.push(schema.getEmptyValue());
const onRemove = index => mutators.remove(index);
const span = colSpan ? {
span: colSpan,
......@@ -89,16 +107,28 @@ const QualitiesUploadFormItem = (props) => {
<ArrayList value={value}>
<Row
gutter={{ sm: 44, md: 88, lg: 88 }}
style={{
width: '100%',
}}
>
{toArr(value).map((item, index) => (
<Col key={index} {...span}>
<SchemaField
path={FormPath.parse(path).concat(index)}
schema={schema}
/>
<Row
gutter={50}
align="middle"
>
<Col flex={1}>
<SchemaField
path={FormPath.parse(path).concat(index)}
schema={schema}
/>
</Col>
<Col>
<Button
onClick={() => onRemove(index)}
type="link"
icon={<CloseCircleOutlined style={{ fontSize: 20 }} />}
className={styles['del-btn']}
/>
</Col>
</Row>
</Col>
))}
{editable && (
......
......@@ -6,7 +6,7 @@ import {
} from 'antd';
import { usePageStatus } from '@/hooks/usePageStatus';
import { PublicApi } from '@/services/api';
import { GetMemberAbilitySubGetResponse } from '@/services/MemberApi';
import { GetMemberAbilitySubGetResponse } from '@/services/MemberV2Api';
import {
MEMBER_TYPE_CHANNEL_CORPORATE,
MEMBER_TYPE_CHANNEL_INDIVIDUAL,
......@@ -157,7 +157,7 @@ const ImportDetail: React.FC<{}> = () => {
title={item.groupName}
data={(
item.elements.map((ele) => ({
title: ele.fieldCNName,
title: ele.fieldLocalName,
value: (
ele.fieldType !== 'upload'
? ele.fieldValue
......
......@@ -97,7 +97,7 @@ const MemberBasicInfo: React.FC<MemberBasicInfoProps> = ({
title={item.groupName}
data={(
item.elements.map((ele) => ({
title: ele.fieldCNName,
title: ele.fieldLocalName,
value: (
ele.fieldType !== 'upload'
? ele.fieldValue
......
......@@ -2,7 +2,7 @@
* @Author: XieZhiXiong
* @Date: 2021-05-24 17:47:32
* @LastEditors: XieZhiXiong
* @LastEditTime: 2021-05-25 10:14:05
* @LastEditTime: 2021-06-15 10:54:53
* @Description: 审核Form抽屉
*/
import React from 'react';
......@@ -115,7 +115,7 @@ const VerifyComingInvestigateDrawer: React.FC<IProps> = (props: IProps) => {
return (
<Drawer
title="入库资料审核"
title="入库考察审核"
width={600}
onClose={handleClose}
visible={visible}
......
......@@ -2,7 +2,7 @@
* @Author: XieZhiXiong
* @Date: 2021-06-01 20:03:23
* @LastEditors: XieZhiXiong
* @LastEditTime: 2021-06-04 20:47:18
* @LastEditTime: 2021-06-15 13:54:42
* @Description: 补充资质证明抽屉
*/
import React from 'react';
......@@ -16,6 +16,7 @@ import {
import { DatePicker, Checkbox } from '@formily/antd-components'
import NiceForm from '@/components/NiceForm';
import { schema } from './schema';
import { useBusinessEffects } from '../../../components/QualitiesUploadFormItem/effects';
import QualitiesUpload from '../../../components/QualitiesUpload';
import QualitiesUploadFormItem from '../../../components/QualitiesUploadFormItem';
......@@ -123,8 +124,8 @@ const UploadQualificationsDrawer: React.FC<IProps> = (props: IProps) => {
QualitiesUpload,
QualitiesUploadFormItem,
}}
effects={() => {
effects={(context, actions) => {
useBusinessEffects(context, actions, 'qualities');
}}
actions={formActions}
schema={schema}
......
......@@ -2,7 +2,7 @@
* @Author: XieZhiXiong
* @Date: 2021-05-24 17:47:32
* @LastEditors: XieZhiXiong
* @LastEditTime: 2021-06-09 10:54:28
* @LastEditTime: 2021-06-15 11:16:16
* @Description: 审核Form抽屉
*/
import React, { useEffect } from 'react';
......@@ -180,6 +180,21 @@ const VerifyComingDataDrawer: React.FC<IProps> = (props: IProps) => {
FormPath.setIn(state, 'props.enum', channelType);
});
}, [channelInfo]);
useEffect(() => {
if (!channelValue) {
return;
}
let {
channelLevel,
} = channelValue;
if (!channelLevel) {
formActions.setFieldState('INVESTIGATE_INFO', state => {
FormPath.setIn(state, 'visible', false);
});
}
}, [channelValue]);
const handleClose = () => {
if (onClose) {
......
......@@ -22,6 +22,7 @@ import NiceForm from '@/components/NiceForm';
import MellowCard from '@/components/MellowCard';
import { PublicApi } from '@/services/api';
import schema, { GroupItem } from './schema';
import { useBusinessEffects } from '../../components/QualitiesUploadFormItem/effects';
import ComingAgreement from './components/ComingAgreement';
import RegisterInfo from './components/RegisterInfo';
import SubmitSuccess from './components/SubmitSuccess';
......@@ -337,7 +338,7 @@ const MemberQueryApplyMember: React.FC = () => {
RegisterInfo: <RegisterInfo upperMemberId={upperMemberId} upperRoleId={upperRoleId} />,
SubmitSuccess: <SubmitSuccess />,
}}
effects={($, { setFieldState }) => {
effects={($, actions) => {
onStepNext$().subscribe(() => {
stepRef.current += 1;
setCurrenStep(stepRef.current);
......@@ -354,6 +355,8 @@ const MemberQueryApplyMember: React.FC = () => {
setUnsaved(true);
}
});
useBusinessEffects($, actions, 'step4.qualities');
}}
schema={schema(depositInfo, validateId)}
/>
......
......@@ -2,7 +2,7 @@
* @Author: XieZhiXiong
* @Date: 2021-05-26 17:00:39
* @LastEditors: XieZhiXiong
* @LastEditTime: 2021-06-07 11:58:03
* @LastEditTime: 2021-06-15 14:05:18
* @Description:
*/
import { ISchema } from '@formily/antd';
......
......@@ -121,12 +121,6 @@ const MemberQuery: React.FC<{}> = () => {
</Button>
)
}
<Button
type="link"
onClick={() => handleJumpModify(record)}
>
变更
</Button>
{/* 商户会员、渠道会员 且外部审核状态为不通过才可以 再次申请 */}
{
record.showUpdate && (
......
import React from 'react';
export interface CardType {
id?: string,
title?: string,
extra?: React.ReactNode,
backgroundColor?: string,
}
const Card: React.FC<CardType> = (props: any) => {
const { id, title, extra, children, backgroundColor } = props;
return (
<div id={id} className='ant-card ant-card-bordered' style={{ overflow: 'hidden' }}>
<div className='ant-card-head' style={{ padding: 0, backgroundColor: backgroundColor ? backgroundColor : 'transparent' }}>
<div className='ant-card-head-wrapper' style={{ padding: '12px 16px' }}>
<div className='ant-card-head-wrapper' style={{ color: backgroundColor ? '#FFF' : '#303133' }}>
{title}
</div>
{extra &&
<div className='ant-card-extra'>
{extra}
</div>
}
</div>
</div>
<div className='ant-card-body'>
{children}
</div>
</div>
)
}
export default Card;
.cell {
display: flex;
h5 { margin-bottom: 2em; }
.label {
flex: 0 0 25%;
color: #909399;
}
.content {
flex: 0 0 70%;
}
}
/** 详情通用 - 基本信息 */
import React from 'react';
import { Row, Col } from 'antd';
import Card from '../../../card';
import style from './index.less';
export interface BasicInfoProps {
effect?: any,
}
const count = 0;
const BasicLayout: React.FC<BasicInfoProps> = (props: any) => {
const { effect } = props;
return (
<Card
id='basicLayout'
title='基本信息'
>
<Row gutter={[8, 8]}>
{effect.length > count && effect.map((item, index) => (
<Col key={`effect_${index + 1}`} span={8}>
{ item.col.map((it, idx) => (
<div className={style.cell} key={`effect_col_${idx + 1}`}>
<h5 className={style.label}>{it.label}: </h5>
<h5 className={style.content}>{it.extra}</h5>
</div>
))}
</Col>
))}
</Row>
</Card>
)
}
export default BasicLayout
import { createContext } from 'react';
/** 详情 */
export const Context = createContext<any>({})
/**招标详情 Context */
export const BidDetailContext = createContext<any>({})
/**采购竞价单详情 Context */
export const PurchaseBidContext = createContext<any>({})
.cell {
display: flex;
h5 { margin-bottom: 2em; }
.label {
flex: 0 0 25%;
color: #909399;
}
}
/** 详情通用 - 基本信息 */
import React from 'react';
import { Row, Col } from 'antd';
import Card from '../../../card';
import style from './index.less';
export interface GeneraInfoProps {
/** 数据 */
effect?: any,
/** 锚点 */
anchor?: string,
/** 标题 */
title: string,
}
const count = 0;
const GeneralLayout: React.FC<GeneraInfoProps> = (props: any) => {
const { effect, anchor, title } = props;
return (
<Card
id={anchor}
title={title}
>
<Row gutter={[8, 8]}>
{effect.length > count && effect.map((item, index) => (
<Col key={`effect_${index + 1}`} span={8}>
{ item.col.map((it, idx) => (
<div className={style.cell} key={`effect_col_${idx + 1}`}>
<h5 className={style.label}>{it.label}: </h5>
<h5 className={style.content}>{it.extra}</h5>
</div>
))}
</Col>
))}
</Row>
</Card>
)
}
export default GeneralLayout
import React, { useRef } from 'react';
import { } from 'antd';
import { StandardTable } from 'god';
import { ColumnType } from 'antd/lib/table/interface';
import Card from '../../../card';
export interface ListLayoutIProps {
/** 锚点 */
anchor?: string,
/** id */
id: string | number,
/** 标题 */
title: string,
/** columns */
columns: ColumnType<any>[],
/** 接口 */
fetch?: () => Promise<unknown>,
}
const ListLayout: React.FC<ListLayoutIProps> = (props: any) => {
const { anchor, id, title, columns, fetch } = props;
const currentRef = useRef({});
const fetchTableData = (params: any) => {
return new Promise(resolve => {
fetch({ id, ...params }).then((res: any) => {
resolve(res.data)
})
})
}
return (
<Card
id={anchor}
title={title}
>
<StandardTable
currentRef={currentRef}
columns={columns}
tableProps={{ rowKey: 'id' }}
fetchTableData={(params: any) => fetchTableData(params)}
/>
</Card>
)
}
export default ListLayout
/** 详情通用 - 流转进度 */
import React, { useContext, useState } from 'react';
import { Radio, Steps } from 'antd';
import { Context } from '../context';
import Card from '../../../card';
import style from './index.less';
const LOGSTATESTYPE = {
/** 外部流转 */
EXTERNALSTATES: 1,
/** 内部流转 */
INTERIORSTATES: 2,
/** 竞价结果内部流转 */
EXMAINEINERIORSTATES: 3
}
export interface ProgressProps {
/** 选中哪个radio */
logstate?: number,
}
const ProgressLayout: React.FC<ProgressProps> = (props: any) => {
const { logstate } = props;
const context = useContext(Context);
const [logStatesStatus, setLogStatesStatus] = useState<number>( logstate || LOGSTATESTYPE.EXTERNALSTATES);
return (
<Card
id='progressLayout'
title='流转进度'
extra={
<Radio.Group
onChange={(e) => setLogStatesStatus(e.target.value)}
defaultValue={logStatesStatus}
>
{context.externalLogStates && <Radio.Button value={LOGSTATESTYPE.EXTERNALSTATES}>外部流转</Radio.Button>}
{context.interiorLogStates && <Radio.Button value={LOGSTATESTYPE.INTERIORSTATES}>内部流转</Radio.Button>}
{context.examineInteriorLogStates && <Radio.Button value={LOGSTATESTYPE.EXMAINEINERIORSTATES}>竞价结果内部流转</Radio.Button>}
</Radio.Group>
}
>
<Steps
progressDot
>
{logStatesStatus === LOGSTATESTYPE.EXTERNALSTATES ?
context.externalLogStates && context.externalLogStates.map(item => (
<Steps.Step
key={item.state}
title={item.operationalProcess}
description={item.roleName}
status={item.isExecute ? 'finish' : 'wait'}
/>
)) : (logStatesStatus === LOGSTATESTYPE.INTERIORSTATES ?
context.interiorLogStates && context.interiorLogStates.map(item => (
<Steps.Step
key={item.state}
title={item.operationalProcess}
description={item.roleName}
status={item.isExecute ? 'finish' : 'wait'}
/>
)) :
context.examineInteriorLogStates && context.examineInteriorLogStates.map(item => (
<Steps.Step
key={item.state}
title={item.operationalProcess}
description={item.roleName}
status={item.isExecute ? 'finish' : 'wait'}
/>
))
)
}
</Steps>
</Card>
)
}
export default ProgressLayout
import React from 'react';
import { ColumnType } from 'antd/lib/table/interface';
import { Typography, Tag } from 'antd';
import moment from 'moment';
import {
EXTERNALSTATE_COLOR,
INTERNALSTATE_COLOR,
} from '@/pages/transaction/components/stateColor';
const format = (text) => {
return <>{moment(text).format("YYYY-MM-DD HH:mm")}</>
}
const { Text } = Typography;
/** 外部流转记录 */
export const EXTERNALLOGS: ColumnType<any>[] = [
{
title: '流转顺序号',
key: 'index',
dataIndex: 'index',
render: (_text: any, _record: any, index: number) => <Text>{index + 1}</Text>
},
{
title: '操作角色',
key: 'roleName',
dataIndex: 'roleName',
},
{
title: '状态',
key: 'state',
dataIndex: 'state',
render: (_text: any, _record: any) => <Tag color={EXTERNALSTATE_COLOR[_text] || 'default'}>{_record.stateName}</Tag>
},
{
title: '操作',
key: 'operation',
dataIndex: 'operation',
},
{
title: '操作时间',
key: 'createTime',
dataIndex: 'createTime',
render: (_text: any, _record: any) => <Text>{format(_text)}</Text>
},
{
title: '审核意见',
key: 'auditOpinion',
dataIndex: 'auditOpinion',
},
]
/** 内部流转记录 */
export const INTERNALLOGS: ColumnType<any>[] = [
{
title: '流转顺序号',
key: 'index',
dataIndex: 'index',
render: (_text: any, _record: any, index: number) => <Text>{index + 1}</Text>
},
{
title: '操作人',
key: 'roleName',
dataIndex: 'roleName',
},
{
title: '部门',
key: 'department',
dataIndex: 'department',
},
{
title: '职位',
key: 'position',
dataIndex: 'position',
},
{
title: '状态',
key: 'state',
dataIndex: 'state',
render: (_text: any, _record: any) => <Tag color={INTERNALSTATE_COLOR[_text] || 'default'}>{_record.stateName}</Tag>
},
{
title: '操作',
key: 'operation',
dataIndex: 'operation',
},
{
title: '操作时间',
key: 'createTime',
dataIndex: 'createTime',
render: (_text: any, _record: any) => <Text>{format(_text)}</Text>
},
{
title: '审核意见',
key: 'auditOpinion',
dataIndex: 'auditOpinion',
},
]
/** 详情通用 - 流转进度 */
import React, { useContext, useState } from 'react';
import { Radio, Table } from 'antd';
import { Context } from '../context';
import Card from '../../../card';
import {
EXTERNALLOGS,
INTERNALLOGS,
} from './columns';
const LOGSTATESTYPE = {
/** 外部流转 */
EXTERNALSTATES: 1,
/** 内部流转 */
INTERIORSTATES: 2
}
export interface ProgressProps {
/** 选中哪个radio */
logstate?: number,
}
const RecordLayout: React.FC<ProgressProps> = (props: any) => {
const { logstate } = props;
const context = useContext(Context);
const [logStatus, setLogStatus] = useState<number>(logstate || LOGSTATESTYPE.EXTERNALSTATES);
return (
<Card
id='recordLyout'
title='流转进度'
extra={
<Radio.Group
onChange={(e) => setLogStatus(e.target.value)}
defaultValue={logStatus}
>
{context.externalLogs && <Radio.Button value={LOGSTATESTYPE.EXTERNALSTATES}>外部流转</Radio.Button>}
{context.interiorLogs && <Radio.Button value={LOGSTATESTYPE.INTERIORSTATES}>内部流转</Radio.Button>}
</Radio.Group>
}
>
<Table
columns={logStatus === LOGSTATESTYPE.EXTERNALSTATES ? EXTERNALLOGS : INTERNALLOGS}
dataSource={
logStatus === LOGSTATESTYPE.EXTERNALSTATES ?
context.externalLogs :
context.interiorLogs
}
rowKey={(record) => record.id}
pagination={{
hideOnSinglePage: true
}}
/>
</Card>
)
}
export default RecordLayout
.wrap {
.title {
display: flex;
align-items: center;
justify-content: space-between;
padding: 8px 16px;
.titleBox {
display: flex;
align-items: center;
.goBack {
font-size: 14px;
color: #909399;
}
.titleContext {
color: #303133;
font-size: 16px;
font-weight: 500;
margin-left: 8px;
}
}
}
.anchor {
display: flex;
padding: 0 16px;
}
.layout {
margin: 24px;
:global {
.ant-card {
margin-bottom: 24px;
.ant-card-head {
> .ant-card-head-wrapper {
padding: 12px 0;
}
}
.ant-card-extra {
padding: 0 0;
.ant-radio-button-wrapper {
height: 24px;
line-height: 23px;
}
.ant-radio-button-wrapper:hover {
color: #606266;
}
.ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled) {
color: #fff;
background: #6B778C;
border-color: #6B778C;
}
}
}
.god-table-control {
margin-bottom: 0;
}
}
}
:global {
.ant-anchor {
display: flex;
.ant-anchor-ink {
display: none;
}
.ant-anchor-link {
padding: 14px 0 !important;
margin: 0 16px;
.ant-anchor-link-title {
font-size: 14px;
color: #909399;
}
}
.ant-anchor-link-active {
position: relative;
border-bottom: 2px solid #00B37A;
box-sizing: border-box;
.ant-anchor-link-title {
font-weight: 500;
color: #303133;
}
}
}
}
}
import React, { useEffect, useState, useContext } from 'react';
import { Anchor } from 'antd';
import { Context } from './components/context';
import style from './index.less';
import { ArrowLeftOutlined } from '@ant-design/icons';
import {history} from 'umi';
const activeAnchorClassName = 'ant-anchor-link-active'
export type tabLink = {
id: string,
title: string
}
export interface IProps {
/** 单号 */
no?: string,
/** 详情描述 */
detail?: string,
/** 锚点Link */
tabLink?: Array<tabLink>,
/** 审核操作按钮放这 */
effect?: React.ReactNode,
/** 页面的组件 */
components?: React.ReactNode,
}
const PeripheralLayout: React.FC<IProps> = (props: any) => {
const {
no,
detail,
tabLink,
effect,
components,
} = props;
const dataSource = useContext(Context)
/** the argument */
const [targetOffset, setTargetOffset] = useState<number | undefined>(undefined);
const [currLink, setCurrLink] = useState(activeAnchorClassName)
/** the event */
const onChange = (link) => {
if (link && currLink) {
setCurrLink('')
} else if (!link && !currLink) {
setCurrLink(activeAnchorClassName)
}
}
const onClick = (e) => {
e.preventDefault();
}
useEffect(() => {
setTargetOffset(window.innerHeight / 6);
}, [])
return (
<div className={style.wrap}>
<Anchor
targetOffset={targetOffset}
onChange={onChange}
onClick={onClick}
>
{/* 头部信息 */}
<div style={{ flex: 1 }}>
<div className={style.title}>
<div className={style.titleBox}>
<ArrowLeftOutlined className={style.goBack} onClick={() => history.goBack()} />
<span className={style.titleContext}>
{detail ? detail : dataSource.details}
&nbsp;|&nbsp;
{no}
</span>
</div>
{effect}
</div>
<div className={style.anchor}>
{tabLink.map((item, index) => (
<Anchor.Link
className={!index && currLink}
key={`link${index + 1}`}
href={`#${item.id}`}
title={item.title}
/>
))}
</div>
</div>
</Anchor>
<div className={style.layout}>
{components}
</div>
</div>
)
}
export default PeripheralLayout
.upload_item {
padding: 5px 8px;
margin-bottom: 16px;
display: flex;
align-items: center;
justify-content: space-between;
background-color: #FAFBFC;
.upload_left {
display: flex;
align-items: center;
color: #303133;
:global {
.anticon-file-word {
color: #4279df;
font-size: 20px;
margin-right: 8px;
}
}
}
.upload_right {
color: #00B37A;
cursor: pointer;
:global {
.anticon-delete {
margin-left: 19px;
color: #C0C4CC;
}
}
}
}
import React, { useEffect, useState, useContext } from 'react';
import {
Modal,
Form,
Input,
Button,
Upload,
message
} from 'antd';
import { UploadOutlined, LinkOutlined, DeleteOutlined } from '@ant-design/icons';
import { UPLOAD_TYPE } from '@/constants'
import style from './index.less'
import { PublicApi } from '@/services/api';
import { BidDetailContext } from '../components/context';
import { isEmpty, sumBy } from 'lodash';
const { TextArea } = Input;
export interface IProps {
id: number,
turn: number,
visible: boolean,
handleConfirm: () => void,
onCancel: () => void,
}
const BidModal: React.FC<IProps> = (props: any) => {
const [form] = Form.useForm();
const { id, turn, visible, handleConfirm, onCancel } = props;
const [files, setFiles] = useState([]);
const [loading, setloading] = useState(false);
const [priceParityInfos, setPriceParityInfos] = useState<any>([]);
const dataSource = useContext(BidDetailContext);
/**判断文件类型和大小 */
const beforeDocUpload = (file: any) => {
const isLt20M = file.size / 1024 / 1024 < 20;
if (!isLt20M) {
message.error('上传文件大小不超过 20M!');
}
return isLt20M;
}
// 上传回调
const handleChange = ({ file }) => {
const arr: any = files;
setloading(true);
if (file.response) {
if (file.response.code === 1000) {
arr.push({
name: file.name,
url: file.response.data
})
setloading(false);
}
}
setFiles([...arr])
}
// 删除附件
const removeFiles = (index: any) => {
const arr = [...files];
arr.splice(index, 1);
setFiles(arr);
}
useEffect(() => {
if (dataSource.length > 0) {
const arr: any = dataSource[0].company || [];
const params: any = [];
arr.forEach((it: any, idx: number) => {
let item = {
awardCount: it.awardCount,
id: it.id,
memberId: it.memberId,
memberName: it.memberName,
memberRoleId: it.memberRoleId,
minimum: it.minimum,
ranking: it.ranking,
subtotal: it.subtotal,
sumPrice: it.sumPrice,
awardInfoResponses: [],
}
let awardInfoResponses = [];
dataSource.forEach((item: any, index: number) => {
let cItem = {
brand: item.brand,
category: item.category,
goodsId: item.goodsId,
unit: item.unit,
model: item.model,
name: item.name,
number: item.number,
purchaseCount: item.purchaseCount,
awardTaxProbability: item.company[idx].awardTaxProbability,
taxPrice: item.company[idx].taxPrice,
taxProbability: item.company[idx].taxProbability,
taxUnitPrice: item.company[idx].taxUnitPrice,
isPrize: item.company[idx].isPrize,
isTax: item.company[idx].isTax,
id: item.company[idx].itemId,
}
awardInfoResponses.push(cItem)
})
item.awardInfoResponses = awardInfoResponses
params.push(item)
})
setPriceParityInfos(params)
}
}, [visible])
const handleSubmit = async () => {
try {
const values = await form.validateFields();
const params = {
id,
turn,
awardComments: values.awardComments,
urls: files,
priceParityInfos,
}
for(let i = 0; i < dataSource.length; i++) {
const count = sumBy(dataSource[i].company, 'awardTaxProbability');
if (count > 100 || count < 100) {
message.warning(`${dataSource[i].number}授标百分比分配不准确,请核对!`);
return
}
}
PublicApi.postPurchaseConfirmQuotedPriceSubmitContrastPrice(params).then(res => {
if (res.code === 1000) {
handleConfirm();
}
})
} catch (errInfo) {
console.log('Save failed:', errInfo);
}
}
return (
<Modal
title='提交审核'
visible={visible}
width={600}
onCancel={onCancel}
onOk={handleSubmit}
>
<Form form={form} layout="vertical">
<Form.Item
name='awardComments'
label='授标意见'
>
<TextArea />
</Form.Item>
<Form.Item label='附件' name='upload'>
<div className={style.upload_data}>
{files.length > 0 && files.map((v, index) => (
<div key={index} className={style.upload_item}>
<div className={style.upload_left}>
<LinkOutlined />
<span>{v.name}</span>
</div>
<div className={style.upload_right} onClick={() => removeFiles(index)}>
<DeleteOutlined />
</div>
</div>
))}
</div>
<Upload
action="/api/file/file/upload"
data={{ fileType: UPLOAD_TYPE }}
showUploadList={false}
accept='.doc,.docx,.pdf,.ppt,.pptx,.xls,.xlsx'
beforeUpload={beforeDocUpload}
onChange={handleChange}
>
<Button loading={loading} icon={<UploadOutlined />}>上传文件</Button>
<div style={{ marginTop: '8px' }}>一次上传一个文件,每个附件大小不能超过 20M</div>
</Upload>
</Form.Item>
</Form>
</Modal>
)
}
export default BidModal;
import { useEffect, useState } from 'react'
export const useBidTable = () => {
const [dataSource, setDataSource] = useState<any>([]);
const [soure, setSoure] = useState<any>({});
const formContext = {
dataSource: dataSource,
soure: soure,
ctl: {
setDataSource: setDataSource,
setSoure: setSoure
},
}
return {
formContext
}
}
.revise_style {
:global {
.ant-form-item-label {
label {
&::before {
margin-left: 1px;
}
}
}
}
}
import React, { useEffect } from 'react';
import { Modal } from 'antd';
import {
SchemaForm, SchemaMarkupField as Field,
createFormActions,
FormEffectHooks,
} from '@formily/antd'
import { Input, Radio, DatePicker, Checkbox } from '@formily/antd-components'
import moment from 'moment';
import styles from './index.less';
import { isEmpty } from 'lodash';
const actions = createFormActions()
const { onFieldChange$ } = FormEffectHooks;
export interface IProps {
title: string,
visible: boolean,
data?: any,
id: number,
modalType: 'audit' | 'abandon' | 'date' | 'next' | 'key' | 'discard' | 'planAudit' | 'billBack',
onCancel?: () => void,
onOk?: () => void,
fetch?: () => Promise<unknown>,
maxNumber?: number
}
const ModalOperate: React.FC<IProps> = (props: any) => {
const {
title,
data,
visible,
id,
onCancel,
onOk,
modalType,
fetch,
maxNumber,
} = props;
const useFormEffects = () => {
const { setFieldState } = createFormActions()
if (modalType === 'audit') {
onFieldChange$('state').subscribe(({ value }) => {
setFieldState('auditOpinion', state => {
if (value == 1) {
state.visible = false
} else {
state.visible = true
}
})
})
}
if (modalType === 'planAudit') {
onFieldChange$('status').subscribe(({ value }) => {
setFieldState('cause', state => {
if (value == 1) {
state.visible = false
} else {
state.visible = true
}
})
})
}
if (modalType === 'date') {
onFieldChange$('checkbox').subscribe(({ value }) => {
if (value && value.length > 0) {
actions.setFieldValue('quotedPriceTime', moment().format());
} else {
actions.setFieldValue('quotedPriceTime', undefined);
}
})
}
}
const disabledDate = (current) => {
return current && current <= moment().startOf('day');
}
const modalText = () => {
switch (modalType) {
case 'audit':
case 'planAudit':
return '审核不通过原因';
case 'billBack':
return '退回原因';
default:
return '作废原因';
}
}
const modalNode = () => {
switch (modalType) {
case 'audit':
return <Field
enum={
[
{ label: '审核通过', value: 1 },
{ label: '审核不通过', value: 0 }
]}
name='state'
required
x-component="Radio"
x-component-props={{}}
/>
case 'abandon':
return <Field
title="作废时间"
name="reasonTime"
required
x-component="DatePicker"
x-component-props={{
style: {
width: '100%'
},
format: 'YYYY-MM-DD HH:mm:ss',
disabledDate: (current) => {
return moment().calendar();
},
}}
/>
case 'discard':
return <Field
title="作废时间"
name="reasonTime"
required
x-component="DatePicker"
x-component-props={{
style: {
width: '100%'
},
format: 'YYYY-MM-DD HH:mm:ss',
disabled: true
}}
/>
case 'date':
return <>
<Field
title="报价截止时间"
name="quotedPriceTime"
required
x-component="DatePicker"
x-component-props={{
style: {
width: '100%'
},
format: 'YYYY-MM-DD HH:mm:ss',
disabledDate,
}}
/>
<Field
name="isNow"
x-component="CheckboxGroup"
description="勾选后供应商不能再提交报价单"
enum={[{ label: '立即截止报价', value: 1 }]}
/>
</>
case 'next':
return <Field
title="下轮报价截止时间"
name="quotedPriceTime"
required
x-component="DatePicker"
x-component-props={{
style: {
width: '100%'
},
format: 'YYYY-MM-DD HH:mm:ss',
disabledDate,
}}
/>
case 'key':
return <Field
title="请输入解密密钥"
x-component="Input"
name="password"
required
x-component-props={{}}
/>
case 'planAudit':
return <Field
enum={
[
{ label: '审核通过', value: 1 },
{ label: '审核不通过', value: 0 }
]}
name='status'
required
x-component="Radio"
x-component-props={{}}
/>
}
}
useEffect(() => {
if (modalType === 'next') {
actions.setFieldValue('quotedPriceTime', moment().format())
}
if (modalType === 'abandon' || modalType === 'discard') {
actions.setFieldValue('reasonTime', moment().format())
}
if (modalType === 'date') {
actions.setFieldValue('quotedPriceTime', moment(data).format())
}
actions.clearErrors();
}, [visible])
const handleSubmit = (val: any) => {
let value = { ...val }
let params: any = {}
if (modalType === 'audit') {
params.state = value.state;
value.state !== 1 && (params.auditOpinion = value.auditOpinion);
} else if (modalType === 'abandon') {
params.reason = value.reason
params.reasonTime = new Date(value.reasonTime).getTime();
} else if (modalType === 'discard') {
params.discardCaues = value.reason
params.discardTime = new Date(value.reasonTime).getTime();
} else if (modalType === 'date') {
params.quotedPriceTime = new Date(value.quotedPriceTime).getTime();
params.isNow = !isEmpty(value.isNow) ? 1 : 0;
} else if (modalType === 'next') {
params.quotedPriceTime = new Date(value.quotedPriceTime).getTime();
} else if (modalType === 'planAudit') {
params.status = value.status;
value.status !== 1 && (params.cause = value.cause);
} else if (modalType === 'billBack') {
params.status = 0;
params.cause = value.cause;
} else {
params.password = value.password;
}
fetch({ id, ...params }).then(res => {
if (res.code === 1000) {
onOk && onOk()
}
})
}
const handleClose = () => {
onCancel();
actions.reset();
}
const causeName = (name: string) => {
switch (name) {
case 'audit':
return 'auditOpinion';
case 'planAudit':
return 'cause'
default:
return 'reason'
}
}
return (
<Modal
width={600}
title={title}
visible={visible}
onCancel={handleClose}
onOk={() => actions.submit()}
afterClose={() => actions.reset()}
>
<SchemaForm
className={styles.revise_style}
layout="vertical"
labelCol={6}
components={{
Input,
Radio: Radio.Group,
TextArea: Input.TextArea,
DatePicker,
Checkbox,
CheckboxGroup: Checkbox.Group
}}
actions={actions}
effects={() => useFormEffects()}
onSubmit={(values) => handleSubmit(values)}
initialValues={{
state: 1,
status: 1
}}
>
{modalNode()}
{(modalType === 'audit' || modalType === 'abandon' || modalType === 'discard' || modalType === 'planAudit' || modalType === 'billBack')
&& (<Field
title={modalText()}
name={causeName(modalType)}
x-component="TextArea"
required
x-component-props={{
placeholder: `在此输入你的内容,最多${maxNumber}个汉字`
}}
x-rules={{
max: maxNumber,
message: `原因最多${maxNumber}个汉字`
}}
/>)}
</SchemaForm>
</Modal>
)
}
ModalOperate.defaultProps = {
maxNumber: 60
}
export default ModalOperate;
/** 内部状态颜色 */
export const EXTERNALSTATE_COLOR = {
1: "default",
2: "default",
3: "default",
4: "success",
5: "error",
}
/** 外部状态颜色 */
export const INTERNALSTATE_COLOR = {
1: "default",
2: "default",
3: "default",
4: "default",
5: "success",
6: "error",
7: "error",
}
import React, { useRef } from 'react';
import Table from '@/pages/transaction/components/TableLayout';
import { history } from 'umi';
import { Tag, Badge } from 'antd';
import { ColumnType } from 'antd/lib/table/interface';
import EyePreview from '@/components/EyePreview';
import moment from 'moment';
import { PublicApi } from '@/services/api';
import { OFFERSEARCHSCHEMA } from './schema';
import { EXTERNALSTATE_COLOR, INTERNALSTATE_COLOR } from '@/pages/transaction/components/stateColor';
const OfferSearch = () => {
const reload = useRef<any>({});
const format = (text, fmt?: string) => {
return <>{moment(text).format(fmt || "YYYY-MM-DD HH:mm:ss")}</>
}
const columns: ColumnType<any>[] = [
{
title: '报价单号',
key: 'quotationNo',
dataIndex: 'quotationNo',
render: (text: any, record: any) => <EyePreview
url={`/memberCenter/tranactionAbility/confirmInquiryQuote/quoteOrder/quote/preview?id=${record.id}`}>{text}</EyePreview>
},
{
title: '询价单号',
key: 'inquiryListNo',
dataIndex: 'inquiryListNo',
render: (text: any, record: any) => <EyePreview
url={`/memberCenter/tranactionAbility/confirmInquiryQuote/quoteOrder/rfq/preview?id=${record.inquiryListId}`}>{text}</EyePreview>
},
{
title: '报价单摘要',
key: 'details',
dataIndex: 'details',
},
{
title: '报价会员',
key: 'memberName',
dataIndex: 'memberName',
},
{
title: '报价截止时间',
key: 'quotationAsTime',
dataIndex: 'quotationAsTime',
render: (text: any, record: any) => format(text)
},
{
title: '单据时间',
key: 'voucherTime',
dataIndex: 'voucherTime',
render: (text: any, record: any) => format(text)
},
{
title: '外部状态',
key: 'externalState',
dataIndex: 'externalState',
render: (text: any, record: any) => <Tag color={EXTERNALSTATE_COLOR[text]}>{record.externalStateName}</Tag>
},
{
title: '内部状态',
key: 'interiorState',
dataIndex: 'interiorState',
render: (text: any, record: any) => <Badge status={INTERNALSTATE_COLOR[text]} text={record.interiorStateName} />
},
];
return (
<Table
schema={OFFERSEARCHSCHEMA}
columns={columns}
effects="quotationNo"
fetch={PublicApi.getTransactionNotarizeEnquiryProductQuotationList}
reload={reload}
externalStatusFetch={PublicApi.getTransactionProductInquiryExternalStateEnum({ type: '3' })}
interiorStatusFetch={PublicApi.getTransactionProductInquiryInteriorStateEnum({ type: '3' })}
/>
)
}
export default OfferSearch
import { ISchema } from "@formily/antd";
import { FORM_FILTER_PATH } from "@/formSchema/const";
export const OFFERSEARCHSCHEMA: ISchema = {
type: "object",
properties: {
megalayout: {
type: "object",
"x-component": "mega-layout",
properties: {
quotationNo: {
type: "string",
"x-component": "Search",
"x-mega-props": {
},
"x-component-props": {
placeholder: "报价单号",
align: "flex-left",
}
}
}
},
[FORM_FILTER_PATH]: {
type: "object",
"x-component": "flex-layout",
"x-component-props": {
rowStyle: {
justifyContent: "flex-start",
flexWrap: "nowrap"
},
colStyle: {//改变间隔
marginRight: 20
}
},
properties: {
PRO_LAYOUT: {
type: "object",
"x-component": "mega-layout",
"x-mega-props": {
span: 5
},
"x-component-props": {
inline: true
},
properties: {
inquiryListNo: {
type: "string",
"x-component-props": {
placeholder: "询价单号"
}
},
memberName: {
type: "string",
"x-component-props": {
placeholder: "询价会员"
}
},
details: {
type: "string",
"x-component-props": {
placeholder: "报价单摘要"
}
},
"[startDocumentsTime,endDocumentsTime]": {
type: "string",
"x-component": "dateSelect",
"x-component-props": {
placeholder: "单据时间(全部)",
}
},
externalState: {
type: "string",
"x-component-props": {
placeholder: "外部状态",
style: {
width: 160
}
},
enum: []
},
interiorState: {
type: "string",
"x-component-props": {
placeholder: "内部状态",
style: {
width: 160
}
},
enum: []
},
}
},
sumbit: {
"x-component": "Submit",
"x-mega-props": {
span: 1
},
"x-component-props": {
children: "查询"
}
}
}
}
}
}
import React, { useRef, useState } from 'react';
import Table from '@/pages/transaction/components/TableLayout';
import { history } from 'umi';
import { ColumnType } from 'antd/lib/table/interface';
import EyePreview from '@/components/EyePreview';
import moment from 'moment'
import { PublicApi } from '@/services/api';
import { Row, Col, Button, Tag, Badge } from 'antd';
import { WAITAUDITINQUIRYONESCHEMA } from './schema';
import { EXTERNALSTATE_COLOR, INTERNALSTATE_COLOR } from '@/pages/transaction/components/stateColor';
const WaitAuditInquiryOne = () => {
const ref = useRef<any>({});
const format = (text, fmt?: string) => {
return <>{moment(text).format(fmt || "YYYY-MM-DD HH:mm:ss")}</>
}
const [rowkeys, setRowKeys] = useState<Array<number>>([]);
/** 批量审核 */
const fetchSubmitBatch = async () => {
const res = await PublicApi.postTransactionNotarizeEnquiryQuotedPriceAuditAll({ ids: rowkeys });
if (res.code === 1000) {
ref.current.reload();
setRowKeys([])
}
}
const columns: ColumnType<any>[] = [
{
title: '报价单号',
key: 'quotationNo',
dataIndex: 'quotationNo',
render: (text: any, record: any) => <EyePreview
url={`/memberCenter/tranactionAbility/confirmInquiryQuote/pendingReviewOne/quote/preview?id=${record.id}`}>{text}</EyePreview>
},
{
title: '询价单号',
key: 'inquiryListNo',
dataIndex: 'inquiryListNo',
render: (text: any, record: any) => <EyePreview
url={`/memberCenter/tranactionAbility/confirmInquiryQuote/pendingReviewOne/rfq/preview?id=${record.inquiryListId}`}>{text}</EyePreview>
},
{
title: '报价单摘要',
key: 'details',
dataIndex: 'details',
},
{
title: '报价会员',
key: 'memberName',
dataIndex: 'memberName',
},
{
title: '报价截止时间',
key: 'quotationAsTime',
dataIndex: 'quotationAsTime',
render: (text: any, record: any) => format(text)
},
{
title: '单据时间',
key: 'createTime',
dataIndex: 'createTime',
render: (text: any, record: any) => format(text)
},
{
title: '外部状态',
key: 'externalState',
dataIndex: 'externalState',
render: (text: any, record: any) => <Tag color={EXTERNALSTATE_COLOR[text]}>{record.externalStateName}</Tag>
},
{
title: '内部状态',
key: 'interiorState',
dataIndex: 'interiorState',
render: (text: any, record: any) => <Badge status={INTERNALSTATE_COLOR[text]} text={record.interiorStateName} />
},
{
title: '操作',
key: 'options',
dataIndex: 'options',
render: (text: any, record: any) =>
<Button type='link'>审核</Button>
}
]
return (
<Table
selectedRow
reload={ref}
schema={WAITAUDITINQUIRYONESCHEMA}
columns={columns}
effects="quotationNo"
fetch={PublicApi.getTransactionNotarizeEnquiryQuotedPriceAuditList}
externalStatusFetch={PublicApi.getTransactionProductInquiryExternalStateEnum({ type: '2' })}
interiorStatusFetch={PublicApi.getTransactionProductInquiryInteriorStateEnum({ type: '2' })}
fetchRowkeys={(e) => setRowKeys(e)}
controllerBtns={
<Row>
<Col span={6}>
<Button
disabled={rowkeys.length === 0}
onClick={fetchSubmitBatch}
>
批量提交审核
</Button>
</Col>
</Row>
}
/>
)
}
export default WaitAuditInquiryOne
import { ISchema } from "@formily/antd";
import { FORM_FILTER_PATH } from "@/formSchema/const";
export const WAITAUDITINQUIRYONESCHEMA: ISchema = {
type: "object",
properties: {
megalayout: {
type: "object",
"x-component": "mega-layout",
"x-component-props": {
grid: true
},
properties: {
ctl: {
type: "object",
"x-component": "Children",
"x-component-props": {
children: "{{controllerBtns}}"
}
},
quotationNo: {//报价单号
type: "string",
"x-component": "Search",
"x-mega-props": {
},
"x-component-props": {
placeholder: "报价单号"
}
}
}
},
[FORM_FILTER_PATH]: {
type: "object",
"x-component": "flex-layout",
"x-component-props": {
rowStyle: {
flexWrap: "nowrap"
},
colStyle: {
marginLeft: 20
}
},
properties: {
PRO_LAYOUT: {
type: "object",
"x-component": "mega-layout",
"x-mega-props": {
span: 5
},
"x-component-props": {
inline: true
},
properties: {
inquiryListNo: {
type: "string",
"x-component-props": {
placeholder: "询价单号"
}
},
details: {
type: "string",
"x-component-props": {
placeholder: "报价单摘要"
}
},
memberName: {
type: "string",
"x-component-props": {
placeholder: "报价会员"
}
},
"[startDocumentsTime,endDocumentsTime]": {
type: "string",
"x-component": "dateSelect",
"x-component-props": {
placeholder: "单据时间(全部)",
}
},
}
},
sumbit: {
"x-component": "Submit",
"x-mega-props": {
span: 1
},
"x-component-props": {
children: "查询"
}
}
}
}
}
}
import React, { useRef, useState } from 'react';
import Table from '@/pages/transaction/components/TableLayout';
import { history } from 'umi';
import { ColumnType } from 'antd/lib/table/interface';
import EyePreview from '@/components/EyePreview';
import moment from 'moment'
import { PublicApi } from '@/services/api';
import { Row, Col, Button, Tag, Badge } from 'antd';
import { WAITAUDITINQUIRYTWOSCHEMA } from './schema';
import { EXTERNALSTATE_COLOR, INTERNALSTATE_COLOR } from '@/pages/transaction/components/stateColor';
const WaitAuditInquiryOne = () => {
const ref = useRef<any>({});
const format = (text, fmt?: string) => {
return <>{moment(text).format(fmt || "YYYY-MM-DD HH:mm:ss")}</>
}
const [rowkeys, setRowKeys] = useState<Array<number>>([]);
/** 批量审核 */
const fetchSubmitBatch = async () => {
const res = await PublicApi.postTransactionNotarizeEnquiryQuotedPriceAuditAllTwo({ ids: rowkeys });
if (res.code === 1000) {
ref.current.reload();
setRowKeys([])
}
}
const columns: ColumnType<any>[] = [
{
title: '报价单号',
key: 'quotationNo',
dataIndex: 'quotationNo',
render: (text: any, record: any) => <EyePreview
url={`/memberCenter/tranactionAbility/confirmInquiryQuote/pendingSubmit/quote/preview?id=${record.id}`}>{text}</EyePreview>
}, {
title: '询价单号',
key: 'inquiryListNo',
dataIndex: 'inquiryListNo',
render: (text: any, record: any) => <EyePreview
url={`/memberCenter/tranactionAbility/confirmInquiryQuote/pendingSubmit/rfq/preview?id=${record.inquiryListId}`}>{text}</EyePreview>
},
{
title: '报价单摘要',
key: 'details',
dataIndex: 'details',
},
{
title: '报价会员',
key: 'memberName',
dataIndex: 'memberName',
},
{
title: '报价截止时间',
key: 'quotationAsTime',
dataIndex: 'quotationAsTime',
render: (text: any, record: any) => format(text)
},
{
title: '单据时间',
key: 'createTime',
dataIndex: 'createTime',
render: (text: any, record: any) => format(text)
},
{
title: '外部状态',
key: 'externalState',
dataIndex: 'externalState',
render: (text: any, record: any) => <Tag color={EXTERNALSTATE_COLOR[text]}>{record.externalStateName}</Tag>
},
{
title: '内部状态',
key: 'interiorState',
dataIndex: 'interiorState',
render: (text: any, record: any) => <Badge status={INTERNALSTATE_COLOR[text]} text={record.interiorStateName} />
},
{
title: '操作',
key: 'options',
dataIndex: 'options',
render: (text: any, record: any) =>
<Button type='link'>审核</Button>
}
]
return (
<Table
selectedRow
reload={ref}
schema={WAITAUDITINQUIRYTWOSCHEMA}
columns={columns}
effects="quotationNo"
fetch={PublicApi.getTransactionNotarizeEnquiryQuotedPriceAuditListTwo}
externalStatusFetch={PublicApi.getTransactionProductInquiryExternalStateEnum({ type: '2' })}
interiorStatusFetch={PublicApi.getTransactionProductInquiryInteriorStateEnum({ type: '2' })}
fetchRowkeys={(e) => setRowKeys(e)}
controllerBtns={
<Row>
<Col span={6}>
<Button
disabled={rowkeys.length === 0}
onClick={fetchSubmitBatch}
>
批量提交审核
</Button>
</Col>
</Row>
}
/>
)
}
export default WaitAuditInquiryOne
import { ISchema } from "@formily/antd";
import { FORM_FILTER_PATH } from "@/formSchema/const";
export const WAITAUDITINQUIRYTWOSCHEMA: ISchema = {
type: "object",
properties: {
megalayout: {
type: "object",
"x-component": "mega-layout",
"x-component-props": {
grid: true
},
properties: {
ctl: {
type: "object",
"x-component": "Children",
"x-component-props": {
children: "{{controllerBtns}}"
}
},
quotationNo: {//报价单号
type: "string",
"x-component": "Search",
"x-mega-props": {
},
"x-component-props": {
placeholder: "报价单号"
}
}
}
},
[FORM_FILTER_PATH]: {
type: "object",
"x-component": "flex-layout",
"x-component-props": {
rowStyle: {
flexWrap: "nowrap"
},
colStyle: {
marginLeft: 20
}
},
properties: {
PRO_LAYOUT: {
type: "object",
"x-component": "mega-layout",
"x-mega-props": {
span: 5
},
"x-component-props": {
inline: true
},
properties: {
inquiryListNo: {
type: "string",
"x-component-props": {
placeholder: "询价单号"
}
},
details: {
type: "string",
"x-component-props": {
placeholder: "报价单摘要"
}
},
memberName: {
type: "string",
"x-component-props": {
placeholder: "报价会员"
}
},
"[startDocumentsTime,endDocumentsTime]": {
type: "string",
"x-component": "dateSelect",
"x-component-props": {
placeholder: "单据时间(全部)",
}
},
}
},
sumbit: {
"x-component": "Submit",
"x-mega-props": {
span: 1
},
"x-component-props": {
children: "查询"
}
}
}
}
}
}
import React, { useRef, useState } from 'react';
import Table from '@/pages/transaction/components/TableLayout';
import { Tag, Badge, Button, Row, Col } from 'antd';
import { ColumnType } from 'antd/lib/table/interface';
import EyePreview from '@/components/EyePreview';
import moment from 'moment';
import { PublicApi } from '@/services/api';
import { WAITSUBMITAUDITOFFERSCHEMA } from './schema';
import { EXTERNALSTATE_COLOR, INTERNALSTATE_COLOR } from '@/pages/transaction/components/stateColor';
const WaitSubmitAuditOffer = () => {
const reload = useRef<any>({});
const format = (text, fmt?: string) => {
return <>{moment(text).format(fmt || "YYYY-MM-DD HH:mm:ss")}</>
}
const [rowkeys, setRowKeys] = useState<Array<number>>([]);
/** 批量审核 */
const fetchSubmitBatch = async (id?: number) => {
let res = null;
if (id) {
res = await PublicApi.postTransactionNotarizeEnquiryQuotedPriceSubmit({ id: Number(id) })
} else {
res = await PublicApi.postTransactionNotarizeEnquiryQuotedPriceSubmitAll({ ids: rowkeys });
}
if (res.code === 1000) {
reload.current.reload();
setRowKeys([])
}
}
const columns: ColumnType<any>[] = [
{
title: '报价单号',
key: 'quotationNo',
dataIndex: 'quotationNo',
render: (text: any, record: any) => <EyePreview
url={`/memberCenter/tranactionAbility/confirmInquiryQuote/pendingSubmitReview/quote/preview?id=${record.id}`}>{text}</EyePreview>
},
{
title: '询价单号',
key: 'inquiryListNo',
dataIndex: 'inquiryListNo',
render: (text: any, record: any) => <EyePreview
url={`/memberCenter/tranactionAbility/confirmInquiryQuote/pendingSubmitReview/rfq/preview?id=${record.inquiryListId}`}>{text}</EyePreview>
},
{
title: '报价单摘要',
key: 'details',
dataIndex: 'details',
},
{
title: '报价会员',
key: 'memberName',
dataIndex: 'memberName',
},
{
title: '报价截止时间',
key: 'quotationAsTime',
dataIndex: 'quotationAsTime',
render: (text: any, record: any) => format(text)
},
{
title: '单据时间',
key: 'voucherTime',
dataIndex: 'voucherTime',
render: (text: any, record: any) => format(text)
},
{
title: '外部状态',
key: 'externalState',
dataIndex: 'externalState',
render: (text: any, record: any) => <Tag color={EXTERNALSTATE_COLOR[text]}>{record.externalStateName}</Tag>
},
{
title: '内部状态',
key: 'interiorState',
dataIndex: 'interiorState',
render: (text: any, record: any) => <Badge status={INTERNALSTATE_COLOR[text]} text={record.interiorStateName} />
},
{
title: '操作',
key: 'options',
dataIndex: 'options',
render: (text: any, record: any) => <Button type='link' onClick={() => fetchSubmitBatch(record.id)}>提交审核</Button>
}
];
return (
<Table
schema={WAITSUBMITAUDITOFFERSCHEMA}
columns={columns}
effects="quotationNo"
fetch={PublicApi.getTransactionNotarizeEnquiryQuotedPriceList}
reload={reload}
selectedRow
fetchRowkeys={(e) => setRowKeys(e)}
externalStatusFetch={PublicApi.getTransactionProductInquiryExternalStateEnum({ type: '3' })}
interiorStatusFetch={PublicApi.getTransactionProductInquiryInteriorStateEnum({ type: '3' })}
controllerBtns={
<Row>
<Col span={6}>
<Button
disabled={rowkeys.length === 0}
onClick={() => fetchSubmitBatch()}
>
批量提交审核
</Button>
</Col>
</Row>
}
/>
)
}
export default WaitSubmitAuditOffer
import { ISchema } from "@formily/antd";
import { FORM_FILTER_PATH } from "@/formSchema/const";
export const WAITSUBMITAUDITOFFERSCHEMA: ISchema = {
type: "object",
properties: {
megalayout: {
type: "object",
"x-component": "mega-layout",
"x-component-props": {
grid: true
},
properties: {
ctl: {
type: "object",
"x-component": "Children",
"x-component-props": {
children: "{{controllerBtns}}"
}
},
quotationNo: {//报价单号
type: "string",
"x-component": "Search",
"x-mega-props": {
},
"x-component-props": {
placeholder: "报价单号"
}
}
}
},
[FORM_FILTER_PATH]: {
type: "object",
"x-component": "flex-layout",
"x-component-props": {
rowStyle: {
flexWrap: "nowrap"
},
colStyle: {
marginLeft: 20
}
},
properties: {
PRO_LAYOUT: {
type: "object",
"x-component": "mega-layout",
"x-mega-props": {
span: 5
},
"x-component-props": {
inline: true
},
properties: {
inquiryListNo: {//需求单号
type: "string",
"x-mega-props": {
},
"x-component-props": {
placeholder: "询价单号"
}
},
details: {
type: "string",
"x-component-props": {
placeholder: "报价单摘要"
}
},
memberName: {
type: "string",
"x-component-props": {
placeholder: "报价会员"
}
},
"[startDocumentsTime,endDocumentsTime]": {
type: "string",
"x-component": "dateSelect",
"x-component-props": {
placeholder: "单据时间(全部)",
}
},
}
},
sumbit: {
"x-component": "Submit",
"x-mega-props": {
span: 1
},
"x-component-props": {
children: "查询"
}
}
}
}
}
}
import React, { useRef, useState } from 'react';
import Table from '@/pages/transaction/components/TableLayout';
import { Tag, Badge, Button, Row, Col } from 'antd';
import { ColumnType } from 'antd/lib/table/interface';
import EyePreview from '@/components/EyePreview';
import moment from 'moment';
import { PublicApi } from '@/services/api';
import { WAITSUBMITOFFERSCHEMA } from './schema';
import { EXTERNALSTATE_COLOR, INTERNALSTATE_COLOR } from '@/pages/transaction/components/stateColor';
const WaitSubmitOffer = () => {
const reload = useRef<any>({});
const format = (text, fmt?: string) => {
return <>{moment(text).format(fmt || "YYYY-MM-DD HH:mm:ss")}</>
}
const [rowkeys, setRowKeys] = useState<Array<number>>([]);
/** 批量审核 */
const fetchSubmitBatch = async (id?: number) => {
let res = null;
if (id) {
res = await PublicApi.postTransactionNotarizeEnquiryQuotedPriceSubmit({ id: Number(id) })
} else {
res = await PublicApi.postTransactionNotarizeEnquiryQuotedPriceSubmitAll({ ids: rowkeys });
}
if (res.code === 1000) {
reload.current.reload();
setRowKeys([])
}
}
const columns: ColumnType<any>[] = [
{
title: '报价单号',
key: 'quotationNo',
dataIndex: 'quotationNo',
render: (text: any, record: any) => <EyePreview
url={`/memberCenter/tranactionAbility/confirmInquiryQuote/pendingSubmit/quote/preview?id=${record.id}`}>{text}</EyePreview>
},
{
title: '询价单号',
key: 'inquiryListNo',
dataIndex: 'inquiryListNo',
render: (text: any, record: any) => <EyePreview
url={`/memberCenter/tranactionAbility/confirmInquiryQuote/pendingSubmit/rfq/preview?id=${record.inquiryListId}`}>{text}</EyePreview>
},
{
title: '报价单摘要',
key: 'details',
dataIndex: 'details',
},
{
title: '报价会员',
key: 'memberName',
dataIndex: 'memberName',
},
{
title: '报价截止时间',
key: 'quotationAsTime',
dataIndex: 'quotationAsTime',
render: (text: any, record: any) => format(text)
},
{
title: '单据时间',
key: 'voucherTime',
dataIndex: 'voucherTime',
render: (text: any, record: any) => format(text)
},
{
title: '外部状态',
key: 'externalState',
dataIndex: 'externalState',
render: (text: any, record: any) => <Tag color={EXTERNALSTATE_COLOR[text]}>{record.externalStateName}</Tag>
},
{
title: '内部状态',
key: 'interiorState',
dataIndex: 'interiorState',
render: (text: any, record: any) => <Badge status={INTERNALSTATE_COLOR[text]} text={record.interiorStateName} />
},
{
title: '操作',
key: 'options',
dataIndex: 'options',
render: (text: any, record: any) => <Button type='link' onClick={() => fetchSubmitBatch(record.id)}>提交报价单</Button>
}
]
return (
<Table
schema={WAITSUBMITOFFERSCHEMA}
columns={columns}
effects="quotationNo"
fetch={PublicApi.getTransactionNotarizeEnquiryQuotedPriceList}
reload={reload}
selectedRow
fetchRowkeys={(e) => setRowKeys(e)}
externalStatusFetch={PublicApi.getTransactionProductInquiryExternalStateEnum({ type: '3' })}
interiorStatusFetch={PublicApi.getTransactionProductInquiryInteriorStateEnum({ type: '3' })}
controllerBtns={
<Row>
<Col span={6}>
<Button
disabled={rowkeys.length === 0}
onClick={() => fetchSubmitBatch()}
>
批量提交审核
</Button>
</Col>
</Row>
}
/>
)
}
export default WaitSubmitOffer
import { ISchema } from "@formily/antd";
import { FORM_FILTER_PATH } from "@/formSchema/const";
export const WAITSUBMITOFFERSCHEMA: ISchema = {
type: "object",
properties: {
megalayout: {
type: "object",
"x-component": "mega-layout",
"x-component-props": {
grid: true
},
properties: {
ctl: {
type: "object",
"x-component": "Children",
"x-component-props": {
children: "{{controllerBtns}}"
}
},
quotationNo: {//报价单号
type: "string",
"x-component": "Search",
"x-mega-props": {
},
"x-component-props": {
placeholder: "报价单号"
}
}
}
},
[FORM_FILTER_PATH]: {
type: "object",
"x-component": "flex-layout",
"x-component-props": {
rowStyle: {
flexWrap: "nowrap"
},
colStyle: {
marginLeft: 20
}
},
properties: {
PRO_LAYOUT: {
type: "object",
"x-component": "mega-layout",
"x-mega-props": {
span: 5
},
"x-component-props": {
inline: true
},
properties: {
inquiryListNo: {//需求单号
type: "string",
"x-mega-props": {
},
"x-component-props": {
placeholder: "询价单号"
}
},
details: {
type: "string",
"x-component-props": {
placeholder: "报价单摘要"
}
},
memberName: {
type: "string",
"x-component-props": {
placeholder: "报价会员"
}
},
"[startDocumentsTime,endDocumentsTime]": {
type: "string",
"x-component": "dateSelect",
"x-component-props": {
placeholder: "单据时间(全部)",
}
},
}
},
sumbit: {
"x-component": "Submit",
"x-mega-props": {
span: 1
},
"x-component-props": {
children: "查询"
}
}
}
}
}
}
import React, { useRef } from 'react';
import Table from '@/pages/transaction/components/TableLayout';
import { history } from 'umi';
import { Tag, Button } from 'antd';
import { ColumnType } from 'antd/lib/table/interface';
import EyePreview from '@/components/EyePreview';
import moment from 'moment';
import { PublicApi } from '@/services/api';
import { INQUIRYSEARCHSCHEMA } from './schema';
import { EXTERNALSTATE_COLOR } from '@/pages/transaction/components/stateColor';
const InquirySearch = () => {
const reload = useRef<any>({});
const format = (text, fmt?: string) => {
return <>{moment(text).format(fmt || "YYYY-MM-DD HH:mm:ss")}</>
}
const columns: ColumnType<any>[] = [
{
title: '询价单号',
key: 'inquiryListNo',
dataIndex: 'inquiryListNo',
render: (text: any, record: any) => <EyePreview
url={`/memberCenter/tranactionAbility/inquiryQuote/enquiryOrder/rfq/preview?id=${record.id}`}>{text}</EyePreview>
},
{
title: '询价单摘要',
key: 'details',
dataIndex: 'details',
},
{
title: '被询价会员',
key: 'memberName',
dataIndex: 'memberName',
},
{
title: '交付日期',
key: 'deliveryTime',
dataIndex: 'deliveryTime',
render: (text: any, record: any) => format(text)
},
{
title: '报价截止时间',
key: 'quotationAsTime',
dataIndex: 'quotationAsTime',
render: (text: any, record: any) => format(text)
},
{
title: '单据时间',
key: 'voucherTime',
dataIndex: 'voucherTime',
render: (text: any, record: any) => format(text)
},
{
title: '外部状态',
key: 'externalState',
dataIndex: 'externalState',
render: (text: any, record: any) => <Tag color={EXTERNALSTATE_COLOR[text]}>{record.externalStateName}</Tag>
},
{
title: '操作',
key: 'options',
dataIndex: 'options',
render: (text: any, record: any) => <Button disabled={record.isQuoted === 1} onClick={() => history.push(`/memberCenter/tranactionAbility/inquiryQuote/addInquiryOrder/quote?id=${record.id}`)} type='link'>报价</Button>
}
];
return (
<Table
schema={INQUIRYSEARCHSCHEMA}
columns={columns}
effects="inquiryListNo"
fetch={PublicApi.getTransactionProductInquiryList}
reload={reload}
externalStatusFetch={PublicApi.getTransactionProductInquiryExternalStateEnum({ type: '1' })}
/>
)
}
export default InquirySearch
import { ISchema } from "@formily/antd";
import { FORM_FILTER_PATH } from "@/formSchema/const";
export const INQUIRYSEARCHSCHEMA: ISchema = {
type: 'object',
properties: {
megalayout: {
type: 'object',
"x-component": 'mega-layout',
properties: {
inquiryListNo: {
type: 'string',
"x-component": "Search",
"x-mega-props": {
},
"x-component-props": {
placeholder: '询价单号搜索',
align: 'flex-left',
}
}
}
},
[FORM_FILTER_PATH]: {
type: 'object',
"x-component": "flex-layout",
"x-component-props": {
rowStyle: {
justifyContent: 'flex-start',
flexWrap: 'nowrap'
},
colStyle: {//改变间隔
marginRight: 20
}
},
properties: {
PRO_LAYOUT: {
type: 'object',
"x-component": 'mega-layout',
"x-mega-props": {
span: 5
},
"x-component-props": {
inline: true
},
properties: {
memberName: {
type: 'string',
"x-component-props": {
placeholder: '被询价会员'
},
},
details: {
type: 'string',
"x-component-props": {
placeholder: '询价单摘要'
},
},
"[startDocumentsTime,endDocumentsTime]": {
type: "string",
"x-component": "dateSelect",
"x-component-props": {
placeholder: "单据时间(全部)",
}
},
externalState: {
type: "string",
"x-component-props": {
placeholder: "外部状态",
style: {
width: 160
}
},
enum: []
},
}
},
sumbit: {
"x-component": 'Submit',
"x-mega-props": {
span: 1
},
"x-component-props": {
children: '查询'
}
}
}
}
}
}
import React, { useRef } from 'react';
import Table from '@/pages/transaction/components/TableLayout';
import { history } from 'umi';
import { Tag, Badge } from 'antd';
import { ColumnType } from 'antd/lib/table/interface';
import EyePreview from '@/components/EyePreview';
import moment from 'moment';
import { PublicApi } from '@/services/api';
import { OFFERSEARCHSCHEMA } from './schema';
import { EXTERNALSTATE_COLOR, INTERNALSTATE_COLOR } from '@/pages/transaction/components/stateColor';
const OfferSearch = () => {
const reload = useRef<any>({});
const format = (text, fmt?: string) => {
return <>{moment(text).format(fmt || "YYYY-MM-DD HH:mm:ss")}</>
}
const columns: ColumnType<any>[] = [
{
title: '报价单号',
key: 'quotationNo',
dataIndex: 'quotationNo',
render: (text: any, record: any) => <EyePreview
url={`/memberCenter/tranactionAbility/inquiryQuote/quoteOrder/quote/preview?id=${record.id}`}>{text}</EyePreview>
},
{
title: '询价单号',
key: 'inquiryListNo',
dataIndex: 'inquiryListNo',
render: (text: any, record: any) => <EyePreview
url={`/memberCenter/tranactionAbility/inquiryQuote/quoteOrder/rfq/preview?id=${record.inquiryListId}`}>{text}</EyePreview>
},
{
title: '报价单摘要',
key: 'details',
dataIndex: 'details',
},
{
title: '询价会员',
key: 'memberName',
dataIndex: 'memberName',
},
{
title: '报价截止时间',
key: 'quotationAsTime',
dataIndex: 'quotationAsTime',
render: (text: any, record: any) => format(text)
},
{
title: '单据时间',
key: 'voucherTime',
dataIndex: 'voucherTime',
render: (text: any, record: any) => format(text)
},
{
title: '外部状态',
key: 'externalState',
dataIndex: 'externalState',
render: (text: any, record: any) => <Tag color={EXTERNALSTATE_COLOR[text]}>{record.externalStateName}</Tag>
},
{
title: '内部状态',
key: 'interiorState',
dataIndex: 'interiorState',
render: (text: any, record: any) => <Badge status={INTERNALSTATE_COLOR[text]} text={record.interiorStateName} />
},
];
return (
<Table
schema={OFFERSEARCHSCHEMA}
columns={columns}
effects="quotationNo"
fetch={PublicApi.getTransactionProductQuotationList}
reload={reload}
externalStatusFetch={PublicApi.getTransactionProductInquiryExternalStateEnum({ type: '2' })}
interiorStatusFetch={PublicApi.getTransactionProductInquiryInteriorStateEnum({ type: '2' })}
/>
)
}
export default OfferSearch
import { ISchema } from "@formily/antd";
import { FORM_FILTER_PATH } from "@/formSchema/const";
export const OFFERSEARCHSCHEMA: ISchema = {
type: "object",
properties: {
megalayout: {
type: "object",
"x-component": "mega-layout",
properties: {
quotationNo: {
type: "string",
"x-component": "Search",
"x-mega-props": {
},
"x-component-props": {
placeholder: "报价单号",
align: "flex-left",
}
}
}
},
[FORM_FILTER_PATH]: {
type: "object",
"x-component": "flex-layout",
"x-component-props": {
rowStyle: {
justifyContent: "flex-start",
flexWrap: "nowrap"
},
colStyle: {//改变间隔
marginRight: 20
}
},
properties: {
PRO_LAYOUT: {
type: "object",
"x-component": "mega-layout",
"x-mega-props": {
span: 5
},
"x-component-props": {
inline: true
},
properties: {
inquiryListNo: {
type: "string",
"x-component-props": {
placeholder: "询价单号"
}
},
memberName: {
type: "string",
"x-component-props": {
placeholder: "询价会员"
}
},
details: {
type: "string",
"x-component-props": {
placeholder: "报价单摘要"
}
},
"[startDocumentsTime,endDocumentsTime]": {
type: "string",
"x-component": "dateSelect",
"x-component-props": {
placeholder: "单据时间(全部)",
}
},
externalState: {
type: "string",
"x-component-props": {
placeholder: "外部状态",
style: {
width: 160
}
},
enum: []
},
interiorState: {
type: "string",
"x-component-props": {
placeholder: "内部状态",
style: {
width: 160
}
},
enum: []
},
}
},
sumbit: {
"x-component": "Submit",
"x-mega-props": {
span: 1
},
"x-component-props": {
children: "查询"
}
}
}
}
}
}
import React, { useRef, useState } from 'react';
import Table from '@/pages/transaction/components/TableLayout';
import { history } from 'umi';
import { ColumnType } from 'antd/lib/table/interface';
import EyePreview from '@/components/EyePreview';
import moment from 'moment'
import { PublicApi } from '@/services/api';
import { Row, Col, Space, Button, Popconfirm, Tag, Badge } from 'antd';
import { DeleteOutlined, PlusOutlined } from '@ant-design/icons';
import { WAITADDOFFERSCHEMA } from './schema';
import { EXTERNALSTATE_COLOR, INTERNALSTATE_COLOR } from '@/pages/transaction/components/stateColor';
const WaitAddOffer = () => {
const reload = useRef<any>({});
const format = (text, fmt?: string) => {
return <>{moment(text).format(fmt || "YYYY-MM-DD HH:mm:ss")}</>
}
const [rowkeys, setRowKeys] = useState<Array<number>>([]);
/** 批量审核 */
const fetchSubmitBatch = async (id?: number) => {
let res = null;
if (id) {
res = await PublicApi.postTransactionProductQuotationtSubmit({ id: Number(id) })
} else {
res = await PublicApi.postTransactionProductQuotationtAll({ ids: rowkeys });
}
if (res.code === 1000) {
reload.current.reload();
setRowKeys([])
}
}
/**
* 删除或批量删除
* @type: 1: 单个删除, 2: 批量删除
* */
const fetchDeleteBatch = async (id?: number) => {
let res = null;
if (id) {
res = await PublicApi.postTransactionProductQuotationDelete({ id });
} else {
res = await PublicApi.postTransactionProductQuotationDeleteAll({ ids: rowkeys });
}
if (res.code === 1000) {
reload.current.reload();
setRowKeys([])
}
}
const columns: ColumnType<any>[] = [
{
title: '报价单号',
key: 'quotationNo',
dataIndex: 'quotationNo',
render: (text: any, record: any) => <EyePreview
url={`/memberCenter/tranactionAbility/inquiryQuote/addInquiryOrder/quote/preview?id=${record.id}`}>{text}</EyePreview>
},
{
title: '询价单号',
key: 'inquiryListNo',
dataIndex: 'inquiryListNo',
render: (text: any, record: any) => <EyePreview
url={`/memberCenter/tranactionAbility/inquiryQuote/addInquiryOrder/rfq/preview?id=${record.inquiryListId}`}>{text}</EyePreview>
},
{
title: '报价单摘要',
key: 'details',
dataIndex: 'details',
},
{
title: '询价会员',
key: 'memberName',
dataIndex: 'memberName',
},
{
title: '报价截止时间',
key: 'quotationAsTime',
dataIndex: 'quotationAsTime',
render: (text: any, record: any) => format(text)
},
{
title: '单据时间',
key: 'voucherTime',
dataIndex: 'voucherTime',
render: (text: any, record: any) => format(text)
},
{
title: '外部状态',
key: 'externalState',
dataIndex: 'externalState',
render: (text: any, record: any) => <Tag color={EXTERNALSTATE_COLOR[text]}>{record.externalStateName}</Tag>
},
{
title: '内部状态',
key: 'interiorState',
dataIndex: 'interiorState',
render: (text: any, record: any) => <Badge status={INTERNALSTATE_COLOR[text]} text={record.interiorStateName} />
},
{
title: '操作',
key: 'options',
width: 230,
dataIndex: 'options',
render: (text: any, record: any) => {
console.log(record.interiorState)
return (
<>
{(record.interiorState !== 5 && record.interiorState !== 6) && <Button type='link' onClick={() => fetchSubmitBatch(record.id)}>提交审核</Button>}
<Button type="link" onClick={() => history.push(`/memberCenter/tranactionAbility/inquiryQuote/addInquiryOrder/edit?id=${record.id}`)}>修改</Button>
{(record.interiorState !== 5 && record.interiorState !== 6) &&
<Popconfirm
destroyTooltipOnHide
title="确定要删除吗?"
okText="是"
cancelText="否"
onConfirm={() => fetchDeleteBatch(record.id)}
>
<Button type="link">删除</Button>
</Popconfirm>
}
</>
)
}
}
]
return (
<Table
selectedRow
reload={reload}
schema={WAITADDOFFERSCHEMA}
columns={columns}
effects="quotationNo"
fetch={PublicApi.getTransactionStayProductQuotationList}
externalStatusFetch={PublicApi.getTransactionProductInquiryExternalStateEnum({ type: '2' })}
interiorStatusFetch={PublicApi.getTransactionProductInquiryInteriorStateEnum({ type: '2' })}
fetchRowkeys={(e) => setRowKeys(e)}
controllerBtns={
<Row>
<Col span={24}>
<Space direction="horizontal" size={16}>
<Button
type="primary"
icon={<PlusOutlined />}
onClick={() => history.push(`/memberCenter/tranactionAbility/inquiryQuote/addInquiryOrder/add`)}
>
新建
</Button>
<Button
onClick={() => fetchSubmitBatch()}
disabled={rowkeys.length === 0}
>
批量提交审核
</Button>
<Button
icon={<DeleteOutlined />}
onClick={() => fetchDeleteBatch()}
disabled={rowkeys.length === 0}
>
批量删除
</Button>
</Space>
</Col>
</Row>
}
/>
)
}
export default WaitAddOffer
import { ISchema } from "@formily/antd";
import { FORM_FILTER_PATH } from "@/formSchema/const";
export const WAITADDOFFERSCHEMA: ISchema = {
type: "object",
properties: {
megalayout: {
type: "object",
"x-component": "mega-layout",
"x-component-props": {
grid: true
},
properties: {
ctl: {
type: "object",
"x-component": "Children",
"x-component-props": {
children: "{{controllerBtns}}"
}
},
quotationNo: {//报价单号
type: "string",
"x-component": "Search",
"x-mega-props": {
},
"x-component-props": {
placeholder: "报价单号"
}
}
}
},
[FORM_FILTER_PATH]: {
type: "object",
"x-component": "flex-layout",
"x-component-props": {
rowStyle: {
flexWrap: "nowrap"
},
colStyle: {
marginLeft: 20
}
},
properties: {
PRO_LAYOUT: {
type: "object",
"x-component": "mega-layout",
"x-mega-props": {
span: 5
},
"x-component-props": {
inline: true
},
properties: {
inquiryListNo: {
type: "string",
"x-component-props": {
placeholder: "询价单号"
}
},
details: {
type: "string",
"x-component-props": {
placeholder: "报价单摘要"
}
},
memberName: {
type: "string",
"x-component-props": {
placeholder: "询价会员"
}
},
"[startDocumentsTime,endDocumentsTime]": {
type: "string",
"x-component": "dateSelect",
"x-component-props": {
placeholder: "单据时间(全部)",
}
},
externalState: {
type: "string",
"x-component-props": {
placeholder: "外部状态",
style: {
width: 160
}
},
enum: []
},
interiorState: {
type: "string",
"x-component-props": {
placeholder: "内部状态",
style: {
width: 160
}
},
enum: []
},
}
},
sumbit: {
"x-component": "Submit",
"x-mega-props": {
span: 1
},
"x-component-props": {
children: "查询"
}
}
}
}
}
}
import React, { useRef, useState } from 'react';
import Table from '@/pages/transaction/components/TableLayout';
import { history } from 'umi';
import { ColumnType } from 'antd/lib/table/interface';
import EyePreview from '@/components/EyePreview';
import moment from 'moment'
import { PublicApi } from '@/services/api';
import { Row, Col, Button, Tag, Badge } from 'antd';
import { WAITAUDITOFFERONESCHEMA } from './schema';
import { EXTERNALSTATE_COLOR, INTERNALSTATE_COLOR } from '@/pages/transaction/components/stateColor';
const WaitAuditOfferOne = () => {
const ref = useRef<any>({});
const format = (text, fmt?: string) => {
return <>{moment(text).format(fmt || "YYYY-MM-DD HH:mm:ss")}</>
}
const [rowkeys, setRowKeys] = useState<Array<number>>([]);
/** 批量审核 */
const fetchSubmitBatch = async () => {
const res = await PublicApi.postTransactionProductQuotationtAuditAll({ ids: rowkeys });
if (res.code === 1000) {
ref.current.reload();
setRowKeys([])
}
}
const columns: ColumnType<any>[] = [
{
title: '报价单号',
key: 'quotationNo',
dataIndex: 'quotationNo',
render: (text: any, record: any) => <EyePreview
url={`/memberCenter/tranactionAbility/inquiryQuote/pendingReviewOne/quote/preview?id=${record.id}`}>{text}</EyePreview>
},
{
title: '询价单号',
key: 'inquiryListNo',
dataIndex: 'inquiryListNo',
render: (text: any, record: any) => <EyePreview
url={`/memberCenter/tranactionAbility/inquiryQuote/pendingReviewOne/rfq/preview?id=${record.inquiryListId}`}>{text}</EyePreview>
},
{
title: '报价单摘要',
key: 'details',
dataIndex: 'details',
},
{
title: '询价会员',
key: 'memberName',
dataIndex: 'memberName',
},
{
title: '报价截止时间',
key: 'quotationAsTime',
dataIndex: 'quotationAsTime',
render: (text: any, record: any) => format(text)
},
{
title: '单据时间',
key: 'voucherTime',
dataIndex: 'voucherTime',
render: (text: any, record: any) => format(text)
},
{
title: '外部状态',
key: 'externalState',
dataIndex: 'externalState',
render: (text: any, record: any) => <Tag color={EXTERNALSTATE_COLOR[text]}>{record.externalStateName}</Tag>
},
{
title: '内部状态',
key: 'interiorState',
dataIndex: 'interiorState',
render: (text: any, record: any) => <Badge status={INTERNALSTATE_COLOR[text]} text={record.interiorStateName} />
},
{
title: '操作',
key: 'options',
dataIndex: 'options',
render: (text: any, record: any) => <Button type='link' disabled={record.interiorState === 1} onClick={() => history.push(`/memberCenter/tranactionAbility/inquiryQuote/pendingReviewTwo/quote/detail?id=${record.id}&page_type=2`)}>审核</Button>
},
]
return (
<Table
selectedRow
reload={ref}
schema={WAITAUDITOFFERONESCHEMA}
columns={columns}
effects="quotationNo"
fetch={PublicApi.getTransactionAuditProductQuotationList}
externalStatusFetch={PublicApi.getTransactionProductInquiryExternalStateEnum({ type: '2' })}
interiorStatusFetch={PublicApi.getTransactionProductInquiryInteriorStateEnum({ type: '2' })}
fetchRowkeys={(e) => setRowKeys(e)}
controllerBtns={
<Row>
<Col span={6}>
<Button
disabled={rowkeys.length === 0}
onClick={fetchSubmitBatch}
>
批量提交审核
</Button>
</Col>
</Row>
}
/>
)
}
export default WaitAuditOfferOne
import { ISchema } from "@formily/antd";
import { FORM_FILTER_PATH } from "@/formSchema/const";
export const WAITAUDITOFFERONESCHEMA: ISchema = {
type: "object",
properties: {
megalayout: {
type: "object",
"x-component": "mega-layout",
"x-component-props": {
grid: true
},
properties: {
ctl: {
type: "object",
"x-component": "Children",
"x-component-props": {
children: "{{controllerBtns}}"
}
},
quotationNo: {//报价单号
type: "string",
"x-component": "Search",
"x-mega-props": {
},
"x-component-props": {
placeholder: "报价单号"
}
}
}
},
[FORM_FILTER_PATH]: {
type: "object",
"x-component": "flex-layout",
"x-component-props": {
rowStyle: {
flexWrap: "nowrap"
},
colStyle: {
marginLeft: 20
}
},
properties: {
PRO_LAYOUT: {
type: "object",
"x-component": "mega-layout",
"x-mega-props": {
span: 5
},
"x-component-props": {
inline: true
},
properties: {
inquiryListNo: {
type: "string",
"x-component-props": {
placeholder: "询价单号"
}
},
details: {
type: "string",
"x-component-props": {
placeholder: "报价单摘要"
}
},
memberName: {
type: "string",
"x-component-props": {
placeholder: "询价会员"
}
},
"[startDocumentsTime,endDocumentsTime]": {
type: "string",
"x-component": "dateSelect",
"x-component-props": {
placeholder: "单据时间(全部)",
}
},
externalState: {
type: "string",
"x-component-props": {
placeholder: "外部状态",
style: {
width: 160
}
},
enum: []
},
interiorState: {
type: "string",
"x-component-props": {
placeholder: "内部状态",
style: {
width: 160
}
},
enum: []
},
}
},
sumbit: {
"x-component": "Submit",
"x-mega-props": {
span: 1
},
"x-component-props": {
children: "查询"
}
}
}
}
}
}
import React, { useRef, useState } from 'react';
import Table from '@/pages/transaction/components/TableLayout';
import { history } from 'umi';
import { ColumnType } from 'antd/lib/table/interface';
import EyePreview from '@/components/EyePreview';
import moment from 'moment'
import { PublicApi } from '@/services/api';
import { Row, Col, Button, Tag, Badge } from 'antd';
import { WAITADUITOFFERTWOSCHEMA } from './schema';
import { EXTERNALSTATE_COLOR, INTERNALSTATE_COLOR } from '@/pages/transaction/components/stateColor';
const WaitAuditOfferTwo = () => {
const ref = useRef<any>({});
const format = (text, fmt?: string) => {
return <>{moment(text).format(fmt || "YYYY-MM-DD HH:mm:ss")}</>
}
const [rowkeys, setRowKeys] = useState<Array<number>>([]);
/** 批量审核 */
const fetchSubmitBatch = async () => {
const res = await PublicApi.postTransactionProductQuotationtAuditAllTwo({ ids: rowkeys });
if (res.code === 1000) {
ref.current.reload();
setRowKeys([])
}
}
const columns: ColumnType<any>[] = [
{
title: '报价单号',
key: 'quotationNo',
dataIndex: 'quotationNo',
render: (text: any, record: any) => <EyePreview
url={`/memberCenter/tranactionAbility/inquiryQuote/pendingReviewTwo/quote/preview?id=${record.id}`}>{text}</EyePreview>
},
{
title: '询价单号',
key: 'inquiryListNo',
dataIndex: 'inquiryListNo',
render: (text: any, record: any) => <EyePreview
url={`/memberCenter/tranactionAbility/inquiryQuote/pendingReviewTwo/rfq/preview?id=${record.inquiryListId}`}>{text}</EyePreview>
},
{
title: '报价单摘要',
key: 'details',
dataIndex: 'details',
},
{
title: '询价会员',
key: 'memberName',
dataIndex: 'memberName',
},
{
title: '报价截止时间',
key: 'quotationAsTime',
dataIndex: 'quotationAsTime',
render: (text: any, record: any) => format(text)
},
{
title: '单据时间',
key: 'voucherTime',
dataIndex: 'voucherTime',
render: (text: any, record: any) => format(text)
},
{
title: '外部状态',
key: 'externalState',
dataIndex: 'externalState',
render: (text: any, record: any) => <Tag color={EXTERNALSTATE_COLOR[text]}>{record.externalStateName}</Tag>
},
{
title: '内部状态',
key: 'interiorState',
dataIndex: 'interiorState',
render: (text: any, record: any) => <Badge status={INTERNALSTATE_COLOR[text]} text={record.interiorStateName} />
},
{
title: '操作',
key: 'options',
dataIndex: 'options',
render: (text: any, record: any) => <Button type='link' disabled={record.interiorState === 1} onClick={() => history.push(`/memberCenter/tranactionAbility/inquiryQuote/pendingReviewTwo/quote/detail?id=${record.id}&page_type=3`)}>审核</Button>
},
]
return (
<Table
selectedRow
reload={ref}
schema={WAITADUITOFFERTWOSCHEMA}
columns={columns}
effects="quotationNo"
fetch={PublicApi.getTransactionAuditProductQuotationListTwo}
externalStatusFetch={PublicApi.getTransactionProductInquiryExternalStateEnum({ type: '2' })}
interiorStatusFetch={PublicApi.getTransactionProductInquiryInteriorStateEnum({ type: '2' })}
fetchRowkeys={(e) => setRowKeys(e)}
controllerBtns={
<Row>
<Col span={6}>
<Button
disabled={rowkeys.length === 0}
onClick={fetchSubmitBatch}
>
批量提交审核
</Button>
</Col>
</Row>
}
/>
)
}
export default WaitAuditOfferTwo
import { ISchema } from "@formily/antd";
import { FORM_FILTER_PATH } from "@/formSchema/const";
export const WAITADUITOFFERTWOSCHEMA: ISchema = {
type: "object",
properties: {
megalayout: {
type: "object",
"x-component": "mega-layout",
"x-component-props": {
grid: true
},
properties: {
ctl: {
type: "object",
"x-component": "Children",
"x-component-props": {
children: "{{controllerBtns}}"
}
},
quotationNo: {//报价单号
type: "string",
"x-component": "Search",
"x-mega-props": {
},
"x-component-props": {
placeholder: "报价单号"
}
}
}
},
[FORM_FILTER_PATH]: {
type: "object",
"x-component": "flex-layout",
"x-component-props": {
rowStyle: {
flexWrap: "nowrap"
},
colStyle: {
marginLeft: 20
}
},
properties: {
PRO_LAYOUT: {
type: "object",
"x-component": "mega-layout",
"x-mega-props": {
span: 5
},
"x-component-props": {
inline: true
},
properties: {
inquiryListNo: {
type: "string",
"x-component-props": {
placeholder: "询价单号"
}
},
details: {
type: "string",
"x-component-props": {
placeholder: "报价单摘要"
}
},
memberName: {
type: "string",
"x-component-props": {
placeholder: "询价会员"
}
},
"[startDocumentsTime,endDocumentsTime]": {
type: "string",
"x-component": "dateSelect",
"x-component-props": {
placeholder: "单据时间(全部)",
}
},
externalState: {
type: "string",
"x-component-props": {
placeholder: "外部状态",
style: {
width: 160
}
},
enum: []
},
interiorState: {
type: "string",
"x-component-props": {
placeholder: "内部状态",
style: {
width: 160
}
},
enum: []
},
}
},
sumbit: {
"x-component": "Submit",
"x-mega-props": {
span: 1
},
"x-component-props": {
children: "查询"
}
}
}
}
}
}
import React, { useRef, useState } from 'react';
import Table from '@/pages/transaction/components/TableLayout';
import { ColumnType } from 'antd/lib/table/interface';
import EyePreview from '@/components/EyePreview';
import moment from 'moment'
import { PublicApi } from '@/services/api';
import { Row, Col, Button, Popconfirm, Tag, Badge } from 'antd';
import { WAITSUBMITOFFERSCHEMA } from './schema';
import { EXTERNALSTATE_COLOR, INTERNALSTATE_COLOR } from '@/pages/transaction/components/stateColor';
const WaitSubmitOffer = () => {
const reload = useRef<any>({});
const format = (text, fmt?: string) => {
return <>{moment(text).format(fmt || "YYYY-MM-DD HH:mm:ss")}</>
}
const [rowkeys, setRowKeys] = useState<Array<number>>([]);
/** 批量审核 */
const fetchSubmitBatch = async (id?: number) => {
let res = null;
if (id) {
res = await PublicApi.postTransactionProductQuotationtToSubmit({ id: Number(id) })
} else {
res = await PublicApi.postTransactionProductQuotationtToSubmitAll({ ids: rowkeys });
}
if (res.code === 1000) {
reload.current.reload();
setRowKeys([])
}
}
const columns: ColumnType<any>[] = [
{
title: '报价单号',
key: 'quotationNo',
dataIndex: 'quotationNo',
render: (text: any, record: any) => <EyePreview
url={`/memberCenter/tranactionAbility/inquiryQuote/pendingSubmit/quote/preview?id=${record.id}`}>{text}</EyePreview>
},
{
title: '询价单号',
key: 'inquiryListNo',
dataIndex: 'inquiryListNo',
render: (text: any, record: any) => <EyePreview
url={`/memberCenter/tranactionAbility/inquiryQuote/pendingSubmit/rfq/preview?id=${record.inquiryListId}`}>{text}</EyePreview>
},
{
title: '报价单摘要',
key: 'details',
dataIndex: 'details',
},
{
title: '询价会员',
key: 'memberName',
dataIndex: 'memberName',
},
{
title: '报价截止时间',
key: 'quotationAsTime',
dataIndex: 'quotationAsTime',
render: (text: any, record: any) => format(text)
},
{
title: '单据时间',
key: 'voucherTime',
dataIndex: 'voucherTime',
render: (text: any, record: any) => format(text)
},
{
title: '外部状态',
key: 'externalState',
dataIndex: 'externalState',
render: (text: any, record: any) => <Tag color={EXTERNALSTATE_COLOR[text]}>{record.externalStateName}</Tag>
},
{
title: '内部状态',
key: 'interiorState',
dataIndex: 'interiorState',
render: (text: any, record: any) => <Badge status={INTERNALSTATE_COLOR[text]} text={record.interiorStateName} />
},
{
title: '操作',
key: 'options',
dataIndex: 'options',
render: (text: any, record: any) =>
<Popconfirm title="确定要提交吗?" okText="是" cancelText="否" onConfirm={() => fetchSubmitBatch(record.id)}>
<Button type='link'>提交报价单</Button>
</Popconfirm>
}
]
return (
<Table
selectedRow
reload={reload}
schema={WAITSUBMITOFFERSCHEMA}
columns={columns}
effects="quotationNo"
fetch={PublicApi.getTransactionToSubmitProductQuotationList}
fetchRowkeys={(e) => setRowKeys(e)}
controllerBtns={
<Row>
<Col span={6}>
<Button
disabled={rowkeys.length === 0}
onClick={() => fetchSubmitBatch()}
>
批量提交审核
</Button>
</Col>
</Row>
}
/>
)
}
export default WaitSubmitOffer
import { ISchema } from "@formily/antd";
import { FORM_FILTER_PATH } from "@/formSchema/const";
export const WAITSUBMITOFFERSCHEMA: ISchema = {
type: "object",
properties: {
megalayout: {
type: "object",
"x-component": "mega-layout",
"x-component-props": {
grid: true
},
properties: {
ctl: {
type: "object",
"x-component": "Children",
"x-component-props": {
children: "{{controllerBtns}}"
}
},
quotationNo: {//报价单号
type: "string",
"x-component": "Search",
"x-mega-props": {
},
"x-component-props": {
placeholder: "报价单号"
}
}
}
},
[FORM_FILTER_PATH]: {
type: "object",
"x-component": "flex-layout",
"x-component-props": {
rowStyle: {
flexWrap: "nowrap"
},
colStyle: {
marginLeft: 20
}
},
properties: {
PRO_LAYOUT: {
type: "object",
"x-component": "mega-layout",
"x-mega-props": {
span: 5
},
"x-component-props": {
inline: true
},
properties: {
inquiryListNo: {
type: "string",
"x-component-props": {
placeholder: "询价单号"
}
},
details: {
type: "string",
"x-component-props": {
placeholder: "报价单摘要"
}
},
memberName: {
type: "string",
"x-component-props": {
placeholder: "询价会员"
}
},
"[startDocumentsTime,endDocumentsTime]": {
type: "string",
"x-component": "dateSelect",
"x-component-props": {
placeholder: "单据时间(全部)",
}
},
externalState: {
type: "string",
"x-component-props": {
placeholder: "外部状态",
style: {
width: 160
}
},
enum: []
},
interiorState: {
type: "string",
"x-component-props": {
placeholder: "内部状态",
style: {
width: 160
}
},
enum: []
},
}
},
sumbit: {
"x-component": "Submit",
"x-mega-props": {
span: 1
},
"x-component-props": {
children: "查询"
}
}
}
}
}
}
import React, { Fragment, useEffect, useState } from 'react';
import { Button, Tag, Badge, Typography } from 'antd';
import { history } from 'umi';
import { ColumnType } from 'antd/lib/table/interface';
import PeripheralLayout from '@/pages/transaction/components/detailLayout';
import { Context } from '@/pages/transaction/components/detailLayout/components/context';
import moment from 'moment';
import { PublicApi } from '@/services/api';
import { CheckCircleOutlined, LinkOutlined } from '@ant-design/icons';
import { EXTERNALSTATE_COLOR, INTERNALSTATE_COLOR } from '@/pages/transaction/components/stateColor';
import ProgressLayout from '@/pages/transaction/components/detailLayout/components/progressLayout';
import BasicLayout from '@/pages/transaction/components/detailLayout/components/basicLayout';
import ListLayout from '@/pages/transaction/components/detailLayout/components/listLayout';
import GeneralLayout from '@/pages/transaction/components/detailLayout/components/GeneralLayout';
import RecordLyout from '@/pages/transaction/components/detailLayout/components/RecordLyout';
import ModalOperate from '@/pages/transaction/components/modalOperate';
const TABLINK = [
{ id: 'progressLayout', title: '流转进度' },
{ id: 'basicLayout', title: '基本信息' },
{ id: 'inquiryProductLayout', title: '询价商品' },
{ id: 'conditionLayout', title: '交易条件' },
{ id: 'fileLayout', title: '附件' },
{ id: 'recordLyout', title: '流转记录' },
]
const ProductInquiryDetail = () => {
const format = (text, fmt?: string) => {
return <>{moment(text).format(fmt || "YYYY-MM-DD HH:mm:ss")}</>
}
const {
query: {
id,
},
pathname,
} = history.location;
const [path] = useState(pathname.split('/')[pathname.split('/').length - 1]);
const [pathPci] = useState(pathname.split('/')[pathname.split('/').length - 2]);
const [dataSource, setDataSource] = useState<any>({});
const [basicEffect, setBasicEffect] = useState<any>([]);
const [conditionEffect, setConditionEffect] = useState<any>([]);
const [fileEffect, setFileEffect] = useState<any>([]);
const [visible, setVisible] = useState<boolean>(false);
const handleBasicEffect = (data: any) => {
setBasicEffect([
{
col: [
{ label: '询价单号', extra: data.inquiryListNo },
{ label: '询价摘要', extra: data.details },
]
},
{
col: [
{ label: '外部状态', extra: <Tag color={EXTERNALSTATE_COLOR[data.externalState] || 'default'}>{data.externalStateName}</Tag> },
{ label: '内部状态', extra: <Badge status={INTERNALSTATE_COLOR[data.interiorState] || 'default'} text={data.interiorStateName} /> },
]
},
{
col: [
{ label: '被询价会员', extra: data.memberName },
{ label: '单据时间', extra: format(data.voucherTime) },
]
},
])
}
const handleConditionEffect = (data: any) => {
setConditionEffect([
{
col: [
{ label: '交付日期', extra: format(data.deliveryTime) },
{ label: '交付地址', extra: data.fullAddress },
{ label: '报价截止时间', extra: format(data.quotationAsTime) },
]
},
{
col: [
{ label: '报价要求', extra: data.offer },
{ label: '付款方式', extra: data.paymentType },
{ label: '税费要求', extra: data.taxes },
]
},
{
col: [
{ label: '物流要求', extra: data.logistics },
{ label: '包装要求', extra: data.packRequire },
{ label: '其他要求', extra: data.otherRequire },
]
},
])
}
const handleFileEffect = (data: any) => {
setFileEffect([
{
col: [
{
label: '附件',
extra: <>
{data.enclosureUrls.map((item: any, index: number) => (
<Typography.Link
style={{ display: 'block', paddingBottom: '8px' }}
key={`link_${index + 1}`}
href={`/api/contract/contractTemplate/downloadContract?contractName=${item.name}&contractUrl=${item.url}`}
target="_blank"
>
<LinkOutlined />
{item.name}
</Typography.Link>
))}
</>
},
]
}
])
}
const fetchDataSource = async () => {
await PublicApi.getTransactionInquiryListDetails({ id }).then(res => {
if (res.code !== 1000) {
history.goBack();
return;
}
const { data } = res;
data.externalLogStates = [...data.externalInquiryListStateResponses];
data.interiorLogStates = [...data.interiorRequisitionFormStateResponses];
data.externalLogs = [...data.externalInquiryListLogResponses];
data.interiorLogs = [...data.interiorInquiryListLogResponses];
setDataSource(data);
handleBasicEffect(data);
handleConditionEffect(data);
handleFileEffect(data);
})
}
useEffect(() => {
fetchDataSource();
}, [])
const columns: ColumnType<any>[] = [
{
title: 'ID',
key: 'id',
dataIndex: 'id',
},
{
title: '商品名称',
key: 'productName',
dataIndex: 'productName',
},
{
title: '品类',
key: 'category',
dataIndex: 'category',
},
{
title: '品牌',
key: 'brand',
dataIndex: 'brand',
},
{
title: '单位',
key: 'unit',
dataIndex: 'unit',
},
{
title: '采购数量',
key: 'purchaseCount',
dataIndex: 'purchaseCount',
},
]
const fetchLink = () => {
let fetchSoure: any = null;
switch (pathPci) {
case 'waitAuditInquiryOne':
fetchSoure = PublicApi.postTransactionInquiryDocumentsReview
break;
case 'waitAuditInquiryTwo':
fetchSoure = PublicApi.postTransactionInquiryDocumentsReviewTwo
break;
}
return fetchSoure
}
return (
<Context.Provider value={dataSource}>
<PeripheralLayout
no={dataSource.inquiryListNo}
detail={dataSource.details}
tabLink={TABLINK}
effect={
<>
{path === 'detail'
&& (
<Button
onClick={() => setVisible(true)}
type='primary'
>
<CheckCircleOutlined />
单据审核
</Button>
)}
</>
}
components={
<Fragment>
<ProgressLayout />
<BasicLayout effect={basicEffect} />
<ListLayout
id={id}
anchor="inquiryProductLayout"
title="询价商品"
columns={columns}
fetch={PublicApi.getTransactionEnquiryProductList}
/>
<GeneralLayout
anchor="conditionLayout"
title="交易条件"
effect={conditionEffect}
/>
<GeneralLayout
anchor="fileLayout"
title="附件"
effect={fileEffect}
/>
<RecordLyout />
</Fragment>
}
/>
<ModalOperate
id={id}
title="单据审核"
modalType="audit"
visible={visible}
fetch={fetchLink()}
onCancel={() => setVisible(false)}
onOk={() => history.goBack()}
/>
</Context.Provider>
)
}
export default ProductInquiryDetail;
import React, { useRef } from 'react';
import Table from '@/pages/transaction/components/TableLayout';
import { Tag, Badge } from 'antd';
import { ColumnType } from 'antd/lib/table/interface';
import EyePreview from '@/components/EyePreview';
import moment from 'moment';
import { PublicApi } from '@/services/api';
import { INQUIRYSEARCHSCHEMA } from './schema';
import { EXTERNALSTATE_COLOR, INTERNALSTATE_COLOR } from '@/pages/transaction/components/stateColor';
const InquirySearch = () => {
const reload = useRef<any>({});
const format = (text, fmt?: string) => {
return <>{moment(text).format(fmt || "YYYY-MM-DD HH:mm:ss")}</>
}
const columns: ColumnType<any>[] = [
{
title: '询价单号',
key: 'inquiryListNo',
dataIndex: 'inquiryListNo',
render: (text: any, record: any) => <EyePreview
url={`/memberCenter/tranactionAbility/productInquiry/inquirySearch/preview?id=${record.id}`}>{text}</EyePreview>
},
{
title: '询价单摘要',
key: 'details',
dataIndex: 'details',
},
{
title: '被询价会员',
key: 'memberName',
dataIndex: 'memberName',
},
{
title: '交付日期',
key: 'deliveryTime',
dataIndex: 'deliveryTime',
render: (text: any) => format(text)
},
{
title: '报价截止时间',
key: 'quotationAsTime',
dataIndex: 'quotationAsTime',
render: (text: any) => format(text)
},
{
title: '单据时间',
key: 'voucherTime',
dataIndex: 'voucherTime',
render: (text: any) => format(text)
},
{
title: '外部状态',
key: 'externalState',
dataIndex: 'externalState',
render: (text: any, record: any) => <Tag color={EXTERNALSTATE_COLOR[text]}>{record.externalStateName}</Tag>
},
{
title: '内部状态',
key: 'interiorState',
dataIndex: 'interiorState',
render: (text: any, record: any) => <Badge status={INTERNALSTATE_COLOR[text]} text={record.interiorStateName} />
},
];
return (
<Table
schema={INQUIRYSEARCHSCHEMA}
columns={columns}
effects="inquiryListNo"
fetch={PublicApi.getTransactionInquiryAddList}
reload={reload}
externalStatusFetch={PublicApi.getTransactionProductInquiryExternalStateEnum({ type: '1' })}
interiorStatusFetch={PublicApi.getTransactionProductInquiryInteriorStateEnum({ type: '1' })}
/>
)
}
export default InquirySearch
import { ISchema } from "@formily/antd";
import { FORM_FILTER_PATH } from "@/formSchema/const";
export const INQUIRYSEARCHSCHEMA: ISchema = {
type: "object",
properties: {
megalayout: {
type: "object",
"x-component": "mega-layout",
properties: {
inquiryListNo: {
type: "string",
"x-component": "Search",
"x-mega-props": {},
"x-component-props": {
placeholder: "询价单号",
align: "flex-left",
}
}
}
},
[FORM_FILTER_PATH]: {
type: "object",
"x-component": "flex-layout",
"x-component-props": {
rowStyle: {
justifyContent: "flex-start",
flexWrap: "nowrap"
},
colStyle: {//改变间隔
marginRight: 20
}
},
properties: {
PRO_LAYOUT: {
type: "object",
"x-component": "mega-layout",
"x-mega-props": {
span: 5
},
"x-component-props": {
inline: true
},
properties: {
memberName: {
type: "string",
"x-component-props": {
placeholder: "被询价会员"
}
},
"[startDocumentsTime,endDocumentsTime]": {
type: "string",
"x-component": "dateSelect",
"x-component-props": {
placeholder: "单据时间(全部)",
}
},
externalState: {
type: "string",
"x-component-props": {
placeholder: "外部状态",
style: {
width: 160
}
},
enum: []
},
interiorState: {
type: "string",
"x-component-props": {
placeholder: "内部状态",
style: {
width: 160
}
},
enum: []
},
}
},
sumbit: {
"x-component": "Submit",
"x-mega-props": {
span: 1
},
"x-component-props": {
children: "查询"
}
}
}
}
}
}
/** 内部状态颜色 */
export const EXTERNALSTATE_COLOR = {
1: "default",
2: "default",
3: "default",
4: "success",
5: "error",
}
/** 外部状态颜色 */
export const INTERNALSTATE_COLOR = {
1: "default",
2: "default",
3: "default",
4: "default",
5: "success",
6: "error",
7: "error",
}
import React from 'react';
import AddForm from './addForm';
import { history } from 'umi';
const AddEnquiryOrder:React.FC<{}> = () => {
return(
<AddForm
type={1}
/>
)
}
export default AddEnquiryOrder;
\ No newline at end of file
import React, { useState, useRef, useEffect } from 'react';
import { history } from 'umi';
import { Button, Card, Tabs, message } from 'antd';
import { PageHeaderWrapper } from '@ant-design/pro-layout';
import ReutrnEle from '@/components/ReturnEle';
import BasicInfo from './components/basicInfo'; // 基本信息
import EnquiryGoods from './components/enquiryGoods'; // 询价商品
import TradingConditions from './components/tradingConditions'; // 交易条件
import Attached from './components/attached'; // 附件
import FlowRecord from './components/flowRecord'; // 流转记录
import { PublicApi } from '@/services/api'
const { TabPane } = Tabs;
export interface parmas {
id?: any,
type?: any, // 1. 新增, 2.编辑, 3.立即询价
spam_id?: any
}
const AddQuotes: React.FC<parmas> = (props) => {
const { id, type, spam_id } = props
const [count, setCount] = useState<string>('1');
const [member, setmember] = useState<any>({}); //存放用户信息
const [goodsList, setgoodsList] = useState([]); //存放商品
const basicInfoRef = useRef<any>({});
const tradingConditionsRef = useRef<any>({});
const [editData, setEditData] = useState<any>({});
const [address, setaddress] = useState<any>({});
const [enclosureUrls, setenclosureUrls] = useState<any>([]);
const [loading, setloading] = useState<boolean>(false);
const handleGetDetails = async () => {
await PublicApi.getTransactionInquiryListDetails({ id }).then((res: any) => {
if (res.code === 1000) {
setgoodsList(res.data.inquiryListProductRequests);
setenclosureUrls(res.data.enclosureUrls)
setEditData(res.data)
setmember({
name: res.data.memberName,
memberId: res.data.memberId,
memberRoleId: res.data.memberRoleId,
memberRoleName: res.data.memberRoleName
})
setaddress({
fullAddress: res.data.fullAddress,
fullAddressId: res.data.fullAddressId
})
sessionStorage.setItem('memberInfo', JSON.stringify({
memberId: res.data.memberId,
memberRoleId: res.data.memberRoleId,
}))
}
})
}
useEffect(() => {
if (id && type === 2) {
handleGetDetails();
setCount('3');
} else if (id && type === 3) {
const data = JSON.parse(sessionStorage.getItem(spam_id));
const inquiryGoods: any[] = [];
inquiryGoods.push({
commodityId: id,
productId: data.id,
productName: data.name,
category: data.category,
brand: data.brand.name,
unit: data.unitName,
purchaseCount: 1,
logistics: data.logistics,
memberId: data.memberId,
memberRoleId: data.memberRoleId
})
setgoodsList(inquiryGoods);
setmember({
name: data.memberName,
memberId: data.memberId,
memberRoleId: data.memberRoleId,
memberRoleName: data.memberRoleName
})
setEditData({
inquiryListProductRequests: inquiryGoods,
memberId: data.memberId,
roleId: data.memberRoleId,
memberName: data.memberName,
enclosureUrls: []
})
sessionStorage.setItem('memberInfo', JSON.stringify({
memberId: data.memberId,
memberRoleId: data.memberRoleId,
}))
}
}, [])
//提交
const onSumbit = async () => {
setloading(true);
const basicInfo = await basicInfoRef.current.validateFields();
const tradingConditions = await tradingConditionsRef.current.validateFields();
const basicInfoData = basicInfo.data;
const tradingConditionsData = tradingConditions.data;
if (!basicInfo.state || !tradingConditions.state) {
setloading(false);
return
}
if (basicInfo.state && tradingConditions.state) {
if (goodsList.length === 0) {
message.error('请添加一个询价商品!');
setloading(false);
return
}
const parmas = {
inquiryListProductRequests: goodsList, // 商品列表 ,InquiryListProductRequest
...basicInfoData,
...tradingConditionsData,
...address,
enclosureUrls,
memberName: member.name,
memberId: member.memberId,
memberRoleId: member.memberRoleId,
memberRoleName: member.memberRoleName
}
if (id && type === 2) {
parmas.id = editData.id;
parmas.interiorInquiryListLogResponses = editData.interiorInquiryListLogResponses;
parmas.externalInquiryListLogResponses = editData.externalInquiryListLogResponses;
await PublicApi.postTransactionInquiryListUpdate(parmas).then(res => {
if (res.code === 1000) {
history.goBack();
} else { setloading(false); }
})
} else {
await PublicApi.postTransactionInquiryListAdd(parmas).then(res => {
if (res.code === 1000) {
history.push('/memberCenter/tranactionAbility/goodsOffer/addEnquiryOrder');
} else { setloading(false); }
})
}
} else {
message.error('有必填字段没选择,请检查!');
setloading(false);
}
}
// 获取到会员信息
const getMemberList = (list: any) => {
setmember(list);
}
// 获取添加的商品列表
const getGoodsList = (list: any) => {
setgoodsList(list)
}
const handleClick = (key: string) => {
if (key === '3') {
setCount(key)
}
}
// 地址回调
const handleGetAddress = (value: any) => {
setaddress({
fullAddress: value.children,
fullAddressId: value.value
})
}
// 附件回调
const handleGetEnclosureUrls = (data: any) => {
setenclosureUrls(data);
}
return (
<PageHeaderWrapper
onBack={() => history.goBack()}
backIcon={<ReutrnEle description="返回" />}
extra={
<Button type="primary" onClick={onSumbit} loading={loading}> 保存</Button>
}
>
<Card>
<Tabs onTabClick={handleClick}>
<TabPane tab="基本信息" key="1" forceRender>
<BasicInfo
currentRef={basicInfoRef}
getMemberList={getMemberList}
editData={editData}
type={type}
/>
</TabPane>
<TabPane tab="询价商品" key="2" forceRender>
<EnquiryGoods
member={member}
getGoodsList={getGoodsList}
editData={editData}
type={type}
/>
</TabPane>
<TabPane tab="交易条件" key="3" forceRender>
<TradingConditions
currentRef={tradingConditionsRef}
editData={editData}
getAddress={handleGetAddress}
/>
</TabPane>
<TabPane tab="附件" key="4" forceRender>
<Attached
editData={editData}
handleGetEnclosureUrls={handleGetEnclosureUrls}
/>
</TabPane>
<TabPane tab="流转记录" key="5" forceRender>
<FlowRecord
editData={editData}
/>
</TabPane>
</Tabs>
</Card>
</PageHeaderWrapper>
)
}
export default AddQuotes
import React, { useState, useEffect } from 'react';
import { Form, Button, Upload, message } from 'antd';
import { UPLOAD_TYPE } from '@/constants'
import { UploadFile, UploadChangeParam } from 'antd/lib/upload/interface';
import styles from './index.less';
import { UploadOutlined, DeleteOutlined, LinkOutlined } from '@ant-design/icons';
const layout: any = {
colon: false,
labelCol: { style: { width: '174px' } },
wrapperCol: { span: 9 },
labelAlign: "left"
};
export interface parmas {
handleGetEnclosureUrls?: Function,
editData?: any
}
const Attached: React.FC<parmas> = (props) => {
const { handleGetEnclosureUrls, editData } = props;
const [files, setFiles] = useState([]);
const [loading, setloading] = useState(false);
/**判断文件类型和大小 */
const beforeDocUpload = (file: UploadFile) => {
const isLt20M = file.size / 1024 / 1024 < 20;
if (!isLt20M) {
message.error('上传文件大小不超过 20M!');
}
return isLt20M;
}
// 上传回调
const handleChange = ({ file }) => {
const arr: any = files;
setloading(true);
if (file.response) {
if (file.response.code === 1000) {
arr.push({
name: file.name,
url: file.response.data
})
setloading(false);
}
}
setFiles([...arr])
handleGetEnclosureUrls(arr);
}
// 删除附件
const removeFiles = (index: any) => {
const arr = [...files];
arr.splice(index, 1);
setFiles(arr);
handleGetEnclosureUrls(arr);
}
useEffect(() => {
if (Object.keys(editData).length > 0) {
setFiles(editData.enclosureUrls)
}
}, [editData])
return (
<Form
{...layout}
className={styles.revise_style}
>
<Form.Item label='附件' name='upload'>
<div className={styles.upload_data}>
{files.length > 0 && files.map((v, index) => (
<div key={index} className={styles.upload_item}>
<div className={styles.upload_left}>
<LinkOutlined />
<span>{v.name}</span>
</div>
<div className={styles.upload_right} onClick={() => removeFiles(index)}>
<DeleteOutlined />
</div>
</div>
))}
</div>
<Upload
action="/api/file/file/upload"
data={{ fileType: UPLOAD_TYPE }}
showUploadList={false}
accept='.doc,.docx,.pdf,.ppt,.pptx,.xls,.xlsx'
beforeUpload={beforeDocUpload}
onChange={handleChange}
>
<Button loading={loading} icon={<UploadOutlined />}>上传文件</Button>
<div style={{ marginTop: '8px' }}>一次上传一个文件,每个附件大小不能超过 20M</div>
</Upload>
</Form.Item>
</Form>
)
}
export default Attached;
\ No newline at end of file
This diff is collapsed.
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