Commit e035996a authored by XieZhiXiong's avatar XieZhiXiong

fix: 修改售后相关bug

parent abaf37d3
......@@ -2,7 +2,7 @@
* @Author: XieZhiXiong
* @Date: 2020-11-04 15:09:09
* @LastEditors: XieZhiXiong
* @LastEditTime: 2020-12-21 11:44:17
* @LastEditTime: 2020-12-24 10:32:10
* @Description: 维修商品抽屉组件
*/
import React, { useState, useEffect } from 'react';
......@@ -246,6 +246,11 @@ class GoodsDrawer extends React.Component<GoodsDrawerProps, GoodsDrawerState> {
payload.push(atom);
});
});
if (!payload.length) {
this.setState({ loading: false });
return;
}
processEnumRes = await PublicApi.postOrderGetProcessEnum({
list: payload,
......
/*
* @Author: XieZhiXiong
* @Date: 2020-11-03 18:30:47
* @LastEditors: XieZhiXiong
* @LastEditTime: 2020-12-11 10:29:51
* @Description: 联动逻辑相关
*/
import { Modal } from 'antd';
import { FormEffectHooks, FormPath } from '@formily/antd';
import { useLinkageUtils } from '@/utils/formEffectUtils';
const {
onFieldInputChange$,
onFieldValueChange$,
} = FormEffectHooks;
export const useBusinessEffects = (context, actions) => {
const {
getFieldValue,
setFieldValue,
getFieldState,
setFieldState,
} = actions;
const linkage = useLinkageUtils();
// 联动配送方式
onFieldValueChange$('deliveryType').subscribe(fieldState => {
const { name, value } = fieldState;
switch (value) {
// 物流
case 1: {
linkage.show('shippingAddress');
linkage.hide('pickupAddress');
break;
};
// 自提
case 2: {
linkage.hide('shippingAddress');
linkage.show('pickupAddress');
break;
};
// 无需物流
case 3: {
linkage.hide('*(shippingAddress,pickupAddress)');
break;
};
default:
break
};
});
// 校验换货数量
onFieldInputChange$('replaceGoodsList.*.replaceCount').subscribe(fieldState => {
const { name, value } = fieldState;
// 已换货数量
const replacedCountValue = getFieldState(
FormPath.transform(name, /\d/, $1 => {
return `replaceGoodsList.${$1}.extraData`
}),
state => state.value.replacedCount,
);
setFieldState(
FormPath.transform(name, /\d/, $1 => {
return `replaceGoodsList.${$1}.replaceCount`
}),
state => {
if (+value > replacedCountValue) {
state.errors = '填写值已超过最大可换货数量,请重新填写';
} else {
state.errors = '';
}
}
);
});
/*
* @Author: XieZhiXiong
* @Date: 2020-11-03 18:30:47
* @LastEditors: XieZhiXiong
* @LastEditTime: 2020-12-24 10:36:02
* @Description: 联动逻辑相关
*/
import { Modal } from 'antd';
import { FormEffectHooks, FormPath } from '@formily/antd';
import { useLinkageUtils } from '@/utils/formEffectUtils';
const {
onFieldInputChange$,
onFieldValueChange$,
} = FormEffectHooks;
export const useBusinessEffects = (context, actions) => {
const {
getFieldValue,
setFieldValue,
getFieldState,
setFieldState,
} = actions;
const linkage = useLinkageUtils();
// 联动配送方式
onFieldValueChange$('deliveryType').subscribe(fieldState => {
const { name, value } = fieldState;
switch (value) {
// 物流
case 1: {
linkage.show('shippingAddress');
linkage.hide('pickupAddress');
break;
};
// 自提
case 2: {
linkage.hide('shippingAddress');
linkage.show('pickupAddress');
break;
};
// 无需物流
case 3: {
linkage.hide('*(shippingAddress,pickupAddress)');
break;
};
default:
break
};
});
// 校验换货数量
onFieldInputChange$('replaceGoodsList.*.replaceCount').subscribe(fieldState => {
const { name, value } = fieldState;
// 已换货数量
const replacedCountValue = getFieldState(
FormPath.transform(name, /\d/, $1 => {
return `replaceGoodsList.${$1}.extraData`
}),
state => state.value.replacedCount,
);
setFieldState(
FormPath.transform(name, /\d/, $1 => {
return `replaceGoodsList.${$1}.replaceCount`
}),
state => {
if (+value > replacedCountValue) {
state.errors = '填写值已超过最大可换货数量,请重新填写';
} else {
state.errors = '';
}
}
);
});
// 供应会员联动 单据明细
onFieldInputChange$('supplierMember').subscribe(fieldState => {
const replaceGoodsListValue = getFieldValue('replaceGoodsList');
if (replaceGoodsListValue && replaceGoodsListValue.length) {
setFieldValue('replaceGoodsList', []);
}
});
}
\ No newline at end of file
import React, { useState, useEffect, useRef } from 'react';
import { Button, Card, Spin, Badge, message } from 'antd';
import { ColumnType } from 'antd/lib/table/interface';
import { DeleteOutlined } from '@ant-design/icons';
import { Radio, ArrayTable } from '@formily/antd-components';
import { history, Prompt } from 'umi';
import moment from 'moment';
import { PageHeaderWrapper } from '@ant-design/pro-layout';
import { SaveOutlined, PlusOutlined } from '@ant-design/icons';
import { createFormActions, FormEffectHooks } from '@formily/antd';
import { PublicApi } from '@/services/api';
import { GetAsReplaceGoodsPageReturnedGoodsResponse } from '@/services/AfterServiceApi';
import { normalizeFiledata, FileData, isJSONStr } from '@/utils';
import { PurchaseOrderInsideWorkStateTexts, ORDER_TYPE2 } from '@/constants';
import ReutrnEle from '@/components/ReturnEle';
import StatusTag from '@/components/StatusTag';
import NiceForm from '@/components/NiceForm';
import GoodsDrawer from '../../../../components/GoodsDrawer';
import { OrderListRes } from '../../../../components/GoodsDrawer/interface';
import AddressFormItem from '../../../../components/AddressFormItem';
import { addBillSchema } from './schema';
import { createEffects } from './effects';
import {
EXCHANGE_OUTER_STATUS_TAG_MAP,
EXCHANGE_INNER_STATUS_BADGE_MAP,
} from '../../../../constants';
const addSchemaAction = createFormActions();
const {
onFormInputChange$,
} = FormEffectHooks;
interface BillsFormProps {
id?: string;
// 是否是编辑的
isEdit?: boolean;
};
interface DetailInfo {
applyTime: string;
proofFileList?: FileData[];
deliveryAddress?: { [key: string]: any };
shippingAddress?: { [key: string]: any };
pickupAddress?: { [key: string]: any };
supplierMember?: {},
outerStatus?: number,
outerStatusName?: string,
innerStatus?: number,
innerStatusName?: string,
deliveryType?: number,
}
const ExchangeForm: React.FC<BillsFormProps> = ({
id,
isEdit = false,
}) => {
const [detailInfo, setDetailInfo] = useState<DetailInfo>({
applyTime: moment().format('YYYY-MM-DD HH:mm:ss'),
});
const [replaceGoodsList, setReplaceGoodsList] = useState<GetAsReplaceGoodsPageReturnedGoodsResponse>({ data: [], totalCount: 0 });
const [unsaved, setUnsaved] = useState(false);
const [infoLoading, setInfoLoading] = useState(false);
const [goodsValue, setGoodsValue] = useState([]);
const [submitLoading, setSubmitLoading] = useState(false);
const [visibleGoodsDrawer, setVisibleGoodsDrawer] = useState(false);
const tableColumn: ColumnType<any>[] = [
{
title: '订单号',
dataIndex: 'orderNo',
align: 'center',
},
{
title: '订单摘要',
dataIndex: 'orderThe',
align: 'center',
},
{
title: '供应会员',
dataIndex: 'supplyMembersName',
align: 'center',
},
{
title: '下单时间',
dataIndex: 'createTime',
align: 'center',
},
{
title: '订单状态',
dataIndex: 'externalState',
align: 'center',
render: text => PurchaseOrderInsideWorkStateTexts[text],
},
{
title: '订单类型',
dataIndex: 'type',
align: 'center',
render: text => ORDER_TYPE2[text],
},
];
const childTableColumn: ColumnType<any>[] = [
{
title: '商品ID',
dataIndex: 'productId',
align: 'center',
},
{
title: '商品名称',
dataIndex: 'productName',
align: 'center',
},
{
title: '品类',
dataIndex: 'category',
align: 'center',
},
{
title: '品牌',
dataIndex: 'brand',
align: 'center',
},
{
title: '单位',
dataIndex: 'unit',
align: 'center',
},
{
title: '订单数量',
dataIndex: 'purchaseCount',
align: 'center',
},
{
title: '单价',
dataIndex: 'price',
align: 'center',
},
{
title: '采购金额',
dataIndex: 'price',
align: 'center',
},
{
title: '已换货数量',
dataIndex: 'returnCount',
align: 'center',
},
];
// 根据供应会员获取订单列表
const getOrderList = (params): Promise<OrderListRes> => {
const supplierMemberValue = addSchemaAction.getFieldValue('supplierMember');
return new Promise((resolve, reject) => {
PublicApi.getOrderOneBatchOrderList({
...params,
supplyMembersId: supplierMemberValue[0].memberId,
supplyMembersRoleId: supplierMemberValue[0].roleId,
}).then(res => {
if (res.code === 1000) {
resolve(res.data);
}
reject();
}).catch(() => {
reject();
});
});
};
// 获取维修申请详情
const getDetailInfo = () => {
if (!id) {
return;
}
setInfoLoading(true);
PublicApi.getAsReplaceGoodsGetDetailByConsumer({
replaceId: id,
}).then(res => {
if (res.code === 1000) {
const {
returnGoodsAddress,
replaceGoodsAddress,
faultFileList,
supplierName,
parentMemberId,
parentMemberRoleId,
evaluate,
goodsDetailList,
innerTaskList,
manualReturnGoodsAddress,
replaceDeliveryGoodsList,
replaceStatisticsList,
taskType,
consumerName,
outerTaskList,
replaceBatch,
replaceId,
...rest
} = res.data;
addSchemaAction.setFieldState(
'*(supplierMember)',
state => {
state.props['x-component-props'].disabled = true;
}
);
setDetailInfo({
proofFileList: faultFileList.map(item => normalizeFiledata(item.filePath)),
deliveryAddress: {
fullAddress: replaceGoodsAddress.receiveAddress,
id: replaceGoodsAddress.receiveId,
phone: replaceGoodsAddress.receiveUserTel,
receiverName: replaceGoodsAddress.receiveUserName,
},
// 物流
shippingAddress: returnGoodsAddress.deliveryType === 1 ? {
fullAddress: returnGoodsAddress.sendAddress,
id: returnGoodsAddress.sendId,
phone: returnGoodsAddress.sendUserTel,
receiverName: returnGoodsAddress.sendUserName,
} : undefined,
// 自提
pickupAddress: returnGoodsAddress.deliveryType === 2 ? {
fullAddress: returnGoodsAddress.sendAddress,
id: returnGoodsAddress.sendId,
phone: returnGoodsAddress.sendUserTel,
receiverName: returnGoodsAddress.sendUserName,
} : undefined,
deliveryType: returnGoodsAddress.deliveryType,
supplierMember:
supplierName ?
[
{
name: supplierName,
memberId: parentMemberId,
roleId: parentMemberRoleId,
},
] :
[]
,
...rest,
});
setReplaceGoodsList({
data: goodsDetailList.map(item => ({
...item,
extraData: {
replacedCount: item.purchaseCount || 0, // 已换货数量,这里取 采购数量判断即可
id: item.orderRecordId,
taskType,
},
})),
totalCount: goodsDetailList.length,
});
setGoodsValue(goodsDetailList.map(item => item.orderRecordId));
}
}).finally(() => {
setInfoLoading(false);
});
};
useEffect(() => {
getDetailInfo();
}, []);
const handleAddGoods = () => {
const supplierMemberValue = addSchemaAction.getFieldValue('supplierMember');
if (!supplierMemberValue || !supplierMemberValue.length) {
message.error('请先选择供应会员');
return;
}
setVisibleGoodsDrawer(true);
};
const TableAddButton = isEdit || !id ? (
<Button
style={{ marginBottom: 16 }}
block
icon={<PlusOutlined />}
onClick={handleAddGoods}
type="dashed"
>
选择换货商品
</Button>
) : null;
const handleSubmit = value => {
const {
supplierMember,
deliveryType,
shippingAddress = {},
pickupAddress = {},
deliveryAddress = {},
proofFileList = [],
replaceGoodsList = [],
outerStatus,
outerStatusName,
innerStatus,
innerStatusName,
applyNo,
applyTime,
...rest
} = value;
setSubmitLoading(true);
const payload = {
...rest,
replaceId: id || 0,
supplierMemberId: supplierMember[0].memberId,
supplierRoleId: supplierMember[0].roleId,
supplierMemberName: supplierMember[0].name,
replaceGoodsAddress: {
receiveAddress: deliveryAddress.fullAddress || '',
receiveUserName: deliveryAddress.receiverName || '',
receiveUserTel: deliveryAddress.phone || '',
receiveId: deliveryAddress.id || '',
},
// 配送方式为 1 = 物流 选择 发货地址
returnGoodsAddress: {
deliveryType,
sendAddress:
deliveryType === 1 ?
shippingAddress.fullAddress :
deliveryType === 2 ?
pickupAddress.fullAddress :
''
,
sendUserName:
deliveryType === 1 ?
shippingAddress.shipperName :
deliveryType === 2 ?
pickupAddress.shipperName :
''
,
sendUserTel:
deliveryType === 1 ?
shippingAddress.phone :
deliveryType === 2 ?
pickupAddress.phone :
''
,
sendId:
deliveryType === 1 ?
shippingAddress.id :
deliveryType === 2 ?
pickupAddress.id :
''
,
},
proofFileList: proofFileList.filter(item => item.status === 'done').map(item => ({
fileName: item.name,
filePath: item.data.url,
})),
replaceGoodsList: replaceGoodsList.map(({
replaceCount,
brand,
unit,
extraData,
...rest
}) => ({
orderRecordId: extraData.id,
replaceCount: +replaceCount,
brand: brand || '',
unit: unit || '',
...rest,
})),
taskType: replaceGoodsList[0].extraData.taskType,
};
PublicApi.postAsReplaceGoodsSave(payload)
.then(res => {
if (res.code === 1000) {
setUnsaved(false);
setTimeout(() => {
history.goBack();
}, 800);
}
})
.finally(() => {
setSubmitLoading(false);
});
};
const handleRemoveItem = (index: number) => {
const newGoodsValue = [...goodsValue];
const newValue = [...addSchemaAction.getFieldValue('replaceGoodsList')];
const deleted = newValue.splice(index, 1);
addSchemaAction.setFieldValue('replaceGoodsList', newValue);
newGoodsValue.splice(newGoodsValue.findIndex(item => item === deleted[0].id), 1);
setGoodsValue(newGoodsValue);
};
// ArrayTable自定义渲染
const renderListTableRemove = (index: number) => (
<>
<a
onClick={() => handleRemoveItem(index)}
style={{
color: '#ff4d4f',
}}
>
删除
</a>
</>
);
const beforeUpload = file => {
if (file.size / 1024 / 1024 > 20) {
message.warning('图片大小超过20M');
return Promise.reject();
}
};
const handleGoodsConfirm = values => {
const preValues = addSchemaAction.getFieldValue('replaceGoodsList');
const value = [];
values.forEach(item => {
const existing = preValues.find(val => val.id === item.id);
const atom =
existing ?
existing :
{
orderNo: item.orderNo,
productId: item.productId,
productName: item.productName,
category: item.category,
brand: item.brand,
unit: item.unit,
purchasePrice: item.price,
purchaseCount: item.purchaseCount,
purchaseAmount: +(item.price * item.purchaseCount).toFixed(2),
replaceReason: '',
extraData: {
replacedCount: item.replaceCount || item.purchaseCount || 0, // 已换货数量
id: item.id,
taskType: item.processEnum,
},
};
value.push(atom);
});
addSchemaAction.setFieldValue('replaceGoodsList', value);
};
const handleGoodsChange = values => {
setGoodsValue(values);
};
const OuterStatus = (
<StatusTag type={EXCHANGE_OUTER_STATUS_TAG_MAP[detailInfo?.outerStatus]} title={detailInfo?.outerStatusName} />
);
const InnerStatus = (
<Badge color={EXCHANGE_INNER_STATUS_BADGE_MAP[detailInfo?.innerStatus]} text={detailInfo?.innerStatusName} />
);
return (
<Spin spinning={infoLoading}>
<PageHeaderWrapper
style={{
padding: 24,
}}
onBack={() => history.goBack()}
backIcon={<ReutrnEle description="返回" />}
title={
!id ?
'新建换货申请单' :
isEdit ?
'编辑换货申请单' :
'查看换货申请单'
}
extra={
(isEdit || !id)
? [
<Button
key="1"
type="primary"
icon={<SaveOutlined />}
loading={submitLoading}
onClick={() => addSchemaAction.submit()}
>
保存
</Button>,
]
: []
}
>
<Card>
<NiceForm
initialValues={{
...detailInfo,
replaceGoodsList: replaceGoodsList.data,
}}
expressionScope={{
TableAddButton,
OuterStatus,
InnerStatus,
renderListTableRemove,
beforeUpload,
}}
components={{
ArrayTable,
AddressFormItem,
}}
editable={isEdit || !id}
effects={($, actions) => {
createEffects($, actions)
onFormInputChange$().subscribe(() => {
if (!unsaved) {
setUnsaved(true);
}
});
}}
onSubmit={handleSubmit}
actions={addSchemaAction}
schema={addBillSchema}
/>
</Card>
<GoodsDrawer
title="选择换货商品"
type={2}
visible={visibleGoodsDrawer}
fetchOrderList={getOrderList}
onClose={() => setVisibleGoodsDrawer(false)}
onConfirm={handleGoodsConfirm}
checked={goodsValue}
onChange={handleGoodsChange}
nestProps={{
NestColumns: [tableColumn, childTableColumn],
}}
/>
<Prompt when={unsaved} message="您还有未保存的内容,是否确定要离开?" />
</PageHeaderWrapper>
</Spin>
);
};
export default ExchangeForm;
import React, { useState, useEffect, useRef } from 'react';
import { Button, Card, Spin, Badge, message } from 'antd';
import { ColumnType } from 'antd/lib/table/interface';
import { DeleteOutlined } from '@ant-design/icons';
import { Radio, ArrayTable } from '@formily/antd-components';
import { history, Prompt } from 'umi';
import moment from 'moment';
import { PageHeaderWrapper } from '@ant-design/pro-layout';
import { SaveOutlined, PlusOutlined } from '@ant-design/icons';
import { createFormActions, FormEffectHooks } from '@formily/antd';
import { PublicApi } from '@/services/api';
import { GetAsReplaceGoodsPageReturnedGoodsResponse } from '@/services/AfterServiceApi';
import { normalizeFiledata, FileData, isJSONStr } from '@/utils';
import { PurchaseOrderInsideWorkStateTexts, ORDER_TYPE2 } from '@/constants';
import ReutrnEle from '@/components/ReturnEle';
import StatusTag from '@/components/StatusTag';
import NiceForm from '@/components/NiceForm';
import GoodsDrawer from '../../../../components/GoodsDrawer';
import { OrderListRes } from '../../../../components/GoodsDrawer/interface';
import AddressFormItem from '../../../../components/AddressFormItem';
import { addBillSchema } from './schema';
import { createEffects } from './effects';
import {
EXCHANGE_OUTER_STATUS_TAG_MAP,
EXCHANGE_INNER_STATUS_BADGE_MAP,
} from '../../../../constants';
const addSchemaAction = createFormActions();
const {
onFormInputChange$,
} = FormEffectHooks;
interface BillsFormProps {
id?: string;
// 是否是编辑的
isEdit?: boolean;
};
interface DetailInfo {
applyTime: string;
proofFileList?: FileData[];
deliveryAddress?: { [key: string]: any };
shippingAddress?: { [key: string]: any };
pickupAddress?: { [key: string]: any };
supplierMember?: {},
outerStatus?: number,
outerStatusName?: string,
innerStatus?: number,
innerStatusName?: string,
deliveryType?: number,
}
const ExchangeForm: React.FC<BillsFormProps> = ({
id,
isEdit = false,
}) => {
const [detailInfo, setDetailInfo] = useState<DetailInfo>({
applyTime: moment().format('YYYY-MM-DD HH:mm:ss'),
});
const [replaceGoodsList, setReplaceGoodsList] = useState<GetAsReplaceGoodsPageReturnedGoodsResponse>({ data: [], totalCount: 0 });
const [unsaved, setUnsaved] = useState(false);
const [infoLoading, setInfoLoading] = useState(false);
const [goodsValue, setGoodsValue] = useState([]);
const [submitLoading, setSubmitLoading] = useState(false);
const [visibleGoodsDrawer, setVisibleGoodsDrawer] = useState(false);
const tableColumn: ColumnType<any>[] = [
{
title: '订单号',
dataIndex: 'orderNo',
align: 'center',
},
{
title: '订单摘要',
dataIndex: 'orderThe',
align: 'center',
},
{
title: '供应会员',
dataIndex: 'supplyMembersName',
align: 'center',
},
{
title: '下单时间',
dataIndex: 'createTime',
align: 'center',
},
{
title: '订单状态',
dataIndex: 'externalState',
align: 'center',
render: text => PurchaseOrderInsideWorkStateTexts[text],
},
{
title: '订单类型',
dataIndex: 'type',
align: 'center',
render: text => ORDER_TYPE2[text],
},
];
const childTableColumn: ColumnType<any>[] = [
{
title: '商品ID',
dataIndex: 'productId',
align: 'center',
},
{
title: '商品名称',
dataIndex: 'productName',
align: 'center',
},
{
title: '品类',
dataIndex: 'category',
align: 'center',
},
{
title: '品牌',
dataIndex: 'brand',
align: 'center',
},
{
title: '单位',
dataIndex: 'unit',
align: 'center',
},
{
title: '订单数量',
dataIndex: 'purchaseCount',
align: 'center',
},
{
title: '单价',
dataIndex: 'price',
align: 'center',
},
{
title: '采购金额',
dataIndex: 'amount',
align: 'center',
render: (_, record) => (record.purchaseCount * record.price).toFixed(2),
},
{
title: '已换货数量',
dataIndex: 'returnCount',
align: 'center',
},
];
// 根据供应会员获取订单列表
const getOrderList = (params): Promise<OrderListRes> => {
const supplierMemberValue = addSchemaAction.getFieldValue('supplierMember');
return new Promise((resolve, reject) => {
PublicApi.getOrderOneBatchOrderList({
...params,
supplyMembersId: supplierMemberValue[0].memberId,
supplyMembersRoleId: supplierMemberValue[0].roleId,
}).then(res => {
if (res.code === 1000) {
resolve(res.data);
}
reject();
}).catch(() => {
reject();
});
});
};
// 获取维修申请详情
const getDetailInfo = () => {
if (!id) {
return;
}
setInfoLoading(true);
PublicApi.getAsReplaceGoodsGetDetailByConsumer({
replaceId: id,
}).then(res => {
if (res.code === 1000) {
const {
returnGoodsAddress,
replaceGoodsAddress,
faultFileList,
supplierName,
parentMemberId,
parentMemberRoleId,
evaluate,
goodsDetailList,
innerTaskList,
manualReturnGoodsAddress,
replaceDeliveryGoodsList,
replaceStatisticsList,
taskType,
consumerName,
outerTaskList,
replaceBatch,
replaceId,
...rest
} = res.data;
addSchemaAction.setFieldState(
'*(supplierMember)',
state => {
state.props['x-component-props'].disabled = true;
}
);
setDetailInfo({
proofFileList: faultFileList.map(item => normalizeFiledata(item.filePath)),
deliveryAddress: {
fullAddress: replaceGoodsAddress.receiveAddress,
id: replaceGoodsAddress.receiveId,
phone: replaceGoodsAddress.receiveUserTel,
receiverName: replaceGoodsAddress.receiveUserName,
},
// 物流
shippingAddress: returnGoodsAddress.deliveryType === 1 ? {
fullAddress: returnGoodsAddress.sendAddress,
id: returnGoodsAddress.sendId,
phone: returnGoodsAddress.sendUserTel,
receiverName: returnGoodsAddress.sendUserName,
} : undefined,
// 自提
pickupAddress: returnGoodsAddress.deliveryType === 2 ? {
fullAddress: returnGoodsAddress.sendAddress,
id: returnGoodsAddress.sendId,
phone: returnGoodsAddress.sendUserTel,
receiverName: returnGoodsAddress.sendUserName,
} : undefined,
deliveryType: returnGoodsAddress.deliveryType,
supplierMember:
supplierName ?
[
{
name: supplierName,
memberId: parentMemberId,
roleId: parentMemberRoleId,
},
] :
[]
,
...rest,
});
setReplaceGoodsList({
data: goodsDetailList.map(item => ({
...item,
extraData: {
replacedCount: item.purchaseCount || 0, // 已换货数量,这里取 采购数量判断即可
id: item.orderRecordId,
taskType,
},
})),
totalCount: goodsDetailList.length,
});
setGoodsValue(goodsDetailList.map(item => item.orderRecordId));
}
}).finally(() => {
setInfoLoading(false);
});
};
useEffect(() => {
getDetailInfo();
}, []);
const handleAddGoods = () => {
const supplierMemberValue = addSchemaAction.getFieldValue('supplierMember');
if (!supplierMemberValue || !supplierMemberValue.length) {
message.error('请先选择供应会员');
return;
}
setVisibleGoodsDrawer(true);
};
const TableAddButton = isEdit || !id ? (
<Button
style={{ marginBottom: 16 }}
block
icon={<PlusOutlined />}
onClick={handleAddGoods}
type="dashed"
>
选择换货商品
</Button>
) : null;
const handleSubmit = value => {
const {
supplierMember,
deliveryType,
shippingAddress = {},
pickupAddress = {},
deliveryAddress = {},
proofFileList = [],
replaceGoodsList = [],
outerStatus,
outerStatusName,
innerStatus,
innerStatusName,
applyNo,
applyTime,
...rest
} = value;
setSubmitLoading(true);
const payload = {
...rest,
replaceId: id || 0,
supplierMemberId: supplierMember[0].memberId,
supplierRoleId: supplierMember[0].roleId,
supplierMemberName: supplierMember[0].name,
replaceGoodsAddress: {
receiveAddress: deliveryAddress.fullAddress || '',
receiveUserName: deliveryAddress.receiverName || '',
receiveUserTel: deliveryAddress.phone || '',
receiveId: deliveryAddress.id || '',
},
// 配送方式为 1 = 物流 选择 发货地址
returnGoodsAddress: {
deliveryType,
sendAddress:
deliveryType === 1 ?
shippingAddress.fullAddress :
deliveryType === 2 ?
pickupAddress.fullAddress :
''
,
sendUserName:
deliveryType === 1 ?
shippingAddress.shipperName :
deliveryType === 2 ?
pickupAddress.shipperName :
''
,
sendUserTel:
deliveryType === 1 ?
shippingAddress.phone :
deliveryType === 2 ?
pickupAddress.phone :
''
,
sendId:
deliveryType === 1 ?
shippingAddress.id :
deliveryType === 2 ?
pickupAddress.id :
''
,
},
proofFileList: proofFileList.filter(item => item.status === 'done').map(item => ({
fileName: item.name,
filePath: item.data.url,
})),
replaceGoodsList: replaceGoodsList.map(({
replaceCount,
brand,
unit,
extraData,
...rest
}) => ({
orderRecordId: extraData.id,
replaceCount: +replaceCount,
brand: brand || '',
unit: unit || '',
...rest,
})),
taskType: replaceGoodsList[0].extraData.taskType,
};
PublicApi.postAsReplaceGoodsSave(payload)
.then(res => {
if (res.code === 1000) {
setUnsaved(false);
setTimeout(() => {
history.goBack();
}, 800);
}
})
.finally(() => {
setSubmitLoading(false);
});
};
const handleRemoveItem = (index: number) => {
const newGoodsValue = [...goodsValue];
const newValue = [...addSchemaAction.getFieldValue('replaceGoodsList')];
const deleted = newValue.splice(index, 1);
addSchemaAction.setFieldValue('replaceGoodsList', newValue);
newGoodsValue.splice(newGoodsValue.findIndex(item => item === deleted[0].id), 1);
setGoodsValue(newGoodsValue);
};
// ArrayTable自定义渲染
const renderListTableRemove = (index: number) => (
<>
<a
onClick={() => handleRemoveItem(index)}
style={{
color: '#ff4d4f',
}}
>
删除
</a>
</>
);
const beforeUpload = file => {
if (file.size / 1024 / 1024 > 20) {
message.warning('图片大小超过20M');
return Promise.reject();
}
};
const handleGoodsConfirm = values => {
const preValues = addSchemaAction.getFieldValue('replaceGoodsList');
const value = [];
values.forEach(item => {
const existing = preValues.find(val => val.id === item.id);
const atom =
existing ?
existing :
{
orderNo: item.orderNo,
productId: item.productId,
productName: item.productName,
category: item.category,
brand: item.brand,
unit: item.unit,
purchasePrice: item.price,
purchaseCount: item.purchaseCount,
purchaseAmount: +(item.price * item.purchaseCount).toFixed(2),
replaceReason: '',
extraData: {
replacedCount: item.replaceCount || item.purchaseCount || 0, // 已换货数量
id: item.id,
taskType: item.processEnum,
},
};
value.push(atom);
});
addSchemaAction.setFieldValue('replaceGoodsList', value);
};
const handleGoodsChange = values => {
setGoodsValue(values);
};
const OuterStatus = (
<StatusTag type={EXCHANGE_OUTER_STATUS_TAG_MAP[detailInfo?.outerStatus]} title={detailInfo?.outerStatusName} />
);
const InnerStatus = (
<Badge color={EXCHANGE_INNER_STATUS_BADGE_MAP[detailInfo?.innerStatus]} text={detailInfo?.innerStatusName} />
);
return (
<Spin spinning={infoLoading}>
<PageHeaderWrapper
style={{
padding: 24,
}}
onBack={() => history.goBack()}
backIcon={<ReutrnEle description="返回" />}
title={
!id ?
'新建换货申请单' :
isEdit ?
'编辑换货申请单' :
'查看换货申请单'
}
extra={
(isEdit || !id)
? [
<Button
key="1"
type="primary"
icon={<SaveOutlined />}
loading={submitLoading}
onClick={() => addSchemaAction.submit()}
>
保存
</Button>,
]
: []
}
>
<Card>
<NiceForm
value={{
...detailInfo,
replaceGoodsList: replaceGoodsList.data,
}}
expressionScope={{
TableAddButton,
OuterStatus,
InnerStatus,
renderListTableRemove,
beforeUpload,
}}
components={{
ArrayTable,
AddressFormItem,
}}
editable={isEdit || !id}
effects={($, actions) => {
createEffects($, actions)
onFormInputChange$().subscribe(() => {
if (!unsaved) {
setUnsaved(true);
}
});
}}
onSubmit={handleSubmit}
actions={addSchemaAction}
schema={addBillSchema}
/>
</Card>
<GoodsDrawer
title="选择换货商品"
type={2}
visible={visibleGoodsDrawer}
fetchOrderList={getOrderList}
onClose={() => setVisibleGoodsDrawer(false)}
onConfirm={handleGoodsConfirm}
checked={goodsValue}
onChange={handleGoodsChange}
nestProps={{
NestColumns: [tableColumn, childTableColumn],
}}
/>
<Prompt when={unsaved} message="您还有未保存的内容,是否确定要离开?" />
</PageHeaderWrapper>
</Spin>
);
};
export default ExchangeForm;
/*
* @Author: XieZhiXiong
* @Date: 2020-11-03 18:30:47
* @LastEditors: XieZhiXiong
* @LastEditTime: 2020-11-17 10:32:48
* @Description: 联动逻辑相关
*/
import { Modal } from 'antd';
import { FormEffectHooks, FormPath } from '@formily/antd';
import { useLinkageUtils } from '@/utils/formEffectUtils';
import {
} from '@/constants';
import { PublicApi } from '@/services/api';
const {
onFieldInputChange$,
onFieldValueChange$,
} = FormEffectHooks;
export const useBusinessEffects = (context, actions) => {
const {
getFieldValue,
setFieldValue,
getFieldState,
setFieldState,
} = actions;
// const linkage = useLinkageUtils();
// 校验维修数量
onFieldInputChange$('repairGoodsList.*.repairCount').subscribe(fieldState => {
const { name, value } = fieldState;
// 已维修数量
const repairedCountValue = getFieldState(
FormPath.transform(name, /\d/, $1 => {
return `repairGoodsList.${$1}.extraData`
}),
state => state.value.repairedCount,
);
setFieldState(
FormPath.transform(name, /\d/, $1 => {
return `repairGoodsList.${$1}.repairCount`
}),
state => {
if (+value > repairedCountValue) {
state.errors = '填写值已超过最大可维修数量,请重新填写';
} else {
state.errors = '';
}
}
);
});
/*
* @Author: XieZhiXiong
* @Date: 2020-11-03 18:30:47
* @LastEditors: XieZhiXiong
* @LastEditTime: 2020-11-17 10:32:48
* @Description: 联动逻辑相关
*/
import { Modal } from 'antd';
import { FormEffectHooks, FormPath } from '@formily/antd';
import { useLinkageUtils } from '@/utils/formEffectUtils';
import {
} from '@/constants';
import { PublicApi } from '@/services/api';
const {
onFieldInputChange$,
onFieldValueChange$,
} = FormEffectHooks;
export const useBusinessEffects = (context, actions) => {
const {
getFieldValue,
setFieldValue,
getFieldState,
setFieldState,
} = actions;
// const linkage = useLinkageUtils();
// 校验维修数量
onFieldInputChange$('repairGoodsList.*.repairCount').subscribe(fieldState => {
const { name, value } = fieldState;
// 已维修数量
const repairedCountValue = getFieldState(
FormPath.transform(name, /\d/, $1 => {
return `repairGoodsList.${$1}.extraData`
}),
state => state.value.repairedCount,
);
setFieldState(
FormPath.transform(name, /\d/, $1 => {
return `repairGoodsList.${$1}.repairCount`
}),
state => {
if (+value > repairedCountValue) {
state.errors = '填写值已超过最大可维修数量,请重新填写';
} else {
state.errors = '';
}
}
);
});
// 供应会员联动 单据明细
onFieldInputChange$('supplierMember').subscribe(fieldState => {
const replaceGoodsListValue = getFieldValue('repairGoodsList');
if (replaceGoodsListValue && replaceGoodsListValue.length) {
setFieldValue('repairGoodsList', []);
}
});
}
\ No newline at end of file
import React, { useState, useEffect, useRef } from 'react';
import { Button, Card, Spin, Badge, message } from 'antd';
import { DeleteOutlined } from '@ant-design/icons';
import { Radio, ArrayTable } from '@formily/antd-components';
import { history, Prompt } from 'umi';
import moment from 'moment';
import { PageHeaderWrapper } from '@ant-design/pro-layout';
import { SaveOutlined, PlusOutlined } from '@ant-design/icons';
import { createFormActions, FormEffectHooks } from '@formily/antd';
import { PublicApi } from '@/services/api';
import { GetAsRepairGoodsPageRepairGoodsResponse } from '@/services/AfterServiceApi';
import { normalizeFiledata, FileData, isJSONStr } from '@/utils';
import ReutrnEle from '@/components/ReturnEle';
import NiceForm from '@/components/NiceForm';
import StatusTag from '@/components/StatusTag';
import GoodsDrawer from '../../../../components/GoodsDrawer';
import { OrderListRes } from '../../../../components/GoodsDrawer/interface';
import AddressFormItem from '../../../../components/AddressFormItem';
import { addBillSchema } from './schema';
import { createEffects } from './effects';
import {
REPAIR_OUTER_STATUS_TAG_MAP,
REPAIR_INNER_STATUS_BADGE_MAP,
} from '../../../../constants';
const addSchemaAction = createFormActions();
const {
onFormInputChange$,
} = FormEffectHooks;
interface DetailInfo {
applyTime: string;
faultFileList?: FileData[];
repairAddress?: { [key: string]: any }[];
supplierMember?: {},
outerStatus?: number,
outerStatusName?: string,
innerStatus?: number,
innerStatusName?: string,
}
interface BillsFormProps {
id?: string;
// 是否是编辑的
isEdit?: boolean;
};
const RepairForm: React.FC<BillsFormProps> = ({
id,
isEdit = false,
}) => {
const [detailInfo, setDetailInfo] = useState<DetailInfo>({
applyTime: moment().format('YYYY-MM-DD HH:mm:ss'),
});
const [repairGoodsList, setRepairGoodsList] = useState<GetAsRepairGoodsPageRepairGoodsResponse>({ data: [], totalCount: 0 });
const [unsaved, setUnsaved] = useState(false);
const [infoLoading, setInfoLoading] = useState(false);
const [repairGoodsLoading, setRepairGoodsLoading] = useState(false);
const [goodsValue, setGoodsValue] = useState([]);
const [submitLoading, setSubmitLoading] = useState(false);
const [visibleDrawer, setVisibleDrawer] = useState(false);
// 获取维修申请详情
const getDetailInfo = () => {
if (!id) {
return;
}
setInfoLoading(true);
PublicApi.getAsRepairGoodsGetDetailByConsumer({
repairId: id,
}).then(res => {
if (res.code === 1000) {
const {
repairAddress,
faultFileList,
supplierName,
parentMemberId,
parentMemberRoleId,
...rest
} = res.data;
addSchemaAction.setFieldState(
'*(supplierMember)',
state => {
state.props['x-component-props'].disabled = true;
}
);
setDetailInfo({
...detailInfo,
faultFileList: faultFileList.map(item => normalizeFiledata(item.filePath)),
repairAddress: isJSONStr(repairAddress) || null,
supplierMember:
supplierName ?
[
{
name: supplierName,
memberId: parentMemberId,
roleId: parentMemberRoleId,
},
] :
[]
,
...rest,
});
}
}).finally(() => {
setInfoLoading(false);
});
};
// 获取维修明细列表
const getRepairGoods = () => {
if (!id) {
return;
}
setRepairGoodsLoading(true);
PublicApi.getAsRepairGoodsPageRepairGoods({
repairId: id,
current: `${1}`,
pageSize: `${99999}`,
}).then(res => {
if (res.code === 1000) {
setRepairGoodsList(res.data);
setRepairGoodsList({
data: res.data.data.map(item => ({
...item,
extraData: {
id: item.orderRecordId,
orderId: item.orderId,
repairedCount: item.purchaseCount || 0, // 已维修数量,这里取 采购数量判断即可
},
})),
totalCount: res.data.totalCount,
});
setGoodsValue(res.data && res.data.data ? res.data.data.map(item => item.orderRecordId) : []);
}
}).finally(() => {
setRepairGoodsLoading(false);
});
};
// 根据供应会员获取订单列表
const getOrderList = (params): Promise<OrderListRes> => {
const supplierMemberValue = addSchemaAction.getFieldValue('supplierMember');
return new Promise((resolve, reject) => {
PublicApi.getOrderOneBatchOrderList({
...params,
supplyMembersId: supplierMemberValue[0].memberId,
supplyMembersRoleId: supplierMemberValue[0].roleId,
}).then(res => {
if (res.code === 1000) {
resolve(res.data);
}
reject();
}).catch(() => {
reject();
});
});
};
useEffect(() => {
getDetailInfo();
getRepairGoods();
}, []);
const handleAddGoods = () => {
const supplierMemberValue = addSchemaAction.getFieldValue('supplierMember');
if (!supplierMemberValue || !supplierMemberValue.length) {
message.error('请先选择供应会员');
return;
}
setVisibleDrawer(true);
};
const TableAddButton = isEdit || !id ? (
<Button
style={{ marginBottom: 16 }}
block
icon={<PlusOutlined />}
onClick={handleAddGoods}
type="dashed"
>
选择维修商品
</Button>
) : null;
const handleSubmit = values => {
const {
supplierMember,
faultFileList = [],
repairGoodsList,
repairAddress,
...rest
} = values;
setSubmitLoading(true);
const payload = {
repairId: id || 0, // 有 id 表示编辑,0表示新增
supplierMemberId: supplierMember[0].memberId,
supplierRoleId: supplierMember[0].roleId,
supplierName: supplierMember[0].name,
repairAddress: repairAddress ? JSON.stringify(repairAddress) : '',
faultFileList: faultFileList.filter(item => item.status === 'done').map(item => ({
fileName: item.name,
filePath: item.data.url,
})),
repairGoodsList: repairGoodsList.map(({
repairCount,
brand,
unit,
extraData,
...rest
}) => ({
orderId: extraData.orderId,
orderRecordId: extraData.id,
repairCount: +repairCount,
brand: brand || '',
unit: unit || '',
...rest,
})),
...rest,
};
PublicApi.postAsRepairGoodsSave(payload)
.then(res => {
if (res.code === 1000) {
setUnsaved(false);
setTimeout(() => {
history.goBack();
}, 800);
}
})
.finally(() => {
setSubmitLoading(false);
});
};
// 删除维修商品项
const handleRemoveItem = (index: number) => {
const newGoodsValue = [...goodsValue];
const newValue = [...addSchemaAction.getFieldValue('repairGoodsList')];
const deleted = newValue.splice(index, 1);
addSchemaAction.setFieldValue('repairGoodsList', newValue);
newGoodsValue.splice(newGoodsValue.findIndex(item => item === deleted[0].id), 1);
setGoodsValue(newGoodsValue);
};
// ArrayTable自定义渲染
const renderListTableRemove = (index: number) => (
<Button
shape="circle"
icon={<DeleteOutlined />}
onClick={() => handleRemoveItem(index)}
/>
);
const beforeUpload = file => {
if (file.size / 1024 / 1024 > 20) {
message.warning('图片大小超过20M');
return Promise.reject();
}
};
const handleGoodsConfirm = values => {
const preValues = addSchemaAction.getFieldValue('repairGoodsList');
const value = [];
values.forEach(item => {
const existing = preValues.find(val => val.id === item.id);
const atom =
existing ?
existing :
{
orderNo: item.orderNo,
productId: item.productId,
productName: item.productName,
category: item.category,
brand: item.brand,
unit: item.unit,
purchaseCount: item.purchaseCount,
repairReason: '',
extraData: {
id: item.id,
orderId: item.orderId,
repairedCount: item.repairCount || item.purchaseCount || 0, // 已维修数量
},
};
value.push(atom);
});
addSchemaAction.setFieldValue('repairGoodsList', value);
};
const handleGoodsChange = values => {
setGoodsValue(values);
};
const OuterStatus = (
<StatusTag type={REPAIR_OUTER_STATUS_TAG_MAP[detailInfo?.outerStatus]} title={detailInfo?.outerStatusName} />
);
const InnerStatus = (
<Badge color={REPAIR_INNER_STATUS_BADGE_MAP[detailInfo?.innerStatus]} text={detailInfo?.innerStatusName} />
);
return (
<Spin spinning={infoLoading || repairGoodsLoading}>
<PageHeaderWrapper
style={{
padding: 24,
}}
onBack={() => history.goBack()}
backIcon={<ReutrnEle description="返回" />}
title={
!id ?
'新建维修申请单' :
isEdit ?
'编辑维修申请单' :
'查看维修申请单'
}
extra={
(isEdit || !id)
? [
<Button
key="1"
type="primary"
icon={<SaveOutlined />}
loading={submitLoading}
onClick={() => addSchemaAction.submit()}
>
保存
</Button>,
]
: []
}
>
<Card>
<NiceForm
initialValues={{
...detailInfo,
repairGoodsList: repairGoodsList.data,
}}
expressionScope={{
TableAddButton,
OuterStatus,
InnerStatus,
renderListTableRemove,
beforeUpload,
}}
components={{
ArrayTable,
AddressFormItem,
}}
editable={isEdit || !id}
effects={($, actions) => {
createEffects($, actions)
onFormInputChange$().subscribe(() => {
if (!unsaved) {
setUnsaved(true);
}
});
}}
onSubmit={handleSubmit}
actions={addSchemaAction}
schema={addBillSchema}
/>
</Card>
<GoodsDrawer
type={4}
visible={visibleDrawer}
fetchOrderList={getOrderList}
onClose={() => setVisibleDrawer(false)}
onConfirm={handleGoodsConfirm}
checked={goodsValue}
onChange={handleGoodsChange}
/>
<Prompt when={unsaved} message="您还有未保存的内容,是否确定要离开?" />
</PageHeaderWrapper>
</Spin>
);
};
export default RepairForm;
import React, { useState, useEffect, useRef } from 'react';
import { Button, Card, Spin, Badge, message } from 'antd';
import { DeleteOutlined } from '@ant-design/icons';
import { Radio, ArrayTable } from '@formily/antd-components';
import { history, Prompt } from 'umi';
import moment from 'moment';
import { PageHeaderWrapper } from '@ant-design/pro-layout';
import { SaveOutlined, PlusOutlined } from '@ant-design/icons';
import { createFormActions, FormEffectHooks } from '@formily/antd';
import { PublicApi } from '@/services/api';
import { GetAsRepairGoodsPageRepairGoodsResponse } from '@/services/AfterServiceApi';
import { normalizeFiledata, FileData, isJSONStr } from '@/utils';
import ReutrnEle from '@/components/ReturnEle';
import NiceForm from '@/components/NiceForm';
import StatusTag from '@/components/StatusTag';
import GoodsDrawer from '../../../../components/GoodsDrawer';
import { OrderListRes } from '../../../../components/GoodsDrawer/interface';
import AddressFormItem from '../../../../components/AddressFormItem';
import { addBillSchema } from './schema';
import { createEffects } from './effects';
import {
REPAIR_OUTER_STATUS_TAG_MAP,
REPAIR_INNER_STATUS_BADGE_MAP,
} from '../../../../constants';
const addSchemaAction = createFormActions();
const {
onFormInputChange$,
} = FormEffectHooks;
interface DetailInfo {
applyTime: string;
faultFileList?: FileData[];
repairAddress?: { [key: string]: any }[];
supplierMember?: {},
outerStatus?: number,
outerStatusName?: string,
innerStatus?: number,
innerStatusName?: string,
}
interface BillsFormProps {
id?: string;
// 是否是编辑的
isEdit?: boolean;
};
const RepairForm: React.FC<BillsFormProps> = ({
id,
isEdit = false,
}) => {
const [detailInfo, setDetailInfo] = useState<DetailInfo>({
applyTime: moment().format('YYYY-MM-DD HH:mm:ss'),
});
const [repairGoodsList, setRepairGoodsList] = useState<GetAsRepairGoodsPageRepairGoodsResponse>({ data: [], totalCount: 0 });
const [unsaved, setUnsaved] = useState(false);
const [infoLoading, setInfoLoading] = useState(false);
const [repairGoodsLoading, setRepairGoodsLoading] = useState(false);
const [goodsValue, setGoodsValue] = useState([]);
const [submitLoading, setSubmitLoading] = useState(false);
const [visibleDrawer, setVisibleDrawer] = useState(false);
// 获取维修申请详情
const getDetailInfo = () => {
if (!id) {
return;
}
setInfoLoading(true);
PublicApi.getAsRepairGoodsGetDetailByConsumer({
repairId: id,
}).then(res => {
if (res.code === 1000) {
const {
repairAddress,
faultFileList,
supplierName,
parentMemberId,
parentMemberRoleId,
...rest
} = res.data;
addSchemaAction.setFieldState(
'*(supplierMember)',
state => {
state.props['x-component-props'].disabled = true;
}
);
setDetailInfo({
...detailInfo,
faultFileList: faultFileList.map(item => normalizeFiledata(item.filePath)),
repairAddress: isJSONStr(repairAddress) || null,
supplierMember:
supplierName ?
[
{
name: supplierName,
memberId: parentMemberId,
roleId: parentMemberRoleId,
},
] :
[]
,
...rest,
});
}
}).finally(() => {
setInfoLoading(false);
});
};
// 获取维修明细列表
const getRepairGoods = () => {
if (!id) {
return;
}
setRepairGoodsLoading(true);
PublicApi.getAsRepairGoodsPageRepairGoods({
repairId: id,
current: `${1}`,
pageSize: `${99999}`,
}).then(res => {
if (res.code === 1000) {
setRepairGoodsList(res.data);
setRepairGoodsList({
data: res.data.data.map(item => ({
...item,
extraData: {
id: item.orderRecordId,
orderId: item.orderId,
repairedCount: item.purchaseCount || 0, // 已维修数量,这里取 采购数量判断即可
},
})),
totalCount: res.data.totalCount,
});
setGoodsValue(res.data && res.data.data ? res.data.data.map(item => item.orderRecordId) : []);
}
}).finally(() => {
setRepairGoodsLoading(false);
});
};
// 根据供应会员获取订单列表
const getOrderList = (params): Promise<OrderListRes> => {
const supplierMemberValue = addSchemaAction.getFieldValue('supplierMember');
return new Promise((resolve, reject) => {
PublicApi.getOrderOneBatchOrderList({
...params,
supplyMembersId: supplierMemberValue[0].memberId,
supplyMembersRoleId: supplierMemberValue[0].roleId,
}).then(res => {
if (res.code === 1000) {
resolve(res.data);
}
reject();
}).catch(() => {
reject();
});
});
};
useEffect(() => {
getDetailInfo();
getRepairGoods();
}, []);
const handleAddGoods = () => {
const supplierMemberValue = addSchemaAction.getFieldValue('supplierMember');
if (!supplierMemberValue || !supplierMemberValue.length) {
message.error('请先选择供应会员');
return;
}
setVisibleDrawer(true);
};
const TableAddButton = isEdit || !id ? (
<Button
style={{ marginBottom: 16 }}
block
icon={<PlusOutlined />}
onClick={handleAddGoods}
type="dashed"
>
选择维修商品
</Button>
) : null;
const handleSubmit = values => {
const {
supplierMember,
faultFileList = [],
repairGoodsList,
repairAddress,
...rest
} = values;
setSubmitLoading(true);
const payload = {
repairId: id || 0, // 有 id 表示编辑,0表示新增
supplierMemberId: supplierMember[0].memberId,
supplierRoleId: supplierMember[0].roleId,
supplierName: supplierMember[0].name,
repairAddress: repairAddress ? JSON.stringify(repairAddress) : '',
faultFileList: faultFileList.filter(item => item.status === 'done').map(item => ({
fileName: item.name,
filePath: item.data.url,
})),
repairGoodsList: repairGoodsList.map(({
repairCount,
brand,
unit,
extraData,
...rest
}) => ({
orderId: extraData.orderId,
orderRecordId: extraData.id,
repairCount: +repairCount,
brand: brand || '',
unit: unit || '',
...rest,
})),
...rest,
};
PublicApi.postAsRepairGoodsSave(payload)
.then(res => {
if (res.code === 1000) {
setUnsaved(false);
setTimeout(() => {
history.goBack();
}, 800);
}
})
.finally(() => {
setSubmitLoading(false);
});
};
// 删除维修商品项
const handleRemoveItem = (index: number) => {
const newGoodsValue = [...goodsValue];
const newValue = [...addSchemaAction.getFieldValue('repairGoodsList')];
const deleted = newValue.splice(index, 1);
addSchemaAction.setFieldValue('repairGoodsList', newValue);
newGoodsValue.splice(newGoodsValue.findIndex(item => item === deleted[0].id), 1);
setGoodsValue(newGoodsValue);
};
// ArrayTable自定义渲染
const renderListTableRemove = (index: number) => (
<Button
shape="circle"
icon={<DeleteOutlined />}
onClick={() => handleRemoveItem(index)}
/>
);
const beforeUpload = file => {
if (file.size / 1024 / 1024 > 20) {
message.warning('图片大小超过20M');
return Promise.reject();
}
};
const handleGoodsConfirm = values => {
const preValues = addSchemaAction.getFieldValue('repairGoodsList');
const value = [];
values.forEach(item => {
const existing = preValues.find(val => val.id === item.id);
const atom =
existing ?
existing :
{
orderNo: item.orderNo,
productId: item.productId,
productName: item.productName,
category: item.category,
brand: item.brand,
unit: item.unit,
purchaseCount: item.purchaseCount,
repairReason: '',
extraData: {
id: item.id,
orderId: item.orderId,
repairedCount: item.repairCount || item.purchaseCount || 0, // 已维修数量
},
};
value.push(atom);
});
addSchemaAction.setFieldValue('repairGoodsList', value);
};
const handleGoodsChange = values => {
setGoodsValue(values);
};
const OuterStatus = (
<StatusTag type={REPAIR_OUTER_STATUS_TAG_MAP[detailInfo?.outerStatus]} title={detailInfo?.outerStatusName} />
);
const InnerStatus = (
<Badge color={REPAIR_INNER_STATUS_BADGE_MAP[detailInfo?.innerStatus]} text={detailInfo?.innerStatusName} />
);
return (
<Spin spinning={infoLoading || repairGoodsLoading}>
<PageHeaderWrapper
style={{
padding: 24,
}}
onBack={() => history.goBack()}
backIcon={<ReutrnEle description="返回" />}
title={
!id ?
'新建维修申请单' :
isEdit ?
'编辑维修申请单' :
'查看维修申请单'
}
extra={
(isEdit || !id)
? [
<Button
key="1"
type="primary"
icon={<SaveOutlined />}
loading={submitLoading}
onClick={() => addSchemaAction.submit()}
>
保存
</Button>,
]
: []
}
>
<Card>
<NiceForm
value={{
...detailInfo,
repairGoodsList: repairGoodsList.data,
}}
expressionScope={{
TableAddButton,
OuterStatus,
InnerStatus,
renderListTableRemove,
beforeUpload,
}}
components={{
ArrayTable,
AddressFormItem,
}}
editable={isEdit || !id}
effects={($, actions) => {
createEffects($, actions)
onFormInputChange$().subscribe(() => {
if (!unsaved) {
setUnsaved(true);
}
});
}}
onSubmit={handleSubmit}
actions={addSchemaAction}
schema={addBillSchema}
/>
</Card>
<GoodsDrawer
type={4}
visible={visibleDrawer}
fetchOrderList={getOrderList}
onClose={() => setVisibleDrawer(false)}
onConfirm={handleGoodsConfirm}
checked={goodsValue}
onChange={handleGoodsChange}
/>
<Prompt when={unsaved} message="您还有未保存的内容,是否确定要离开?" />
</PageHeaderWrapper>
</Spin>
);
};
export default RepairForm;
/*
* @Author: XieZhiXiong
* @Date: 2020-11-03 18:30:47
* @LastEditors: XieZhiXiong
* @LastEditTime: 2020-12-09 16:18:45
* @Description: 联动逻辑相关
*/
import { FormEffectHooks, FormPath } from '@formily/antd';
import { useLinkageUtils } from '@/utils/formEffectUtils';
const {
onFieldInputChange$,
onFieldValueChange$,
} = FormEffectHooks;
export const useBusinessEffects = (context, actions) => {
const {
getFieldValue,
setFieldValue,
getFieldState,
setFieldState,
} = actions;
const linkage = useLinkageUtils();
// 联动配送方式
onFieldValueChange$('deliveryType').subscribe(fieldState => {
const { name, value } = fieldState;
switch (value) {
// 物流
case 1: {
linkage.show('shippingAddress');
linkage.hide('pickupAddress');
break;
};
// 自提
case 2: {
linkage.hide('shippingAddress');
linkage.show('pickupAddress');
break;
};
// 无需物流
case 3: {
linkage.hide('*(shippingAddress,pickupAddress)');
break;
};
default:
break
};
});
/*
* @Author: XieZhiXiong
* @Date: 2020-11-03 18:30:47
* @LastEditors: XieZhiXiong
* @LastEditTime: 2020-12-09 16:18:45
* @Description: 联动逻辑相关
*/
import { FormEffectHooks, FormPath } from '@formily/antd';
import { useLinkageUtils } from '@/utils/formEffectUtils';
const {
onFieldInputChange$,
onFieldValueChange$,
} = FormEffectHooks;
export const useBusinessEffects = (context, actions) => {
const {
getFieldValue,
setFieldValue,
getFieldState,
setFieldState,
} = actions;
const linkage = useLinkageUtils();
// 联动配送方式
onFieldValueChange$('deliveryType').subscribe(fieldState => {
const { name, value } = fieldState;
switch (value) {
// 物流
case 1: {
linkage.show('shippingAddress');
linkage.hide('pickupAddress');
break;
};
// 自提
case 2: {
linkage.hide('shippingAddress');
linkage.show('pickupAddress');
break;
};
// 无需物流
case 3: {
linkage.hide('*(shippingAddress,pickupAddress)');
break;
};
default:
break
};
});
// 供应会员联动 单据明细
onFieldInputChange$('supplierMember').subscribe(fieldState => {
const replaceGoodsListValue = getFieldValue('returnGoodsList');
if (replaceGoodsListValue && replaceGoodsListValue.length) {
setFieldValue('returnGoodsList', []);
}
});
}
\ No newline at end of file
......@@ -557,7 +557,7 @@ const ReturnForm: React.FC<BillsFormProps> = ({
>
<Card>
<NiceForm
initialValues={{
value={{
...detailInfo,
returnGoodsList: returnGoodsList.data,
}}
......
......@@ -110,7 +110,7 @@ const DetailInfo: React.FC<DetailInfoProps> = ({
});
PublicApi.postAsReturnGoodsSetNeedReturnGoods({
returnId: +id,
returnGoodsId: record.orderRecordId,
returnGoodsId: record.returnGoodsId,
isNeed: record.isNeedReturn === 1 ? 0 : 1,
}).then(res => {
if (res.code === 1000) {
......
......@@ -2,7 +2,7 @@
* @Author: XieZhiXiong
* @Date: 2020-11-05 14:25:41
* @LastEditors: XieZhiXiong
* @LastEditTime: 2020-12-08 17:32:59
* @LastEditTime: 2020-12-24 10:04:24
* @Description: 退货申请单查询
*/
import React, { useState, useRef } from 'react';
......@@ -99,7 +99,7 @@ const ReturnPrReturn: React.FC = () => {
type="link"
onClick={() => history.push(`/memberCenter/afterService/returnManage/returnPrReturn/verify?id=${record.returnId}`)}
>
提交审核
退款
</Button>
</>
),
......
......@@ -186,7 +186,7 @@ const BillsForm: React.FC<BillsFormProps> = ({
);
setBillInfo({
transactionTime: transactionTime ? moment(transactionTime).format('YYYY-MM-DD HH:mm:ss') : moment().format('YYYY-MM-DD HH:mm:ss'),
transactionTime: transactionTime ? moment(transactionTime).format('YYYY-MM-DD HH:mm:ss') : '',
orderNo:
relevanceInvoicesId ?
[
......@@ -1656,7 +1656,7 @@ const BillsForm: React.FC<BillsFormProps> = ({
>
<Card>
<NiceForm
initialValues={billInfo}
value={billInfo}
expressionScope={{
TableAddButton,
renderListTableRemove,
......
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