Commit 8eba425b authored by GuanHua's avatar GuanHua
parents 08bb8fed 38aa787a
......@@ -48,7 +48,44 @@ const MemberRoute = {
name: 'maintainDetail',
key: 'maintainDetail',
hideInMenu: true,
component: '@/pages/member/memberMaintain/maintainDetail',
component: '@/pages/member/memberMaintain/detailed',
routes: [
{
path: '/memberCenter/memberAbility/manage/maintainDetail/basicInfo',
name: 'basicInfo',
key: 'basicInfo',
component: '@/pages/member/memberMaintain/detailed/basicInfo',
hideInMenu: true,
},
{
path: '/memberCenter/memberAbility/manage/maintainDetail/powerInfo',
name: 'powerInfo',
key: 'powerInfo',
component: '@/pages/member/memberMaintain/detailed/powerInfo',
hideInMenu: true,
},
{
path: '/memberCenter/memberAbility/manage/maintainDetail/levelInfo',
name: 'levelInfo',
key: 'levelInfo',
component: '@/pages/member/memberMaintain/detailed/levelInfo',
hideInMenu: true,
},
{
path: '/memberCenter/memberAbility/manage/maintainDetail/equityInfo',
name: 'equityInfo',
key: 'equityInfo',
component: '@/pages/member/memberMaintain/detailed/equityInfo',
hideInMenu: true,
},
{
path: '/memberCenter/memberAbility/manage/maintainDetail/sincerityInfo',
name: 'sincerityInfo',
key: 'sincerityInfo',
component: '@/pages/member/memberMaintain/detailed/sincerityInfo',
hideInMenu: true,
},
],
},
{
path: '/memberCenter/memberAbility/manage/frozen',
......@@ -143,10 +180,6 @@ const MemberRoute = {
component: '@/pages/member/memberQuery/detailed',
hideInMenu: true,
routes: [
// {
// path: '/memberCenter/memberAbility/query/detailed',
// redirect: '/memberCenter/memberAbility/query/detailed/basicInfo',
// },
{
path: '/memberCenter/memberAbility/query/detailed/basicInfo',
name: 'basicInfo',
......
......@@ -38,7 +38,7 @@
"@umijs/test": "^3.2.0",
"bizcharts": "^4.0.14",
"copy-to-clipboard": "^3.3.1",
"god": "^0.1.26",
"god": "^0.1.27",
"lingxi-design": "^1.0.7",
"lingxi-design-ui": "^1.0.8",
"lingxi-editor-core": "^1.0.6",
......
/*
* @Author: LeeJiancong
* @Date: 2020-07-13 14:08:50
* @LastEditors: XieZhiXiong
* @LastEditTime: 2020-09-03 09:56:52
* @LastEditors: LeeJiancong
* @LastEditTime: 2020-09-04 17:28:55
*/
export default {
......@@ -75,6 +75,11 @@ export default {
'menu.memberAbility.memberManage.memberLevel': '会员等级',
'menu.memberAbility.memberManage.addEquity': '会员权益设置',
'menu.memberAbility.memberManage.maintainDetail': '会员详情',
'menu.memberAbility.memberManage.maintainDetail.basicInfo': '会员基本信息',
'menu.memberAbility.memberManage.maintainDetail.powerInfo': '会员权限信息',
'menu.memberAbility.memberManage.maintainDetail.levelInfo': '会员等级信息',
'menu.memberAbility.memberManage.maintainDetail.equityInfo': '权益信息',
'menu.memberAbility.memberManage.maintainDetail.sincerityInfo': '诚信信息',
'menu.memberAbility.memberManage.maintainFrozen': '会员冻结与解除',
'menu.memberAbility.memberQuery': '会员信息查询',
'menu.memberAbility.memberQueryDetailed': '会员信息详情',
......@@ -107,6 +112,7 @@ export default {
'menu.tranactionAbility.enquirySubmit': '需求发布',
'menu.tranactionAbility.enquirySubmit.toAddSubmitList': '待新增需求单',
'menu.tranactionAbility.enquirySubmit.addEnquiry': '新增需求单',
'menu.tranactionAbility.enquirySubmit.viewEnquiryDetail': '需求单详情',
'menu.tranactionAbility.enquirySubmit.enquiryOne': '待审核报价单(一级)',
'menu.tranactionAbility.enquirySubmit.enquiryTwo': '待审核报价单(二级)',
'menu.tranactionAbility.purchaseOrder': '采购订单',
......
import { GetProductChannelCommodityGetCommodityListResponseDetail } from '@/services';
import { GetProductChannelCommodityGetCommodityListResponseDetail, GetProductChannelCommodityGetCommodityUnitPriceResponse } from '@/services';
export interface IChannelProductModule {
productSelectRowInStore: GetProductChannelCommodityGetCommodityListResponseDetail;
priceType: number;
productName: string;
currentActiveKey: number;
currentActiveKey: string;
currentOperateChannel: string;
tableDataInSetPrice: GetProductChannelCommodityGetCommodityUnitPriceResponse[];
setProductSelectRowInStore(data: GetProductChannelCommodityGetCommodityListResponseDetail): void;
setPriceType(data: number): void;
setProductName(data: string): void;
setCurrentActiveKey(data: string): void;
setCurrentOperateChannel(data: string): void;
setTableDataInSetPrice(data: GetProductChannelCommodityGetCommodityUnitPriceResponse[]): void;
}
\ No newline at end of file
import { GetMemberAbilityMaintenanceDetailBasicResponse } from '@/services/MemberApi';
export interface IMemberModule {
memberMaintainInfo: GetMemberAbilityMaintenanceDetailBasicResponse;
setmemberMaintainInfo(data: GetMemberAbilityMaintenanceDetailBasicResponse): void;
}
\ No newline at end of file
......@@ -74,6 +74,7 @@ const AddPropertyValue: React.FC<{}> = () => {
const handleSubmitAllSetting = () => {
attrValueForm.validateFields().then(values => {
const { attrId, attrName } = history.location.query
let pararms = {...values}
delete pararms.attributeName
if(JSON.stringify(pararms.attributeValue)==='{}')
......@@ -82,7 +83,7 @@ const AddPropertyValue: React.FC<{}> = () => {
PublicApi.postProductCustomerSaveOrUpdateCustomerAttributeValue(pararms).then(res => {
if(res.code === 1000)
// history.goBack()
history.push(`/memberCenter/commodityAbility/classAndProperty/propertyValue?before=${history.location.query.attrId}`)
history.push(`/memberCenter/commodityAbility/classAndProperty/propertyValue?attrId=${attrId}&attrName=${attrName}`)
})
}).catch(error => {
......
......@@ -51,8 +51,8 @@ const PropertyValue: React.FC<{}> = () => {
useEffect(() => {
let prefix = sessionStorage.getItem('beforeKeyPrefix')
let beforeKey = history.location.query.before
console.log(prefix, beforeKey)
let beforeKey = history.location.query.attrId
if(beforeKey){ // 展开之前的选择项
setSelectKey(beforeKey)
treeActions.setExpandedKeys([`${prefix}_${beforeKey}`]) // 拼接不正常的key
......@@ -240,7 +240,9 @@ const PropertyValue: React.FC<{}> = () => {
<Button
type="primary"
icon={<PlusOutlined />}
onClick={() => { history.push(`/memberCenter/commodityAbility/classAndProperty/propertyValue/addPropertyValue?attrId=${selectKey}&attrName=${selectNode._title}`) }}
onClick={() => {
history.push(`/memberCenter/commodityAbility/classAndProperty/propertyValue/addPropertyValue?attrId=${selectKey||history.location.query.attrId}&attrName=${selectNode?._title||history.location.query.attrName}`)
}}
>
新建
</Button>
......
import React, {useState, useRef, useEffect} from 'react'
import { history } from 'umi';
import { Button, Form, Card, Tabs, Input, Radio, Table, message, Row, Col } from 'antd'
import { Button, Form, Card, Tabs, Input, Radio, Table, message, Row, Col, Select } from 'antd'
import {
PlusOutlined, SettingOutlined,
} from '@ant-design/icons'
......@@ -14,6 +14,7 @@ import { store } from '@/store'
import { inject, observer } from 'mobx-react'
const { Search } = Input
const { Option } = Select
const layout = {
labelCol: {
......@@ -24,6 +25,12 @@ const layout = {
},
}
interface IOption {
key: string;
value: number;
children: string;
}
interface IProps {
onRef: (refs: any) => void;
}
......@@ -37,6 +44,7 @@ const SelectChannel:React.FC<IProps> = (props) => {
const [memberRoleList, setMemberRoleList] = useState<any[]>([])
const [selectedMemberRowKeys, setSelectedMemberRowKeys] = useState<any>([])
const [selectMemberRow, setSelectMemberRow] = useState<any[]>([]) // 选中的会员弹框数据
const [selectedOption ,setSelectedOption] = useState<IOption>()
const { ChannelProudctStore } = store
const {
......@@ -117,12 +125,25 @@ const SelectChannel:React.FC<IProps> = (props) => {
useEffect(() => {
onRef(formMember)
// 获取所有的会员角色
PublicApi.getMemberManageRoleList().then(res => {
const { data } = res
setMemberRoleList(data)
if(data.length > 0){
let initSelectOption = {
key: '0',
value: data[0].roleId,
children: data[0].roleName
}
setSelectedOption(initSelectOption)
}
})
}, [])
// 获取渠道会员
const fetchMemberData = (params: any) => {
return new Promise((resolve, reject) => {
PublicApi.getMemberManageChannelLowerPage(params).then(res => {
PublicApi.getMemberManageChannelLowerPage({ memberIds: [], name: selectedOption.children, roleId: selectedOption.value ,...params }).then(res => {
const { data } = res
resolve(data)
})
......@@ -170,68 +191,79 @@ const SelectChannel:React.FC<IProps> = (props) => {
setCurrentOperateChannel('所有渠道会员')
}
const roleChange = (value: number, option: IOption) => {
setSelectedOption(option)
}
return (<>
<Row>
<Col span={18}>
<Form
{...layout}
form={formMember}
name="add-channel-merchant"
labelAlign="left"
>
{/* {
memberRoleList.length>0 && <Form.Item name="channelMemberRoleId">
<Radio.Group buttonStyle="solid" className={styles.customizeRadio}>
{
memberRoleList.map((item, index) => (
<Radio.Button key={index} value={item.roleId}>{item.roleName}</Radio.Button>
))
}
</Radio.Group>
</Form.Item>
} */}
<Form.Item name="channelMemberRoleId">
<Radio.Group buttonStyle="solid" defaultValue={1} className={styles.customizeRadio}>
<Radio.Button key={1} value={1}>渠道采购商</Radio.Button>
<Radio.Button key={2} value={2}>渠道自有采购商</Radio.Button>
</Radio.Group>
</Form.Item>
<Form.Item
name="isAllMember"
label="选择渠道会员"
rules={[{
required: true,
message: '请选择渠道会员'
}]}
initialValue={isAllMember}
{
memberRoleList.length>0 && <>
<Col span={18}>
<Form
{...layout}
form={formMember}
name="add-channel-merchant"
labelAlign="left"
colon={false}
initialValues={{channelMemberRoleId: memberRoleList[0].roleId}}
>
<Radio.Group onChange={handleIsAllMemberChange}>
<Radio value={true}>所有渠道会员(默认)</Radio>
<Radio value={false}>指定渠道会员</Radio>
</Radio.Group>
</Form.Item>
</Form>
</Col>
<Col span={6} style={{display: 'flex', justifyContent: 'flex-end', flexWrap: 'wrap'}}>
<div>
<p>
<Search
placeholder="渠道会员名称"
onSearch={value => console.log(value)}
style={{ width: 256 }}
/>
</p>
</div>
<div>
<p>
<Button
type="text"
icon={<SettingOutlined />}
onClick={clickBatchSetting}
>批量设置渠道商品</Button>
</p>
</div>
</Col>
{/* <Form.Item name="channelMemberRoleId">
<Radio.Group buttonStyle="solid" defaultValue={1} className={styles.customizeRadio}>
<Radio.Button key={1} value={1}>渠道采购商</Radio.Button>
<Radio.Button key={2} value={2}>渠道自有采购商</Radio.Button>
</Radio.Group>
</Form.Item> */}
<Form.Item
label="选择渠道角色"
name="channelMemberRoleId"
>
<Select onChange={roleChange} placeholder="选择渠道会员角色">
{
memberRoleList.map((item, index) => (
<Option key={index} value={item.roleId}>{item.roleName}</Option>
))
}
</Select>
</Form.Item>
<Form.Item
name="isAllMember"
label="选择渠道会员"
rules={[{
required: true,
message: '请选择渠道会员'
}]}
initialValue={isAllMember}
>
<Radio.Group onChange={handleIsAllMemberChange}>
<Radio value={true}>所有渠道会员(默认)</Radio>
<Radio value={false}>指定渠道会员</Radio>
</Radio.Group>
</Form.Item>
</Form>
</Col>
<Col span={6} style={{display: 'flex', justifyContent: 'flex-end', flexWrap: 'wrap'}}>
<div>
<p>
<Search
placeholder="渠道会员名称"
onSearch={value => console.log(value)}
style={{ width: 256 }}
/>
</p>
</div>
<div>
<p>
<Button
type="text"
icon={<SettingOutlined />}
onClick={clickBatchSetting}
>批量设置渠道商品</Button>
</p>
</div>
</Col>
</>
}
</Row>
{
!isAllMember ? <>
......
......@@ -116,7 +116,7 @@ const SelectProduct:React.FC<IProps> = (props) => {
]
useEffect(() => {
onRef(productFormRef)
onRef(formProduct)
formProduct.setFieldsValue({source: source})
// 获取会员角色列表
......
......@@ -69,11 +69,12 @@ const SetPrice:React.FC<IProps> = (props) => {
priceType,
productName,
productSelectRowInStore,
currentOperateChannel
currentOperateChannel,
setTableDataInSetPrice
} = ChannelProudctStore
useEffect(() => {
onRef(formPrice)
}, [])
......@@ -93,6 +94,7 @@ const SetPrice:React.FC<IProps> = (props) => {
}
const structureTable = (data: any, name?: string) => {
console.log(data, 'structureTableData')
// 构建table 列columns
let col: any = []
let temp: any = []
......@@ -148,11 +150,11 @@ const SetPrice:React.FC<IProps> = (props) => {
})
_tableData.push({
"id": item.id, // 行数据id
"goodsId": item.goods.id, // 货品ID
"goodsId": item.goods?.id || '', // 货品ID 可能为null
"索引": index,
// "商品名称": productRowCtl.selectRow[0].name,
"商品名称": name || productName,
"对应货品": item.goods.name,
"对应货品": item.goods?.name || '',
...temp,
"单价": item.unitPrice
})
......@@ -322,6 +324,7 @@ const SetPrice:React.FC<IProps> = (props) => {
newTabeData[curretSetPriceRow['索引']] = _row
}
setPriceTableData(newTabeData)
console.log(newTabeData, '价格修改之后的tableData')
})
}
......@@ -398,9 +401,9 @@ const SetPrice:React.FC<IProps> = (props) => {
</Button>
{
priceTableData.length > 0 && priceType != 2 &&
<Button
type="text"
style={{float: 'right'}}
<Button
type="text"
style={{float: 'right'}}
onClick={clickBatchSetPrice}
>
<SettingOutlined />
......
......@@ -35,7 +35,10 @@ const AddDirectChannel:React.FC<{}> = (props) => {
} = ChannelProudctStore
useEffect(() => {
console.log('初始化')
return () => {
setCurrentActiveKey('1')
}
}, [])
......@@ -47,6 +50,7 @@ const AddDirectChannel:React.FC<{}> = (props) => {
const onSave = () => {
let data = formRefs.map(async __ => {
console.log(__, '____')
return (
await __.validateFields()
)
......
......@@ -14,11 +14,15 @@ import PriceAttributeForm from './addProductsItem/priceAttributeForm'
import LogisticsForm from './addProductsItem/logisticsForm'
import OtherForm from './addProductsItem/otherForm'
import ProductImageForm from './addProductsItem/productImageForm'
import ProductDescFormOne from './addProductsItem/productDescFormOne'
import ProductDescFormDefualt from './addProductsItem/productDescFormDefault'
import ProductDescFormCloud from './addProductsItem/productDescFormCloud'
import { inject, observer } from 'mobx-react'
import { store } from '@/store'
import { PublicApi } from '@/services/api'
import { render } from '@/app';
const demoFetch = require('../../../../demo').fetchConfig
const { TabPane } = Tabs
......@@ -28,6 +32,7 @@ const AddProducts: React.FC<{}> = (props) => {
const [attributeList, setAttributeList] = useState<any[]>([])
const [clickTabIndex, setClickTabIndex] = useState<string[]>(['1'])
const [isDisableSaveBtn, setIsDisableSaveBtn] = useState<boolean>(false)
const [currentTemplateName, setCurrentTemplateName] = useState<string>()
let [formRefs, setFormRefs] = useState([]) //子form的ref数组
const { ProductStore } = store
const {
......@@ -45,6 +50,8 @@ const AddProducts: React.FC<{}> = (props) => {
} = ProductStore
useEffect(()=>{
productDescriptionTemplate()
const { id } = history.location.query
if(id){
const makeRequest = async () => {
......@@ -60,10 +67,30 @@ const AddProducts: React.FC<{}> = (props) => {
return () => {
clearData([])
console.log('添加商品组件卸载')
}
}, [])
// useEffect(() => {
// renderTemplate(currentTemplateName)
// }, [currentTemplateName])
// 获取页面使用模板
const productDescriptionTemplate = async () => {
let globalData = await demoFetch()
PublicApi.getTemplateGoodsFindUseGoodsTemplate({siteId: globalData.global.siteId}).then(res => {
if(res.code === 1000)
setCurrentTemplateName(res.data.fileName)
})
}
// 切换模板
const renderTemplate = () => {
// if(currentTemplateName === 'science')
return <ProductDescFormDefualt />
// else if(currentTemplateName === 'cloud')
// return <ProductDescFormCloud />
}
const onSave = () => {
setIsDisableSaveBtn(true)
const { id } = history.location.query
......@@ -296,7 +323,10 @@ const AddProducts: React.FC<{}> = (props) => {
<ProductImageForm />
</TabPane>
<TabPane tab="商品描述" key="6">
<ProductDescFormOne />
{/* <ProductDescFormDefualt /> */}
{
renderTemplate()
}
</TabPane>
<TabPane tab="物流信息" key="7">
<LogisticsForm
......
......@@ -46,4 +46,61 @@
position: absolute;
bottom: 0;
}
}
// productDescFormCloud // yunxiancai template
.cloud-container{
width: 790px;
}
.cloud-media-content-box{
width: 790px;
margin: 24px 0;
height: auto !important;
}
.cloud-descript-box{
position: relative;
width: 790px;
margin: 24px 0;
border:1px solid rgba(235,236,240,1);
text-align: center;
color:rgba(151,160,175,1);
// height: 148px;
height: 48px;
p{
height: 128px;
line-height: 128px;
}
.cloudPVideo, .cloudMiddleAddBtn{
// height: 44px;
// line-height: 1.5;
position: absolute;
top:50%;
left:50%;
transform: translate(-50%, -50%);
}
.cloudDivVideo, .cloudDivImage{
margin: 24px auto;
height: auto;
img{
width: 320px;
height: 240px;
}
}
.cloud-right-btn{
position: absolute;
top: 0;
right: 0;
Button{
display: block;
width:36px;
height:36px;
background:rgba(250,251,252,1);
border-color: #ebecf0;
border-radius: 0px;
border-top: none;
border-right: none;
}
}
}
\ No newline at end of file
......@@ -72,6 +72,7 @@ const PriceAttributeForm: React.FC<Iprops> = (props) => {
if(history.location.query?.id){ // 编辑情况下 用于判断价格类型和显示单位
setPlanPrice(productInfoByEdit?.priceType)
handleUnitSearch(getPriceAttributeFormParamsByEdit.unitName)
setMinOrderNumber(productInfoByEdit?.minOrder) // 先设置最小起订数 便于后续价格校验
}
return ()=>{
console.log('价格属性组件卸载')
......
......@@ -15,7 +15,7 @@ export interface Iprops {
import { inject, observer } from 'mobx-react'
import { store } from '@/store'
const ProductDescFormOne: React.FC<Iprops> = (props) => {
const ProductDescFormDefualt: React.FC<Iprops> = (props) => {
const [fileImageList, setFileImageList] = useState<any>([])
const [videoList, setVideoList] = useState<any>([])
......@@ -180,4 +180,4 @@ const ProductDescFormOne: React.FC<Iprops> = (props) => {
</>)
}
export default observer(ProductDescFormOne)
\ No newline at end of file
export default observer(ProductDescFormDefualt)
\ No newline at end of file
......@@ -145,11 +145,13 @@
padding: 12px 0;
border:1px solid rgba(235,236,240,1);
display: flex;
flex-flow: wrap;
justify-content: left;
.imgItem{
width:180px;
height:180px;
margin-left: 16px;
margin-bottom: 12px;
border:1px solid rgba(235,236,240,1);
img{
width: 100%;
......@@ -161,11 +163,18 @@
height:240px;
margin-left: 16px;
border:1px solid rgba(235,236,240,1);
video {
width: 100%;
height: 100%;
}
}
p{
padding: 16px;
padding: 0 16px;
}
}
.description-word-box{
flex-direction: column;
}
.product-img-box{
margin: 24px;
padding: 12px 0;
......@@ -192,6 +201,9 @@
border-radius:4px;
color:rgba(0,179,122,1);
}
.descript-null {
opacity: 0.6;
}
// 修改单价
.site-input-right {
......
......@@ -8,6 +8,7 @@ import {
UserOutlined
} from '@ant-design/icons'
import { ColumnType } from 'antd/lib/table/interface'
import cx from 'classnames'
import ReutrnEle from '@/components/ReturnEle'
import styles from "./index.less"
import { PublicApi } from '@/services/api'
......@@ -583,10 +584,14 @@ const viewProducts: React.FC<{}> = () => {
</Space>
<Space direction="vertical" style={{width:'100%'}}>
<Card headStyle={{borderBottom:'none'}} title="商品描述">
{/* 预留 文字区块 */}
{/* <div className={styles.descriptionBox}>
<p>商品描述商品描述商品描述商品描述商品描述商品描述商品描述商品描述商品描述商品描述商品描述商品描述商品描述商品描述商品描述商品描述商品描述</p>
</div> */}
{/* 文字区块 */}
<div className={cx(styles.descriptionBox, styles.descriptionWordBox)}>
{
productDetail?.commodityRemark?.word?.length>0 ? productDetail?.commodityRemark?.word.map((_item, _index) =>
_item && <p>{_item}</p>
) : <p className={styles.descriptNull}>暂无文字数据</p>
}
</div>
{/* 视频区块 */}
<div className={styles.descriptionBox}>
{
......@@ -594,15 +599,15 @@ const viewProducts: React.FC<{}> = () => {
<video src={_item} controls={true}>
您的浏览器不支持视频标签,请及时升级。
</video>
</div>) : <p>暂无数据</p>
</div>) : <p className={styles.descriptNull}>暂无视频数据</p>
}
</div>
{/* 图片区块 */}
<div className={styles.descriptionBox}>
{
productDetail?.commodityRemark?.image?.length>0 ? productDetail?.commodityRemark?.image.map((_item, _index)=> <div key={_index} className={styles.imgItem}>
productDetail?.commodityRemark?.image?.length>0 ? productDetail?.commodityRemark?.image.map((_item, _index)=> _item && <div key={_index} className={styles.imgItem}>
<img src={_item} />
</div>) : <p>暂无数据</p>
</div>) : <p className={styles.descriptNull}>暂无图片数据</p>
}
</div>
</Card>
......
......@@ -101,7 +101,7 @@ const BasicInfo: React.FC<BasicInfoProps> = ({
<Row gutter={20}>
<Col span={12}>
<Descriptions column={1} className={styles.descriptions}>
{item.elements.map((ele, index) => index % 2 !== 0 ? (
{item.elements.map((ele, index) => (index + 1) % 2 !== 0 ? (
<Descriptions.Item key={index} label={ele.fieldCNName}>
{
ele.fieldType !== 'upload' ?
......@@ -118,7 +118,7 @@ const BasicInfo: React.FC<BasicInfoProps> = ({
</Col>
<Col span={12}>
<Descriptions column={1} className={styles.descriptions}>
{item.elements.map((ele, index) => index % 2 === 0 ? (
{item.elements.map((ele, index) => (index + 1) % 2 === 0 ? (
<Descriptions.Item key={index} label={ele.fieldCNName}>
{
ele.fieldType !== 'upload' ?
......
......@@ -18,11 +18,17 @@ import styles from './index.less';
const { TabPane } = Tabs;
interface PageProps {
detailData: any;
interface EquityInfoProps {
equityInfo?: {
sumReturnMoney?: number,
sumUsedPoint?: number,
sumPoint?: number,
};
}
const EquityInfo: React.FC<{}> = props => {
const EquityInfo: React.FC<EquityInfoProps> = ({
equityInfo = {},
}) => {
const columns: EditableColumns[] = [
{
......@@ -106,7 +112,7 @@ const EquityInfo: React.FC<{}> = props => {
<ul className={styles.tofo}>
<li className={styles['tofo-item']}>
<div className={styles['tofo-item-logo']}>
<img src={equity1} />
<img src={equity3} />
</div>
<div className={styles['tofo-item-title']}>
价格权益
......@@ -119,7 +125,7 @@ const EquityInfo: React.FC<{}> = props => {
<li className={styles['tofo-item']}>
<div className={styles['tofo-item-logo']}>
<img src={equity2} />
<img src={equity1} />
</div>
<div className={styles['tofo-item-title']}>
返现权益
......@@ -132,7 +138,7 @@ const EquityInfo: React.FC<{}> = props => {
<li className={styles['tofo-item']}>
<div className={styles['tofo-item-logo']}>
<img src={equity3} />
<img src={equity2} />
</div>
<div className={styles['tofo-item-title']}>
积分权益
......@@ -156,7 +162,7 @@ const EquityInfo: React.FC<{}> = props => {
累计返现金额
</div>
<div className={styles['exhibition-amount']}>
50000.00
{equityInfo?.sumReturnMoney}
<span>CNY</span>
</div>
</div>
......@@ -180,7 +186,7 @@ const EquityInfo: React.FC<{}> = props => {
可用积分
</div>
<div className={styles['exhibition-amount']}>
2000/200000
{equityInfo?.sumUsedPoint}/{equityInfo?.sumPoint}
</div>
</div>
......
......@@ -24,7 +24,7 @@ export interface InnerHistoryItem {
operation?: string;
innerStatusName?: string;
remark?: string;
innerStatus?: string;
innerStatus?: number;
};
export interface OuterHistoryItem {
......
import React, { useState } from 'react';
import React, { useState, useEffect } from 'react';
import {
Row,
Col,
Progress,
Card,
} from 'antd';
import classNames from 'classnames';
import { MiniArea } from '@/components/Charts';
......@@ -12,24 +11,48 @@ import { EditableColumns } from '@/components/PolymericTable/interface';
import MellowCard from '@/components/MellowCard';
import styles from './index.less';
interface LevelInfoProps {
detailData: any;
}
const PAGE_SIZE = 8;
export interface DataProps {
id?: number;
createTime?: string;
ruleName?: string;
score?: number;
remark?: string;
};
export interface FetchParams {
current: number;
pageSize: number;
};
function getActiveData() {
const activeData = [];
for (let i = 0; i < 12; i += 1) {
activeData.push({
x: `${i}月`,
y: Math.floor(Math.random() * 200) + i * 50,
});
}
return activeData;
export interface LevelInfoProps {
levelInfo?: {
level?: string,
score?: number,
nextLevel?: string,
nextScore?: number,
};
chartData?: {
x: React.ReactText,
y: number,
}[];
fetchList?: (params: FetchParams) => Promise<{ data: DataProps[] , totalCount: number }>;
}
const LevelInfo: React.FC<{}> = props => {
const LevelInfo: React.FC<LevelInfoProps> = ({
levelInfo = {},
chartData = [],
fetchList,
}) => {
const [chartData , setChartData] = useState(getActiveData());
const score = levelInfo.score || 0;
const nextScore = levelInfo.nextScore || 0;
const [page, setPage] = useState(1);
const [size, setSize] = useState(PAGE_SIZE);
const [total, setTotal] = useState(0);
const [list, setList] = useState([]);
const [listLoading, setListLoading] = useState(false);
const columns: EditableColumns[] = [
{
......@@ -39,7 +62,7 @@ const LevelInfo: React.FC<{}> = props => {
},
{
title: '获取项目',
dataIndex: 'project',
dataIndex: 'ruleName',
align: 'center',
},
{
......@@ -49,17 +72,43 @@ const LevelInfo: React.FC<{}> = props => {
},
{
title: '获取时间',
dataIndex: 'created',
dataIndex: 'createTime',
align: 'center',
},
{
title: '备注',
dataIndex: 'node',
dataIndex: 'remark',
align: 'center',
ellipsis: true,
},
];
const getHistoryList = () => {
if (fetchList) {
setListLoading(true);
fetchList({
current: page,
pageSize: size,
}).then(res => {
const { data = [], totalCount = 0 } = (res || {});
setList(data);
setTotal(totalCount);
}).finally(() => {
setListLoading(false);
});
}
};
useEffect(() => {
getHistoryList();
}, []);
const handlePaginationChange = (page: number, size: number) => {
setPage(page);
setSize(size);
getHistoryList();
};
return (
<div className={styles.levelInfo}>
<Row gutter={[0, 24]}>
......@@ -73,23 +122,23 @@ const LevelInfo: React.FC<{}> = props => {
<div className={styles.infoWrap}>
<div className={styles['infoWrap-left']}>
<div className={classNames(styles.card, styles['card-level1'])}>
<div className={styles['card-name']}>青铜会员</div>
<div className={styles['card-name']}>{levelInfo?.level}</div>
<div className={styles['card-progress']}>
<Progress
strokeWidth={4}
strokeLinecap="square"
showInfo={false}
percent={75}
percent={nextScore? (score / levelInfo.nextScore) * 100 : 100}
/>
</div>
<div className={styles['card-txt']}>
<div className={styles['card-experience']}>
5000/15000
{score}/{nextScore}
</div>
<div className={styles['card-higher']}>
白银会员
{levelInfo.nextLevel}
</div>
</div>
......@@ -166,10 +215,14 @@ const LevelInfo: React.FC<{}> = props => {
}}
>
<PolymericTable
dataSource={[]}
dataSource={list}
columns={columns}
loading={false}
pagination={null}
loading={listLoading}
pagination={{
pageSize: size,
total,
}}
onPaginationChange={handlePaginationChange}
/>
</MellowCard>
</Col>
......
......@@ -8,8 +8,6 @@ import { merge } from 'rxjs';
import { usePageStatus } from '@/hooks/usePageStatus';
import ReutrnEle from '@/components/ReturnEle';
import NiceForm from '@/components/NiceForm';
import { useStateFilterSearchLinkageEffect } from '@/formSchema/effects/useFilterSearch';
import { FORM_FILTER_PATH } from '@/formSchema/const';
import { useAsyncSelect } from '@/formSchema/effects/useAsyncSelect';
import { useAsyncInitSelect } from '@/formSchema/effects/useAsyncInitSelect';
import { useLinkageUtils } from '@/utils/formEffectUtils';
......@@ -21,6 +19,7 @@ const formActions = createFormActions();
const {
onFieldValueChange$,
onFieldInputChange$,
onFormInit$,
} = FormEffectHooks;
const addMember: React.FC<any> = props => {
......@@ -44,6 +43,21 @@ const addMember: React.FC<any> = props => {
memberTypeEnum,
groups = [],
areaCodes,
account,
channelLevelTag,
channelTypeName,
countryCode,
createTime,
currentStep,
levelTag,
memberId,
memberTypeName,
name,
outerHistory,
outerStatusName,
roleName,
verifySteps,
...rest
}: any = (res.data || {});
// 注册资料处理
......@@ -59,8 +73,6 @@ const addMember: React.FC<any> = props => {
}
}
console.log('detail', detail)
setMemberInfo({
memberTypeId: memberTypeEnum,
...rest,
......@@ -109,7 +121,9 @@ const addMember: React.FC<any> = props => {
if (res.code !== 1000) {
return;
}
history.replace('/memberCenter/memberAbility/manage/import');
setTimeout(() => {
history.replace('/memberCenter/memberAbility/manage/import');
}, 1000);
}).finally(() => {
setSubmitLoading(false);
});
......@@ -132,7 +146,9 @@ const addMember: React.FC<any> = props => {
if (res.code !== 1000) {
return;
}
history.replace('/memberCenter/memberAbility/manage/import');
setTimeout(() => {
history.replace('/memberCenter/memberAbility/manage/import');
}, 1000);
}).finally(() => {
setSubmitLoading(false);
});
......@@ -164,7 +180,6 @@ const addMember: React.FC<any> = props => {
// 手动触发改变的话重置角色、等级下拉框
onFieldInputChange$('memberTypeId').subscribe(() => {
console.log('onFieldInputChange')
linkage.value('roleId', undefined);
linkage.enum('roleId', []);
linkage.value('levelId', undefined);
......@@ -318,17 +333,18 @@ const addMember: React.FC<any> = props => {
actions={formActions}
initialValues={memberInfo || {}}
effects={($, actions) => {
useStateFilterSearchLinkageEffect(
$,
actions,
'name',
FORM_FILTER_PATH,
);
useAsyncInitSelect(
['memberTypeId', 'countryCodeId'],
getPageitemsBasic,
);
onFormInit$().subscribe(() => {
actions.setFieldState('roleId', state => {
state.loading = true;
})
})
useAsyncLinkageEffect();
}}
schema={initDetailSchema(memberItems)}
......
import React, { useState, useEffect } from 'react';
import { history } from 'umi';
import { PageHeaderWrapper } from '@ant-design/pro-layout';
import { PageHeader, Tag, Descriptions, Steps } from 'antd';
import { STATUS_COLOR_MAP, STATUS_COLOR_TXT } from '../constant';
import { PageHeader, Tag, Descriptions, Steps, Badge, Spin } from 'antd';
import { usePageStatus } from '@/hooks/usePageStatus';
import { PublicApi } from '@/services/api';
import { GetMemberAbilitySubGetResponse } from '@/services/MemberApi';
import MellowCard from '@/components/MellowCard';
import { STATUS_COLOR_MAP, MEMBER_STATUS_TAG_MAP, MEMBER_OUTER_STATUS_TYPE } from '../constant';
import HeadInfo from '../components/HeadInfo';
import BasicInfo from '../components/BasicInfo';
import StatusTag from '../components/StatusTag';
import styles from './index.less';
const importDetail: React.FC<{}> = () => {
const { pageStatus, id, validateId } = usePageStatus();
const [detailed, setDetailed] = useState<any>({});
const { id, validateId } = usePageStatus();
const [memberInfo, setMemberInfo] = useState<GetMemberAbilitySubGetResponse>(null);
const [infoLoading, setInfoLoading] = useState(false);
useEffect(() => {
const getDetailedInfo = () => {
if (id && validateId) {
setInfoLoading(true);
PublicApi.getMemberAbilitySubGet({
memberId: id,
validateId,
}).then(res => {
if (res.code !== 1000) {
return;
}
setMemberInfo(res.data || null);
}).finally(() => {
setInfoLoading(false);
});
}
};
useEffect(() => {
getDetailedInfo();
}, []);
return (
<PageHeaderWrapper
title={
<>
<PageHeader
style={{ padding: '0' }}
onBack={() => history.goBack()}
title={
<HeadInfo
info={{
name: '广州市极致皮具有限公司',
level: 1,
}}
/>
}
>
<Descriptions
size="small"
column={2}
style={{
padding: '0 32px',
}}
<Spin spinning={infoLoading}>
<PageHeaderWrapper
title={
<>
<PageHeader
style={{ padding: '0' }}
onBack={() => history.goBack()}
title={
<HeadInfo
info={{
name: memberInfo?.name,
level: 1,
}}
/>
}
>
<Descriptions.Item label="会员类型">{123}</Descriptions.Item>
<Descriptions.Item label="会员角色">{123}</Descriptions.Item>
<Descriptions.Item label="会员状态">
<Tag color={STATUS_COLOR_MAP[1]}>{STATUS_COLOR_TXT[1]}</Tag>
</Descriptions.Item>
<Descriptions.Item label="外部状态">
<Tag color={STATUS_COLOR_MAP[2]}>{STATUS_COLOR_TXT[2]}</Tag>
</Descriptions.Item>
</Descriptions>
</PageHeader>
</>
}
>
<MellowCard
title="会员审核流程"
style={{
marginBottom: 24,
}}
<Descriptions
size="small"
column={3}
style={{
padding: '0 32px',
}}
>
<Descriptions.Item label="会员类型">{memberInfo?.memberTypeName}</Descriptions.Item>
<Descriptions.Item label="会员角色" span={2}>{memberInfo?.roleName}</Descriptions.Item>
<Descriptions.Item label="会员状态">
<StatusTag type={MEMBER_STATUS_TAG_MAP[memberInfo?.status]} title={memberInfo?.statusName} />
</Descriptions.Item>
<Descriptions.Item label="外部状态">
<StatusTag type={MEMBER_OUTER_STATUS_TYPE[memberInfo?.outerStatus]} title={memberInfo?.outerStatusName} />
</Descriptions.Item>
</Descriptions>
</PageHeader>
</>
}
>
<Steps style={{ marginTop: 30 }} progressDot current={2}>
<Steps.Step title="会员" description="申请注册" />
<Steps.Step title="平台" description="审核会员" />
<Steps.Step title="完成" description="" />
</Steps>
</MellowCard>
<MellowCard
title="会员审核流程"
style={{
marginBottom: 24,
}}
>
<Steps style={{ marginTop: 30 }} progressDot current={memberInfo?.currentStep}>
{memberInfo && memberInfo.verifySteps && memberInfo.verifySteps.map(item => (
<Steps.Step key={item.step} title={item.roleName} description={item.stepName} />
))}
</Steps>
</MellowCard>
<BasicInfo />
</PageHeaderWrapper>
<BasicInfo
basic={{
account: memberInfo?.account,
phone: memberInfo?.phone,
email: memberInfo?.email,
created: memberInfo?.createTime,
}}
channel={{
memberType: memberInfo?.memberTypeEnum,
level: memberInfo?.channelLevelTag,
type: memberInfo?.channelTypeName,
areas: memberInfo?.areas,
desc: memberInfo?.remark,
}}
extra={memberInfo?.groups}
outerHistory={memberInfo?.outerHistory}
innerHistory={memberInfo?.innerHistory}
/>
</PageHeaderWrapper>
</Spin>
);
};
......
......@@ -6,7 +6,8 @@ import {
Button,
Menu,
Popconfirm,
Dropdown,
Dropdown,
message,
} from 'antd';
import {
PlusOutlined,
......@@ -47,6 +48,7 @@ const memberMaintain: React.FC<[]> = () => {
const [visibleModal, setVisibleModal] = useState(false);
const handleDelete = (memberId: number, validateId: number) => {
const mesInstance = message.loading('正在删除');
PublicApi.postMemberAbilitySubDelete({
memberId,
validateId,
......@@ -55,6 +57,8 @@ const memberMaintain: React.FC<[]> = () => {
return;
}
ref.current.reload();
}).finally(() => {
mesInstance();
});
};
......@@ -133,8 +137,8 @@ const memberMaintain: React.FC<[]> = () => {
align: 'center',
filters: [],
onFilter: (value, record) => record.outerStatus === value,
render: (_, record) => (
<StatusTag type={MEMBER_OUTER_STATUS_TYPE[record.outerStatus]} title={MEMBER_OUTER_STATUS[record.outerStatus]} />
render: (text, record) => (
<StatusTag type={MEMBER_OUTER_STATUS_TYPE[record.outerStatus]} title={text} />
),
},
{
......
......@@ -228,7 +228,7 @@ export const initDetailSchema = (props: any) => {
title: '会员角色',
enum: [],
'x-component-props': {
placeholder: '请选择',
placeholder: '请选择',
},
},
levelId: {
......@@ -357,7 +357,7 @@ export const initDetailSchema = (props: any) => {
},
};
if (Object.keys(props).length > 0) {
if (Array.isArray(props)) {
for (let [index, item] of props.entries()) {
tabSchema.properties[`tab-${index + 3}`] = {
type: 'object',
......
import React from 'react';
import { observer, inject } from 'mobx-react';
import { IMemberModule } from '@/module/memberModule';
import BasicInfo from '../../components/BasicInfo';
import AuditProcess from '../../components/AuditProcess';
interface MemberBasicInfoProps {
MemberStore?: IMemberModule;
};
const MemberBasicInfo: React.FC<MemberBasicInfoProps> = ({
MemberStore,
}) => {
const { memberMaintainInfo } = MemberStore;
return (
<div>
<div
style={{
marginBottom: 24,
}}
>
<AuditProcess
outerVerifyCurrent={memberMaintainInfo?.currentOuterStep}
innerVerifyCurrent={memberMaintainInfo?.currentInnerStep}
outerVerifySteps={memberMaintainInfo?.outerVerifySteps}
innerVerifySteps={memberMaintainInfo?.innerVerifySteps}
/>
</div>
<BasicInfo
basic={{
account: memberMaintainInfo?.account,
phone: memberMaintainInfo?.phone,
email: memberMaintainInfo?.email,
created: memberMaintainInfo?.createTime,
}}
channel={{
memberType: memberMaintainInfo?.memberTypeEnum,
level: memberMaintainInfo?.channelLevelTag,
type: memberMaintainInfo?.channelTypeName,
areas: memberMaintainInfo?.areas,
desc: memberMaintainInfo?.remark,
}}
extra={memberMaintainInfo?.groups}
outerHistory={memberMaintainInfo?.outerHistory}
innerHistory={memberMaintainInfo?.innerHistory}
/>
</div>
);
};
export default inject('MemberStore')(observer(MemberBasicInfo));
\ No newline at end of file
import React from 'react';
import Info from '../../components/EquityInfo';
const EquityInfo: React.FC<{}> = () => {
return (
<div>
<Info />
</div>
);
};
export default EquityInfo;
\ No newline at end of file
import React, { useState, useEffect } from 'react';
import { history } from 'umi';
import { PageHeaderWrapper } from '@ant-design/pro-layout';
import { PageHeader, Descriptions, Badge, Spin } from 'antd';
import { observer, inject } from 'mobx-react';
import { usePageStatus } from '@/hooks/usePageStatus';
import { PublicApi } from '@/services/api';
import { GetMemberAbilityMaintenanceDetailBasicResponse } from '@/services/MemberApi';
import { IMemberModule } from '@/module/memberModule';
import {
MEMBER_STATUS_NORMAL,
MEMBER_STATUS_FROZEN,
MEMBER_STATUS,
MEMBER_OUTER_STATUS,
MEMBER_INNER_STATUS_SUCCESS,
} from '@/constants';
import {
MEMBER_STATUS_TAG_MAP,
MEMBER_INNER_STATUS_BADGE_COLOR,
MEMBER_OUTER_STATUS_TYPE,
} from '../../constant';
import HeadInfo from '../../components/HeadInfo';
import StatusTag from '../../components/StatusTag';
import styles from './index.less';
interface QueryProps {
match: {
url: string;
path: string;
};
location: {
pathname: string;
};
MemberStore?: IMemberModule;
}
const MemberQueryDetailed: React.FC<QueryProps> = props => {
const { MemberStore, children } = props;
const { id, validateId } = usePageStatus();
const [basicInfo, setBasicInfo] = useState<GetMemberAbilityMaintenanceDetailBasicResponse>(null);
const [infoLoading, setInfoLoaading] = useState(false);
const getBasicInfo = () => {
if (!id || !validateId) {
return;
}
setInfoLoaading(true);
PublicApi.getMemberAbilityMaintenanceDetailBasic({
memberId: id,
validateId,
}).then(res => {
if (res.code !== 1000) {
return;
}
setBasicInfo(res.data);
MemberStore.setmemberMaintainInfo(res.data);
}).finally(() => {
setInfoLoaading(false);
});
};
useEffect(() => {
// 手动重定向到基础信息页,防止查询字符串被弄掉
history.replace(`/memberCenter/memberAbility/manage/maintainDetail/basicInfo?id=${id}&validateId=${validateId}`);
getBasicInfo();
}, []);
const tabList = [
{
key: 'basicInfo',
tab: '基本信息',
},
// {
// key: 'powerInfo',
// tab: '权限信息',
// },
{
key: 'levelInfo',
tab: '等级信息',
},
{
key: 'equityInfo',
tab: '权益信息',
},
{
key: 'sincerityInfo',
tab: '诚信信息',
},
];
const handleTabChange = (val: string) => {
const { match } = props;
const url = match.url === '/' ? '' : match.url;
switch (val) {
case 'basicInfo':
history.push(`${url}/basicInfo?id=${id}&validateId=${validateId}`);
break;
case 'powerInfo':
history.push(`${url}/powerInfo?id=${id}&validateId=${validateId}`);
break;
case 'levelInfo':
history.push(`${url}/levelInfo?id=${id}&validateId=${validateId}`);
break;
case 'equityInfo':
history.push(`${url}/equityInfo?id=${id}&validateId=${validateId}`);
break;
case 'sincerityInfo':
history.push(`${url}/sincerityInfo?id=${id}&validateId=${validateId}`);
break;
default:
break;
}
};
const getTabKey = () => {
const { match, location } = props;
const url = match.path === '/' ? '' : match.path;
const tabKey = location.pathname.replace(`${url}/`, '');
if (tabKey && tabKey !== '/') {
return tabKey;
}
return 'basicInfo';
};
return (
<Spin spinning={infoLoading}>
<PageHeaderWrapper
title={
<>
<PageHeader
style={{ padding: '0' }}
onBack={() => history.goBack()}
title={
<HeadInfo
info={{
name: basicInfo?.name,
level: 1,
}}
/>
}
>
<Descriptions
size="small"
column={3}
style={{
padding: '0 32px',
}}
>
<Descriptions.Item label="会员类型">{basicInfo?.memberTypeName}</Descriptions.Item>
<Descriptions.Item label="会员角色" span={2}>{basicInfo?.roleName}</Descriptions.Item>
<Descriptions.Item label="会员状态">
<StatusTag type={MEMBER_STATUS_TAG_MAP[basicInfo?.status]} title={basicInfo?.statusName} />
</Descriptions.Item>
<Descriptions.Item label="外部状态">
<StatusTag type={MEMBER_OUTER_STATUS_TYPE[basicInfo?.outerStatus]} title={basicInfo?.outerStatusName} />
</Descriptions.Item>
<Descriptions.Item label="内部状态">
<Badge color={MEMBER_INNER_STATUS_BADGE_COLOR[basicInfo?.innerStatus]} text={basicInfo?.innerStatusName} />
</Descriptions.Item>
</Descriptions>
</PageHeader>
</>
}
tabList={tabList}
tabActiveKey={getTabKey()}
onTabChange={handleTabChange}
>
{children}
</PageHeaderWrapper>
</Spin>
);
};
export default inject('MemberStore')(observer(MemberQueryDetailed));
\ No newline at end of file
import React, { useState, useEffect } from 'react';
import { Spin } from 'antd';
import { usePageStatus } from '@/hooks/usePageStatus';
import { PublicApi } from '@/services/api';
import { GetMemberAbilityMaintenanceDetailLevelBasicResponse } from '@/services/MemberApi';
import Info, { DataProps } from '../../components/LevelInfo';
import { reject } from 'lodash';
const LevelInfo: React.FC<{}> = () => {
const { id, validateId } = usePageStatus();
const [levelInfo, setLevelInfo] = useState<GetMemberAbilityMaintenanceDetailLevelBasicResponse>(null);
const [infoLoading, setInfoLoaading] = useState(false);
const getMemberLevelInfo = () => {
if (!id && !validateId) {
return;
}
setInfoLoaading(true);
PublicApi.getMemberAbilityMaintenanceDetailLevelBasic({
memberId: id,
validateId,
}).then(res => {
if (res.code !== 1000) {
return;
}
setLevelInfo(res.data);
}).finally(() => {
setInfoLoaading(false);
});
};
useEffect(() => {
getMemberLevelInfo();
}, []);
const getHistroyList = params => {
return new Promise<{ data: DataProps[] , totalCount: number }>((resolve, reject) => {
PublicApi.getMemberAbilityMaintenanceDetailLevelHistoryPage({
memberId: id,
validateId,
...params,
}).then(res => {
const { data = [], totalCount = 0 } = res.data;
resolve({ data, totalCount });
}).catch(err => {
reject(err);
});
})
};
return (
<Spin spinning={infoLoading}>
<Info
levelInfo={{
level: levelInfo?.levelTag,
score: levelInfo?.score,
nextLevel: levelInfo?.nextLevelTag,
nextScore: levelInfo?.nextScore,
}}
chartData={levelInfo?.points}
fetchList={getHistroyList}
/>
</Spin>
);
};
export default LevelInfo;
\ No newline at end of file
import React from 'react';
const PowerInfo: React.FC<{}> = () => {
return (
<div>123</div>
);
};
export default PowerInfo;
\ No newline at end of file
import React from 'react';
import Info from '../../components/SincerityInfo';
const SincerityInfo: React.FC<{}> = () => {
return (
<div>
<Info />
</div>
);
};
export default SincerityInfo;
\ No newline at end of file
......@@ -127,7 +127,7 @@ const Frozen: React.FC<{}> = () => {
<StatusTag type={MEMBER_STATUS_TAG_MAP[basicInfo?.status]} title={basicInfo?.statusName} />
</Descriptions.Item>
<Descriptions.Item label="外部状态">
<StatusTag type={MEMBER_OUTER_STATUS_TYPE[basicInfo?.outerStatus]} title={MEMBER_OUTER_STATUS[basicInfo?.outerStatus]} />
<StatusTag type={MEMBER_OUTER_STATUS_TYPE[basicInfo?.outerStatus]} title={basicInfo?.outerStatusName} />
</Descriptions.Item>
<Descriptions.Item label="内部状态">
<Badge color={MEMBER_INNER_STATUS_BADGE_COLOR[basicInfo?.innerStatus]} text={basicInfo?.innerStatusName} />
......
......@@ -60,7 +60,7 @@ const memberMaintain: React.FC<[]> = () => {
render: (text, record) => (
<>
<EyePreview
url={`/memberCenter/memberAbility/query/detailed?id=${record.memberId}&validateId=${record.validateId}`}
url={`/memberCenter/memberAbility/manage/maintainDetail?id=${record.memberId}&validateId=${record.validateId}`}
>
{text}
</EyePreview>
......@@ -115,8 +115,8 @@ const memberMaintain: React.FC<[]> = () => {
align: 'center',
filters: [],
onFilter: (value, record) => record.outerStatus === value,
render: (_, record) => (
<StatusTag type={MEMBER_OUTER_STATUS_TYPE[record.outerStatus]} title={MEMBER_OUTER_STATUS[record.outerStatus]} />
render: (text, record) => (
<StatusTag type={MEMBER_OUTER_STATUS_TYPE[record.outerStatus]} title={text} />
),
},
{
......
......@@ -149,7 +149,7 @@ const AddBrand: React.FC<{}> = () => {
//@ts-ignore
PublicApi.postProductBrandApplyCheckBrand({id: responseId}).then(res=>{
setCurrentStep(1)
setTimeout(()=>{
setTimeout(() => {
history.goBack()
},1000)
})
......@@ -263,10 +263,10 @@ const AddBrand: React.FC<{}> = () => {
<Space direction="vertical" style={{width:'100%'}}>
<Card headStyle={{borderBottom:'none'}} title={tips}>
<Row>
<Col span={2}>
{/* <Col span={2}>
<div>横版</div>
</Col>
<Col span={22}>
</Col> */}
<Col span={24}>
<Form.Item
name="proveUrl"
// valuePropName="fileList"
......
......@@ -142,12 +142,14 @@ const Trademark: React.FC<{}> = () => {
const handelDelete = (record: any) => {
PublicApi.postProductBrandDeleteBrand({ id: record.id }).then(res => {
if(res.code === 1000)
ref.current.reload()
})
}
const handleApplyCheck = (record:any) => {
PublicApi.postProductBrandApplyCheckBrand({id: record.id}).then(res=>{
ref.current.reload()
ref.current.reload()
})
}
......
......@@ -3,69 +3,10 @@
* @Date: 2020-08-27 16:27:53
* @LastEditors: LeeJiancong
* @Copyright: 1549414730@qq.com
* @LastEditTime: 2020-09-01 10:08:44
* @LastEditTime: 2020-09-04 17:01:46
*/
import { ColumnType } from 'antd/lib/table/interface'
export const equiryColumns: ColumnType<any>[] = [
{
title: 'ID',
dataIndex: 'memberId',
align: 'center',
key: 'memberId',
},
{
title: '商品规格型号',
dataIndex: 'name',
key: 'name',
align: 'left'
},
{
title: '品牌',
dataIndex: 'roleName',
key: 'roleName',
align: 'center'
},
{
title: '颜色',
dataIndex: 'roleName',
key: 'roleName',
align: 'center'
},
{
title: '尺码',
dataIndex: 'roleName',
key: 'roleName',
align: 'center'
},
{
title: '面料',
dataIndex: 'roleName',
key: 'roleName',
align: 'center'
},
{
title: '产地',
dataIndex: 'roleName',
key: 'roleName',
align: 'center'
},
{
title: '单位',
dataIndex: 'levelTag',
key: 'levelTag',
align: 'center'
},
{
title: '采购数量',
dataIndex: 'levelTag',
key: 'levelTag',
align: 'center'
}
]
import moment from 'moment'
export const dockingColumn: ColumnType<any>[] = [
{
title: '序号',
......@@ -109,21 +50,188 @@ export const dockingColumn: ColumnType<any>[] = [
},
{
title: '状态',
title: '需求发送状态',
dataIndex: 'state',
key: 'state',
align: 'center'
},
{
title: '操作',
dataIndex: 'levelTag',
key: 'levelTag',
align: 'center'
align: 'center',
render:(text:any) => (
text == 0 ? '未发生需求':'已发送需求'
)
}
]
export const memberColumn = (children?) => {
let columns: ColumnType<any>[] = []
columns =
[
{
title: '序号',
dataIndex: 'memberId',
align: 'center',
key: 'memberId',
},
{
title: '会员名称',
dataIndex: 'name',
key: 'name',
align: 'left'
},
{
title: '会员类型',
dataIndex: 'memberTypeName',
key: 'memberTypeName',
align: 'center'
},
{
title: '会员角色',
dataIndex: 'roleName',
key: 'roleName',
align: 'center'
},
{
title: '会员等级',
dataIndex: 'levelTag',
key: 'levelTag',
align: 'center'
},
{
title: '是否归属会员',
dataIndex: 'membershipOrNot',
key: 'membershipOrNot',
align: 'center',
render:(text:any) => (
text == 0 ?'否':'是'
)
},
{
title: '需求发送状态',
dataIndex: 'state',
key: 'state',
align: 'center',
render:(text:any,records,index) => children? children(text,records,index) :''
}
]
return columns
}
/**
* @description: 内部流转interiorRequisitionForms
* 外部流转 externalRequisitionForms
* @param {type}
* @return {type}
*/
export const externalColumn = (childeren,stateList?) => {
let culumn:ColumnType<any>[] = []
return culumn = [
{
title: '序号',
dataIndex: 'id',
align: 'center',
key: 'id',
},
{
title: '操作角色',
dataIndex: 'roleName',
align: 'center',
key: 'roleName',
},
{
title: '状态',
dataIndex: 'state',
align: 'center',
key: 'state',
render:(text:any,record:any) => stateList(text)
},
{
title: '操作',
dataIndex: 'operation',
align: 'center',
key: 'operation',
},
{
title: '操作时间',
dataIndex: 'operationTime',
align: 'center',
key: 'operationTime',
render: (text: any, record: any) => childeren(text)
},
{
title: '审核意见',
dataIndex: 'auditOpinion',
align: 'left',
key: 'auditOpinion'
}
]
}
export const interiorColumn = (childeren,stateList?) => {
let culumn:ColumnType<any>[] = []
return culumn = [
{
title: '序号',
dataIndex: 'id',
align: 'center',
key: 'id',
},
{
title: '操作人',
dataIndex: 'roleName',
align: 'center',
key: 'roleName',
},
{
title: '部门',
dataIndex: 'department',
align: 'center',
key: 'department',
},
{
title: '职位',
dataIndex: 'position',
align: 'center',
key: 'position',
},
{
title: '状态',
dataIndex: 'state',
align: 'center',
key: 'state',
render:(text:any,record:any) => stateList(text)
},
{
title: '操作',
dataIndex: 'operation',
align: 'center',
key: 'operation',
},
{
title: '操作时间',
dataIndex: 'operationTime',
align: 'center',
key: 'operationTime',
render: (text: any, record: any) => childeren(text)
},
{
title: '审核意见',
dataIndex: 'auditOpinion',
align: 'left',
key: 'auditOpinion'
}
]
}
......
......@@ -19,11 +19,11 @@ import {
import { history } from 'umi'
import { LinkOutlined, PlusOutlined, QuestionCircleOutlined, MinusOutlined, MinusCircleOutlined } from '@ant-design/icons'
import { Row, Col, Card, Button, Table, Popconfirm, Radio,DatePicker,
Form, Spin, Select, Cascader, Tabs, Input, Tooltip, Space } from 'antd';
Form, Spin, Select,Switch, Cascader, Tabs, Input, Tooltip, Space } from 'antd';
import { PageHeaderWrapper } from '@ant-design/pro-layout'
import moment from 'moment'
import { ColumnType } from 'antd/lib/table/interface'
import { dockingColumn } from './detailFormColumnType'
import { memberColumn } from '../../common/detailFormColumnType'
import { getAuth} from '@/utils/auth'
import { PublicApi } from '@/services/api'
import styles from './templateForm.less';
......@@ -41,6 +41,7 @@ import {
import { store } from '@/store'
import colorTag from '@/pages/logistics/colorTag'
import { Effects } from 'bizcharts'
import { check } from 'prettier'
const { TabPane } = Tabs
const {TextArea} = Input
......@@ -112,6 +113,7 @@ const Detail: React.FC<{}> = () => {
const [categoryId, setcategoryId] = useState(null)//选择的分类id
const [otherList, setotherList] = useState([])//动态tab循环
const [dockingList, setdockingList] = useState([])//需求列表
const [memberList, setmemberList] = useState([])
const [productSource, setproductSource] = useState([])//商品列表 新增
const [shipperAddressList, setshipperAddressList] = useState([])
const [CategoryTreeOne, setCategoryTreeOne] = useState([])
......@@ -280,6 +282,61 @@ const Detail: React.FC<{}> = () => {
// setShowCategory(null)
}
/**
* @description: 需求格式
* @param {type}
* @return {type}
*/
const dockingColumn: ColumnType<any>[] = [
{
title: '序号',
dataIndex: 'id',
align: 'center',
key: 'id',
},
{
title: '会员名称',
dataIndex: 'memberName',
key: 'memberName',
align: 'left'
},
{
title: '会员类型',
dataIndex: 'memberTypeName',
key: 'memberTypeName',
align: 'center'
},
{
title: '会员角色',
dataIndex: 'roleName',
key: 'roleName',
align: 'center'
},
{
title: '会员等级',
dataIndex: 'levelTag',
key: 'levelTag',
align: 'center'
},
{
title: '是否归属会员',
dataIndex: 'membershipOrNot',
key: 'membershipOrNot',
align: 'center',
render:(text:any) => (
text == 0 ?'否':'是'
)
},
{
title: '需求发送状态',
dataIndex: 'state',
key: 'state',
align: 'center'
}
]
const equiryColumns: ColumnType<any>[] = [
{
......@@ -328,8 +385,10 @@ const Detail: React.FC<{}> = () => {
// 会员添加弹窗控制
const handleOkAddMember = () => {
setVisibleChannelMember(false)
setproductSource(memberRowCtl.selectRow)
console.log('memberRowCtl.selectRow',memberRowCtl.selectRow)
memberRowCtl.selectRow.forEach((v) => {
v['state'] = true
})
setmemberList(memberRowCtl.selectRow)
}
const [pagination, setPagination] = useState({
......@@ -560,7 +619,17 @@ const Detail: React.FC<{}> = () => {
console.log('item',item)
})
values['voucherTime'] = null
values['memberIds'] = []
values['memberIds'] = []// memberRowCtl.selectedRowKeys
if(platType == 3){
values['memberIds'] = memberList.filter((v)=> v.state).map(v => {
return v.memberId
})
}else if(platType == 2){
values['memberIds'] = dockingList.filter((v)=> v.state).map(v => {
return v.memberId
})
}
values['demandDockings'] = []
values['requisitionFormProducts'] = [...productList]
console.log('productList',productList)
......@@ -620,6 +689,15 @@ const Detail: React.FC<{}> = () => {
};
console.log('Received values of form: ', values);
}
const switchState = (text,record,index) => {
console.log(66,text,record,index)
return <Switch defaultChecked={text?true: false} size="small" onChange={(checked)=> {
console.log(checked);
memberList[index].state = checked
setmemberList([...memberList])
}} />
}
return (
<PageHeaderWrapper
onBack={() => history.goBack()}
......@@ -1027,12 +1105,14 @@ const Detail: React.FC<{}> = () => {
</Space>
{
platType == 3 &&
<Button style={{ marginBottom: 16, marginTop: 24 }} block icon={<PlusOutlined />} onClick={() => handleOptionBtn(2)} type='dashed'>选择会员</Button>
<>
<Button style={{ marginBottom: 16, marginTop: 24 }} block icon={<PlusOutlined />} onClick={() => handleOptionBtn(2)} type='dashed'>选择会员</Button>
<Table rowKey={"id"} dataSource={memberList} columns={memberColumn(switchState)} pagination={pagination} />
</>
}
{
platType != 1 &&
<Table dataSource={dockingList} rowSelection={rowSelection} columns={dockingColumn} pagination={pagination} />
( platType != 1 && platType != 3 )&&
<Table rowKey={"id"} dataSource={dockingList} columns={dockingColumn} pagination={pagination} />
}
......
import {action, computed, observable, runInAction} from 'mobx'
import { IChannelProductModule } from '@/module/channelProductModule'; // mobx要用到的数据类型
import { GetProductChannelCommodityGetCommodityListResponseDetail, GetProductChannelCommodityGetCommodityUnitPriceResponse } from '@/services';
/**
* 渠道直采商品
......@@ -7,12 +8,13 @@ import { IChannelProductModule } from '@/module/channelProductModule'; // mobx
class ChannelProductStore implements IChannelProductModule {
// 选择商品区块
@observable public productSelectRowInStore: any = null;
@observable public productSelectRowInStore: GetProductChannelCommodityGetCommodityListResponseDetail = null;
@observable public priceType: number = null
@observable public productName: string = null
@observable public currentActiveKey: string = '1'
@observable public currentOperateChannel: string = null
@observable public tableDataInSetPrice: GetProductChannelCommodityGetCommodityUnitPriceResponse[] = null
// 加工接口返回的数据,用户编辑回显数据
// @computed
......@@ -23,7 +25,7 @@ class ChannelProductStore implements IChannelProductModule {
// }
@action.bound
public setProductSelectRowInStore(data: any) {
public setProductSelectRowInStore(data: GetProductChannelCommodityGetCommodityListResponseDetail) {
this.productSelectRowInStore = data;
}
......@@ -47,6 +49,11 @@ class ChannelProductStore implements IChannelProductModule {
this.currentOperateChannel = data;
}
@action.bound
public setTableDataInSetPrice(data: GetProductChannelCommodityGetCommodityUnitPriceResponse[]){
this.tableDataInSetPrice = data;
}
}
export default ChannelProductStore
import React from 'react';
import { Provider } from 'mobx-react'
import UserStore from './user'
import ThemeStore from './theme'
import ProductStroe from './product'
......@@ -6,10 +7,11 @@ import ChannelProudctStore from './channelProduct'
import SiteStore from './site'
import CategoryStore from './category'
import FilterStore from './filter'
import { Provider } from 'mobx-react'
import MemberStore from './member'
import { ILoginModule } from '@/module/userModule';
import { IProductModule } from '@/module/productModule'
import { IChannelProductModule } from '@/module/channelProductModule'
import { IMemberModule } from '@/module/memberModule';
// import { ProductContext } from '@/pages/commodity/products/addProducts';
......@@ -33,6 +35,7 @@ export interface IStore {
UserStore: ILoginModule;
ProductStore: IProductModule;
ChannelProudctStore: IChannelProductModule;
MemberModuleStore: IMemberModule;
}
export const store = {
......@@ -42,7 +45,8 @@ export const store = {
ChannelProudctStore: new ChannelProudctStore,
SiteStore: new SiteStore,
CategoryStore: new CategoryStore,
FilterStore: new FilterStore,
FilterStore: new FilterStore,
MemberStore: new MemberStore,
}
const MobxProvider: React.FC = (props) => {
......
import { action, observable} from 'mobx'
import { IMemberModule } from '@/module/memberModule';
/**
* 会员管理
*/
class MemberStore implements IMemberModule {
@observable public memberMaintainInfo: any = {};
@action.bound
public setmemberMaintainInfo(data: any) {
this.memberMaintainInfo = data;
}
}
export default MemberStore;
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