Commit 21aae1ff authored by 前端-钟卫鹏's avatar 前端-钟卫鹏
parents 8a90870e 68a7b01c
......@@ -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,
},
]
}
......
......@@ -43,6 +43,13 @@ export default [
},
// 待新增需求单-编辑
{
path: '/memberCenter/tranactionAbility/enquirySubmit/addDemandOrder/edit',
name: 'editEnquiry',
component: '@/pages/transaction/enquirySubmit/addDemandOrder',
hideInMenu: true,
},
// 待新增需求单-编辑
{
path: '/memberCenter/tranactionAbility/enquirySubmit/toAddSubmitList/edit',
name: 'editEnquiry',
component: '@/pages/transaction/enquirySubmit/toAddSubmit/detail',
......
......@@ -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}>
......
......@@ -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: '可获取的分值',
......
import React, { useState, useEffect } from 'react';
import { UPLOAD_TYPE } from '@/constants'
import { Modal, Anchor, Layout, Menu, Form, Divider, Input, Button, Upload, Select, AutoComplete, Cascader, Spin, InputNumber } from 'antd';
import style from '../index.less';
import { LinkOutlined, DeleteOutlined, UploadOutlined } from '@ant-design/icons';
import { PublicApi } from '@/services/api';
const layout: any = {
colon: false,
labelCol: { style: { width: '110px' } },
labelAlign: "left"
};
const { Sider, Content } = Layout;
const { Link } = Anchor;
interface anchorParams {
visible?: boolean,
onOk?: Function,
onCancel?: Function,
fetchdata?: any,
isEdit?: boolean
}
const { Option } = Select;
const ModalAnchor: React.FC<anchorParams> = (props) => {
const { visible, onOk, onCancel, fetchdata, isEdit } = props;
const [form] = Form.useForm();
const [loading, setloading] = useState(false);
const [files, setFiles] = useState([]);
const [categoryById, setCategoryById] = useState<any>({});
const [selected, setselected] = useState<string>('')
const [category, setcategory] = useState<Array<any>>([]);
/**查询品类树 */
const searchCategoryTree = (id: any) => {
return new Promise(resolve => {
PublicApi.getProductPlatformGetCategoryTree({ rootNodeId: id }).then(res => {
if (res.code === 1000) {
resolve(res.data)
}
})
}).then((data: any) => {
setcategory(data)
})
}
/**查询品类信息--包括品类、属性、属性值 */
const getCategoryById = (val:any, selectedOptions?:any) => {
const id = val[val.length -1];
if(!isEdit && selectedOptions.length > 0) {
const name = selectedOptions[selectedOptions.length -1];
setselected(name.title)
}
PublicApi.getProductPlatformGetCategoryById({id}).then(res => {
if(res.code === 1000) {
setCategoryById(res.data)
}
})
}
useEffect(() => {
form.resetFields();
searchCategoryTree('0')
if(Object.keys(fetchdata).length > 0 && isEdit) {
getCategoryById(fetchdata.ids)
const productAttributeJson = JSON.parse(fetchdata.productAttributeJson);
let obj:any = {}
let newObj: any = {}
productAttributeJson.forEach((item:any) => {
obj = {...obj, ...item}
for(let key in obj) {
newObj = {...newObj, ...{
[`${key}__`]: obj[key].join(',')
}}
}
})
form.setFieldsValue({
model: fetchdata.model,
brand: fetchdata.brand,
unit: fetchdata.unit,
purchaseCount: fetchdata.purchaseCount,
name: fetchdata.name,
category: fetchdata.ids,
goodsNo: fetchdata.goodsNo,
specialExplain: fetchdata.specialExplain,
...newObj
})
}
}, [visible])
const onSubmit = (value:any) => {
form.validateFields().then(res => {
const productAttributeJson : Array<any> = [];
for(let key in res) {
if(key.split('__').length > 1) {
const name = key.replace(/__/g, '')
productAttributeJson.push({
[name]: [res[key]]
})
}
}
const data = {
model: res.model,
brand: res.brand,
productAttributeJson: JSON.stringify(productAttributeJson),
unit: res.unit,
purchaseCount: res.purchaseCount,
name: res.name,
category: selected,
goodsNo: res.goodsNo,
ids: res.category,
urls: files,
specialExplain: res.specialExplain,
}
onOk(data)
form.resetFields();
setCategoryById([])
}).catch(error => {
console.log(error)
})
}
return (
<Modal
title='通过平台属性添加'
width='800px'
maskClosable={false}
destroyOnClose
wrapClassName={style.modal_wrap_className}
bodyStyle={{ padding: '0px' }}
visible={visible}
onCancel={() => onCancel()}
onOk={onSubmit}
>
<Layout>
<Sider width={159} className={style.site_layout_background}>
<Anchor
bounds={0}
targetOffset={120}
affix={false}
>
<Menu
mode='inline'
defaultSelectedKeys={['1']}
>
<Menu.Item key="1"><Link href='#basic_info' title='基本信息' /></Menu.Item>
{
Object.keys(categoryById).length > 0 &&
<Menu.Item key="2"><Link href='#category' title={categoryById.name} /></Menu.Item>
}
<Menu.Item key="3"><Link href='#other_demand' title='其他要求' /></Menu.Item>
<Menu.Item key="4"><Link href='#procured_amount' title='采购数量' /></Menu.Item>
</Menu>
</Anchor>
</Sider>
<Content className={style.site_content_style}>
<Form
form={form}
{...layout}
>
<div id='basic_info'>
<div className={style.affix_title}><Divider type="vertical" className={style.divider_style} />基本信息</div>
<Form.Item label='商品品类' name='category' rules={[{ required: true, message: '请选择商品品类' }]}>
<Cascader
options={category}
fieldNames={{ label: 'title', value: 'id', children: 'children' }}
placeholder="请选择品类"
notFoundContent={<Spin size="small" />}
onChange={getCategoryById}
/>
</Form.Item>
<Form.Item label='商品编号' name='goodsNo' rules={[{ required: true, message: '请输入商品编号' }]}><Input /></Form.Item>
<Form.Item label='商品名称' name='name' rules={[{ required: true, message: '请输入商品名称' }]}><Input /></Form.Item>
<Form.Item label='规格型号' name='model' rules={[{ required: true, message: '请输入规格型号' }]}><Input /></Form.Item>
<Form.Item label='规格品牌' name='brand'><Input /></Form.Item>
</div>
{
Object.keys(categoryById).length > 0 &&
<div id='category'>
<div className={style.affix_title}><Divider type="vertical" className={style.divider_style} />{categoryById.name}</div>
{
categoryById.attributeList.length > 0 &&
categoryById.attributeList.map((item:any, index:number) => (
<Form.Item
label={item.groupName}
name={`${item.groupName}__`}
key={item.groupId}
rules={[{ required: item.isEmpty, message: `请选择${item.groupName}` }]}
>
<AutoComplete>
{
item.attributeValueList.map((items:any) => (
<AutoComplete.Option value={items.value} key={items.id}>{items.value}</AutoComplete.Option>
))
}
</AutoComplete>
</Form.Item>
))
}
</div>
}
<div id='other_demand'>
<div className={style.affix_title}><Divider type="vertical" className={style.divider_style} />其他要求</div>
<Form.Item label='特殊说明' name='specialExplain'><Input.TextArea rows={4} /></Form.Item>
<Form.Item label='附件' name='upload'>
<div className={style.upload_data}>
{files.length > 0 && files.map((v, index) => (
<div key={index} className={style.upload_item}>
<div className={style.upload_left}>
<LinkOutlined />
<span>{v.name}</span>
</div>
<div className={style.upload_right}>
<DeleteOutlined />
</div>
</div>
))}
</div>
<Upload
action="/api/file/file/upload"
data={{ fileType: UPLOAD_TYPE }}
showUploadList={false}
accept='.doc,.docx,.pdf,.ppt,.pptx,.xls,.xlsx'
>
<Button loading={loading} icon={<UploadOutlined />}>上传文件</Button>
<div style={{ marginTop: '8px' }}>一次上传一个文件,每个附件大小不能超过 20M</div>
</Upload>
</Form.Item>
</div>
<div id='procured_amount'>
<div className={style.affix_title}><Divider type="vertical" className={style.divider_style} />采购数量</div>
<Form.Item label='单位' name='unit' rules={[{ required: true, message: '请选择单位' }]}><Input /></Form.Item>
<Form.Item label='采购数量' name='purchaseCount' rules={[{ required: true, message: '请输入采购数量' }]}><InputNumber min={1} style={{width: '100%'}} /></Form.Item>
</div>
</Form>
</Content>
</Layout>
</Modal>
)
}
export default ModalAnchor;
\ No newline at end of file
import React, { useState, useEffect } from 'react';
import { UPLOAD_TYPE } from '@/constants'
import { Modal, Anchor, Layout, Menu, Form, Divider, Input, Button, Upload, Cascader, Spin, InputNumber } from 'antd';
import style from '../index.less';
import { LinkOutlined, DeleteOutlined, UploadOutlined } from '@ant-design/icons';
import { PublicApi } from '@/services/api';
import ModalTable from '@/components/ModalTable';
import { ColumnType } from 'antd/lib/table/interface';
import { useRowSelectionTable } from '@/hooks/useRowSelectionTable';
const layout: any = {
colon: false,
labelCol: { style: { width: '110px' } },
labelAlign: "left"
};
const { Sider, Content } = Layout;
const { Link } = Anchor;
interface goodsParams {
visible?: boolean,
onOk?: Function,
onCancel?: Function,
fetchdata?: any,
isEdit?: boolean
}
const ModalGoods: React.FC<goodsParams> = (props) => {
const [form] = Form.useForm();
const { visible, onOk, onCancel, fetchdata, isEdit } = props;
const [loading, setloading] = useState(false);
const [files, setFiles] = useState([]);
const [category, setcategory] = useState<Array<any>>([]);
const [rowSelection, RowCtl] = useRowSelectionTable({ customKey: 'id', type: 'radio' });
const [visibleChannelGoods, setvisibleChannelGoods] = useState<boolean>(false);
const [goods, setGoods] = useState<any>({})
/**查询品类树 */
const searchCategoryTree = (id: any) => {
return new Promise(resolve => {
PublicApi.getProductPlatformGetCategoryTree({ rootNodeId: id }).then(res => {
if (res.code === 1000) {
resolve(res.data)
}
})
}).then((data: any) => {
setcategory(data)
})
}
useEffect(() => {
form.resetFields();
RowCtl.setSelectRow([])
RowCtl.setSelectedRowKeys([])
searchCategoryTree('0');
if (Object.keys(fetchdata).length > 0 && isEdit) {
const params: any = {
current: '1',
pageSize: '10',
code: fetchdata.goodsNo
}
PublicApi.getProductGoodsGetGoodsList({ ...params }).then(res => {
const { data } = res
RowCtl.setSelectRow(data.data)
RowCtl.setSelectedRowKeys([data.data[0].id])
})
form.setFieldsValue({
model: fetchdata.model,
brand: fetchdata.brand,
unit: fetchdata.unit,
purchaseCount: fetchdata.purchaseCount,
name: fetchdata.name,
category: fetchdata.category,
goodsNo: fetchdata.goodsNo,
})
}
}, [visible])
/**提交表单 */
const onSubmit = (value: any) => {
form.validateFields().then(res => {
console.log(rowSelection, RowCtl, 10086)
const data = {
...res,
goodsId: goods.id,
goodsName: goods.name
}
onOk(res, goods)
}).catch(error => {
console.log(error)
})
}
/**货品表头 */
const columns: ColumnType<any>[] = [
{
title: '货号',
key: 'code',
dataIndex: 'code'
},
{
title: '货品名称',
key: 'name',
dataIndex: 'name'
},
{
title: '规格型号',
key: 'type',
dataIndex: 'type'
},
{
title: '品类',
key: 'customerCategory',
dataIndex: 'customerCategory',
render: (text: any) => <span>{text.name}</span>
},
{
title: '品牌',
key: 'brand',
dataIndex: 'brand',
render: (text: any) => <span>{text.name}</span>
},
{
title: '单位',
key: 'unitName',
dataIndex: 'unitName'
},
]
/** 获取货品 */
const fetchGoodsData = (params: any) => {
return new Promise(resolve => {
PublicApi.getProductGoodsGetGoodsList(params).then(res => {
const { data } = res
resolve(data)
})
})
}
/** 选择货品 */
const handleConfirm = () => {
setvisibleChannelGoods(false)
const data = RowCtl.selectRow[0]
const fullId = data.customerCategory.fullId
const ids = fullId.replace(/\b(0+)/gi, '').split('.');
setGoods(data)
form.setFieldsValue({
goodsNo: data.code,
name: data.name,
model: data.type,
category: ids.join(',').split(','),
brand: data.brand.name,
unit: data.unitName,
})
}
return (
<>
<Modal
title='通过平台属性添加'
width='800px'
wrapClassName={style.modal_wrap_className}
bodyStyle={{ padding: '0px' }}
visible={visible}
onCancel={() => onCancel()}
onOk={onSubmit}
>
<Layout>
<Sider width={159} className={style.site_layout_background}>
<Anchor
bounds={0}
targetOffset={120}
affix={false}
>
<Menu
mode='inline'
defaultSelectedKeys={['1']}
>
<Menu.Item key="1"><Link href='#basic_info' title='基本信息' /></Menu.Item>
<Menu.Item key="2"><Link href='#procured_amount' title='采购数量' /></Menu.Item>
<Menu.Item key="3"><Link href='#other_demand' title='附件' /></Menu.Item>
</Menu>
</Anchor>
</Sider>
<Content className={style.site_content_style}>
<Form
form={form}
{...layout}
>
<div id='basic_info'>
<div className={style.affix_title}><Divider type="vertical" className={style.divider_style} />基本信息</div>
<Form.Item label='货号' name='goodsNo' rules={[{ required: true, message: '请输入商品编号' }]}><Input.Search enterButton={<><LinkOutlined /> 选择</>} onSearch={() => setvisibleChannelGoods(true)} /></Form.Item>
<Form.Item label='货品名称' name='name' rules={[{ required: true, message: '请输入货品名称' }]}><Input /></Form.Item>
<Form.Item label='规格型号' name='model' rules={[{ required: true, message: '请输入规格型号' }]}><Input /></Form.Item>
<Form.Item label='商品品类' name='category' rules={[{ required: true, message: '请选择商品品类' }]}>
<Cascader
options={category}
fieldNames={{ label: 'title', value: 'id', children: 'children' }}
placeholder="请选择品类"
notFoundContent={<Spin size="small" />}
/>
</Form.Item>
<Form.Item label='货品品牌' name='brand'><Input /></Form.Item>
</div>
<div id='procured_amount'>
<div className={style.affix_title}><Divider type="vertical" className={style.divider_style} />采购数量</div>
<Form.Item label='单位' name='unit' rules={[{ required: true, message: '请选择单位' }]}><Input /></Form.Item>
<Form.Item label='采购数量' name='purchaseCount' rules={[{ required: true, message: '请输入采购数量' }]}><InputNumber min={1} style={{ width: '100%' }} /></Form.Item>
</div>
<div id='other_demand'>
<div className={style.affix_title}><Divider type="vertical" className={style.divider_style} />其他要求</div>
<Form.Item label='附件' name='upload'>
<div className={style.upload_data}>
{files.length > 0 && files.map((v, index) => (
<div key={index} className={style.upload_item}>
<div className={style.upload_left}>
<LinkOutlined />
<span>{v.name}</span>
</div>
<div className={style.upload_right}>
<DeleteOutlined />
</div>
</div>
))}
</div>
<Upload
action="/api/file/file/upload"
data={{ fileType: UPLOAD_TYPE }}
showUploadList={false}
accept='.doc,.docx,.pdf,.ppt,.pptx,.xls,.xlsx'
>
<Button loading={loading} icon={<UploadOutlined />}>上传文件</Button>
<div style={{ marginTop: '8px' }}>一次上传一个文件,每个附件大小不能超过 20M</div>
</Upload>
</Form.Item>
</div>
</Form>
</Content>
</Layout>
</Modal>
<ModalTable
width={810}
modalTitle='选择货品'
columns={columns}
rowSelection={rowSelection}
visible={visibleChannelGoods}
confirm={handleConfirm}
cancel={() => setvisibleChannelGoods(false)}
fetchTableData={params => fetchGoodsData(params)}
forceRender={true}
modalType='goodsModalSchema'
tableProps={{
rowKey: 'id',
}}
resetModal={{
destroyOnClose: true
}}
/>
</>
)
}
export default ModalGoods;
\ No newline at end of file
import React from 'react';
import React, { useState, ReactNode, useEffect } from 'react';
import { Form, Radio, Button, Table } from 'antd';
import { ColumnType } from 'antd/lib/table/interface';
import ModalAnchor from './Modal/modalAnchor';
import ModalGoods from './Modal/modalGoods';
import { PlusOutlined } from '@ant-design/icons';
import { PublicApi } from '@/services/api';
const layout: any = {
colon: false,
......@@ -8,22 +13,175 @@ const layout: any = {
wrapperCol: { span: 9 },
labelAlign: "left"
};
const AddGoods: React.FC<{}> = () => {
export interface faceSetData {
set?: any,
get?: Function,
currentRef: any
}
const AddGoods: React.FC<faceSetData> = (props) => {
const { set, get, currentRef } = props
const [form] = Form.useForm();
const [type, setType] = useState<number>(0);
const btnname: Array<string> = ['添加商品', '选择货品', '导入货品']
const [visible, setvisible] = useState<Array<boolean>>([false, false, false, false]);
const [tabledata, settabledata] = useState<any>([])
/**存放编辑的商品数据 */
const [editdata, seteditdata] = useState<any>({});
/**是否编辑 */
const [isEdit, setisEdit] = useState<boolean>(false);
/**编辑的下标 */
const [idx, setidx] = useState<number>(-1);
/** 平台属性添加表头 */
const columns: ColumnType<Object>[] = [
{
title: '商品编号',
key: 'goodsNo',
dataIndex: 'goodsNo',
},
{
title: '商品名称',
key: 'name',
dataIndex: 'name',
},
{
title: '规格型号',
key: 'model',
dataIndex: 'model',
},
{
title: '品类',
key: 'category',
dataIndex: 'category',
},
{
title: '品牌',
key: 'brand',
dataIndex: 'brand',
},
{
title: '采购数量',
key: 'purchaseCount',
dataIndex: 'purchaseCount',
},
{
title: '操作',
key: 'options',
dataIndex: 'options',
render: (text:any, record:any, index:number) =>
<>
<Button type='link' onClick={() => handleEdit(record, index)}>编辑</Button>
<Button type='link'>删除</Button>
</>
}
]
/** 切换添加方式 */
const changeRadio = (e: any) => {
const { value } = e.target;
setType(value);
settabledata([]);
}
/** 按钮的文字 */
const handleText = (num: any) => {
let text: ReactNode = null;
text = btnname[num - 1];
return text
}
/**
* @name: 操作弹窗
* @arg: 1.通过平台属性添加 2.选择货品添加 3.导入货品生成
* */
const handleModal = (arg: number) => {
visible[arg] = !visible[arg]
setvisible([...visible])
}
/** 商品添加确定 */
const handleSubmit = (data: any, record?:any) => {
if(idx === -1) {
settabledata([...tabledata, data])
} else {
const newdata = [...tabledata]
newdata[idx] = data
settabledata([...newdata]);
setidx(-1);
}
get([...tabledata, data])
handleModal(type);
}
/** 编辑商品 */
const handleEdit = (record:any, index:number) => {
setidx(index);
seteditdata(record)
setisEdit(true)
handleModal(type)
}
useEffect(() => {
currentRef.current = {
get: () => new Promise((resolve: any) => {
form.validateFields().then(res => {
resolve({
state: true,
name: 'addGoods',
data: {
type,
requisitionFormProducts: tabledata,
}
})
}).catch(error => {
console.log(error)
})
})
}
}, [tabledata])
useEffect(() => {
/**编辑回显数据 */
if(Object.keys(set).length > 0) {
form.setFieldsValue({
type: set.type
})
PublicApi.getOrderRequisitionFormProductDetails({id: set.id}).then(res => {
if(res.code === 1000) {
setType(set.type)
settabledata([res])
}
})
}
}, [set])
return (
<Form
{...layout}
form={form}
>
<Form.Item label='添加方式' required>
<Radio.Group>
<Form.Item label='添加方式' name='type' rules={[{ required: true, message: '请选择添加方式' }]}>
<Radio.Group onChange={changeRadio}>
<Radio value={1}>通过平台属性添加</Radio>
<Radio value={2}>选择货品添加</Radio>
<Radio value={3}>导入货品生成</Radio>
</Radio.Group>
</Form.Item>
<Form.Item noStyle>
<Button type='dashed' block>添加商品</Button>
</Form.Item>
{type > 0 &&
<Form.Item noStyle>
<Button onClick={() => {handleModal(type);setisEdit(false)}} type='dashed' block style={{ marginBottom: '24px' }}><PlusOutlined />{handleText(type)}</Button>
<Table columns={columns} dataSource={tabledata} rowKey={(record, index) => index} />
</Form.Item>
}
<ModalAnchor
fetchdata={editdata}
isEdit={isEdit}
visible={visible[1]}
onOk={handleSubmit}
onCancel={() => handleModal(type)}
/>
<ModalGoods
fetchdata={editdata}
isEdit={isEdit}
visible={visible[2]}
onOk={handleSubmit}
onCancel={() => handleModal(type)}
/>
</Form>
)
}
......
......@@ -11,9 +11,16 @@ const layout: any = {
labelAlign: "left"
};
export interface faceSetData {
set?: any,
get?: Function,
currentRef?: any
}
const { Option } = Select;
const BasicInfo: React.FC<{}> = () => {
const BasicInfo: React.FC<faceSetData> = (props) => {
const [form] = Form.useForm();
const { set, get, currentRef } = props
const [province, setprovince] = useState<any>([]);// 省列表
const [city, setcity] = useState<any>([]);// 市列表
const [requisitionFormAddress, setrequisitionFormAddress] = useState<any>([{
......@@ -34,21 +41,20 @@ const BasicInfo: React.FC<{}> = () => {
})
}
// 选择下拉得内容
const handProvince = (val: any, idx: number, num: number) => {
const handProvince = async (val: any, idx: number, num: number) => {
const result = [...requisitionFormAddress];
const cityCode: Array<any> = []
result.forEach((item: any) => {
if (item.cityCode) {
cityCode.push(item.cityCode)
}
})
setcode([...cityCode]);
if (num === 1) {
const result = [...requisitionFormAddress];
province.forEach(item => {
await province.forEach(item => {
if (item.code === val) {
PublicApi.getManageAreaByPcodeAll({ pcode: val }).then((res: any) => {
if (res.code === 1000) {
res.data.forEach((items: any) => {
const fiterCode = code.filter(value => value === items.code);
if (fiterCode[0] === items.code) {
items.disabled = true
} else {
items.disabled = false
}
})
result[idx].provinceCode = val;
result[idx].province = item.name;
city[idx] = { citydata: res.data }
......@@ -57,48 +63,124 @@ const BasicInfo: React.FC<{}> = () => {
})
}
})
setrequisitionFormAddress(result);
} else {
const result = [...requisitionFormAddress];
city.forEach(item => {
item.citydata.forEach(items => {
if (items.code === val) {
const cityCode = code.find(it => items.code);
if (cityCode !== items.code) {
items.disabled = false
}
result[idx].cityCode = val;
result[idx].city = items.name;
}
})
})
setcode([...code, val]);
setrequisitionFormAddress(result);
setcity([...city])
}
setrequisitionFormAddress(result);
}
// 选择城市的时候下拉就调用方
const onDropdownVisibleChange = () => {
return new Promise(reslove => reslove(code)).then((res: any) => {
city.forEach((item: any) => {
item.citydata.filter(it => {
res.map(items => {
if (items === it.code) {
it.disabled = true
}
})
})
})
setcity([...city])
})
}
// 添加一条地址
const addFormAddress = (idx:number) => {
const addFormAddress = (idx: number) => {
const address: any = {
provinceCode: '',
province: '',
cityCode: '',
city: ''
}
if(requisitionFormAddress[idx].provinceCode && requisitionFormAddress[idx].cityCode) {
if (requisitionFormAddress[idx].provinceCode && requisitionFormAddress[idx].cityCode) {
setrequisitionFormAddress([...requisitionFormAddress, address])
} else {
message.error('请完善适用城市信息')
}
}
// 删除一条地址
const removeFormAddress = (idx: any) => {
if (requisitionFormAddress.length > 1) {
const requisitionFormAddressFilter = requisitionFormAddress.filter((item: any, index: number) => index !== idx);
const cityFilter = city.filter((item: any, index: number) => index !== idx);
form.resetFields();
requisitionFormAddressFilter.forEach((item: any, index: number) => {
const cityCode = code.find(it => item.cityCode);
if (cityCode !== item.cityCode) {
item.disabled = false
}
form.setFieldsValue({
['province_' + index]: item.provinceCode,
['city_' + index]: item.cityCode
});
})
setcity(cityFilter);
setrequisitionFormAddress(requisitionFormAddressFilter);
}
}
useEffect(() => {
manageProvince().then(data => {
setprovince(data)
})
}, [])
useEffect(() => {
/**编辑回显数据 */
if (Object.keys(set).length > 0) {
setrequisitionFormAddress([...set.requisitionFormAddress])
set.requisitionFormAddress.forEach((item: any, index: number) => {
PublicApi.getManageAreaByPcodeAll({ pcode: item.provinceCode }).then((res: any) => {
if (res.code === 1000) {
city[index] = { citydata: res.data }
Promise.resolve().then(() => {
setTimeout(() => {
setcity([...city])
form.setFieldsValue({
details: set.details,
['province_' + index]: item.provinceCode,
['city_' + index]: item.cityCode,
});
}, 350);
});
}
})
})
}
}, [set])
useEffect(() => {
currentRef.current = {
get: () => new Promise((resolve: any) => {
form.validateFields().then(res => {
resolve({
state: true,
name: 'basicInfo',
data: {
details: res.details,
requisitionFormAddress,
}
})
}).catch(error => {
console.log(error)
})
})
}
}, [requisitionFormAddress])
return (
<Form
{...layout}
......@@ -106,7 +188,7 @@ const BasicInfo: React.FC<{}> = () => {
>
<Form.Item
label='需求单摘要'
name=''
name='details'
rules={[{ required: true, message: '请输入需求单摘要' }]}
>
<Input />
......@@ -121,6 +203,7 @@ const BasicInfo: React.FC<{}> = () => {
<Col span={12}>
<Form.Item name={`province_${idx}`}>
<Select
onDropdownVisibleChange={onDropdownVisibleChange}
onChange={(value) => {
handProvince(value, idx, 1)
}}
......@@ -136,9 +219,9 @@ const BasicInfo: React.FC<{}> = () => {
<Col span={12}>
<Form.Item
name={`city_${idx}`}
rules={[{ required: item.provinceCode ? true : false, message: '选择三级分类' }]}
>
<Select
onDropdownVisibleChange={onDropdownVisibleChange}
onChange={(value) => {
handProvince(value, idx, 2)
}}
......@@ -172,27 +255,27 @@ const BasicInfo: React.FC<{}> = () => {
<Form.Item
label='需求单号'
>
<span>SPTY12</span>
<span>{set.requisitionFormNo && set.requisitionFormNo}</span>
</Form.Item>
<Form.Item
label='会员名称'
>
<span>温州龙昌手袋有限公司</span>
<span>{set.memberName && set.memberName}</span>
</Form.Item>
<Form.Item
label='单据时间'
>
<span>2020-08-20 12:56:25</span>
<span>{set.voucherTime && set.voucherTime}</span>
</Form.Item>
<Form.Item
label='外部状态'
>
<span>待提交需求单</span>
<span>{set.externalState && set.externalState}</span>
</Form.Item>
<Form.Item
label='部状态'
label='部状态'
>
<span>待提交审核</span>
<span>{set.interiorState && set.interiorState}</span>
</Form.Item>
</Form>
)
......
import React, { useState } from 'react';
import { Form, Radio, Tooltip, Row, Col, Checkbox, Avatar, Space, Button, Table } from 'antd';
import { QuestionCircleOutlined, PlusOutlined } from '@ant-design/icons';
import style from './index.less';
import { StandardTable } from 'god';
import { ColumnType } from 'antd/lib/table/interface';
const layout: any = {
colon: false,
labelCol: { style: { width: '174px' } },
wrapperCol: { span: 9 },
labelAlign: "left"
};
export interface faceSetData {
set?: any,
get?: Function
}
const DemandDbutted: React.FC<faceSetData> = (props) => {
const { set, get } = props
const [shopId, setShopId] = useState<Number>(0)
// 系统匹配表头
const columns: ColumnType<any>[] = [
{
title: '序号',
key: 'id',
dataIndex: 'id',
},
{
title: '会员名称',
key: 'memberName',
dataIndex: 'memberName',
},
{
title: '会员类型',
key: 'memberTypeName',
dataIndex: 'memberTypeName',
},
{
title: '会员角色',
key: 'roleName',
dataIndex: 'roleName',
},
{
title: '会员等级',
key: 'levelTag',
dataIndex: 'levelTag',
},
{
title: '是否归属会员',
key: 'membershipOrNot',
dataIndex: 'membershipOrNot',
},
{
title: '状态',
key: 'state',
dataIndex: 'state',
},
{
title: '操作',
key: 'options',
dataIndex: 'options',
},
]
// 指定会员表头
const memberColumns: ColumnType<any>[] = [
{
title: '序号',
key: 'memberId',
dataIndex: 'memberId',
},
{
title: '会员名称',
key: 'name',
dataIndex: 'name',
},
{
title: '会员类型',
key: 'memberTypeName',
dataIndex: 'memberTypeName',
},
{
title: '会员角色',
key: 'roleName',
dataIndex: 'roleName',
},
{
title: '会员等级',
key: 'levelTag',
dataIndex: 'levelTag',
}
]
// 选择系统匹配的列表数据
const [selectedRowKeys, setSelectedRowKeys] = useState<Array<any>>([]);
const rowSelection = {
selectedRowKeys,
onChange: setSelectedRowKeys
};
// 切换添加方式
const changeRadio = (e: any) => {
const { value } = e.target;
setShopId(value)
}
// 请求系统匹配列表数据
const fetchSystemMateData = (params:any) => {
}
return (
<Form
{...layout}
>
<Form.Item label='添加方式' required>
<Radio.Group onChange={changeRadio}>
<Radio value={1}><Tooltip placement="topLeft" title={<>需求发布至企业商城求购频道</>}>发布类型<QuestionCircleOutlined style={{ marginLeft: '5px' }} /></Tooltip></Radio>
<Radio value={2}><Tooltip placement="topLeft" title={<>系统通过需求单品类、商品属性、适用地市与平台会员发布的商品品类、商品属性、归属地区进行匹配,推荐满足条件的平台会员</>}>系统匹配<QuestionCircleOutlined style={{ marginLeft: '5px' }} /></Tooltip></Radio>
<Radio value={3}><Tooltip placement="topLeft" title={<>选择与当前会员有归属关系的会员且角色类型为服务提供的会员(供应商),需求只发送给指定会员</>}>指定会员<QuestionCircleOutlined style={{ marginLeft: '5px' }} /></Tooltip></Radio>
</Radio.Group>
</Form.Item>
{shopId === 1 &&
// 发布至平台
<Form.Item label='发布至平台' wrapperCol={{ span: 24 }}>
<Checkbox.Group className={style.checkbox_wrap_style}>
<Row>
<Col span={6}>
<Checkbox value="A">
<Space>
<Avatar>LOGO</Avatar>
<span>名称</span>
</Space>
</Checkbox>
</Col>
</Row>
</Checkbox.Group>
</Form.Item>
}
{
shopId === 2 &&
// 系统匹配
<Form.Item noStyle>
<StandardTable
rowSelection={rowSelection}
columns={columns}
// fetchTableData={(params) => fetchSystemMateData(params)}
/>
</Form.Item>
}
{
shopId === 3 &&
// 指定会员
<Form.Item noStyle>
{/* <Button type='dashed' block style={{ marginBottom: '24px' }}><PlusOutlined />选择会员</Button> */}
<StandardTable
rowSelection={rowSelection}
columns={memberColumns}
// fetchTableData={(params) => fetchSystemMateData(params)}
/>
</Form.Item>
}
</Form>
)
}
export default DemandDbutted;
\ No newline at end of file
import React, { useState } from 'react';
import React, { useState, useEffect } from 'react';
import styles from './index.less';
import { Radio } from 'antd';
import PolymericTable from '@/components/PolymericTable';
import { EditableColumns } from '@/components/PolymericTable/interface';
import moment from 'moment';
const FlowRecord: React.FC<{}> = () => {
export interface faceSetData {
set?: any,
get?: Function
}
const FlowRecord: React.FC<faceSetData> = (props) => {
const { set, get } = props
const [radio, setRadio] = useState<string>('outer'); //切换单据
const format = (text) => {
return <>{moment(text).format("YYYY-MM-DD HH:mm:ss")}</>
......@@ -15,6 +18,7 @@ const FlowRecord: React.FC<{}> = () => {
const outerColumns: EditableColumns[] = [{
title: '序号',
dataIndex: 'inquiryListId',
render: (texr: any, record: any, index: number) => <span>{index + 1}</span>
}, {
title: '操作角色',
dataIndex: 'roleName',
......@@ -23,7 +27,7 @@ const FlowRecord: React.FC<{}> = () => {
dataIndex: 'state',
}, {
title: '操作',
dataIndex: 'operation',
dataIndex: 'operationalProcess',
}, {
title: '操作时间',
dataIndex: 'operationTime',
......@@ -35,6 +39,7 @@ const FlowRecord: React.FC<{}> = () => {
const insideColumns: EditableColumns[] = [{
title: '序号',
dataIndex: 'inquiryListId',
render: (texr: any, record: any, index: number) => <span>{index + 1}</span>
}, {
title: '操作人',
dataIndex: 'roleName',
......@@ -49,7 +54,7 @@ const FlowRecord: React.FC<{}> = () => {
dataIndex: 'state',
}, {
title: '操作',
dataIndex: 'operation',
dataIndex: 'operationalProcess',
}, {
title: '操作时间',
dataIndex: 'operationTime',
......@@ -61,6 +66,7 @@ const FlowRecord: React.FC<{}> = () => {
const onChange = (e: any) => {
setRadio(e.target.value)
}
return (
<div>
<Radio.Group defaultValue="outer" buttonStyle="solid" onChange={onChange}>
......@@ -72,12 +78,14 @@ const FlowRecord: React.FC<{}> = () => {
columns={outerColumns}
loading={false}
pagination={null}
dataSource={Object.keys(set).length > 0 && set.externalRequisitionFormStateResponses}
/>
:
<PolymericTable
columns={insideColumns}
loading={false}
pagination={null}
dataSource={Object.keys(set).length > 0 && set.interiorRequisitionFormStateResponses}
/>
}
</div>
......
......@@ -18,3 +18,125 @@
}
}
}
.modal_wrap_className {
.site_layout_background {
background-color: #fff;
border-right: 1px solid #EEF0F3;
}
.site_content_style {
background-color: #fff;
padding: 24px;
height: 600px;
overflow-y: scroll;
.affix_title {
font-size: 14px;
margin-bottom: 24px;
.divider_style {
width: 2px;
height: 16px;
margin: 0px 5px 0px 0px ;
background-color: #00B37A;
}
}
.upload_item {
padding: 5px 8px;
margin-bottom: 16px;
display: flex;
align-items: center;
justify-content: space-between;
background-color: #FAFBFC;
.upload_left {
display: flex;
align-items: center;
color: #303133;
:global {
.anticon-file-word {
color: #4279df;
font-size: 20px;
margin-right: 8px;
}
}
}
.upload_right {
color: #00B37A;
cursor: pointer;
:global {
.anticon-delete {
margin-left: 19px;
color: #C0C4CC;
}
}
}
}
}
:global {
.ant-anchor-wrapper {
margin-left: 0 !important;
padding-left: 0 !important;
}
.ant-menu-item {
margin-top: 0 !important;
margin-bottom: 0 !important;
&:after {
left: 0;
border-right: none;
border-left: 2px solid #00B37A;
height: 80%;
margin: auto;
}
.ant-anchor-link {
padding: 0px !important;
line-height: 40px !important;
}
}
.ant-menu-item-selected {
color: #303133;
font-weight: 600;
background-color: transparent !important;
}
}
}
.checkbox_wrap_style {
width: 100%;
:global {
.ant-checkbox-wrapper {
width: 100%;
border: 1px solid #ccc;
padding: 8px 18px;
.ant-checkbox {
display: none;
}
> span {
display: flex;
align-items: center;
padding: 0px 0px;
.checkbox_avatar {
width: 32px;
height: 32px;
margin-right: 8px;
}
}
}
.ant-checkbox-wrapper-checked {
border-color: #00b37a!important;
color: #00b37a;
position: relative;
&:after {
content: "";
position: absolute;
width: 12px;
height: 11px;
background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAALCAYAAABLcGxfAAAAAXNSR0IArs4c6QAAAERlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAADKADAAQAAAABAAAACwAAAAChLCZNAAAA6klEQVQoFWNgIAVsruliJkr9/1XMDCZqcxkY/mczEtSwv4GD4euvlQz/GfxAavFr2N3Bz/Dz8yaG///tYAbj1rC1QYLh/+8dQMX6MMW4bdjSoMTA8Gs30BlAGhUwoXKBvM21QBN/H0VWbMovzXDSOgOsFFXD1mo7Bsa/B5U5BSVgBoEUrzaOZMi5shkshAjWLTWgUNgINJlnh1k8AysTEzhEQIpDzy5nOP3xKVgDxNNbqxIY/jHMAYqADRBi5WTYY5HEIMbGzRB4ZilcMUgHI8PWqlKg4i6wdiRCgIWDQYSNi+HOt3dIogwMANgLQif9hMeFAAAAAElFTkSuQmCC);
right: 0;
bottom: 0;
}
}
}
}
\ No newline at end of file
......@@ -9,11 +9,17 @@ const layout: any = {
wrapperCol: { span: 24 },
labelAlign: "left"
};
const TradingConditions: React.FC<{}> = () => {
export interface faceSetData {
set?: any,
get?: Function,
currentRef?: any
}
const TradingConditions: React.FC<faceSetData> = (props) => {
const { set, get, currentRef } = props
const [TradingConditionsForm] = Form.useForm();
const [address, setAddress] = useState([]);
const [selectAddress, setselectAddress] = useState<any>({});
useEffect(() => {
// 获取交付地址
PublicApi.getLogisticsSelectListReceiverAddress().then(res => {
......@@ -21,10 +27,59 @@ const TradingConditions: React.FC<{}> = () => {
})
}, [])
useEffect(() => {
currentRef.current = {
get: () => new Promise((resolve: any) => {
TradingConditionsForm.validateFields().then(res => {
console.log(res, selectAddress)
resolve({
state: true,
name: 'tradingConditions',
data: {
deliveryTime: moment(res.deliveryTime).format('x'),
quotationAsTime: moment(res.quotationAsTime).format('x'),
addresId: res.addresId,
addres: selectAddress.children,
logistics: res.logistics,
offer: res.offer,
otherRequire: res.otherRequire,
packRequire: res.packRequire,
paymentType: res.paymentType,
taxes: res.taxes,
}
})
}).catch(error => {
console.log(error)
})
})
}
}, [selectAddress])
const disabledDate = (current) => {
return current && current < moment().endOf('day');
}
const onSelect = (val: any, option: any) => {
console.log(option)
setselectAddress(option)
}
useEffect(() => {
if(Object.keys(set).length > 0) {
TradingConditionsForm.setFieldsValue({
deliveryTime: moment(set.deliveryTime),
addresId: set.addresId,
quotationAsTime: moment(set.quotationAsTime),
offer: set.offer,
paymentType: set.paymentType,
taxes: set.taxes,
logistics: set.logistics,
packRequire: set.packRequire,
otherRequire: set.otherRequire
})
setselectAddress({children: set.addres});
}
}, [set])
return (
<Form
......@@ -35,13 +90,13 @@ const TradingConditions: React.FC<{}> = () => {
<Col span={12}>
<Form.Item label='交付日期' name='deliveryTime' rules={[{ required: true, message: '请选择交付日期' }]}>
<DatePicker
style={{width: '100%'}}
style={{ width: '100%' }}
disabledDate={disabledDate}
format="YYYY-MM-DD HH:mm:ss"
format="YYYY-MM-DD HH:mm:ss"
/>
</Form.Item>
<Form.Item label='交付地址' name='fullAddressId' rules={[{ required: true, message: '请选择交付地址' }]}>
<Select>
<Form.Item label='交付地址' name='addresId' rules={[{ required: true, message: '请选择交付地址' }]}>
<Select onSelect={onSelect}>
{address.map(v => (
<Select.Option key={v.id} value={v.id}>{v.fullAddress}</Select.Option>
))}
......@@ -49,7 +104,7 @@ const TradingConditions: React.FC<{}> = () => {
</Form.Item>
<Form.Item label='报价截止时间' name='quotationAsTime' rules={[{ required: true, message: '请选择报价截止时间' }]}>
<DatePicker
style={{width: '100%'}}
style={{ width: '100%' }}
format="YYYY-MM-DD HH:mm:ss"
disabledDate={disabledDate}
/>
......
export const setUpdata = {
requisitionFormAddress: [], /** 需求单地址列表 ,RequisitionFormAddresRequest */
requisitionFormProducts: [],/** 商品列表 ,RequisitionFormProductRequest */
demandDockings: [],/** 需求对接-系统匹配列表 ,DemandDockingRequest */
shopIds: [],/** 需求对接-发布至平台 ,Long */
memberIds: [],/** 需求对接-指定会员ID列表 ,Long */
details: '',/** 需求摘要 */
deliveryTime: '',/** 交付日期 */
quotationAsTime: '',/** 报价截止时间 */
voucherTime: '',/** 单据时间 */
defaultAddres: null,/** 适用地市:1.默认全部省市区 0.选中项 */
addres: '',/** 交付地址 */
addresId: null,/** 交付地址Id */
offer: '',/** 报价要求 */
paymentType: '',/** 付款方式 */
taxes: '',/** 税费要求 */
logistics: '',/** 物流要求 */
packRequire: '',/** 包装要求 */
otherRequire: '',/** 其他要求 */
type: null,/** 需求对接类型:1.发布至平台 2.系统匹配 3.指定会员 */
}
\ No newline at end of file
import React from 'react';
import React, { useState, useRef, useEffect } from 'react';
import { history } from 'umi';
import ReutrnEle from '@/components/ReturnEle'
import { PageHeaderWrapper } from '@ant-design/pro-layout';
......@@ -7,33 +7,116 @@ import BasicInfo from './components/basicInfo';
import TradingConditions from './components/tradingConditions'
import FlowRecord from './components/flowRecord';
import AddGoods from './components/addGoods';
import DemandDbutted from './components/demandDbutted';
import { PublicApi } from '@/services/api';
const { TabPane } = Tabs;
const AddDemandOrder: React.FC<{}> = () => {
const { id } = history.location.query;
const [fetchdata, setfetchdata] = useState<any>({});
const basic = useRef<any>();
const goods = useRef<any>();
const trading = useRef<any>();
/**get子组件的数据 */
/**提交数据 */
const onSubmit = async () => {
const basicRef = await basic.current.get();
const goodsRef = await goods.current.get();
const tradingRef = await trading.current.get();
if (basicRef.state && tradingRef.state && goodsRef.state) {
const data = {
...basicRef.data,
...tradingRef.data,
...goodsRef.data,
type: 1,
shopIds: [1]
}
if (basicRef.data.requisitionFormAddress.length > 0) {
data.defaultAddres = 0
} else {
data.defaultAddres = 1
}
if(id) {
data.id = fetchdata.id;
PublicApi.postOrderRequisitionFormUpdate(data).then(res => {
if (res.code === 1000) {
history.goBack()
}
})
} else {
PublicApi.postOrderRequisitionFormAdd(data).then(res => {
if (res.code === 1000) {
history.goBack()
}
})
}
}
}
useEffect(() => {
if (id) {
new Promise(resolve => {
PublicApi.getOrderRequisitionFormDetails({ id, current: '1', pageSize: '10' }).then(res => {
if (res.code === 1000) {
resolve(res.data)
}
})
}).then((res:any) => {
// let obj: any = {}
// for (let key in fetchdata) {
// for (let keys in res) {
// if (key === keys) {
// obj = {
// ...obj, ...{
// [keys]: res[keys]
// }
// }
// }
// }
// }
setfetchdata(res)
})
}
}, [id])
return (
<PageHeaderWrapper
onBack={() => history.goBack()}
backIcon={<ReutrnEle description="返回" />}
extra={
<Button type="primary"> 保存</Button>
<Button type="primary" onClick={onSubmit}> 保存</Button>
}
>
<Card>
<Tabs type='card'>
<TabPane forceRender tab='基本信息' key='1'>
<BasicInfo />
<BasicInfo
set={fetchdata}
currentRef={basic}
/>
</TabPane>
<TabPane forceRender tab='添加商品' key='2'>
<AddGoods />
<AddGoods
set={fetchdata}
currentRef={goods}
/>
</TabPane>
<TabPane forceRender tab='交易条件' key='3'>
<TradingConditions />
<TradingConditions
set={fetchdata}
currentRef={trading}
/>
</TabPane>
<TabPane forceRender tab='需求对接' key='4'>
<DemandDbutted
set={fetchdata}
/>
</TabPane>
<TabPane forceRender tab='流转记录' key='5'>
<FlowRecord />
<FlowRecord
set={fetchdata}
/>
</TabPane>
</Tabs>
</Card>
......
......@@ -158,7 +158,7 @@ const List: React.FC<{}> = () => {
}, [])
const toEdit = (id: number | string) => {
history.push(`/memberCenter/tranactionAbility/enquirySubmit/toAddSubmitList/edit?id=${id}`)
history.push(`/memberCenter/tranactionAbility/enquirySubmit/addDemandOrder/edit?id=${id}`)
}
/**
* @description: 删除
......@@ -223,7 +223,7 @@ const List: React.FC<{}> = () => {
const controllerBtns = <Row>
<Col span={24}>
<Space direction="horizontal" size={16}>
<Button type="primary" onClick={() => history.push('/memberCenter/tranactionAbility/enquirySubmit/toAddSubmitList/add')} icon={<PlusOutlined />}>新建</Button>
<Button type="primary" onClick={() => history.push('/memberCenter/tranactionAbility/enquirySubmit/addDemandOrder/add')} icon={<PlusOutlined />}>新建</Button>
<Button onClick={() => handleSubmitAll(selectedRowKeys)}>批量提交审核</Button>
<Dropdown.Button
overlay={menu}
......@@ -238,28 +238,28 @@ const List: React.FC<{}> = () => {
const [externalState, setExternalState] = useState<any>([]);
const [interiorState, setInteriorState] = useState<any>([]);
useEffect(() => {
const external = new Promise(resolve => {
//查询需求单外部状态枚举列表
PublicApi.getOrderRequisitionFormExternalStateEnum().then((res: any) => {
if (res.code === 1000) {
resolve(res.data)
}
})
})
const interior = new Promise(resolve => {
// 查询需求单内部状态枚举列表
PublicApi.getOrderRequisitionFormInteriorStateEnum().then((res: any) => {
if (res.code === 1000) {
resolve(res.data)
}
})
})
Promise.all([external, interior]).then(res => {
setExternalState(res[0])
setInteriorState(res[1])
})
}, [])
// useEffect(() => {
// const external = new Promise(resolve => {
// //查询需求单外部状态枚举列表
// PublicApi.getOrderRequisitionFormExternalStateEnum().then((res: any) => {
// if (res.code === 1000) {
// resolve(res.data)
// }
// })
// })
// const interior = new Promise(resolve => {
// // 查询需求单内部状态枚举列表
// PublicApi.getOrderRequisitionFormInteriorStateEnum().then((res: any) => {
// if (res.code === 1000) {
// resolve(res.data)
// }
// })
// })
// Promise.all([external, interior]).then(res => {
// setExternalState(res[0])
// setInteriorState(res[1])
// })
// }, [])
return (
<PageHeaderWrapper>
......
......@@ -30,7 +30,7 @@ const Attached: React.FC<parmas> = (props) => {
}
// 上传回调
const handleChange = ({ file }) => {
const arr: any = [];
const arr: any = files;
setloading(true);
if (file.response) {
if (file.response.code === 1000) {
......@@ -41,7 +41,7 @@ const Attached: React.FC<parmas> = (props) => {
setloading(false);
}
}
setFiles([...files, ...arr])
setFiles([...arr])
handleGetEnclosureUrls(arr);
}
// 删除附件
......
......@@ -12,7 +12,7 @@ import moment from 'moment';
const layout: any = {
colon: false,
labelCol: { style: { width: '174px' } },
labelCol: { style: { width: '100px' } },
wrapperCol: { span: 9 },
labelAlign: "left"
};
......
......@@ -19,6 +19,7 @@ export interface parmas {
const Attached: React.FC<parmas> = (props) => {
const { handleGetEnclosureUrls, editData } = props;
const [files, setFiles] = useState<Array<any>>([]);
const [loading, setloading] = useState(false);
/**判断文件类型和大小 */
const beforeDocUpload = (file: UploadFile) => {
const isLt20M = file.size / 1024 / 1024 < 20;
......@@ -30,12 +31,14 @@ const Attached: React.FC<parmas> = (props) => {
// 上传回调
const handleChange = ({ file }) => {
const arr: any = files;
setloading(true);
if (file.response) {
if (file.response.code === 1000) {
arr.push({
name: file.name,
url: file.response.data
})
setloading(false);
}
}
setFiles([...arr])
......@@ -82,7 +85,7 @@ const Attached: React.FC<parmas> = (props) => {
beforeUpload={beforeDocUpload}
onChange={handleChange}
>
<Button icon={<UploadOutlined />}>上传文件</Button>
<Button loading={loading} icon={<UploadOutlined />}>上传文件</Button>
<div style={{ marginTop: '8px' }}>一次上传一个文件,每个附件大小不能超过 20M</div>
</Upload>
</Form.Item>
......
......@@ -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: '货品名称',
......
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