Commit 9587e0ca authored by 前端-许佳敏's avatar 前端-许佳敏

采购订单接口对接

parent 16e2254a
......@@ -77,7 +77,7 @@ export const useLinkEnumEffect = (childKey, transformFn?, findKey = 'id') => {
} else {
if (originData.length > 0) {
const result = originData.find(v => v[findKey] === state.value)[childKey] || []
if (state.modified && state.initialValue) {
if (state.modified) {
targetState.value = undefined
}
targetState.originData = result
......
......@@ -7,7 +7,10 @@ interface useRowSelectionTableCtl {
selectRow: any[],
selectedRowKeys: any[],
setSelectRow(rows: any[]),
setSelectedRowKeys(rows: any)
setSelectedRowKeys(rows: any),
// 新增 追加选项时,需判断是否已经存在
appendSelectRow(row),
appendSelectRowKeys(rowKey)
}
interface useRowSelectionOptions {
......@@ -82,5 +85,33 @@ export const useRowSelectionTable = (options: useRowSelectionOptions = {}): [Tab
}
}
return [rowSelection, { selectRow, setSelectRow, selectedRowKeys, setSelectedRowKeys }]
const appendSelectRow = (row) => {
if (row[customKey]) {
const newData = [...selectRow]
const findIndex = newData.findIndex(v => v[customKey] === row[customKey])
if (findIndex !== -1) {
// 已经存在列表中
newData.splice(findIndex, 1)
} else {
newData.push(row)
}
setSelectRow(newData)
}
}
const appendSelectRowKeys = (rowKey) => {
if (rowKey) {
const newData = [...selectedRowKeys]
const findIndex = newData.findIndex(v => v === rowKey)
if (findIndex !== -1) {
// 已经存在列表中
newData.splice(findIndex, 1)
} else {
newData.push(rowKey)
}
setSelectedRowKeys(newData)
}
}
return [rowSelection, { selectRow, setSelectRow, selectedRowKeys, setSelectedRowKeys, appendSelectRow, appendSelectRowKeys }]
}
\ No newline at end of file
......@@ -179,7 +179,7 @@ const FastModifyPrice: React.FC<{}> = () => {
console.log(params, filterParams)
return new Promise((resolve, reject) => {
//@ts-ignore
PublicApi.getProductCommodityGetCommodityDetailList({ ...filterParams, ...params }).then(res => {
PublicApi.getProductCommodityGetCommodityDetailList({ ...filterParams, ...params, environment: 1 }).then(res => {
const { data } = res
resolve(data)
})
......
......@@ -20,6 +20,7 @@ import SearchSelect from '@/components/NiceForm/components/SearchSelect'
import Search from '@/components/NiceForm/components/Search'
import { useStateFilterSearchLinkageEffect } from '@/formSchema/effects/useFilterSearch'
import Submit from '@/components/NiceForm/components/Submit'
import { SHOP_TYPES, MALL_TYPE } from '@/constants'
export interface PositionSettingProps {
addSchemaAction: ISchemaFormActions,
......@@ -33,7 +34,13 @@ const fetchMemberList = async (params) => {
return res.data
}
const priceTypeMaps = {
[MALL_TYPE[0]]: [1,2],
[MALL_TYPE[1]]: [3],
[MALL_TYPE[2]]: [1],
[MALL_TYPE[3]]: [1],
[MALL_TYPE[4]]: [3]
}
const PositionSetting:React.FC<PositionSettingProps> = (props) => {
const { addSchemaAction, schema, formSubmit, onFieldChange = () => {} } = props
......@@ -51,9 +58,13 @@ const PositionSetting:React.FC<PositionSettingProps> = (props) => {
useUnitPreview(initValue, addSchemaAction)
const fetchProductList = async (params) => {
const shopType = addSchemaAction.getFieldValue('shopType')
const res = await PublicApi.getProductCommodityCommonGetCommodityDetailList({
...params,
shopType: addSchemaAction.getFieldValue('shopType')
shopType,
environment: 1,
// 根据商城类型手动传输定价类型
priceTypeList: priceTypeMaps[shopType] ? priceTypeMaps[shopType] : undefined
})
return res.data
}
......
......@@ -2,12 +2,12 @@ import React, { useEffect } from 'react'
import ModalTable, { ModalTableProps } from '@/components/ModalTable'
import { fetchOrderApi } from '../../readyAddOrder/apis'
import { useModalTable } from '../../readyAddOrder/model/useModalTable'
import { ISchemaFormActions } from '@formily/antd'
import { ISchemaFormActions, ISchemaFormAsyncActions } from '@formily/antd'
import { inquiryColumns } from '../../readyAddOrder/constant'
export interface DemandModalTableProps extends ModalTableProps {
type?: 'radio' | 'checkbox',
schemaAction: ISchemaFormActions,
schemaAction: ISchemaFormActions | ISchemaFormAsyncActions,
currentRef?: any,
confirmModal?()
}
......
......@@ -2,12 +2,12 @@ import React, { useEffect } from 'react'
import ModalTable, { ModalTableProps } from '@/components/ModalTable'
import { fetchOrderApi } from '../../readyAddOrder/apis'
import { useModalTable } from '../../readyAddOrder/model/useModalTable'
import { ISchemaFormActions } from '@formily/antd'
import { ISchemaFormActions, ISchemaFormAsyncActions } from '@formily/antd'
import { inquiryColumns } from '../../readyAddOrder/constant'
export interface InquiryModalTableProps extends ModalTableProps {
type?: 'radio' | 'checkbox',
schemaAction: ISchemaFormActions,
schemaAction: ISchemaFormActions | ISchemaFormAsyncActions,
currentRef?: any,
confirmModal?()
}
......
......@@ -2,12 +2,12 @@ import React, { useEffect } from 'react'
import ModalTable, { ModalTableProps } from '@/components/ModalTable'
import { fetchOrderApi } from '../../readyAddOrder/apis'
import { useModalTable } from '../../readyAddOrder/model/useModalTable'
import { ISchemaFormActions } from '@formily/antd'
import { ISchemaFormActions, ISchemaFormAsyncActions } from '@formily/antd'
import { memberColumns } from '../../readyAddOrder/constant'
export interface MemberModalTableProps extends ModalTableProps {
type?: 'radio' | 'checkbox',
schemaAction: ISchemaFormActions,
schemaAction: ISchemaFormActions | ISchemaFormAsyncActions,
currentRef?: any,
confirmModal?()
}
......
......@@ -7,7 +7,7 @@ export interface PayInfoCellProps {
children: React.ReactNode;
dataIndex: string;
record: any;
handleSave: (record: any) => void;
handleSave: (record: any) => Promise<any>;
forceEdit: boolean,
formItem: string,
formItemProps: any
......@@ -15,11 +15,20 @@ export interface PayInfoCellProps {
const EditableContext = React.createContext<any>({});
export const EditableRow: React.FC<any> = ({ index, ...props }) => {
export const EditableRow: React.FC<any> = (props) => {
const [form] = Form.useForm();
const { options = [] } = props?.children[5]?.props.additionalProps.formItemProps || {}
const [childOptions, setChildOptions] = useState<any[]>([])
const ctx = {
form,
childOptions,
setChildOptions,
originOptions: options
}
return (
<Form form={form} component={false}>
<EditableContext.Provider value={form}>
<EditableContext.Provider value={ctx}>
<tr {...props} />
</EditableContext.Provider>
</Form>
......@@ -40,25 +49,13 @@ export const PayInfoCell:React.FC<PayInfoCellProps> = ({
formItemProps={},
...restProps
}) => {
const [editing, setEditing] = useState(false);
const formItemRef = useRef<any>();
const form = useContext(EditableContext);
useEffect(() => {
if (editing) {
formItemRef.current.focus();
}
}, [editing]);
const toggleEdit = () => {
setEditing(!editing);
form.setFieldsValue({ [dataIndex]: record[dataIndex] });
};
const { form, childOptions, setChildOptions, originOptions } = useContext(EditableContext);
const save = async e => {
try {
const values = await form.validateFields();
toggleEdit();
console.log(values)
handleSave({ ...record, ...values });
} catch (errInfo) {
console.log('Save failed:', errInfo);
......@@ -71,7 +68,31 @@ export const PayInfoCell:React.FC<PayInfoCellProps> = ({
return <Input ref={formItemRef} onPressEnter={save} onBlur={save} {...formItemProps}/>
}
case 'select': {
return <Select ref={formItemRef} onChange={save} {...formItemProps}/>
const { options, ...rest } = formItemProps
// 支付方式
if (dataIndex === 'payWay') {
return <Select ref={formItemRef}
options={originOptions.map(v => ({label: v.payVal, value: v.payType}))}
onChange={e => {
const result = originOptions.find(v => e === v.payType)
setChildOptions(result.payList.map(v => ({label: v.way, value: v.id})))
save(e)
}}
{...rest}
/>
}
// 需联动的内容
if (dataIndex === 'channel') {
return <Select
ref={formItemRef}
onChange={save}
options={childOptions}
{...rest}
/>
}
}
}
}
......@@ -79,7 +100,7 @@ export const PayInfoCell:React.FC<PayInfoCellProps> = ({
let childNode = children;
if (editable) {
childNode = (forceEdit || editing) ? (
childNode = (forceEdit) ? (
<Form.Item
style={{ margin: 0 }}
name={dataIndex}
......@@ -93,9 +114,7 @@ export const PayInfoCell:React.FC<PayInfoCellProps> = ({
{chooseFormItem(formItem)}
</Form.Item>
) : (
<div className="editable-cell-value-wrap" style={{ paddingRight: 24 }} onClick={toggleEdit}>
{children}
</div>
null
);
}
......
......@@ -3,11 +3,12 @@ import ModalTable, { ModalTableProps } from '@/components/ModalTable'
import { useRowSelectionTable } from '@/hooks/useRowSelectionTable'
import { fetchOrderApi } from '../../readyAddOrder/apis'
import { useModalTable } from '../../readyAddOrder/model/useModalTable'
import { ISchemaFormActions } from '@formily/antd'
import { ISchemaFormActions, ISchemaFormAsyncActions } from '@formily/antd'
import { OrderModalType } from '../../readyAddOrder/constant'
export interface ProductModalTableProps extends ModalTableProps {
type?: 'radio' | 'checkbox',
schemaAction: ISchemaFormActions,
schemaAction: ISchemaFormActions | ISchemaFormAsyncActions,
currentRef?: any,
confirmModal?()
}
......@@ -37,8 +38,28 @@ export const productColumns: any[] = [
align: 'center',
key: 'brandName',
},
{
title: '单位',
dataIndex: 'unitName',
align: 'center',
key: 'unitName'
},
{
title: '库存数量',
dataIndex: 'stockCount',
align: 'center',
key: 'stockCount'
},
]
// 下单类型->商城类型映射
const orderProductShopTypeMaps = {
[OrderModalType.HAND_ORDER]: 1,
[OrderModalType.CONSOLIDATED_ORDER]: 1,
[OrderModalType.CHANNEL_DIRECT_MINING_ORDER]: 3,
[OrderModalType.CHANNEL_SPOT_MANUAL_ORDER]: 4
}
const ProductModalTable:React.FC<ProductModalTableProps> = (props) => {
const { type = 'checkbox', schemaAction, confirmModal, currentRef, ...restProps } = props
const { visible, setVisible, rowSelection, rowSelectionCtl } = useModalTable({type})
......@@ -58,22 +79,35 @@ const ProductModalTable:React.FC<ProductModalTableProps> = (props) => {
confirmModal && confirmModal()
setVisible(false)
}
const fetchProductList = (values) => {
const modelType = schemaAction.getFieldValue('orderModel')
const params = {
...values,
shopType: orderProductShopTypeMaps[modelType],
environment: 1,
// 手工下单/合并订单下单时,查询现货价格商品
priceTypeList: modelType === (OrderModalType.CONSOLIDATED_ORDER || OrderModalType.HAND_ORDER) ? [1] : undefined
}
return fetchOrderApi.getProductList(params)
}
return (
<ModalTable
modalTitle='选择订单商品'
width={900}
columns={productColumns}
visible={visible}
confirm={handleConfirmProduct}
cancel={() => setVisible(false)}
fetchTableData={(params) => fetchOrderApi.getProductList(params)}
fetchTableData={fetchProductList}
rowSelection={rowSelection}
modalType='productByDefault'
tableProps={{
rowKey: 'id',
onRow: (record) => ({
onClick: () => {
rowSelectionCtl.setSelectRow([record]);
rowSelectionCtl.setSelectedRowKeys([record.id]);
rowSelectionCtl.appendSelectRow(record);
rowSelectionCtl.appendSelectRowKeys(record.id);
},
})
}}
......
import React, { useState, useRef, useContext, useEffect } from 'react'
import { Form, Input, Select } from 'antd';
export interface ProductTableCellProps {
title: React.ReactNode;
editable: boolean;
children: React.ReactNode;
dataIndex: string;
record: any;
handleSave: (record: any) => Promise<any>;
forceEdit: boolean,
formItem: string,
formItemProps: any
}
const EditableContext = React.createContext<any>({});
export const ProductEditableRow: React.FC<any> = ({...props }) => {
const [form] = Form.useForm();
const ctx = {
form
}
return (
<Form form={form} component={false}>
<EditableContext.Provider value={ctx}>
<tr {...props} />
</EditableContext.Provider>
</Form>
);
};
export const ProductTableCell:React.FC<ProductTableCellProps> = ({
title,
editable,
children,
dataIndex,
record,
handleSave,
forceEdit,
formItem,
formItemProps={},
...restProps
}) => {
const formItemRef = useRef<any>();
const { form } = useContext(EditableContext);
const save = async e => {
try {
const values = await form.validateFields();
handleSave({ ...record, ...values });
} catch (errInfo) {
console.log('Save failed:', errInfo);
}
};
const chooseFormItem = (type) => {
switch(type) {
case 'input': {
return <Input style={{width: 140}} ref={formItemRef} onChange={save} {...formItemProps}/>
}
}
}
let childNode = children;
if (editable) {
childNode =
<Form.Item
style={{ margin: 0 }}
name={dataIndex}
rules={[
{
required: true,
message: `${title}必须填写`,
},
]}
>
{chooseFormItem(formItem)}
</Form.Item>
}
return <td {...restProps}>{childNode}</td>;
}
ProductTableCell.defaultProps = {}
export default ProductTableCell
\ No newline at end of file
......@@ -3,7 +3,7 @@ import { PublicApi } from '@/services/api'
export const fetchOrderApi = {
// 弹窗获取商品列表
async getProductList(params) {
const { data } = await PublicApi.getProductCommodityGetCommodityDetailList({...params, shopType: 1})
const { data } = await PublicApi.getProductCommodityCommonGetCommodityDetailList(params)
return data
},
......
import React from 'react'
import { formatTimeString } from '@/utils'
import { Row, Space, Popover } from 'antd'
import { DELIVERY_TYPE } from '@/constants'
import { EnvironmentOutlined } from '@ant-design/icons'
import { PublicApi } from '@/services/api'
// 简单控制价格区间的组件
// @todo 后续需要优化, 样式,目录文件等。
const PriceComp = (props) => {
const { priceSection = {} } = props
const priceTransKeys = Object.keys(priceSection)
// 出现0-0 表示没有单价区间范围
if (priceTransKeys.length === 1 && priceTransKeys[0] === '0-0') {
return <span style={{color: '#E63F3B'}}>{'¥' + priceSection[priceTransKeys[0]]}</span>
}
return <div>
{
priceTransKeys.map(v => <Row key={v} justify='space-between'>
<span style={{color: '#606266'}}>{v.replace('-', '~')}:</span>
<span style={{color: '#E63F3B', marginLeft: 40}}>{priceSection[v]}</span>
</Row>)
}
</div>
}
const AddressPop = (props) => {
const { pickInfo = null, children } = props
return pickInfo && pickInfo.deliveryType === 2 ? <Space>
<EnvironmentOutlined style={{marginRight: 8}}/>
<Popover content={
<Row>
<EnvironmentOutlined/>
<div>
<h3>自提地址</h3>
<p>{pickInfo.receiverName} / {pickInfo.phone}</p>
<p>{pickInfo.fullAddress}</p>
</div>
</Row>
}>
{children}
</Popover>
</Space> : children
}
export enum OrderModalType {
......@@ -218,7 +261,7 @@ export const paymentInformationColumns: any[] = [
editable: true,
forceEdit: true,
formItemProps: {
options: payTypeLabel
options: []
},
width: 200
},
......@@ -231,4 +274,96 @@ export const paymentInformationColumns: any[] = [
forceEdit: true,
width: 200
},
]
// 商品列表
export const productInfoColumns: any[] = [
{
title: 'ID',
dataIndex: 'id',
align: 'center',
key: 'id',
},
{
title: '商品名称',
dataIndex: 'name',
align: 'center',
key: 'name',
},
{
title: '品类',
dataIndex: 'customerCategoryName',
align: 'center',
key: 'customerCategoryName',
},
{
title: '品牌',
dataIndex: 'brandName',
align: 'center',
key: 'brandName',
},
{
title: '单位',
dataIndex: 'unitName',
align: 'center',
key: 'unitName',
},
{
title: '单价(元)',
dataIndex: 'unitPrice',
align: 'left',
key: 'unitPrice',
render: text => <PriceComp priceSection={text}/>
},
{
title: '会员折扣',
dataIndex: 'memberPrice',
align: 'center',
key: 'memberPrice',
render: (text, record) => record.isMemberPrice ? text : null
},
{
title: '采购数量',
dataIndex: 'quotationNo',
align: 'center',
key: 'quotationNo',
formItem: 'input',
editable: true,
width: 140
},
{
title: '含税',
dataIndex: 'none',
align: 'center',
key: 'none',
},
{
title: '金额',
dataIndex: 'price',
align: 'center',
key: 'price',
},
// 接口调用
{
title: '配送方式',
dataIndex: 'logistics',
align: 'center',
key: 'logistics',
render: async (text, record) => {
if (text.deliveryType === 2) {
const { code, data } = await PublicApi.getLogisticsShipperAddressGet({
id: text.sendAddress
}, { ttl: 60 * 1000, useCache: true })
return code === 1000 ? <AddressPop pickInfo={data}>{DELIVERY_TYPE[text.deliveryType]}</AddressPop> : DELIVERY_TYPE[text.deliveryType]
} else {
return DELIVERY_TYPE[text.deliveryType]
}
}
},
{
title: '操作',
dataIndex: 'ctl',
align: 'center',
key: 'ctl',
},
]
\ No newline at end of file
......@@ -3,14 +3,14 @@ import { history } from 'umi'
import { PageHeaderWrapper } from '@ant-design/pro-layout'
import ReutrnEle from '@/components/ReturnEle'
import { usePageStatus, PageStatus } from '@/hooks/usePageStatus'
import { Button, Card } from 'antd'
import { createFormActions } from '@formily/antd'
import { Button, Card, Row, Col } from 'antd'
import { createFormActions, createAsyncFormActions, registerVirtualBox, useFormSpy } from '@formily/antd'
import { SaveOutlined, LinkOutlined, PlusOutlined } from '@ant-design/icons'
import NiceForm from '@/components/NiceForm'
import { orderDetailSchema, orderAddSchema } from './schema'
import { useModelTypeChange, useEditHideField, useOrderFormInitEffect, useProductTableChangeForPay } from './effects'
import { OrderModalType, orderTypeLabel, orderCombination, paymentInformationColumns } from './constant'
import ProductModalTable, { productColumns } from '../components/productModalTable'
import ProductModalTable from '../components/productModalTable'
import MemberModalTable from '../components/memberModalTable'
import InquiryModalTable from '../components/inquiryModalTable'
import DemandModalTable from '../components/demandModalTable'
......@@ -19,32 +19,77 @@ import SelectAddress from '../components/selectAddress'
import TheInvoiceList from '../components/theInvoiceList'
import moment from 'moment'
import { usePaymentInfo } from './model/usePaymentInfo'
import { useProductTable } from './model/useProductTable'
import styled from 'styled-components'
import { useUpdate } from '@umijs/hooks'
import { fetchOrderApi } from './apis'
import { PublicApi } from '@/services/api'
export interface PurchaseOrderDetailProps {}
const RowStyle = styled(props => <Row style={{marginTop: 12}} justify='end' {...props}>
{props.children}
</Row>)`
.ant-col {
text-align: center
}
.ant-col div {
margin-bottom: 12px;
}
`
const addSchemaAction = createFormActions()
// 总计金额联动框
export const MoneyTotalBox = registerVirtualBox('moneyTotalBox', props => {
// @todo 由于缺乏商品字段, 目前选用假数据
const { form } = useFormSpy({ selector: [['onFieldValueChange', 'orderProductRequests']], reducer: v => v })
const data = form.getFieldValue('orderProductRequests')
const getRowTotalPrice = data.map(v => {
const numberNo = parseInt(v.quotationNo)
const quotationNo = (typeof numberNo === 'number' && !isNaN(numberNo)) ? numberNo : 0
return quotationNo * 100
})
const sum = getRowTotalPrice.reduce((prev, next) => prev + next, 0)
return <RowStyle>
<Col span={2}>
<div>合计金额</div>
<div>{sum}</div>
</Col>
<Col span={2}>
<div>运费</div>
<div>{sum}</div>
</Col>
<Col span={2}>
<div>总计金额</div>
<div>{sum}</div>
</Col>
</RowStyle>
})
// 采购订单详情页. 包含新增和编辑
const PurchaseOrderDetail:React.FC<PurchaseOrderDetailProps> = (props) => {
const productRef = useRef<any>({})
const memberRef = useRef<any>({})
const inquiryRef = useRef<any>({})
const demandRef = useRef<any>({})
const update = useUpdate()
const [paymentColumns, paymentComponents, paymentSave] = usePaymentInfo(addSchemaAction)
const { productAddButton, productRef, productColumns, productComponents } = useProductTable(addSchemaAction)
// 页面进入时, 当前所处的下单模式
const { pageStatus } = usePageStatus()
const handleSubmit = (value) => {
const handleSubmit = async (value) => {
const params = {
...value,
deliveryTime: moment(value.deliveryTime).valueOf()
deliveryTime: moment(value.deliveryTime).valueOf(),
}
console.log(params)
await PublicApi.postOrderProcurementOrderAdd(params)
}
// 唤起报价单弹窗
const handleOrderNo = () => {
const handleOrderNo = async () => {
// @todo 未完整实现功能, 缺少商品接口
// 询价报价单, 合并订单需要唤起询价弹窗
const orderModel = addSchemaAction.getFieldValue('orderModel')
......@@ -62,8 +107,6 @@ const PurchaseOrderDetail:React.FC<PurchaseOrderDetailProps> = (props) => {
const orderNoPrice = pageStatus !== PageStatus.PREVIEW && <div className='connectBtn' onClick={handleOrderNo}><LinkOutlined style={{marginRight: 4}}/>选择</div>
const orderMember = pageStatus !== PageStatus.PREVIEW && <div className='connectBtn' onClick={handleOrderMember}><LinkOutlined style={{marginRight: 4}}/>选择</div>
const productAddButton = <Button onClick={() => productRef.current.setVisible(true)} block type='default' style={{margin: '24px auto'}}>选择订单商品</Button>
// @todo 未实现金额合计
const couponAddButton = <Button onClick={() => productRef.current.setVisible(true)} block type='default' style={{margin: '24px auto'}}>选择优惠券</Button>
......@@ -84,7 +127,7 @@ const PurchaseOrderDetail:React.FC<PurchaseOrderDetailProps> = (props) => {
formItem: col.formItem,
formItemProps: col.formItemProps,
forceEdit: col.forceEdit,
handleSave: paymentSave,
handleSave: paymentSave
}),
};
})
......@@ -152,7 +195,7 @@ const PurchaseOrderDetail:React.FC<PurchaseOrderDetailProps> = (props) => {
useEditHideField()
// 商品信息的改动 驱动支付信息变化
useProductTableChangeForPay(ctx)
useProductTableChangeForPay(ctx, update)
}}
expressionScope={{
orderNoPrice,
......@@ -161,6 +204,8 @@ const PurchaseOrderDetail:React.FC<PurchaseOrderDetailProps> = (props) => {
paymentComponents,
productColumns,
productAddButton,
productComponents,
// productAfter: afterFix,
couponAddButton,
orderCombination,
addNewAddress,
......
......@@ -4,8 +4,51 @@ import { useLinkageUtils } from '@/utils/formEffectUtils';
import { OrderModalType, orderCombination } from '../constant';
import { history } from 'umi';
import { fetchOrderApi } from '../apis';
import { useUpdate } from '@umijs/hooks';
import { PublicApi } from '@/services/api';
// 异步填充表格字段
const asyncPadDataForProduct = async (ctx: ISchemaFormActions | ISchemaFormAsyncActions, productData: any[]) => {
if (productData.length === 0) {
return false
}
// 折扣请求
const asyncPriceRequests = await Promise.all(productData.filter(v => v.memberPrice === undefined).map(async v => {
const {code, data} = await PublicApi.getMemberManageUpperCreditParamGet({
parentMemberId: v.memberId,
parentMemberRoleId: v.memberRoleId
}, {ttl: 60 * 1000, useCache: true})
return code === 1000 ? (data.parameter * 100) + '%' : ''
}
))
// const asyncAddressRequests = await Promise.all(productData.filter(v => v.memberPrice === undefined).map(async v => {
// const {code, data} = await PublicApi.getLogisticsShipperAddressGet({
// id: v.logistics.sendAddress
// }, {ttl: 60 * 1000, useCache: true})
// return code === 1000 ? data : null
// }
// ))
// 存在需要异步请求的, 则进行赋值
if (asyncPriceRequests.length > 0) {
const newData = productData.map((v, i) => {
v.memberPrice = asyncPriceRequests[i]
return v
})
console.log(newData)
ctx.setFieldValue('orderProductRequests', newData)
}
// if (asyncAddressRequests.length > 0) {
// ctx.setFieldValue('orderProductRequests', productData.map((v, i) => {
// v.memberPrice = asyncPriceRequests[i]
// return v
// }))
// }
// 配送方式请求
// const asyncAddressRequests = productData.filter(v => v.distributeMode !== undefined)
}
export const createEffects = context => () => {
}
......@@ -29,21 +72,30 @@ export const useEditHideField = () => {
})
}
export const useProductTableChangeForPay = (ctx: ISchemaFormActions | ISchemaFormAsyncActions) => {
export const useProductTableChangeForPay = (ctx: ISchemaFormActions | ISchemaFormAsyncActions, update) => {
FormEffectHooks.onFieldValueChange$('orderProductRequests').subscribe(state => {
const { value } = state
const payInfoData = ctx.getFieldValue('paymentInformationResponses')
// 强制渲染一次, 用于触发金额总数
update()
// 已经存在数据 无需请求
if (payInfoData && payInfoData.length > 0) {
} else if (state.value && state.value.length > 0){
} else if (value && value.length > 0){
// 请求一次并复制给支付信息
const productItem = state.value[0]
const productItem = value[0]
fetchOrderApi.getPayInfoList({
productId: productItem.id
}).then(data => {
ctx.setFieldValue('paymentInformationResponses', data)
// ctx.setFieldValue('paymentInformationResponses', data)
}).catch(err => {
})
}
// 确认后 需根据商品id请求会员折扣接口, 以及配送方式
// 由于商品存在多个, 需对接口做一定缓存
console.log(value)
asyncPadDataForProduct(ctx, value)
})
}
......
import { paymentInformationColumns } from '../constant'
import { PayInfoCell, EditableRow } from '../../components/payInfoTableCell'
import { ISchemaFormActions } from '@formily/antd'
import { ISchemaFormActions, ISchemaFormAsyncActions } from '@formily/antd'
import { useEffect, useState, useRef } from 'react'
import { PublicApi } from '@/services/api'
export const usePaymentInfo = (ctx: ISchemaFormActions): any => {
const columns = paymentInformationColumns
export const usePaymentInfo = (ctx: ISchemaFormActions | ISchemaFormAsyncActions): any => {
const paywayData = useRef<any>({})
const [columns, setColumns] = useState<any[]>(paymentInformationColumns)
const components = {
body: {
row: EditableRow,
cell: PayInfoCell
},
}
const initPayWayList = (data) => {
if (!data) {
return []
}
let result = []
for (let item of data) {
if (result.some(tempItem => tempItem.payType === item.payType)) {
result = result.map(resItem => {
if (resItem.payType === item.payType) {
resItem.payList = [...resItem.payList, item]
}
return resItem
})
} else {
let payVal = ""
switch (item.payType) {
case 1:
payVal = "线上支付"
break
case 2:
payVal = "线下支付"
break
case 3:
payVal = "授信支付"
break
case 4:
payVal = "货到付款"
break
}
result.push({
payVal,
payType: item.payType,
payList: [item]
})
}
}
return result
}
useEffect(() => {
PublicApi.getPayPayWayList().then(res => {
const { code, data } = res
if (code === 1000) {
const newColumns = [...columns]
newColumns[5].formItemProps.options = initPayWayList(data)
paywayData.current = data
setColumns(newColumns)
}
})
}, [])
const handleSave = row => {
const newData = [...ctx.getFieldValue('paymentInformationResponses')];
const index = newData.findIndex(item => row.key === item.key);
const item = newData[index];
newData.splice(index, 1, {
...item,
...row,
});
ctx.setFieldValue('paymentInformationResponses', newData)
return new Promise((resolve, reject) => {
const newData = [...ctx.getFieldValue('paymentInformationResponses')];
const index = newData.findIndex(item => row.key === item.key);
const item = newData[index];
newData.splice(index, 1, {
...item,
...row,
});
ctx.setFieldValue('paymentInformationResponses', newData)
resolve({item, newData})
})
};
return [
columns,
......
import React, { useRef, useMemo, useState } from 'react'
import { ISchemaFormActions, ISchemaFormAsyncActions, createControllerBox, useFormSpy } from '@formily/antd';
import { Button, Row, Col } from 'antd';
import { productInfoColumns } from '../constant';
import ProductTableCell, { ProductEditableRow } from '../../components/productTableCell';
export const useProductTable = (ctx: ISchemaFormActions | ISchemaFormAsyncActions) => {
const productRef = useRef<any>({})
const [productColumns, setProductColumns] = useState(() => productInfoColumns)
const productAddButton = <Button onClick={() => productRef.current.setVisible(true)} block type='default' style={{margin: '24px auto'}}>选择订单商品</Button>
const productComponents = {
body: {
row: ProductEditableRow,
cell: ProductTableCell
}
}
const handleSave = row => {
return new Promise((resolve, reject) => {
const newData = [...ctx.getFieldValue('orderProductRequests')];
const index = newData.findIndex(item => row.key === item.key);
const item = newData[index];
newData.splice(index, 1, {
...item,
...row,
});
console.log(newData)
ctx.setFieldValue('orderProductRequests', newData)
resolve({item, newData})
})
};
const paymentEditColumns = productColumns.map(col => {
if (!col.editable) {
return col;
}
return {
...col,
onCell: record => ({
record,
editable: col.editable,
dataIndex: col.dataIndex,
title: col.title,
formItem: col.formItem,
formItemProps: col.formItemProps,
handleSave
}),
};
})
return {
productRef,
productAddButton,
productColumns: paymentEditColumns,
productComponents
}
}
\ No newline at end of file
......@@ -214,9 +214,13 @@ const orderProduct: ISchema = {
"x-component-props": {
rowKey: 'id',
columns: "{{productColumns}}",
// @todo 第一版本暂不做优惠券
// suffix: "{{couponAddButton}}"
}
components: "{{productComponents}}",
},
// default: [{id: 904}]
},
NO_SUBMIT_SPY: {
type: 'object',
"x-component": "moneyTotalBox"
}
}
}
......@@ -236,13 +240,13 @@ const payInfo: ISchema = {
columns: "{{paymentColumns}}",
components: "{{paymentComponents}}"
},
default: [
{
payCount: 1,
id: 1,
payRatio: 123
}
]
// default: [
// {
// payCount: 1,
// id: 1,
// payRatio: 123
// }
// ]
}
}
}
......
......@@ -69,6 +69,8 @@ const baseRequest = extend({
// errorHandler
});
const cache = {}
// 请求拦截器
baseRequest.interceptors.request.use((url: string, options: RequestOptionsInit): { url: string, options: RequestOptionsInit } => {
// 判断是否有权限
......@@ -83,6 +85,7 @@ baseRequest.interceptors.request.use((url: string, options: RequestOptionsInit):
options.paramsSerializer = params => {
return qs.stringify(params, { arrayFormat: 'brackets' })
}
return {
// 前缀如果已经带上api, 跳过自动补前缀
url: url.startsWith('/api') ? url : basePrefix + url,
......@@ -111,7 +114,6 @@ class ApiRequest {
createRequest<T>(url: string, options: IApiRequest = { ctlType: 'none' }): Promise<IRequestSuccess<T>> {
return new Promise((resolve, reject) => {
baseRequest<IRequestSuccess<T>>(url, options).then(res => {
// 登录验证
if (res.code === 1101) {
removeAuth()
......
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