Commit 9623ea13 authored by XieZhiXiong's avatar XieZhiXiong
parents 32f8c7c6 2c4fccea
......@@ -51,11 +51,17 @@ const router = {
hideInMenu: true,
component: '@/pages/systemManage/unit/template',
},{
// 平台参数列表
// 平台参数列表
path: '/system/platformArg',
name: 'platformArg',
hidePageHeader: true,
component: '@/pages/systemManage/platformArg',
},{
// 平台参数列表
path: '/system/platformArg/edit',
name: 'platformArgEdit',
hidePageHeader: true,
component: '@/pages/systemManage/platformArg/template',
}]
}
export default router
\ No newline at end of file
export default router
......@@ -17,17 +17,17 @@
"build:dev": "pm2 start scripts/devServer.js",
"build:analyze": "ANALYZE=1 umi build",
"build:clean": "umi build",
"build:scm": "cross-env SITE_ID=1 BACK_GATEWAY=http://lingxi-scm.wg.shushangyun.com yarn build",
"build:10": "cross-env SITE_ID=1 BACK_GATEWAY=http://10.0.0.10:8100 yarn build",
"build:25": "cross-env SITE_ID=352 BACK_GATEWAY=http://10.0.0.25:8100 yarn build",
"build:scm": "cross-env SITE_ID=1 BACK_GATEWAY=http://lingxi-scm.wg.shushangyun.com SOCKET_URL=ws://lingxi-scm.wg.shushangyun.com yarn build",
"build:10": "cross-env SITE_ID=1 BACK_GATEWAY=http://10.0.0.10:8100 SOCKET_URL=ws://10.0.0.10:9400 yarn build",
"build:25": "cross-env SITE_ID=352 BACK_GATEWAY=http://10.0.0.25:8100 SOCKET_URL=ws://10.0.0.25:9400 yarn build",
"postinstall": "umi generate tmp",
"prettier": "prettier --write '**/*.{js,jsx,tsx,ts,less,md,json}'",
"test": "umi-test",
"test:coverage": "umi-test --coverage",
"start:cross": "cross-env SITE_ID=352 SOCKET_URL=ws://10.0.0.25:8100 yarn start",
"start:cross-dev": "cross-env SITE_ID=352 SOCKET_URL=ws://10.0.0.25:8100 yarn start",
"start:10": "cross-env SITE_ID=1 BACK_GATEWAY=http://10.0.0.10:8100 yarn start",
"start:scm": "cross-env BACK_GATEWAY=http://lingxi-scm.wg.shushangyun.com SITE_ID=1 yarn start"
"start:cross": "cross-env SITE_ID=352 SOCKET_URL=ws://10.0.0.25:9400 yarn start",
"start:cross-dev": "cross-env SITE_ID=352 SOCKET_URL=ws://10.0.0.25:9400 yarn start:dev",
"start:10": "cross-env SITE_ID=1 BACK_GATEWAY=http://10.0.0.10:8100 SOCKET_URL=ws://10.0.0.10:9400 yarn start",
"start:scm": "cross-env BACK_GATEWAY=http://lingxi-scm.wg.shushangyun.com SOCKET_URL=ws://lingxi-scm.wg.shushangyun.com SITE_ID=1 yarn start"
},
"lint-staged": {
"*.{js,jsx,less,md,json}": [
......
......@@ -35,13 +35,6 @@ const axios = Axios.create({
})
const serviceConfig = {
// 用于注册页
userRegister: {
useType: {
url: '/member/menu/register/type',
method: 'get'
}
},
//初始化会员支付策略配置
payConfig: {
payInitializeConfig: {
......@@ -115,4 +108,4 @@ async function batchAxiosHttps() {
return isDemo ? Object.assign(asyncHttpQueue, await demoFetch()) : asyncHttpQueue
}
exports.fetchConfig = batchAxiosHttps
\ No newline at end of file
exports.fetchConfig = batchAxiosHttps
......@@ -86,6 +86,10 @@ export function render(oldRender:Function) {
* @param {*} { routes, matchedRoutes, location, action }
*/
export function onRouteChange({ routes, matchedRoutes, location, action }) {
console.log('onRouteChange')
// 路由切换时, 自动回到顶部
document.body.scrollTop = document.documentElement.scrollTop = 0;
if (isDev) {
console.log('dev')
return;
......@@ -123,7 +127,7 @@ export function onRouteChange({ routes, matchedRoutes, location, action }) {
history.replace('/noAuth')
} else {
// 未登录
if (whiteLists.includes(location.pathname)) {
// 访问路由在白名单里
} else {
......
export const NOT_CHANGE_VALUE = 'hello, world'
// socket的链接地址, 默认会使用后端接口网关地址
export const SOCKET_URL = process.env.SOCKET_URL || process.env.BACK_GATEWAY?.replace('http', 'ws') || "ws://10.0.0.25:9400"
export const SOCKET_URL = process.env.SOCKET_URL?.replace('http|https', 'ws') || process.env.BACK_GATEWAY?.replace('http|https', 'ws')
// 会员角色类型
export const MEMBER_ROLE_LISTS = [
......@@ -586,6 +586,7 @@ export const PurchaseOrderOutWorkStateTexts = {
export const PurchaseOrderInsideWorkStateTexts = {
"-1": '取消订单',
0: '订单完成',
1: '新增采购订单',
2: '一级审核订单',
3: '二级审核订单',
......@@ -605,6 +606,7 @@ export const PurchaseOrderInsideWorkStateTexts = {
// 销售订单内部显示文案
export const SaleOrderInsideWorkStateTexts = {
0: '订单完成',
1: '待审核订单',
2: '一级审核订单',
3: '二级审核订单',
......@@ -615,7 +617,7 @@ export const SaleOrderInsideWorkStateTexts = {
8: '提交二级审核订单不通过',
9: '不接受订单',
10: '待确认支付结果',
16: '支付结果确认到账',
17: '支付结果没到账',
18: '发货单创建',
......@@ -651,4 +653,4 @@ export const InquiryStateTexts = {
2: '待确认',
3: '接受报价',
4: '不接受报价',
}
\ No newline at end of file
}
export interface BusinessType {
businessTypeId: number;
businessTypeName: string;
}
export interface UseType {
memberTypeId: number;
memberTypeName: string;
businessTypes: BusinessType[];
}
export interface UserRegister {
useType: UseType[];
}
export interface RuleConfiguration {
value: number;
label: string;
......@@ -88,7 +73,6 @@ export interface Global {
}
export interface RootObject {
userRegister: UserRegister;
payConfig: PayConfig;
web: Web;
global: Global;
......
import React, { useState, useEffect, useRef, useCallback, useLayoutEffect } from 'react'
import { Link, history } from 'umi'
import { Menu, Dropdown, List, Avatar, Skeleton} from 'antd'
import { Menu, Dropdown, List, Avatar, Modal, Badge} from 'antd'
import { BellOutlined, CaretDownOutlined } from '@ant-design/icons'
import styles from './index.less'
import { removeAuth, getAuth } from '@/utils/auth'
......@@ -8,21 +8,43 @@ import { PublicApi } from '@/services/api';
import moment from 'moment';
import msg_system from '@/asserts/msg_system.png'
import msg_platform from '@/asserts/msg_platform.png'
import { SOCKET_URL } from '@/constants';
import PwdModal from './components/PwdModal';
import { encryptedByAES } from '@/utils/cryptoAes'
const RightContent: React.FC<{}> = (props) => {
const [visible, setVisible] = useState(false);
const [messageData, setMessageData] = useState<any[]>([]);
const [loading, setLoading] = useState(true);
const ws = useRef<WebSocket | null>(null);
const [unreadMsg, setUnReadMsg] = useState<number>(0);
const [msgloading, setMsgLoading] = useState(true);
const [editPwdVisible, setEditPwdVisible] = useState(false);
const [confirmLoading, setConfirmLoading] = useState(false);
const ws = useRef<WebSocket | null>(null);
const toLogin = () => {
removeAuth()
history.replace('/login')
}
const handleChangePwd = useCallback((value: any) => {
setConfirmLoading(true)
PublicApi.postMemberManageSecurityPswUpdate({
oldPassword: encryptedByAES(value.oldPwd),
newPassword: encryptedByAES(value.newPwd)
}).then((data) => {
setEditPwdVisible(false);
setConfirmLoading(false);
})
}, [])
const handleCancel = useCallback(() => {
setEditPwdVisible(false)
}, [])
const menu = (
<Menu>
<Menu.Item>
<Menu.Item onClick={() => setEditPwdVisible(true)}>
密码修改
</Menu.Item>
<Menu.Item onClick={toLogin}>
......@@ -34,11 +56,11 @@ const RightContent: React.FC<{}> = (props) => {
const userInfo = getAuth()
useEffect(() => {
if(visible) {
setLoading(true)
setMsgLoading(true)
PublicApi.getReportMessagePlatformPage({current: '1', pageSize: '4'})
.then((data) => {
if(data.code === 1000) {
setLoading(false)
setMsgLoading(false)
setMessageData(data.data.data);
}
})
......@@ -47,17 +69,22 @@ const RightContent: React.FC<{}> = (props) => {
const webSocketInit = useCallback(() => {
console.log(ws.current)
if (!ws.current || ws.current.readyState === 3) {
ws.current = new WebSocket(`ws://10.0.0.25:8100/report/websocket?memberId=${userInfo.memberId}&roleId=${userInfo.memberRoleId}`);
if (SOCKET_URL && /ws\:\/\//.test(SOCKET_URL) && (!ws.current || ws.current.readyState === 3) && userInfo) {
const url = `${SOCKET_URL}/report/websocket?memberId=${userInfo.memberId}&roleId=${userInfo.memberRoleId}&token=${userInfo.token}&source=${99}`
ws.current = new WebSocket(url);
ws.current.onopen = (e) => {
console.log(e)
}
ws.current.onmessage = (e) => {
console.log(e)
const data = JSON.parse(e.data);
if(data.type === 1) {
setUnReadMsg(data.data)
}
};
ws.current.onclose = (e) => {
console.log("关闭连接")
}
}
ws.current.onerror = (e) => {
console.log("socket 出错")
}
......@@ -65,7 +92,7 @@ const RightContent: React.FC<{}> = (props) => {
}, [ws]);
useLayoutEffect(() => {
// webSocketInit();
webSocketInit();
return () => {
ws.current?.close();
};
......@@ -76,6 +103,7 @@ const RightContent: React.FC<{}> = (props) => {
<div className={styles.header}>消息列表</div>
<List
itemLayout="horizontal"
loading={msgloading}
dataSource={messageData}
footer={
<a className={styles.messageFooter} href="/message/messageList">
......@@ -85,17 +113,17 @@ const RightContent: React.FC<{}> = (props) => {
renderItem={(item:any) => {
return (
<List.Item>
<Skeleton paragraph={{ rows: 1 }} loading={loading} active avatar>
{/* <Skeleton paragraph={{ rows: 1 }} loading={loading} active avatar> */}
<div className={styles.msgContainer}>
<div className={styles.msgItemIcon}>
<Avatar src={item.type == 1 ? msg_system : msg_platform} />
</div>
<div>
<div className={styles.msgTitle}>{item.title}</div>
<div className={styles.msgTime}>{moment(item.sendTime).format('YYYY-MM-DD HH:mm:ss')}</div>
<div className={styles.msgTitle}>{item.title}</div>
<div className={styles.msgTime}>{moment(item.sendTime).format('YYYY-MM-DD HH:mm:ss')}</div>
</div>
</div>
</Skeleton>
{/* </Skeleton> */}
</List.Item>
)
}}
......@@ -103,28 +131,34 @@ const RightContent: React.FC<{}> = (props) => {
</div>
)
return <div className={styles.lxLayoutRight}>
<Link to="/home" className={styles.lxLink}>返回首页</Link>
<Dropdown overlay={menuMessage} trigger={['click']} visible={visible}>
<a
href=""
rel="noopener noreferrer"
className={styles.topMessage}
>
<BellOutlined onClick={() => setVisible(!visible)}/>
<span className="pulse"></span>
</a>
</Dropdown>
<Dropdown overlay={menu}>
<div className={styles.avatarWrap}>
<div className={styles.avatar}></div>
<div className="ant-dropdown-link" onClick={e => e.preventDefault()}>
<span>{userInfo?.name || '未知用户'}</span>
<CaretDownOutlined />
return (
<div className={styles.lxLayoutRight}>
<Link to="/home" className={styles.lxLink}>返回首页</Link>
<Dropdown overlay={menuMessage} trigger={['click']} visible={visible}>
<span className={styles.topMessage}>
<Badge count={unreadMsg} size={"small"}>
<BellOutlined onClick={() => setVisible(!visible)}/>
</Badge>
</span>
</Dropdown>
<Dropdown overlay={menu}>
<div className={styles.avatarWrap}>
<div className={styles.avatar}></div>
<div className="ant-dropdown-link" onClick={e => e.preventDefault()}>
<span>{userInfo?.name || '未知用户'}</span>
<CaretDownOutlined />
</div>
</div>
</div>
</Dropdown>
</div>
</Dropdown>
<PwdModal
visible={editPwdVisible}
onCancel={handleCancel}
onOk={handleChangePwd}
confirmLoading={confirmLoading}
/>
</div>
)
}
export default RightContent
\ No newline at end of file
export default RightContent
import React from 'react';
import { Modal, Input } from 'antd';
import NiceForm from '@/components/NiceForm';
import { registerValidationRules, createAsyncFormActions, FormEffectHooks } from '@formily/antd';
const actions = createAsyncFormActions ();
const Password = Input.Password;
registerValidationRules({
passwordRule: value => {
const pattern = /^(?![0-9]+$)(?![a-z]+$)(?![A-Z]+$)(?!([^(0-9a-zA-Z)])+$)^.{8,16}$/;
return !pattern.test(value) ? "8-16个字符,由英文字母(区分大小写)、数字组成,请勿使用简单密码。" : ""
},
passwordIsSame: async (value) => {
const newPwd = await actions.getFieldValue('newPwd');
return newPwd !== value ? "两次密码不一致" : '';
}
})
const schema = {
type: 'object',
properties: {
layout: {
type: 'object',
'x-component': 'mega-layout',
"x-component-props": {
"labelAlign": "top",
"full": true
},
properties: {
oldPwd: {
type: 'string',
title: '旧密码',
'x-component': 'Password',
'x-component-props': {
style: {
width: '100%'
}
},
'x-rules': [
{
required: true,
message: '请填写旧密码'
},
]
},
newPwd: {
type: 'password',
title: '新密码',
'x-rules': [
{
required: true,
message: '请填写新密码'
},
{
passwordRule: true,
}
]
},
comfirmPwd: {
type: 'password',
title: '新密码',
'x-rules': [
{
required: true,
message: '请填写新密码'
},
{
passwordIsSame: true
}
]
}
}
}
}
}
const PwdModal = (props) => {
const { visible, onCancel, onOk, confirmLoading } = props;
const handleSubmit = (value) => {
!!onOk && onOk(value)
}
const handleOk = () => {
actions.submit();
}
return (
<Modal
visible={visible}
title="修改密码"
onCancel={onCancel}
confirmLoading={confirmLoading}
onOk={handleOk}
maskClosable={false}
>
{
visible
? <NiceForm
components={{Password}}
schema={schema}
actions={actions}
onSubmit={handleSubmit}
></NiceForm>
: null
}
</Modal>
)
}
export default React.memo(PwdModal)
......@@ -138,7 +138,6 @@
.topMessage{
color: rgba(255,255,255,.6);
margin-right: 30px;
position: relative;
:global{
.anticon{
font-size: 18px;
......@@ -170,16 +169,16 @@
justify-content: center;
align-items: center;
margin: 0;
border-top: 1px solid #f0f0f0;
text-align: center;
border-top: 1px solid #f0f0f0;
text-align: center;
height: 46px;
line-height: 46px;
font-size: 14px;
span{
flex: 0 0 50%;
&:last-child{
border-left: 1px solid #f0f0f0;
border-left: 1px solid #f0f0f0;
}
cursor: pointer;
}
}
\ No newline at end of file
}
......@@ -61,7 +61,7 @@ export default {
'menu.memberAbility': '会员管理',
'menu.memberAbility.memberMaintain': '会员维护',
'menu.memberAbility.addMember': '新增会员',
'menu.memberAbility.maintainDetail': '会员详情',
'menu.memberAbility.maintainDetail': '会员详情',
'menu.memberAbility.maintainDetail.basicInfo': '会员基本信息',
'menu.memberAbility.maintainDetail.levelInfo': '会员等级信息',
'menu.memberAbility.maintainDetail.equityInfo': '权益信息',
......@@ -79,7 +79,7 @@ export default {
'menu.memberAbility.memberUpgradeRule': '会员升级规则',
'menu.memberAbility.memberLevel': '会员等级',
'menu.memberAbility.addEquity': '会员权益设置',
//需求单 2020-11-17
'menu.demandOrder': '需求单审核',
'menu.demandOrder.demandOrderInquire': '需求单查询',
......@@ -97,7 +97,7 @@ export default {
//物流管理
'menu.logisticsManager': '物流管理',
'menu.logisticsManager.logisticsList': '物流单查询',
//规则
'menu.ruleSettingManager': '平台规则配置',
......@@ -158,7 +158,7 @@ export default {
'menu.content.tagsInfo': '标签详情',
'menu.content.infomations': '资讯管理',
'menu.content.infomationAdd':' 新建资讯',
'menu.content.infomationInfo': '咨询详情',
'menu.content.infomationInfo': '咨询详情',
'menu.content.advertisement': '广告管理',
'menu.content.advertisementAdd': '新建广告',
'menu.content.advertisementInfo': '广告详情',
......@@ -170,11 +170,11 @@ export default {
'menu.content.announceAdd': '新建公告',
// 评论管理
'menu.comment': '评论管理',
'menu.comment.query': '会员评价查询',
'menu.comment.queryDetail': '评价统计',
'menu.comment.manage': '评价管理',
'menu.comment.manageDetail': '评价管理',
'menu.comment': '评论管理',
'menu.comment.query': '会员评价查询',
'menu.comment.queryDetail': '评价统计',
'menu.comment.manage': '评价管理',
'menu.comment.manageDetail': '评价管理',
// 订单管理
'menu.orderSystem': '订单管理',
......@@ -193,7 +193,7 @@ export default {
'menu.balanced.accountPayableDetail': '代付账款明细',
'menu.balanced.scorePayable': '积分结算',
'menu.balanced.scorePayableDetail': '积分结算详情',
// 会员资金账户
'menu.capitalAccount': '会员资金账户',
......@@ -221,6 +221,7 @@ export default {
'menu.system.unitAdd': '新建单位',
'menu.system.unitEdit': '编辑单位',
'menu.system.platformArg': '平台参数',
'menu.system.platformArgEdit': '平台参数修改',
'menu.productionNotice': '生产通知单管理',
'menu.productionNotice.query': '生产通知单查询',
......
......@@ -27,4 +27,4 @@ export const searchCustomerCategoryOptionEffect = (context: any, fieldName: stri
})
})
})
}
\ No newline at end of file
}
......@@ -4,16 +4,12 @@
color: #909399;
}
.dataRiskAction{
.item {
display: flex;
> div{
width: 240px;
height: 48px;
background: #FAFBFC;
line-height: 48px;
margin-right: 24px;
> img{
margin: 8px 16px;
}
background: #FAFBFC;
align-items: center;
.icon {
margin: 8px 16px;
}
}
\ No newline at end of file
}
......@@ -12,49 +12,61 @@ import dataRiskIcon8 from '@/asserts/home-icon-8.png'
const DataCenter: React.FC = () => {
const data = [
{
title: '网站运营数据',
icon: dataRiskIcon3
},
{
title: 'APP运营数据',
icon: dataRiskIcon4
},
{
title: '用户分析',
icon: dataRiskIcon5
},
{
title: '商品分析',
icon: dataRiskIcon6
},
{
title: '交易分析',
icon: dataRiskIcon7
},
{
title: '售后分析',
icon: dataRiskIcon8
}
]
return (
<Row gutter={[24, 12]}>
<Col span={24}>
<Card
headStyle={{borderBottom:'none'}}
title={
<>
<p>数据中心</p>
<p className={styles.dataRiskTip}>实时展示会员数据、交易数据等综合指标的动态趋势,满足数据化运营的需要</p>
</>
}
bordered={false}
extra={<a href="#">进入数据中心</a>}
>
<div className={styles.dataRiskAction}>
<div>
<img src={dataRiskIcon3} alt=""/>
<span>网站运营数据</span>
</div>
<div>
<img src={dataRiskIcon4} alt=""/>
<span>APP运营数据</span>
</div>
<div>
<img src={dataRiskIcon5} alt=""/>
<span>用户分析</span>
</div>
<div>
<img src={dataRiskIcon6} alt=""/>
<span>商品分析</span>
</div>
<div>
<img src={dataRiskIcon7} alt=""/>
<span>交易分析</span>
</div>
<div>
<img src={dataRiskIcon8} alt=""/>
<span>售后分析</span>
</div>
</div>
</Card>
</Col>
</Row>
<Card
headStyle={{borderBottom:'none'}}
title={
<>
<p>数据中心</p>
<p className={styles.dataRiskTip}>实时展示会员数据、交易数据等综合指标的动态趋势,满足数据化运营的需要</p>
</>
}
bordered={false}
extra={<a href="#">进入数据中心</a>}
>
<Row gutter={[24,24]}>
{
data.map((item) => {
return (
<Col xxl={4} xl={6} lg={6} md={8} sm={12} xs={24} key={item.title} >
<div className={styles.item}>
<img src={item.icon} className={styles.icon} alt=""/>
<span>{item.title}</span>
</div>
</Col>
)
})
}
</Row>
</Card>
)
}
export default DataCenter
\ No newline at end of file
export default DataCenter
......@@ -16,11 +16,11 @@ export enum TimeEnum {
}
interface Iprops {
memberData: ImemberData
memberData: ImemberData
}
const MemberStatistics: React.FC<Iprops> = (props) => {
const { memberData } = props;
const { memberData } = props;
const [timeRadio, setTimeRadio] = useState<TimeEnum>(TimeEnum.WEEK);
// 设置折线图的data
const [currentLineChartData, setCurrentLineChartData] = useState<Ilist[]>([]);
......@@ -62,9 +62,9 @@ const MemberStatistics: React.FC<Iprops> = (props) => {
}
]
return (
<Card
headStyle={{borderBottom:'none'}}
title="会员统计"
<Card
headStyle={{borderBottom:'none'}}
title="会员统计"
bordered={false}
extra={
<Radio.Group value={timeRadio} buttonStyle="solid" size="small" onChange={handleChangeTime}>
......@@ -84,7 +84,7 @@ const MemberStatistics: React.FC<Iprops> = (props) => {
{
data.map((item) => {
return (
<Col span={6} key={item.tips}>
<Col xxl={6} xl={6} lg={12} md={12} sm={24} xs={24} key={item.tips}>
<div className={styles.lineDesc}>
<img src={item.icon} className={styles.icon} alt=""/>
<div className={styles.lineDescText}>
......@@ -103,4 +103,4 @@ const MemberStatistics: React.FC<Iprops> = (props) => {
)
}
export default MemberStatistics;
\ No newline at end of file
export default MemberStatistics;
......@@ -8,13 +8,13 @@ interface IProps {
const LineChart: React.FC<IProps> = (props) => {
return (
<Chart height={360} data={props.data} forceFit>
<Chart height={360} autoFit data={props.data}>
<Legend position="top-left" />
{/* <Axis name="dateTime" />
<Axis name="count"/> */}
<LineAdvance
position="dateTime*count"
color={'roleName'}
<LineAdvance
position="dateTime*count"
color={'roleName'}
point
area
shape="smooth"
......@@ -23,4 +23,4 @@ const LineChart: React.FC<IProps> = (props) => {
);
}
export default LineChart;
\ No newline at end of file
export default LineChart;
......@@ -2,7 +2,7 @@
display: flex;
align-items: center;
margin-top: 14px;
.icon {
display: block;
width: 48px;
......@@ -18,6 +18,7 @@
font-size: 24px;
font-weight: 500;
color: #303133;
overflow: hidden;
}
.lineDescTip{
font-size: 12px;
......@@ -25,5 +26,5 @@
color: #909399;
}
}
}
\ No newline at end of file
}
......@@ -34,30 +34,30 @@ const OrderStatistics: React.FC<Iprops> = (props) => {
const data = [
{
icon: todayIcon,
value: orderData.todayCount,
value: orderData.todayAmount ,
tips: `今日营业额(${orderData.todayCount}单)`
},
{
icon: weekIcon,
value: orderData.weekCount,
tips: `最近7日营业额(${orderData.weekAmount}单)`
value: orderData.weekAmount,
tips: `最近7日营业额(${orderData.weekCount}单)`
},
{
icon: monthIcon,
value: orderData.monthCount,
tips: `最近30日营业额(${orderData.monthAmount}单)`
value: orderData.monthAmount,
tips: `最近30日营业额(${orderData.monthCount}单)`
},
{
icon: totalIcon,
value: orderData.totalCount,
value: orderData.totalAmount,
tips: `累计营业额(${orderData.totalCount}单)`
}
]
return (
<Card
headStyle={{borderBottom:'none'}}
<Card
headStyle={{borderBottom:'none'}}
style={{height: '100%'}}
title="会员统计"
title="会员统计"
bordered={false}
extra={
<Radio.Group value={timeRadio} buttonStyle="solid" size="small" onChange={handleChangeTime}>
......@@ -77,7 +77,7 @@ const OrderStatistics: React.FC<Iprops> = (props) => {
{
data.map((item,key) => {
return (
<Col span={6} key={key}>
<Col xxl={6} xl={6} lg={12} md={12} sm={24} xs={24} key={key}>
<div className={styles.lineDesc}>
<img src={item.icon} className={styles.icon} alt=""/>
<div className={styles.lineDescText}>
......@@ -96,4 +96,4 @@ const OrderStatistics: React.FC<Iprops> = (props) => {
)
}
export default OrderStatistics
\ No newline at end of file
export default OrderStatistics
......@@ -4,16 +4,12 @@
color: #909399;
}
.dataRiskAction{
.item {
display: flex;
> div{
width: 240px;
height: 48px;
background: #FAFBFC;
line-height: 48px;
margin-right: 24px;
> img{
margin: 8px 16px;
}
background: #FAFBFC;
align-items: center;
.icon {
margin: 8px 16px;
}
}
\ No newline at end of file
}
......@@ -10,33 +10,44 @@ import dataRiskIcon2 from '@/asserts/home-icon-2.png'
interface Iprops {}
const RiskCenter: React.FC<Iprops> = () => {
const data = [
{
title: '预警规则',
icon: dataRiskIcon1
},
{
title: '预警控制台',
icon: dataRiskIcon2
},
{
title: '预警处理',
icon: dataRiskIcon1
},
]
return (
<Row gutter={[24, 12]}>
<Col span={24}>
<Card
headStyle={{borderBottom:'none'}}
title={<><p>风控中心</p><p className={styles.dataRiskTip}>全面的风控体系,监控交易异常、资金异常、行为异常,并实时预警</p></>}
bordered={false}
extra={<a href="#">进入风控中心</a>}
>
<div className={styles.dataRiskAction}>
<div>
<img src={dataRiskIcon1} alt=""/>
<span>预警规则</span>
</div>
<div>
<img src={dataRiskIcon2} alt=""/>
<span>预警控制台<Badge count={4} size="small" /></span>
</div>
<div>
<img src={dataRiskIcon1} alt=""/>
<span>预警处理</span>
</div>
</div>
</Card>
</Col>
</Row>
<Card
headStyle={{borderBottom:'none'}}
title={<><p>风控中心</p><p className={styles.dataRiskTip}>全面的风控体系,监控交易异常、资金异常、行为异常,并实时预警</p></>}
bordered={false}
extra={<a href="#">进入风控中心</a>}
>
<Row gutter={[24,24]}>
{
data.map((item) => {
return (
<Col xxl={4} xl={6} lg={6} md={8} sm={12} xs={24} key={item.title} >
<div className={styles.item}>
<img src={item.icon} className={styles.icon} alt=""/>
<span>{item.title} <Badge count={4} size="small" /></span>
</div>
</Col>
)
})
}
</Row>
</Card>
)
}
export default RiskCenter
\ No newline at end of file
export default RiskCenter
// 便签样式
.notePaperBox{
width: 100%;
height: 248px;
height: 100%;
background: #6C9CEB;
border-radius: 3px;
.notePaperContainer{
......@@ -50,14 +50,14 @@
top: -5px;
}
}
.noteBody{
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
color: #fff;
color: #fff;
.value {
font-size: 24px;
margin-bottom: 24px;
......@@ -97,9 +97,10 @@
margin-bottom: 0;
}
.lineDescTip {
height: 36px;
font-size: 12px;
color: #909399;
margin-bottom: 0;
}
}
}
\ No newline at end of file
}
......@@ -43,8 +43,8 @@ const Settlement: React.FC = () => {
}
}, [inViewPort])
return (
<Row gutter={[24, 12]} style={{marginTop: 9, marginBottom: 0}} ref={ref}>
<Col span={5} style={{paddingBottom:0}}>
<Row gutter={[24, 24]} style={{marginTop: 9, marginBottom: 0}} ref={ref}>
<Col xxl={5} xl={5} lg={12} md={12} sm={24} xs={24} style={{paddingBottom:0}}>
<div className={styles.notePaperBox}>
<div className={styles.notePaperContainer}>
<div className={styles.noteHeader}>
......@@ -59,7 +59,7 @@ const Settlement: React.FC = () => {
</div>
</div>
</Col>
<Col span={5} style={{paddingBottom:0}}>
<Col xxl={5} xl={5}lg={12} md={12} sm={24} xs={24} style={{paddingBottom:0}}>
<div className={cx(styles.notePaperBox, styles.notePaperBoxGreen)}>
<div className={styles.notePaperContainer}>
<div className={styles.noteHeader}>
......@@ -74,7 +74,7 @@ const Settlement: React.FC = () => {
</div>
</div>
</Col>
<Col span={7} style={{paddingBottom:0}}>
<Col xxl={7} xl={7} lg={12} md={12} sm={24} xs={24} style={{paddingBottom:0}}>
<Row >
<Col span={24} style={{padding:0}}>
<div className={cx(styles.lineDesc, styles.feeCustomCard)}>
......@@ -85,7 +85,7 @@ const Settlement: React.FC = () => {
<p className={styles.lineDescTip}>待提现申请</p>
</div>
</div>
<a key="list-loadmore-more">查看&nbsp;<RightOutlined /></a>
<a>查看&nbsp;<RightOutlined /></a>
</div>
</Col>
<Col span={24} style={{paddingBottom:0, marginTop: '12px'}}>
......@@ -97,12 +97,12 @@ const Settlement: React.FC = () => {
<p className={styles.lineDescTip}>待支付提现申请</p>
</div>
</div>
<a key="list-loadmore-more">查看&nbsp;<RightOutlined /></a>
<a>查看&nbsp;<RightOutlined /></a>
</div>
</Col>
</Row>
</Col>
<Col span={7} style={{paddingBottom:0}}>
<Col xxl={7} xl={7} lg={12} md={12} sm={24} xs={24} style={{paddingBottom:0}}>
<Row>
<Col span={24} style={{padding:0}}>
<div className={cx(styles.lineDesc, styles.feeCustomCard)}>
......@@ -134,4 +134,4 @@ const Settlement: React.FC = () => {
)
}
export default Settlement
\ No newline at end of file
export default Settlement
......@@ -22,10 +22,10 @@
justify-content: space-between;
align-items: center;
flex: 1;
&:first-child {
margin-right: 50px;
}
// &:first-child {
// margin-right: 50px;
// }
.left {
display: flex;
flex-direction: row;
......@@ -47,6 +47,6 @@
}
}
}
}
......@@ -14,14 +14,14 @@ const StatisticsColumn = (props) => {
const { loading, data } = props;
return (
<Row gutter={[24, 12]}>
<Col span={12}>
<Col xxl={12} xl={12} lg={12} md={24} sm={24} xs={24}>
<Row>
<Col span={24}>
<Card
headStyle={{borderBottom:'none'}}
title={"商品统计"}
title={"商品统计"}
bordered={false}
>
>
{
loading
? <Skeleton active />
......@@ -30,76 +30,84 @@ const StatisticsColumn = (props) => {
<span>全部商品</span>
<p>{data?.productCount}</p>
</div>
<div className={styles.commodityTotalDesc}>
<div className={styles.container}>
<div className={styles.left}>
<img src={totalCommdity} alt=""/>
<div className={styles.lineDescText}>
<p className={styles.lineDescTitle}>{data.addProduct?.count}</p>
<p className={styles.lineDescTip}>{data.addProduct?.name}</p>
<Row gutter={[24, 12]}>
<Col xxl={12} xl={12} lg={24} md={12} sm={24} xs={24} className={styles.commodityTotalDesc}>
<div className={styles.container}>
<div className={styles.left}>
<img src={totalCommdity} alt=""/>
<div className={styles.lineDescText}>
<p className={styles.lineDescTitle}>{data.addProduct?.count}</p>
<p className={styles.lineDescTip}>{data.addProduct?.name}</p>
</div>
</div>
<a key="list-loadmore-more">查看&nbsp;<RightOutlined /></a>
</div>
<a key="list-loadmore-more">查看&nbsp;<RightOutlined /></a>
</div>
<div className={styles.container}>
<div className={styles.left}>
<img src={totalIcona3} alt=""/>
<div className={styles.lineDescText}>
<p className={styles.lineDescTitle}>{data.toBeProductValify?.count}</p>
<p className={styles.lineDescTip}>{data.toBeProductValify?.name}</p>
</Col>
<Col xxl={12} xl={12} lg={24} md={12} sm={24} xs={24} className={styles.commodityTotalDesc} >
<div className={styles.container}>
<div className={styles.left}>
<img src={totalIcona3} alt=""/>
<div className={styles.lineDescText}>
<p className={styles.lineDescTitle}>{data.toBeProductValify?.count}</p>
<p className={styles.lineDescTip}>{data.toBeProductValify?.name}</p>
</div>
</div>
<a key="list-loadmore-more">查看&nbsp;<RightOutlined /></a>
</div>
<a key="list-loadmore-more">查看&nbsp;<RightOutlined /></a>
</div>
</div>
</Col>
</Row>
</>
}
</Card>
</Col>
</Row>
</Col>
<Col span={12}>
<Col xxl={12} xl={12} lg={12} md={24} xs={24}>
<Row>
<Col span={24}>
<Card
headStyle={{borderBottom:'none'}}
title={"全部品牌"}
title={"全部品牌"}
bordered={false}
>
{
loading
loading
? <Skeleton active />
: <>
<div className={styles.commodityTotalTitle}>
<span>全部品牌</span>
<p>{data?.brandCount}</p>
</div>
<div className={styles.commodityTotalDesc}>
<div className={styles.container}>
<div className={styles.left}>
<img src={totalBrand1} alt=""/>
<div className={styles.lineDescText}>
<p className={styles.lineDescTitle}>{data.addBrand?.count}</p>
<p className={styles.lineDescTip}>{data.addBrand?.name}</p>
<Row gutter={[24, 12]}>
<Col xxl={12} xl={12} lg={24} md={12} sm={24} xs={24} className={styles.commodityTotalDesc} >
<div className={styles.container}>
<div className={styles.left}>
<img src={totalBrand1} alt=""/>
<div className={styles.lineDescText}>
<p className={styles.lineDescTitle}>{data.addBrand?.count}</p>
<p className={styles.lineDescTip}>{data.addBrand?.name}</p>
</div>
</div>
<a key="list-loadmore-more">查看&nbsp;<RightOutlined /></a>
</div>
<a key="list-loadmore-more">查看&nbsp;<RightOutlined /></a>
</div>
<div className={styles.container}>
<div className={styles.left}>
<img src={totalBrand2} alt=""/>
<div className={styles.lineDescText}>
<p className={styles.lineDescTitle}>{data.toBeBrandValify?.count}</p>
<p className={styles.lineDescTip}>{data.toBeBrandValify?.name}</p>
</Col>
<Col xxl={12} xl={12} lg={24} md={12} sm={24} xs={24} className={styles.commodityTotalDesc}>
<div className={styles.container}>
<div className={styles.left}>
<img src={totalBrand2} alt=""/>
<div className={styles.lineDescText}>
<p className={styles.lineDescTitle}>{data.toBeBrandValify?.count}</p>
<p className={styles.lineDescTip}>{data.toBeBrandValify?.name}</p>
</div>
</div>
<a key="list-loadmore-more">查看&nbsp;<RightOutlined /></a>
</div>
<a key="list-loadmore-more">查看&nbsp;<RightOutlined /></a>
</div>
</div>
</Col>
</Row>
</>
}
</Card>
</Col>
</Row>
......@@ -108,4 +116,4 @@ const StatisticsColumn = (props) => {
)
}
export default StatisticsColumn
\ No newline at end of file
export default StatisticsColumn
......@@ -47,7 +47,7 @@ const TodayAdd: React.FC<Iprops> = (props) => {
{
list.map((item, key) => {
return (
<Col span={6} key={key}>
<Col xxl={6} xl={6} lg={12} md={12} sm={24} xs={24} key={key}>
<div className={styles.homeCard}>
<div className={styles.body}>
<div className={styles.content}>
......@@ -59,7 +59,7 @@ const TodayAdd: React.FC<Iprops> = (props) => {
</div>
</div>
<div className={styles.footer}>
<StatusTag
<StatusTag
title={
<>
{
......@@ -70,7 +70,7 @@ const TodayAdd: React.FC<Iprops> = (props) => {
{item.percent} %
</>
}
}
type={item.percent >= 0 ? "success" : "danger"}
/>
<span>&nbsp;&nbsp;相比昨日</span>
......@@ -84,4 +84,4 @@ const TodayAdd: React.FC<Iprops> = (props) => {
)
}
export default TodayAdd
\ No newline at end of file
export default TodayAdd
......@@ -14,7 +14,7 @@
}
.sideAdBox{
height: 100px;
margin: 22px 0px 13px 0;
margin: 0px 0px 20px 0;
border-radius: 5px;
background-color: #6C9CEB;
position: relative;
......@@ -34,6 +34,29 @@
}
.members {
padding: 18px 24px;
display: flex;
flex-direction: row;
align-items: center;
justify-content: space-between;
border-bottom: 1px solid #F4F5F7;
// background: #F4F5F7;
.text {
font-weight: 500;
color: #303133;
font-size: 24px;
margin-bottom: 8px;
// padding-bottom: 8px;
}
.desc {
font-size: 12px;
font-weight: 400;
color: #909399;
}
}
// 适配
@media screen and (max-width: 1441px) {
.homeCard{
......@@ -59,4 +82,15 @@
}
}
}
}
\ No newline at end of file
}
@media (min-width: 1600px) {
.lastCard {
margin-top: 12px;
}
}
// @media (max-width: 1599px) {
// .lastCard___z6zQF {
// margin-top: 0px;
// }
// }
......@@ -46,7 +46,7 @@ const Home: React.FC<{}> = () => {
hasGetData: false,
loading: false,
})
/**
* 顶部新增统计
*/
......@@ -150,43 +150,39 @@ const Home: React.FC<{}> = () => {
{/* 会员统计 */}
<Space direction="vertical" style={{width:'100%'}}>
<Row gutter={[24, 12]}>
<Col span={18}>
<Col xxl={18} xl={24} lg={24}>
<MemberStatistics memberData={memberData} />
</Col>
<Col span={6}>
<Card
<Col xxl={6} xl={24} lg={24}>
<Card
headStyle={{borderBottom:'none'}}
title="待处理会员"
bodyStyle={{padding: '0px'}}
title="待处理会员"
bordered={false}
>
<Row>
<Col span={24}>
<List
itemLayout="horizontal"
className={styles.sideListBox}
>
{
processingMemberLoading
? [1,2].map((item) => {
return <Skeleton active key={item}></Skeleton>
})
: processingMembers.map((item: any, key: number) => {
return (
<List.Item
key={item.name}
actions={[<a key="list-loadmore-more">查看&nbsp;<RightOutlined /></a>]}
>
<List.Item.Meta
title={item.count.toString()}
description={<><Badge status={PROCESS_STATUS[key]} text={item.name}></Badge></>}
/>
</List.Item>
)
})
}
</List>
</Col>
<Col span={24}>
{
processingMemberLoading
? [1,2].map((item) => {
return <Skeleton active key={item}></Skeleton>
})
: processingMembers.map((item: any, key: number) => {
return (
<Col xxl={24} xl={12} md={12} sm={24} xs={24} key={key}>
<div className={styles.members}>
<div className={styles.numbers}>
<div className={styles.text}>2</div>
<div className={styles.desc}>
<Badge status={PROCESS_STATUS[key]} text={item.name}></Badge>
</div>
</div>
<div><a key="list-loadmore-more">查看&nbsp;<RightOutlined /></a></div>
</div>
</Col>
)
})
}
<Col span={24} style={{padding: '0 24px'}}>
<div className={styles.sideAdBox}>
<a href=""><span>会员维护&nbsp;<RightCircleFilled /></span></a>
<img src={sideIcon} alt=""/>
......@@ -201,8 +197,8 @@ const Home: React.FC<{}> = () => {
<div id="trade">
<Space direction="vertical" style={{width:'100%', height: '100%'}} >
<Row gutter={[24, 12]} style={{display: 'flex', flexDirection: 'row'}}>
<Col span={6} style={{display: 'flex', flexDirection: 'column'}}>
<Row style={{height: '100%'}}>
<Col xxl={6} xl={24} lg={24} md={24} sm={24} xs={24} style={{display: 'flex', flexDirection: 'column'}}>
<Row style={{height: '100%'}} gutter={[24, 12]}>
{
tradeStatus.loading
? [1,2].map((item) => {
......@@ -216,12 +212,13 @@ const Home: React.FC<{}> = () => {
})
: Object.keys(tradeAndSold).map((item, key) => {
return (
<Col span={24} style={key == 1 ? { marginTop: '18px', flex: 1} : {}} key={item}>
<Col xxl={24} xl={12} lg={12} md={24} sm={24} xs={24} key={item}>
<Card
headStyle={{borderBottom:'none'}}
title={item === 'afterSaleList' ? '待处理售后' : '待处理交易'}
title={item === 'afterSaleList' ? '待处理售后' : '待处理交易'}
bordered={false}
style={{height: '100%'}}
className={key == 1 ? styles.lastCard : ''}
>
<List
itemLayout="horizontal"
......@@ -242,7 +239,7 @@ const Home: React.FC<{}> = () => {
)
})
}
</List>
</Card>
</Col>
......@@ -251,7 +248,7 @@ const Home: React.FC<{}> = () => {
}
</Row>
</Col>
<Col span={18}>
<Col xxl={18} xl={24} lg={24}>
<div id="order">
<OrderStatistics orderData={orderData}/>
</div>
......@@ -265,12 +262,12 @@ const Home: React.FC<{}> = () => {
<StatisticsColumn loading={productStatus.loading} data={products} />
</Space>
</div>
{/* 付款提现统计 */}
<Space direction="vertical" style={{width:'100%'}}>
<Settlement />
</Space>
<Space direction="vertical" style={{width:'100%'}}>
<DataCenter />
</Space>
......@@ -282,4 +279,4 @@ const Home: React.FC<{}> = () => {
);
}
export default Home
\ No newline at end of file
export default Home
......@@ -44,6 +44,12 @@ const tableListSchema: ISchema = {
"supplyMembersName": {
type: 'string',
"x-component-props": {
placeholder: '请输入采购会员名称'
}
},
"memberName": {
type: 'string',
"x-component-props": {
placeholder: '请输入供应会员名称'
}
},
......
......@@ -4,9 +4,8 @@ import { usePageStatus } from '@/hooks/usePageStatus'
import { OrderDetailContext } from '../../context'
import { PayOutWorkState } from '@/constants'
import { PublicApi } from '@/services/api'
import { history, Link } from 'umi'
import { history } from 'umi'
import OverflowText from '@/components/OverflowText'
import { useHttpRequest } from '@/hooks/useHttpRequest'
export interface OrderPayResultModalProps {
type: 'default' | 'preview',
......@@ -17,9 +16,8 @@ const OrderPayResultModal:React.FC<OrderPayResultModalProps> = ({type, currentRe
const { data } = useContext(OrderDetailContext)
const { id } = usePageStatus()
const [visible, setVisible] = useState(false)
const [isReady, setIsReady] = useState()
const [isReady, setIsReady] = useState<any>()
const canCtlData = data.paymentInformationResponses.find(v => v.externalState === PayOutWorkState.READY_CONFIRM_RESULT) || {}
const { run, loading } = useHttpRequest(PublicApi.postOrderPlatformConfirmedPaymentResultsOrder)
const transData = canCtlData.payOrderUrls?.split(',') || []
useEffect(() => {
......@@ -35,7 +33,7 @@ const OrderPayResultModal:React.FC<OrderPayResultModalProps> = ({type, currentRe
setVisible(false)
}
const handleConfirm = async (isReady) => {
const handleConfirm = (isReady) => {
setIsReady(isReady)
const params = {
state: isReady,
......@@ -43,10 +41,15 @@ const OrderPayResultModal:React.FC<OrderPayResultModalProps> = ({type, currentRe
paymentInformationId: canCtlData.id
}
const res = await run(params)
if (res && res.code === 1000) {
history.goBack()
}
PublicApi.postOrderPlatformConfirmedPaymentResultsOrder(params).then(res => {
if (res.code === 1000) {
setTimeout(() => {
history.goBack()
}, 1000)
} else {
setIsReady(null)
}
})
}
return (
......@@ -56,8 +59,8 @@ const OrderPayResultModal:React.FC<OrderPayResultModalProps> = ({type, currentRe
onCancel={handleCancel}
footer={(type === 'default' && transData) ? <Space>
<Button onClick={handleCancel}>取消</Button>
<Button loading={isReady === 0 && loading} onClick={() => handleConfirm(0)} type='dashed'>确认未到账</Button>
<Button loading={isReady === 1 && loading} onClick={() => handleConfirm(1)} type='primary'>确认到账</Button>
<Button loading={isReady === 0} onClick={() => handleConfirm(0)} type='dashed'>确认未到账</Button>
<Button loading={isReady === 1} onClick={() => handleConfirm(1)} type='primary'>确认到账</Button>
</Space> : null}
>
<List
......
......@@ -49,8 +49,10 @@ const TemplateDetail: React.FC<TemplateDetailPropsType> = (props) => {
}, [])
const fetchDetail = () => {
//@ts-ignore
PublicApi.getTemplatePlatformFindTemplateDetails({ id }).then(res => {
const param: any = {
id
}
PublicApi.getTemplatePlatformFindTemplateDetails(param).then(res => {
if (res.code === 1000) {
setDetailInfo(res.data)
}
......@@ -85,11 +87,10 @@ const TemplateDetail: React.FC<TemplateDetailPropsType> = (props) => {
const confirmShelfShop = (shelf: number) => {
return new Promise((resolve) => {
let param = {
const param = {
id,
shelf
}
//@ts-ignore
PublicApi.postTemplatePlatformShelfTemplate(param).then(res => {
fetchDetail()
resolve()
......@@ -99,10 +100,9 @@ const TemplateDetail: React.FC<TemplateDetailPropsType> = (props) => {
const confirmUseTemplate = () => {
return new Promise((resolve) => {
let param = {
const param: any = {
id: Number(id),
}
//@ts-ignore
PublicApi.postTemplatePlatformUseTemplate(param).then(res => {
fetchDetail()
resolve()
......@@ -145,7 +145,7 @@ const TemplateDetail: React.FC<TemplateDetailPropsType> = (props) => {
<div className={styles.template_detail}>
<div className={styles.template_info_wrap}>
<div className={styles.template_img_box}>
<div className={cx(styles.type_tag)}>PC</div>
<div className={cx(styles.type_tag)}>{detailInfo?.environment && Environment_Status[detailInfo?.environment].name}</div>
<img src={detailInfo?.templatePicUrl} />
</div>
<div className={styles.template_info}>
......@@ -219,7 +219,7 @@ const TemplateDetail: React.FC<TemplateDetailPropsType> = (props) => {
<UseModal
title="使用商场模板"
visible={useModalVisible}
onOk={() => { }}
onOk={() => { console.log() }}
type={type}
onCancel={() => setUseModalVisible(false)}
/>
......
......@@ -41,8 +41,8 @@ import {
const payActions = createFormActions()
/**
* @description: 会员弹窗列表
* @param {type}
* @return {type}
* @param {type}
* @return {type}
*/
const fetchMemberList = async (params) => {
const res = await PublicApi.getMemberManageAllProviderPage(params)
......@@ -61,7 +61,7 @@ const PaySetting: React.FC<{}> = () => {
levelList: [],
roleList: []
})
const [memberRowSelection, memberRowCtl] = useRowSelectionTable({ customKey: 'memberId' })
const [memberRowSelection, memberRowCtl] = useRowSelectionTable({ customKey: 'id' })
const [optionType, setoptionType] = useState(0)
const { preview, pageStatus } = usePageStatus()
// const initValue = useInitValue(PublicApi.getPayPayMemberTacticsDetails)
......@@ -172,15 +172,14 @@ const PaySetting: React.FC<{}> = () => {
PublicApi.getPayPayMemberTacticsDetails({ id: usePageStatus().id }).then(res => {
if (res.code === 1000) {
let { data } = res
console.log('结果', res.data)
payActions.setFieldValue('paymentPolicyName', data.paymentPolicyName)
data.paymentPolicyPayWayRequests.forEach((item: any, index) => {
payActions.setFieldValue(`id-${index}`, item.id)
payActions.setFieldValue(`ruleConfigurationId-${index}`, item.ruleConfigurationId)
// payActions.setFieldValue(`payWayIds-${index}`,item.payWayIds)
const ids: any = [];
item.payWays.forEach((v) => {
payActions.setFieldValue(`payWayIds-${index}`, v.id)
const payWayIds: any = [];
item.payWays.forEach((v, idx) => {
payWayIds.push(v.id)
payActions.setFieldValue(`payWayIds-${index}`, payWayIds)
})
})
payActions.setFieldValue('isSelected', data.isSelected)
......@@ -192,6 +191,8 @@ const PaySetting: React.FC<{}> = () => {
}).then(res => {
if (res.code === 1000) {
let { data } = res.data
memberRowCtl.setSelectedRowKeys(data.map(v => v.memberId))
memberRowCtl.setSelectRow(data)
payActions.setFieldValue('applyMember', data)
}
})
......@@ -416,6 +417,7 @@ const PaySetting: React.FC<{}> = () => {
}
}
//新增
console.log(param, 10086)
if (param.memberIdRoleIds.length === 0 && values.isSelected === 0) {
message.error('请选择指定的会员');
return
......@@ -493,10 +495,10 @@ const PaySetting: React.FC<{}> = () => {
}
}
tableProps={{
rowKey: 'memberId'
rowKey: 'id'
}}
/>
</PageHeaderWrapper>
)
}
export default PaySetting
\ No newline at end of file
export default PaySetting
import React, { useRef } from 'react';
import { Card, Row, Col, Space, Button } from 'antd';
import { PlusOutlined } from '@ant-design/icons';
import { Card, Button } from 'antd';
import { history } from 'umi';
import { PageHeaderWrapper } from '@ant-design/pro-layout';
import { StandardTable } from 'god';
import { ColumnType } from 'antd/lib/table/interface';
import { PublicApi } from '@/services/api';
import StatusSwitch from '@/components/StatusSwitch';
const SensitiveWords: React.FC<{}> = () => {
const ref = useRef<any>({});
const columns: ColumnType<any>[] = [
{
title: '参数编号',
key: 'id',
dataIndex: 'id',
key: 'code',
dataIndex: 'code',
}, {
title: '参数名称',
key: 'name',
dataIndex: 'name',
}, {
title: '参数描述',
key: 'remarks',
dataIndex: 'remarks',
key: 'details',
dataIndex: 'details',
},{
title: '参数值',
key: 'zhi',
dataIndex: 'zhi',
key: 'parameterValue',
dataIndex: 'parameterValue',
},{
title: '状态',
key: 'status',
dataIndex: 'status',
key: 'state',
dataIndex: 'state',
render: (text: any, record: any) => (
<StatusSwitch fieldNames="status" handleConfirm={() => handleChangeStatus(record.id, record.status)} record={record} />
)
},{
title: '操作',
key: 'options',
dataIndex: 'options',
render: (text:any, record: any) => <Button type='link' onClick={() => history.push(`/system/platformArg/edit?id=${record.id}&parameterValue=${record.parameterValue}`)}>修改</Button>
}
]
const controllerBtns = <Row>
<Col span={24}>
<Space direction="horizontal" size={16}>
<Button type="primary" icon={<PlusOutlined />}>新建</Button>
</Space>
</Col>
</Row>
/**切换状态 */
const handleChangeStatus = async (id: any, status: any) => {
let _status = status === 1 ? 0 : 1
await PublicApi.postManageParameterManageUpdateState({ id: id, status: _status })
ref.current.reload()
}
/**获取单位列表数据 */
const fetchdata = (params: any) => {
return new Promise(resolve => {
PublicApi.getManageParameterManagePage({ ...params }).then(res => {
if (res.code === 1000) {
resolve(res.data)
}
})
})
}
return (
<PageHeaderWrapper>
<Card>
<StandardTable
currentRef={ref}
columns={columns}
tableProps={{ rowKew: 'id' }}
tableProps={{ rowKey: 'id' }}
fetchTableData={params => fetchdata(params)}
/>
</Card>
</PageHeaderWrapper>
)
}
export default SensitiveWords;
\ No newline at end of file
export default SensitiveWords;
import React, { useEffect } from 'react';
import { PageHeaderWrapper } from '@ant-design/pro-layout';
import { history } from 'umi';
import ReutrnEle from '@/components/ReturnEle';
import { Card, Form, Input, Button, Space, Popconfirm, message } from 'antd';
import { PublicApi } from '@/services/api';
const layout: any = {
colon: false,
labelCol: { style: { width: '174px' } },
wrapperCol: { span: 9 },
labelAlign: "left"
};
const tailLayout = {
wrapperCol: { style: { marginLeft: '174px' } },
};
const Template: React.FC<{}> = () => {
const [form] = Form.useForm();
const { query } = history.location;
const onFinish = (values: any) => {
values.id = query.id;
PublicApi.postManageParameterManageUpdate(values).then(res => {
if (res.code === 1000) {
history.goBack();
message.success('修改敏感词成功')
}
})
}
const confirmCancel = () => {
history.goBack()
}
useEffect(() => {
form.setFieldsValue({
parameterValue: query.parameterValue
})
}, [])
return (
<PageHeaderWrapper
onBack={() => history.goBack()}
backIcon={<ReutrnEle description="返回" />}
>
<Card>
<Form
{...layout}
form={form}
onFinish={onFinish}
>
<Form.Item label='参数值' name='parameterValue' rules={[{ required: true, message: '请输入参数值' }]}>
<Input />
</Form.Item>
<Form.Item {...tailLayout}>
<Space size={24}>
<Button type='primary' htmlType="submit">保存</Button>
<Popconfirm
onConfirm={confirmCancel}
title="确定要执行这个操作?"
okText="确定"
cancelText="取消"
>
<Button>取消</Button>
</Popconfirm>
</Space>
</Form.Item>
</Form>
</Card>
</PageHeaderWrapper>
)
}
export default Template;
......@@ -28,7 +28,6 @@ const SensitiveWords: React.FC<{}> = () => {
} else {
message.error('请选择要操作的数据')
}
}
const columns: ColumnType<any>[] = [
{
......@@ -102,7 +101,7 @@ const SensitiveWords: React.FC<{}> = () => {
<StandardTable
currentRef={ref}
columns={columns}
tableProps={{ rowKew: 'id' }}
tableProps={{ rowKey: 'id' }}
rowSelection={rowSelection}
fetchTableData={(params) => fetchdata(params)}
formilyLayouts={{
......@@ -154,4 +153,4 @@ const SensitiveWords: React.FC<{}> = () => {
</PageHeaderWrapper>
)
}
export default SensitiveWords;
\ No newline at end of file
export default SensitiveWords;
import React, { useRef } from 'react';
import { Card, Row, Col, Space, Button } from 'antd';
import { Card, Row, Col, Space, Button, Popconfirm, message } from 'antd';
import { PlusOutlined } from '@ant-design/icons';
import { PageHeaderWrapper } from '@ant-design/pro-layout';
import { StandardTable } from 'god';
import { ColumnType } from 'antd/lib/table/interface';
import { PublicApi } from '@/services/api';
import { history } from 'umi';
import StatusSwitch from '@/components/StatusSwitch';
const SensitiveWords: React.FC<{}> = () => {
const ref = useRef<any>({});
/**切换状态 */
const handleChangeStatus = async (id: any, status: any) => {
let _status = status === true ? 'false' : 'true'
await PublicApi.getManageUnitUpdateUnitStatus({ id: id, status: _status })
ref.current.reload()
}
const confirmCancel = (id: number) => {
PublicApi.postManageSensitiveWordDelete({ id }).then(res => {
if (res.code === 1000) {
message.success('删除成功')
ref.current.Reload()
}
})
}
const columns: ColumnType<any>[] = [
{
title: 'ID',
......@@ -18,36 +35,60 @@ const SensitiveWords: React.FC<{}> = () => {
dataIndex: 'name',
}, {
title: '英文简称',
key: 'remarks',
dataIndex: 'remarks',
key: 'englishShortName',
dataIndex: 'englishShortName',
},{
title: '状态',
key: 'status',
dataIndex: 'status',
render: (text: any, record: any) => (
<StatusSwitch fieldNames="status" handleConfirm={() => handleChangeStatus(record.id, record.status)} record={record} />
)
},{
title: '操作',
key: 'options',
dataIndex: 'options',
render: (text: any, record: any) => {
return (
<>
<Button
type='link'
href={`/system/sensitiveWords/edit?id=${record.id}}`}
>修改</Button>
<Popconfirm
onConfirm={() => confirmCancel(record.id)}
title="确定要执行这个操作?"
okText="确定"
cancelText="取消"
>
<Button type='link'>删除</Button>
</Popconfirm>
</>
)
}
},
]
const controllerBtns = <Row>
<Col span={24}>
<Space direction="horizontal" size={16}>
<Button type="primary" icon={<PlusOutlined />}>新建</Button>
<Button type="primary"
icon={<PlusOutlined />}
onClick={() => history.push(`/system/unit/add`)}
>新建</Button>
</Space>
</Col>
</Row>
/**获取单位列表数据 */
// const fetchdata = (params: any) => {
// return new Promise(resolve => {
// PublicApi.getManageUnitGetUnitList({ ...params }).then(res => {
// if (res.code === 1000) {
// resolve(res.data)
// }
// })
// })
// }
const fetchdata = (params: any) => {
return new Promise(resolve => {
PublicApi.getManageUnitGetUnitList({ ...params }).then(res => {
if (res.code === 1000) {
resolve(res.data)
}
})
})
}
return (
<PageHeaderWrapper>
......@@ -55,7 +96,8 @@ const SensitiveWords: React.FC<{}> = () => {
<StandardTable
currentRef={ref}
columns={columns}
tableProps={{ rowKew: 'id' }}
tableProps={{ rowKey: 'id' }}
fetchTableData={(params) => fetchdata(params)}
formilyLayouts={{
justify: 'space-between'
}}
......@@ -105,4 +147,4 @@ const SensitiveWords: React.FC<{}> = () => {
</PageHeaderWrapper>
)
}
export default SensitiveWords;
\ No newline at end of file
export default SensitiveWords;
......@@ -2,7 +2,8 @@ import React from 'react';
import { PageHeaderWrapper } from '@ant-design/pro-layout';
import { history } from 'umi';
import ReutrnEle from '@/components/ReturnEle';
import { Card, Form, Input, Button, Space } from 'antd';
import { Card, Form, Input, Button, Space, message, Popconfirm } from 'antd';
import { PublicApi } from '@/services/api';
const layout: any = {
colon: false,
labelCol: { style: { width: '174px' } },
......@@ -10,28 +11,65 @@ const layout: any = {
labelAlign: "left"
};
const tailLayout = {
wrapperCol: { style: { marginLeft: '174px' } },
wrapperCol: { style: { marginLeft: '174px' } },
};
const Template:React.FC<{}> = () => {
return(
const [form] = Form.useForm();
const { pathname, query } = history.location;
const type = pathname.split('/')[pathname.split('/').length - 1];
const onFinish = (values: any) => {
if (type === 'add') {
PublicApi.postManageUnitSaveOrUpdateUnit(values).then(res => {
if (res.code === 1000) {
history.goBack();
message.success('新增单位成功')
}
})
}
else {
values.id = query.id;
PublicApi.postManageUnitSaveOrUpdateUnit(values).then(res => {
if (res.code === 1000) {
history.goBack();
message.success('修改单位成功')
}
})
}
}
const confirmCancel = () => {
history.goBack()
}
const Template: React.FC<{}> = () => {
return (
<PageHeaderWrapper
onBack={() => history.goBack()}
backIcon={<ReutrnEle description="返回" />}
>
<Card>
<Form
form={form}
{...layout}
onFinish={onFinish}
>
<Form.Item label='单位名称' name='name' rules={[{ required: true, message: '请输入单位名称' }]}>
<Input />
</Form.Item>
<Form.Item label='英文简称' name='enName' rules={[{ required: true, message: '请输入英文简称' }]}>
<Form.Item label='英文简称' name='englishShortName' rules={[{ required: true, message: '请输入英文简称' }]}>
<Input />
</Form.Item>
<Form.Item {...tailLayout}>
<Space size={24}>
<Button type='primary'>保存</Button>
<Button>取消</Button>
<Button type='primary' htmlType="submit">保存</Button>
<Popconfirm
onConfirm={confirmCancel}
title="确定要执行这个操作?"
okText="确定"
cancelText="取消"
>
<Button>取消</Button>
</Popconfirm>
</Space>
</Form.Item>
</Form>
......@@ -40,4 +78,4 @@ const Template:React.FC<{}> = () => {
)
}
export default Template;
\ No newline at end of file
export default Template;
......@@ -33,7 +33,7 @@ const CheckBrand: React.FC<{}> = () => {
loadPageData(id)
}
}, [])
const columns: ColumnType<any>[] = [
{
title: '序号',
......@@ -129,11 +129,11 @@ const CheckBrand: React.FC<{}> = () => {
let imgArray = Object.values(proveInfo)
return imgArray.map((item: any, index: number) => <Col key={index} span={3} xxl={3} xl={4} lg={4}>
<div className={styles.proveBox}>
<Image
<Image
width={175}
height={120}
src={item}
alt="品牌相关证明材料"
src={item}
alt="品牌相关证明材料"
/>
</div>
</Col>
......@@ -166,14 +166,14 @@ const CheckBrand: React.FC<{}> = () => {
if(res.code=1000){
handleCancel()
setDisableCheck(true)
loadPageData(brandInfo.id)
loadPageData(res.data)
}
})
})
}
const handleCancel = () => {
checkForm.resetFields()
checkForm.resetFields()
setVisibleModal(false)
}
......@@ -188,7 +188,7 @@ const CheckBrand: React.FC<{}> = () => {
backIcon={<ReutrnEle logoSrc={brandInfo?.logoUrl} />}
content={content}
extra={[
<Button
<Button
icon={<CheckSquareOutlined />}
key="1"
type="primary"
......@@ -232,8 +232,8 @@ const CheckBrand: React.FC<{}> = () => {
layout="vertical"
form={checkForm}
>
<Form.Item
name="status"
<Form.Item
name="status"
label=""
rules={[
{
......@@ -249,8 +249,8 @@ const CheckBrand: React.FC<{}> = () => {
</Radio.Group>
</Form.Item>
{
checkStatus===3 && <Form.Item
name="checkRemark"
checkStatus===3 && <Form.Item
name="checkRemark"
label='审核不通过原因'
rules={[
{
......
......@@ -20,7 +20,6 @@ const getConfigMap = (tokens) => tokens.map(v => ({
enabled: false,
},
outputFilePath: `src/services/${v.name}Api`,
requestFunctionFilePath: 'request.ts',
dataKey: 'data',
projects: [
{
......
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