Commit 52088727 authored by 前端-钟卫鹏's avatar 前端-钟卫鹏
parents f48b3497 6c478b5f
/*
* @Author: LeeJiancong
* @Date: 2020-07-31 19:56:22
* @LastEditors: jiaxin
* @LastEditors: XieZhiXiong
* @Copyright: 1549414730@qq.com
* @LastEditTime: 2020-09-21 18:32:55
* @LastEditTime: 2020-09-23 09:35:27
*/
const TranactionRoute = {
......@@ -36,6 +36,18 @@ const TranactionRoute = {
path: '/memberCenter/tranactionAbility/electronicContracts/template',
name: 'template',
component: '@/pages/transaction/electronicContracts/template/index',
},
{
path: '/memberCenter/tranactionAbility/electronicContracts/enterpriseCertified',
name: 'enterpriseCertified',
hideInMenu: true,
component: '@/pages/transaction/electronicContracts/enterpriseCertified/index',
},
{
path: '/memberCenter/tranactionAbility/electronicContracts/personalCertified',
name: 'personalCertified',
hideInMenu: true,
component: '@/pages/transaction/electronicContracts/personalCertified/index',
}
]
},
......@@ -325,6 +337,39 @@ const TranactionRoute = {
hideInMenu: true,
component: '@/pages/transaction/transactionRules/addRule',
},
// 供应会员评价管理
{
path: '/memberCenter/tranactionAbility/supplierEvaluation',
name: 'supplierEvaluation',
routes: [
{
path: '/memberCenter/tranactionAbility/supplierEvaluation/unevaluated',
name: 'unevaluated',
component: '@/pages/transaction/supplierEvaluation/unevaluated',
},
{
path: '/memberCenter/tranactionAbility/supplierEvaluation/unevaluated/evaluate',
name: 'evaluate',
component: '@/pages/transaction/supplierEvaluation/unevaluated/evaluate',
hideInMenu: true,
},
{
path: '/memberCenter/tranactionAbility/supplierEvaluation/analysis',
name: 'analysis',
component: '@/pages/transaction/supplierEvaluation/analysis',
},
// {
// path: '/memberCenter/tranactionAbility/supplierEvaluation/received',
// name: 'received',
// component: '@/pages/transaction/supplierEvaluation/received',
// },
// {
// path: '/memberCenter/tranactionAbility/supplierEvaluation/sent',
// name: 'sent',
// component: '@/pages/transaction/supplierEvaluation/sent',
// },
],
},
]
}
......
.head {
display: flex;
align-items: center;
font-size: 20px;
font-weight: 500;
&-prefix {
width: 48px;
height: 48px;
line-height: 48px;
border-radius: 4px;
border: 1px solid #DFE1E6;
color: #fff;
text-align: center;
background-color: #8777D9;
}
&-name {
color: #172B4D;
margin: 0 8px 0 12px;
}
}
/*
* @Author: XieZhiXiong
* @Date: 2020-09-22 11:48:53
* @LastEditors: XieZhiXiong
* @LastEditTime: 2020-09-22 11:53:03
* @Description: 详情页头像与名字结合组件
*/
import React from 'react';
import styles from './index.less';
export interface AvatarWrapProps {
info: {
aloneTxt?: string, // 单独显示在头像中间的文件,不传的话从 name 从截取第一个字符
name: string,
level?: number,
};
extra?: React.ReactNode;
};
const AvatarWrap: React.FC<AvatarWrapProps> = ({ info = {}, extra }) => (
<div className={styles.head}>
<div className={styles['head-prefix']}>
{
info.aloneTxt ?
info.aloneTxt :
info.name && info.name.length ?
info.name[0] :
''
}
</div>
<div className={styles['head-name']}>
{info.name || ''}
</div>
{extra}
</div>
);
export default AvatarWrap;
\ No newline at end of file
......@@ -2,7 +2,7 @@
* @Author: XieZhiXiong
* @Date: 2020-08-26 17:32:45
* @LastEditors: XieZhiXiong
* @LastEditTime: 2020-08-26 17:33:28
* @LastEditTime: 2020-09-22 20:54:42
* @Description: 基于 antd Card 封装的适合项目 UI 的 Card,使用方式跟 antd Card 一样,这里只是修改了样式
*/
import React from 'react';
......@@ -19,8 +19,8 @@ const MellowCard: React.FC<MellowCardProps> = props => {
const { children, blockClassName, ...rest } = props;
return (
<div className={cx(styles.mellow, blockClassName)}>
<Card {...rest}>
<div className={styles.mellow}>
<Card bordered={false} {...rest}>
{children}
</Card>
</div>
......
/*
* @Author: XieZhiXiong
* @Date: 2020-09-22 17:41:45
* @LastEditors: XieZhiXiong
* @LastEditTime: 2020-09-22 18:04:44
* @Description: 评价笑脸组件
*/
import React from 'react';
import {
SmileFilled,
MehFilled,
FrownFilled,
} from '@ant-design/icons';
interface MoodProps {
type: 'smile' | 'notBad' | 'sad';
};
const Mood: React.FC<MoodProps> = ({ type = 'smile' }) => {
let node = null;
switch (type) {
case 'smile':
node = <><SmileFilled style={{ color: '#41CC9E', marginRight: 4 }} /></>;
break;
case 'notBad':
node = <><MehFilled style={{ color: '#FFC400', marginRight: 4 }} /></>;
break;
case 'sad':
node = <><FrownFilled style={{ color: '#EF6260', marginRight: 4 }} /></>;
break;
default:
break;
}
return node;
};
export default Mood;
\ No newline at end of file
import React, { useState } from 'react';
import { Input, Space, Button } from 'antd';
import { Input, Space, Button, Tooltip } from 'antd';
import { CaretUpOutlined, CaretDownOutlined } from '@ant-design/icons';
import { useFieldState, FormPath, FormEffectHooks } from '@formily/antd';
import { FORM_FILTER_PATH } from '@/formSchema/const';
......@@ -15,7 +15,12 @@ const Search = props => {
const [state, setState] = useFieldState({
filterSearch: false,
});
const { align, advanced = true, ...rest } = props.props['x-component-props'];
const {
align,
advanced = true, // 是否展示高级筛选
tip, // 搜索框悬浮提示
...rest
} = props.props['x-component-props'];
const justifyAlign = align || 'flex-end';
const changeFilterVisible = () => {
......@@ -31,15 +36,17 @@ const Search = props => {
};
return (
<Space size={20} style={{ justifyContent: justifyAlign, width: '100%' }}>
<Input.Search
value={props.value || ''}
onChange={e => props.mutators.change(e.target.value)}
onSearch={(_, e) => {
e.preventDefault();
props.form.submit();
}}
{...rest}
/>
<Tooltip title={tip}>
<Input.Search
value={props.value || ''}
onChange={e => props.mutators.change(e.target.value)}
onSearch={(_, e) => {
e.preventDefault();
props.form.submit();
}}
{...rest}
/>
</Tooltip>
{advanced && (
<Button onClick={changeFilterVisible}>
高级筛选
......
import React from 'react';
import Mood from '@/components/Mood';
interface SmilingFaceProps {
value: number;
};
const SmilingFace: React.FC<SmilingFaceProps> = ({
value,
}) => {
let node = null;
switch (value) {
case 1:
case 2: {
node = (
<>
<Mood type="sad" />
<span>差评</span>
</>
);
break;
}
case 3: {
node = (
<>
<Mood type="notBad" />
<span>中评</span>
</>
);
break;
}
case 4:
case 5: {
node = (
<>
<Mood type="smile" />
<span>好评</span>
</>
);
break;
}
default:
break;
}
return node;
};
export default SmilingFace;
\ No newline at end of file
......@@ -24,7 +24,8 @@ import TableTagList from './components/TableTagList';
import './index.less'
import { Checkbox, Radio } from '@formily/antd-components';
import DateSelect from './components/DateSelect';
import VirtualChildren from './components/VirtualChildren'
import VirtualChildren from './components/VirtualChildren';
import SmilingFace from './components/SmilingFace';
import { useLinkComponentProps } from './linkages/linkComponentProps';
import Loading from '../Loading';
......@@ -95,7 +96,8 @@ export const componentExport = {
DateRangePicker: DatePicker.RangePicker,
TableTagList,
DateSelect,
VirtualChildren,
VirtualChildren,
SmilingFace,
RadioGroup: Radio.Group
}
const NiceForm: React.FC<NiceFormProps> = props => {
......
.tag {
line-height: 22px;
padding: 0 8px;
font-size: 14px;
font-weight: 400;
color: #00B37A;
background: #EBF7F2;
border-radius: 4px;
&__success {
color: #00B37A;
background: #EBF7F2;
}
&__warnning {
color: #FF991F;
background: #FFFAE6;
}
&__default {
color: #42526E;
background: #F4F5F7;
}
&__danger {
color: #E63F3B;
background: #FFEBE6;
}
&__primary {
color: #3F7ED2;
background: #F0F8FF;
}
}
\ No newline at end of file
/*
* @Author: XieZhiXiong
* @Date: 2020-08-31 17:52:14
* @LastEditors: XieZhiXiong
* @LastEditTime: 2020-08-31 18:59:18
* @Description: 状态 tag
*/
import React from 'react';
import classNames from 'classnames';
import styles from './index.less';
interface StatusTagProps {
type: 'success' | 'warnning' | 'default' | 'danger' | 'primary';
title: string;
};
const StatusTag: React.FC<StatusTagProps> = ({ type, title }) => {
const cls = classNames(styles.tag, styles[`tag__${type}`]);
return (
<span className={cls}>{title}</span>
);
};
export default StatusTag;
\ No newline at end of file
......@@ -141,7 +141,7 @@ const BasicLayout: React.FC<BasicLayoutProps> = (props) => {
)}
collapsed={collapsed}
onCollapse={handleMenuCollapse}
disableContentMargin={currentRouter.noMargin !== undefined}
disableContentMargin={currentRouter?.noMargin !== undefined}
breadcrumbRender={(routers = []) => [
]}
......
......@@ -5,8 +5,8 @@ import { getAuth, setAuth, setRouters } from '@/utils/auth';
import { PublicApi } from '@/services/api';
interface MemberRole {
memberRoleId: number;
memberRoleName: string;
memberRoleId: number;
memberRoleName: string;
};
const Roles: React.FC = () => {
......@@ -14,12 +14,12 @@ const Roles: React.FC = () => {
const [roles, setRoles] = useState<MemberRole[]>([]);
useEffect(() => {
const userInfo = getAuth();
setRoles(userInfo.roles || []);
const userInfo = getAuth() || {};
setRoles(userInfo.roles || []);
if (userInfo.roles && userInfo.roles.length) {
const current = userInfo.roles.find(item => item.memberRoleId === userInfo.memberRoleId);
setCurRole(current);
setCurRole(current);
}
}, []);
......@@ -30,19 +30,19 @@ const Roles: React.FC = () => {
}
const msg = message.loading({
content: '正在切换角色...',
duration: 0,
content: '正在切换角色...',
duration: 0,
});
PublicApi.postMemberLoginSwitchrole({
memberRoleId,
memberRoleId,
}).then(res => {
if (res.code !== 1000) {
return;
}
msg();
setAuth(res.data);
setRouters(res.data.urls);
setRouters(res.data.urls);
setTimeout(() => {
window.location.replace('/memberCenter/home');
}, 800);
......@@ -62,9 +62,9 @@ const Roles: React.FC = () => {
);
return (
<Dropdown
overlay={menuHeaderDropdown}
placement="bottomRight"
<Dropdown
overlay={menuHeaderDropdown}
placement="bottomRight"
>
<Space size={5} style={{ cursor: 'pointer', padding: '0 15px' }}>
{curRole?.memberRoleName}
......@@ -72,6 +72,6 @@ const Roles: React.FC = () => {
</Space>
</Dropdown>
)
};
};
export default Roles;
\ No newline at end of file
......@@ -2,7 +2,7 @@
* @Author: LeeJiancong
* @Date: 2020-07-13 14:08:50
* @LastEditors: jiaxin
* @LastEditTime: 2020-09-21 18:33:27
* @LastEditTime: 2020-09-22 16:35:11
*/
export default {
......@@ -116,6 +116,8 @@ export default {
//电子合同
'menu.tranactionAbility.electronicContracts': '电子合同',
'menu.tranactionAbility.electronicContracts.apply': '电子签章申请',
'menu.tranactionAbility.electronicContracts.enterpriseCertified': '企业信息核验',
'menu.tranactionAbility.electronicContracts.personalCertified': '个人信息核验',
'menu.tranactionAbility.electronicContracts.classSearch': '合同模板参数查询',
'menu.tranactionAbility.electronicContracts.template': '合同模板',
//进销存
......@@ -173,7 +175,13 @@ export default {
'menu.tranactionAbility.enquiryOffer.enquiryTwo': '待审核报价单(二级)',
'menu.tranactionAbility.enquiryOffer.toSubmit': '待提交报价单',
// 供应商评价
'menu.tranactionAbility.supplierEvaluation': '供应会员评价管理',
'menu.tranactionAbility.supplierEvaluation.unevaluated': '待评价订单',
'menu.tranactionAbility.supplierEvaluation.evaluate': '评价',
'menu.tranactionAbility.supplierEvaluation.analysis': '评价统计',
'menu.tranactionAbility.supplierEvaluation.received': '收到的评价',
'menu.tranactionAbility.supplierEvaluation.sent': '发出的评价',
//物流能力
'menu.logisticsAbility': '物流',
......
......@@ -42,6 +42,8 @@ const Order: React.FC<OrderPropsType> = (props) => {
const [selectAddressInfo, setSelectAddressInfo] = useState<GetLogisticsReceiverAddressGetResponse>()
const [selectInvoiceInfo, setSelectInvoiceInfo] = useState<any>()
const [logisticsFee, setLogisticsFee] = useState<number>(0)
const [isElectronicContract, setIsElectronicContract] = useState<boolean>(false) // 是否选用电子合同
const [contractInfo, setContractInfo] = useState()
useEffect(() => {
if (!spam_id) {
......@@ -75,12 +77,28 @@ const Order: React.FC<OrderPropsType> = (props) => {
item.orderList = tempOrderList
result.push(item)
}
const productId = sessionOrderInfo?.orderList[0]?.orderList[0].id
if (productId) {
try {
const rulesRes = await PublicApi.getOrderTradingRulesByProductId({ productId })
const { data } = rulesRes
if (data) {
// 是否选用电子合同
if (data.isElectronicContract) {
setIsElectronicContract(true)
}
}
} catch (error) {
console.log("获取交易规则失败")
}
}
setOrderList(result)
setOrderInfo(sessionOrderInfo)
setSpinningState(false)
}
const renderLogisticsInfo = (type, logisticsInfo) => {
switch (type) {
case 1:
......@@ -245,6 +263,7 @@ const Order: React.FC<OrderPropsType> = (props) => {
}
const checkOrder = () => {
message.destroy()
if (isEmpty(selectPayWay)) {
message.info('请选择支付方式')
return
......@@ -256,12 +275,17 @@ const Order: React.FC<OrderPropsType> = (props) => {
}
}
if (!needTheContract) {
if (isElectronicContract && !needTheContract) {
message.info('请先同意签订电子合同')
return
}
setSignModalVisible(true)
// submitOrder()
// 根据状态判断是否需要签订电子合同
if (isElectronicContract) {
setSignModalVisible(true)
} else {
submitOrder()
}
}
const handleSignModalConfirm = () => {
......@@ -287,7 +311,9 @@ const Order: React.FC<OrderPropsType> = (props) => {
<PayWay selectItem={selectPayWay} payWayList={orderInfo.payWayList} onChange={(val) => setSelectPayWay(val)} />
{/* <Delivery /> */}
<Invoice state={needTheInvoice} onChange={(val) => setNeedTheInvoice(val)} onSelect={(val) => setSelectInvoiceInfo(val)} />
<Contract state={needTheContract} onChange={(val) => setneedTheContract(val)} />
{
isElectronicContract && <Contract state={needTheContract} onChange={(val) => setneedTheContract(val)} />
}
<div className={styles.common_title}>
<span>订单信息</span>
</div>
......
......@@ -10,14 +10,12 @@ import {
} from 'antd';
import {
QuestionCircleOutlined,
SmileFilled,
MehFilled,
FrownFilled,
} from '@ant-design/icons';
import PolymericTable from '@/components/PolymericTable';
import { EditableColumns } from '@/components/PolymericTable/interface';
import { Pie } from '@/components/Charts';
import MellowCard from '@/components/MellowCard';
import Mood from '@/components/Mood';
import equity5 from '@/assets/imgs/equity-5.png';
import styles from './index.less';
......@@ -54,33 +52,6 @@ const ContentBox: React.FC<ContentBoxProps> = ({
</div>
);
interface MoodProps {
type: 'smile' | 'notBad' | 'sad';
};
const Mood: React.FC<MoodProps> = ({ type = 'smile' }) => {
let node = null;
switch (type) {
case 'smile':
node = <><SmileFilled style={{ color: '#41CC9E', marginRight: 4 }} /> 好评</>;
break;
case 'notBad':
node = <><MehFilled style={{ color: '#FFC400', marginRight: 4 }} /> 中评</>;
break;
case 'sad':
node = <><FrownFilled style={{ color: '#EF6260', marginRight: 4 }} /> 差评</>;
break;
default:
break;
}
return node;
};
const PAGE_SIZE = 5;
export interface BasicInfo {
......
......@@ -16,6 +16,7 @@ import {
DownOutlined,
} from '@ant-design/icons';
import { StandardTable } from 'god';
import moment from 'moment';
import { ColumnType } from 'antd/lib/table/interface';
import { createFormActions } from '@formily/antd';
import EyePreview from '@/components/EyePreview';
......@@ -41,8 +42,21 @@ import { MEMBER_OUTER_STATUS_TYPE, MEMBER_STATUS_TAG_MAP } from '../constant';
const formActions = createFormActions();
const fetchListData = async (params: any) => {
let res = await PublicApi.getMemberAbilitySubPage(params);
return res.data;
const { startDate = null, endDate = null } = params;
const payload = { ...params };
if (startDate) {
payload.startDate = moment(+startDate).format('YYYY-MM-DD');
}
if (endDate) {
payload.endDate = moment(+endDate).format('YYYY-MM-DD');
}
const res = await PublicApi.getMemberAbilitySubPage(payload);
if (res.code === 1000) {
return res.data;
}
return [];
};
const MemberMaintain: React.FC<[]> = () => {
......
......@@ -12,6 +12,7 @@ import {
DownOutlined,
} from '@ant-design/icons';
import { StandardTable } from 'god';
import moment from 'moment';
import { ColumnType } from 'antd/lib/table/interface';
import { createFormActions, FormEffectHooks } from '@formily/antd';
import { useStateFilterSearchLinkageEffect } from '@/formSchema/effects/useFilterSearch';
......@@ -38,8 +39,21 @@ import { coverColFiltersItem } from '../utils';
const formActions = createFormActions();
const fetchData = async (params: any) => {
let res = await PublicApi.getMemberAbilityMaintenancePage(params);
return res.data;
const { startDate = null, endDate = null } = params;
const payload = { ...params };
if (startDate) {
payload.startDate = moment(+startDate).format('YYYY-MM-DD');
}
if (endDate) {
payload.endDate = moment(+endDate).format('YYYY-MM-DD');
}
const res = await PublicApi.getMemberAbilityMaintenancePage(payload);
if (res.code === 1000) {
return res.data;
}
return [];
};
const MemberMaintain: React.FC<[]> = () => {
......
......@@ -3,6 +3,7 @@ import { history } from 'umi';
import { Card, Space, Button, Badge, Modal, message } from 'antd';
import { ClockCircleOutlined, QuestionCircleOutlined } from '@ant-design/icons';
import { StandardTable } from 'god';
import moment from 'moment';
import { ColumnType } from 'antd/lib/table/interface';
import { createFormActions } from '@formily/antd';
import EyePreview from '@/components/EyePreview';
......@@ -126,8 +127,22 @@ const MemberPr1: React.FC<{}> = props => {
};
const fetchListData = async (params: any) => {
let res = await PublicApi.getMemberAbilityValidateStep1Page(params);
return res.data;
const { startDate = null, endDate = null } = params;
const payload = { ...params };
if (startDate) {
payload.startDate = moment(+startDate).format('YYYY-MM-DD');
}
if (endDate) {
payload.endDate = moment(+endDate).format('YYYY-MM-DD');
}
const res = await PublicApi.getMemberAbilityValidateStep1Page(payload);
if (res.code === 1000) {
return res.data;
}
return [];
};
const handleBatch = () => {
......
......@@ -3,6 +3,7 @@ import { history } from 'umi';
import { Card, Space, Button, Badge, Modal, message } from 'antd';
import { ClockCircleOutlined, QuestionCircleOutlined } from '@ant-design/icons';
import { StandardTable } from 'god';
import moment from 'moment';
import { ColumnType } from 'antd/lib/table/interface';
import { createFormActions } from '@formily/antd';
import EyePreview from '@/components/EyePreview';
......@@ -126,8 +127,22 @@ const MemberPr2: React.FC<{}> = props => {
};
const fetchListData = async (params: any) => {
let res = await PublicApi.getMemberAbilityValidateStep2Page(params);
return res.data;
const { startDate = null, endDate = null } = params;
const payload = { ...params };
if (startDate) {
payload.startDate = moment(+startDate).format('YYYY-MM-DD');
}
if (endDate) {
payload.endDate = moment(+endDate).format('YYYY-MM-DD');
}
const res = await PublicApi.getMemberAbilityValidateStep2Page(payload);
if (res.code === 1000) {
return res.data;
}
return [];
};
const handleBatch = () => {
......
......@@ -3,6 +3,7 @@ import { history } from 'umi';
import { Card, Space, Button, Badge, Modal, message } from 'antd';
import { ClockCircleOutlined, QuestionCircleOutlined } from '@ant-design/icons';
import { StandardTable } from 'god';
import moment from 'moment';
import { ColumnType } from 'antd/lib/table/interface';
import { createFormActions } from '@formily/antd';
import EyePreview from '@/components/EyePreview';
......@@ -129,8 +130,22 @@ const MemberPrConfirm: React.FC<{}> = props => {
};
const fetchListData = async (params: any) => {
let res = await PublicApi.getMemberAbilityValidateConfirmPage(params);
return res.data;
const { startDate = null, endDate = null } = params;
const payload = { ...params };
if (startDate) {
payload.startDate = moment(+startDate).format('YYYY-MM-DD');
}
if (endDate) {
payload.endDate = moment(+endDate).format('YYYY-MM-DD');
}
const res = await PublicApi.getMemberAbilityValidateConfirmPage(payload);
if (res.code === 1000) {
return res.data;
}
return [];
};
const handleBatch = () => {
......
......@@ -3,6 +3,7 @@ import { history } from 'umi';
import { Card, Space, Button, Badge, Modal, message } from 'antd';
import { ClockCircleOutlined, QuestionCircleOutlined } from '@ant-design/icons';
import { StandardTable } from 'god';
import moment from 'moment';
import { ColumnType } from 'antd/lib/table/interface';
import { createFormActions } from '@formily/antd';
import EyePreview from '@/components/EyePreview';
......@@ -126,8 +127,22 @@ const MemberPrSubmit: React.FC<{}> = props => {
};
const fetchListData = async (params: any) => {
let res = await PublicApi.getMemberAbilityValidateCommitPage(params);
return res.data;
const { startDate = null, endDate = null } = params;
const payload = { ...params };
if (startDate) {
payload.startDate = moment(+startDate).format('YYYY-MM-DD');
}
if (endDate) {
payload.endDate = moment(+endDate).format('YYYY-MM-DD');
}
const res = await PublicApi.getMemberAbilityValidateCommitPage(payload);
if (res.code === 1000) {
return res.data;
}
return [];
};
const handleBatch = () => {
......
import React from 'react'
import cx from 'classnames'
import { Button, Pagination } from 'antd'
import { StarFilled } from '@ant-design/icons'
import shop_icon from '@/assets/imgs/shop_icon.png'
import credit_icon from '@/assets/imgs/credit_icon.png'
import styles from './index.less'
const Commodity: React.FC = () => {
let CommodityList = Array.apply({}, new Array(7))
return (
<div>
Commodity
</div>
<>
<div className={styles.commodity_list}>
{
CommodityList.map((item, index) => (
<div className={styles.commodity_list_item} key={`commodity_list_item_${index}`}>
<div className={cx(styles.commodity_list_item_item, styles.morehalf)}>
<div className={styles.shop_header_info}>
<div className={styles.shop_header_info_logo}>
<img src="https://shushangyun01.oss-cn-shenzhen.aliyuncs.com/69f3f329d5a848119dc89029a10acb081600332395671.jpg" />
</div>
<div className={styles.shop_header_info_content}>
<p className={styles.commodity_name}>0.8-1.0mm黑色手折纹胎水牛皮</p>
<ul className={styles.tags_list}>
<li className={styles.tags_list_item} key={`tags_list_item`}>黄牛头皮层自然摔纹</li>
<li className={styles.tags_list_item} key={`tags_list_item`}>硬度适中偏软</li>
<li className={styles.tags_list_item} key={`tags_list_item`}>手感舒适</li>
</ul>
</div>
</div>
</div>
<div className={cx(styles.commodity_list_item_item)}>
<div className={styles.shop_header_info_content_about_item}>
<i className={styles.icon}><img src={credit_icon} /></i>
<span>1288</span>
</div>
<div className={styles.commodity_shopname}>温州市龙昌皮业有限公司</div>
</div>
<div className={cx(styles.commodity_list_item_item)}>
{/* <div className={styles.commodity_price}>
<span>¥</span>
<label>79.00</label>
</div> */}
{/* <div className={styles.commodity_tag}>在线询价</div> */}
<div className={styles.commodity_point}>
2,000~3,000积分
</div>
</div>
<div className={cx(styles.commodity_list_item_item)}>
<span className={styles.date}>2020-10-25 10:58</span>
</div>
<div className={cx(styles.commodity_list_item_item)}>
<div className={styles.collection_state_wrap}>
<div className={cx(styles.collection_state)}>
<StarFilled />
<label>收藏</label>
</div>
<Button className={styles.collection_state_wrap_btn} type="primary">再次购买</Button>
</div>
</div>
</div>
))
}
</div>
<div className={styles.pagination_wrap}>
<Pagination showSizeChanger={false} defaultCurrent={1} total={100} />
</div>
</>
)
}
......
......@@ -152,6 +152,195 @@
}
}
.commodity_list {
&_item {
position: relative;
display: flex;
margin-bottom: 16px;
&_item {
flex: 1;
display: flex;
justify-content: center;
flex-direction: column;
.commodity_shopname {
color: #909399;
font-size: 12px;
margin-top: 4px;
}
.commodity_price {
color: #D32F2F;
}
.commodity_point {
color: #EA8000;
}
.commodity_tag {
width: 68px;
height: 24px;
line-height: 24px;
text-align: center;
background-color: #F0F8FF;
color: #3F7ED2;
font-size: 12px;
}
&.morehalf {
flex: 1.5;
}
.shop_header_info {
position: relative;
display: flex;
&_logo {
border-radius: 4px;
overflow: hidden;
width: 72px;
height: 72px;
margin-right: 16px;
&>img {
width: 72px;
height: 72px;
}
}
&_content {
position: relative;
display: flex;
flex-direction: column;
justify-content: center;
.commodity_name {
color: #303133;
margin-bottom: 4px;
max-width: 300px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.tags_list {
padding: 0;
margin: 0;
&_item {
display: inline-block;
list-style: none;
color: #999999;
font-size: 12px;
margin-right: 20px;
}
}
&_name {
font-size: 14px;
color: #333333;
font-weight: 500;
}
&_about {
display: flex;
margin-top: 10px;
&_item {
// flex: 1;
display: flex;
align-items: center;
margin-right: 16px;
&>span {
font-size: 14px;
color: #333333;
line-height: 20px;
&.red {
color: #D32F2F;
margin-right: 4px;
}
}
&>.icon {
position: relative;
top: -1px;
overflow: hidden;
margin-right: 5px;
&>img {
width: 20px;
height: 20px;
}
}
}
}
&_icon {
color: #cccccc;
font-size: 12px;
margin-left: 6px;
}
}
}
.date {
color: #909399;
font-size: 12px;
}
.collection_state_wrap {
display: flex;
align-items: center;
&_btn {
margin-left: 28px;
}
}
.collection_state {
font-size: 14px;
color: #00B37A;
cursor: pointer;
&>label {
margin-left: 4px;
cursor: pointer;
}
}
.rate_wrap {
font-size: 12px;
:global {
.ant-rate {
font-size: 14px;
}
}
}
.level_icon {
width: 54px;
height: 16px;
margin-bottom: 4px;
display: block;
background-size: 100% 100%;
background-repeat: no-repeat;
&.level3 {
background-image: url(/static/imgs/level2@2x.png);
}
}
}
}
}
.information_list {
&_item {
position: relative;
......
......@@ -15,7 +15,7 @@ const Collection: React.FC = () => {
return (
<PageHeaderWrapper>
<div className={styles.collection_wrap}>
<Tabs defaultActiveKey="information" className={styles.collection_tabs} >
<Tabs defaultActiveKey="commodity" className={styles.collection_tabs} >
<TabPane tab="商品收藏" key="commodity">
<Commodity />
</TabPane>
......
.apply_info {
.apply_status {
padding: 24px;
border-radius: 8px;
margin-bottom: 24px;
display: flex;
align-items: center;
.status {
color: #FFFFFF;
font-size: 16px;
width: 195px;
}
.apply_status_btn {
&>button {
&:first-child {
margin-right: 24px;
}
}
}
}
&>.apply_item {
padding: 24px;
border-radius: 8px;
background-color: #FFF;
:global {
.ant-descriptions-item-label {
color: #909399;
width: 200px;
}
}
}
}
\ No newline at end of file
import React from 'react'
import { PageHeaderWrapper } from '@ant-design/pro-layout';
import styles from './index.less'
import { Link } from 'umi';
import { PageHeaderWrapper } from '@ant-design/pro-layout'
import { ExclamationCircleFilled, CheckCircleFilled, ClockCircleFilled, CloseCircleFilled } from '@ant-design/icons';
import { Descriptions, Button } from 'antd';
import div from './../../../editor/configs/componentConfigs/HTML/div';
const Apply = () => {
/**头部状态的颜色值 */
const applyStaus = [{
status: 1,
name: '未申请',
icon: <ExclamationCircleFilled />,
color: '#6B778C',
}, {
status: 2,
name: '申请通过',
icon: <CheckCircleFilled />,
color: '#00B37A',
}, {
status: 3,
name: '申请中',
icon: <ClockCircleFilled />,
color: '#4279DF',
}, {
status: 4,
name: '申请不通过',
icon: <CloseCircleFilled />,
color: '#D32F2F',
}]
const num = 1
return (
<PageHeaderWrapper>
<div>123</div>
<div className={styles.apply_info}>
{
applyStaus.map(item => (
<div key={item.status}>
{
num === item.status &&
<div className={styles.apply_status} style={{ backgroundColor: item.color }}>
<div>
<div className={styles.status} style={{ opacity: .6, fontSize: '12px' }}>申请状态</div>
<div className={styles.status}>{item.icon} {item.name}</div>
</div>
<div className={styles.apply_status_btn}>
<Link to={`/memberCenter/tranactionAbility/electronicContracts/enterpriseCertified`}><Button size='middle' style={{ color: item.color }}>{item.status === 1 ? '立即申请' : '重新申请'}</Button></Link>
{item.status === 3 && <Button size='middle' ghost>查看进度</Button>}
</div>
</div>
}
</div>
))
}
<div className={styles.apply_item}>
<Descriptions title="申请信息" column={1}>
<Descriptions.Item label="公司名称">温州市隆昌皮业有限公司</Descriptions.Item>
<Descriptions.Item label="统一社会信用代码">4324324325425435</Descriptions.Item>
<Descriptions.Item label="法人姓名">张三</Descriptions.Item>
<Descriptions.Item label="法人手机号">+86 185 2929 6758</Descriptions.Item>
<Descriptions.Item label="法人身份证号">321023 19891205 3746</Descriptions.Item>
<Descriptions.Item label="认证方式">-</Descriptions.Item>
<Descriptions.Item label="验证方式">-</Descriptions.Item>
</Descriptions>
</div>
</div>
</PageHeaderWrapper>
)
}
......
import React from 'react'
import { PageHeaderWrapper } from '@ant-design/pro-layout';
import { Card, Row, Col, Input, Button } from 'antd';
import { ColumnType } from 'antd/lib/table/interface';
import { StandardTable } from 'god';
const ClassSearch = () => {
//表头
const columns: ColumnType<any>[] = [{
title: 'ID',
dataIndex: 'id',
width: '128px'
}, {
title: '参数名称',
dataIndex: 'name',
}, {
title: '参数描述',
dataIndex: 'describe',
}, {
title: '状态',
dataIndex: 'status',
}]
return (
<PageHeaderWrapper>
<div>123</div>
<Card>
<StandardTable
tableProps={{
rowKey: 'id',
}}
columns={columns}
controlRender={
<Row>
<Col span={12}>
<Input.Search
style={{ width: '256px',marginRight: '24px',marginBottom: '24px' }}
placeholder='搜索'
/>
<Button>重置</Button>
</Col>
</Row>
}
/>
</Card>
</PageHeaderWrapper>
)
}
......
import React from 'react'
import { Result } from 'antd'
import styles from '../index.less'
const Alipay = () => {
return(
<div className={styles.info_wrap}>
<Result
title="请使用法人手机号注册的支付宝账号登录支付"
extra={[
<div className={styles.info_wran}>并使用支付宝首页的扫一扫功能</div>,
<div className={styles.info_wran}>扫描下面的二维码,然后按照支付宝APP的</div>,
<div className={styles.alipay_qrcode} />,
<div><AlipayCircleOutlined />支付宝扫一扫</div>
]}
/>
</div>
)
}
export default Alipay
import React from 'react'
import { Button, Row, Col } from 'antd'
import styles from '../index.less'
import cx from 'classnames'
import { QuestionCircleOutlined } from '@ant-design/icons';
const Corporate = () => {
return(
<div className={styles.info_wrap}>
<div className={styles.info_item}>
<div className={styles.info_item_con}>
<div className={styles.item_con}>
<div className={styles.item_label}>认证方式 <QuestionCircleOutlined style={{color: '#C0C4CC'}} /></div>
<div className={styles.item_control}>
<Row className={styles.card_checkbox}>
<Col className={cx(styles.card_checkbox_item, styles.active)}>支付宝验证</Col>
<Col className={cx(styles.card_checkbox_item, styles.active)}>手机验证码验证</Col>
</Row>
</div>
</div>
<div className={styles.item_con}>
<div className={styles.item_label}></div>
<div className={styles.item_control}>
<Button type='primary'>下一步</Button>
<Button>上一步</Button>
</div>
</div>
</div>
</div>
</div>
)
}
export default Corporate
import React from 'react'
import styles from '../index.less'
import { Button, Row, Col } from 'antd'
import cx from 'classnames'
import { QuestionCircleOutlined } from '@ant-design/icons';
const EnterpriseInfoCheck = () => {
return (
<div className={styles.info_wrap}>
<div className={styles.info_item}>
<div className={styles.info_item_title}>企业信息核验</div>
<div className={styles.info_item_con}>
<div className={styles.item_con}>
<div className={styles.item_label}>公司名称:</div>
<div className={styles.item_control}>温州市隆昌皮业有限公司</div>
</div>
<div className={styles.item_con}>
<div className={styles.item_label}>统一社会信用代码:</div>
<div className={styles.item_control}>4324324325425435</div>
</div>
</div>
</div>
<div className={styles.info_item}>
<div className={styles.info_item_title}>法人信息核验</div>
<div className={styles.info_item_con}>
<div className={styles.item_con}>
<div className={styles.item_label}>法人姓名:</div>
<div className={styles.item_control}>张三</div>
</div>
<div className={styles.item_con}>
<div className={styles.item_label}>法人手机号:</div>
<div className={styles.item_control}>+86 185 2929 6758</div>
</div>
<div className={styles.item_con}>
<div className={styles.item_label}>法人身份证号:</div>
<div className={styles.item_control}>321023 19891205 3746</div>
</div>
</div>
</div>
<div className={cx(styles.info_item, styles.info_dashed)}>
<div className={styles.info_item_con}>
<div className={styles.item_con}>
<div className={styles.item_label}>认证方式 <QuestionCircleOutlined style={{color: '#C0C4CC'}} /></div>
<div className={styles.item_control}>
<Row className={styles.card_checkbox}>
<Col className={cx(styles.card_checkbox_item, styles.active)}>法人认证</Col>
<Col className={cx(styles.card_checkbox_item, styles.active)}>经办人认证</Col>
</Row>
</div>
</div>
<div className={styles.item_con}>
<div className={styles.item_label}></div>
<div className={styles.item_control}>
<Button type='primary'>下一步</Button>
</div>
</div>
</div>
</div>
</div>
)
}
export default EnterpriseInfoCheck
\ No newline at end of file
.info_wrap {
padding: 24px;
min-height: 668px;
border-top: #EEF0F3 solid 1px;
background-color: #FFFFFF;
:global {
.ant-result-icon {
display: none;
}
}
.info_wran {
color: #909399;
font-size: 14px;
padding-bottom: 8px;
}
.alipay_qrcode {
width: 240px;
height: 240px;
margin: 24px auto !important;
display: flex;
align-items: center;
justify-content: center;
border: 1px solid #EBECF0;
box-sizing: border-box;
}
.info_item {
.info_item_title {
position: relative;
padding: 12px 0px 12px 8px;
font-size: 14px;
color: #606266;
border-bottom: 1px solid #EEF0F3;
&::after {
content: '';
position: absolute;
left: 0;
top: 0;
bottom: 0;
margin: auto;
height: 16px;
width: 2px;
background-color: #00B37A;
}
}
.info_item_con {
padding: 12px 0px;
.item_con {
padding: 12px 0px;
display: flex;
font-size: 14px;
.item_label {
width: 176px;
color: #909399;
}
.item_control {
color: #303133;
button {
&:last-child {
margin-left: 24px;
}
}
}
}
}
.card_checkbox {
display: flex;
flex-wrap: wrap;
}
.card_checkbox_item {
min-width: 112px;
height: 32px;
margin-right: 32px;
margin-bottom: 16px;
border: 1px solid rgba(235, 236, 240, 1);
padding: 0 16px;
display: flex;
justify-content: center;
align-items: center;
cursor: pointer;
}
.card_checkbox_item.active {
border-color: #00B382;
position: relative;
color: #00B382;
}
.card_checkbox_item.active::after {
content: '';
position: absolute;
bottom: 0;
right: 0;
width: 0;
height: 0;
border: 6px solid transparent;
border-right: 6px solid #00B382;
border-bottom: 6px solid #00B382;
}
}
.info_dashed {
position: relative;
&::after {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
margin: auto;
width: 96%;
border-top: 1px dashed #EBECF0;
}
}
}
.step_info {
padding: 24px 128px;
background-color: #FAFBFC;
:global {
.ant-steps-item-finish {
.ant-steps-item-icon {
background-color: #00B37A;
.ant-steps-icon {
color: #FFFFFF;
}
}
}
.ant-steps-item-wait {
.ant-steps-item-icon {
background-color: #DFE1E6;
border-color: #DCDCDC;
.ant-steps-icon {
color: #606266;
}
}
}
}
}
\ No newline at end of file
import React from 'react'
import styles from './index.less'
import { Steps } from 'antd'
const { Step } = Steps;
const StepComponents = () => {
return (
<div className={styles.step_info}>
<Steps size="small" current={0}>
<Step title="企业信息核验" />
<Step title="经办人/法人认证" />
<Step title="企业认证" />
</Steps>
</div>
)
}
export default StepComponents
\ No newline at end of file
import React from 'react'
import { history } from 'umi'
import ReutrnEle from '@/components/ReturnEle';
import { PageHeaderWrapper } from '@ant-design/pro-layout';
import StepComponents from '../components/steps'
import EnterpriseInfoCheck from '../components/enterpriseInfoCheck'
import Corporate from '../components/Corporate'
import Alipay from '../components/Alipay'
const EnterpriseCertified = () => {
return (
<PageHeaderWrapper
onBack={() => history.goBack()}
backIcon={<ReutrnEle description="返回" />}
>
<StepComponents />
<EnterpriseInfoCheck />
<Corporate />
<Alipay />
</PageHeaderWrapper>
)
}
export default EnterpriseCertified
import React from 'react'
import { history } from 'umi'
import ReutrnEle from '@/components/ReturnEle';
import { PageHeaderWrapper } from '@ant-design/pro-layout';
const PersonalCertified = () => {
return (
<PageHeaderWrapper
onBack={() => history.goBack()}
backIcon={<ReutrnEle description="返回" />}
>
<div>123</div>
</PageHeaderWrapper>
)
}
export default PersonalCertified
\ No newline at end of file
import React from 'react'
import { PageHeaderWrapper } from '@ant-design/pro-layout';
import { Card, Row, Col, Input, Button } from 'antd';
import { ColumnType } from 'antd/lib/table/interface';
import { StandardTable } from 'god';
import EyePreview from '@/components/EyePreview';
import { PlusOutlined } from '@ant-design/icons';
const Template = () => {
//表头
const columns: ColumnType<any>[] = [{
title: 'ID',
dataIndex: 'id',
width: '128px'
}, {
title: '合同模板名称',
dataIndex: 'name',
render: (text: any, record: any) => {
return (
<EyePreview
url={`/memberCenter/tranactionAbility/stockSellStorage/addWarehouse?id=${record.id}&preview=1`}
>
名称
</EyePreview>
);
},
}, {
title: '版本号',
dataIndex: 'version',
}, {
title: '模板说明',
dataIndex: 'description',
}, {
title: '状态',
dataIndex: 'status',
sorter: (a, b) => a.state - b.state,
}, {
title: '操作',
dataIndex: 'action',
}]
return (
<PageHeaderWrapper>
<div>123</div>
<Card>
<StandardTable
tableProps={{
rowKey: 'id',
}}
columns={columns}
controlRender={
<Row justify='space-between'>
<Col>
<Button type='primary'><PlusOutlined />新增</Button>
</Col>
<Col>
<Input.Search
style={{ width: '256px',marginRight: '24px',marginBottom: '24px' }}
placeholder='搜索'
/>
<Button>重置</Button>
</Col>
</Row>
}
/>
</Card>
</PageHeaderWrapper>
)
}
......
......@@ -2,7 +2,7 @@
* @Author: XieZhiXiong
* @Date: 2020-09-16 15:16:47
* @LastEditors: XieZhiXiong
* @LastEditTime: 2020-09-21 11:58:49
* @LastEditTime: 2020-09-22 09:53:36
* @Description: 联动逻辑相关
*/
import { FormEffectHooks, FormPath } from '@formily/antd';
......@@ -24,6 +24,7 @@ import {
DOC_TYPE_RETURN_RECEIPT,
DOC_TYPE_EXCHANGE_INVOICE,
DOC_TYPE_EXCHANGE_RECEIPT,
PurchaseOrderInsideWorkStateTexts,
} from '@/constants';
import Search from '@/components/NiceForm/components/Search';
import Submit from '@/components/NiceForm/components/Submit';
......@@ -68,7 +69,8 @@ const orderColumns: any[] = [
{
title: '订单状态',
align: 'center',
dataIndex: 'externalState',
dataIndex: 'interiorState',
render: text => PurchaseOrderInsideWorkStateTexts[text],
},
];
......
......@@ -24,9 +24,20 @@ export const billsTypeDetailSchema: ISchema = {
title: '单据类型编号',
'x-component-props': {
placeholder: '最长10个字符',
maxLength: 5,
maxLength: 10,
},
required: true,
'x-rules': [
{
required: true,
message: '请输入单据类型编号',
},
{
validator: value => {
const CNReg = /[\u4E00-\u9FA5]/g;
return CNReg.test(value) ? '请输入非中文字符,可以是字母 + 数字 + 字符的组合' : '';
},
},
],
},
name: {
type: 'string',
......
......@@ -110,7 +110,16 @@ export const warehouseDetailSchema: ISchema = {
'x-component-props': {
label: '仓库名称',
wrapperCol: 24,
required: true,
'x-rules': [
{
required: true,
message: '请输入仓库名称',
},
{
limitByte: true, // 自定义校验规则
maxByte: 20,
}
],
},
properties: {
MEGA_LAYOUT1_1: {
......@@ -185,7 +194,13 @@ export const warehouseDetailSchema: ISchema = {
principal: {
type: 'string',
title: '仓库负责人',
'x-component-props': {},
'x-component-props': {},
'x-rules': [
{
limitByte: true, // 自定义校验规则
maxByte: 16,
}
],
},
MEGA_LAYOUT2: {
type: 'object',
......@@ -221,10 +236,6 @@ export const warehouseDetailSchema: ISchema = {
},
'x-rules': [
{
required: true,
message: '请输入你的手机号码',
},
{
pattern: PATTERN_MAPS.phone,
message: '请输入正确格式的手机号',
},
......
.tabs {
:global {
.ant-tabs-nav {
margin: 0 0 24px 0;
&::before {
border-bottom: none;
}
}
}
}
\ No newline at end of file
import React from 'react';
import { Tabs, Row, Col, Button } from 'antd';
import { createFormActions } from '@formily/antd';
import { PageHeaderWrapper } from '@ant-design/pro-layout';
import MellowCard from '@/components/MellowCard';
import PolymericTable from '@/components/PolymericTable';
import { EditableColumns } from '@/components/PolymericTable/interface';
import { Pie } from '@/components/Charts';
import Mood from '@/components/Mood';
import NiceForm from '@/components/NiceForm';
import { searchSchema } from './schema';
import Shelves from '../components/Shelves';
import RecordList from '../components/RecordList';
import styles from './index.less';
const { TabPane } = Tabs;
const receivedFormActions = createFormActions();
const sentFormActions = createFormActions();
const Analysis: React.FC = () => {
const evaluateColumns: EditableColumns[] = [
{
title: ' ',
dataIndex: 'title',
align: 'center',
},
{
title: '最近7天',
dataIndex: 'last7days',
align: 'center',
},
{
title: '最近30天',
dataIndex: 'last30days',
align: 'center',
},
{
title: '最近180天',
dataIndex: 'last180days',
align: 'center',
},
{
title: '180天前',
dataIndex: 'before180days',
align: 'center',
},
];
const evaluatePie = [
{
x: `好评 30%`,
y: 100,
},
{
x: `中评 20%`,
y: 50,
},
{
x: `差评 10%`,
y: 10,
},
];
const evaluate = [
{
id: 1,
title: (<Mood type="smile" />),
last7days: 10,
last30days: 20,
last180days: 30,
before180days: 30,
},
{
id: 2,
title: (<Mood type="notBad" />),
last7days: 10,
last30days: 20,
last180days: 30,
before180days: 30,
},
{
id: 3,
title: (<Mood type="sad" />),
last7days: 10,
last30days: 20,
last180days: 30,
before180days: 30,
},
];
return (
<PageHeaderWrapper>
<MellowCard
bodyStyle={{
padding: '0 24px 24px',
}}
>
<Tabs className={styles.tabs}>
<TabPane tab="概览" key="1">
<Shelves title="评价统计">
<Row gutter={24}>
<Col flex="399px">
<Pie
hasLegend
subTitle="累计评价"
total={() => evaluatePie.reduce((pre, now) => now.y + pre, 0)}
data={evaluatePie}
height={200}
colProps={{
span: 8,
}}
colors={['#41CC9E', '#FFC400', '#EF6260']}
/>
</Col>
<Col flex="auto">
<PolymericTable
dataSource={evaluate}
columns={evaluateColumns}
loading={false}
pagination={null}
rowClassName={() => styles['record-row']}
/>
</Col>
</Row>
</Shelves>
<Shelves title="评价记录">
<RecordList list={[]} />
<div
style={{
padding: '24px 0',
textAlign: 'center',
}}
>
<Button>查看更多评论</Button>
</div>
</Shelves>
</TabPane>
<TabPane tab="收到的评价" key="2">
<NiceForm
actions={receivedFormActions}
onSubmit={values => {}}
effects={($, actions) => {
}}
schema={searchSchema}
/>
<RecordList list={[]} />
</TabPane>
<TabPane tab="发出的评价" key="3">
<NiceForm
actions={sentFormActions}
onSubmit={values => {}}
effects={($, actions) => {
}}
schema={searchSchema}
/>
<RecordList list={[]} />
</TabPane>
</Tabs>
</MellowCard>
</PageHeaderWrapper>
);
};
export default Analysis;
\ No newline at end of file
/*
* @Author: XieZhiXiong
* @Date: 2020-09-22 20:34:49
* @LastEditors: XieZhiXiong
* @LastEditTime: 2020-09-22 20:52:53
* @Description:
*/
import { ISchema } from '@formily/antd';
export const searchSchema: ISchema = {
type: 'object',
properties: {
megaLayout: {
type: 'object',
'x-component': 'Mega-Layout',
'x-component-props': {
inline: true,
},
properties: {
star: {
type: 'string',
enum: [],
'x-component-props': {
placeholder: '评论星级',
allowClear: true,
style: {
width: 206,
},
},
},
'[startDate, endDate]': {
type: 'string',
default: '',
'x-component': 'dateSelect',
'x-component-props': {
placeholder: '交易时间',
allowClear: true,
style: {
width: 206,
},
},
},
name: {
type: 'string',
'x-component': 'Search',
'x-component-props': {
placeholder: '搜索',
align: 'flex-left',
advanced: false,
},
},
},
},
},
};
\ No newline at end of file
import React from 'react';
import {
Row,
Col,
Button,
} from 'antd';
import styled from 'styled-components';
import {
SchemaForm,
SchemaField,
SchemaMarkupField as Field
} from '@formily/antd';
import { ArrayList } from '@formily/react-shared-components';
import { toArr, isFn, FormPath } from '@formily/shared';
import SmilingFace from '@/components/NiceForm/components/SmilingFace';
const ArrayComponents = {
CircleButton: props => <Button {...props} />,
TextButton: props => <Button text {...props} />,
AdditionIcon: () => <div>+Add</div>,
RemoveIcon: () => <div>Remove</div>,
MoveDownIcon: () => <div>Down</div>,
MoveUpIcon: () => <div>Up</div>
};
const RowStyleLayout = styled(props => <div {...props} />)`
padding: 24px 64px 24px 24px;
background: #ffffff;
.ant-btn {
margin-right: 16px;
}
.ant-form-item {
display: flex;
margin-right: 16px;
margin-bottom: 16px;
}
> .ant-form-item {
margin-bottom: 0;
margin-right: 0;
}
.goodInfo {
display: flex;
align-items: align;
&-left {
flex-shrink: 0;
margin-right: 16px;
width: 100px;
height: 100px;
> img {
width: 100%;
height: 100%;
object-fit: cover;
}
}
&-right {
flex: 1;
display: flex;
flex-direction: column;
justify-content: center;
}
&-title {
line-height: 14px;
margin-bottom: 18px;
font-size: 14px;
font-weight: 400;
color: #303133;
}
&-desc {
line-height: 12px;
margin-bottom: 16px;
font-size: 12px;
font-weight: 400;
color: #909399;
}
&-price {
line-height: 14px;
font-size: 14px;
font-weight: 500;
color: #303133;
}
}
.main {
position: relative;
padding-left: 24px;
> .ant-form-item {
margin-bottom: 0;
margin-right: 0;
}
::after {
content: ' ';
display: block;
position: absolute;
top: 6%;
left: 0;
bottom: 6%;
border-left: 1px dashed #EEF0F3;
}
}
`;
const EvaluationList = props => {
const { value, schema, className, editable, path, mutators } = props;
const {
renderAddition,
renderRemove,
renderMoveDown,
renderMoveUp,
renderEmpty,
renderExtraOperations,
...componentProps
} = schema.getExtendsComponentProps() || {};
return (
<ArrayList
value={value}
minItems={schema.minItems}
maxItems={schema.maxItems}
editable={editable}
components={ArrayComponents}
>
{toArr(value).map((item, index) => {
return (
<RowStyleLayout {...componentProps} key={index}>
<Row align="middle">
<Col span={10}>
<div className="goodInfo">
<div className="goodInfo-left">
<img src={item.good ? item.good.pic : ''} />
</div>
<div className="goodInfo-right">
<div className="goodInfo-title">进口头层黄牛皮荔枝纹/红色/XL</div>
<div className="goodInfo-desc">20 平方英尺</div>
<div className="goodInfo-price">¥ 400.00</div>
</div>
</div>
</Col>
<Col span={10}>
<div className="main">
<SchemaField path={FormPath.parse(path).concat(index)} />
</div>
</Col>
<Col span={4}>
<div style={{ textAlign: 'right' }}>
<SmilingFace value={2} />
</div>
</Col>
</Row>
</RowStyleLayout>
)
})}
</ArrayList>
)
}
EvaluationList.isFieldComponent = true;
export default EvaluationList;
\ No newline at end of file
@import '../../../../../global/styles/utils.less';
.record {
padding: 0;
margin: 0;
&-item {
padding: 14px 16px;
line-height: 14px;
display: flex;
align-items: center;
background: #FAFBFC;
color: #303133;
&-good {
width: 25%;
&-name {
line-height: 14px;
margin-bottom: 13px;
font-size: 14px;
font-weight: 400;
}
&-price {
margin-right: 16px;
font-weight: 500;
}
&-desc {
line-height: 12px;
font-weight: 400;
color: #909399;
}
}
&-extra {
width: 20%;
&-item {
display: flex;
align-items: center;
&-label {
flex: 0 0 60px;
line-height: 12px;
font-size: 12px;
font-weight: 400;
color: #909399;
}
&-control {
flex: 1;
}
&:not(:last-child) {
margin-bottom: 13px;
}
}
}
&-comment {
width: 40%;
&-main {
margin-top: 6px;
line-height: 14px;
font-weight: 400;
color: #303133;
.textOverflow();
}
}
&-actions {
flex: 1;
text-align: center;
}
&:not(:last-child) {
margin-bottom: 16px;
}
}
}
\ No newline at end of file
import React from 'react';
import { Button, Rate } from 'antd';
import styles from './index.less';
interface RecordListProps {
list: [];
};
const RecordList: React.FC<RecordListProps> = () => {
return (
<ul className={styles.record}>
<li className={styles['record-item']}>
<div className={styles['record-item-good']}>
<div className={styles['record-item-good-name']}>
进口头层黄牛皮荔枝纹/红色/XL
</div>
<div>
<span className={styles['record-item-good-price']}>¥400.00</span>
<span className={styles['record-item-good-desc']}>20 平方英尺</span>
</div>
</div>
<div className={styles['record-item-extra']}>
<div className={styles['record-item-extra-item']}>
<div className={styles['record-item-extra-item-label']}>
交易时间:
</div>
<div className={styles['record-item-extra-item-control']}>
2020-05-20 17:09
</div>
</div>
<div className={styles['record-item-extra-item']}>
<div className={styles['record-item-extra-item-label']}>
评价方:
</div>
<div className={styles['record-item-extra-item-control']}>
温州龙昌手袋有限公司
</div>
</div>
</div>
<div className={styles['record-item-comment']}>
<Rate value={2} disabled />
<div className={styles['record-item-comment-main']}>
付款准时,合作愉快。付款准时,合作愉快。付款准时,合作愉快。付款准时,合作愉快。付款准时…
</div>
</div>
<div className={styles['record-item-actions']}>
<Button type="link">查看</Button>
</div>
</li>
</ul>
);
};
export default RecordList;
\ No newline at end of file
@import '../../../../../global/styles/index.less';
.shelves {
&-title {
line-height: 14px;
padding: 12px;
position: relative;
font-size: 14px;
font-weight: 400;
color: #606266;
border-bottom: 1px solid #EEF0F3;
&::after {
content: ' ';
display: block;
width: 2px;
position: absolute;
top: 30%;
left: 0;
bottom: 30%;
background: @primary-color;
}
}
&-content {
padding: 30px 0;
}
}
\ No newline at end of file
import React from 'react';
import styles from './index.less';
interface ShelvesProps {
title?: string;
children?: React.ReactNode;
};
const Shelves: React.FC<ShelvesProps> = ({
title = '标题',
children,
}) => {
return (
<div className={styles.shelves}>
<div className={styles['shelves-title']}>{title}</div>
<div className={styles['shelves-content']}>
{children}
</div>
</div>
);
};
export default Shelves;
\ No newline at end of file
import React from 'react';
import styles from './index.less';
const SupplierEvaluation: React.FC = () => {
return (
<div>123</div>
);
};
export default SupplierEvaluation;
\ No newline at end of file
import React from 'react';
import styles from './index.less';
const Received: React.FC = () => {
return (
<div>Received</div>
);
};
export default Received;
\ No newline at end of file
import React from 'react';
import styles from './index.less';
const Sent: React.FC = () => {
return (
<div>Sent</div>
);
};
export default Sent;
\ No newline at end of file
import React from 'react';
import {
PageHeader,
Descriptions,
Card,
Spin,
Button,
} from 'antd';
import { FormOutlined } from '@ant-design/icons';
import { PageHeaderWrapper } from '@ant-design/pro-layout';
import { history } from 'umi';
import { createFormActions } from '@formily/antd';
import { Rating } from '@formily/antd-components';
import AvatarWrap from '@/components/AvatarWrap';
import NiceForm from '@/components/NiceForm';
import { evaluateSchema } from './schema';
import EvaluationList from '../components/EvaluationList';
import styles from './evaluate.less';
const formActions = createFormActions();
const EvaluateOrder: React.FC = () => {
const handleSubmit = values => {
console.log('values', values);
};
return (
<PageHeaderWrapper
title={
<>
<PageHeader
style={{ padding: '0' }}
onBack={() => history.goBack()}
title={
<AvatarWrap
info={{
aloneTxt: '单',
name: '订单号:DPTY12'
}}
/>
}
extra={(
<>
<Button
type="primary"
icon={<FormOutlined />}
onClick={() => {}}
>
发布
</Button>
</>
)}
>
<Descriptions
size="small"
column={3}
style={{
padding: '0 32px',
}}
>
<Descriptions.Item label="采购会员">BPTY12</Descriptions.Item>
<Descriptions.Item label="下单时间" span={2}>2020-08-25 08:49</Descriptions.Item>
</Descriptions>
</PageHeader>
</>
}
>
<NiceForm
actions={formActions}
onSubmit={handleSubmit}
components={{
EvaluationList,
Rating,
}}
effects={($, actions) => {
}}
schema={evaluateSchema}
/>
</PageHeaderWrapper>
);
};
export default EvaluateOrder;
\ No newline at end of file
import React, { useState, useRef } from 'react';
import { Card, Badge, Button } from 'antd';
import { StandardTable } from 'god';
import { ColumnType } from 'antd/lib/table/interface';
import { PageHeaderWrapper } from '@ant-design/pro-layout';
import { createFormActions } from '@formily/antd';
import { useStateFilterSearchLinkageEffect } from '@/formSchema/effects/useFilterSearch';
import { FORM_FILTER_PATH } from '@/formSchema/const';
import { useAsyncInitSelect } from '@/formSchema/effects/useAsyncInitSelect';
import { Link } from 'umi';
import EyePreview from '@/components/EyePreview';
import NiceForm from '@/components/NiceForm';
import StatusTag from '@/components/StatusTag';
import { listSearchSchema } from './schema';
import styles from './index.less';
const formActions = createFormActions();
const mock = [
{
orderNo: 'DPTY12',
abstract: '进口头层黄牛皮荔枝纹',
member: '广州白马皮具交易有限公司',
created: '2020-09-22 11:16:00',
amount: '¥ 50,000.00',
orderType: '现货采购',
outerStatusName: '已完成',
innerStatusName: '已完成',
},
{
orderNo: 'DPTY13',
abstract: '进口头层黄牛皮荔枝纹',
member: '广州白马皮具交易有限公司',
created: '2020-09-22 11:16:00',
amount: '¥ 50,000.00',
orderType: '现货采购',
outerStatusName: '已完成',
innerStatusName: '已完成',
},
];
const Unevaluated: React.FC = () => {
const ref = useRef<any>({});
const defaultColumns: ColumnType<any>[] = [
{
title: '订单号',
dataIndex: 'orderNo',
align: 'center',
render: (text, record) => (
<EyePreview
url={``}
>
{text}
</EyePreview>
),
},
{
title: '订单摘要',
dataIndex: 'abstract',
align: 'center',
},
{
title: '采购会员',
dataIndex: 'member',
align: 'center',
render: (text, record) => <>{text}</>,
},
{
title: '下单时间',
dataIndex: 'created',
align: 'center',
render: (text, record) => <>{text}</>,
},
{
title: '订单总额',
dataIndex: 'amount',
align: 'center',
},
{
title: '订单类型',
dataIndex: 'orderType',
align: 'center',
},
{
title: '外部状态',
dataIndex: 'outerStatusName',
align: 'center',
filters: [],
onFilter: (value, record) => record.outerStatus === value,
render: (text, record) => (
<StatusTag type="warnning" title="已完成" />
),
},
{
title: '内部状态',
dataIndex: 'innerStatusName',
align: 'center',
filters: [],
onFilter: (value, record) => record.innerStatus === value,
render: (text, record) => <Badge color="#42526E" text="已完成" />,
},
{
title: '操作',
dataIndex: 'option',
align: 'center',
render: (text, record) => (
<>
<Link to={`/memberCenter/tranactionAbility/supplierEvaluation/unevaluated/evaluate`}>
<Button
type="link"
>
评价
</Button>
</Link>
</>
),
},
];
const [columns, setColumns] = useState<any[]>(defaultColumns);
const fetchListData = (params: any) => {
return Promise.resolve({
total: 2,
data: mock,
});
};
// 初始化高级筛选选项
const fetchSelectOptions = async () => {
return {};
};
return (
<PageHeaderWrapper>
<Card>
<StandardTable
tableProps={{
rowKey: 'orderNo',
}}
columns={columns}
currentRef={ref}
fetchTableData={(params: any) => fetchListData(params)}
controlRender={
<NiceForm
actions={formActions}
onSubmit={values => ref.current.reload(values)}
effects={($, actions) => {
useStateFilterSearchLinkageEffect(
$,
actions,
'name',
FORM_FILTER_PATH,
);
useAsyncInitSelect(
['innerStatus', 'outerStatus'],
fetchSelectOptions,
);
}}
schema={listSearchSchema}
/>
}
/>
</Card>
</PageHeaderWrapper>
);
};
export default Unevaluated;
\ No newline at end of file
import { ISchema } from '@formily/antd';
import { FORM_FILTER_PATH } from '@/formSchema/const';
export const listSearchSchema: ISchema = {
type: 'object',
properties: {
megaLayout: {
type: 'object',
'x-component': 'mega-layout',
properties: {
name: {
type: 'string',
'x-component': 'Search',
'x-component-props': {
placeholder: '搜索',
align: 'flex-left',
tip: '输入 订单号、订单摘要 进行搜索',
},
},
[FORM_FILTER_PATH]: {
type: 'object',
'x-component': 'mega-layout',
'x-component-props': {
grid: true,
full: true,
autoRow: true,
columns: 6,
},
properties: {
memberTypeId: {
type: 'string',
default: undefined,
'x-component-props': {
placeholder: '采购会员',
allowClear: true,
},
},
'[startDate, endDate]': {
type: 'string',
default: '',
'x-component': 'dateSelect',
'x-component-props': {
placeholder: '下单时间',
allowClear: true,
},
},
orderType: {
type: 'string',
default: undefined,
enum: [],
'x-component-props': {
placeholder: '订单类型',
allowClear: true,
},
},
outerStatus: {
type: 'string',
default: undefined,
enum: [],
'x-component-props': {
placeholder: '外部状态(全部)',
allowClear: true,
},
},
innerStatus: {
type: 'string',
default: undefined,
enum: [],
'x-component-props': {
placeholder: '内部状态(全部)',
allowClear: true,
},
},
submit: {
'x-component': 'Submit',
'x-mega-props': {
span: 1,
},
'x-component-props': {
children: '查询',
},
},
},
},
},
},
},
};
export const evaluateSchema: ISchema = {
type: 'object',
properties: {
comments: {
type: 'array',
'x-component': 'EvaluationList',
default: [
{
name: '杰尼',
age: 24,
small: 1,
},
],
items: {
type: 'object',
properties: {
MEGA_LADYOUT: {
type: 'object',
'x-component': 'Mega-Layout',
'x-component-props': {
labelCol: 6,
labelAlign: 'left',
},
properties: {
star: {
title: '满意程度',
required: true,
'x-component': 'Rating',
'x-component-props': {
allowHalf: false,
},
},
comment: {
type: 'string',
title: '评价',
required: true,
'x-component': 'TextArea',
'x-component-props': {
rows: 4,
},
},
picture: {
type: 'string',
title: '图片',
required: true,
'x-component': 'CustomUpload',
'x-component-props': {
},
},
},
},
},
},
},
},
};
\ No newline at end of file
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