Commit 577cdad7 authored by GuanHua's avatar GuanHua
parents 0809c991 cef0eb1b
......@@ -251,6 +251,12 @@ const HandlingRoute = {
icon: 'smile',
component: '@/pages/handling/assign/processStock',
},
{
path: '/memberCenter/handling/confirm/pendingDelivered/detail',
name: 'pendingDeliveredDetail',
icon: 'smile',
component: '@/pages/handling/assign/detail',
},
// 确认生产通知单 -> 待确认回单生产通知单
{
path: '/memberCenter/handling/confirm/pendingReceipt',
......
......@@ -485,6 +485,7 @@ export default {
'menu.handling.confirm.processingInvoiceTobeAddDetail': '待新增加工发货单详情',
'menu.handling.confirm.pendingAddLogistics': '待新增物流单',
'menu.handling.confirm.pendingDelivered': '待发货生产通知单',
'menu.handling.confirm.pendingDeliveredDetail': '待发货生产通知到单详情',
'menu.handling.confirm.pendingReceipt': '待确认回单生产通知单',
'menu.handling.confirm.createProcessInvoice': '新建加工发货单',
'menu.handling.confirm.createLogisticsOrder': '新建物流单',
......
......@@ -15,17 +15,15 @@ const ExchangePrConfirmBackVerify: React.FC = () => {
return;
}
setSubmitLoading(true);
// PublicApi.postPayCreditHandleVerifyStepOne({
// applyId: id,
// isPass: values.agree,
// opinion: values.reason,
// }).then(res => {
// if (res.code === 1000) {
// history.goBack();
// }
// }).finally(() => {
// setSubmitLoading(false);
// });
PublicApi.postAsReplaceGoodsConfirmAllReplaceGoodsReceipt({
dataId: id,
}).then(res => {
if (res.code === 1000) {
history.goBack();
}
}).finally(() => {
setSubmitLoading(false);
});
};
return (
......
......@@ -17,17 +17,15 @@ const ExchangePrDeliverVerify: React.FC = () => {
return;
}
setSubmitLoading(true);
// PublicApi.postPayCreditHandleVerifyStepOne({
// applyId: id,
// isPass: values.agree,
// opinion: values.reason,
// }).then(res => {
// if (res.code === 1000) {
// history.goBack();
// }
// }).finally(() => {
// setSubmitLoading(false);
// });
PublicApi.postAsReplaceGoodsConfirmReplaceDeliveryGoods({
dataId: id,
}).then(res => {
if (res.code === 1000) {
history.goBack();
}
}).finally(() => {
setSubmitLoading(false);
});
};
const handleVisible = flag => {
......
......@@ -17,17 +17,15 @@ const ExchangePrReceivedVerify: React.FC = () => {
return;
}
setSubmitLoading(true);
// PublicApi.postPayCreditHandleVerifyStepOne({
// applyId: id,
// isPass: values.agree,
// opinion: values.reason,
// }).then(res => {
// if (res.code === 1000) {
// history.goBack();
// }
// }).finally(() => {
// setSubmitLoading(false);
// });
PublicApi.postAsReplaceGoodsConfirmReturnReceiveGoods({
dataId: id,
}).then(res => {
if (res.code === 1000) {
history.goBack();
}
}).finally(() => {
setSubmitLoading(false);
});
};
const handleVisible = flag => {
......
......@@ -227,7 +227,7 @@ export const pnoReceiveDeliverDetailDOListColumns = [
},
{
title: 'ID',
dataIndex: 'orderId'
dataIndex: 'productId'
},
{
title: '商品名称',
......
......@@ -4,7 +4,6 @@ import { history } from 'umi';
import AvatarWrap from '@/components/AvatarWrap';
import { PageHeader, Descriptions, Card, Tabs, Row, Col, Button, Badge, Table } from 'antd';
import Circulation from '../../components/Circulation';
import WrapTable from '../../components/WrapTable';
import OtherRequirement from '../../components/OtherRequirement';
import Appendix from '../../components/Appendix';
import { usePageStatus } from '@/hooks/usePageStatus'
......@@ -28,10 +27,12 @@ import {
CONFIRM_PENDING_FIRST_DETAIL,
CONFIRM_PENDING_SECOND_DETAIL,
CONFIRM_PENDING_CONFIRM_DETAIL,
PENDING_DELIVERD_PATH,
SUPPLIER_DETAIL_INNER_STATUS_COLOR,
CONFIRM_DETAIL_INNER_STATUS_COLOR,
SUPPLIER_OUTER_STATUS_COLOR
} from '../../common';
import DeliverGood from '../../components/DeliverGood';
// 下面的地址需要抽离出来, 还有以下的相同的path
const SERVICE_MAP = {
......@@ -46,7 +47,8 @@ const SERVICE_MAP = {
[`${CONFIRM_PENDING_FIRST_DETAIL}`]: PublicApi.getEnhanceProcessToBeFirstExamDetails,
[`${CONFIRM_PENDING_SECOND_DETAIL}`]: PublicApi.getEnhanceProcessToBeSecondExamDetails,
[`${CONFIRM_PENDING_CONFIRM_DETAIL}`]: PublicApi.getEnhanceProcessToBeConfirmDetails,
'/memberCenter/handling/confirm/processingInvoiceTobeAdd/detail': PublicApi.getEnhanceProcessToBeAddDeliveryDetails,
[`${PENDING_DELIVERD_PATH}/detail`]: PublicApi.getEnhanceProcessToBeDeliveryDetails
// '/memberCenter/handling/confirm/processingInvoiceTobeAdd/detail': PublicApi.getEnhanceProcessToBeAddDeliveryDetails,
}
/**
......@@ -74,15 +76,19 @@ const Detail: React.FC<{}> = () => {
const [deliverAddressOption, setDeliverAddressOption] = useState([]);
const [activeAddress, setActiveAddress] = useState<string | null>(null)
const getInfo = () => {
const service = SERVICE_MAP[pathname];
service && service({id: id})
.then(({data, code}) => {
if(code === 1000) {
setInfo(data);
}
})
}
useEffect(() => {
if(id) {
const service = SERVICE_MAP[pathname];
service && service({id: id})
.then(({data, code}) => {
if(code === 1000) {
setInfo(data);
}
})
getInfo();
}
}, [id]);
......@@ -147,12 +153,9 @@ const Detail: React.FC<{}> = () => {
})
}
/**
* 待提交生产通知单,提交生产通知到哪
*/
const submit = () => {
const postService = (service, params) => {
setLoading(true)
PublicApi.postEnhanceSupplierToBeSubmitSubmit({id: id})
service(params)
.then(({data, code}) => {
if(code === 1000) {
history.go(-1);
......@@ -162,7 +165,22 @@ const Detail: React.FC<{}> = () => {
})
}
const renderExtra = () => {
/**
* 待提交生产通知单,提交生产通知单
*/
const submit = () => {
postService(PublicApi.postEnhanceSupplierToBeSubmitSubmit, {id: id});
}
/**
* 指派生产通知单,提交
* /enhance/supplier/toBeAdd/submitExam
*/
const toNext = () => {
postService(PublicApi.postEnhanceSupplierToBeAddSubmitExam, {id: id});
}
const renderExtra = useCallback(() => {
const ExamineComponent = (
<ExamineModal onOk={examOnOk} modalType={"basic"}>
......@@ -170,16 +188,43 @@ const Detail: React.FC<{}> = () => {
</ExamineModal>
)
const SubmitBtn = <Button loading={loading} icon={<FormOutlined />} onClick={submit} type="primary"> 提交通知单</Button>
const NextBtn = <Button loading={loading} onClick={toNext}>提交</Button>
const COMPONENT_MAP = {
// 待新增生产通知单有提交按钮
[`${ASSIGN_TO_BE_ADD_QUERY_DETAIL}`]: NextBtn,
[`${ASSIGN_PENDING_SUBMIT_DETAIL}`]: SubmitBtn,
[`${ASSIGN_PENDING_FIRST_DETAIL}`]: ExamineComponent,
[`${ASSIGN_PENDING_SECOND_DETAIL}`]: ExamineComponent,
[`${CONFIRM_PENDING_SUBMIT_DETAIL}`]: ExamineComponent,
[`${CONFIRM_PENDING_FIRST_DETAIL}`]: ExamineComponent,
[`${CONFIRM_PENDING_SECOND_DETAIL}`]: ExamineComponent,
[`${CONFIRM_PENDING_CONFIRM_DETAIL}`]: ExamineComponent
[`${CONFIRM_PENDING_CONFIRM_DETAIL}`]: ExamineComponent,
// [`${PENDING_DELIVERD_PATH}/detail`]: DeliverGoodComponent
}
return (COMPONENT_MAP[pathname] || null)
}, [])
const handleConfirm = (status, params) => {
/**
* 这里的5 是指外部状态(outerStatus)为5,1指的是(activeData.deliverStatus)为1,
* 1 可以是 deliverStatus, 也可以是receiveStatus 和 receiptStatus
*/
const SERVICE_MAP = {
'5_1': PublicApi.postEnhanceProcessToBeDeliveryConfirmDelivery,
'7_1': PublicApi.postEnhanceSupplierToBeReceiveConfirmReceive,
'8_1': PublicApi.postEnhanceProcessToBeConfirmReceiptConfirmReceipt
}
const service = SERVICE_MAP[status];
if(service) {
service(params)
.then((data, code) => {
if(code === 1000) {
// console.log(data);
getInfo()
}
})
}
}
return (
......@@ -229,6 +274,16 @@ const Detail: React.FC<{}> = () => {
{
renderExtra()
}
{
// 这里手工发货需要某个字段值去判断
pathname === (PENDING_DELIVERD_PATH + "/detail")
? (
<DeliverGood mode="view">
<Button loading={loading} type="primary" >手工发货</Button>
</DeliverGood>
)
: null
}
</Col>
</Row>
</PageHeader>
......@@ -246,12 +301,15 @@ const Detail: React.FC<{}> = () => {
</Card>
</div>
{/* 这里全部是走 非手工发货,当有手工发货按钮是,此时下面收发货明细隐藏 */}
<div style={{marginTop: '20px', display: info.pnoReceiveDeliverDetailDOList?.length > 0 ? 'block' : 'none'}}>
<ReceiptDeliveryDetails
statisticsColumn={receiveColumns}
statisticsData={info.details}
pnoReceiveDeliverDetailDOList={info.pnoReceiveDeliverDetailDOList}
pnoReceiveDeliverDetailColumns={pnoReceiveDeliverDetailDOListColumns}
outerStatus={info.outerStatus}
confirm={handleConfirm}
/>
</div>
<div style={{marginTop: '20px'}}>
......@@ -285,13 +343,15 @@ const Detail: React.FC<{}> = () => {
<Card bodyStyle={{padding: '10px 24px 24px 24px'}}>
<Tabs>
<TabPane tab="外部流转记录" key="1">
<WrapTable
<Table
rowKey={"id"}
columns={outerWorkflowRecordsColumn}
dataSource={info.outerWorkflowRecordsList}
/>
</TabPane>
<TabPane tab="内部流转记录" key="2">
<WrapTable
<Table
rowKey={"id"}
columns={innerWorkFlowRecordColumn}
dataSource={info.innerWorkflowRecordsList}
/>
......
......@@ -14,28 +14,29 @@ import { ColumnsType } from 'antd/es/table';
import { timeRange } from '@/utils';
import { Link, history } from 'umi'
import { DOC_TYPE_PROCESS_INVOICE, DEPENDENT_DOC_PRODUCTION } from '@/constants';
import {
PROCESS_TITLE,
PENDING_ADD_PROCESS_PATH,
PROCESSING_INVOICE_TO_BE_ADD_PATH,
PENDING_ADD_LOGISTICS_PATH,
PENDING_DELIVERD_PATH,
PENDING_RECEIPT_PATH,
ASSIGN_PENDING_RECEIVE,
} from '../../common';
const formActions = createFormActions();
const ADD_PROCESS_PATH = '/memberCenter/tranactionAbility/stockSellStorage/bills/add';
const ADD_DELIVERY_PATH = '/memberCenter/tranactionAbility/stockSellStorage/bills/add';
const ADD_LOGISTICS_PATH = '/memberCenter/logisticsAbility/logisticsSubmit/toOrderSumitList/add';
const TITLE = {
'/memberCenter/handling/assign/pendingAddProcessing': "待新建加工入库单",
'/memberCenter/handling/confirm/processingInvoiceTobeAdd': "待新增加工发货单",
'/memberCenter/handling/confirm/pendingAddLogistics': "待新增物流单",
'/memberCenter/handling/confirm/pendingDelivered': "待发货生产通知单",
'/memberCenter/handling/confirm/pendingReceipt': "待确认回单生产通知单",
'/memberCenter/handling/assign/pendingReceive': "待确认收货生产通知单",
}
const SERVICE_MAPS = {
'/memberCenter/handling/assign/pendingAddProcessing': PublicApi.getEnhanceSupplierToBeAddStorageList,
'/memberCenter/handling/confirm/processingInvoiceTobeAdd': PublicApi.getEnhanceProcessToBeAddDeliveryList,
'/memberCenter/handling/confirm/pendingAddLogistics': PublicApi.getEnhanceProcessToBeAddLogisticsList,
'/memberCenter/handling/confirm/pendingDelivered': PublicApi.getEnhanceSupplierToBeReceiveList,
'/memberCenter/handling/confirm/pendingReceipt': PublicApi.getEnhanceProcessToBeConfirmReceiptList,
'/memberCenter/handling/assign/pendingReceive': PublicApi.getEnhanceSupplierToBeReceiveList
[PENDING_ADD_PROCESS_PATH]: PublicApi.getEnhanceSupplierToBeAddStorageList,
[PROCESSING_INVOICE_TO_BE_ADD_PATH]: PublicApi.getEnhanceProcessToBeAddDeliveryList,
[PENDING_ADD_LOGISTICS_PATH]: PublicApi.getEnhanceProcessToBeAddLogisticsList,
///enhance/process/toBeDelivery/list
[PENDING_DELIVERD_PATH]: PublicApi.getEnhanceProcessToBeDeliveryList,
[PENDING_RECEIPT_PATH]: PublicApi.getEnhanceProcessToBeConfirmReceiptList,
[ASSIGN_PENDING_RECEIVE]: PublicApi.getEnhanceSupplierToBeReceiveList
}
enum ExamType {
......@@ -43,7 +44,6 @@ enum ExamType {
warehouseReceipt = 'warehouseReceipt', // 加工入库单
}
const processStock: React.FC<{}> = () => {
const ref = useRef<any>({});
const pathname = history.location.pathname;
......@@ -84,7 +84,7 @@ const processStock: React.FC<{}> = () => {
},
{ title: '发货批次', dataIndex: 'deliveryBatch'},
{
title: '入库单号',
title: () => pathname == PENDING_ADD_PROCESS_PATH ? '入库单号' : '发货单号',
dataIndex: 'deliveryNo',
render: (text) => {
if(!text) {
......@@ -141,7 +141,8 @@ const processStock: React.FC<{}> = () => {
),
'待新增物流单': <Link to={`${ADD_LOGISTICS_PATH}`}>新增</Link>,
'待确认物流单': <a>查看</a>,
'待收货通知单': <Link to={'/memberCenter/handling/assign/pendingReceive/detail'}>收货</Link>
'待收货通知单': <Link to={`${ASSIGN_PENDING_RECEIVE}/detail`}>收货</Link>,
'待确认发货': <Link to={`${PENDING_DELIVERD_PATH}/detail?id=${record.id}`}>发货</Link>
}
return MAP[record.innerStatusName]
}
......@@ -205,7 +206,7 @@ const processStock: React.FC<{}> = () => {
return (
<PageHeaderWrapper
title={TITLE[pathname]}
title={PROCESS_TITLE[pathname]}
>
<Card>
<StandardTable
......
......@@ -29,10 +29,14 @@ export const ASSIGN_TO_BE_ADD_QUERY = '/memberCenter/handling/assign/tobeAddQuer
export const ASSIGN_PENDING_FIRST = '/memberCenter/handling/assign/pendingFirst';
export const ASSIGN_PENDING_SECOND = '/memberCenter/handling/assign/pendingSecond';
export const ASSIGN_PENDING_SUBMIT = '/memberCenter/handling/assign/pendingSubmit';
/**
* 指派生产通知单->待收货生产通知单
*/
export const ASSIGN_PENDING_RECEIVE = '/memberCenter/handling/assign/pendingReceive';
/**
* 确认生产通知单
* 确认生产通知单MENU -> 生产通知单查询, 待提交生产通知单,待审核(一级), 待审核(二级),待确认生产通知单
*/
export const CONFIRM_QUERY = '/memberCenter/handling/confirm/query';
export const CONFIRM_PENDING_SUBMIT = '/memberCenter/handling/confirm/pendingSubmit';
......@@ -59,7 +63,6 @@ export const CONFIRM_PENDING_SECOND_DETAIL = CONFIRM_PENDING_SECOND + DETAIL;
export const CONFIRM_PENDING_CONFIRM_DETAIL = CONFIRM_PENDING_CONFIRM + DETAIL;
/**
* 指派生产通知单-生产通知单查询页
*/
......@@ -101,31 +104,26 @@ export const PENDING_RECEIVE_SCHEMA = "noticeNo"
* 下面设置各个 path 常量
*/
export const QUERY_PATH = '/query';
const QUERY_TITLE = '生产通知单查询';
/**
* 待新增生产通知单
*/
export const TO_BE_ADD_QUERY_PATH = '/tobeAddQuery';
const TO_BE_ADD_QUERY_TITLE = '待新增生产通知单';
/**
* 带审核生产通知单(一级)
*/
export const PENDING_FIRST = '/pendingFirst';
const PENDING_FIRST_TITLE = '待审核通知单(一级)';
/**
* 待审核通知单(二级)
*/
export const PENDING_SECOND = '/pendingSecond';
const PENDING_SECOND_TITLE = '待审核通知单(二级)';
/**
* 待审核生产通知单
*/
export const PENDING_SUBMIT = '/pendingSubmit';
const PENDING_SUBMIT_TITLE = '待提交生产通知单';
/**
......@@ -134,35 +132,26 @@ const PENDING_SUBMIT_TITLE = '待提交生产通知单';
export const PENDING_RECEIVE = '/pendingReceive';
const PENDING_RECEIVE_TITLE = '待收货生产通知单';
export const TITLE_MAPS = {
[QUERY_PATH]: QUERY_TITLE,
[TO_BE_ADD_QUERY_PATH]: TO_BE_ADD_QUERY_TITLE,
[PENDING_FIRST]: PENDING_FIRST_TITLE,
[PENDING_SECOND]: PENDING_SECOND_TITLE,
[PENDING_SUBMIT]: PENDING_SUBMIT_TITLE,
[PENDING_RECEIVE]: PENDING_RECEIVE_TITLE
}
// 根据 lastTypeParams, 获取对应的高级筛选 name
export const FILTER_NAMES = {
[QUERY_PATH]: QUERY_SEARCH_NAME,
[TO_BE_ADD_QUERY_PATH]: TO_BE_ADD_QUERY_SEARCH_NAME,
[PENDING_FIRST]: PENDING_FIRST_AND_SECOND_NOTICE,
[PENDING_SECOND]: PENDING_FIRST_AND_SECOND_NOTICE,
[PENDING_SUBMIT]: PENDING_TO_SUBMIT,
[PENDING_RECEIVE]: PENDING_RECEIVE_SCHEMA,
"/pendingAddProcessing": PENDING_ADD_PROCESS,
export const ASSINGN_TITLE_MAPS = {
[ASSIGN_QUERY]: QUERY_TITLE,
[ASSIGN_TO_BE_ADD_QUERY]: TO_BE_ADD_QUERY_TITLE,
[ASSIGN_PENDING_FIRST]: PENDING_FIRST_TITLE,
[ASSIGN_PENDING_SECOND]: PENDING_SECOND_TITLE,
[ASSIGN_PENDING_SUBMIT]: PENDING_SUBMIT_TITLE,
}
export const DETAIL_PATH = {
[QUERY_PATH]: ASSIGN_QUERY_DETAIL,
[TO_BE_ADD_QUERY_PATH]: ASSIGN_TO_BE_ADD_QUERY_DETAIL,
[PENDING_FIRST]: ASSIGN_PENDING_FIRST_DETAIL,
[PENDING_SECOND]: ASSIGN_PENDING_SECOND_DETAIL,
[PENDING_SUBMIT]: ASSIGN_PENDING_SUBMIT,
[PENDING_RECEIVE]: ASSIGN_PENDING_RECEIVE_DETAIL,
}
// export const DETAIL_PATH = {
// [QUERY_PATH]: ASSIGN_QUERY_DETAIL,
// [TO_BE_ADD_QUERY_PATH]: ASSIGN_TO_BE_ADD_QUERY_DETAIL,
// [PENDING_FIRST]: ASSIGN_PENDING_FIRST_DETAIL,
// [PENDING_SECOND]: ASSIGN_PENDING_SECOND_DETAIL,
// [PENDING_SUBMIT]: ASSIGN_PENDING_SUBMIT,
// [PENDING_RECEIVE]: ASSIGN_PENDING_RECEIVE_DETAIL,
// }
export const INNER_STATUS_BADGE_COLOR = {
"1": "default",
......@@ -181,6 +170,7 @@ export const SUPPLIER_INNER_STATUS_COLOR = {
"1": "default",
"2": "warning",
"3": "processing",
'4': 'processing',
"5": "success",
"9": "error",
}
......@@ -226,7 +216,6 @@ export const CONFIRM_DETAIL_INNER_STATUS_COLOR = [
/**
* 指派生产通知单 -> 列表页 -> 外部状态
*/
export const SUPPLIER_OUTER_STATUS_COLOR = [
"default",
"default",
......@@ -234,4 +223,82 @@ export const SUPPLIER_OUTER_STATUS_COLOR = [
"warning",
"danger",
"success"
]
\ No newline at end of file
]
/**
* 待新增加工入库单
*/
export const PENDING_ADD_PROCESS_PATH = '/memberCenter/handling/assign/pendingAddProcessing';
/**
* 待新增加工发货单
*/
export const PROCESSING_INVOICE_TO_BE_ADD_PATH = '/memberCenter/handling/confirm/processingInvoiceTobeAdd';
/**
* 待新增物流单
*/
export const PENDING_ADD_LOGISTICS_PATH = '/memberCenter/handling/confirm/pendingAddLogistics';
/**
* 待发货生产通知单
*/
export const PENDING_DELIVERD_PATH = '/memberCenter/handling/confirm/pendingDelivered';
/**
* 待确认回单生产通知单
*/
export const PENDING_RECEIPT_PATH = '/memberCenter/handling/confirm/pendingReceipt';
/**
* 待加工发货单, 待加工入库单,待新增物流单,待发货生产通知单,待确认回单生产通知单, 待确认收货生产通知单
* 以上几种单据标题,因为共用一个页面,需要根据链接去判断
*/
export const PROCESS_TITLE = {
[PENDING_ADD_PROCESS_PATH]: "待新建加工入库单",
[PROCESSING_INVOICE_TO_BE_ADD_PATH]: "待新增加工发货单",
[PENDING_ADD_LOGISTICS_PATH]: "待新增物流单",
[PENDING_DELIVERD_PATH]: "待发货生产通知单",
[PENDING_RECEIPT_PATH]: "待确认回单生产通知单",
[ASSIGN_PENDING_RECEIVE]: "待确认收货生产通知单",
}
/**
* 收发货铭心 内部状态, 用发货状态,收货状态,回单状态去判断内部状态
* 因为上面三种情况 1:代表待确认 2,表示已确认收发货,回单,
*/
export const DELIEVER_AND_RECEIVE_INNER_STATUS_TEXT = [
"",
"待确认发货",
"已确认发货",
"待确认收货",
"已确认收货",
"待确认回单",
"已确认回单"
]
export const DELIEVER_AND_RECEIVE_INNER_BTN_TEXT = [
"",
"确认发货",
"确认发货",
"确认收货",
"确认收货",
"确认回单",
"确认回单"
]
export const DELIEVER_AND_RECEIVE_INNER_STATUS = {
'5_1': 1,
'5_2': 2,
'7_1': 3,
'7_2': 4,
'8_1': 5,
'8_2': 6
}
.row {
margin-bottom: 24px;
font-size: 12px;
&:last-child {
margin-bottom: 0;
}
.label {
color: #909399;
}
}
\ No newline at end of file
import React, { useState, useCallback } from 'react';
import { Button, Modal, DatePicker, Row, Col } from 'antd';
import NiceForm from '@/components/NiceForm';
import { createAsyncFormActions } from '@formily/antd';
import { PublicApi } from '@/services/api';
import { useAsyncSelect } from '@/formSchema/effects/useAsyncSelect';
import styles from './index.less';
import { Link } from 'umi'
const formActions = createAsyncFormActions();
interface Iprops {
children: React.ReactNode,
mode: 'view' | 'edit'
}
const schema = {
type: 'object',
properties: {
layout: {
type: "object",
"x-component": "mega-layout",
"x-component-props": {
"labelAlign": "top",
"full": true
},
properties: {
address: {
type: 'string',
"title": "发货地址",
enum: [],
"x-rules": [
{
required: true,
message: '请选择发货地址'
}
]
},
time: {
type: 'time',
title: '发货时间',
"x-component": 'DatePicker',
"x-rules": [
{
required: true,
message: '请选择发货时间'
}
]
},
no: {
type: 'string',
title: '发货单号',
"x-rules": [
{
required: true,
message: '请填写发货单号'
},
{
limitByte: true, // 自定义校验规则
maxByte: 20,
}
]
},
company: {
type: 'string',
title: '物流公司',
enum: [],
"x-rules": [
{
required: true,
message: '请选择物流公司'
}
]
}
}
}
}
}
const DeliverGood: React.FC<Iprops> = (props) => {
const { mode,} = props;
const [visible, setVisible] = useState(false);
const handleOk = () => {
if(mode === 'edit') {
formActions.submit()
}
}
const handleCancel = () => {
setVisible(false);
}
const handleSubmit = (value) => {
setVisible(false);
}
const fetchDelieverAddress = useCallback(async () => {
const { data, code }= await PublicApi.getLogisticsShipperAddressPage({current: '1', pageSize: '999'});
if(code === 1000) {
return data.data.map((item) => {
return {
label: item.fullAddress + " / " + item.shipperName + " / " + item.phone,
value: item.id
}
})
}
return []
}, [])
const fetchCompany = useCallback(async() => {
// /logistics/select/listCompany
const { data, code } = await PublicApi.getLogisticsSelectListCompany({cooperateType: '2'});
if(code === 1000) {
return data.map((item) => {
return {
label: item.name,
value: item.id
}
})
}
return []
}, [])
return (
<div>
<div onClick={() => setVisible(true)}>
{
props.children
}
</div>
<Modal
visible={visible}
title="发货处理"
onOk={handleOk}
onCancel={handleCancel}
>
{
mode === 'edit'
? <NiceForm
actions={formActions}
components={{DatePicker}}
onSubmit={handleSubmit}
effects={($, actions) => {
useAsyncSelect("address", fetchDelieverAddress);
useAsyncSelect("company", fetchCompany)
}}
schema={schema}
/>
: <div>
<Row className={styles.row}>
<Col className={styles.label} span={4}>发货地址:</Col>
<Col>广东省广州市海珠区新港东路1068号中州中心北塔6楼</Col>
</Row>
<Row className={styles.row}>
<Col className={styles.label} span={4}>发货时间:</Col>
<Col>2020-05-20 08:00</Col>
</Row>
<Row className={styles.row}>
<Col className={styles.label} span={4}>物流单号:</Col>
<Col><Link to={'/'}>WL0954548</Link></Col>
</Row>
<Row className={styles.row}>
<Col className={styles.label} span={4}>物流公司:</Col>
<Col>顺丰</Col>
</Row>
</div>
}
</Modal>
</div>
)
}
export default DeliverGood
\ No newline at end of file
......@@ -53,7 +53,7 @@ const DeliveryInfomation: React.FC<Iprops> = (props) => {
props.editDeliverAddress
? <Col span={9}>
<Row style={{marginBottom: '20px'}}>
<Col span={5}>发货地址</Col>
<Col span={5}>{props.deliveryType == 2 ? '自提地址' : '发货地址' }</Col>
<Col span={19}>
<Select style={{width: '100%'}} value={props.activeAddress}>
{
......@@ -65,14 +65,13 @@ const DeliveryInfomation: React.FC<Iprops> = (props) => {
)
})
}
{/* <Option value={"1"}>test</Option> */}
</Select>
</Col>
</Row>
</Col>
: <Col span={9} style={!props.deliveryUserName ? {display: 'none'} : {}}>
<Row style={{marginBottom: '20px'}}>
<Col span={5}>发货地址</Col>
<Col span={5}>{props.deliveryType == 2 ? '自提地址' : '发货地址' }</Col>
<Col>{props.deliveryUserTel} / {props.deliveryUserName}</Col>
</Row>
<Row>
......
/**
* 指派生产通知单-生产通知单查询页
*/
export const QUERY_SEARCH_NAME = "noticeNo";
/**
* 指派生产通知单-待新增生产通知单列表页
*/
export const TO_BE_ADD_QUERY_SEARCH_NAME = "noticeNo";
/**
* 指派生产通知单-待审核生产通知单(一级)
* 指派生产通知单-待审核生产通知单(二级)
*/
export const PENDING_FIRST_AND_SECOND_NOTICE = "noticeNo";
/**
* 指派生产通知单-待提交生产通知单
*/
export const PENDING_TO_SUBMIT = "noticeNo";
/**
* 指派生产通知单-待新增加工入库单
*/
export const PENDING_ADD_PROCESS = "summary"
/**
* 指派生产通知单-待收货生产通知单
*/
export const PENDING_RECEIVE_SCHEMA = "noticeNo"
/**
* 下面设置各个 path 常量
*/
export const QUERY_PATH = '/query';
const QUERY_TITLE = '生产通知单查询';
/**
* 待新增生产通知单
*/
export const TO_BE_ADD_QUERY_PATH = '/tobeAddQuery';
const TO_BE_ADD_QUERY_TITLE = '待新增生产通知单';
/**
* 带审核生产通知单(一级)
*/
export const PENDING_FIRST = '/pendingFirst';
const PENDING_FIRST_TITLE = '待审核通知单(一级)';
/**
* 待审核通知单(二级)
*/
export const PENDING_SECOND = '/pendingSecond';
const PENDING_SECOND_TITLE = '待审核通知单(二级)';
/**
* 待审核生产通知单
*/
export const PENDING_SUBMIT = '/pendingSubmit';
const PENDING_SUBMIT_TITLE = '待提交生产通知单';
/**
* 待收货生产通知单
*/
export const PENDING_RECEIVE = '/pendingReceive';
const PENDING_RECEIVE_TITLE = '待收货生产通知单';
export const TITLE_MAPS = {
[QUERY_PATH]: QUERY_TITLE,
[TO_BE_ADD_QUERY_PATH]: TO_BE_ADD_QUERY_TITLE,
[PENDING_FIRST]: PENDING_FIRST_TITLE,
[PENDING_SECOND]: PENDING_SECOND_TITLE,
[PENDING_SUBMIT]: PENDING_SUBMIT_TITLE,
[PENDING_RECEIVE]: PENDING_RECEIVE_TITLE
}
export const INNER_STATUS_BADGE_COLOR = {
"1": "default",
"2": "warning",
"3": "processing",
"4": "success",
"5": "error"
}
// 根据 lastTypeParams, 获取对应的高级筛选 name
export const FILTER_NAMES = {
[QUERY_PATH]: QUERY_SEARCH_NAME,
[TO_BE_ADD_QUERY_PATH]: TO_BE_ADD_QUERY_SEARCH_NAME,
[PENDING_FIRST]: PENDING_FIRST_AND_SECOND_NOTICE,
[PENDING_SECOND]: PENDING_FIRST_AND_SECOND_NOTICE,
[PENDING_SUBMIT]: PENDING_TO_SUBMIT,
[PENDING_RECEIVE]: PENDING_RECEIVE_SCHEMA,
"/pendingAddProcessing": PENDING_ADD_PROCESS,
}
export const DETAIL_PATH = {
[QUERY_PATH]: '/memberCenter/handling/assign/query/detail',
[TO_BE_ADD_QUERY_PATH]: '/memberCenter/handling/assign/tobeAddQuery/detail',
[PENDING_FIRST]: '/memberCenter/handling/assign/pendingFirst/detail',
[PENDING_SECOND]: '/memberCenter/handling/assign/pendingSecond/detail',
[PENDING_SUBMIT]: '/memberCenter/handling/assign/pendingSubmit/detail',
[PENDING_RECEIVE]: '/memberCenter/handling/assign/pendingReceive/detail',
}
\ No newline at end of file
import { ISchema } from '@formily/antd';
import { FORM_FILTER_PATH } from '@/formSchema/const';
import { QUERY_SEARCH_NAME, TO_BE_ADD_QUERY_SEARCH_NAME, PENDING_FIRST_AND_SECOND_NOTICE } from './contants';
// import { QUERY_SEARCH_NAME, TO_BE_ADD_QUERY_SEARCH_NAME, PENDING_FIRST_AND_SECOND_NOTICE } from './contants';
import { docTime } from '../../common';
/**
......@@ -14,7 +14,7 @@ export const querySchema: ISchema = {
type: 'object',
'x-component': 'mega-layout',
properties: {
[QUERY_SEARCH_NAME]: {
noticeNo: {
type: 'string',
'x-component': 'Search',
'x-component-props': {
......@@ -108,7 +108,7 @@ export const tobeAddQuerySchema: ISchema = {
children: '{{controllerBtns}}',
},
},
[TO_BE_ADD_QUERY_SEARCH_NAME]: {
noticeNo: {
type: 'string',
'x-component': 'Search',
'x-component-props': {
......@@ -202,7 +202,7 @@ export const pendingFirstQuerySchema: ISchema = {
children: '{{batchUpdateBtn}}',
},
},
[PENDING_FIRST_AND_SECOND_NOTICE]: {
noticeNo: {
type: 'string',
'x-component': 'Search',
'x-component-props': {
......
import React, { useEffect, useState } from 'react';
import { Card, Tabs, Table, Radio, Row, Col } from 'antd';
import _groupBy from 'lodash/groupBy';
import { Card, Tabs, Table, Radio, Row, Col, Popconfirm } from 'antd';
import styles from './index.less';
import classname from 'classnames';
import moment from 'moment';
import { DELIEVER_AND_RECEIVE_INNER_STATUS, DELIEVER_AND_RECEIVE_INNER_STATUS_TEXT, DELIEVER_AND_RECEIVE_INNER_BTN_TEXT } from '../../common';
import { PublicApi } from '@/services/api';
import { FlagFilled } from '@ant-design/icons';
const TabPane = Tabs.TabPane;
const format = 'YYYY-MM-DD HH:mm:ss';
const TEXT_MAP = {
"deliverStatus_1": 1,
"deliverStatus_2": 2,
"receiveStatus_1": 3,
"receiveStatus_2": 4,
"receiptStatus_1": 5,
"receiptStatus_2": 6
}
const ReceiptDeliveryDetails = (props) => {
const { statisticsColumn, statisticsData, pnoReceiveDeliverDetailDOList = [], pnoReceiveDeliverDetailColumns } = props;
const { statisticsColumn, statisticsData, pnoReceiveDeliverDetailDOList = [], pnoReceiveDeliverDetailColumns, outerStatus } = props;
const [activeBatch, setActiveBatch] = useState(0);
const [activeData, setActiveData] = useState<any>({});
const [currentTarget, setCurrentTarget] = useState("deliverStatus");
useEffect(() => {
if(pnoReceiveDeliverDetailDOList && pnoReceiveDeliverDetailDOList.length > 0) {
......@@ -23,6 +34,29 @@ const ReceiptDeliveryDetails = (props) => {
setActiveBatch(e.target.value)
setActiveData(pnoReceiveDeliverDetailDOList[e.target.value])
}
const confirm = (params, type) => {
props.handleConfirm(params, type);
}
useEffect(() => {
// 小于等于5 取deliverStatus, 小于等于7, 取,receiveStatus, 大于7取receiptStatus
const range = [5, 7, 8];
const value = ["deliverStatus", "receiveStatus", "receiptStatus"];
let flag = false;
for(let i = 0; i < range.length; i++) {
if( outerStatus == range[i]) {
setCurrentTarget(value[i]);
flag = true;
break;
}
}
// if(!flag) {
// setCurrentTarget("receiptStatus");
// }
}, [outerStatus])
return (
<Card bodyStyle={{padding: '10px 24px 24px 24px'}}>
<Tabs>
......@@ -48,7 +82,7 @@ const ReceiptDeliveryDetails = (props) => {
<Col span={6}>
<div className={styles.detailItem}>
<span className={styles.title}>发货单号</span>
<a className={classname(styles.value)}>{activeData.deliveryNo}</a>
<a className={styles.value}>{activeData.deliveryNo}</a>
</div>
<div>
<span className={styles.title}>发货时间</span>
......@@ -78,13 +112,28 @@ const ReceiptDeliveryDetails = (props) => {
<Col span={4} className={styles.status}>
<div>
<span className={styles.title}>内部状态</span>
<span className={styles.value}>{activeData.deliverStatus}</span>
<span className={styles.value}>{
DELIEVER_AND_RECEIVE_INNER_STATUS_TEXT[TEXT_MAP[`${currentTarget}_${activeData[currentTarget]}`]]
}</span>
</div>
</Col>
<Col span={2} className={styles.action}>
<div>
确认回单
</div>
<Popconfirm
title={`是否${DELIEVER_AND_RECEIVE_INNER_BTN_TEXT[TEXT_MAP[`${currentTarget}_${activeData[currentTarget]}`]]}`}
onConfirm={() => confirm(
{
produceNoticeOrderId: activeData.produceNoticeOrderId,
pnoReceiveDeliverDetailId: activeData.id
},
`${outerStatus}_${activeData[currentTarget]}`
)
}
okText="是"
cancelText="否"
>
<a href="#">{DELIEVER_AND_RECEIVE_INNER_BTN_TEXT[TEXT_MAP[`${outerStatus}_${activeData[currentTarget]}`]]}</a>
</Popconfirm>
</Col>
</Row>
</div>
......
import React from 'react'
import { Table } from 'antd'
import moment from 'moment';
import DrawerProcessDetail from '../ProcessDetail/DrawerProcessDetail';
interface Iprops {
dataSource: any[],
columns?: any[]
}
const WrapTable: React.FC<Iprops> = (props) => {
const dataSource = props.dataSource || []
return (
<Table
columns={props.columns || []}
rowKey={"id"}
dataSource={dataSource}
/>
)
}
export default WrapTable
\ No newline at end of file
const BASIC_PATH = '/memberCenter/handling/confirm'
// 生产通知单查询,确认生产通知单
export const PATH = `${BASIC_PATH}/query`
// 待提交审核生产通知单
export const PENDING_VIEW_PATH = `${BASIC_PATH}/pendingSubmit`
// 待提交审核生产通知单(一级)
export const PENDING_FIRST_VIEW_PATH = `${BASIC_PATH}/pendingFirst`
// 待提交审核生产通知单(二级)
export const PENDING_SECOND_VIEW_PATH = `${BASIC_PATH}/pendingSecond`
// 待确认生产通知单
export const PENDING_CONFIRM_PATH = `${BASIC_PATH}/pendingConfirm`
// 待新增加工发货单 ProcessingInvoiceTobeAdd
export const PROCESS_INVOICE_TO_BE_ADD_PATH = `${BASIC_PATH}/processingInvoiceTobeAdd`
// 待新增物流单 pendingAddLogistics
export const PENDING_ADD_LOGISTICS_PATH = `${BASIC_PATH}/pendingAddLogistics`;
// 待收货生产通知单 ${BASIC_PATH}/pendingDelivered
export const PENDING_DELIVERED_PATH = `${BASIC_PATH}/pendingDelivered`;
// 待确认回单生产通知单 pendingReceipt
export const PENDING_RECEIPT_PATH = `${BASIC_PATH}/pendingReceipt`;
......@@ -10,57 +10,57 @@ import { createFormActions } from '@formily/antd';
import { FORM_FILTER_PATH } from '@/formSchema/const';
import { useAsyncInitSelect } from '@/formSchema/effects/useAsyncInitSelect';
import { ColumnsType } from 'antd/es/table';
import { DownOutlined, DeleteOutlined } from '@ant-design/icons';
import { history } from 'umi';
import { querySchema, basicSchema, pendingFirstQuerySchema } from './schema';
import {
PATH,
PENDING_VIEW_PATH,
PENDING_FIRST_VIEW_PATH,
PENDING_SECOND_VIEW_PATH,
PENDING_CONFIRM_PATH,
PROCESS_INVOICE_TO_BE_ADD_PATH, //以上代表路径
// PENDING_ADD_LOGISTICS_PATH,
// PENDING_DELIVERED_PATH,
// PENDING_RECEIPT_PATH,
} from './contants';
import {
CONFIRM_QUERY,
CONFIRM_PENDING_SUBMIT,
CONFIRM_PENDING_FIRST,
CONFIRM_PENDING_SECOND,
CONFIRM_PENDING_CONFIRM,
SUPPLIER_INNER_STATUS_COLOR,
SUPPLIER_OUTER_STATUS_COLOR
} from '../../common'
import { timeRange } from '@/utils';
import { useRowSelectionTable } from '@/hooks/useRowSelectionTable';
import moment from 'moment';
import { Link } from 'umi'
import StatusTag from '@/components/StatusTag';
import ExamineModal from '../../components/ExamineModal';
const formActions = createFormActions();
// 根据 lastTypeParams, 获取相对应的schema
/**
* 该页面是 确认生产通知单5个页面公用的
* 生产通知单查询,
* 待提交生产生产通知单,
* 待审核(一级),
* 待审核(二级),
* 待确认生产通知单
* 根据他们的菜单路径获取schema, 获取列表页的service, 以及根据pathname跳到各自的详情页
*
*/
// 根据 菜单路径, 获取相对应的schema
export const SCHEMAS = {
[PATH]: querySchema,
[PENDING_VIEW_PATH]: basicSchema, // 待新增生产通知
[PENDING_FIRST_VIEW_PATH]: pendingFirstQuerySchema,
[PENDING_SECOND_VIEW_PATH]: pendingFirstQuerySchema,
[PENDING_CONFIRM_PATH]: basicSchema, // 带审核生产通知单
[PROCESS_INVOICE_TO_BE_ADD_PATH]: basicSchema,
// [PENDING_ADD_LOGISTICS_PATH]: basicSchema,
// [PENDING_DELIVERED_PATH]: basicSchema,
// [PENDING_RECEIPT_PATH]: basicSchema
[CONFIRM_QUERY]: querySchema,
[CONFIRM_PENDING_SUBMIT]: basicSchema, // 待新增生产通知
[CONFIRM_PENDING_FIRST]: pendingFirstQuerySchema,
[CONFIRM_PENDING_SECOND]: pendingFirstQuerySchema,
[CONFIRM_PENDING_CONFIRM]: basicSchema, // 带审核生产通知单
}
console.log(basicSchema);
// 根据 path, 得到对应的列表页 service
const SERVICES = {
[PATH]: PublicApi.getEnhanceProcessAllList,
[PENDING_VIEW_PATH]: PublicApi.getEnhanceProcessToBeSubmitExamList,
[PENDING_FIRST_VIEW_PATH]: PublicApi.getEnhanceProcessToBeFirstExamList,
[PENDING_SECOND_VIEW_PATH]: PublicApi.getEnhanceProcessToBeSecondExamList,
[PENDING_CONFIRM_PATH]: PublicApi.getEnhanceProcessToBeConfirmList,
// [PROCESS_INVOICE_TO_BE_ADD_PATH]: PublicApi.getEnhanceProcessToBeAddDeliveryList,
// [PENDING_ADD_LOGISTICS_PATH]: PublicApi.getEnhanceProcessToBeAddLogisticsList,
// [PENDING_RECEIPT_PATH]: PublicApi.getEnhanceProcessToBeConfirmReceiptList
[CONFIRM_QUERY]: PublicApi.getEnhanceProcessAllList,
[CONFIRM_PENDING_SUBMIT]: PublicApi.getEnhanceProcessToBeSubmitExamList,
[CONFIRM_PENDING_FIRST]: PublicApi.getEnhanceProcessToBeFirstExamList,
[CONFIRM_PENDING_SECOND]: PublicApi.getEnhanceProcessToBeSecondExamList,
[CONFIRM_PENDING_CONFIRM]: PublicApi.getEnhanceProcessToBeConfirmList,
}
const Query: React.FC<{}> = (props) => {
const pathname = history.location.pathname;
const [selectRow, selectRowFns] = useRowSelectionTable({ customKey: 'id' });
const [batchLoading, setBatchLoading] = useState(false)
const ref = useRef<any>({});
const fetchData = useCallback(async (params) => {
......@@ -104,8 +104,8 @@ const Query: React.FC<{}> = (props) => {
{
title: '外部状态',
dataIndex: 'outerStatusName',
render: (text) => {
return <StatusTag title={text} type="success"></StatusTag>
render: (text, record: any) => {
return <StatusTag title={text} type={SUPPLIER_OUTER_STATUS_COLOR[record.outerStatus]}></StatusTag>
}
},
{
......@@ -113,7 +113,7 @@ const Query: React.FC<{}> = (props) => {
dataIndex: 'innerStatusName',
render: (text, record: any) => {
return (
<Badge status={"success"} text={text}></Badge>
<Badge status={SUPPLIER_INNER_STATUS_COLOR[record.processInnerStatus] || 'default'} text={text}></Badge>
)
}
}
......@@ -126,22 +126,10 @@ const Query: React.FC<{}> = (props) => {
const url = pathname + "/detail";
console.log(url);
const actionMap = {
[PENDING_VIEW_PATH]: <Link to={`${url}?id=${record.id}`}>提交审核</Link>,
[PENDING_FIRST_VIEW_PATH]: <Link to={`${url}?id=${record.id}`}>审核</Link>,
[PENDING_SECOND_VIEW_PATH]: <Link to={`${url}?id=${record.id}`}>审核</Link>,
[PENDING_CONFIRM_PATH]: <Link to={`${url}?id=${record.id}`}>确认通知单</Link>,
// [PROCESS_INVOICE_TO_BE_ADD_PATH]: (
// record.status == 0
// ? <Link to={`/memberCenter/tranactionAbility/stockSellStorage/bills/add`}>新增加工发货单</Link>
// : <a>确认审核</a>
// ),
// [PENDING_ADD_LOGISTICS_PATH]: (
// record.status == 0
// ? <Link to={`/memberCenter/handling/confirm/createLogisticsOrder`}>新增物流单</Link>
// : <Link to={`/memberCenter/handling/confirm/createLogisticsOrder`}>查看物流单</Link>
// ),
// [PENDING_DELIVERED_PATH]: <Link to={`${url}?id=${record.id}`}>发货</Link>,
// [PENDING_RECEIPT_PATH]: <Link to={`${url}?id=${record.id}`}>确认回单</Link>
[CONFIRM_PENDING_SUBMIT]: <Link to={`${url}?id=${record.id}`}>提交审核</Link>,
[CONFIRM_PENDING_FIRST]: <Link to={`${url}?id=${record.id}`}>审核</Link>,
[CONFIRM_PENDING_SECOND]: <Link to={`${url}?id=${record.id}`}>审核</Link>,
[CONFIRM_PENDING_CONFIRM]: <Link to={`${url}?id=${record.id}`}>确认通知单</Link>,
}
return (
<Space>
......@@ -157,7 +145,7 @@ const Query: React.FC<{}> = (props) => {
const batchUpdateBtn = () => (
<div>
<Button onClick={() => handleSubmitToReviewOrDelete()}>
<Button loading={batchLoading} onClick={() => handleSubmitToReviewOrDelete()}>
批量审核通过
</Button>
</div>
......@@ -185,15 +173,17 @@ const Query: React.FC<{}> = (props) => {
return ;
}
const BATCH_UPDATE_SERVICE = {
[PENDING_FIRST_VIEW_PATH]: PublicApi.postEnhanceProcessToBeFirstExamBatchExamPass,
[PENDING_SECOND_VIEW_PATH]: PublicApi.postEnhanceProcessToBeSecondExamBatchExamPass,
[CONFIRM_PENDING_FIRST]: PublicApi.postEnhanceProcessToBeFirstExamBatchExamPass,
[CONFIRM_PENDING_SECOND]: PublicApi.postEnhanceProcessToBeSecondExamBatchExamPass,
}
const service = BATCH_UPDATE_SERVICE[pathname];
if(service) {
setBatchLoading(true);
service({
idList: selectRowFns.selectedRowKeys,
}).then(({data, code}) => {
setBatchLoading(false);
if(code === 1000) {
formActions.submit();
}
......@@ -227,7 +217,7 @@ const Query: React.FC<{}> = (props) => {
rowKey: 'id',
rowSelection: selectRow
}}
columns={pathname == PATH ? columns : hasActionColumn}
columns={pathname == CONFIRM_QUERY ? columns : hasActionColumn}
currentRef={ref}
fetchTableData={(params: any) => fetchData(params)}
controlRender={
......
......@@ -11,6 +11,7 @@ import {
import {
QuestionCircleOutlined,
} from '@ant-design/icons';
import { isJSONStr } from '@/utils';
import PolymericTable from '@/components/PolymericTable';
import { EditableColumns } from '@/components/PolymericTable/interface';
import { Pie } from '@/components/Charts';
......@@ -116,17 +117,17 @@ export interface ComplaintProps {
interface SincerityInfoProps {
basicInfo?: BasicInfo;
salesEstimateSum?: EstimateSum;
/*
/**
交易评论历史记录
*/
fetchSalesList?: (params: FetchParams) => Promise<{ data: SalesProps[] , totalCount: number }>;
afterEstimateSum?: EstimateSum;
/*
/**
售后评论历史记录
*/
fetchAfterList?: (params: FetchParams) => Promise<{ data: SalesProps[] , totalCount: number }>;
complaintSum?: ComplaintSum;
/*
/**
投诉历史记录
*/
fetchComplaintList?: (params: FetchParams) => Promise<{ data: ComplaintProps[] , totalCount: number }>;
......@@ -277,11 +278,17 @@ const SincerityInfo: React.FC<SincerityInfoProps> = ({
title: '评价内容',
dataIndex: 'comment',
align: 'center',
ellipsis: true,
},
{
title: '交易商品',
dataIndex: 'product',
align: 'center',
align: 'center',
ellipsis: true,
render: text => {
const product = isJSONStr(text) || {};
return product.productName || '';
},
},
{
title: '评价方',
......
......@@ -21,8 +21,16 @@ const MemberBasicInfo: React.FC<MemberBasicInfoProps> = ({
}}
>
<AuditProcess
outerVerifyCurrent={memberMaintainInfo?.currentOuterStep}
innerVerifyCurrent={memberMaintainInfo?.currentInnerStep}
outerVerifyCurrent={
memberMaintainInfo && memberMaintainInfo.currentOuterStep > 0 ?
memberMaintainInfo.currentOuterStep - 1 :
0
}
innerVerifyCurrent={
memberMaintainInfo && memberMaintainInfo.currentInnerStep > 0 ?
memberMaintainInfo.currentInnerStep -1 :
0
}
outerVerifySteps={memberMaintainInfo?.outerVerifySteps}
innerVerifySteps={memberMaintainInfo?.innerVerifySteps}
/>
......
......@@ -198,6 +198,16 @@ const DetailInfo: React.FC<DetailInfoProps> = ({
<AuditProcess
outerVerifySteps={memberInfo?.outerVerifySteps}
innerVerifySteps={memberInfo?.innerVerifySteps}
outerVerifyCurrent={
memberInfo && memberInfo.currentOuterStep > 0 ?
memberInfo.currentOuterStep - 1 :
0
}
innerVerifyCurrent={
memberInfo && memberInfo.currentInnerStep > 0 ?
memberInfo.currentInnerStep -1 :
0
}
/>
</div>
......
......@@ -199,6 +199,16 @@ const DetailInfo: React.FC<DetailInfoProps> = ({
<AuditProcess
outerVerifySteps={memberInfo?.outerVerifySteps}
innerVerifySteps={memberInfo?.innerVerifySteps}
outerVerifyCurrent={
memberInfo && memberInfo.currentOuterStep > 0 ?
memberInfo.currentOuterStep - 1 :
0
}
innerVerifyCurrent={
memberInfo && memberInfo.currentInnerStep > 0 ?
memberInfo.currentInnerStep -1 :
0
}
/>
</div>
......
......@@ -214,6 +214,16 @@ const DetailInfo: React.FC<DetailInfoProps> = ({
<AuditProcess
outerVerifySteps={memberInfo?.outerVerifySteps}
innerVerifySteps={memberInfo?.innerVerifySteps}
outerVerifyCurrent={
memberInfo && memberInfo.currentOuterStep > 0 ?
memberInfo.currentOuterStep - 1 :
0
}
innerVerifyCurrent={
memberInfo && memberInfo.currentInnerStep > 0 ?
memberInfo.currentInnerStep -1 :
0
}
/>
</div>
......
......@@ -285,6 +285,16 @@ const DetailInfo: React.FC<DetailInfoProps> = ({
<AuditProcess
outerVerifySteps={memberInfo?.outerVerifySteps}
innerVerifySteps={memberInfo?.innerVerifySteps}
outerVerifyCurrent={
memberInfo && memberInfo.currentOuterStep > 0 ?
memberInfo.currentOuterStep - 1 :
0
}
innerVerifyCurrent={
memberInfo && memberInfo.currentInnerStep > 0 ?
memberInfo.currentInnerStep -1 :
0
}
/>
</div>
......
......@@ -22,7 +22,15 @@ const MemberBasicInfo: React.FC<MemberBasicInfoProps> = ({
marginBottom: 24,
}}
>
<Steps style={{ marginTop: 30 }} progressDot current={memberMaintainInfo?.currentOuterStep}>
<Steps
style={{ marginTop: 30 }}
progressDot
current={
memberMaintainInfo && memberMaintainInfo.currentOuterStep > 0 ?
memberMaintainInfo.currentOuterStep - 1 :
0
}
>
{memberMaintainInfo.outerVerifySteps ? memberMaintainInfo.outerVerifySteps.map((item, index) => (
<Steps.Step key={index} title={item.roleName} description={item.stepName} />
)) : null}
......
......@@ -11,7 +11,7 @@ import OrderSaleRecord from '../orderSaleRecord'
export interface OrderDetailSectionProps {
formContext: any,
type?: 'purchaseOrder' | 'saleOrder'
type?: 'purchaseOrder' | 'saleOrder',
}
const OrderDetailSection:React.FC<OrderDetailSectionProps> = ({formContext, type = 'purchaseOrder'}) => {
......@@ -46,7 +46,7 @@ const OrderDetailSection:React.FC<OrderDetailSectionProps> = ({formContext, type
<OrderMergeInfo />
{ type === 'saleOrder' ? <OrderSaleRecord/> : <OrderDeleveRecord /> }
{ type === 'saleOrder' ? <OrderSaleRecord /> : <OrderDeleveRecord /> }
<OrderTransformRecord type={type}/>
</div>
......
import React, { useContext, useRef } from 'react'
import { Tabs, Table, Button } from 'antd'
import React, { useCallback, useContext, useEffect, useRef, useState } from 'react'
import { Tabs, Table, Button, Space,Modal } from 'antd'
import StatusColors from '@/pages/transaction/components/StatusColors'
import { formatTimeString } from '@/utils'
import { OrderDetailContext } from '../../_public/order/context'
......@@ -8,8 +8,14 @@ import NestTable from '@/components/NestTable'
import { DeliverySideState } from '@/constants'
import { PublicApi } from '@/services/api'
import { history } from 'umi'
import { ExclamationCircleOutlined } from '@ant-design/icons'
import { useHttpRequest } from '@/hooks/useHttpRequest'
export interface OrderSaleRecordProps {}
export interface OrderSaleRecordProps {
}
const { confirm } = Modal;
const outOrderCols: any[] = [
{
......@@ -163,6 +169,7 @@ const OrderSaleRecord:React.FC<OrderSaleRecordProps> = (props) => {
const dataRef = useRef<any>([])
const { data, reloadFormData } = useContext(OrderDetailContext)
const { orderReceivingStatisticsResponses, orderDeliveryDetailsResponses } = data
const sideOrderCols: any[] = [
{
title: '发货批次',
......@@ -227,6 +234,21 @@ const OrderSaleRecord:React.FC<OrderSaleRecordProps> = (props) => {
},
]
const { run, loading } = useHttpRequest(PublicApi.postOrderReceiptOrderConfirmedAll)
// 确认全部回单
const handleSubmit = useCallback(async () => {
const params = {
id: Number(data.id),
state: 1
}
const result = await run(params)
if (result.code === 1000) {
history.goBack()
}
}, [])
// 确认发货
const handleConfirm = async (record) => {
const params = {
......@@ -254,6 +276,45 @@ const OrderSaleRecord:React.FC<OrderSaleRecordProps> = (props) => {
reloadFormData && reloadFormData()
}
}
// 确认全部发货单已收到回单
const handelReciveReturnOrder = async () => {
const res = await PublicApi.getOrderIsDeliveryCompleted({id: data.id})
const { code } = res
let tip = ''
if(code === 1000)
tip = '是否确认本单全部发货单已收到回单?'
else
tip = '您还有未发货的商品,是否确认全部发货都已完成?'
confirm({
title: '提示',
icon: <ExclamationCircleOutlined />,
content: tip,
onOk() {
handleSubmit()
},
});
}
// 继续发货
const handleContinueDeliver = async () => {
const res = await PublicApi.getOrderIsDeliveryCompleted({id: data.id})
const { code } = res
let tip = ''
if(code === 1000)
tip = '您商品都已发货.是否确认还需要继续发货?'
else
tip = '是否继续发货?'
confirm({
title: '提示',
icon: <ExclamationCircleOutlined />,
content: tip,
onOk() {
PublicApi.postOrderReceiptOrderContinueShipping({orderId: data.id})
},
});
}
return (
<>
{
......@@ -278,6 +339,10 @@ const OrderSaleRecord:React.FC<OrderSaleRecordProps> = (props) => {
childrenDataKey='orderDeliveryProducts'
dataSource={orderDeliveryDetailsResponses}
/>
<Space style={{marginTop: 18, display: "flex", justifyContent: "flex-end"}}>
<Button type="primary" onClick={handelReciveReturnOrder}>确认本单全部发货单已收到回单</Button>
<Button type="primary" onClick={handleContinueDeliver}>继续发货</Button>
</Space>
</Tabs.TabPane>
}
</Tabs>
......
......@@ -31,11 +31,15 @@ const ReadyConfirmReturnOrderDetail: React.FC = () => {
return (
<div>
<OrderDetailContext.Provider value={formContext}>
<OrderDetailHeader detailList={detailList} detailData={formContext.data} extraRight={
<Button type='primary' onClick={handleSubmit} loading={loading}>
确认全部已回单
</Button>
} />
<OrderDetailHeader
detailList={detailList}
detailData={formContext.data}
// extraRight={
// <Button type='primary' onClick={handleSubmit} loading={loading}>
// 确认全部已回单
// </Button>
// }
/>
<OrderDetailWrapper>
<PreLoading loading={!formContext.data} active paragraph={{rows: 6}}>
......
......@@ -2,7 +2,7 @@
* @Author: XieZhiXiong
* @Date: 2020-09-16 15:16:47
* @LastEditors: XieZhiXiong
* @LastEditTime: 2020-11-25 17:25:55
* @LastEditTime: 2020-11-26 11:10:39
* @Description: 联动逻辑相关
*/
import { Modal } from 'antd';
......@@ -598,8 +598,7 @@ export const useBusinessEffects = (context, actions) => {
onFieldInputChange$('invoicesDetailsRequests.*.product').subscribe(fieldState => {
const { name, originAsyncData, value } = fieldState;
const current = originAsyncData.find(item => item.productId === value);
console.log('current', current)
const invoicesTypeIdVal = getFieldValue('invoicesTypeId');
// 取消选择
if (!value) {
......@@ -679,14 +678,6 @@ export const useBusinessEffects = (context, actions) => {
);
setFieldState(
FormPath.transform(name, /\d/, $1 => {
return `invoicesDetailsRequests.${$1}.productCount`
}),
state => {
state.value = current.purchaseCount;
}
);
setFieldState(
FormPath.transform(name, /\d/, $1 => {
return `invoicesDetailsRequests.${$1}.amount`
}),
state => {
......@@ -694,6 +685,57 @@ export const useBusinessEffects = (context, actions) => {
}
);
switch (invoicesTypeIdVal) {
// 采购入库单、销售发货单
case DOC_TYPE_PURCHASE_RECEIPT:
case DOC_TYPE_SALES_INVOICE: {
// 设置单据数量,取采购数量
setFieldState(
FormPath.transform(name, /\d/, $1 => {
return `invoicesDetailsRequests.${$1}.productCount`
}),
state => {
state.value = current.purchaseCount;
}
);
break;
}
// 加工入库单、加工发货单
case DOC_TYPE_PROCESS_RECEIPT:
case DOC_TYPE_PROCESS_INVOICE: {
// 设置单据数量,取加工数量
setFieldState(
FormPath.transform(name, /\d/, $1 => {
return `invoicesDetailsRequests.${$1}.productCount`
}),
state => {
state.value = current.processNum;
}
);
break;
}
// 退货发货单、退货入库单
case DOC_TYPE_RETURN_INVOICE:
case DOC_TYPE_RETURN_RECEIPT: {
break;
}
// 换货发货单、换货入库单
case DOC_TYPE_EXCHANGE_INVOICE:
case DOC_TYPE_EXCHANGE_RECEIPT: {
break;
}
default: {
break;
}
}
// 额外的数据
setFieldState(
FormPath.transform(name, /\d/, $1 => {
......@@ -750,6 +792,7 @@ export const useBusinessEffects = (context, actions) => {
// 关联明细 商品数量 联动计算商品金额
onFieldInputChange$('invoicesDetailsRequests.*.productCount').subscribe(fieldState => {
const { name, value } = fieldState;
const invoicesTypeIdVal = getFieldValue('invoicesTypeId');
const originAsyncData = getFieldState(
FormPath.transform(name, /\d/, $1 => {
return `invoicesDetailsRequests.${$1}.product`
......@@ -764,18 +807,61 @@ export const useBusinessEffects = (context, actions) => {
);
const current = originAsyncData ? originAsyncData.find(item => item.productId === goodId) : null;
console.log('current', current)
if (!current) {
return;
}
if (+value > current.purchaseCount) {
Modal.destroyAll();
Modal.confirm({
title: '提示',
content: '单据数量已超过商品数量',
okText: '确认',
cancelText: '取消',
});
switch (invoicesTypeIdVal) {
// 采购入库单、销售发货单
case DOC_TYPE_PURCHASE_RECEIPT:
case DOC_TYPE_SALES_INVOICE: {
if (+value > current.purchaseCount) {
Modal.destroyAll();
Modal.confirm({
title: '提示',
content: '单据数量已超过商品数量',
okText: '确认',
cancelText: '取消',
});
}
break;
}
// 加工入库单、加工发货单
case DOC_TYPE_PROCESS_RECEIPT:
case DOC_TYPE_PROCESS_INVOICE: {
if (+value > current.processNum) {
Modal.destroyAll();
Modal.confirm({
title: '提示',
content: '单据数量已超过加工数量',
okText: '确认',
cancelText: '取消',
});
}
break;
}
// 退货发货单、退货入库单
case DOC_TYPE_RETURN_INVOICE:
case DOC_TYPE_RETURN_RECEIPT: {
break;
}
// 换货发货单、换货入库单
case DOC_TYPE_EXCHANGE_INVOICE:
case DOC_TYPE_EXCHANGE_RECEIPT: {
break;
}
default: {
break;
}
}
setFieldState(
......
......@@ -10,11 +10,13 @@ import { SaveOutlined, PlusOutlined } from '@ant-design/icons';
import { createFormActions, FormEffectHooks } from '@formily/antd';
import { useRowSelectionTable } from '@/hooks/useRowSelectionTable';
import { PublicApi } from '@/services/api';
import { useLinkageUtils } from '@/utils/formEffectUtils';
import ReutrnEle from '@/components/ReturnEle';
import NiceForm from '@/components/NiceForm';
import ModalTable from '@/components/ModalTable';
import Search from '@/components/NiceForm/components/Search';
import Submit from '@/components/NiceForm/components/Submit';
import SearchSelect from '@/components/NiceForm/components/SearchSelect';
import { useStateFilterSearchLinkageEffect } from '@/formSchema/effects/useFilterSearch';
import { FORM_FILTER_PATH } from '@/formSchema/const';
import { useAsyncSelect } from '@/formSchema/effects/useAsyncSelect';
......@@ -42,6 +44,7 @@ import { createEffects } from './effects';
const addSchemaAction = createFormActions();
const {
onFormInputChange$,
onFormInit$,
} = FormEffectHooks;
interface BillsFormProps {
......@@ -97,6 +100,28 @@ const BillsForm: React.FC<BillsFormProps> = ({
},
]
// 获取品牌
const fetchBrand = async (name = '') => {
const res = await PublicApi.getProductSelectGetSelectBrand({
name,
});
if (res.code === 1000) {
return res.data;
}
return [];
}
// 获取会员品类
const fetchCustomerCategory = async (name = '') => {
const res = await PublicApi.getProductSelectGetSelectCustomerCategory({
name,
});
if (res.code === 1000) {
return res.data;
}
return [];
}
// 获取单据详情
const getBillInfo = () => {
if (!id) {
......@@ -874,14 +899,46 @@ const BillsForm: React.FC<BillsFormProps> = ({
components: {
Search,
Submit,
SearchSelect,
},
effects: ($, actions) => {
const linkage = useLinkageUtils();
useStateFilterSearchLinkageEffect(
$,
actions,
'name',
FORM_FILTER_PATH,
);
useAsyncSelect('brandId', fetchBrand, ['name', 'id']);
useAsyncSelect('customerCategoryId', fetchCustomerCategory, ['name', 'id']);
onFormInit$().subscribe(() => {
// 初始化远程检索逻辑
linkage.componentProps('customerCategoryId', {
onSearch: async value => {
linkage.loading('customerCategoryId');
const dataSource = await fetchCustomerCategory(value);
linkage.enum('customerCategoryId', dataSource.map(item => ({
label: item.name,
value: item.id,
})));
linkage.loaded('customerCategoryId');
},
});
// 初始化远程检索逻辑
linkage.componentProps('brandId', {
onSearch: async value => {
linkage.loading('brandId');
const dataSource = await fetchCustomerCategory(value);
linkage.enum('brandId', dataSource.map(item => ({
label: item.name,
value: item.id,
})));
linkage.loaded('brandId');
},
});
});
},
inline: false,
}
......
......@@ -779,24 +779,24 @@ export const goodsSearchSchema: ISchema = {
},
customerCategoryId: {
type: 'string',
'x-component': 'SearchSelect',
enum: [],
'x-component-props': {
placeholder: '品类',
fetchSearch: PublicApi.getProductSelectGetSelectCustomerCategory,
style: {
width: '100%',
}
placeholder: '品类',
showSearch: true,
defaultActiveFirstOption: false,
showArrow: true,
filterOption: false,
},
},
brandId: {
type: 'string',
'x-component': 'SearchSelect',
enum: [],
'x-component-props': {
placeholder: '品牌',
fetchSearch: PublicApi.getProductSelectGetSelectBrand,
style: {
width: '100%',
}
placeholder: '品牌',
showSearch: true,
defaultActiveFirstOption: false,
showArrow: true,
filterOption: false,
},
},
submit: {
......
......@@ -2,7 +2,7 @@
* @Author: XieZhiXiong
* @Date: 2020-09-23 17:00:24
* @LastEditors: XieZhiXiong
* @LastEditTime: 2020-10-27 16:59:38
* @LastEditTime: 2020-11-26 14:52:22
* @Description:
*/
import { ISchema } from '@formily/antd';
......@@ -64,7 +64,7 @@ export const evaluateSchema: ISchema = {
},
},
picture: {
type: 'string',
type: 'array',
title: '图片',
'x-component': 'Upload',
'x-component-props': {
......
......@@ -443,7 +443,9 @@ export interface FileData {
url: string;
};
// 初始化 Upload 数据
/**
* 初始化 Upload 数据
*/
export function normalizeFiledata(url: string): FileData
export function normalizeFiledata(url: any): any {
if (!url) {
......
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