Commit 3894d36b authored by 前端-钟卫鹏's avatar 前端-钟卫鹏

Merge branch 'v2-220318' of http://10.0.0.22:3000/lingxi/lingxi-business-paltform into v2-220318

parents a69fe7f6 2bd2dcbe
......@@ -10,6 +10,12 @@ export default [
name: '询价报价',
routes: [
{
/** 待分配询价单 */
path: '/memberCenter/tranactionAbility/inquiryOffer/waitAllotOrder',
name: '待分配询价单',
component: '@/pages/transaction/dealAbility/inquiryOffer/waitAllotOrder',
},
{
/** 询价单查询 */
path: '/memberCenter/tranactionAbility/inquiryOffer/inquirySearch',
name: '询价单查询',
......
......@@ -24,7 +24,7 @@ import asyncRoutes from '../router.config.json';
// import contracRoute from './contracRoute';
// export const routes = [CommodityRoute, MemberRoute, ShopRoute, ChannelRoute, TranactionRoute, AfterService, PayandSettleRoute, LogisticsRoute, AuthConfigRoute, HandlingRoute, BalaceRoute]
const isDev = false;
const isDev = true;
const homeRoute = {
path: `/memberCenter/home`,
name: 'home',
......
/*
* @Description: 省市区选择组件子项
*/
import React, { useState, useEffect } from 'react';
import { Select } from 'antd';
import { getManageAreaByPcode } from '@/services/ManageV2Api';
export type AreaSelectValueType = {
/**
* 名称
*/
name?: string,
/**
* 编码
*/
code: string,
}
export type OptionType = {
label: string,
value: string,
}
interface AreaSelectItemProps {
/**
* 父级code,null 表示第一层级,也就是省
*/
pcode: string | null,
/**
* 值,code数组
*/
value?: AreaSelectValueType,
/**
* 选择触发改变
*/
onChange?: (value: AreaSelectValueType) => void,
/**
* 自定义外部 className
*/
customClassName?: string,
}
const AreaSelectItem: React.FC<AreaSelectItemProps> = (props) => {
const { pcode, value, onChange, customClassName } = props;
const [innerValue, setInnerValue] = useState<string | undefined>(undefined);
const [options, setOptions] = useState<OptionType[]>([]);
const [loading, setLoading] = useState<boolean>(false);
const getAreaByPcode = (code?: string) => getManageAreaByPcode({
pcode: code,
});
const initProvinceOptions = async () => {
if (pcode === undefined) {
setOptions([]);
return;
}
setLoading(true);
const res = await getAreaByPcode(pcode);
if (res.code === 1000) {
setOptions(res.data.map((item) => ({ label: item.name, value: item.code })));
}
setLoading(false);
};
useEffect(() => {
initProvinceOptions();
}, [pcode]);
useEffect(() => {
if ('value' in props) {
setInnerValue(value?.code);
}
}, [value]);
const triggerChange = (value: AreaSelectValueType) => {
if (onChange) {
onChange(value);
}
};
const handleSelectChange = (value: string) => {
if (!('value' in props)) {
setInnerValue(value);
}
triggerChange(value ? {
name: options.find((curOptions) => curOptions.value === value)?.label || '',
code: value,
} : undefined);
};
return (
<Select
className={customClassName}
options={options}
value={innerValue}
onChange={handleSelectChange}
loading={loading}
allowClear
/>
);
};
export default AreaSelectItem;
.area-select {
&-item {
width: 100%;
}
}
\ No newline at end of file
/*
* @Description: 省市区选择组件
*/
import React, { useState, useEffect } from 'react';
import { Row, Col } from 'antd';
import themeConfig from '@/../config/lingxi.theme.config';
import AreaSelectItem, { AreaSelectValueType } from './AreaSelectItem';
import styles from './index.less';
interface AreaSelectProps {
/**
* 值,code数组
*/
value?: AreaSelectValueType[],
/**
* 选择触发改变
*/
onChange?: (value: AreaSelectValueType[]) => void,
}
const MAX = 4; // 到街道
const AreaSelect: React.FC<AreaSelectProps> = (props) => {
const {
value,
onChange,
} = props;
const [innerValues, setInnerValues] = useState<AreaSelectValueType[]>([]);
useEffect(() => {
if ('value' in props && value?.length) {
setInnerValues(value);
}
}, [value]);
const triggerChange = (value: AreaSelectValueType[]) => {
if (onChange) {
onChange(value);
}
};
const handleSelectChange = (value: AreaSelectValueType, index: number) => {
let newInnerValues = [...innerValues];
newInnerValues[index] = value;
// 如果是清空操作,则把当前层级之后的 选项 及 值 也清空
if (!value) {
let i = index + 1;
while (i < newInnerValues.length) {
newInnerValues[i] = undefined;
i++;
}
newInnerValues = newInnerValues.filter(Boolean);
triggerChange([]);
}
// 全部选择了才触发 onChange
if (newInnerValues.length === MAX) {
triggerChange(newInnerValues);
} else {
setInnerValues(newInnerValues);
}
};
return (
<div className={styles['area-select']}>
<Row gutter={parseInt(themeConfig['@padding-sm'])}>
<Col span={6}>
<AreaSelectItem
pcode={null}
customClassName={styles['area-select-item']}
value={innerValues[0]}
onChange={(value) => handleSelectChange(value, 0)}
/>
</Col>
<Col span={6}>
<AreaSelectItem
pcode={innerValues[0]?.code}
customClassName={styles['area-select-item']}
value={innerValues[1]}
onChange={(value) => handleSelectChange(value, 1)}
/>
</Col>
<Col span={6}>
<AreaSelectItem
pcode={innerValues[1]?.code}
customClassName={styles['area-select-item']}
value={innerValues[2]}
onChange={(value) => handleSelectChange(value, 2)}
/>
</Col>
<Col span={6}>
<AreaSelectItem
pcode={innerValues[2]?.code}
customClassName={styles['area-select-item']}
value={innerValues[3]}
onChange={(value) => handleSelectChange(value, 3)}
/>
</Col>
</Row>
</div>
);
};
export default AreaSelect;
......@@ -11,15 +11,15 @@ const BasicLayout: React.FC<{}> = () => {
>
<Row gutter={[48, 24]}>
<Col span={12}>
<Form.Item label='门户代码' name='' rules={[{ required: true, message: '请输入门户代码' }]}>
<Form.Item label='门户代码' name='code' rules={[{ required: true, message: '请输入门户代码' }]}>
<Input placeholder='请输入' maxLength={12} />
</Form.Item>
<Form.Item label='门店名称' name='' rules={[{ required: true, message: '请输门店名称' }]}>
<Form.Item label='门店名称' name='name' rules={[{ required: true, message: '请输门店名称' }]}>
<Input placeholder='请输入' maxLength={20} />
</Form.Item>
</Col>
<Col span={12}>
<Form.Item label='门店LOGO' name='' >
<Form.Item label='门店LOGO' name='logo' >
<UploadImage
imgUrl=''
fileMaxSize={50}
......
......@@ -2,6 +2,7 @@ import React from 'react';
import { Button, Col, Form, Input, Row, Select } from 'antd';
import CardLayout from '@/pages/transaction/components/card'
import { LinkOutlined } from '@ant-design/icons';
import AreaSelect from '@/components/AddressSelect/components/AreaSelect';
const ContactLayout: React.FC<{}> = () => {
......@@ -14,20 +15,20 @@ const ContactLayout: React.FC<{}> = () => {
>
<Row gutter={[48, 24]}>
<Col span={12}>
<Form.Item label='门店地址' name='' required>
<span>四级联动</span>
<Form.Item label='门店地址' name='areaSelect' required>
<AreaSelect />
</Form.Item>
<Form.Item label='详细地址' name='' rules={[{ required: true, message: '' }]}>
<Form.Item label='详细地址' name='address' rules={[{ required: true, message: '' }]}>
<Input.TextArea autoSize maxLength={30} placeholder='请填写详细地址,路名、门牌号等' />
</Form.Item>
<Form.Item label='联系人姓名' name='' rules={[{ required: true, message: '' }]}>
<Form.Item label='联系人姓名' name='contactName' rules={[{ required: true, message: '' }]}>
<Input placeholder='请输入您的姓名' maxLength={8} />
</Form.Item>
<Form.Item label='联系电话' name='' required>
<Form.Item label='联系电话' required>
<Row gutter={16}>
<Col span={8}>
<Form.Item
name='phoneCode'
name='countryCode'
rules={[{ required: true, message: '请选择' }]}
>
<Select>
......@@ -39,7 +40,7 @@ const ContactLayout: React.FC<{}> = () => {
</Col>
<Col span={16}>
<Form.Item
name='contactPhone'
name='phone'
rules={[{ required: true, message: '请选择' }]}
>
<Input type='number' maxLength={11} />
......@@ -49,16 +50,16 @@ const ContactLayout: React.FC<{}> = () => {
</Form.Item>
</Col>
<Col span={12}>
<Form.Item label='邮箱' name=''>
<Form.Item label='邮箱' name='email'>
<Input placeholder='请输入' />
</Form.Item>
<Form.Item label='邮编' name=''>
<Form.Item label='邮编' name='postalCode'>
<Input placeholder='请输入' maxLength={6} />
</Form.Item>
<Form.Item label='职位' name='' rules={[{ required: true, message: '' }]}>
<Form.Item label='职位' name='position' rules={[{ required: true, message: '' }]}>
<Input placeholder='请输入' maxLength={10} />
</Form.Item>
<Form.Item label='所属组织机构' name='' rules={[{ required: true, message: '' }]}>
<Form.Item label='所属组织机构' name='orgId' rules={[{ required: true, message: '' }]}>
<Input.Search readOnly enterButton={<div className='connectBtn'><LinkOutlined style={{ marginRight: 4 }} /></div>} />
</Form.Item>
</Col>
......
import React, { Fragment, useRef, useState } from 'react';
import { history } from 'umi';
import { Button, Row, Col, Space, Popconfirm } from 'antd';
import { Button, Row, Col, Space, Popconfirm, Switch } from 'antd';
import TableLayout from '@/components/TableLayout';
import { FORM_FILTER_PATH } from '@/formSchema/const';
import { ColumnType } from 'antd/lib/table/interface';
import EyePreview from '@/components/EyePreview';
import { PlusOutlined } from '@ant-design/icons';
import { getMemberStorePage } from '@/services/MemberV2Api/id13430';
const PortalSystem = () => {
const ref = useRef<any>({});
......@@ -15,24 +16,24 @@ const PortalSystem = () => {
const columns: ColumnType<any>[] = [
{
title: '门店代码',
key: 'id',
dataIndex: 'id',
key: 'code',
dataIndex: 'code',
},
{
title: '门店名称',
key: 'activityName',
dataIndex: 'activityName',
key: 'name',
dataIndex: 'name',
render: (text, record) => <EyePreview url={`/marketingManage/marketing/waitAddedMarketing/preview?id=${record.id}`}>{text}</EyePreview>
},
{
title: '门店地址',
key: 'activityType',
dataIndex: 'activityType',
key: 'fullAddress',
dataIndex: 'fullAddress',
},
{
title: '邮编',
key: 'startTime',
dataIndex: 'startTime',
key: 'postalCode',
dataIndex: 'postalCode',
},
{
title: '所属机构',
......@@ -41,8 +42,8 @@ const PortalSystem = () => {
},
{
title: '联系人',
key: 'signUpStartTime',
dataIndex: 'signUpStartTime',
key: 'contactName',
dataIndex: 'contactName',
},
{
title: '联系电话',
......@@ -51,8 +52,9 @@ const PortalSystem = () => {
},
{
title: '状态',
key: 'signUpEndTime',
dataIndex: 'signUpEndTime',
key: 'showEnable',
dataIndex: 'showEnable',
render: (text, record) => <Switch />
},
{
title: '操作',
......@@ -60,14 +62,14 @@ const PortalSystem = () => {
dataIndex: 'state',
render: (text, record) => (
<Fragment>
<Button type='link'>
编辑
</Button>
<Popconfirm title="确定要删除吗?" okText="是" cancelText="否">
<Button type='link'>
删除
</Button>
</Popconfirm>
{record.showUpdate && <Button type='link'>编辑</Button>}
{record.showDelete && (
<Popconfirm title="确定要删除吗?" okText="是" cancelText="否">
<Button type='link'>
删除
</Button>
</Popconfirm>
)}
</Fragment>
)
}
......@@ -78,9 +80,9 @@ const PortalSystem = () => {
selectedRow
reload={ref}
columns={columns}
effects="id"
effects="name"
fetchRowkeys={(e) => setRowKeys(e)}
fetch={[]}
fetch={getMemberStorePage}
schema={{
type: "object",
properties: {
......@@ -95,7 +97,7 @@ const PortalSystem = () => {
type: "object",
"x-component": "controllerBtns",
},
id: {
name: {
type: 'string',
'x-component': 'Search',
'x-component-props': {
......@@ -126,7 +128,7 @@ const PortalSystem = () => {
inline: true
},
properties: {
activityName: {
contactName: {
type: 'string',
'x-component-props': {
placeholder: '联系人',
......@@ -135,7 +137,7 @@ const PortalSystem = () => {
},
},
},
activityType: {
status: {
type: 'string',
'x-component-props': {
placeholder: '状态',
......
import React, { useRef, useState } from 'react';
import Table from '@/components/TableLayout';
import { getIntl, history } from 'umi';
import { ColumnType } from 'antd/lib/table/interface';
import EyePreview from '@/components/EyePreview';
import moment from 'moment'
import { Row, Col, Button, Tag, Badge } from 'antd';
import { WAITALLOTORDERSCHEMA } from './schema';
import { EXTERNALSTATE_COLOR, INTERNALSTATE_COLOR } from '@/pages/transaction/components/stateColor';
import { getTransactionAuditProductQuotationList, getTransactionProductInquiryExternalStateEnum, getTransactionProductInquiryInteriorStateEnum, postTransactionProductQuotationtAuditAll } from '@/services/TransactionV2Api';
const intl = getIntl();
const WaitAllotOrder = () => {
const ref = useRef<any>({});
const format = (text, fmt?: string) => {
return <>{moment(text).format(fmt || "YYYY-MM-DD HH:mm:ss")}</>
}
const [rowkeys, setRowKeys] = useState<Array<number>>([]);
/** 批量审核 */
const fetchSubmitBatch = async () => {
const res = await postTransactionProductQuotationtAuditAll({ ids: rowkeys });
if (res.code === 1000) {
ref.current.reload();
setRowKeys([])
}
}
const columns: ColumnType<any>[] = [
{
title: intl.formatMessage({id: 'dealAbility.xunjiadanhao'}),
key: 'inquiryListNo',
dataIndex: 'inquiryListNo',
render: (text: any, record: any) => <EyePreview
url={`/memberCenter/tranactionAbility/productInquiry/inquirySearch/preview?id=${record.id}`}>{text}</EyePreview>
},
{
title: intl.formatMessage({ id: 'dealAbility.xunjiadanzhaiyao' }),
key: 'details',
dataIndex: 'details',
},
{
title: intl.formatMessage({ id: 'dealAbility.beixunjiahuiyuan' }),
key: 'memberName',
dataIndex: 'memberName',
},
{
title: intl.formatMessage({id: 'dealAbility.jiaofuriqi'}),
key: 'deliveryTime',
dataIndex: 'deliveryTime',
render: (text: any) => format(text)
},
{
title:intl.formatMessage({id: 'dealAbility.baojiajiezhishijian'}),
key: 'quotationAsTime',
dataIndex: 'quotationAsTime',
render: (text: any) => format(text)
},
{
title: intl.formatMessage({id: 'dealAbility.danjushijian'}),
key: 'voucherTime',
dataIndex: 'voucherTime',
render: (text: any) => format(text)
},
{
title: intl.formatMessage({id: 'dealAbility.waibuzhuangtai'}),
key: 'externalState',
dataIndex: 'externalState',
render: (text: any, record: any) => <Tag color={EXTERNALSTATE_COLOR[text]}>{record.externalStateName}</Tag>
},
{
title: intl.formatMessage({id: 'dealAbility.neibuzhuangtai'}),
key: 'interiorState',
dataIndex: 'interiorState',
render: (text: any, record: any) => <Badge status={INTERNALSTATE_COLOR[text]} text={record.interiorStateName} />
},
{
title: intl.formatMessage({id: 'dealAbility.caozuo'}),
key: 'options',
dataIndex: 'options',
render: (text: any, record: any) => <Button type='link'>领取</Button>
},
];
return (
<Table
selectedRow
reload={ref}
schema={WAITALLOTORDERSCHEMA}
columns={columns}
effects="inquiryListNo"
fetch={getTransactionAuditProductQuotationList}
externalStatusFetch={getTransactionProductInquiryExternalStateEnum({ type: '2' })}
interiorStatusFetch={getTransactionProductInquiryInteriorStateEnum({ type: '2' })}
fetchRowkeys={(e) => setRowKeys(e)}
controllerBtns={
<Row>
<Col span={6}>
<Button
disabled={rowkeys.length === 0}
onClick={fetchSubmitBatch}
>
批量领取
</Button>
</Col>
</Row>
}
/>
)
}
export default WaitAllotOrder
import { ISchema } from "@formily/antd";
import { FORM_FILTER_PATH } from "@/formSchema/const";
import { getIntl } from "umi";
const intl = getIntl();
export const WAITALLOTORDERSCHEMA: ISchema = {
type: "object",
properties: {
megalayout: {
type: "object",
"x-component": "mega-layout",
"x-component-props": {
grid: true
},
properties: {
ctl: {
type: "object",
"x-component": "controllerBtns",
},
inquiryListNo: {//报价单号
type: "string",
"x-component": "Search",
"x-mega-props": {
},
"x-component-props": {
placeholder: intl.formatMessage({ id: 'dealAbility.xunjiadanhao' })
}
}
}
},
[FORM_FILTER_PATH]: {
type: "object",
"x-component": "flex-layout",
"x-component-props": {
rowStyle: {
flexWrap: "nowrap"
},
colStyle: {
marginLeft: 20
}
},
properties: {
PRO_LAYOUT: {
type: "object",
"x-component": "mega-layout",
"x-mega-props": {
span: 5
},
"x-component-props": {
inline: true
},
properties: {
details: {
type: "string",
"x-component-props": {
placeholder: intl.formatMessage({id: 'dealAbility.xunjiadanzhaiyao'})
}
},
memberName: {
type: "string",
"x-component-props": {
placeholder: intl.formatMessage({id: 'dealAbility.beixunjiahuiyuan'})
}
},
"[startDocumentsTime,endDocumentsTime]": {
type: "string",
"x-component": "DateRangePickerUnix",
"x-component-props": {
placeholder: [intl.formatMessage({id: 'dealAbility.kaishishijian'}),intl.formatMessage({id: 'dealAbility.jieshushijian'})],
}
},
externalState: {
type: "string",
"x-component-props": {
placeholder: intl.formatMessage({ id: 'dealAbility.waibuzhuangtai' }),
style: {
width: 160
}
},
enum: []
},
interiorState: {
type: "string",
"x-component-props": {
placeholder: intl.formatMessage({ id: 'dealAbility.neibuzhuangtai' }),
style: {
width: 160
}
},
enum: []
},
}
},
sumbit: {
"x-component": "Submit",
"x-mega-props": {
span: 1
},
"x-component-props": {
children: intl.formatMessage({ id: 'dealAbility.chaxun' })
}
}
}
}
}
}
......@@ -6,9 +6,9 @@ import { GlobalConfig } from '@/global/config';
import queryString from 'query-string'
import { QuestionCircleOutlined } from '@ant-design/icons';
import { Tooltip } from 'antd'
import { getIntl } from 'umi';
import { getIntl, getLocale } from 'umi';
const intl = getIntl();
const intl = getIntl(getLocale());
function isArray(arr: any) {
return Array.isArray(arr)
......@@ -378,7 +378,7 @@ export const getFieldType = (field) => {
},
'x-component-props': {
size: 'large',
placeholder: `请选择${field.fieldLocalName}`,
placeholder: `${intl.formatMessage({ id: 'common.text.pleaseSelect' })}${field.fieldLocalName}`,
dataSource: field.fieldEnum,
...field.attr
}
......
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