Commit c76f2f18 authored by 前端-黄佳鑫's avatar 前端-黄佳鑫
parents 4dca2c4f 414a679b
......@@ -120,14 +120,7 @@ const HandlingRoute = {
component: '@/pages/handling/assign/detail',
hideInMenu: true,
},
// 指派生产通知单 -> 新建加工入库单
// {
// path: '/memberCenter/handling/assign/createProcessStock',
// name: 'createProcessStock',
// icon: 'smile',
// component: '@/pages/handling/assign/processStock/createProcessStock',
// hideInMenu: true,
// }
]
},
// 确认生产通知单
......@@ -222,14 +215,6 @@ const HandlingRoute = {
component: '@/pages/handling/assign/detail',
hideInMenu: true
},
// 确认生产通知单 -> 新建加工发货单
// {
// path: '/memberCenter/handling/confirm/createProcessInvoice',
// name: 'createProcessInvoice',
// icon: 'smile',
// component: '@/pages/handling/confirm/createProcessInvoice'
// },
// 确认生产通知单 -> 待新增物流单
{
path: '/memberCenter/handling/confirm/pendingAddLogistics',
......@@ -237,13 +222,6 @@ const HandlingRoute = {
icon: 'smile',
component: '@/pages/handling/assign/processStock',
},
// 确认生产通知单 -> 新建物流单
// {
// path: '/memberCenter/handling/confirm/createLogisticsOrder',
// name: 'createLogisticsOrder',
// icon: 'smile',
// component: '@/pages/handling/confirm/createLogisticsOrder',
// },
// 确认生产通知单 -> 待发货生产通知单
{
path: '/memberCenter/handling/confirm/pendingDelivered',
......@@ -256,6 +234,7 @@ const HandlingRoute = {
name: 'pendingDeliveredDetail',
icon: 'smile',
component: '@/pages/handling/assign/detail',
hideInMenu: true,
},
// 确认生产通知单 -> 待确认回单生产通知单
{
......@@ -263,7 +242,15 @@ const HandlingRoute = {
name: 'pendingReceipt',
icon: 'smile',
component: '@/pages/handling/assign/processStock'
}
},
// 确认生产通知单 -> 待确认回单生产通知单
{
path: '/memberCenter/handling/confirm/pendingReceipt/detail',
name: 'pendingReceiptDetail',
icon: 'smile',
component: '@/pages/handling/assign/detail',
hideInMenu: true,
},
]
}
......
......@@ -542,7 +542,22 @@ export enum PurchaseOrderOutWorkState {
/**
* 货品数量还没有全部发货重新发货
*/
PRODUCT_ACOUNT_NOT_SEND
PRODUCT_ACOUNT_NOT_SEND,
/**
* 待支付尾款
*/
NOT_PAYMENT_FINAL,
/**
* 待确认支付结果
*/
NOT_CONFIRM_PAYMENT_RESULT,
/**
* 确认未到账
*/
CONFIRM_WITHOUT_ARRIVED_ACCOUNT
}
// 采购订单内部工作流状态
......@@ -787,7 +802,10 @@ export const PurchaseOrderOutWorkStateTexts = {
14: '完成订单',
20: '不接受订单',
21: '确认没到账',
22: '货品未全部发货'
22: '货品未全部发货',
23: '待支付尾款',
24: '待确认支付结果',
25: '确认未到账',
}
// 采购订单内部
......
......@@ -489,7 +489,7 @@ export default {
'menu.handling.confirm.pendingReceipt': '待确认回单生产通知单',
'menu.handling.confirm.createProcessInvoice': '新建加工发货单',
'menu.handling.confirm.createLogisticsOrder': '新建物流单',
'menu.handling.confirm.pendingReceiptDetail': '待确认回单生产通知单详情',
// 售后能力
'menu.afterService': '售后',
'menu.afterService.exchangeApplication': '换货申请',
......
......@@ -2,7 +2,7 @@
* @Author: XieZhiXiong
* @Date: 2020-11-06 16:30:44
* @LastEditors: XieZhiXiong
* @LastEditTime: 2020-11-20 16:03:42
* @LastEditTime: 2020-11-27 17:16:30
* @Description: 待新增退货发货单
*/
import React, { useState, useRef } from 'react';
......@@ -18,6 +18,12 @@ import { ColumnType } from 'antd/lib/table/interface';
import { PageHeaderWrapper } from '@ant-design/pro-layout';
import { createFormActions } from '@formily/antd';
import { PublicApi } from '@/services/api';
import {
DOC_TYPE_RETURN_INVOICE,
DEPENDENT_DOC_EXCHANGE,
EXCHANGE_INNER_STATUS_NOT_ADDED_RETURN_DELIVERY,
EXCHANGE_INNER_STATUS_UNREVIEWED_RETURN_DELIVERY,
} from '@/constants';
import { useStateFilterSearchLinkageEffect } from '@/formSchema/effects/useFilterSearch';
import { FORM_FILTER_PATH } from '@/formSchema/const';
import EyePreview from '@/components/EyePreview';
......@@ -111,18 +117,25 @@ const ExchangePrAddDeliver: React.FC = () => {
align: 'center',
render: (text, record) => (
<>
<Button
type="link"
onClick={() => () => history.push(``)}
>
新增
</Button>
<Button
type="link"
onClick={() => handleVerify(record)}
>
审核
</Button>
{record.innerStatus === EXCHANGE_INNER_STATUS_NOT_ADDED_RETURN_DELIVERY && (
<Button
type="link"
onClick={
() =>
history.push(`/memberCenter/tranactionAbility/stockSellStorage/bills/add?relevanceInvoicesId=${record.replaceId}&invoicesTypeId=${DOC_TYPE_RETURN_INVOICE}&relevanceInvoices=${DEPENDENT_DOC_EXCHANGE}`)
}
>
新增
</Button>
)}
{record.innerStatus === EXCHANGE_INNER_STATUS_UNREVIEWED_RETURN_DELIVERY && (
<Button
type="link"
onClick={() => handleVerify(record)}
>
审核
</Button>
)}
</>
),
},
......
import React, {useState, useEffect, useCallback} from 'react';
import React, {useState, useEffect, useCallback, useMemo} from 'react';
import { PageHeaderWrapper } from '@ant-design/pro-layout';
import { history } from 'umi';
import AvatarWrap from '@/components/AvatarWrap';
import { PageHeader, Descriptions, Card, Tabs, Row, Col, Button, Badge, Table } from 'antd';
import { PageHeader, Descriptions, Card, Tabs, Row, Col, Button, Badge, Table, Popconfirm } from 'antd';
import Circulation from '../../components/Circulation';
import OtherRequirement from '../../components/OtherRequirement';
import Appendix from '../../components/Appendix';
......@@ -10,8 +10,8 @@ import { usePageStatus } from '@/hooks/usePageStatus'
import { PublicApi } from '@/services/api';
import StatusTag from '@/components/StatusTag';
import DeliveryInfomation from '../../components/DeliveryInformation';
import ReceiptDeliveryDetails from '../../components/ReceiptDeliveryDetails';
import moment from 'moment';
import { ReceiptDeliveryDetailsCard, StatisticsTab, DetailTab } from '../../components/ReceiptDeliveryDetails';
import { columns, orderDetailColumn, innerWorkFlowRecordColumn, outerWorkflowRecordsColumn, receiveColumns, pnoReceiveDeliverDetailDOListColumns } from './columns';
import ExamineModal from '../../components/ExamineModal';
import { FormOutlined } from '@ant-design/icons'
......@@ -28,13 +28,16 @@ import {
CONFIRM_PENDING_SECOND_DETAIL,
CONFIRM_PENDING_CONFIRM_DETAIL,
PENDING_DELIVERD_PATH,
PENDING_RECEIPT_PATH,
SUPPLIER_DETAIL_INNER_STATUS_COLOR,
CONFIRM_DETAIL_INNER_STATUS_COLOR,
SUPPLIER_OUTER_STATUS_COLOR
} from '../../common';
import DeliverGood from '../../components/DeliverGood';
// 下面的地址需要抽离出来, 还有以下的相同的path
/**
* 进入详情页,根据不同的pathname 获取他们的service,
* Assign 指的是指派通知单, comfirm 是确认通知单
*/
const SERVICE_MAP = {
[`${ASSIGN_QUERY_DETAIL}`]: PublicApi.getEnhanceSupplierAllDetails,
[`${ASSIGN_TO_BE_ADD_QUERY_DETAIL}`]: PublicApi.getEnhanceSupplierToBeAddDetails,
......@@ -47,8 +50,8 @@ const SERVICE_MAP = {
[`${CONFIRM_PENDING_FIRST_DETAIL}`]: PublicApi.getEnhanceProcessToBeFirstExamDetails,
[`${CONFIRM_PENDING_SECOND_DETAIL}`]: PublicApi.getEnhanceProcessToBeSecondExamDetails,
[`${CONFIRM_PENDING_CONFIRM_DETAIL}`]: PublicApi.getEnhanceProcessToBeConfirmDetails,
[`${PENDING_DELIVERD_PATH}/detail`]: PublicApi.getEnhanceProcessToBeDeliveryDetails
// '/memberCenter/handling/confirm/processingInvoiceTobeAdd/detail': PublicApi.getEnhanceProcessToBeAddDeliveryDetails,
[`${PENDING_DELIVERD_PATH}/detail`]: PublicApi.getEnhanceProcessToBeDeliveryDetails,
[`${PENDING_RECEIPT_PATH}/detail`]: PublicApi.getEnhanceProcessToBeConfirmReceiptDetails,
}
/**
......@@ -75,7 +78,26 @@ const Detail: React.FC<{}> = () => {
const [loading, setLoading] = useState<boolean>(false);
const [deliverAddressOption, setDeliverAddressOption] = useState([]);
const [activeAddress, setActiveAddress] = useState<string | null>(null)
const tips = useMemo(() => {
let string = ""
if(pathname === `${PENDING_RECEIPT_PATH}/detail`) {
if(!info || !info.pnoReceiveDeliverDetailDOList) {
return ""
}
const flag = info.pnoReceiveDeliverDetailDOList.some((item) => {
return item.pnoReceiveDeliverDetailProductBOList.some((row) => {
return row.processNum - row.deliverNum > 0 // 还有未发货的
})
});
if(flag) {
string = "您还有未发货的商品,是否确认全部发货已完成"
} else {
string = "确认本单全部发货单是否已全部收到回单"
}
}
return string
}, [info])
const getInfo = () => {
const service = SERVICE_MAP[pathname];
service && service({id: id})
......@@ -95,7 +117,7 @@ const Detail: React.FC<{}> = () => {
// 确认生产通知单 -> 待提交审核生产通知单时需要同时提交他的发货地址
useEffect(() => {
if(isSetDeliverAddress) {
PublicApi.getLogisticsShipperAddressPage({current: '1', pageSize: '20'})
PublicApi.getLogisticsShipperAddressPage({current: '1', pageSize: '999'})
.then(({data, code}) => {
if(code === 1000) {
const tempData = [];
......@@ -153,6 +175,11 @@ const Detail: React.FC<{}> = () => {
})
}
/**
* 统一的审核提交方法,比如审核一级单,审核二级单,提交审核
* @param service
* @param params
*/
const postService = (service, params) => {
setLoading(true)
service(params)
......@@ -180,8 +207,18 @@ const Detail: React.FC<{}> = () => {
postService(PublicApi.postEnhanceSupplierToBeAddSubmitExam, {id: id});
}
const renderExtra = useCallback(() => {
/**
* 确认全部发货
*/
const handleAllReceiptReceive = () => {
postService(
PublicApi.postEnhanceProcessToBeConfirmReceiptConfirmAllReceipt,
{
produceNoticeOrderId: id, status: true}
)
}
const renderExtra = () => {
const ExamineComponent = (
<ExamineModal onOk={examOnOk} modalType={"basic"}>
<Button loading={loading} type="primary" >单据审核</Button>
......@@ -189,6 +226,11 @@ const Detail: React.FC<{}> = () => {
)
const SubmitBtn = <Button loading={loading} icon={<FormOutlined />} onClick={submit} type="primary"> 提交通知单</Button>
const NextBtn = <Button loading={loading} onClick={toNext}>提交</Button>
const AllReceiptReceive = (
<Popconfirm title={tips} onConfirm={handleAllReceiptReceive}>
<Button loading={loading} type="primary">确认本单全部发货单已收到回单</Button>
</Popconfirm>
)
const COMPONENT_MAP = {
// 待新增生产通知单有提交按钮
......@@ -200,10 +242,10 @@ const Detail: React.FC<{}> = () => {
[`${CONFIRM_PENDING_FIRST_DETAIL}`]: ExamineComponent,
[`${CONFIRM_PENDING_SECOND_DETAIL}`]: ExamineComponent,
[`${CONFIRM_PENDING_CONFIRM_DETAIL}`]: ExamineComponent,
// [`${PENDING_DELIVERD_PATH}/detail`]: DeliverGoodComponent
[`${PENDING_RECEIPT_PATH}/detail`]: AllReceiptReceive
}
return (COMPONENT_MAP[pathname] || null)
}, [])
}
const handleConfirm = (status, params) => {
/**
......@@ -211,16 +253,15 @@ const Detail: React.FC<{}> = () => {
* 1 可以是 deliverStatus, 也可以是receiveStatus 和 receiptStatus
*/
const SERVICE_MAP = {
'5_1': PublicApi.postEnhanceProcessToBeDeliveryConfirmDelivery,
'7_1': PublicApi.postEnhanceSupplierToBeReceiveConfirmReceive,
'8_1': PublicApi.postEnhanceProcessToBeConfirmReceiptConfirmReceipt
'deliverStatus_1': PublicApi.postEnhanceProcessToBeDeliveryConfirmDelivery,
'receiveStatus_1': PublicApi.postEnhanceSupplierToBeReceiveConfirmReceive,
'receiptStatus_1': PublicApi.postEnhanceProcessToBeConfirmReceiptConfirmReceipt
}
const service = SERVICE_MAP[status];
if(service) {
service(params)
.then((data, code) => {
.then(({data, code}) => {
if(code === 1000) {
// console.log(data);
getInfo()
}
})
......@@ -246,7 +287,7 @@ const Detail: React.FC<{}> = () => {
}
>
<Row>
<Col span={22}>
<Col span={20}>
<Descriptions
column={3}
style={{padding: '0 32px', fontWeight: 400}}
......@@ -270,7 +311,7 @@ const Detail: React.FC<{}> = () => {
</Descriptions.Item>
</Descriptions>
</Col>
<Col span={2}>
<Col span={4}>
{
renderExtra()
}
......@@ -302,15 +343,22 @@ const Detail: React.FC<{}> = () => {
</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 style={{marginTop: '20px'}}>
<ReceiptDeliveryDetailsCard>
<StatisticsTab tab="收发货统计" columns={receiveColumns} dataSource={info.details}></StatisticsTab>
{
info.pnoReceiveDeliverDetailDOList &&
info.pnoReceiveDeliverDetailDOList.length > 0
? <DetailTab
tab="生产通知单收发货明细"
columns={pnoReceiveDeliverDetailDOListColumns}
dataSource={info.pnoReceiveDeliverDetailDOList}
handleConfirm={handleConfirm}
/>
: null
}
</ReceiptDeliveryDetailsCard>
</div>
<div style={{marginTop: '20px'}}>
<DeliveryInfomation
......
......@@ -13,15 +13,15 @@ import moment from 'moment';
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 { DOC_TYPE_PROCESS_INVOICE, DEPENDENT_DOC_PRODUCTION, DOC_TYPE_PROCESS_RECEIPT } 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,
PENDING_RECEIPT_PATH,
} from '../../common';
const formActions = createFormActions();
......@@ -103,46 +103,59 @@ const processStock: React.FC<{}> = () => {
render: (text, record: any) => {
// 这里暂时不知道status的状态, 先用内部状态判断, 审核的先不处理, 感觉应该用入库单号去判断吧
const MAP = {
'待新增加工发货单': (
// outerStatus = 5, innerStatus = 18
'待确认发货': <Link to={`${PENDING_DELIVERD_PATH}/detail?id=${record.id}`}>发货</Link>,
// outerStatus = 6, innerStatus = 19
'待新增加工入库单': (
<Link
to={`${ADD_PROCESS_PATH}?relevanceInvoicesId=${record.id}&invoicesTypeId=${DOC_TYPE_PROCESS_INVOICE}&relevanceInvoices=${DEPENDENT_DOC_PRODUCTION}`}
to={`${ADD_DELIVERY_PATH}?relevanceInvoicesId=${record.id}&invoicesTypeId=${DOC_TYPE_PROCESS_RECEIPT}&relevanceInvoices=${DEPENDENT_DOC_PRODUCTION}`}
>
新增加工发货
新增加工入库
</Link>
),
'待审核加工发货单': (
// outerStatus = 6, innerStatus = 20
'待审核加工入库单': (
<Popconfirm
title={`是否确认审核发货单号为${record.deliveryNo}的加工发货单?`}
title={`是否确认审核入库单号为${record.deliveryNo}的加工入库单?`}
visible={visibleID === record.id}
placement="left"
okText="确定"
cancelText="取消"
onCancel={handleCancel}
okButtonProps={{ loading: confirmLoading }}
onConfirm={() => handleExamDelivery(record.id, ExamType.delivery)}
onConfirm={() => handleExam(record.id, ExamType.warehouseReceipt)}
>
<a onClick={() => handleVisible(record.id)}>审核</a>
</Popconfirm>
),
'新增加工入库单': <Link to={ADD_DELIVERY_PATH}>新增加工入库单</Link>,
'审核加工入库单': (
// outerStatus = 7, innerStatus = 21
'待确认收货': <Link to={`${ASSIGN_PENDING_RECEIVE}/detail?id=${record.id}`}>收货</Link>,
'待新增加工发货单': (
<Link
to={`${ADD_PROCESS_PATH}?relevanceInvoicesId=${record.id}&invoicesTypeId=${DOC_TYPE_PROCESS_INVOICE}&relevanceInvoices=${DEPENDENT_DOC_PRODUCTION}`}
>
新增加工发货单
</Link>
),
'待审核加工发货单': (
<Popconfirm
title={`是否确认审核入库单号为${record.deliveryNo}的加工入库单?`}
title={`是否确认审核发货单号为${record.deliveryNo}的加工发货单?`}
visible={visibleID === record.id}
placement="left"
okText="确定"
cancelText="取消"
onCancel={handleCancel}
okButtonProps={{ loading: confirmLoading }}
onConfirm={() => handleExamDelivery(record.id, ExamType.warehouseReceipt)}
onConfirm={() => handleExam(record.id, ExamType.delivery)}
>
<a onClick={() => handleVisible(record.id)}>审核</a>
</Popconfirm>
),
'待新增物流单': <Link to={`${ADD_LOGISTICS_PATH}`}>新增</Link>,
'待确认物流单': <a>查看</a>,
'待收货通知单': <Link to={`${ASSIGN_PENDING_RECEIVE}/detail`}>收货</Link>,
'待确认发货': <Link to={`${PENDING_DELIVERD_PATH}/detail?id=${record.id}`}>发货</Link>
// outerStatus = 8, innerStatus = 22
'待确认回单': <Link to={`${PENDING_RECEIPT_PATH}/detail?id=${record.id}`}>确认回单</Link>
}
return MAP[record.innerStatusName]
}
......@@ -156,7 +169,7 @@ const processStock: React.FC<{}> = () => {
* @param id 审核单id
* @param type deliver | warehouseReceipt
*/
const handleExamDelivery = (id: number, type: string) => {
const handleExam = (id: number, type: string) => {
const exam_service = {
[ExamType.delivery]: PublicApi.postEnhanceProcessToBeAddDeliveryExam,
[ExamType.warehouseReceipt]: PublicApi.postEnhanceSupplierToBeAddStorageExam,
......
......@@ -213,10 +213,11 @@ export const CONFIRM_DETAIL_INNER_STATUS_COLOR = [
"green", // 完成
]
type SUPPLIER_OUTER_STATUS_COLOR_TYPE = ("default" | "primary" | "danger"| "success" | "warning")[]
/**
* 指派生产通知单 -> 列表页 -> 外部状态
*/
export const SUPPLIER_OUTER_STATUS_COLOR = [
export const SUPPLIER_OUTER_STATUS_COLOR: SUPPLIER_OUTER_STATUS_COLOR_TYPE= [
"default",
"default",
"primary",
......@@ -265,8 +266,8 @@ export const PROCESS_TITLE = {
[PROCESSING_INVOICE_TO_BE_ADD_PATH]: "待新增加工发货单",
[PENDING_ADD_LOGISTICS_PATH]: "待新增物流单",
[PENDING_DELIVERD_PATH]: "待发货生产通知单",
[PENDING_RECEIPT_PATH]: "待确认回单生产通知单",
[ASSIGN_PENDING_RECEIVE]: "待确认收货生产通知单",
[PENDING_RECEIPT_PATH]: "待确认回单生产通知单",
}
......
......@@ -17,7 +17,8 @@ const styles = {
backgroundColor: '#F4F5F7',
padding: '10px 10px',
cursor: 'pointer',
height: '100%'
height: '100%',
marginBottom: '8px'
}
......
import React, {useEffect, useState} from 'react';
import { ColumnsType } from 'antd/es/table';
import { Table, Row, Col, Popconfirm, Radio } from 'antd';
import styles from './index.less'
import moment from 'moment';
import { history } from 'umi'
import { ASSIGN_PENDING_RECEIVE_DETAIL, PENDING_DELIVERD_PATH, PENDING_RECEIPT_PATH } from '../../common';
interface Iprops {
tab: string,
columns: ColumnsType<any>,
dataSource: any[],
handleConfirm: (type: string, params: any) => void
}
const format = 'YYYY-MM-DD HH:mm:ss';
/**
* 只有在待发货生产通知单, 待收货生产通知、待回单生产通知单才能修改他table商品的状态
* 比如确认发货,确认收货、确认回单
* 并且上面三个状态的值为1才能修改
* @param props
*/
const PENDING_DELIVERD_DETAIL_PATH = PENDING_DELIVERD_PATH + '/detail';
const PENDING_RECEIPT_DETAIL_PATH = PENDING_RECEIPT_PATH + '/detail';
//receiptStatus_1
const MAP_PATH = {
[PENDING_DELIVERD_DETAIL_PATH]: 'deliverStatus',
[ASSIGN_PENDING_RECEIVE_DETAIL]: 'receiveStatus',
[PENDING_RECEIPT_DETAIL_PATH]: 'receiptStatus',
}
const TEXT_MAP = {
'deliverStatus_1': '确认发货',
'receiveStatus_1': '确认收货',
'receiptStatus_1': '确认回单'
}
// 从全部进来, 如果是confirm
const CONFIRM_STATUS_TEXT = {
'1_1_1': '待确认发货',
'2_1_1': '已确认发货',
'2_2_1': '待确认回单',
'2_2_2': '已确认回单'
}
// 如果是 指派通知单
const ASSIGN_STATUS_TEXT = {
'1_1_1': '待确认发货',
'2_1_1': '已确认发货',
'2_2_1': '已确认收货',
'2_2_2': '已确认回单'
}
const DetailTab: React.FC<Iprops> = (props) => {
const { columns, dataSource } = props;
const [activeBatch, setActiveBatch] = useState(0);
const [activeData, setActiveData] = useState<any>({});
// const [currentTarget, setCurrentTarget] = useState("deliverStatus");
const pathname = history.location.pathname;
const currentPage = MAP_PATH[pathname];
const INNER_TEXT = pathname.includes('confirm') ? CONFIRM_STATUS_TEXT : ASSIGN_STATUS_TEXT;
useEffect(() => {
if(dataSource && dataSource.length > 0) {
setActiveData(dataSource[0])
}
}, [dataSource])
const handleOnChange = (e) => {
setActiveBatch(e.target.value)
setActiveData(dataSource[e.target.value])
}
const confirm = (params, type) => {
props.handleConfirm(type, params);
}
return (
<div >
<div >
<Radio.Group value={activeBatch} onChange={handleOnChange}>
{
dataSource && dataSource.map((item, key) => {
return (
<Radio.Button key={item.deliveryBatch} value={key}>{item.deliveryBatch} 批次</Radio.Button>
)
})
}
</Radio.Group>
</div>
<div className={styles.header}>
<Row>
<Col span={6}>
<div className={styles.detailItem}>
<span className={styles.title}>发货单号</span>
<a className={styles.value}>{activeData.deliveryNo}</a>
</div>
<div>
<span className={styles.title}>发货时间</span>
<span className={styles.value}>
{
activeData.deliveryTime
&& moment(activeData.deliveryTime).format(format)
}</span>
</div>
</Col>
<Col span={6}>
<div className={styles.detailItem}>
<span className={styles.title}>物流单号</span>
<a className={styles.value}>{activeData.logisticsOrderNo}</a>
</div>
<div>
<span className={styles.title}>物流公司</span>
<span className={styles.value}>{activeData.logisticsCompany}</span>
</div>
</Col>
<Col span={6}>
<div className={styles.detailItem}>
<span className={styles.title}>入库单号</span>
<span className={styles.value}>{activeData.storageNo}</span>
</div>
<div>
<span className={styles.title}>入库时间</span>
<span className={styles.value}>
{
activeData.storageTime
&& moment(activeData.storageTime).format(format)
}</span>
</div>
</Col>
<Col span={4} className={styles.status}>
<div>
<span className={styles.title}>内部状态</span>
<span className={styles.value}>{
INNER_TEXT[`${activeData.deliverStatus}_${activeData.receiveStatus}_${activeData.receiptStatus}`]
}</span>
</div>
</Col>
<Col span={2} className={styles.action}>
<Popconfirm
title={`是否${TEXT_MAP[`${currentPage}_${activeData[currentPage]}`]}`}
onConfirm={() => confirm(
{
produceNoticeOrderId: activeData.produceNoticeOrderId,
pnoReceiveDeliverDetailId: activeData.id
},
`${currentPage}_${activeData[currentPage]}`
)
}
okText="是"
cancelText="否"
>
<a href="#">
{TEXT_MAP[`${currentPage}_${activeData[currentPage]}`]}
</a>
</Popconfirm>
</Col>
</Row>
</div>
<Table
dataSource={activeData.pnoReceiveDeliverDetailProductBOList}
rowKey={"orderNo"}
columns={columns}
/>
</div>
)
}
export default DetailTab;
\ No newline at end of file
import React from 'react';
import { Card, Tabs } from 'antd';
const TabPane = Tabs.TabPane
interface Iprops {};
const ReceiptDeliveryDetailsCard: React.FC<Iprops> = (props) => {
const newChildren = React.Children.map(props.children, (child: any) => {
if(child && child.type) {
return (
<TabPane tab={child.props.tab}>
{child}
</TabPane>
)
} else {
return child
}
})
return (
<Card bodyStyle={{padding: '10px 24px 24px 24px'}}>
<Tabs>
{newChildren}
</Tabs>
</Card>
)
}
export default ReceiptDeliveryDetailsCard
\ No newline at end of file
import React from 'react';
import { Table } from 'antd';
import { ColumnsType } from 'antd/es/table';
interface Iprops {
tab: string,
columns: ColumnsType<any>,
dataSource: any[],
}
const StatisticsTab: React.FC<Iprops> = (props) => {
const { columns, dataSource } = props;
return (
<Table rowKey={"id"} columns={columns} dataSource={dataSource} />
)
}
export default StatisticsTab
\ No newline at end of file
import React, { useEffect, useState } from 'react';
import { Card, Tabs, Table, Radio, Row, Col, Popconfirm } from 'antd';
import styles from './index.less';
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, outerStatus } = props;
const [activeBatch, setActiveBatch] = useState(0);
const [activeData, setActiveData] = useState<any>({});
const [currentTarget, setCurrentTarget] = useState("deliverStatus");
useEffect(() => {
if(pnoReceiveDeliverDetailDOList && pnoReceiveDeliverDetailDOList.length > 0) {
setActiveData(pnoReceiveDeliverDetailDOList[0])
}
}, [pnoReceiveDeliverDetailDOList])
const handleOnChange = (e) => {
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>
<TabPane tab="收发货统计" key="1">
<Table rowKey={"id"} columns={statisticsColumn} dataSource={statisticsData} />
</TabPane>
<TabPane tab="收发货明细" key="2">
<div >
<Radio.Group value={activeBatch} onChange={handleOnChange}>
{
pnoReceiveDeliverDetailDOList && pnoReceiveDeliverDetailDOList.map((item, key) => {
return (
<Radio.Button key={item.deliveryBatch} value={key}>{item.deliveryBatch} 批次</Radio.Button>
)
})
}
</Radio.Group>
</div>
<div >
<div className={styles.header}>
<Row>
<Col span={6}>
<div className={styles.detailItem}>
<span className={styles.title}>发货单号</span>
<a className={styles.value}>{activeData.deliveryNo}</a>
</div>
<div>
<span className={styles.title}>发货时间</span>
<span className={styles.value}>{activeData.deliveryTime && moment(activeData.deliveryTime).format(format)}</span>
</div>
</Col>
<Col span={6}>
<div className={styles.detailItem}>
<span className={styles.title}>物流单号</span>
<a className={styles.value}>{activeData.logisticsOrderNo}</a>
</div>
<div>
<span className={styles.title}>物流公司</span>
<span className={styles.value}>{activeData.logisticsCompany}</span>
</div>
</Col>
<Col span={6}>
<div className={styles.detailItem}>
<span className={styles.title}>入库单号</span>
<span className={styles.value}>{activeData.storageNo}</span>
</div>
<div>
<span className={styles.title}>入库时间</span>
<span className={styles.value}>{activeData.storageTime && moment(activeData.storageTime).format(format)}</span>
</div>
</Col>
<Col span={4} className={styles.status}>
<div>
<span className={styles.title}>内部状态</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}>
<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>
<Table
dataSource={activeData.pnoReceiveDeliverDetailProductBOList}
rowKey={"orderNo"}
columns={pnoReceiveDeliverDetailColumns}
/>
</div>
</TabPane>
</Tabs>
</Card>
)
}
export default ReceiptDeliveryDetails;
\ No newline at end of file
import ReceiptDeliveryDetailsCard from './ReceiptDeliveryDetailsCard';
import DetailTab from './DetailTab';
import StatisticsTab from './StatisticsTab';
export {
ReceiptDeliveryDetailsCard,
DetailTab,
StatisticsTab
}
\ No newline at end of file
......@@ -2,9 +2,10 @@ import React, { useCallback } from 'react';
import AbilityContainer from './Container';
import { Row, Col, Skeleton } from 'antd';
import styles from './center.less'
import create_shop from '@/assets/imgs/create_shop.png';
import { PublicApi } from '@/services/api';
import { Link } from 'umi'
import Authorize from '../Authorize';
import { getAuth } from '@/utils/auth';
interface Iprops {};
......@@ -16,8 +17,12 @@ const KEY_TITLE = {
returnApplyList: '售后退货申请',
returnHandleList: '售后退货处理'
}
const EXCHANGE_APPLICATION = `/memberCenter/afterService/exchangeApplication/exchangeQuery`
const EXCHANGE_HANDLE = '/memberCenter/afterService/exchangeManage/exchangeQuery';
const SettlementAbility: React.FC<Iprops> = () => {
const auth = getAuth();
const roleType = auth.memberRoleType;
const request = useCallback(async () => {
const res = await PublicApi.getReportMemberHomeGetAfterSaleTally();
return res;
......@@ -28,7 +33,13 @@ const SettlementAbility: React.FC<Iprops> = () => {
title="售后中心"
tips="轻松完成订单售后在线换货、退货、维修环节"
extra={
<a>进入售后中心</a>
<Authorize
url={roleType == 1 ? EXCHANGE_HANDLE : EXCHANGE_APPLICATION}
>
<div>
<Link to={roleType == 1 ? EXCHANGE_HANDLE : EXCHANGE_APPLICATION}>进入交易中心</Link>
</div>
</Authorize>
}
request={request}
>
......
......@@ -7,8 +7,11 @@ import logistics_address from '@/assets/imgs/logistics_address.png';
import logistics_cost from '@/assets/imgs/logistics_cost.png';
import { PublicApi } from '@/services/api';
import { Skeleton, Row, Col } from 'antd';
import { Link } from 'umi';
import Authorize from '../Authorize';
interface Iprops {};
const url = '/memberCenter/logisticsAbility/logisticsResult/orderResultSearchList';
const LogisticsCenter: React.FC<Iprops> = () => {
const request = useCallback(async () => {
......@@ -43,7 +46,13 @@ const LogisticsCenter: React.FC<Iprops> = () => {
title="物流中心"
tips={"快速完成物流派单、接单、报价、物流信息对接"}
extra={
<a>进入物流中心</a>
<Authorize
url={url}
>
<div>
<Link to={url}>进入物流中心</Link>
</div>
</Authorize>
}
request={request}
>
......
......@@ -4,8 +4,11 @@ import { Row, Col,Skeleton } from 'antd';
import styles from './center.less';
import { PublicApi } from '@/services/api'
import { Link } from 'umi'
import Authorize from '../Authorize';
interface Iprops {};
const url = '/memberCenter/handling/assign/query'
const KEY_TITLE = {
processList: '指派生产通知单',
supplierList: '生产通知单处理'
......@@ -22,7 +25,13 @@ const ProcessCenter: React.FC<Iprops> = () => {
title="加工中心"
tips="提供外发生产、加工、装配全流程环节管控"
extra={
<a>进入加工中心</a>
<Authorize
url={url}
>
<div>
<Link to={url}>加工中心</Link>
</div>
</Authorize>
}
request={request}
>
......
......@@ -4,9 +4,14 @@ import { Row, Col, Space, Skeleton } from 'antd';
import styles from './center.less';
import { PublicApi } from '@/services/api';
import { Link } from 'umi';
import Authorize from '../Authorize';
interface Iprops {};
const ADD_REPOSITORIES = '/memberCenter/commodityAbility/repositories/add';
const ADD_BRAND = "/memberCenter/commodityAbility/trademark/add";
const ADD_PRODUCT = '/memberCenter/commodityAbility/commodity/products/add';
const ProductCenter: React.FC<Iprops> = () => {
const request = useCallback(async () => {
const res = await PublicApi.getReportMemberHomeGetCommodityTally();
......@@ -17,10 +22,29 @@ const ProductCenter: React.FC<Iprops> = () => {
tips="快速完成品牌、商品创建、发布、提供灵活的商品库存管理"
title="商品中心"
extra={
<Space>
<a>设置库存</a>
<a>创建品牌</a>
<a>创建商品</a>
<Authorize
url={ADD_REPOSITORIES}
>
<div>
<Link to={ADD_REPOSITORIES}>设置库存</Link>
</div>
</Authorize>
<Authorize
url={ADD_BRAND}
>
<div>
<Link to={ADD_BRAND}>创建品牌</Link>
</div>
</Authorize>
<Authorize
url={ADD_PRODUCT}
>
<div>
<Link to={ADD_PRODUCT}>创建商品</Link>
</div>
</Authorize>
</Space>
}
request={request}
......
......@@ -4,6 +4,8 @@ import { Row, Col, Skeleton } from 'antd';
import styles from './center.less'
import { PublicApi } from '@/services/api';
import { Link } from 'umi'
import Authorize from '../Authorize';
import { getAuth } from '@/utils/auth';
interface Iprops {};
const KEY_TITLE = {
'commodityInquiryList': '商品询价',
......@@ -16,7 +18,12 @@ const KEY_TITLE = {
'purchaseOrderList': '采购订单'
}
const PURCHASE_URL = '/memberCenter/tranactionAbility/purchaseOrder/orderList';
const SALE_URL = '/memberCenter/tranactionAbility/saleOrder/orderList';
const TradeCenter: React.FC<Iprops> = () => {
const auth = getAuth();
const roleType = auth.memberRoleType;
const request = useCallback(async () => {
const res = await PublicApi.getReportMemberHomeGetTradeTally();
return res;
......@@ -26,9 +33,14 @@ const TradeCenter: React.FC<Iprops> = () => {
title="交易中心"
tips="提供在线发布需求,在线询价、在线报价、订单交易、签订电子合同等功能"
extra={
<div>
<a>进入交易中心</a>
</div>
<Authorize
url={roleType == 1 ? SALE_URL : PURCHASE_URL}
>
<div>
<Link to={roleType == 1 ? SALE_URL : PURCHASE_URL}>进入交易中心</Link>
</div>
</Authorize>
}
request={request}
>
......
......@@ -46,8 +46,13 @@ const UserCenter: React.FC<Iprops> = () => {
<div className={styles.content}>
<Row className={styles.row}>
<Col span={11} className={styles.user}>
<div className={styles.pic} style={!userAuth.logo ? {display: 'none'} : {}}>
<img src={userAuth.logo} />
<div className={styles.pic} >
{
userAuth.logo
? <img src={userAuth.logo || ''} />
: <div></div>
}
</div>
<div className={styles.wrapper}>
<div className={styles.company}>
......
......@@ -35,7 +35,6 @@ const Home: React.FC<{}> = () => {
PublicApi.getReportMemberHomeGetDataLayout()
.then(({data, code}) => {
if(code === 1000) {
console.log(data);
setLayout(data)
}
}).finally(() => {
......@@ -55,7 +54,7 @@ const Home: React.FC<{}> = () => {
return (
<PageHeaderWrapper>
<>
<div className={styles.userGuaid} style={{display: visible ? 'block': 'none'}}>
<div className={styles.userGuaid} style={{display: visible ? 'none': 'none'}}>
<UseGuaid/>
</div>
<div className={styles.main}>
......
......@@ -43,7 +43,7 @@ const ShoppingNews: React.FC = () => {
item.map((item, index) => (
<div className={styles.popular_buy_dynamic_list_item} key={`popular_buy_dynamic_list_item_${index}`}>
<div className={styles.popular_buy_dynamic_list_item_header}>
<Link to={`/memberCenter/tranactionAbility/enquirySubmit/viewEnquiryDetail?id=${item.id}`}>{item.details}</Link>
<Link to={`/memberCenter/tranactionAbility/enquiryOffer/enquirySearch/preview?id=${item.id}`}>{item.details}</Link>
<div className={cx(styles.status_tag, item.state === 1 ? styles.success : '')}>{item.state === 1 ? '已完成' : '比价中'}</div>
</div>
<div className={styles.popular_buy_dynamic_list_item_content}>
......
......@@ -332,7 +332,7 @@ const Order: React.FC<OrderPropsType> = (props) => {
if (selectPayWay.payType === 4) {
linkToUrl(`/pay/result?orderId=${data.orderId}`)
} else {
linkToUrl(`/pay?orderId=${data.orderId}&spam_id=${spam_id}`)
linkToUrl(`/pay?orderId=${btoa(JSON.stringify({orderId: data.orderId, memberId: orderInfo.supplyMembersId, memberRoleId: orderInfo.supplyMembersRoleId}))}`)
}
}
setConfirmLoading(false)
......
......@@ -15,7 +15,7 @@ import styles from './index.less'
interface BablancePayWayPropsType {
payInfo: GetOrderOrderPayDetailsResponse,
orderInfo: any,
queryParam: any,
orderId: number,
onChange: Function,
layoutType?: LAYOUT_TYPE,
......@@ -23,7 +23,7 @@ interface BablancePayWayPropsType {
}
const BablancePayWay: React.FC<BablancePayWayPropsType> = (props) => {
const { payInfo, orderId, orderInfo, layoutType, shopUrlParam, onChange } = props
const { payInfo, orderId, queryParam, layoutType, shopUrlParam, onChange } = props
const [balanceInfo, setBalanceInfo] = useState<GetPayAssetAccountGetUserBalanceResponse>(0)
const [securityInfo, setSecurityInfo] = useState<GetMemberSecurityGetResponse>()
const [payPassword, setPayPassword] = useState<string>('')
......@@ -36,17 +36,17 @@ const BablancePayWay: React.FC<BablancePayWayPropsType> = (props) => {
}
useEffect(() => {
if (orderInfo && payInfo) {
if (queryParam && payInfo) {
fetchBalanceInfo()
fetchSecurity()
}
}, [orderInfo, payInfo])
}, [queryParam, payInfo])
const fetchBalanceInfo = () => {
const param: any = {
payType: payInfo.ruleConfigurationId,
parentMemberId: orderInfo.supplyMembersId,
parentMemberRoleId: orderInfo.supplyMembersRoleId
parentMemberId: queryParam.memberId,
parentMemberRoleId: queryParam.memberRoleId
}
PublicApi.getPayAssetAccountGetUserBalance(param).then(res => {
......
......@@ -15,7 +15,7 @@ import { message, Button, Spin } from 'antd'
interface CreditPayWayPropsType {
payInfo: GetOrderOrderPayDetailsResponse,
orderInfo: any,
queryParam: any,
orderId: number,
onChange: Function,
layoutType?: LAYOUT_TYPE,
......@@ -23,9 +23,8 @@ interface CreditPayWayPropsType {
}
const CreditPayWay: React.FC<CreditPayWayPropsType> = (props) => {
const { payInfo, orderId, orderInfo, layoutType, shopUrlParam } = props
const { payInfo, orderId, queryParam, layoutType, shopUrlParam } = props
const [payPassword, setPayPassword] = useState<string>('')
const [type, setType] = useState<string>('normal') // normal: 普通;member:会员
const [creditInfo, setCreditInfo] = useState<GetPayCreditGetCreditResponse>()
const [confirmLoading, setConfirmLoading] = useState<boolean>(false)
const [securityInfo, setSecurityInfo] = useState<GetMemberSecurityGetResponse>()
......@@ -37,16 +36,16 @@ const CreditPayWay: React.FC<CreditPayWayPropsType> = (props) => {
}
useEffect(() => {
if (orderInfo) {
if (queryParam) {
fetchCreditInfo()
fetchSecurity()
}
}, [orderInfo])
}, [queryParam])
const fetchCreditInfo = () => {
const param: any = {
parentMemberId: orderInfo.supplyMembersId,
parentMemberRoleId: orderInfo.supplyMembersRoleId
parentMemberId: queryParam.memberId,
parentMemberRoleId: queryParam.memberRoleId
}
PublicApi.getPayCreditGetCredit(param).then(res => {
if (res.code === 1000) {
......
......@@ -14,7 +14,7 @@ import styles from './index.less'
interface PointPayWayPropsType {
payInfo: GetOrderOrderPayDetailsResponse,
orderInfo: any,
queryParam: any,
orderId: number,
onChange: Function,
layoutType?: LAYOUT_TYPE,
......@@ -22,7 +22,7 @@ interface PointPayWayPropsType {
}
const PointPayWay: React.FC<PointPayWayPropsType> = (props) => {
const { payInfo, orderId, orderInfo, layoutType, onChange, shopUrlParam } = props
const { payInfo, orderId, queryParam, layoutType, onChange, shopUrlParam } = props
const [securityInfo, setSecurityInfo] = useState<GetMemberSecurityGetResponse>()
const [payPassword, setPayPassword] = useState<string>('')
const [pointInfo, setPointInfo] = useState<GetMemberBusinessLrcRightPointGetResponse>()
......@@ -40,16 +40,16 @@ const PointPayWay: React.FC<PointPayWayPropsType> = (props) => {
}
useEffect(() => {
if (orderInfo) {
if (queryParam) {
fetchPointInfo()
fetchSecurity()
}
}, [orderInfo])
}, [queryParam])
const fetchPointInfo = () => {
const param: any = {
memberId: orderInfo.supplyMembersId,
roleId: orderInfo.supplyMembersRoleId
memberId: queryParam.memberId,
roleId: queryParam.memberRoleId
}
PublicApi.getMemberBusinessLrcRightPointGet(param).then(res => {
......
......@@ -12,7 +12,6 @@ import { useState } from 'react'
interface WechatPayWayPropsType {
payInfo: GetOrderOrderPayDetailsResponse,
orderInfo: any,
orderId: number,
onChange: Function,
layoutType?: LAYOUT_TYPE,
......@@ -20,7 +19,7 @@ interface WechatPayWayPropsType {
}
const WechatPayWay: React.FC<WechatPayWayPropsType> = (props) => {
const { payInfo, orderId, onChange, orderInfo, layoutType, shopUrlParam } = props
const { payInfo, orderId, onChange, layoutType, shopUrlParam } = props
const [wechatPayUrl, setWechatPayUrl] = useState<any>('')
const [pageLoading, setPageLoading] = useState<boolean>(true)
let checkCount = 0
......@@ -64,7 +63,7 @@ const WechatPayWay: React.FC<WechatPayWayPropsType> = (props) => {
}
const checkPayState = () => {
if (checkCount < 20) {
if (checkCount < 24) {
let param = {
id: Number(orderId),
paymentInformationId: payInfo.paymentInformationId,
......@@ -82,7 +81,7 @@ const WechatPayWay: React.FC<WechatPayWayPropsType> = (props) => {
checkCount++
checkTimer = setTimeout(() => {
checkPayState()
}, 8000)
}, 5000)
}
} else {
message.error(res.message)
......
......@@ -51,32 +51,32 @@ const getPayTypeTitle = (type) => {
const PayPage: React.FC<PayPagePropsType> = (props) => {
const { shopInfo, mallInfo, layoutType } = props
const [payState, setPayState] = useState<boolean>(false)
const { orderId, spam_id } = props.location.query
const { orderId } = props.location.query
const [pageTitle, setPageTitle] = useState<string>()
const [loading, setLoading] = useState<boolean>(true)
const [payType] = useState<string | number>(PayWayType.bank)
const [payInfo, setPayInfo] = useState<GetOrderOrderPayDetailsResponse>()
const [errMsg, setErrMsg] = useState<string>('')
const OrderStore = useLocalStore(() => store.OrderStore)
const [orderInfo, setOrderInfo] = useState<any>({})
const { getOrderInfo } = OrderStore
const [query, setQuery] = useState<any>({})
useEffect(() => {
initOrderInfo()
if (orderId) {
fetchOrderInfo()
try {
let queryParam: any = orderId ? atob(orderId) : undefined
queryParam = queryParam ? JSON.parse(queryParam) : {}
setQuery(queryParam)
} catch (error) {
console.log(error)
setLoading(false)
}
}, [])
const initOrderInfo = async () => {
if (spam_id) {
const sessionOrderInfo: any = await getOrderInfo(spam_id)
setOrderInfo(sessionOrderInfo)
useEffect(() => {
if (query.orderId) {
fetchOrderInfo()
}
}
}, [query])
const fetchOrderInfo = () => {
PublicApi.getOrderOrderPayDetails({ id: orderId }).then(res => {
PublicApi.getOrderOrderPayDetails({ id: query.orderId }).then(res => {
message.destroy()
setLoading(false)
if (res.code === 1000) {
......@@ -91,7 +91,6 @@ const PayPage: React.FC<PayPagePropsType> = (props) => {
}
const handlePayChangge = (state, errMsg?) => {
console.log(state, "state")
setPayState(state)
errMsg && setErrMsg(errMsg)
}
......@@ -103,17 +102,17 @@ const PayPage: React.FC<PayPagePropsType> = (props) => {
switch (payInfo.paymentChannelsId) {
case PayWayType.point:
return <PointPayWay payInfo={payInfo} orderInfo={orderInfo} orderId={orderId} onChange={(state, errMsg) => handlePayChangge(state, errMsg)} {...props} />
return <PointPayWay payInfo={payInfo} queryParam={query} orderId={query.orderId} onChange={(state, errMsg) => handlePayChangge(state, errMsg)} {...props} />
case PayWayType.balance:
return <BablancePayWay payInfo={payInfo} orderInfo={orderInfo} orderId={orderId} onChange={(state, errMsg) => handlePayChangge(state, errMsg)} {...props} />
return <BablancePayWay payInfo={payInfo} queryParam={query} orderId={query.orderId} onChange={(state, errMsg) => handlePayChangge(state, errMsg)} {...props} />
case PayWayType.credit:
return <CreditPayWay payInfo={payInfo} orderInfo={orderInfo} orderId={orderId} onChange={(state, errMsg) => handlePayChangge(state, errMsg)} {...props} />
return <CreditPayWay payInfo={payInfo} queryParam={query} orderId={query.orderId} onChange={(state, errMsg) => handlePayChangge(state, errMsg)} {...props} />
case PayWayType.wechat:
return <WechatPayWay payInfo={payInfo} orderInfo={orderInfo} orderId={orderId} onChange={(state, errMsg) => handlePayChangge(state, errMsg)} {...props} />
return <WechatPayWay payInfo={payInfo} orderId={query.orderId} onChange={(state, errMsg) => handlePayChangge(state, errMsg)} {...props} />
case PayWayType.bank:
return <BankPayWay />
case PayWayType.transfer:
return <TransferPayWay payInfo={payInfo} orderId={orderId} onChange={(state, errMsg) => handlePayChangge(state, errMsg)} {...props} />
return <TransferPayWay payInfo={payInfo} orderId={query.orderId} onChange={(state, errMsg) => handlePayChangge(state, errMsg)} {...props} />
default:
return null
}
......
......@@ -31,7 +31,7 @@ const PurchaseOnline: React.FC<PurchaseOnlinePropsType> = (props) => {
const [loading, setLoading] = useState<boolean>(true)
const [commodityList, setCommodityList] = useState<GetOrderRequisitionFormOnlineShoppingListResponseDetail[]>([])
const [current, setCurrent] = useState<number>(1)
const [pageSize] = useState<number>(20)
const [pageSize] = useState<number>(21)
const [totalCount, setTotalCount] = useState<number>(0)
const filterConfig = [FILTER_TYPE.category, FILTER_TYPE.useArea]
......
......@@ -31,7 +31,7 @@ const CommodityList: React.FC<CommodityListPropsType> = (props) => {
commodityList.map((item, index) => (
<div key={item.id} className={cx(styles.purchase_list_item, styles.row)}>
<div className={styles.purchase_list_item_title}>
<Link to={`/memberCenter/tranactionAbility/enquiryOffer/toAddSubmitList/rfq/preview?id=${item.id}`}>{item.details}</Link>
<Link to={`/memberCenter/tranactionAbility/enquiryOffer/enquirySearch/preview?id=${item.id}`}>{item.details}</Link>
</div>
<div className={styles.purchase_list_item_info_box}>
<div className={styles.purchase_list_item_info_line}>
......
......@@ -52,7 +52,7 @@ const CommodityList: React.FC<CommodityListPropsType> = (props) => {
<div className={styles.shop_list_info_box}>
<div className={styles.shop_list_info_name}>
<Link to={`/shop?shopId=${btoa(JSON.stringify({ shopId: item.id, memberId: item.memberId }))}`}>{item.memberName}</Link>
<span className={styles.shop_list_info_city}>{item.memberShopAreas}</span>
<span className={styles.shop_list_info_city}>{item.areas}</span>
</div>
<div className={styles.shop_list_info_about}>
<div className={styles.shop_list_info_about_item}>
......
......@@ -47,15 +47,20 @@ const MemberUpgradeRule: React.FC<[]> = () => {
align: 'center',
},
{
title: '项目',
title: '升级规则',
dataIndex: 'ruleName',
align: 'center',
render: (text: any, record: any) => <span>{text}</span>,
},
{
title: '项目说明',
title: '升级规则说明',
dataIndex: 'remark',
align: 'center',
ellipsis: true,
},
{
title: '适用会员等级类型',
dataIndex: 'levelTypeName',
align: 'center',
},
{
title: '可获取的分值',
......
......@@ -32,7 +32,7 @@ const OrderElectronModal:React.FC<OrderElectronModalProps> = (props) => {
params.contractName = data.electronicContractName
params.contractUrl = data.electronicContractUrl
} else {
params.id = parseInt(data.signatureLogId)
params.id = parseInt(data.id)
}
const res = await run(params)
if (res.code === 1000) {
......
......@@ -99,4 +99,30 @@
}
}
}
// 扫码
.qrCodeImage {
text-align: center;
width: 224px;
height: 224px;
margin: 20px auto 42px;
&>img {
display: block;
width: 100%;
height: 100%;
}
}
.scanTips {
display: flex;
justify-content: center;
align-items: center;
color: #6b778c;
margin-bottom: 18px;
.scanIcon {
font-size: 30px;
margin-right: @margin-sm;
}
}
\ No newline at end of file
......@@ -3,13 +3,14 @@ import { Modal, Steps, Row, Col, Spin, message, Upload, Button, Input } from 'an
import style from './index.less'
import { OrderDetailContext } from '../../_public/order/context'
import cx from 'classnames'
import { UploadOutlined } from '@ant-design/icons'
import { ScanOutlined, UploadOutlined } from '@ant-design/icons'
import { UPLOAD_TYPE } from '@/constants'
import { usePageStatus } from '@/hooks/usePageStatus'
import { PublicApi } from '@/services/api'
import { history } from 'umi'
import { useHttpRequest } from '@/hooks/useHttpRequest'
import { encryptedByAES } from '@/utils/cryptoAes'
import QRCode from 'qrcode'
export interface OrderPayModalProps {
currentRef: any,
......@@ -79,7 +80,9 @@ const OrderPayModal: React.FC<OrderPayModalProps> = (props) => {
const [checked, setChecked] = useState<any>({})
const [current, setCurrent] = useState(0) // 0选择方式 1线下支付方式 2授信支付 3余额支付 4微信支付 5货到付款 1000清除
const [payStep, setPayStep] = useState(0) // 支付模态框的步骤 0选方式 1下一步的具体操作 2输入支付密码
const mobilePayFlag = useRef(0) // 用于判断移动支付类型 4微信
const [code, setCode] = useState('')
const [qrCodeInfo, setQrCodeInfo] = useState({ generateCharacter: '', qrUrl: '' })
const [number, setNumber] = useState([0,1,2,3,4,5])
const { currentRef, confirm } = props
const [isSpin, setIsSpin] = useState<boolean>(false)
......@@ -103,6 +106,24 @@ const OrderPayModal: React.FC<OrderPayModalProps> = (props) => {
}
}, [visible])
useEffect(() => {
if(qrCodeInfo.generateCharacter){
generateQrCode()
}
}, [qrCodeInfo.generateCharacter])
const generateQrCode = () => {
// 生成二维码
QRCode.toDataURL(qrCodeInfo.generateCharacter).then((url:any) => {
setQrCodeInfo({...qrCodeInfo, qrUrl: url})
// 轮询支付结果
// setOpenTimer(1)
})
.catch((err:any) => {
console.error(err)
})
}
const handleConfirm = () => {
console.log(data,'data')
if (current === 0) {
......@@ -147,13 +168,15 @@ const OrderPayModal: React.FC<OrderPayModalProps> = (props) => {
console.log('选择了货到付款')
setCurrent(5)
setPayStep(1)
}
// else if(checked.id === 2) {
// console.log('选择了微信支付')
// setCurrent(4)
// setPayStep(1)
// handleSubmitPay()
// }
} else if(checked.id === 2) {
console.log('选择了微信支付')
// 跳转扫码支付
history.push(`/pay?orderId=${btoa(JSON.stringify({ orderId: id, memberId: data.supplyMembersId, memberRoleId: data.supplyMembersRoleId }))}`)
// mobilePayFlag.current = 4
// setCurrent(4)
// setPayStep(1)
// handleSubmitPay()
}
else {
message.error('暂只支持线下支付、授信额度支付、余额支付方式、货到付款')
}
......@@ -232,12 +255,15 @@ const OrderPayModal: React.FC<OrderPayModalProps> = (props) => {
params.payOrderUrls = payOrderUrls.join(',')
}
console.log(current, payStep,'666',mobilePayFlag)
const res = await run(params)
if (res.code === 1000) {
if(current != 4) {
if(mobilePayFlag.current !== 4) {
history.goBack()
} else {
console.log(res, '二维码信息')
setQrCodeInfo({ ...qrCodeInfo, generateCharacter: res.data })
}
}
}
......@@ -433,9 +459,12 @@ const OrderPayModal: React.FC<OrderPayModalProps> = (props) => {
{
current === 4 &&
<div>
<p>微信扫码支付</p>
<div>
<div className={style.qrCodeImage}>
<img src={qrCodeInfo.qrUrl} alt=""/>
<div className={style.scanTips}>
<ScanOutlined className={style.scanIcon} />
<span>打开 {mobilePayFlag.current === 4 ? '微信' : '支付宝'}App<br />扫码完成支付</span>
</div>
</div>
</div>
}
......
......@@ -8,6 +8,7 @@ import { useUpdate } from '@umijs/hooks';
import { PublicApi } from '@/services/api';
import { filterProductDataById } from '../components/productModalTable'
import { getUnitPriceTotal } from '../model/useProductTable';
import { toPercent } from '@/utils/type';
// 异步填充表格字段
const asyncPadDataForProduct = async (ctx: ISchemaFormActions | ISchemaFormAsyncActions, productValue: any) => {
......@@ -124,13 +125,14 @@ export const useOrderFormInitEffect = (ctx: ISchemaFormActions | ISchemaFormAsyn
state.props.enum = state.props.enum.map(v => {
const assign: any = Object.assign({}, v)
// 过滤服务提供者
if (auth.memberRoleType === 2) {
if (auth.memberRoleType === 2) { // 采购商
// 企业+个人
if ((auth.memberType === 1 || auth.memberType === 2) && assign.value > 9) {
// if ((auth.memberType === 1 || auth.memberType === 2) && (assign.value > 9 && assign.value !== 24)) {
if ((auth.memberType === 1 || auth.memberType === 2) && assign.value > 9) {
assign.disabled = true
}
// 渠道(企业+个人)
if ((auth.memberType === 3 || auth.memberType === 4) && assign.value < 10) {
if ((auth.memberType === 3 || auth.memberType === 4) && assign.value < 10) {
assign.disabled = true
}
// 商城下单
......@@ -176,6 +178,8 @@ export const useOrderFormInitEffect = (ctx: ISchemaFormActions | ISchemaFormAsyn
money: v.count * v.unitPrice,
productId: v.id,
memberId: initValue.supplyMembersId, // 添加 memberId 字段
commodityId: v.id, // 添加commodityId用于判断是商品价格是使用price字段还是unitPrice字段(也可判断是报价订单还是其他)
memberPrice: v.memberDiscount !== 1 ? toPercent(v.memberDiscount) : 1, // 添加会员折扣
}
})))
}
......
......@@ -7,14 +7,26 @@ import { useModalTable } from './useModalTable';
import { usePageStatus, PageStatus } from '@/hooks/usePageStatus';
import { toPoint } from '@/utils/type';
// 对象按key排序(运用于商城传过来的阶梯价格排序)
export const sortByKey = (params) => {
let keys = Object.keys(params).sort((x,y)=> parseInt(x) - parseInt(y));
let newParams = {};
keys.forEach((key) => {
newParams[key] = params[key];
});
return newParams;
}
export const getUnitPriceTotal = (record) => {
const purchaseCount = Number(record['purchaseCount']) || 0
console.log(record,purchaseCount,'rrr')
// fix 当没有传递unitPrice字段时 自动容错, 单价显示为0
record.unitPrice = record.unitPrice || record.price || 0
if (typeof record.unitPrice === 'number') {
return record.unitPrice * purchaseCount
}
if(record.unitPrice) {
record.unitPrice = sortByKey(record.unitPrice)
}
let unitPrice = 0
Object.entries(record.unitPrice).forEach(([key, value]) => {
const [min, max] = key.split('-').map(v => Number(v))
......@@ -29,7 +41,6 @@ export const getUnitPriceTotal = (record) => {
}
})
// 考虑会员折扣
console.log('算价格', record.memberPrice)
let memberPrice = record.memberPrice !== 1 ? toPoint(record.memberPrice) : 1
return unitPrice * purchaseCount * memberPrice
}
......
......@@ -153,7 +153,12 @@ export const useSelfTable = (props) => {
render: (text, record) => <>
{
record.currentPayments !== record.sum &&
(record.externalState === PurchaseOrderOutWorkState.PAY_ORDER || record.externalState === PurchaseOrderOutWorkState.CONFIRM_NOT_ARRIVED_ACCOUNT) &&
(
record.externalState === PurchaseOrderOutWorkState.PAY_ORDER ||
record.externalState === PurchaseOrderOutWorkState.CONFIRM_NOT_ARRIVED_ACCOUNT ||
record.externalState === PurchaseOrderOutWorkState.NOT_PAYMENT_FINAL ||
record.externalState === PurchaseOrderOutWorkState.CONFIRM_WITHOUT_ARRIVED_ACCOUNT
) &&
<Link to={`/memberCenter/tranactionAbility/purchaseOrder/readyPayOrder/detail?id=${record.id}`}>去支付</Link>
}
{
......
......@@ -33,17 +33,17 @@ const ReadyConfirmOrderDetail: React.FC = () => {
// 提交表单
const handleSubmit = useCallback(() => {
const handleSubmit = () => {
approvedRef.current.actions.submit().then(async (v) => {
const params = {
id: Number(id),
state: v.values.state,
cause: v.values.cause,
}
if(v.values.state) { // 通过
if(formContext.data.usingElectronicContracts && v.values.state) { // 使用合同 并且通过
approvedRef.current.setVisible(false)
electronRef.current.setVisible(true)
} else { // 不通过
} else {
const result = await run(params)
if (result.code === 1000) {
......@@ -51,10 +51,8 @@ const ReadyConfirmOrderDetail: React.FC = () => {
history.goBack()
}
}
console.log(params, v, 'v', approvedRef.current, electronRef.current)
})
}, [])
}
return (
<div>
......
......@@ -330,6 +330,8 @@ const BillsForm: React.FC<BillsFormProps> = ({
] :
[]
,
deliveryType,
transport: DELIVERY_TYPE[deliveryType],
});
}).finally(() => {
setInfoLoading(false);
......@@ -374,6 +376,8 @@ const BillsForm: React.FC<BillsFormProps> = ({
] :
[]
,
deliveryType,
transport: DELIVERY_TYPE[deliveryType],
});
}).finally(() => {
setInfoLoading(false);
......@@ -383,7 +387,59 @@ const BillsForm: React.FC<BillsFormProps> = ({
// 退货发货单
case DOC_TYPE_RETURN_INVOICE: {
switch (+relevanceInvoices) {
// 换货申请单
case DEPENDENT_DOC_EXCHANGE: {
setInfoLoading(true);
PublicApi.getAsReplaceGoodsGetDetailByConsumer({
replaceId: relevanceInvoicesId,
}).then(res => {
if (res.code !== 1000) {
return;
}
const {
supplierName,
returnGoodsAddress,
applyNo,
parentMemberId,
parentMemberRoleId,
} = res.data;
setBillInfo({
invoicesTypeId: intInvoicesTypeId,
relevanceInvoices: +relevanceInvoices,
orderNo:
relevanceInvoicesId ?
[
{
orderNo: applyNo,
id: +relevanceInvoicesId,
deliveryAddresId: returnGoodsAddress.receiveId,
memberName: supplierName,
fullAddress: returnGoodsAddress.receiveAddress || '',
receiverName: returnGoodsAddress.receiveUserName || '',
phone: returnGoodsAddress.receiveUserTel || '',
}
] :
[]
,
deliveryType: returnGoodsAddress.deliveryType,
transport: DELIVERY_TYPE[returnGoodsAddress.deliveryType],
supplyMembersName: supplierName,
supplyMembersId: parentMemberId,
supplyMembersRoleId: parentMemberRoleId,
});
}).finally(() => {
setInfoLoading(false);
});
break;
}
// 退货申请单
case DEPENDENT_DOC_RETURN: {
break;
}
}
break;
}
......@@ -443,6 +499,7 @@ const BillsForm: React.FC<BillsFormProps> = ({
const handleSubmit = value => {
const {
invoicesTypeId,
invoicesTypeCode,
orderNo,
transactionTime,
address,
......@@ -461,8 +518,6 @@ const BillsForm: React.FC<BillsFormProps> = ({
}));
const newTransactionTime = transactionTime ? moment(transactionTime).valueOf() : null;
console.log('value', value);
setSubmitLoading(true);
switch (invoicesTypeId) {
// 采购入库单
......@@ -491,7 +546,7 @@ const BillsForm: React.FC<BillsFormProps> = ({
return {
...rest,
...extraRest,
itemNmae: itemName,
goodsName: itemName,
};
}),
supplyMembersName: memberName,
......@@ -533,7 +588,7 @@ const BillsForm: React.FC<BillsFormProps> = ({
return {
...rest,
...extraRest,
itemNmae: itemName,
goodsName: itemName,
};
}),
})
......@@ -578,7 +633,7 @@ const BillsForm: React.FC<BillsFormProps> = ({
return {
...rest,
...extraRest,
itemNmae: itemName,
goodsName: itemName,
};
}),
createMemberName: memberName,
......@@ -620,7 +675,7 @@ const BillsForm: React.FC<BillsFormProps> = ({
return {
...rest,
...extraRest,
itemNmae: itemName,
goodsName: itemName,
};
}),
})
......@@ -709,7 +764,7 @@ const BillsForm: React.FC<BillsFormProps> = ({
...rest
} = item;
return {
...item,
...rest,
produceNoticeOrderDetailId: extraData.id,
orderNo: extraData.orderNo,
processNum: extraData.processNum,
......@@ -739,18 +794,72 @@ const BillsForm: React.FC<BillsFormProps> = ({
break;
}
// 退货发货单
case DOC_TYPE_RETURN_INVOICE: {
break;
}
// 退货入库单
// 退货发货单、退货入库单
case DOC_TYPE_RETURN_INVOICE:
case DOC_TYPE_RETURN_RECEIPT: {
if (!id) {
if (isEdit) {
return;
}
PublicApi.postWarehouseInvoicesAdd({
invoicesTypeCode: invoicesTypeCode,
invoicesAbstract: rest.invoicesAbstract,
memberName: memberName,
inventoryId: rest.inventoryId,
inventoryRole: rest.inventoryRole,
transactionTime: newTransactionTime,
orderNo: orderNo[0].orderNo,
deliveryAddresId: orderNo[0].deliveryAddresId,
receiverName: rest.receiverName,
fullAddress: rest.fullAddress,
phone: rest.phone,
deliveryType: rest.deliveryType,
invoicesDetailsRequests: newInvoicesDetailsRequests.map(item => {
const {
extraData = {},
amount,
productCount,
itemName,
...rest
} = item;
return {
...rest,
goodsName: itemName,
productModel: rest.specifications,
productName: extraData.productName,
storageCount: 0,
shipmentQuantity: productCount,
productCount: extraData.goodsCount,
};
}),
relevanceInvoicesId: orderNo[0].id,
relevanceInvoices: rest.relevanceInvoices,
supplyMembersName: billInfo.supplyMembersName,
supplyMembersId: billInfo.supplyMembersId,
supplyMembersRoleId: billInfo.supplyMembersRoleId,
invoicesTypeId,
})
.then(res => {
if (res.code !== 1000) {
return;
}
setUnsaved(false);
setTimeout(() => {
history.goBack();
}, 800);
}).finally(() => {
setSubmitLoading(false);
});
} else {
// update action
if (!isEdit) {
return;
}
}
break;
}
// 换货发货单
case DOC_TYPE_EXCHANGE_INVOICE: {
......
......@@ -232,6 +232,10 @@ export const addBillSchema: ISchema = {
},
required: true,
},
invoicesTypeCode: {
type: 'string',
display: false,
},
inventoryId: {
type: 'string',
title: '对应仓库',
......
......@@ -34,9 +34,9 @@ const Inventory: React.FC<{}> = () => {
const columns: ColumnType<any>[] = [
{
title: 'ID',
title: '货号',
align: 'center',
dataIndex: 'id',
dataIndex: 'itemNo',
},
{
title: '货品名称',
......
......@@ -11,7 +11,8 @@ export const toPoint = (percent: string) => {
// 小数转分数
export const toPercent = (point: number) => {
let str = Number(point * 100).toFixed(1);
// let str = Number(point * 100).toFixed(1);
let str = Number(point * 100);
str += "%";
return str;
}
\ No newline at end of file
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