Commit 123cedb9 authored by xiexiuxing's avatar xiexiuxing

素材管理bug修复

parents ba6c802f a041bf8c
......@@ -6,13 +6,13 @@ export default {
'commodity.goods.columns.name':'Product name',
'commodity.goods.columns.materialCode' : 'Material number',
'commodity.goods.columns.materialName' : 'Material name',
'commodity.goods.columns.goodsGroup' : 'Material group',
'commodity.goods.columns.type':'Specification Model',
'commodity.goods.columns.customerCategory':'Category',
'commodity.goods.columns.brand':'Brand',
'commodity.goods.columns.unit':'Unit',
'commodity.goods.columns.costPrice':'Into unit price',
'commodity.goods.columns.muluPrice' : 'list price',
'commodity.goods.columns.costPrice.tip' : 'The cost price means that the commodity cannot be sold below this price. If the commodity selling price is lower than the cost price when the commodity is released, the risk control warning will be triggered.',
'commodity.goods.columns.currency':'$',
'commodity.goods.columns.batch':'Import batch',
......@@ -70,6 +70,8 @@ export default {
'commodity.goods.addGoods.form.name':'Product name',
'commodity.goods.addGoods.form.name.message':'Please enter material name',
'commodity.goods.addGoods.form.name.placeholder':'Maximum 40 characters and 20 Chinese characters',
'commodity.goods.addGoods.form.goodsGroup' : 'Logistics group',
'commodity.goods.addGoods.form.goodsGroup.message' : 'Please enter a logistics group',
'commodity.goods.addGoods.form.type':'Specification Model',
'commodity.goods.addGoods.form.type.message':'Please enter the specification model',
'commodity.goods.addGoods.form.type.placeholder':'Maximum 40 characters and 20 Chinese characters',
......@@ -100,6 +102,7 @@ export default {
'commodity.goods.schema.goodsSchema.materialCode' : 'Material number',
'commodity.goods.schema.goodsSchema.brandId':'Commodity brand',
'commodity.goods.schema.goodsSchema.customerCategoryId':'Commodity category',
'commodity.goods.schema.goodsSchema.goodsGroupId' : 'Material group',
'commodity.goods.schema.goodsSchema.batch':'Import batch','commodity.goods.schema.goodsSchema.submit':'Query',
'commodity.products.modalTitle.1':'Import',
......
......@@ -39,6 +39,7 @@ export default {
'stockSellStorage.caigouhuiyuan':'Purchasing Member',
'stockSellStorage.huohao': 'Item Number',
'stockSellStorage.huopinmingcheng': 'material name',
'stockSellStorage.materialGroup': 'material group',
// 'stockSellStorage.huohao':'Item No.',
// 'stockSellStorage.huopinmingcheng':'Product name',
'stockSellStorage.guigexinghao':'Specification Model',
......
......@@ -6,13 +6,13 @@ export default {
'commodity.goods.columns.name' : '상품명',
'commodity.goods.columns.materialCode' : '재료 번호',
'commodity.goods.columns.materialName' : '재료 이름',
'commodity.goods.columns.goodsGroup' : '재료 그룹',
'commodity.goods.columns.type' : '사양 모델',
'commodity.goods.columns.customerCategory' : '종류',
'commodity.goods.columns.brand' : '브랜드',
'commodity.goods.columns.unit' : '유닛',
'commodity.goods.columns.costPrice' : '성단가',
'commodity.goods.columns.muluPrice' : '정가',
'commodity.goods.columns.costPrice.tip' : '원가란 해당 상품을 판매할 때이 가격보다 낮아서는 안되며 상품을 공포할 때 상품의 판매가격이 원가보다 낮으면 위험통제조기경보를 유발하게 된다.',
'commodity.goods.columns.currency' : '₩',
'commodity.goods.columns.batch' : '배치 가져오기',
......@@ -70,6 +70,8 @@ export default {
'commodity.goods.addGoods.form.name' : '상품명',
'commodity.goods.addGoods.form.name.message' : '재료명을 입력해주세요',
'commodity.goods.addGoods.form.name.placeholder' : '최장 40자 20자 한자',
'commodity.goods.addGoods.form.goodsGroup' : '물류그룹',
'commodity.goods.addGoods.form.goodsGroup.message' : '물류 그룹을 입력하세요.',
'commodity.goods.addGoods.form.type' : '사양 모델',
'commodity.goods.addGoods.form.type.message' : '사양 모델을 입력하십시오.',
'commodity.goods.addGoods.form.type.placeholder' : '최장 40자 20자 한자',
......@@ -101,6 +103,7 @@ export default {
'commodity.goods.schema.goodsSchema.materialCode' : '재료 번호',
'commodity.goods.schema.goodsSchema.brandId' : '상품 브랜드',
'commodity.goods.schema.goodsSchema.customerCategoryId' : '상품류',
'commodity.goods.schema.goodsSchema.goodsGroupId' : '재료 그룹',
'commodity.goods.schema.goodsSchema.batch' : '배치 가져오기',
'commodity.goods.schema.goodsSchema.submit' : '조회',
......
......@@ -39,6 +39,7 @@ export default {
'stockSellStorage.caigouhuiyuan': '구매 회원',
'stockSellStorage.huohao': '품목 번호',
'stockSellStorage.huopinmingcheng': '품목명',
'stockSellStorage.materialGroup': '재료 그룹',
// 'stockSellStorage.huohao': '상품 번호',
// 'stockSellStorage.huopinmingcheng': '상품명',
'stockSellStorage.guigexinghao': '사양 모델',
......
......@@ -6,6 +6,7 @@ export default {
'commodity.goods.columns.name' : '货品名称',
'commodity.goods.columns.materialCode' : '物料编号',
'commodity.goods.columns.materialName' : '物料名称',
'commodity.goods.columns.goodsGroup' : '物料组',
'commodity.goods.columns.type' : '规格型号',
'commodity.goods.columns.customerCategory' : '品类',
'commodity.goods.columns.brand' : '品牌',
......@@ -69,6 +70,8 @@ export default {
'commodity.goods.addGoods.form.name' : '货品名称',
'commodity.goods.addGoods.form.name.message' : '请输入物料名称',
'commodity.goods.addGoods.form.name.placeholder' : '最长40个字符20个汉字',
'commodity.goods.addGoods.form.goodsGroup' : '物流组',
'commodity.goods.addGoods.form.goodsGroup.message' : '请输入物流组',
'commodity.goods.addGoods.form.type' : '规格型号',
'commodity.goods.addGoods.form.type.message' : '请输入规格型号',
'commodity.goods.addGoods.form.type.placeholder' : '最长40个字符20个汉字',
......@@ -99,6 +102,7 @@ export default {
'commodity.goods.schema.goodsSchema.materialCode' : '物料编号',
'commodity.goods.schema.goodsSchema.brandId' : '商品品牌',
'commodity.goods.schema.goodsSchema.customerCategoryId' : '商品品类',
'commodity.goods.schema.goodsSchema.goodsGroupId' : '物料组',
'commodity.goods.schema.goodsSchema.batch' : '导入批次',
'commodity.goods.schema.goodsSchema.submit' : '查询',
......
......@@ -39,6 +39,7 @@ export default {
'stockSellStorage.caigouhuiyuan': '采购会员',
'stockSellStorage.huohao': '物料编号',
'stockSellStorage.huopinmingcheng': '物料名称',
'stockSellStorage.materialGroup': '物料组',
// 'stockSellStorage.huohao': '货号',
// 'stockSellStorage.huopinmingcheng': '货品名称',
'stockSellStorage.guigexinghao': '规格型号',
......
......@@ -73,6 +73,11 @@ const Goods: React.FC<{}> = () => {
</span>
},
{
title: intl.formatMessage({ id: 'commodity.goods.columns.goodsGroup' }),
dataIndex: ['materialGroup', 'name'],
key: 'materialGroup',
},
{
title: intl.formatMessage({ id: 'commodity.goods.columns.type' }),
dataIndex: 'type',
key: 'type',
......@@ -369,6 +374,9 @@ const Goods: React.FC<{}> = () => {
FormEffectHooks.onFieldChange$('customerCategoryId').subscribe(state => {
searchCustomerCategoryOptionEffect(actions, 'customerCategoryId')
})
FormEffectHooks.onFieldChange$('materialGroupId').subscribe(state => {
searchCustomerCategoryOptionEffect(actions, 'materialGroupId')
})
}}
schema={goodsSchema}
/>
......
......@@ -77,6 +77,18 @@ export const goodsSchema: ISchema = {
fieldNames: { label: 'title', value: 'id', children: 'children' },
},
},
materialGroupId: {
type: 'string',
'x-component': 'CustomCategorySearch',
'x-component-props': {
placeholder: getIntl().formatMessage({ id: 'commodity.goods.schema.goodsSchema.goodsGroupId' }),
showSearch: true,
notFoundContent: null,
style: { width: '174px' },
dataoption: [],
fieldNames: { label: 'title', value: 'id', children: 'children' },
},
},
batch: {
type: 'string',
'x-component-props': {
......
/*
* @Description: 会员引入抽屉
*/
import React, { useEffect } from 'react';
import React, { useEffect, useState } from 'react';
import { Drawer, Button, message } from 'antd';
import { ColumnType } from 'antd/lib/table/interface';
import { createFormActions } from '@formily/antd';
......@@ -19,11 +19,11 @@ export type MemberIntroduceType = {
/**
* 会员名称
*/
memberName: string
name: string
/**
* 会员类型
*/
memberType: number
memberTypeId: number
/**
* 会员类型名称
*/
......@@ -31,25 +31,45 @@ export type MemberIntroduceType = {
/**
* 会员角色
*/
memberRole: number
roleId: number
/**
* 会员角色名称
*/
memberRoleName: string
roleName: string
/**
* 会员等级
*/
memberLevel: number
level: number
/**
* 会员等级名称
*/
memberLevelName: number
levelTag: string
/**
* 国家代码Id
*/
countryCodeId: number
/**
* 手机号码
*/
phone: string
/**
* 注册邮箱
*/
email: string
/**
* 上级会员关系Id
*/
upperRelationId: number
/**
* 注册资料
*/
detail: { [key: string]: any }
}
export type MemberIntroduceDrawerSubmitValue = MemberIntroduceType[]
type ExtraFetchType = FetchParamsType & {
memberName: string,
name: string,
}
export interface MemberIntroduceDrawerProps {
......@@ -64,7 +84,7 @@ export interface MemberIntroduceDrawerProps {
/**
* Form 确认事件
*/
onSubmit: (values: MemberIntroduceDrawerSubmitValue) => void,
onSubmit: (values: MemberIntroduceDrawerSubmitValue) => Promise<void>,
/**
* 抽屉关闭事件
*/
......@@ -83,6 +103,8 @@ const MemberIntroduceDrawer = (props: MemberIntroduceDrawerProps) => {
onClose,
fetchDataSource,
} = props;
const [confirmLoading, setConfirmLoading] = useState(false);
const [rowSelection, rowCtl] = useRowSelectionTable({ type: 'checkbox', customKey: 'memberId' });
useEffect(() => {
......@@ -100,7 +122,7 @@ const MemberIntroduceDrawer = (props: MemberIntroduceDrawerProps) => {
},
{
title: '会员名称',
dataIndex: 'memberName',
dataIndex: 'name',
},
{
title: '会员类型',
......@@ -108,11 +130,11 @@ const MemberIntroduceDrawer = (props: MemberIntroduceDrawerProps) => {
},
{
title: '会员角色',
dataIndex: 'memberRoleName',
dataIndex: 'roleName',
},
{
title: '会员等级',
dataIndex: 'levelName',
dataIndex: 'levelTag',
},
];
......@@ -138,8 +160,12 @@ const MemberIntroduceDrawer = (props: MemberIntroduceDrawerProps) => {
message.warning('请选择会员');
return;
}
setConfirmLoading(true);
if (onSubmit) {
onSubmit(rowCtl.selectRow);
onSubmit(rowCtl.selectRow)
.finally(() => {
setConfirmLoading(false);
});
}
};
......@@ -158,7 +184,7 @@ const MemberIntroduceDrawer = (props: MemberIntroduceDrawerProps) => {
<Button onClick={handleClose} style={{ marginRight: 16 }}>
取消
</Button>
<Button onClick={handleConfirm} type="primary">
<Button onClick={handleConfirm} type="primary" loading={confirmLoading}>
确 定
</Button>
</div>
......@@ -177,6 +203,7 @@ const MemberIntroduceDrawer = (props: MemberIntroduceDrawerProps) => {
actions: queryFormActions,
schema: querySchema,
}}
defaultPageSize={20}
full
/>
</Drawer>
......
......@@ -8,7 +8,7 @@ export const querySchema: ISchema = {
'x-component': 'mega-layout',
'x-component-props': {},
properties: {
memberName: {
name: {
type: 'string',
'x-component': 'Search',
'x-component-props': {
......
......@@ -16,7 +16,14 @@ import StandardTable from '@/components/StandardTable';
import moment from 'moment';
import { ColumnType } from 'antd/lib/table/interface';
import { createFormActions } from '@formily/antd';
import { getMemberAbilitySubPage, getMemberAbilitySubPageitems, postMemberAbilitySubCommit, postMemberAbilitySubDelete } from '@/services/MemberV2Api';
import {
getMemberAbilityMaintenancePlatformPage,
getMemberAbilitySubPage,
getMemberAbilitySubPageitems,
postMemberAbilitySubCommit,
postMemberAbilitySubDelete,
postMemberAbilitySubIntroduce,
} from '@/services/MemberV2Api';
import { useStateFilterSearchLinkageEffect } from '@/formSchema/effects/useFilterSearch';
import { FORM_FILTER_PATH } from '@/formSchema/const';
import { useAsyncInitSelect } from '@/formSchema/effects/useAsyncInitSelect';
......@@ -29,7 +36,7 @@ import { AuthUrl } from '@/components/AuthButton/AuthUrl';
import AuthButton from '@/components/AuthButton';
import { importSchema } from './schema';
import { MEMBER_OUTER_STATUS_TYPE } from '../constant';
import MemberIntroduceDrewer from './components/MemberIntroduceDrewer';
import MemberIntroduceDrewer, { MemberIntroduceDrawerSubmitValue, MemberIntroduceDrawerProps } from './components/MemberIntroduceDrewer';
import styles from './index.less';
const formActions = createFormActions();
......@@ -240,6 +247,43 @@ const MemberMaintain: React.FC<[]> = () => {
setVisibleIntroduceDrewer(!!flag);
};
const fetchIntroduceMemberList: MemberIntroduceDrawerProps['fetchDataSource'] = async (params) => {
const res = await getMemberAbilityMaintenancePlatformPage({
...(params as any),
current: `${params.current}`,
pageSize: `${params.pageSize}`,
});
return res.data;
};
const handleIntroduceMember = (value: MemberIntroduceDrawerSubmitValue): Promise<void> => {
return new Promise((resolve, reject) => {
postMemberAbilitySubIntroduce({
list: value.map((item) => ({
memberTypeId: item.memberTypeId,
roleId: item.roleId,
memberId: item.memberId,
level: item.level,
countryCodeId: item.countryCodeId,
phone: item.phone,
email: item.email,
upperRelationId: item.upperRelationId,
detail: item.detail,
areas: [],
})),
}).then((res) => {
if (res.code === 1000) {
resolve();
handleVisibleIntroduceDrewer(false);
ref.current.reload();
}
reject();
}).catch((err) => {
reject(err);
});
});
};
const ControllerBtns = () => (
<>
{/* {(userInfo && userInfo.memberRoleType === MEMBER_ROLE_TYPE_SERVICE_PROVIDER) && (
......@@ -333,8 +377,9 @@ const MemberMaintain: React.FC<[]> = () => {
/>
<MemberIntroduceDrewer
visible={visibleIntroduceDrewer}
fetchDataSource={fetchIntroduceMemberList}
onClose={() => handleVisibleIntroduceDrewer(false)}
onSubmit={() => {}}
onSubmit={handleIntroduceMember}
/>
</Card>
);
......
......@@ -126,10 +126,10 @@ const BidRequirement: React.FC<Iprops> = (props: any) => {
{ required: true, message: intl.formatMessage({ id: 'detail.purchase.message45' }) }, () => ({
async validator(_, value) {
let _exVal = await exRef.current.biddingTime();
if (_exVal[0] && moment(value[1]).isAfter(_exVal[0])) {
if (_exVal?.[0] && value?.[1] && moment(value?.[1]).isAfter(_exVal?.[0])) {
return Promise.reject(new Error(intl.formatMessage({ id: 'detail.purchase.message46' })));
}
if (!value[0] || !value[1]) {
if (!value?.[0] || !value?.[1]) {
return Promise.reject(new Error(intl.formatMessage({ id: 'detail.purchase.message45' })));
} else {
return Promise.resolve();
......
......@@ -116,10 +116,10 @@ const BidRules: React.FC<Iprops> = (props: any) => {
{ required: true, message: intl.formatMessage({ id: 'detail.purchase.message47' }) }, () => ({
async validator(_, value) {
let _exVal = await exRef.current.signUpTime();
if (_exVal[1] && moment(value[0]).isBefore(_exVal[1])) {
if (_exVal?.[1] && value?.[0] && moment(value?.[0]).isBefore(_exVal?.[1])) {
return Promise.reject(new Error(intl.formatMessage({ id: 'detail.purchase.message48' })));
}
if (!value[0] || !value[1]) {
if (!value?.[0] || !value?.[1]) {
return Promise.reject(new Error(intl.formatMessage({ id: 'detail.purchase.message47' })));
} else {
return Promise.resolve();
......@@ -139,7 +139,7 @@ const BidRules: React.FC<Iprops> = (props: any) => {
</Form.Item>
<Form.Item
name='isStartingPrice'
label={<Tooltip placement="right" title={intl.formatMessage({ id: 'ddetail.purchase.tips9' })}>{intl.formatMessage({ id: 'detail.purchase.startingPrice' })}<QuestionCircleOutlined style={{ marginLeft: '5px' }} /></Tooltip>}
label={<Tooltip placement="right" title={intl.formatMessage({ id: 'detail.purchase.tips9' })}>{intl.formatMessage({ id: 'detail.purchase.startingPrice' })}<QuestionCircleOutlined style={{ marginLeft: '5px' }} /></Tooltip>}
>
<Checkbox checked={isStartingPrice} onChange={(e) => { onCheckboxChange(e, setIsStartingPrice, 'startingPrice') }}>{intl.formatMessage({ id: 'detail.purchase.isStartingPrice' })}</Checkbox>
</Form.Item>
......
import React, { useRef, useState,useEffect,useCallback } from 'react';
import { getIntl, history } from 'umi';
import { ColumnType } from 'antd/lib/table/interface';
import { Row, Col, Space, Button, Typography, Popconfirm, Badge, Menu, Dropdown } from 'antd';
import { Row, Col, Space, Button, Typography, Popconfirm, Badge, Menu, Dropdown, message, Modal } from 'antd';
import { PlusOutlined, PlayCircleOutlined, PoweroffOutlined, CaretDownOutlined } from '@ant-design/icons';
import { formatTimeString } from '@/utils'
import EyePreview from '@/components/EyePreview';
import StatusTag from '@/components/StatusTag';
import { postPurchaseBiddingExamine, postPurchaseBiddingExamineBatch, postPurchaseBiddingDelete, postPurchaseBiddingDeleteBatch, getPurchaseBiddingAwaitNewList,getPurchaseBiddingAwaitShopNewList } from '@/services/PurchaseV2Api';
import { getTemplateWebMemberPurchaseWebFindCurrMemberPurchase } from '@/services/TemplateV2Api';
import Table from '../../components/table'
......@@ -174,6 +175,24 @@ const ReadyAdd = () => {
}
},[isShop])
const addFn = async () => {
await getTemplateWebMemberPurchaseWebFindCurrMemberPurchase().then(res => {
if (res.code !== 1000) {
message.error(intl.formatMessage({ id: `${res.code}` }));
return
}
if (!res.data) {
Modal.warning({
title: intl.formatMessage({ id: 'table.purchase.moduleWarning' }),
content: intl.formatMessage({ id: 'table.purchase.moduleWarning1' }),
okText: intl.formatMessage({ id: 'detail.purchase.confirm' }),
onOk: () => history.push('/memberCenter/procurementAbility/purchasDoor/purchasInfo'),
})
return
}
history.push(`/memberCenter/procurementAbility/purchaseBid/${isShop ? 'readyAddShop' : 'readyAdd'}/add`)
})
}
return (
......@@ -191,7 +210,7 @@ const ReadyAdd = () => {
<Space size={16}>
<AuthButton btnCode='readyAdd.add'>
<Button
onClick={() => history.push(`/memberCenter/procurementAbility/purchaseBid/${isShop ? 'readyAddShop' : 'readyAdd'}/add`)}
onClick={addFn}
type="primary"
icon={<PlusOutlined />}
>
......
......@@ -49,7 +49,7 @@ const ReadyConfirm = () => {
key: 'memberName',
dataIndex: 'memberName',
render: (text: any, record: any) => (
<EyePreview url={`/shop?shopId=${btoa(JSON.stringify({ shopId: record.memberShopId, memberId: record.memberId }))}`}>{text}</EyePreview>
<EyePreview type='button' class>{text}</EyePreview>
)
}, {
title: intl.formatMessage({ id: 'table.purchase.biddingStartTime' }),
......
......@@ -43,7 +43,7 @@ const ReadyExamineResultOne = () => {
key: 'memberName',
dataIndex: 'memberName',
render: (text: any, record: any) => (
<EyePreview url={`/shop?shopId=${btoa(JSON.stringify({ shopId: record.memberShopId, memberId: record.memberId }))}`}>{text}</EyePreview>
<EyePreview type='button' class>{text}</EyePreview>
)
}, {
title: intl.formatMessage({ id: 'table.purchase.biddingStartTime' }),
......
......@@ -43,7 +43,7 @@ const ReadyExamineResultTwo = () => {
key: 'memberName',
dataIndex: 'memberName',
render: (text: any, record: any) => (
<EyePreview url={`/shop?shopId=${btoa(JSON.stringify({ shopId: record.memberShopId, memberId: record.memberId }))}`}>{text}</EyePreview>
<EyePreview type='button' class>{text}</EyePreview>
)
}, {
title: intl.formatMessage({ id: 'table.purchase.biddingStartTime' }),
......
......@@ -49,7 +49,7 @@ const ReadyExamineSignUp = () => {
dataIndex: 'signUpTime',
render: (text: any, record: any) => (
<Space direction='vertical'>
<EyePreview url={`/shop?shopId=${btoa(JSON.stringify({ shopId: record.memberShopId, memberId: record.memberId }))}`}>{record.createMemberName}</EyePreview>
<EyePreview type='button' class>{record.createMemberName}</EyePreview>
<Text type='secondary'>{formatTimeString(record.signUpTime)}</Text>
</Space>
)
......
......@@ -45,7 +45,7 @@ const ReadySubmitExamineResult = () => {
key: 'memberName',
dataIndex: 'memberName',
render: (text: any, record: any) => (
<EyePreview url={`/shop?shopId=${btoa(JSON.stringify({ shopId: record.memberShopId, memberId: record.memberId }))}`}>{text}</EyePreview>
<EyePreview type='button' class>{text}</EyePreview>
)
}, {
title: intl.formatMessage({ id: 'table.purchase.biddingStartTime' }),
......
......@@ -91,6 +91,11 @@ const BillsForm: React.FC<BillsFormProps> = ({
align: 'center',
},
{
title: intl.formatMessage({ id: 'stockSellStorage.materialGroup' }),
dataIndex: ['materialGroup', 'name'],
align: 'center',
},
{
title: intl.formatMessage({ id: 'stockSellStorage.guigexinghao' }),
dataIndex: 'type',
align: 'center',
......
......@@ -238,6 +238,17 @@ export const addBillSchema: ISchema = {
ellipsis: true,
},
},
goodsGroup: {
type: 'string',
title: intl.formatMessage({id: 'stockSellStorage.materialGroup'}),
'x-props': {
width: 150,
},
'x-component': 'Text',
'x-component-props': {
ellipsis: true,
},
},
specifications: {
type: 'string',
title: intl.formatMessage({id: 'stockSellStorage.guigexinghao'}),
......@@ -695,6 +706,17 @@ export const goodsSearchSchema: ISchema = {
allowClear: true,
},
},
materialGroupId: {
type: 'string',
'x-component': 'CustomCategorySearch',
'x-component-props': {
placeholder: intl.formatMessage({ id: 'commodity.goods.schema.goodsSchema.goodsGroupId' }),
showSearch: true,
notFoundContent: null,
dataoption: [],
fieldNames: { label: 'title', value: 'id', children: 'children' },
},
},
submit: {
'x-component': 'Submit',
'x-mega-props': {
......
......@@ -53,6 +53,11 @@ const Inventory: React.FC<{}> = () => {
render: (text: any, record: any) => text,
},
{
title: intl.formatMessage({ id: 'stockSellStorage.materialGroup' }),
dataIndex: 'goodsGroup',
align: 'center',
},
{
title: intl.formatMessage({ id: 'stockSellStorage.guigexinghao' }),
dataIndex: 'specifications',
align: 'center',
......
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