Commit 66c3f0db authored by 前端-钟卫鹏's avatar 前端-钟卫鹏

fix: 对接待新增请购单下单/新增请购单下单,formSchema添加内置Form表单字段校验错误数收集

parent 075d24d0
......@@ -236,7 +236,7 @@ export const addOrderModalSchema: ISchema = {
export const addContractOrderModalSchema: ISchema = {
type: 'object',
properties: {
code: {
productNo: {
type: 'string',
'x-component': 'ModalSearch',
'x-component-props': {
......@@ -265,7 +265,7 @@ export const addOrderModalSchema: ISchema = {
placeholder: '物料名称',
},
},
type: {
spec: {
type: 'string',
"x-component-props": {
placeholder: '规格型号',
......
......@@ -54,6 +54,10 @@ export const ORDER_TYPE_BIDDING_CONTRACT = 10;
* 采购招标合同
*/
export const ORDER_TYPE_TENDER_CONTRACT = 11;
/**
* 请购单下单
*/
export const ORDER_TYPE_REQUISITION = 12;
......@@ -103,6 +107,10 @@ export const ORDER_TYPE_TENDER_CONTRACT = 11;
* 采购招标合同
*/
export const ORDER_TYPE2_TENDER_CONTRACT = 11;
/**
* 请购单下单
*/
export const ORDER_TYPE2_REQUISITION = 12;
export const ORDER_TYPE2 = {
[ORDER_TYPE2_INQUIRY]: '询价采购',
......@@ -116,6 +124,7 @@ export const ORDER_TYPE_TENDER_CONTRACT = 11;
[ORDER_TYPE2_ENQUIRY_CONTRACT]: '采购询价合同',
[ORDER_TYPE2_BIDDING_CONTRACT]: '采购竞价合同',
[ORDER_TYPE2_TENDER_CONTRACT]: '采购招标合同',
[ORDER_TYPE2_REQUISITION]: '请购单采购',
};
......@@ -143,6 +152,7 @@ export const ORDER_TYPE = ['',
'采购询价合同',
'采购招标合同',
'采购竞价合同',
'请购单采购',
]
// 下单模式 *NEW
......@@ -181,6 +191,11 @@ export enum OrderModalType {
* 采购招标合同下单
*/
PURCHASE_TENDER_CONTRACT_ORDER = 14,
/**
* 请购单采购下单
*/
PURCHASE_REQUISITION_ORDER = 15,
}
// 订单种类 *NEW @可能还需要补充 现货采购 渠道直采 渠道现货
......
......@@ -12,13 +12,14 @@ export const useFormDetail = () => {
const [formData, setFormData] = useState<any>(null)
// 完成度
const [formProcess, setFormProcess] = useState<string|number>()
// 总交互字段数
const [amount, setAomunt] = useState<number>(0)
// 输入数
const [inputAmount, setInputAomunt] = useState<number>(0)
// 有效统计字段
const effectFields = []
// 用于收集 schema表单内置组件Form表单的校验error
const [innerFormErrors, setInnerFormErrors] = useState<number>(0)
useEffect(() => {
if(amount > 0) {
......@@ -66,9 +67,11 @@ export const useFormDetail = () => {
const formContext = {
data: formData,
formProcess,
innerFormErrors,
ctl: {
setFormData,
setFormProcess
setFormProcess,
setInnerFormErrors
},
useAttachmentChangeForContext,
}
......
......@@ -35,9 +35,9 @@ export const fetchOrderApi = {
return data
},
/** 合同下单 获取合同采购物料 */
async getContractPurchaseMaterielList(params) {
const { data } = await PublicApi.getContractManagePagePurchaseMaterielList(params)
/** 请购单下单 获取请购单物料 */
async getRequisitionPurchaseMaterielList(params) {
const { data } = await PublicApi.getPurchaseRequisitionPurchaseOrderMaterialPage(params)
return data
},
......
......@@ -5,6 +5,7 @@ import { useModalTable } from '../../model/useModalTable'
import { ISchemaFormActions, ISchemaFormAsyncActions } from '@formily/antd'
import { requisitionColumns } from '../../constant'
import { PublicApi } from '@/services/api'
import moment from 'moment'
export interface RequisitionModalTableProps extends ModalTableProps {
type?: 'radio' | 'checkbox',
......@@ -44,46 +45,32 @@ const RequisitionModalTable:React.FC<RequisitionModalTableProps> = (props) => {
schemaAction.setFieldValue('products', [])
schemaAction.setFieldValue('requisitionNo', item.requisitionNo)
schemaAction.setFieldValue('requisitionId', item.id)
// const { data } = await fetchOrderApi.getContractPurchaseMaterielList({
// contractId: item?.id || item?.contractId,
// current: 1,
// pageSize: 999,
// })
// if(!data) { return false; }
schemaAction.setFieldValue('digest', item.digest)
schemaAction.setFieldValue('deliverDate', moment(item.deliverTime).format('YYYY-MM-DD HH:mm'))
// // 字段转换
// let newData = data.map((v: any) => {
// let temp: any = {};
// temp.id = v.id;
// temp.code = v.materielNo;
// temp.name = v.materielName;
// temp.type = v.type;
// temp.category = v.category;
// temp.brand = v.brand;
// temp.unit = v.unit;
// temp.relevanceProductId = v.associatedDataId;
// temp.relevanceProductName = v.associatedGoods;
// temp.relevanceProductType = v.associatedType;
// temp.relevanceProductCategory = v.associatedCategory;
// temp.relevanceProductBrand = v.associatedBrand;
// temp.price = v.price;
// temp.stock = v.supplierInventory;
// temp.tax = v.isHasTax;
// temp.taxRate = v.taxRate;
// // @ 配送方式 默认物流
// temp.logistics = 1
const { data } = await fetchOrderApi.getRequisitionPurchaseMaterielList({
requisitionId: item.id,
current: 1,
pageSize: 999,
})
if(!data) { return false; }
// // 会员信息冗余
// temp.memberId = item.partyBMemberId
// temp.memberRoleId = item.partyBRoleId
// return temp
// })
// 字段转换
let newData = data.map((v: any) => ({
...v,
tax: true,
// @ 配送方式 默认物流
logistics: 1,
// 会员信息冗余
memberName: item.vendorMemberName,
memberId: item.vendorMemberId,
memberRoleId: item.vendorRoleId,
}))
// schemaAction.setFieldValue('products', data)
schemaAction.setFieldValue('vendorMemberName', item.partyBName)
schemaAction.setFieldValue('vendorMemberId', item.partyBMemberId)
schemaAction.setFieldValue('vendorRoleId', item.partyBRoleId)
schemaAction.setFieldValue('digest', item.digest)
schemaAction.setFieldValue('products', newData)
schemaAction.setFieldValue('vendorMemberName', item.vendorMemberName)
schemaAction.setFieldValue('vendorMemberId', item.vendorMemberId)
schemaAction.setFieldValue('vendorRoleId', item.vendorRoleId)
}
confirmModal && confirmModal()
setVisible(false)
......
......@@ -19,27 +19,27 @@ export interface MaterialModalTableProps extends ModalTableProps {
export const materialColumns: any[] = [
{
title: 'ID',
dataIndex: 'id',
dataIndex: 'productId',
align: 'center',
key: 'id',
key: 'productId',
},
{
title: '物料编号',
dataIndex: 'materielNo',
dataIndex: 'productNo',
align: 'center',
key: 'materielNo',
key: 'productNo',
},
{
title: '规格型号',
dataIndex: 'type',
title: '物料名称',
dataIndex: 'name',
align: 'center',
key: 'type',
key: 'name',
},
{
title: '物料名称',
dataIndex: 'materielName',
title: '规格型号',
dataIndex: 'spec',
align: 'center',
key: 'materielName',
key: 'spec',
},
{
title: '品类',
......@@ -60,17 +60,17 @@ export const materialColumns: any[] = [
key: 'unit'
},
{
title: '合同剩余',
dataIndex: 'contractFreeCount',
title: '数量',
dataIndex: 'quantity',
align: 'center',
key: 'contractFreeCount'
key: 'quantity'
},
// {
// title: '供方库存',
// dataIndex: 'supplierInventory',
// align: 'center',
// key: 'supplierInventory'
// },
{
title: '可用数量',
dataIndex: 'quantifiable',
align: 'center',
key: 'quantifiable'
}
]
const MaterialModalTable:React.FC<MaterialModalTableProps> = (props) => {
......@@ -90,31 +90,22 @@ const MaterialModalTable:React.FC<MaterialModalTableProps> = (props) => {
const addMaterialProcessField = (value, origin) => {
let tempOriginData = [...origin]
if(Array.isArray(value)) {
let processData = value.map(v => {
let temp: any = {};
temp.id = v.id;
temp.code = v.materielNo;
temp.name = v.materielName;
temp.type = v.type;
temp.category = v.category;
temp.brand = v.brand;
temp.unit = v.unit;
temp.relevanceProductId = v.associatedDataId;
temp.relevanceProductName = v.associatedGoods;
temp.relevanceProductType = v.associatedType;
temp.relevanceProductCategory = v.associatedCategory;
temp.relevanceProductBrand = v.associatedBrand;
temp.price = v.price;
temp.stock = v.supplierInventory;
temp.tax = v.isHasTax;
temp.taxRate = v.taxRate;
const vendorMemberName = schemaAction.getFieldValue('vendorMemberName')
const vendorMemberId = schemaAction.getFieldValue('vendorMemberId')
const vendorRoleId = schemaAction.getFieldValue('vendorRoleId')
let processData = value.map(v => ({
...v,
tax: true,
// @ 配送方式 默认物流
temp.logistics = 1
return temp
})
let originIds = tempOriginData.map(item => item.id)
logistics: 1,
// 冗余会员信息
vendorMemberName,
vendorMemberId,
vendorRoleId,
}))
let originIds = tempOriginData.map(item => item.productId)
processData.map(item => {
if(!originIds.includes(item.id)) {
if(!originIds.includes(item.productId)) {
tempOriginData.push(item)
}
})
......@@ -123,35 +114,19 @@ const MaterialModalTable:React.FC<MaterialModalTableProps> = (props) => {
}
const handleConfirm = async () => {
// 判断所选择的商品是否属于同一个工作流
console.log(rowSelectionCtl, 'rowSelectionCtl')
// @ts-ignore
// const res = await PublicApi.postOrderIsWorkFlow({
// memberId: schemaAction.getFieldValue('vendorMemberId'),
// memberRoleId: schemaAction.getFieldValue('vendorRoleId'),
// productIds: rowSelectionCtl.selectRow.map(item => item.associatedDataId),
// orderMode: schemaAction.getFieldValue('orderMode')
// }, { ctlType: 'none' })
// if (res.code === 1000) {
const productData = schemaAction.getFieldValue('products')
schemaAction.setFieldValue('products', addMaterialProcessField(rowSelectionCtl.selectRow, productData))
confirmModal && confirmModal()
setVisible(false)
// }
// else {
// message.error(res.message)
// }
}
const fetchMaterialList = (values) => {
const contract = schemaAction.getFieldValue('contract')
const contractId = contract['id'] || contract['contractId']
const requisitionId = schemaAction.getFieldValue('requisitionId')
const params = {
...values,
contractId,
requisitionId,
}
return fetchOrderApi.getContractPurchaseMaterielList(params)
return fetchOrderApi.getRequisitionPurchaseMaterielList(params)
}
......@@ -168,11 +143,11 @@ const MaterialModalTable:React.FC<MaterialModalTableProps> = (props) => {
resetModal={{destroyOnClose: true}}
modalType='none'
tableProps={{
rowKey: 'id',
rowKey: 'productId',
onRow: (record) => ({
onClick: () => {
rowSelectionCtl.appendSelectRow(record);
rowSelectionCtl.appendSelectRowKeys(record.id);
rowSelectionCtl.appendSelectRowKeys(record.productId);
},
})
}}
......@@ -184,7 +159,7 @@ const MaterialModalTable:React.FC<MaterialModalTableProps> = (props) => {
useStateFilterSearchLinkageEffect(
$,
actions,
'code',
'productNo',
FORM_FILTER_PATH,
);
}
......
......@@ -2,6 +2,7 @@ import React, { useState, useRef, useContext } from 'react'
import { Form, Input, Select, Popover, Row } from 'antd';
import { EnvironmentOutlined } from '@ant-design/icons';
import { PublicApi } from '@/services/api';
import { FormDetailContext } from '@/formSchema/context';
export interface MaterialTableCellProps {
title: React.ReactNode;
......@@ -47,6 +48,7 @@ export const MaterialTableCell:React.FC<MaterialTableCellProps> = ({
}) => {
const formItemRef = useRef<any>();
const { form } = useContext(EditableContext);
const { formContext } = useContext(FormDetailContext);
// 是否显示地址
const [showAddress, setShowAddress] = useState<boolean>(false)
......@@ -62,12 +64,14 @@ export const MaterialTableCell:React.FC<MaterialTableCellProps> = ({
setReceiveInfo(() => deliveryAddress[0])
}
const save = async e => {
const save = async () => {
try {
const values = await form.validateFields();
values.purchaseCount = Number(values.quantity) || 0
handleSave({ ...record, ...values });
formContext.ctl.setInnerFormErrors(0)
} catch (errInfo) {
formContext.ctl.setInnerFormErrors(errInfo.errorFields.length)
console.log('Save failed:', errInfo);
}
};
......
......@@ -8,14 +8,15 @@ import AddressModal from '../addressModal'
import { fetchOrderApi } from '../../apis'
import { PublicApi } from '@/services/api'
const SelectStyles = styled((props) => <div className='select-list' {...props}></div>)`
const SelectStyles = styled((props) => <div className='select-list' style={{display: 'flex'}} {...props}></div>)`
.select_style_border {
border: 1px solid #EEF0F3;
margin-top: 20px;
// margin-top: 20px;
display: flex;
align-items: center;
justify-content: space-between;
padding: 8px 14px;
flex: 1;
cursor: pointer;
line-height: 28px;
position:relative;
......@@ -118,11 +119,11 @@ const SelectAddress = (props: ISchemaFieldComponentProps) => {
}
return (
<div style={{ width: '100%' }}>
{editable && <Button block onClick={handleAdd} icon={<PlusOutlined />}>新建地址</Button>}
<SelectStyles>
<div style={{ width: '100%'}}>
{/* {editable && <Button block onClick={handleAdd} icon={<PlusOutlined />}>新建地址</Button>} */}
<SelectStyles><Row gutter={[16, 16]} style={{width: '100%'}}>
{
showDataSource.map(v => <div key={v.id} onClick={() => handleCheck(v)} className={cx('select_style_border', checkedId === v.id ? 'active' : '')}>
showDataSource.map(v => <Col span={12}><div key={v.id} onClick={() => handleCheck(v)} className={cx('select_style_border', checkedId === v.id ? 'active' : '')}>
<div>
<Row style={{ color: '#303133' }}>
<Col>{v.receiverName}</Col>
......@@ -142,11 +143,20 @@ const SelectAddress = (props: ISchemaFieldComponentProps) => {
<EyeOutlined onClick={(e) => handleEdit(v, e, 'preview')} />
}
</Space>
</div>)
}
</SelectStyles>
</div></Col>)
}
{editable && <Col span={12}>
<div
className='select_style_border'
style={{width: '100%', height: '100%', borderStyle: "dashed"}}
onClick={handleAdd}
>
<p style={{width: '100%', textAlign: 'center'}}><PlusOutlined />&nbsp;新增地址</p>
</div>
</Col>}
</Row></SelectStyles>
{transformData.length > 3 &&
<div onClick={toogleMore} style={{ textAlign: 'center', cursor: 'pointer' }}>
<div onClick={toogleMore} style={{ textAlign: 'center', cursor: 'pointer', color: '#00b37a' }}>
显示更多{showMore ? <CaretDownOutlined /> : <CaretUpOutlined />}
</div>
}
......
......@@ -13,9 +13,9 @@
.invoice_list {
position: relative;
display: flex;
// display: flex;
margin: 0 -10px;
flex-wrap: wrap;
// flex-wrap: wrap;
.invoice_list_item {
display: flex;
......@@ -70,6 +70,18 @@
}
}
.select_style_border {
border: 1px solid #EEF0F3;
// display: flex;
// align-items: center;
// justify-content: space-between;
// padding: 8px 14px;
// flex: 1;
// cursor: pointer;
// line-height: 28px;
// position:relative;
}
:global {
span.ant-radio+* {
display: block;
......@@ -82,7 +94,7 @@
align-items: center;
height: 72px;
background-color: #FAFAFA;
margin: 10px;
// margin: 10px;
padding-left: 16px;
}
......
import React, { useState, useRef } from 'react'
import { ISchemaFieldComponentProps, useFieldState } from '@formily/antd'
import { Button, Radio } from 'antd'
import { Button, Col, Radio, Row } from 'antd'
import { PlusOutlined, CaretUpOutlined, CaretDownOutlined } from '@ant-design/icons'
import cx from 'classnames'
import { fetchOrderApi } from '../../apis'
......@@ -24,9 +24,6 @@ const TheInvoiceList = (props: ISchemaFieldComponentProps) => {
const { pageStatus, id } = usePageStatus()
// const [useValue, setUseValue] = useState(() => typeof value === 'object' ? value : dataSource.find(v => v.id === value))
// let useValue = typeof value === 'object' ? value : dataSource.find(v => v.id === value)
if(pageStatus === PageStatus.ADD) {
if(typeof value === 'object') {
......@@ -155,11 +152,12 @@ const TheInvoiceList = (props: ISchemaFieldComponentProps) => {
return (
<div style={{width: '100%'}} className={styles.invoice}>
{ editable && <Button block onClick={handleAdd} icon={<PlusOutlined/>}>新增发票</Button> }
{/* { editable && <Button block onClick={handleAdd} icon={<PlusOutlined/>}>新增发票</Button> } */}
<Radio.Group className={styles.raido_group} value={useValue} onChange={e => handleCheck(e)}>
<div className={styles.invoice_list}>
<Row gutter={[16, 16]}>
{
showDataSource.map((item, index) => (
showDataSource.map((item, index) => (<Col span={12}>
<Radio className={styles.list_radio} value={item} key={`address_list_radio_${item?.id}`}>
<div className={styles.invoice_list_item} key={`invoice_list_item_${index}`}>
<div className={styles.invoice_list_item_content}>
......@@ -188,13 +186,22 @@ const TheInvoiceList = (props: ISchemaFieldComponentProps) => {
}
</div>
</Radio>
))
}
</Col>))
}
{ editable && <Col span={12}>
<div
className={styles.select_style_border}
style={{width: '100%', height: '100%', borderStyle: "dashed"}}
onClick={handleAdd}
>
<p style={{width: '100%', textAlign: 'center', fontSize: 12, marginTop: 14}}><PlusOutlined />&nbsp;新增发票</p>
</div>
</Col> }
</Row>
</div>
</Radio.Group>
{ transformData.length > 3 &&
<div onClick={toogleMore} style={{textAlign: 'center', cursor: 'pointer'}}>
<div onClick={toogleMore} style={{textAlign: 'center', cursor: 'pointer', color: '#00b37a'}}>
显示更多{showMore ? <CaretDownOutlined /> : <CaretUpOutlined/>}
</div>
}
......
......@@ -22,7 +22,7 @@ export const PriceComp = (props) => {
</div>
}
/** 修改合同下单 初始值转换 */
/** 修改请购单下单 初始值转换 */
export const procurmentRenderInit = (initValue: any) => {
return {
......@@ -41,9 +41,8 @@ export const procurmentRenderInit = (initValue: any) => {
digest: initValue.digest,
deliverDate: initValue.consignee.deliverDate,
theInvoiceId: initValue.invoice?.invoiceId || null,
hasContract: initValue.hasContract,
requisitionNo: initValue.contract.requisitionNo,
contract: {...initValue.contract},
requisitionNo: initValue.requisitionNo,
requisitionId: initValue.requisitionId,
}
}
......@@ -55,8 +54,6 @@ export const procurementRenderField = (data) => {
...item,
logistics: item.deliverType,
id: item.productId,
code: item.productNo,
type: item.spec,
// 冗余memberId memberRoleId查询自提地址使用
memberId: data.vendorMemberId,
memberRoleId: data.vendorRoleId,
......
......@@ -29,6 +29,7 @@ import { FormDetailContext } from '@/formSchema/context'
import FormDetailWrapper from '@/components/FormDetailWrapper'
import { useFormDetail } from '@/formSchema/effects/useFormDetail'
import { filterProductDataById } from '../orderCollect/components/productModalTable'
import moment from 'moment'
export interface AddRequisitionOrderProps { }
......@@ -140,18 +141,23 @@ const AddRequisitionOrder:React.FC<AddRequisitionOrderProps> = (props) => {
} = requisitionData
addSchemaAction.setFieldValue('requisitionId', requisitionId)
addSchemaAction.setFieldValue('requisitionNo', requisitionNo)
addSchemaAction.setFieldValue('deliverDate', deliverTime)
addSchemaAction.setFieldValue('deliverDate', moment(deliverTime).format('YYYY-MM-DD HH:mm'))
addSchemaAction.setFieldValue('digest', digest)
addSchemaAction.setFieldValue('vendorMemberName', vendorMemberName)
addSchemaAction.setFieldValue('vendorMemberId', vendorMemberId)
addSchemaAction.setFieldValue('vendorRoleId', vendorRoleId)
let newData = product.products.map((v: any) => {
// 默认含税
v.tax = true
// @ 配送方式 默认物流
v.logistics = 1
// 冗余供应会员 用于查询自提地址
v.memberId = vendorMemberId
v.memberName = vendorMemberName
v.memberRoleId = vendorRoleId
return v
})
addSchemaAction.setFieldValue('products', product.products)
addSchemaAction.setFieldValue('products', newData)
}
}
......@@ -161,9 +167,17 @@ const AddRequisitionOrder:React.FC<AddRequisitionOrderProps> = (props) => {
// 新增订单/编辑订单
const params = { ...value }
console.log(value)
// 校验采购数量
if(formContext.innerFormErrors) {
throw new Error('请完善订单物料数据')
}
// 校验采购数量 单价和税率
const judgementByPrice = []
const judgementByCount = params.products?.length && params.products.map(item => {
if(item.price) {
judgementByPrice.push(true)
} else {
judgementByPrice.push(false)
}
if(item.quantity){
return true
} else {
......@@ -173,14 +187,16 @@ const AddRequisitionOrder:React.FC<AddRequisitionOrderProps> = (props) => {
if(!judgementByCount || judgementByCount.includes(false)){
throw new Error('请填写商品采购数量')
}
if(judgementByPrice.includes(false)){
throw new Error('请填写商品单价')
}
// 使用发票即校验发票id
if(params.hasInvoice && !params.theInvoiceId) {
throw new Error('请新增或选择需要使用的发票')
}
setBtnLoading(true)
/** 字段转换 */
// 合同下单 取供应商默认的发货地址
// 请购单下单 取供应商默认的发货地址
const { data: deliveryAddress} = await PublicApi.getLogisticsSelectListMemberShipperAddress({
memberId: params.vendorMemberId,
roleId: params.vendorRoleId
......@@ -244,18 +260,18 @@ const AddRequisitionOrder:React.FC<AddRequisitionOrderProps> = (props) => {
const _params = procurementProcessField(params)
console.log(_params)
// if(id) {
// fnResult = await PublicApi.postOrderBuyerCreateSrmUpdate({..._params, orderId: id})
// } else {
// fnResult = await PublicApi.postOrderBuyerCreateSrm(_params)
// }
// if (fnResult.code === 1000) {
// setTimeout(() => {
// history.push("/memberCenter/tranactionAbility/purchaseOrder/readyAddSrmOrder")
// }, 1000)
// } else {
if(id) {
fnResult = await PublicApi.postOrderBuyerUpdateRequisition({..._params, orderId: id})
} else {
fnResult = await PublicApi.postOrderBuyerCreateRequisition(_params)
}
if (fnResult.code === 1000) {
setTimeout(() => {
history.push("/memberCenter/tranactionAbility/purchaseOrder/readyAddRequisitionOrder")
}, 1000)
} else {
setBtnLoading(false)
// }
}
} catch (error) {
setBtnLoading(false)
error?.message && message.error(error.message)
......@@ -300,12 +316,12 @@ const AddRequisitionOrder:React.FC<AddRequisitionOrderProps> = (props) => {
<ReadyAddOrderDetailContext.Provider value={providerValue}>
<Card className={styles.orderCollectCard} style={{marginTop: 24}}> */}
<FormDetailContext.Provider value={providerValue}>
<FormDetailContext.Provider value={providerValue}>
<FormDetailHeader
title={id?"编辑":"新增"}
schema={initFormSchema}
extraRight={[
<Button key="1" onClick={() => addSchemaAction.submit()} loading={formLoading} type="primary" icon={<SaveOutlined />}>
<Button key="1" onClick={() => addSchemaAction.submit()} loading={btnLoading} type="primary" icon={<SaveOutlined />}>
保存
</Button>,
]}
......@@ -351,6 +367,7 @@ const AddRequisitionOrder:React.FC<AddRequisitionOrderProps> = (props) => {
// 商品信息的改动 驱动支付信息变化
useProductTableChangeForPay(ctx, update)
// 注入表单完成进度
formContext.useAttachmentChangeForContext(ctx)
}}
......@@ -369,7 +386,7 @@ const AddRequisitionOrder:React.FC<AddRequisitionOrderProps> = (props) => {
{/* </Card> */}
</FormDetailWrapper>
</FormDetailContext.Provider>
</FormDetailContext.Provider>
{/* 选择供应会员 */}
<MemberModalTable currentRef={memberRef} productRef={materialRef} schemaAction={addSchemaAction}/>
{/* 选择请购单 */}
......
import React, { useState, useEffect } from 'react'
import { OrderModalType } from '@/constants/order'
import { PublicApi } from '@/services/api'
import { useLocation, history } from 'umi'
import { ISchemaFormActions } from '@formily/antd'
interface DetailOrderLocationState {
// 进货单商品列表
productList?: any[],
// 下单模式
modelType?: OrderModalType
}
interface DetailOptionsProps {
addSchemaAction: ISchemaFormActions
}
export const useDetailOrder = (options: DetailOptionsProps) => {
const { addSchemaAction } = options
const locationState = useLocation<DetailOrderLocationState>().state || {}
const { productList } = locationState
const { modelType } = history.location.query
// 是否显示选择商品按钮
const [showProBtn, setShowProBtn] = useState(false)
// 是否显示供应会员字段
const [showMemberType, setShowMemberType] = useState(false)
const [visibleMember, setVisibleMember] = useState(false)
// 商品列表, 如果路由state中 带有productList, 说明是进货单下单, 需要回显进货单商品数据
const [proList, setProList] = useState<any[]>(() => productList || [])
// 回显数据写在这
useEffect(() => {
// 页面中有传入下单模式, 需要手动回显数据
if (modelType) {
addSchemaAction.setFieldValue('orderMode', parseInt(modelType))
}
// 在有传入商品列表时 需手动回显
if (proList.length > 0) {
addSchemaAction.setFieldValue('orderProductRequests', proList)
addSchemaAction.setFieldValue('orderThe', proList[0].name)
}
}, [modelType, productList])
// 唤起新增订单
const fetchAddOrder = async (params) => {
await PublicApi.postOrderProcurementOrderAdd(params)
}
return {
showProBtn,
setShowProBtn,
showMemberType,
setShowMemberType,
fetchAddOrder,
proList,
modelType,
visibleMember,
setVisibleMember
}
}
......@@ -26,17 +26,17 @@ export const getUnitPriceTotal = (record) => {
*/
export const useMaterialTable = (ctx: ISchemaFormActions | ISchemaFormAsyncActions) => {
const materialRef = useRef<any>({})
const { visible, setVisible, rowSelection, rowSelectionCtl } = useModalTable({type: 'checkbox'})
const { visible, setVisible, rowSelection, rowSelectionCtl } = useModalTable({type: 'checkbox', customKey: 'productId'})
const handleDelete = (record) => {
const newData = [...ctx.getFieldValue('products')]
// 删除formvalue
const colIndex = newData.findIndex(v => v.id === record.id)
const colIndex = newData.findIndex(v => v.productId === record.productId)
newData.splice(colIndex, 1)
// 删除选中的项
rowSelectionCtl.setSelectRow(newData)
rowSelectionCtl.setSelectedRowKeys(newData.map(v => v.id))
rowSelectionCtl.setSelectedRowKeys(newData.map(v => v.productId))
ctx.setFieldValue('products', newData)
}
......@@ -44,26 +44,27 @@ export const useMaterialTable = (ctx: ISchemaFormActions | ISchemaFormAsyncActio
const [materialColumns, setMaterialColumns] = useState(() => {
const { pageStatus } = usePageStatus()
const tempColumn = [...materialInfoColumns]
if (pageStatus === PageStatus.ADD) {
// 渲染操作
materialInfoColumns[materialInfoColumns.length - 1].render = (text, record) => <Button type='link' onClick={() => handleDelete(record)}>删除</Button>
// 渲染单价
materialInfoColumns[7].render = (t, r) => <span style={{color: 'red'}}>{Number(r.price).toFixed(2)}</span>
tempColumn[tempColumn.length - 1].render = (text, record) => <Button type='link' onClick={() => handleDelete(record)}>删除</Button>
// // 渲染单价
// tempColumn[7].render = (t, r) => <span style={{color: 'red'}}>¥ {Number(r.price).toFixed(2)}</span>
} else {
// 渲染单价
materialInfoColumns[7].render = (t, r) => <span style={{color: 'red'}}>{Number(r.price).toFixed(2)}</span>
// tempColumn[7].render = (t, r) => <span style={{color: 'red'}}>¥ {Number(r.price).toFixed(2)}</span>
materialInfoColumns.pop()
tempColumn.pop()
}
return materialInfoColumns
return tempColumn
})
const handleShowMaterial = () => {
const supplyMembersId = ctx.getFieldValue('vendorMemberId')
const products = ctx.getFieldValue('products')
if (supplyMembersId) {
materialRef.current.setVisible(true)
materialRef.current.rowSelectionCtl.setSelectedRowKeys(() => products.map(item => item.id))
materialRef.current.rowSelectionCtl.setSelectedRowKeys(() => products.map(item => item.productId))
} else {
message.error('请先选择采购询价合同')
}
......@@ -80,7 +81,7 @@ export const useMaterialTable = (ctx: ISchemaFormActions | ISchemaFormAsyncActio
const handleSave = row => {
return new Promise((resolve, reject) => {
const newData = [...ctx.getFieldValue('products')];
const index = newData.findIndex(item => row.id === item.id);
const index = newData.findIndex(item => row.productId === item.productId);
const item = newData[index];
// 算单行价格
row['amount'] = getUnitPriceTotal(row)
......
......@@ -341,10 +341,10 @@ const basicInfo: ISchema = {
required: true,
enum: [{
label: '请购单下单',
value: 10,
value: 15,
}],
title: '下单模式',
default: 10,
default: 15,
"x-component-props": {
disabled: true,
}
......@@ -366,6 +366,7 @@ const basicInfo: ISchema = {
requisitionNo: {
type: 'string',
title: '对应请购单',
required: true,
"x-component-props": {
disabled: true,
addonAfter: "{{orderRequisition}}"
......@@ -450,7 +451,7 @@ export const orderMaterial: ISchema = {
"x-component": 'MultTable',
required: true,
"x-component-props": {
rowKey: 'materialId',
rowKey: 'productId',
columns: "{{materialColumns}}",
components: "{{materialComponents}}",
prefix: "{{materialAddButton}}",
......@@ -505,6 +506,14 @@ const submitInfo: ISchema = {
},
}
},
FLEX_LAYOUT_RIGHT: {
type: 'object',
"x-component": 'mega-layout',
"x-component-props": {
labelCol: 2,
wrapperCol: 22,
},
properties: {
deliveryAddresId: {
type: 'string',
"x-component": 'SelectAddress',
......@@ -526,31 +535,33 @@ const submitInfo: ISchema = {
title: '送货地址'
}
}
},
}
}
}
}
// 其他信息
const ortherInfo: ISchema = {
// 发票信息
const invoiceInfo: ISchema = {
"x-index": 4,
type: 'object',
"x-component": 'MellowCard',
"x-component-props": {
title: '其他信息',
id: 'otherInfo'
title: '发票信息',
id: 'invoiceInfo'
},
properties: {
NO_SUBMIT_LAYOUT_ORTHER: {
type: 'object',
"x-component": 'mega-layout',
"x-component-props": {
labelCol: 4,
wrapperCol: 18,
labelCol: 2,
wrapperCol: 9,
labelAlign: "left",
grid: true,
full: true,
autoRow: true,
columns: 2,
columns: 1,
},
properties: {
hasInvoice: {
......@@ -572,11 +583,84 @@ const ortherInfo: ISchema = {
}
]
},
FLEX_LAYOUT_RIGHT: {
type: 'object',
"x-component": 'mega-layout',
"x-component-props": {
labelCol: 2,
wrapperCol: 22,
},
properties: {
theInvoiceId: {
type: 'number',
title: ' ',
"x-component": "theInvoiceList",
"x-component-props": {
times: 0,
}
},
}
},
}
}
}
}
// 其他信息
const ortherInfo: ISchema = {
"x-index": 5,
type: 'object',
"x-component": 'MellowCard',
"x-component-props": {
title: '其他信息',
id: 'otherInfo'
},
properties: {
NO_SUBMIT_LAYOUT_ORTHER: {
type: 'object',
"x-component": 'mega-layout',
"x-component-props": {
labelCol: 4,
wrapperCol: 18,
labelAlign: "left",
grid: true,
full: true,
autoRow: true,
columns: 2,
},
properties: {
// hasInvoice: {
// type: 'boolean',
// "x-component": 'CheckboxSingle',
// "x-component-props": {
// children: '需要发票',
// style: {
// marginTop: 4,
// }
// },
// title: '发票',
// default: false,
// "x-linkages": [
// {
// type: 'value:visible',
// target: 'theInvoiceId',
// condition: "{{$value}}"
// }
// ]
// },
// theInvoiceId: {
// type: 'number',
// title: ' ',
// "x-component": "theInvoiceList",
// "x-component-props": {
// times: 0,
// }
// },
pack: {
type: 'string',
"x-component": 'textarea',
"x-component-props": {
rows: 4
rows: 1
},
title: '包装要求',
"x-rules": [
......@@ -586,19 +670,11 @@ const ortherInfo: ISchema = {
}
]
},
theInvoiceId: {
type: 'number',
title: ' ',
"x-component": "theInvoiceList",
"x-component-props": {
times: 0,
}
},
remark: {
type: 'string',
"x-component": 'textarea',
"x-component-props": {
rows: 4
rows: 1
},
title: '其他要求',
"x-rules": [
......@@ -620,6 +696,7 @@ export const orderAddSchema: ISchema = {
basicInfo,
submitInfo,
orderMaterial,
invoiceInfo,
ortherInfo,
}
}
......@@ -48,20 +48,21 @@ export const useMaterialTable = (ctx: ISchemaFormActions | ISchemaFormAsyncActio
const [materialColumns, setMaterialColumns] = useState(() => {
const { pageStatus } = usePageStatus()
const tempColumn = [...materialInfoColumns]
if (pageStatus === PageStatus.ADD) {
// 渲染操作
materialInfoColumns[materialInfoColumns.length - 1].render = (text, record) => <Button type='link' onClick={() => handleDelete(record)}>删除</Button>
tempColumn[tempColumn.length - 1].render = (text, record) => <Button type='link' onClick={() => handleDelete(record)}>删除</Button>
// 渲染单价
materialInfoColumns[7].render = (t, r) => <span style={{color: 'red'}}>{Number(r.price).toFixed(2)}</span>
tempColumn[7].render = (t, r) => <span style={{color: 'red'}}>{Number(r.price).toFixed(2)}</span>
} else {
// 渲染单价
materialInfoColumns[7].render = (t, r) => <span style={{color: 'red'}}>{Number(r.price).toFixed(2)}</span>
tempColumn[7].render = (t, r) => <span style={{color: 'red'}}>{Number(r.price).toFixed(2)}</span>
// materialInfoColumns[materialInfoColumns.length - 1].render = (t, r) => null
materialInfoColumns.pop()
// tempColumn[tempColumn.length - 1].render = (t, r) => null
tempColumn.pop()
}
return materialInfoColumns
return tempColumn
})
const handleShowMaterial = () => {
const supplyMembersId = ctx.getFieldValue('vendorMemberId')
......
......@@ -12,7 +12,6 @@ import { FORM_FILTER_PATH } from '@/formSchema/const'
import Submit from '@/components/NiceForm/components/Submit'
import { useSelfTable } from './model/useReadyAddOrder'
import { useHttpRequest } from '@/hooks/useHttpRequest'
import DateRangePickerUnix from '@/components/NiceForm/components/DateRangePickerUnix'
import '../index.less'
/**
......@@ -22,7 +21,7 @@ import '../index.less'
export interface ReadyAddRequisitionOrderProps {}
const fetchTableData = async (params) => {
const { data } = await PublicApi.getOrderBuyerCreateSrmPage(params)
const { data } = await PublicApi.getOrderBuyerCreateRequisitionPage(params)
return data
}
......@@ -91,7 +90,6 @@ const ReadyAddRequisitionOrder:React.FC<ReadyAddRequisitionOrderProps> = () => {
);
},
components: {
DateRangePickerUnix,
Submit
}
},
......
import { ISchema } from '@formily/antd';
import { FORM_FILTER_PATH } from '@/formSchema/const';
import { getPurchaseOrderReadyAddPageSelectOption } from '@/pages/transaction/effect';
import { ORDER_TYPE_INQUIRYT_PURCHASE } from '@/constants/order';
export const tableListSchema: any = () => {
const res = getPurchaseOrderReadyAddPageSelectOption()
if(res) {
const {
orderTypes: OrderType,
} = res
return {
type: 'object',
properties: {
......@@ -44,19 +35,8 @@ export const tableListSchema: any = () => {
placeholder: '请输入供应会员名称'
}
},
"orderType": {
type: 'string',
"x-component-props": {
placeholder: '请选择订单类型'
},
enum: OrderType.filter(item => item.id !== ORDER_TYPE_INQUIRYT_PURCHASE).map(item => ({
label: item['text'],
value: item['id'],
}))
},
"[startDate,endDate]": {
type: 'daterange',
// "x-component": 'DateRangePickerUnix',
'x-component-props': {
placeholder: ['开始时间','结束时间'],
},
......@@ -71,5 +51,4 @@ export const tableListSchema: any = () => {
},
}
}
}
}
......@@ -2,6 +2,8 @@ import React, { useState, useRef, useContext } from 'react'
import { Form, Input, Select, Popover, Row } from 'antd';
import { EnvironmentOutlined } from '@ant-design/icons';
import { PublicApi } from '@/services/api';
import { useFormDetail } from '@/formSchema/effects/useFormDetail';
import { FormDetailContext } from '@/formSchema/context';
export interface MaterialTableCellProps {
title: React.ReactNode;
......@@ -47,6 +49,7 @@ export const MaterialTableCell:React.FC<MaterialTableCellProps> = ({
}) => {
const formItemRef = useRef<any>();
const { form } = useContext(EditableContext);
const { formContext } = useContext(FormDetailContext);
// 是否显示地址
const [showAddress, setShowAddress] = useState<boolean>(false)
......@@ -62,11 +65,13 @@ export const MaterialTableCell:React.FC<MaterialTableCellProps> = ({
setReceiveInfo(() => deliveryAddress[0])
}
const save = async e => {
const save = async () => {
try {
const values = await form.validateFields();
handleSave({ ...record, ...values });
formContext.ctl.setInnerFormErrors(0)
} catch (errInfo) {
formContext.ctl.setInnerFormErrors(errInfo.errorFields.length)
console.log('Save failed:', errInfo);
}
};
......
......@@ -91,7 +91,9 @@ const IncreaseRequisition:React.FC<{}> = () => {
// 新增订单/编辑订单
const params = { ...value }
console.log(value)
if(formContext.innerFormErrors) {
throw new Error('请完善订单物料数据')
}
// 校验采购数量
const judgementByCount = params.products?.length && params.products.map(item => {
if(item.quantity){
......
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