Commit d4291c88 authored by 前端-黄佳鑫's avatar 前端-黄佳鑫
parents 6cb6516a b1e3ed94
......@@ -9,7 +9,8 @@ const config: any = {
// 如需写入环境变量 需在config中先写入
define: {
"process.env.SITE_ID": process.env.SITE_ID,
"process.env.BACK_GATEWAY": process.env.BACK_GATEWAY
"process.env.BACK_GATEWAY": process.env.BACK_GATEWAY,
'process.env.SOCKET_URL': process.env.SOCKET_URL
},
// layout: {},
esbuild: {},
......
......@@ -5,7 +5,7 @@
"api": "god-ytt",
"scripts:build": "node scripts/run",
"scripts:build-yxc": "node scripts/run http://yxc-web-demo.shushangyun.com/api",
"start:dev": "umi dev",
"start:dev": "umi dev ",
"start:analyze": "ANALYZE=1 umi dev",
"clean": "rimraf node_modules",
"start": "yarn api && yarn scripts:build && umi dev",
......@@ -18,9 +18,9 @@
"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 USE_ROUTE_CONFIG=false yarn start",
"start:url": "cross-env SITE_ID=1 BACK_GATEWAY=http://lingxi-all.wg.shushangyun.com USE_ROUTE_CONFIG=true yarn start",
"start:10": "cross-env SITE_ID=1 BACK_GATEWAY=http://10.0.0.10:8100 USE_ROUTE_CONFIG=true yarn start"
"start:cross": "cross-env SITE_ID=352 USE_ROUTE_CONFIG=false SOCKET_URL=ws://10.0.0.25:8100 yarn start",
"start:url": "cross-env SITE_ID=1 BACK_GATEWAY=http://lingxi-all.wg.shushangyun.com USE_ROUTE_CONFIG=true SOCKET_URL=ws://lingxi-all.wg.shushangyun.com yarn start",
"start:10": "cross-env SITE_ID=1 BACK_GATEWAY=http://10.0.0.10:8100 USE_ROUTE_CONFIG=true SOCKET_URL=ws://10.0.0.10:8100 yarn start"
},
"lint-staged": {
"*.{js,jsx,less,md,json}": [
......
export const NOT_CHANGE_VALUE = 'hello, world'
// socket的链接地址, 默认会使用后端接口网关地址
export const SOCKET_URL = process.env.SOCKET_URL || process.env.BACK_GATEWAY || "ws://10.0.0.25:8000"
export const MALL_TYPE = {
1: '企业商城',
2: '积分商城',
......
import { Tooltip } from 'antd';
import { Tooltip, Badge } from 'antd';
import { BellOutlined, CustomerServiceOutlined } from '@ant-design/icons';
import React, { useCallback, useRef, useLayoutEffect } from 'react';
// import { connect, ConnectProps } from 'umi';
// import { ConnectState } from '@/models/connect';
import Avatar from './AvatarDropdown';
import SelectLang from './SelectLang';
import Location from './Location';
import Roles from './Roles';
import styles from '../styles/RightContent.less';
import { Link } from 'umi';
import { getAuth } from '@/utils/auth'
import { getAuth } from '@/utils/auth';
import { SOCKET_URL } from '@/constants';
// export type SiderTheme = 'light' | 'dark';
// export interface GlobalHeaderRightProps extends Partial<ConnectProps> {
......@@ -17,8 +16,7 @@ import { getAuth } from '@/utils/auth'
// layout: 'sidemenu' | 'topmenu';
// }
const GlobalHeaderRight: React.SFC<{}> = (props) => {
const GlobalHeaderRight: React.FC<{}> = (props) => {
// const { theme, layout } = props;
let className = styles.right;
......@@ -32,7 +30,7 @@ const GlobalHeaderRight: React.SFC<{}> = (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}`);
ws.current = new WebSocket(`${SOCKET_URL}/report/websocket?memberId=${userInfo.memberId}&roleId=${userInfo.memberRoleId}`);
ws.current.onopen = (e) => {
console.log(e)
}
......@@ -62,14 +60,14 @@ const GlobalHeaderRight: React.SFC<{}> = (props) => {
<Location />
<SelectLang />
<Tooltip title="消息">
<a
target="_blank"
href=""
rel="noopener noreferrer"
className={styles.action}
>
<BellOutlined />
</a>
<a
href="/memberCenter/systemSetting/message"
className={styles.action}
>
<Badge count={5} size={"small"}>
<BellOutlined />
</Badge>
</a>
</Tooltip>
<Tooltip title="服务">
<a
......
......@@ -24,7 +24,7 @@ const UserHeader: React.FC<UserHeaderProps> = (props) => {
const getRouteName = () => {
switch (pathname) {
case '/user/login':
setTitle("欢迎登陆")
setTitle("欢登录")
break
case '/user/register':
setTitle("欢迎注册")
......
......@@ -66,6 +66,7 @@ export interface IProductModule {
areaOption: any[]; // 省市数据
currentPageInStore: IPage;
tabClickItem: any[];
productPriceType: any;
setAttributeLists(lists: any[]): void;
setProductName(name: string): void;
......@@ -81,4 +82,5 @@ export interface IProductModule {
setProductInfoByEdit(data: GetProductCommodityGetCommodityResponse): void;
setCurrentPageInStore(data: IPage): void;
setTabClickItem(data: any): void;
setProductPriceType(data: any): void;
}
......@@ -221,6 +221,8 @@ const SelectChannel:React.FC<IProps> = (props) => {
const roleChange = (value: number, option: IOption) => {
setSelectedOption(option)
setSelectedRole(option)
setMemberTableData([])
setSelectedMemberRowKeys([])
}
const clickSearchChannel = (value: string) => {
......@@ -243,12 +245,6 @@ const SelectChannel:React.FC<IProps> = (props) => {
colon={false}
initialValues={{childMemberRoleId: memberRoleList[0].roleId}}
>
{/* <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="childMemberRoleId"
......@@ -308,6 +304,7 @@ const SelectChannel:React.FC<IProps> = (props) => {
columns={columnsSetMember}
rowSelection={memberRowSelection}
fetchTableData={params => fetchMemberData(params)}
forceRender={true}
formilyProps={
{
ctx: {
......@@ -329,6 +326,9 @@ const SelectChannel:React.FC<IProps> = (props) => {
tableProps={{
rowKey: 'memberId',
}}
resetModal={{
destroyOnClose: true
}}
/>
</>)
}
......
......@@ -36,8 +36,9 @@ const LogisticsForm: React.FC<Iprops> = (props) => {
const [deliveryType, setDeliveryType] = useState<number>(1)
const [carriageType, setCarriageType] = useState<number>()
const flagRef = useRef<boolean>(false)
const [banCarriageType, setBanCarriageType] = useState(false)
const { productInfoByEdit, selectCategoryId } = ProductStore
const { productInfoByEdit, selectCategoryId, productPriceType } = ProductStore
useEffect(()=>{
//传入ref给父级
......@@ -75,12 +76,25 @@ const LogisticsForm: React.FC<Iprops> = (props) => {
}
}, [selectCategoryId])
useEffect(() => {
console.log(productPriceType)
if(productPriceType === 3){
logisticsForm.setFieldsValue({carriageType: 1})
setCarriageType(1)
setBanCarriageType(true)
}else{
setBanCarriageType(false)
}
}, [productPriceType])
const changeDeliveryType = (e) => {
console.log(e)
setDeliveryType(e.target.value)
setCarriageType(1)
setIsTemplate(false)
logisticsForm.resetFields()
logisticsForm.setFieldsValue({deliveryType: e.target.value})
logisticsForm.setFieldsValue({carriageType: 1})
}
const onChangeTemplate = (e) => {
......@@ -126,7 +140,7 @@ const LogisticsForm: React.FC<Iprops> = (props) => {
},
]}
>
<Radio.Group onChange={(e)=>setCarriageType(e.target.value)}>
<Radio.Group onChange={(e)=>setCarriageType(e.target.value)} disabled={banCarriageType}>
<Radio value={1}>卖家承担运费(默认)</Radio>
<Radio value={2}>买家承担运费</Radio>
</Radio.Group>
......
......@@ -71,7 +71,8 @@ const PriceAttributeForm: React.FC<Iprops> = (props) => {
getPriceAttributeFormParamsByEdit,
selectCategoryId,
productAttributeAndImageParams,
tabClickItem
tabClickItem,
setProductPriceType
} = ProductStore
// const memoizedValue = useMemo(() => {
......@@ -466,8 +467,8 @@ const PriceAttributeForm: React.FC<Iprops> = (props) => {
setPriceForm.resetFields()
setLadderPrice(false)
setPlanPrice(v.target.value)
setProductPriceType(v.target.value)
setIsChangePriceType(true)
console.log('价格类型变动')
}
const setPriceOk = () => {
......
......@@ -645,11 +645,23 @@ const CommodityDetail = (props) => {
}
}
setCurrentPriceRange(sortUnitPrice(unitPricePicList[0].unitPrice))
setStockCount(unitPricePicList[0].stockCount)
initStockCount(unitPricePicList)
// setStockCount(unitPricePicList[0].stockCount)
setCommodityImgList(tempImgList)
setAttributeList(tempAttrList)
}
const initStockCount = (unitPricePicList: any) => {
if (!unitPricePicList) {
return
}
let total = 0
for (let item of unitPricePicList) {
total += item.stockCount
}
setStockCount(total)
}
/**
* 对阶梯价格进行从大到小的排序
* @param priceObj
......
......@@ -182,7 +182,7 @@ const QuickNav: React.FC<QuickNavPropsType> = (props) => {
<span className={styles.welcome_text}>Hi, 欢迎来到{name}</span>
</div>
<div className={styles.btn_group}>
<div className={cx(styles.btn_item, styles.primary)}><a href={`/user/login?redirect=${btoa(encodeURIComponent(String(window.location)))}`}></a></div>
<div className={cx(styles.btn_item, styles.primary)}><a href={`/user/login?redirect=${btoa(encodeURIComponent(String(window.location)))}`}></a></div>
<div className={styles.btn_item}><a href="/user/register">注册</a></div>
</div>
......
......@@ -13,12 +13,13 @@ interface RecommandPropsType {
layoutType: LAYOUT_TYPE,
categoryIds: number[], // 商品品类集合
loading: boolean,
memberId?: number
memberId?: number,
shopInfo?: any
}
const Recommand: React.FC<RecommandPropsType> = (props) => {
const { mallTemplateId } = props.SiteStore
const { layoutType, categoryIds, loading, memberId } = props
const { layoutType, categoryIds, loading, memberId, shopInfo } = props
const [list, setList] = useState<any>([])
useEffect(() => {
......@@ -100,7 +101,20 @@ const Recommand: React.FC<RecommandPropsType> = (props) => {
*/
const fetchFirstCategory = () => {
return new Promise((resolve) => {
PublicApi.getTemplatePlatformFindAllFirstCategory().then(res => {
let getFn
let param: any ={}
switch (layoutType) {
case LAYOUT_TYPE.channel:
case LAYOUT_TYPE.ichannel:
param.memberId = memberId
getFn = PublicApi.getTemplateChannelFindAllFirstCategory
break;
default:
getFn = PublicApi.getTemplatePlatformFindAllFirstCategory
break;
}
getFn && getFn(param).then(res => {
if (res.code === 1000) {
resolve(res.data)
}
......@@ -113,13 +127,32 @@ const Recommand: React.FC<RecommandPropsType> = (props) => {
*/
const fetchCategoryById = (categoryId) => {
return new Promise((resolve) => {
let param = {
templateId: mallTemplateId,
let param: any = {
categoryId
}
let templateId
let getFn
switch (layoutType) {
case LAYOUT_TYPE.channel:
param.memberId = memberId
templateId = shopInfo.channelShopTemplateId
getFn = PublicApi.getTemplateChannelFindFirstCategoryDetail
break;
case LAYOUT_TYPE.ichannel:
param.memberId = memberId
templateId = shopInfo.channelOwnShopTemplateId
getFn = PublicApi.getTemplateChannelFindFirstCategoryDetail
break
default:
getFn = PublicApi.getTemplatePlatformFindFirstCategoryDetail
templateId = mallTemplateId
break;
}
param.templateId = templateId
// @ts-ignore
PublicApi.getTemplatePlatformFindFirstCategoryDetail(param).then(res => {
getFn && getFn(param).then(res => {
if (res.code === 1000) {
resolve(res.data)
}
......@@ -129,8 +162,10 @@ const Recommand: React.FC<RecommandPropsType> = (props) => {
const getCategoryComponents = async () => {
let firstCategory: any = await fetchFirstCategory()
let categoryDetail: any = await fetchCategoryById(firstCategory[0].id)
setList(changeDataKey(categoryDetail.goodsBOList))
if (firstCategory[0]) {
let categoryDetail: any = await fetchCategoryById(firstCategory[0].id)
setList(changeDataKey(categoryDetail.goodsBOList))
}
}
const getCommodityDetailLink = (item) => {
......
......@@ -515,7 +515,7 @@ const PurchaseOrder: React.FC<PurchaseOrderPropsType> = (props) => {
priceRange: item.commodityUnitPrice.priceRange,
category: item.commodityUnitPrice.commodity.customerCategory.name,
brand: item.commodityUnitPrice.commodity.brand.name,
commodityPic: item.commodityUnitPrice.commodityPic[0],
commodityPic: item.commodityUnitPrice.commodity.mainPic,
attribute: item.commodityUnitPrice.attributeAndValueList,
stockCount: item.stockCount || 0
}
......@@ -710,9 +710,7 @@ const PurchaseOrder: React.FC<PurchaseOrderPropsType> = (props) => {
</div>
<div className={cx(styles.order_list_item_item, styles.goods_info)}>
<div className={styles.order_list_item_item_imgbox}>
{
childItem.commodityUnitPrice.commodityPic && <ImageBox width={80} height={80} imgUrl={childItem.commodityUnitPrice.commodityPic[0]} direction="column" />
}
<ImageBox width={80} height={80} imgUrl={childItem.commodityUnitPrice.commodity.mainPic} direction="column" />
</div>
<div>
<div className={styles.order_list_item_item_name}>
......
......@@ -246,7 +246,6 @@ const PositionSetting:React.FC<PositionSettingProps> = (props) => {
const shopType = addSchemaAction.getFieldValue('shopType');
// 当商城类型为 渠道商城、渠道自由商城和渠道积分商城时,需要带上下面两个参数
const { channelMemberIdList, channelMemberRoleId } = productState;
const data = {
...params,
shopType: shopType,
......
......@@ -8,11 +8,13 @@
font-size: 14px;
font-weight: 400;
color: #606266;
cursor: pointer;
}
.messageTitle{
margin: 0 30px;
margin: 0px 0px 0px 30px;
font-size: 14px;
font-weight: 500;
color: #303133;
display: inline-block;
}
}
\ No newline at end of file
......@@ -8,7 +8,8 @@ import StatusTag from '@/components/StatusTag';
import { PublicApi } from '@/services/api';
import moment from 'moment';
import msg_system from '@/assets/imgs/msg_system.png'
import msg_platform from '@/assets/imgs/msg_platform.png'
import msg_platform from '@/assets/imgs/msg_platform.png';
import cx from 'classnames';
const Message: React.FC<{}> = () => {
const [dataSource, setDataSource] = useState<any>([])
......@@ -40,19 +41,35 @@ const Message: React.FC<{}> = () => {
}
const handlePaginationChange = (page, pageSize) => {
console.log(page,pageSize);
getList({page, pageSize})
.then((data) => {
console.log(data);
setDataSource(data);
})
}
const renderMessage = (data) => {
const handleRead = (id, url: string) => {
console.log(url);
// /report/message/member/read
PublicApi.getReportMessageMemberRead({id: id})
.then((data) => {
if(url) {
history.push(url);
}
})
}
const renderMessage = (data) => {
const isRead = cx({
[styles.messageTitle]: !data.status,
[styles.messageText]: data.status
})
return (
<>
<StatusTag type={data.status} title={data.type} />
<span className={styles.messageTitle}>{data.title}</span>
<span className={styles.messageText}>{data.message}</span>
<StatusTag type={data.type == 1 ? 'primary' : 'success'} title={data.type == 1 ? '系统消息': '平台消息'} />
<span className={isRead} style={{minWidth: '100px'}}>{data.title}</span>
<span className={isRead} onClick={() => handleRead(data.id, data.url)}>{data.content}</span>
</>
)
}
......@@ -78,13 +95,13 @@ const Message: React.FC<{}> = () => {
total: dataSource.totalCount,
showTotal: showTotal
}}
renderItem={item => (
renderItem={(item: any) => (
<List.Item>
<List.Item.Meta
avatar={<Avatar src={msg_system} />}
avatar={<Avatar src={item.type == 1 ? msg_system : msg_platform} />}
title={renderMessage(item)}
/>
<div>{moment(item.createTime).format('YYYY-MM-DD HH:mm:ss')}</div>
<div>{moment(item.sendTime).format('YYYY-MM-DD HH:mm:ss')}</div>
</List.Item>
)}
/>
......
......@@ -40,7 +40,7 @@ const FirstApprovedOrder:React.FC<FirstApprovedOrderProps> = (props) => {
message.error('请先勾选订单')
return ;
}
const canBitch = !rowSelectionCtl.selectRow.some(v => v.purchaseOrderInteriorState !== PurchaseOrderInsideWorkState.FILLING_ORDER)
const canBitch = !rowSelectionCtl.selectRow.some(v => v.interiorState !== PurchaseOrderInsideWorkState.FILLING_ORDER)
if (canBitch) {
const { code } = await run({ids: rowSelectionCtl.selectedRowKeys})
if (code === 1000) {
......
......@@ -80,7 +80,7 @@ export const useSelfTable = () => {
width: 200
},
{
title: '供应会员',
title: '采购会员',
align: 'left',
dataIndex: 'supplyMembersName',
key: 'supplyMembersName',
......
......@@ -91,7 +91,7 @@ const User: React.FC = () => {
</div>
<Row className={'thirdLogin'} align='middle' justify='center'>
<Col>其他方式登录
<a title="微信登陆"><img src={wechat} alt="微信登录" /></a>
<a title="微登录"><img src={wechat} alt="微信登录" /></a>
<a title="QQ登录"><img src={qq} alt="QQ登录" /></a>
<a title="支付宝登录"><img src={alipay} alt="支付宝登录" /></a>
</Col>
......
......@@ -328,7 +328,7 @@ const UserRegistry = () => {
</p>
</div>
}
<p className={'readyLogin'}>已有平台账号? <Link to="/user/login">去登</Link></p>
<p className={'readyLogin'}>已有平台账号? <Link to="/user/login">去登</Link></p>
</div>
</div>
</Fragment>
......
......@@ -17,6 +17,7 @@ class ProductStore implements IProductModule {
@observable public isAllAttributePic: boolean = true; // 是否所有属性共用
@observable public currentPageInStore: IPage = { current: null, pageSize: null }; // 页码相关
@observable public tabClickItem: any[] = []; // tab标签页点击项
@observable public productPriceType: any = null; // 商品价格类型
/** 计算操作 **/
// 加工接口返回的数据,用户编辑回显数据
......@@ -138,6 +139,7 @@ class ProductStore implements IProductModule {
this.attributeLists = [];
this.selectCategoryId = null;
this.selectBrandId = null;
this.productPriceType = null;
}
// 编辑时 品类变更 清空部分数据
......@@ -198,6 +200,11 @@ class ProductStore implements IProductModule {
public setTabClickItem(data: any) {
this.tabClickItem = data
}
@action.bound
public setProductPriceType(data: any) {
this.productPriceType = data
}
}
......
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