Commit 36b1d871 authored by 前端-钟卫鹏's avatar 前端-钟卫鹏

fix: 新增采购/销售发货单、新增物流单翻译

parent 441c2c1b
......@@ -334,6 +334,44 @@ export default {
'purchaseOrder.querenshenhecao': 'Confirm review operation',
'purchaseOrder.shifouquerenshen': 'Whether to confirm the review of the warehouse receipt number is',
'purchaseOrder.decaigouruku': 'Purchase receipt order?',
'purchaseOrder.bianjixiaoshoufa': 'Edit sales invoices',
'purchaseOrder.xinzengxiaoshoufa': 'New sales invoices',
'purchaseOrder.shangpinmingcheng': 'product name',
'purchaseOrder.pinlei': 'category',
'purchaseOrder.pinpai': 'brand',
'purchaseOrder.danwei': 'unit',
'purchaseOrder.dinggoushuliang': 'quantity ordered',
'purchaseOrder.danjia(yuan)': 'Unit Price(YUAN)',
'purchaseOrder.fahuoshuliang': 'quantity shipped',
'purchaseOrder.fahuojine': 'Shipment Amount(YUAN)',
'purchaseOrder.jibenxinxi': 'basic information',
'purchaseOrder.danjuleixing': 'Type of document',
'purchaseOrder.caigoushouhuodan': 'Purchase receipt',
'purchaseOrder.qingshurudanju': 'Please enter a summary of the documents',
'purchaseOrder.danjushijian': 'Documents time',
'purchaseOrder.duiyingcangku': 'Corresponding to the warehouse',
'purchaseOrder.cangkurenyuan': 'storekeeper',
'purchaseOrder.beizhu': 'remark',
'purchaseOrder.xiangguanxinxi': 'relevant information',
'purchaseOrder.duiyingdanju': 'Corresponding documents',
'purchaseOrder.peisongfangshi': 'mode of distribution',
'purchaseOrder.guanliandanju': 'Associated documents',
'purchaseOrder.fahuodizhi': 'ship address',
'purchaseOrder.huiyuanmingcheng': 'Member name',
'purchaseOrder.danjumingxi': 'The documents detailed',
'purchaseOrder.wuliu': 'logistics',
'purchaseOrder.ziti': 'noutoasiakas',
'purchaseOrder.wuxupeisong': 'No distribution',
'purchaseOrder.shuzhijingduyi': 'Numerical accuracy overflow',
'purchaseOrder.bixutianxie': 'Must fill in the',
'purchaseOrder.caigoushuliangjin': 'Purchase quantity is limited to three decimal places',
'purchaseOrder.danjiajinxiansi': 'The unit price is only four decimal places',
'purchaseOrder.zitidizhi': 'To the address',
'purchaseOrder.danjuzhaiyao': 'This paper documents',
'purchaseOrder.baocun': 'save',
'purchaseOrder.shanchu': 'delete',
'purchaseOrder.qingwanshancaigou': 'Please improve the commodity data of purchase receipt',
'saleOrder.daochuerweima': 'Export qr Code',
'saleOrder.tijiaoshenhe': 'Submit for review',
......@@ -489,7 +527,48 @@ export default {
'saleOrder.bianjixiaoshoufahuodan': 'Edit sales invoices',
'saleOrder.baocun': 'save',
'saleOrder.xuanze': 'select',
'saleOrder.danjumingxi': 'The documents detailed',
'saleOrder.xiangguanxinxi': 'relevant information',
'saleOrder.dinggoushuliang': 'quantity ordered',
'saleOrder.danjia(yuan)': 'Unit Price(YUAN)',
'saleOrder.fahuoshuliang': 'quantity shipped',
'saleOrder.fahuojine': 'Shipment Amount(YUAN)',
'saleOrder.jibenxinxi': 'basic information',
'saleOrder.danjuleixing': 'Type of document',
'saleOrder.xiaoshoufahuodan': 'Sales invoices',
'saleOrder.danjuzhaiyao': 'This paper documents',
'saleOrder.qingshurudanju': 'Please enter a summary of the documents',
'saleOrder.duiyingcangku': 'Corresponding to the warehouse',
'saleOrder.cangkurenyuan': 'warehouse worker',
'saleOrder.beizhu': 'remark',
'saleOrder.duiyingdanju': 'Corresponding documents',
'saleOrder.guanliandanju': 'Associated documents',
'saleOrder.shouhuodizhi': 'shipping address',
'saleOrder.wuliu': 'logistics',
'saleOrder.ziti': 'noutoasiakas',
'saleOrder.wuxupeisong': 'No distribution',
'saleOrder.shuzhijingduyi': 'Numerical accuracy overflow',
'saleOrder.bixutianxie': 'Must fill in the',
'saleOrder.caigoushuliangjin': 'Purchase quantity is limited to three decimal places',
'saleOrder.danjiajinxiansi': 'The unit price is only four decimal places',
'saleOrder.zitidizhi': 'To the address',
'saleOrder.xuanzeshangpin': 'choose products',
'saleOrder.zongxiangshu': 'total cartons',
'saleOrder.zongzhongliang': 'total weight',
'saleOrder.zongtiji': 'total volume',
'saleOrder.shuliang': 'amount',
'saleOrder.xiangshu': 'carton numbers',
'saleOrder.zhongliang': 'weight',
'saleOrder.tiji': 'volume',
'saleOrder.wuliufuwushang': 'logistics providers',
'saleOrder.fahuodizhi': 'ship address',
'saleOrder.duiyingfahuodan': 'Corresponding to invoice number',
'saleOrder.duiyingdingdanhao': 'Corresponding order number/after-sale order',
'saleOrder.shouhuofang': 'receiving party',
'saleOrder.wuliudanmingxi': 'Logistics details',
'saleOrder.yunfeixinxi': 'The freight information',
'saleOrder.yunfei': 'freight',
'saleOrder.jiesuanfangshi': 'clearing form',
// Requisitions
......
......@@ -334,6 +334,44 @@ export default {
'purchaseOrder.querenshenhecao': '감사 작업 확인',
'purchaseOrder.shifouquerenshen': '감사 입고 양식 번호가',
'purchaseOrder.decaigouruku': '의 구매 입고서?',
'purchaseOrder.bianjixiaoshoufa': '판매 인보이스 편집',
'purchaseOrder.xinzengxiaoshoufa': '신규 판매 인보이스',
'purchaseOrder.shangpinmingcheng': '상품명',
'purchaseOrder.pinlei': '종류',
'purchaseOrder.pinpai': '브랜드',
'purchaseOrder.danwei': '단위',
'purchaseOrder.dinggoushuliang': '주문 수량',
'purchaseOrder.danjia(yuan)': '단가(원)',
'purchaseOrder.fahuoshuliang': '출하 수량',
'purchaseOrder.fahuojine': '발송금액(원)',
'purchaseOrder.jibenxinxi': '기본 정보',
'purchaseOrder.danjuleixing': '증빙서류 종류',
'purchaseOrder.caigoushouhuodan': '구매 인보이스',
'purchaseOrder.qingshurudanju': '증빙서류 요약을 입력하십시오',
'purchaseOrder.danjushijian': '서류 시간',
'purchaseOrder.duiyingcangku': '대응 저장소',
'purchaseOrder.cangkurenyuan': '창고 인원',
'purchaseOrder.beizhu': '비고난',
'purchaseOrder.xiangguanxinxi': '관련 정보',
'purchaseOrder.duiyingdanju': '대응 서류',
'purchaseOrder.peisongfangshi': '배송 방식',
'purchaseOrder.guanliandanju': '관련 서류',
'purchaseOrder.fahuodizhi': '발송 주소',
'purchaseOrder.huiyuanmingcheng': '회원 이름',
'purchaseOrder.danjumingxi': '증빙서류 명세',
'purchaseOrder.wuliu': '물류',
'purchaseOrder.ziti': '이후 제기',
'purchaseOrder.wuxupeisong': '배송이 필요 없습니다',
'purchaseOrder.shuzhijingduyi': '수치 정밀도가 오버플로우됩니다',
'purchaseOrder.bixutianxie': '필수로 기입하다',
'purchaseOrder.caigoushuliangjin': '구입 수량은 세 자리 소수로만 제한한다',
'purchaseOrder.danjiajinxiansi': '단가는 단지 네 자리 소수로만 제한된다',
'purchaseOrder.zitidizhi': '자동 주소',
'purchaseOrder.danjuzhaiyao': '증빙서류 적요',
'purchaseOrder.baocun': '간수하다',
'purchaseOrder.shanchu': '지우다',
'purchaseOrder.qingwanshancaigou': '송장 상품 데이터를 완벽하게 구입하십시오',
'saleOrder.daochuerweima': 'qr 코드를 내보내다',
'saleOrder.tijiaoshenhe': '제출 심사',
......@@ -487,7 +525,48 @@ export default {
'saleOrder.bianjixiaoshoufahuodan': '판매 인보이스 편집',
'saleOrder.baocun': '간수하다',
'saleOrder.xuanze': '고르다',
'saleOrder.danjumingxi': '증빙서류 명세',
'saleOrder.xiangguanxinxi': '관련 정보',
'saleOrder.dinggoushuliang': '주문 수량',
'saleOrder.danjia(yuan)': '단가(원)',
'saleOrder.fahuoshuliang': '출하 수량',
'saleOrder.fahuojine': '발송금액(원)',
'saleOrder.jibenxinxi': '기본 정보',
'saleOrder.danjuleixing': '증빙서류 종류',
'saleOrder.xiaoshoufahuodan': '인보이스 판매',
'saleOrder.danjuzhaiyao': '증빙서류 적요',
'saleOrder.qingshurudanju': '증빙서류 요약을 입력하십시오',
'saleOrder.duiyingcangku': '대응 저장소',
'saleOrder.cangkurenyuan': '창고 인원',
'saleOrder.beizhu': '비고난',
'saleOrder.duiyingdanju': '대응 서류',
'saleOrder.guanliandanju': '관련 서류',
'saleOrder.shouhuodizhi': '배송 주소',
'saleOrder.wuliu': '물류',
'saleOrder.ziti': '이후 제기',
'saleOrder.wuxupeisong': '배송이 필요 없습니다',
'saleOrder.shuzhijingduyi': '수치 정밀도가 오버플로우됩니다',
'saleOrder.bixutianxie': '필수로 기입하다',
'saleOrder.caigoushuliangjin': '구입 수량은 세 자리 소수로만 제한한다',
'saleOrder.danjiajinxiansi': '단가는 단지 네 자리 소수로만 제한된다',
'saleOrder.zitidizhi': '자동 주소',
'saleOrder.xuanzeshangpin': '상품을 선택하다',
'saleOrder.zongxiangshu': '총 상자 수',
'saleOrder.zongzhongliang': '총 중량',
'saleOrder.zongtiji': '총체적',
'saleOrder.shuliang': '수량',
'saleOrder.xiangshu': '상자 수',
'saleOrder.zhongliang': '중량',
'saleOrder.tiji': '체적',
'saleOrder.wuliufuwushang': '물류 서비스 업체',
'saleOrder.fahuodizhi': '발송 주소',
'saleOrder.duiyingfahuodan': '인보이스 번호에 대응됩니다',
'saleOrder.duiyingdingdanhao': '주문서/애프터세일즈 증명서에 대응합니다',
'saleOrder.shouhuofang': '납품처',
'saleOrder.wuliudanmingxi': '물류 명세서',
'saleOrder.yunfeixinxi': '운임 정보',
'saleOrder.yunfei': '운송비',
'saleOrder.jiesuanfangshi': '결제방법',
// 请购单
......
......@@ -334,6 +334,43 @@ export default {
'purchaseOrder.querenshenhecao': '确认审核操作',
'purchaseOrder.shifouquerenshen': '是否确认审核入库单号为',
'purchaseOrder.decaigouruku': '的采购入库单?',
'purchaseOrder.bianjixiaoshoufa': '编辑销售发货单',
'purchaseOrder.xinzengxiaoshoufa': '新增销售发货单',
'purchaseOrder.shangpinmingcheng': '商品名称',
'purchaseOrder.pinlei': '品类',
'purchaseOrder.pinpai': '品牌',
'purchaseOrder.danwei': '单位',
'purchaseOrder.dinggoushuliang': '订购数量',
'purchaseOrder.danjia(yuan)': '单价(元)',
'purchaseOrder.fahuoshuliang': '发货数量',
'purchaseOrder.fahuojine(': '发货金额(元)',
'purchaseOrder.jibenxinxi': '基本信息',
'purchaseOrder.danjuleixing': '单据类型',
'purchaseOrder.caigoushouhuodan': '采购收货单',
'purchaseOrder.qingshurudanju': '请输入单据摘要',
'purchaseOrder.danjushijian': '单据时间',
'purchaseOrder.duiyingcangku': '对应仓库',
'purchaseOrder.cangkurenyuan': '仓库人员',
'purchaseOrder.beizhu': '备注',
'purchaseOrder.xiangguanxinxi': '相关信息',
'purchaseOrder.duiyingdanju': '对应单据',
'purchaseOrder.peisongfangshi': '配送方式',
'purchaseOrder.guanliandanju': '关联单据',
'purchaseOrder.fahuodizhi': '发货地址',
'purchaseOrder.huiyuanmingcheng': '会员名称',
'purchaseOrder.danjumingxi': '单据明细',
'purchaseOrder.wuliu': '物流',
'purchaseOrder.ziti': '自提',
'purchaseOrder.wuxupeisong': '无需配送',
'purchaseOrder.shuzhijingduyi': '数值精度溢出',
'purchaseOrder.bixutianxie': '必须填写',
'purchaseOrder.caigoushuliangjin': '采购数量仅限三位小数',
'purchaseOrder.danjiajinxiansi': '单价仅限四位小数',
'purchaseOrder.zitidizhi': '自提地址',
'purchaseOrder.danjuzhaiyao': '单据摘要',
'purchaseOrder.baocun': '保存',
'purchaseOrder.shanchu': '删除',
'purchaseOrder.qingwanshancaigou': '请完善采购收货单商品数据',
'saleOrder.daochuerweima': '导出二维码',
'saleOrder.tijiaoshenhe': '提交审核',
......@@ -489,6 +526,46 @@ export default {
'saleOrder.xuanze': '选择',
'saleOrder.danjumingxi': '单据明细',
'saleOrder.xiangguanxinxi': '相关信息',
'saleOrder.dinggoushuliang': '订购数量',
'saleOrder.danjia(yuan)': '单价(元)',
'saleOrder.fahuoshuliang': '发货数量',
'saleOrder.fahuojine': '发货金额(元)',
'saleOrder.jibenxinxi': '基本信息',
'saleOrder.danjuleixing': '单据类型',
'saleOrder.xiaoshoufahuodan': '销售发货单',
'saleOrder.danjuzhaiyao': '单据摘要',
'saleOrder.qingshurudanju': '请输入单据摘要',
'saleOrder.duiyingcangku': '对应仓库',
'saleOrder.cangkurenyuan': '仓库人员',
'saleOrder.beizhu': '备注',
'saleOrder.duiyingdanju': '对应单据',
'saleOrder.guanliandanju': '关联单据',
'saleOrder.shouhuodizhi': '收货地址',
'saleOrder.wuliu': '物流',
'saleOrder.ziti': '自提',
'saleOrder.wuxupeisong': '无需配送',
'saleOrder.shuzhijingduyi': '数值精度溢出',
'saleOrder.bixutianxie': '必须填写',
'saleOrder.caigoushuliangjin': '采购数量仅限三位小数',
'saleOrder.danjiajinxiansi': '单价仅限四位小数',
'saleOrder.zitidizhi': '自提地址',
'saleOrder.xuanzeshangpin': '选择商品',
'saleOrder.zongxiangshu': '总箱数',
'saleOrder.zongzhongliang': '总重量',
'saleOrder.zongtiji': '总体积',
'saleOrder.shuliang': '数量',
'saleOrder.xiangshu': '箱数',
'saleOrder.zhongliang': '重量',
'saleOrder.tiji': '体积',
'saleOrder.wuliufuwushang': '物流服务商',
'saleOrder.fahuodizhi': '发货地址',
'saleOrder.duiyingfahuodan': '对应发货单号',
'saleOrder.duiyingdingdanhao': '对应订单号/售后单',
'saleOrder.shouhuofang': '收货方',
'saleOrder.wuliudanmingxi': '物流单明细',
'saleOrder.yunfeixinxi': '运费信息',
'saleOrder.yunfei': '运费',
'saleOrder.jiesuanfangshi': '结算方式',
// 请购单
......@@ -590,4 +667,5 @@ export default {
'purchaseRequisition.xinzengqinggoudan': '新增请购单',
'purchaseRequisition.baocun': '保存',
'purchaseRequisition.laiyuanshangcheng': '来源商城',
}
import React, { useEffect } from 'react'
import ModalTable, { ModalTableProps } from '@/components/ModalTable'
import { fetchOrderApi } from '../../apis'
import { useModalTable } from '../../model/useModalTable'
import { ISchemaFormActions, ISchemaFormAsyncActions } from '@formily/antd'
import { memberColumns } from '../../constant'
import { useIntl } from 'umi'
export interface MemberModalTableProps extends ModalTableProps {
type?: 'radio' | 'checkbox',
schemaAction: ISchemaFormActions | ISchemaFormAsyncActions,
currentRef?: any,
confirmModal?(),
productRef?: any,
}
const MemberModalTable:React.FC<MemberModalTableProps> = (props) => {
const { type = 'radio', schemaAction, confirmModal, currentRef, ...restProps } = props
const { visible, setVisible, rowSelection, rowSelectionCtl } = useModalTable({type, customKey: 'memberId'})
const intl = useIntl()
useEffect(() => {
if (currentRef) {
currentRef.current = {
setVisible,
visible,
rowSelectionCtl
}
}
}, [])
useEffect(() => {
if(visible) {
const memberId = schemaAction.getFieldValue('vendorMemberId')
rowSelectionCtl.setSelectedRowKeys([memberId])
}
}, [visible])
const handleConfirm = () => {
const rowItem = rowSelectionCtl.selectRow[0]
console.log(rowItem, 'row')
if (rowItem) {
schemaAction.setFieldValue('vendorRoleId', rowItem.roleId)
schemaAction.setFieldValue('vendorMemberId', rowItem.memberId)
schemaAction.setFieldValue('vendorMemberName', rowItem.name)
}
confirmModal && confirmModal()
setVisible(false)
}
return (
<ModalTable
modalTitle={intl.formatMessage({ id: 'purchaseRequisition.xuanzegongyinghui', defaultMessage: '选择供应会员' })}
columns={memberColumns}
visible={visible}
confirm={handleConfirm}
cancel={() => setVisible(false)}
fetchTableData={(params) => fetchOrderApi.getMemberListByMemberName({...params})}
rowSelection={rowSelection}
modalType='memberByDefault'
tableProps={{
rowKey: 'memberId'
}}
{...restProps}
/>
)
}
MemberModalTable.defaultProps = {}
export default MemberModalTable
......@@ -5,7 +5,7 @@ import { FormDetailContext } from '@/formSchema/context';
import { getLogisticsSelectListMemberShipperAddress } from '@/services/LogisticsV2Api';
import { useIntl } from 'umi';
export interface MaterialTableCellProps {
export interface ProductTableCellProps {
title: React.ReactNode;
editable: boolean;
children: React.ReactNode;
......@@ -19,7 +19,7 @@ export interface MaterialTableCellProps {
const EditableContext = React.createContext<any>({});
export const MaterialEditableRow: React.FC<any> = ({...props }) => {
export const ProductEditableRow: React.FC<any> = ({...props }) => {
const [form] = Form.useForm();
const ctx = {
......@@ -35,7 +35,7 @@ export const MaterialEditableRow: React.FC<any> = ({...props }) => {
};
export const MaterialTableCell:React.FC<MaterialTableCellProps> = ({
export const ProductTableCell:React.FC<ProductTableCellProps> = ({
title,
editable,
children,
......@@ -118,7 +118,7 @@ export const MaterialTableCell:React.FC<MaterialTableCellProps> = ({
onChange={(value, option) => change(value, option, dataIndex)}
id={dataIndex + record.id}
className="purchase_logistic_select"
options={[{ label: intl.formatMessage({ id: 'purchaseRequisition.wuliu', defaultMessage: '物流' }), value: 1 }, { label: intl.formatMessage({ id: 'purchaseRequisition.ziti', defaultMessage: '自提' }), value: 2 }, { label: intl.formatMessage({ id: 'purchaseRequisition.wuxupeisong', defaultMessage: '无需配送' }), value: 3 }]}
options={[{ label: intl.formatMessage({ id: 'purchaseOrder.wuliu', defaultMessage: '物流' }), value: 1 }, { label: intl.formatMessage({ id: 'purchaseOrder.ziti', defaultMessage: '自提' }), value: 2 }, { label: intl.formatMessage({ id: 'purchaseOrder.wuxupeisong', defaultMessage: '无需配送' }), value: 3 }]}
{...formItemProps}
/>
}
......@@ -130,7 +130,7 @@ export const MaterialTableCell:React.FC<MaterialTableCellProps> = ({
try {
let _value = Number(value)
if(_value > Number.MAX_SAFE_INTEGER) {
throw new Error(intl.formatMessage({ id: 'purchaseRequisition.shuzhijingduyi', defaultMessage: '数值精度溢出' }))
throw new Error(intl.formatMessage({ id: 'purchaseOrder.shuzhijingduyi', defaultMessage: '数值精度溢出' }))
}
callback()
} catch (err) {
......@@ -148,11 +148,11 @@ export const MaterialTableCell:React.FC<MaterialTableCellProps> = ({
rules={dataIndex === 'quantity' ? [
{
required: true,
message: `${title}${intl.formatMessage({ id: 'purchaseRequisition.bixutianxie', defaultMessage: '必须填写' })}`,
message: `${title}${intl.formatMessage({ id: 'purchaseOrder.bixutianxie', defaultMessage: '必须填写' })}`,
},
{
pattern: /^\d+(\.\d{1,3})?$/,
message: intl.formatMessage({ id: 'purchaseRequisition.caigoushuliangjin', defaultMessage: '采购数量仅限三位小数' }),
message: intl.formatMessage({ id: 'purchaseOrder.caigoushuliangjin', defaultMessage: '采购数量仅限三位小数' }),
},
{
validator: validatorNumber
......@@ -160,7 +160,7 @@ export const MaterialTableCell:React.FC<MaterialTableCellProps> = ({
] : [
{
pattern: /^\d+(\.\d{1,4})?$/,
message: intl.formatMessage({ id: 'purchaseRequisition.danjiajinxiansi', defaultMessage: '单价仅限四位小数' }),
message: intl.formatMessage({ id: 'purchaseOrder.danjiajinxiansi', defaultMessage: '单价仅限四位小数' }),
},
{
validator: validatorNumber
......@@ -175,7 +175,7 @@ export const MaterialTableCell:React.FC<MaterialTableCellProps> = ({
<Popover content={
<Row>
<div>
<h3><EnvironmentOutlined/> {intl.formatMessage({ id: 'purchaseRequisition.zitidizhi', defaultMessage: '自提地址' })}</h3>
<h3><EnvironmentOutlined/> {intl.formatMessage({ id: 'purchaseOrder.zitidizhi', defaultMessage: '自提地址' })}</h3>
{
receiveInfo && <>
<p>{receiveInfo.shipperName} / {receiveInfo.phone}</p>
......@@ -196,6 +196,6 @@ export const MaterialTableCell:React.FC<MaterialTableCellProps> = ({
return <td {...restProps}>{childNode}</td>;
}
MaterialTableCell.defaultProps = {}
ProductTableCell.defaultProps = {}
export default MaterialTableCell
export default ProductTableCell
......@@ -49,63 +49,10 @@ export const procurementProcessField = (value) => {
return value
}
// 会员列
export const memberColumns: any[] = [
{
title: getIntl().formatMessage({ id: 'purchaseRequisition.huiyuanID', defaultMessage: '会员ID' }),
dataIndex: 'memberId',
align: 'center',
key: 'memberId',
},
{
title: getIntl().formatMessage({ id: 'purchaseRequisition.huiyuanmingcheng', defaultMessage: '会员名称' }),
dataIndex: 'name',
align: 'center',
key: 'name',
},
{
title: getIntl().formatMessage({ id: 'purchaseRequisition.gongsileixing', defaultMessage: '公司类型' }),
dataIndex: 'memberTypeName',
align: 'center',
key: 'memberTypeName',
},
{
title: getIntl().formatMessage({ id: 'purchaseRequisition.gongsijuese', defaultMessage: '公司角色' }),
dataIndex: 'roleName',
align: 'center',
key: 'roleName',
},
{
title: getIntl().formatMessage({ id: 'purchaseRequisition.gongsidengji', defaultMessage: '公司等级' }),
dataIndex: 'levelTag',
align: 'center',
key: 'levelTag',
},
]
const intl = getIntl()
//组织机构部门列
export const departmentColumns: any[] = [
{
title: 'Id',
dataIndex: 'id',
key: 'id',
className: 'commonHide'
},
{
title: getIntl().formatMessage({ id: 'purchaseRequisition.jigoudaima', defaultMessage: '机构代码' }),
dataIndex: 'code',
key: 'code',
},
{
title: getIntl().formatMessage({ id: 'purchaseRequisition.jigoumingcheng', defaultMessage: '机构名称' }),
dataIndex: 'title',
key: 'title',
},
]
// 合同下单 物料列表
export const materialInfoColumns: any[] = [
// 商品列表
export const productInfoColumns: any[] = [
{
title: 'ID',
dataIndex: 'id',
......@@ -114,67 +61,59 @@ export const materialInfoColumns: any[] = [
className: 'commonHide'
},
{
title: getIntl().formatMessage({ id: 'purchaseRequisition.wuliaobianhao', defaultMessage: '物料编号' }),
dataIndex: 'code',
align: 'center',
key: 'code',
},
{
title: getIntl().formatMessage({ id: 'purchaseRequisition.wuliaomingcheng', defaultMessage: '物料名称' }),
title: intl.formatMessage({ id: 'purchaseOrder.shangpinmingcheng', defaultMessage: '商品名称' }),
dataIndex: 'name',
align: 'center',
key: 'name',
},
{
title: getIntl().formatMessage({ id: 'purchaseRequisition.guigexinghao', defaultMessage: '规格型号' }),
dataIndex: 'type',
align: 'center',
key: 'type',
},
{
title: getIntl().formatMessage({ id: 'purchaseRequisition.pinlei', defaultMessage: '品类' }),
title: intl.formatMessage({ id: 'purchaseOrder.pinlei', defaultMessage: '品类' }),
dataIndex: 'category',
align: 'center',
key: 'category',
},
{
title: getIntl().formatMessage({ id: 'purchaseRequisition.pinpai', defaultMessage: '品牌' }),
title: intl.formatMessage({ id: 'purchaseOrder.pinpai', defaultMessage: '品牌' }),
dataIndex: 'brand',
align: 'center',
key: 'brand',
},
{
title: getIntl().formatMessage({ id: 'purchaseRequisition.danwei', defaultMessage: '单位' }),
title: intl.formatMessage({ id: 'purchaseOrder.danwei', defaultMessage: '单位' }),
dataIndex: 'unit',
align: 'center',
key: 'unit',
},
{
title: getIntl().formatMessage({ id: 'purchaseRequisition.yugudanjia', defaultMessage: '预估单价(元)' }),
title: intl.formatMessage({ id: 'purchaseOrder.dinggoushuliang', defaultMessage: '订购数量' }),
dataIndex: 'quantity',
align: 'center',
key: 'quantity',
},
{
title: intl.formatMessage({ id: 'purchaseOrder.danjia(yuan)', defaultMessage: '单价(元)' }),
dataIndex: 'price',
align: 'left',
key: 'price',
formItem: 'input',
editable: true,
// render: (t) => `¥${t.toFixed(2)}`
},
{
title: getIntl().formatMessage({ id: 'purchaseRequisition.shuliang', defaultMessage: '数量' }),
dataIndex: 'quantity',
title: intl.formatMessage({ id: 'purchaseOrder.fahuoshuliang', defaultMessage: '发货数量' }),
dataIndex: 'count',
align: 'center',
key: 'quantity',
key: 'count',
formItem: 'input',
editable: true,
},
{
title: getIntl().formatMessage({ id: 'purchaseRequisition.yugujine', defaultMessage: '预估金额(元)' }),
title: intl.formatMessage({ id: 'purchaseOrder.fahuojine', defaultMessage: '发货金额(元)' }),
dataIndex: 'amount',
align: 'center',
key: 'amount',
// render: (t, r) => t ? `${Number(t).toFixed(2)}` : null
},
{
title: getIntl().formatMessage({ id: 'purchaseRequisition.caozuo', defaultMessage: '操作' }),
title: intl.formatMessage({ id: 'purchaseOrder.caozuo', defaultMessage: '操作' }),
dataIndex: 'ctl',
align: 'center',
key: 'ctl',
......
import React, { useRef, useState, useEffect } from 'react'
import React, { useState, useEffect } from 'react'
import { history, useIntl } from 'umi'
import { usePageStatus } from '@/hooks/usePageStatus'
import { Button, Col, message, Row } from 'antd'
import { createFormActions, registerVirtualBox, useFormSpy } from '@formily/antd'
import { SaveOutlined, LinkOutlined } from '@ant-design/icons'
import { Button, message } from 'antd'
import { createFormActions } from '@formily/antd'
import { SaveOutlined } from '@ant-design/icons'
import NiceForm from '@/components/NiceForm'
import { increaseSchema } from './schema'
import { useMaterialTableChangeForAmount } from './effects'
import { procurementProcessField, procurementRenderField, procurmentRenderInit } from './constant'
import { useUpdate } from '@umijs/hooks'
import { help } from '../../common'
import { useMaterialTable } from './model/useMaterialTable'
import MemberModalTable from './components/memberModalTable'
import styled from 'styled-components'
import { useProductTable } from './model/useProductTable'
import FormDetailHeader from '@/components/FormDetailHeader'
import FormDetailWrapper from '@/components/FormDetailWrapper'
import { FormDetailContext } from '@/formSchema/context'
......@@ -21,40 +19,8 @@ import { getPurchaseRequisitionDetail, postPurchaseRequisitionCreate, postPurcha
const addSchemaAction = createFormActions()
const RowStyle = styled(props => <Row style={{marginTop: 12, justifyContent: "flex-end"}} justify='end' {...props}>
{props.children}
</Row>)`
.ant-col {
text-align: center
}
.ant-col div {
margin-bottom: 12px;
}
`
// 总计金额联动框
export const MoneyTotalBox = registerVirtualBox('moneyTotalBox', () => {
const intl = useIntl()
const { form } = useFormSpy({ selector: [['onFieldValueChange', 'products']], reducer: v => v })
const data = form.getFieldValue('products')
const sum = data.reduce((prev, next) => (prev*1000 + (next.amount || 0)*1000)/1000, 0)
const total = data.reduce((prev, next) => (prev*1000 + (next.quantity || 0)*1000)/1000, 0)
return <RowStyle>
<Col span={2}>
<div>{intl.formatMessage({ id: 'purchaseRequisition.shuliangheji', defaultMessage: '数量合计' })}</div>
<div>{total.toFixed(2)}</div>
</Col>
<Col span={2}>
<div>{intl.formatMessage({ id: 'purchaseRequisition.jinezongji', defaultMessage: '金额总计' })}</div>
<div>{`${intl.formatMessage({id: 'commodity.products.directChannel.columns.currency'})}${(sum).toFixed(2)}`}</div>
</Col>
</RowStyle>
})
/** 新增采购收货单 */
const AddPurchaseReceiveOrder: React.FC<{}> = () => {
const memberRef = useRef<any>({})
const [formLoading, setFormLoading] = useState(false)
const [btnLoading, setBtnLoading] = useState(false)
const update = useUpdate()
......@@ -64,7 +30,7 @@ const AddPurchaseReceiveOrder: React.FC<{}> = () => {
const intl = useIntl()
// 请购单物料
const { materialColumns, materialComponents } = useMaterialTable(addSchemaAction)
const { productColumns, productComponents } = useProductTable(addSchemaAction)
useEffect(() => {
if (id) {
......@@ -89,7 +55,7 @@ const AddPurchaseReceiveOrder: React.FC<{}> = () => {
const params = { ...value }
console.log(value)
if(formContext.innerFormErrors) {
throw new Error(intl.formatMessage({ id: 'purchaseRequisition.qingwanshandingdan', defaultMessage: '请完善订单物料数据' }))
throw new Error(intl.formatMessage({ id: 'purchaseOrder.qingwanshancaigou', defaultMessage: '请完善采购收货单商品数据' }))
}
// 校验采购数量
const judgementByCount = params.products?.length && params.products.map(item => {
......@@ -100,7 +66,7 @@ const AddPurchaseReceiveOrder: React.FC<{}> = () => {
}
})
if(!judgementByCount || judgementByCount.includes(false)){
throw new Error(intl.formatMessage({ id: 'purchaseRequisition.qingtianxieshangpin', defaultMessage: '请填写商品采购数量' }))
throw new Error('请填写商品采购数量')
}
setBtnLoading(true)
......@@ -125,13 +91,6 @@ const AddPurchaseReceiveOrder: React.FC<{}> = () => {
}
}
// 选择会员弹窗
const handleOrderMember = () => {
memberRef.current.setVisible(true)
}
const memberBtn = <div className='connectBtn' onClick={handleOrderMember}><LinkOutlined style={{marginRight: 4}}/>{intl.formatMessage({ id: 'saleOrder.xuanze', defaultMessage: '选择' })}</div>
const providerValue = {
schemaActions: addSchemaAction,
formContext,
......@@ -140,11 +99,11 @@ const AddPurchaseReceiveOrder: React.FC<{}> = () => {
return (<div>
<FormDetailContext.Provider value={providerValue}>
<FormDetailHeader
title={id ? intl.formatMessage({ id: 'saleOrder.bianjixiaoshoufahuodan', defaultMessage: '编辑销售发货单' }) : intl.formatMessage({ id: 'saleOrder.xinzengxiaoshoufahuodan', defaultMessage: '新增销售发货单' })}
title={id ? intl.formatMessage({ id: 'purchaseOrder.bianjixiaoshoufa', defaultMessage: '编辑销售发货单' }) : intl.formatMessage({ id: 'purchaseOrder.xinzengxiaoshoufa', defaultMessage: '新增销售发货单' })}
schema={increaseSchema}
extraRight={[
<Button key="1" onClick={() => addSchemaAction.submit()} loading={btnLoading} type="primary" icon={<SaveOutlined />}>
{intl.formatMessage({ id: 'saleOrder.baocun', defaultMessage: '保存' })}
{intl.formatMessage({ id: 'purchaseOrder.baocun', defaultMessage: '保存' })}
</Button>,
]}
/>
......@@ -167,9 +126,8 @@ const AddPurchaseReceiveOrder: React.FC<{}> = () => {
}}
expressionScope={{
memberBtn,
materialColumns,
materialComponents,
productColumns,
productComponents,
help,
}}
/>
......@@ -177,8 +135,6 @@ const AddPurchaseReceiveOrder: React.FC<{}> = () => {
</FormDetailWrapper>
</FormDetailContext.Provider>
{/* 选择供应会员 */}
<MemberModalTable currentRef={memberRef} schemaAction={addSchemaAction}/>
</div>)
}
......
import { useState } from 'react'
import { ISchemaFormActions, ISchemaFormAsyncActions } from '@formily/antd';
import { Button } from 'antd';
import { materialInfoColumns } from '../constant';
import MaterialTableCell, { MaterialEditableRow } from '../components/materialTableCell';
import { productInfoColumns } from '../constant';
import ProductTableCell, { ProductEditableRow } from '../components/productTableCell';
import { useIntl } from 'umi';
......@@ -14,7 +14,7 @@ export const getUnitPriceTotal = (record) => {
/**
* @param ctx schemaAction
*/
export const useMaterialTable = (ctx: ISchemaFormActions | ISchemaFormAsyncActions) => {
export const useProductTable = (ctx: ISchemaFormActions | ISchemaFormAsyncActions) => {
const intl = useIntl()
const handleDelete = (record) => {
......@@ -25,17 +25,17 @@ export const useMaterialTable = (ctx: ISchemaFormActions | ISchemaFormAsyncActio
ctx.setFieldValue('products', newData)
}
const [materialColumns, setMaterialColumns] = useState(() => {
const [productColumns, setProductColumns] = useState(() => {
// 渲染操作
materialInfoColumns[materialInfoColumns.length - 1].render = (text, record) => <Button type='link' onClick={() => handleDelete(record)}>{intl.formatMessage({ id: 'purchaseRequisition.shanchu', defaultMessage: '删除' })}</Button>
materialInfoColumns[materialInfoColumns.length - 2].render = (t, r) => r.amount && <span style={{color: 'red'}}>{intl.formatMessage({ id: 'commodity.products.directChannel.columns.currency'})} {Number(r.amount).toFixed(2)}</span>
return materialInfoColumns
productInfoColumns[productInfoColumns.length - 1].render = (text, record) => <Button type='link' onClick={() => handleDelete(record)}>{intl.formatMessage({ id: 'purchaseOrder.shanchu', defaultMessage: '删除' })}</Button>
// productInfoColumns[productInfoColumns.length - 2].render = (t, r) => r.amount && <span style={{color: 'red'}}>{intl.formatMessage({ id: 'commodity.products.directChannel.columns.currency'})} {Number(r.amount).toFixed(2)}</span>
return productInfoColumns
})
const materialComponents = {
const productComponents = {
body: {
row: MaterialEditableRow,
cell: MaterialTableCell
row: ProductEditableRow,
cell: ProductTableCell
}
}
......@@ -55,7 +55,7 @@ export const useMaterialTable = (ctx: ISchemaFormActions | ISchemaFormAsyncActio
})
};
const materialMergeColumns = materialColumns.map(col => {
const productMergeColumns = productColumns.map(col => {
if (!col.editable) {
return col;
}
......@@ -74,7 +74,7 @@ export const useMaterialTable = (ctx: ISchemaFormActions | ISchemaFormAsyncActio
})
return {
materialColumns: materialMergeColumns,
materialComponents,
productColumns: productMergeColumns,
productComponents,
}
}
......@@ -2,13 +2,15 @@ import { ISchema } from '@formily/antd';
import moment from 'moment'
import { getIntl } from 'umi';
const intl = getIntl()
// 基本信息
const basicInfo: ISchema = {
"x-index": 0,
type: 'object',
"x-component": 'MellowCard',
"x-component-props": {
title: '基本信息',
title: intl.formatMessage({ id: 'purchaseOrder.jibenxinxi', defaultMessage: '基本信息' }),
id: 'basicInfo',
},
properties: {
......@@ -27,17 +29,17 @@ const basicInfo: ISchema = {
properties: {
receiptsType: {
type: 'string',
title: '单据类型',
title: intl.formatMessage({ id: 'purchaseOrder.danjuleixing', defaultMessage: '单据类型' }),
"x-component": 'text',
default: '采购收货单',
default: intl.formatMessage({ id: 'purchaseOrder.caigoushouhuodan', defaultMessage: '采购收货单' }),
},
digest: {
type: 'string',
title: '单据摘要',
title: intl.formatMessage({ id: 'purchaseOrder.danjuzhaiyao', defaultMessage: '单据摘要' }),
"x-rules": [
{
required: true,
message: '请输入单据摘要'
message: intl.formatMessage({ id: 'purchaseOrder.qingshurudanju', defaultMessage: '请输入单据摘要' })
},
{
limitByte: true,
......@@ -51,7 +53,7 @@ const basicInfo: ISchema = {
deliverTime: {
type: 'string',
"x-component": 'date',
title: '单据时间',
title: intl.formatMessage({ id: 'purchaseOrder.danjushijian', defaultMessage: '单据时间' }),
required: true,
"x-component-props": {
disabledDate: current => {
......@@ -65,7 +67,7 @@ const basicInfo: ISchema = {
},
purpose: {
type: 'string',
title: '对应仓库',
title: intl.formatMessage({ id: 'purchaseOrder.duiyingcangku', defaultMessage: '对应仓库' }),
"x-rules": [
{
limitByte: true,
......@@ -78,7 +80,7 @@ const basicInfo: ISchema = {
},
purpose1: {
type: 'string',
title: '仓库人员',
title: intl.formatMessage({ id: 'purchaseOrder.cangkurenyuan', defaultMessage: '仓库人员' }),
"x-rules": [
{
limitByte: true,
......@@ -91,7 +93,7 @@ const basicInfo: ISchema = {
},
remark: {
type: 'string',
title: '备注',
title: intl.formatMessage({ id: 'purchaseOrder.beizhu', defaultMessage: '备注' }),
"x-rules": [
{
limitByte: true,
......@@ -111,7 +113,7 @@ const relatedInfo: ISchema = {
type: 'object',
"x-component": 'MellowCard',
"x-component-props": {
title: '相关信息',
title: intl.formatMessage({ id: 'purchaseOrder.xiangguanxinxi', defaultMessage: '相关信息' }),
id: 'relatedInfo',
},
properties: {
......@@ -130,27 +132,27 @@ const relatedInfo: ISchema = {
properties: {
receipts: {
type: 'string',
title: '对应单据',
title: intl.formatMessage({ id: 'purchaseOrder.duiyingdanju', defaultMessage: '对应单据' }),
"x-component": 'text',
},
delivery: {
type: 'string',
title: '配送方式',
title: intl.formatMessage({ id: 'purchaseOrder.peisongfangshi', defaultMessage: '配送方式' }),
"x-component": 'text',
},
orderNo: {
type: 'string',
title: '关联单据',
title: intl.formatMessage({ id: 'purchaseOrder.guanliandanju', defaultMessage: '关联单据' }),
"x-component": 'text',
},
address: {
type: 'string',
title: '发货地址',
title: intl.formatMessage({ id: 'purchaseOrder.fahuodizhi', defaultMessage: '发货地址' }),
"x-component": 'text',
},
memberName: {
type: 'string',
title: '会员名称',
title: intl.formatMessage({ id: 'purchaseOrder.huiyuanmingcheng', defaultMessage: '会员名称' }),
"x-component": 'text',
},
}
......@@ -165,7 +167,7 @@ const material: ISchema = {
type: 'object',
"x-component": 'MellowCard',
"x-component-props": {
title: getIntl().formatMessage({ id: 'saleOrder.danjumingxi', defaultMessage: '单据明细' }),
title: intl.formatMessage({ id: 'purchaseOrder.danjumingxi', defaultMessage: '单据明细' }),
id: 'orderMaterial',
},
properties: {
......@@ -175,14 +177,10 @@ const material: ISchema = {
required: true,
"x-component-props": {
rowKey: 'id',
columns: "{{materialColumns}}",
components: "{{materialComponents}}",
columns: "{{productColumns}}",
components: "{{productComponents}}",
},
},
NO_SUBMIT_SPY: {
type: 'object',
"x-component": "moneyTotalBox"
}
}
}
......
......@@ -5,7 +5,7 @@ import { getIntl } from 'umi';
/**
* 新增采购请购单 选择物料的筛选
*/
export const addRequesitionMaterialSchema: ISchema = {
export const addRequesitionMaterialSchema: ISchema = {
type: 'object',
properties: {
code: {
......
......@@ -106,7 +106,7 @@ export const procurementProcessField = (value) => {
return value
}
const intl = getIntl()
// 商品列表
export const productInfoColumns: any[] = [
{
......@@ -116,49 +116,31 @@ export const productInfoColumns: any[] = [
key: 'id',
},
{
title: getIntl().formatMessage({id: 'purchaseOrder.orderCollect.constant.productName'}),
title: intl.formatMessage({ id: 'saleOrder.shangpinmingcheng', defaultMessage: '商品名称' }),
dataIndex: 'productName',
align: 'center',
key: 'productName',
},
{
title: getIntl().formatMessage({id: 'purchaseOrder.orderCollect.constant.category'}),
title: intl.formatMessage({ id: 'saleOrder.pinlei', defaultMessage: '品类' }),
dataIndex: 'category',
align: 'center',
key: 'category',
},
{
title: getIntl().formatMessage({id: 'purchaseOrder.orderCollect.constant.brand'}),
title: intl.formatMessage({ id: 'saleOrder.pinpai', defaultMessage: '品牌' }),
dataIndex: 'brand',
align: 'center',
key: 'brand',
},
{
title: getIntl().formatMessage({id: 'purchaseOrder.orderCollect.constant.unit'}),
title: intl.formatMessage({ id: 'saleOrder.danwei', defaultMessage: '单位' }),
dataIndex: 'unit',
align: 'center',
key: 'unit',
},
{
title: getIntl().formatMessage({id: 'purchaseOrder.orderCollect.constant.unitPrice'}),
dataIndex: 'unitPrice',
align: 'left',
key: 'unitPrice',
},
{
title: getIntl().formatMessage({id: 'purchaseOrder.orderCollect.constant.memberPrice'}),
dataIndex: 'memberPrice',
key: 'memberPrice',
render: (text, record) => record.isMemberPrice && text ? text * 100 + '%' : null
},
// {
// title: '库存',
// dataIndex: 'stockCount',
// align: 'center',
// key: 'stockCount',
// },
{
title: getIntl().formatMessage({id: 'purchaseOrder.orderCollect.constant.purchaseCount'}),
title: intl.formatMessage({ id: 'saleOrder.shuliang', defaultMessage: '数量' }),
dataIndex: 'purchaseCount',
align: 'center',
key: 'purchaseCount',
......@@ -167,42 +149,34 @@ export const productInfoColumns: any[] = [
width: 140
},
{
title: getIntl().formatMessage({id: 'purchaseOrder.orderCollect.constant.taxInclusive'}),
dataIndex: 'taxInclusive',
title: intl.formatMessage({ id: 'saleOrder.xiangshu', defaultMessage: '箱数' }),
dataIndex: 'boxCount',
align: 'center',
key: 'taxInclusive',
render: (t, r) => r.taxRate ? getIntl().formatMessage({id: 'purchaseOrder.yes'}) : getIntl().formatMessage({id: 'purchaseOrder.no'}),
},
{
title: getIntl().formatMessage({id: 'purchaseOrder.orderCollect.constant.taxRate'}),
dataIndex: 'taxRate',
align: 'center',
key: 'taxRate',
render: (t, r) => t ? `${t}%` : null
key: 'boxCount',
formItem: 'input',
editable: true,
width: 140
},
{
title: getIntl().formatMessage({id: 'purchaseOrder.orderCollect.constant.money'}),
dataIndex: 'money',
title: intl.formatMessage({ id: 'saleOrder.zhongliang', defaultMessage: '重量' }),
dataIndex: 'weight',
align: 'center',
key: 'money',
key: 'weight',
formItem: 'input',
editable: true,
width: 140
},
// 接口调用
{
title: getIntl().formatMessage({id: 'purchaseOrder.orderCollect.constant.deliveryType'}),
dataIndex: 'deliveryType',
title: intl.formatMessage({ id: 'saleOrder.tiji', defaultMessage: '体积' }),
dataIndex: 'volume',
align: 'center',
key: 'deliveryType',
render: (t, r) => {
if(t === 1)
return getIntl().formatMessage({id: 'purchaseOrder.orderCollect.constant.deliveryType1'})
else if(t === 2)
return <AddressPop pickInfo={r.logistics.render}>{getIntl().formatMessage({id: 'purchaseOrder.orderCollect.constant.deliveryType2'})}</AddressPop>
else if(t === 3)
return getIntl().formatMessage({id: 'purchaseOrder.orderCollect.constant.deliveryType3'})
}
key: 'volume',
formItem: 'input',
editable: true,
width: 140
},
{
title: getIntl().formatMessage({id: 'purchaseOrder.operation'}),
title: intl.formatMessage({ id: 'saleOrder.caozuo', defaultMessage: '操作' }),
dataIndex: 'ctl',
align: 'center',
key: 'ctl',
......
......@@ -42,12 +42,16 @@ export const MoneyTotalBox = registerVirtualBox('moneyTotalBox', () => {
return <RowStyle>
<Col span={2}>
<div>{intl.formatMessage({ id: 'purchaseRequisition.shuliangheji', defaultMessage: '数量合计' })}</div>
<div>{total.toFixed(2)}</div>
<div>{intl.formatMessage({ id: 'saleOrder.zongxiangshu', defaultMessage: '总箱数' })}</div>
<div style={{fontSize: 24, color: '#1F2C3D'}}>{total.toFixed(2)}</div>
</Col>
<Col span={2}>
<div>{intl.formatMessage({ id: 'purchaseRequisition.jinezongji', defaultMessage: '金额总计' })}</div>
<div>{`${intl.formatMessage({id: 'commodity.products.directChannel.columns.currency'})}${(sum).toFixed(2)}`}</div>
<div>{intl.formatMessage({ id: 'saleOrder.zongzhongliang', defaultMessage: '总重量' })}(KG)</div>
<div style={{fontSize: 24, color: '#1F2C3D'}}>{(sum).toFixed(2)}</div>
</Col>
<Col span={2}>
<div>{intl.formatMessage({ id: 'saleOrder.zongtiji', defaultMessage: '总体积' })}(m³)</div>
<div style={{fontSize: 24, color: '#1F2C3D'}}>{(sum).toFixed(2)}</div>
</Col>
</RowStyle>
})
......@@ -131,7 +135,7 @@ const AddLogisticsOrder:React.FC<{}> = () => {
return (<div>
<FormDetailContext.Provider value={providerValue}>
<FormDetailHeader
title={id ? intl.formatMessage({ id: 'saleOrder.bianjixiaoshoufahuodan', defaultMessage: '编辑销售发货单' }) : intl.formatMessage({ id: 'saleOrder.xinzengxiaoshoufahuodan', defaultMessage: '新增销售发货单' })}
title={id ? intl.formatMessage({ id: 'saleOrder.xiugaiwuliudan', defaultMessage: '修改物流单' }) : intl.formatMessage({ id: 'saleOrder.xinzengwuliudan', defaultMessage: '新增物流单' })}
schema={increaseSchema}
extraRight={[
<Button key="1" onClick={() => addSchemaAction.submit()} loading={btnLoading} type="primary" icon={<SaveOutlined />}>
......
......@@ -91,7 +91,7 @@ export const useProductTable = (ctx: ISchemaFormActions | ISchemaFormAsyncAction
const [productColumns, setProductColumns] = useState(() => {
if (pageStatus === PageStatus.ADD) {
// 渲染操作
productInfoColumns[productInfoColumns.length - 1].render = (text, record) => <Button type='link' onClick={() => handleDelete(record)}>{intl.formatMessage({id: 'purchaseOrder.delete'})}</Button>
productInfoColumns[productInfoColumns.length - 1].render = (text, record) => <Button type='link' onClick={() => handleDelete(record)}>{intl.formatMessage({id: 'saleOrder.delete'})}</Button>
// 渲染单价
productInfoColumns[5].render = (t, r) => {
......@@ -124,7 +124,8 @@ export const useProductTable = (ctx: ISchemaFormActions | ISchemaFormAsyncAction
}
}
const productAddButton = <Button onClick={handleShowProduct} block type='default' style={{margin: '24px auto'}}>{intl.formatMessage({id: 'purchaseOrder.orderCollect.model.button1'})}</Button>
const productAddButton = <Button onClick={handleShowProduct} block type='default' style={{margin: '24px auto'}}>{intl.formatMessage({ id: 'saleOrder.xuanzeshangpin', defaultMessage: '选择商品' })}</Button>
const productComponents = {
body: {
row: ProductEditableRow,
......
import { ISchema } from '@formily/antd';
import { getIntl } from 'umi';
const intl = getIntl()
// 基本信息
const basicInfo: ISchema = {
"x-index": 0,
type: 'object',
"x-component": 'MellowCard',
"x-component-props": {
title: '基本信息',
title: intl.formatMessage({ id: 'saleOrder.jibenxinxi', defaultMessage: '基本信息' }),
id: 'basicInfo',
},
properties: {
......@@ -26,11 +28,11 @@ const basicInfo: ISchema = {
properties: {
digest: {
type: 'string',
title: '单据摘要',
title: intl.formatMessage({ id: 'saleOrder.danjuzhaiyao', defaultMessage: '单据摘要' }),
"x-rules": [
{
required: true,
message: '请输入单据摘要'
message: intl.formatMessage({ id: 'saleOrder.qingshurudanju', defaultMessage: '请输入单据摘要' })
},
{
limitByte: true,
......@@ -43,7 +45,7 @@ const basicInfo: ISchema = {
},
logisticProvider: {
type: 'string',
title: '物流服务商',
title: intl.formatMessage({ id: 'saleOrder.wuliufuwushang', defaultMessage: '物流服务商' }),
enum: [
'顺丰',
'逆风',
......@@ -52,7 +54,7 @@ const basicInfo: ISchema = {
},
deliverAddress: {
type: 'string',
title: '发货地址',
title: intl.formatMessage({ id: 'saleOrder.fahuodizhi', defaultMessage: '发货地址' }),
enum: [
'长津湖',
'水门桥',
......@@ -90,22 +92,22 @@ const relatedInfo: ISchema = {
properties: {
deliveryNo: {
type: 'string',
title: '对应发货单号',
title: intl.formatMessage({ id: 'saleOrder.duiyingfahuodan', defaultMessage: '对应发货单号' }),
"x-component": 'text',
},
receiveAddress: {
type: 'string',
title: '收货地址',
title: intl.formatMessage({ id: 'saleOrder.shouhuodizhi', defaultMessage: '收货地址' }),
"x-component": 'text',
},
orderNo: {
type: 'string',
title: '对应订单号/售后单',
title: intl.formatMessage({ id: 'saleOrder.duiyingdingdanhao', defaultMessage: '对应订单号/售后单' }),
"x-component": 'text',
},
receiver: {
type: 'string',
title: '收货方',
title: intl.formatMessage({ id: 'saleOrder.shouhuofang', defaultMessage: '收货方' }),
"x-component": 'text',
},
}
......@@ -120,7 +122,7 @@ const material: ISchema = {
type: 'object',
"x-component": 'MellowCard',
"x-component-props": {
title: '物流单明细',
title: intl.formatMessage({ id: 'saleOrder.wuliudanmingxi', defaultMessage: '物流单明细' }),
id: 'orderMaterial',
},
properties: {
......@@ -148,7 +150,7 @@ const freightInfo: ISchema = {
type: 'object',
"x-component": 'MellowCard',
"x-component-props": {
title: '运费信息',
title: intl.formatMessage({ id: 'saleOrder.yunfeixinxi', defaultMessage: '运费信息' }),
id: 'freightInfo',
},
properties: {
......@@ -167,12 +169,12 @@ const freightInfo: ISchema = {
properties: {
freight: {
type: 'string',
title: '运费',
title: intl.formatMessage({ id: 'saleOrder.yunfei', defaultMessage: '运费' }),
"x-component": 'text',
},
settlement: {
type: 'string',
title: '结算方式',
title: intl.formatMessage({ id: 'saleOrder.jiesuanfangshi', defaultMessage: '结算方式' }),
"x-component": 'text',
},
}
......
......@@ -118,7 +118,7 @@ export const ProductTableCell:React.FC<ProductTableCellProps> = ({
onChange={(value, option) => change(value, option, dataIndex)}
id={dataIndex + record.id}
className="purchase_logistic_select"
options={[{ label: intl.formatMessage({ id: 'purchaseRequisition.wuliu', defaultMessage: '物流' }), value: 1 }, { label: intl.formatMessage({ id: 'purchaseRequisition.ziti', defaultMessage: '自提' }), value: 2 }, { label: intl.formatMessage({ id: 'purchaseRequisition.wuxupeisong', defaultMessage: '无需配送' }), value: 3 }]}
options={[{ label: intl.formatMessage({ id: 'saleOrder.wuliu', defaultMessage: '物流' }), value: 1 }, { label: intl.formatMessage({ id: 'saleOrder.ziti', defaultMessage: '自提' }), value: 2 }, { label: intl.formatMessage({ id: 'saleOrder.wuxupeisong', defaultMessage: '无需配送' }), value: 3 }]}
{...formItemProps}
/>
}
......@@ -130,7 +130,7 @@ export const ProductTableCell:React.FC<ProductTableCellProps> = ({
try {
let _value = Number(value)
if(_value > Number.MAX_SAFE_INTEGER) {
throw new Error(intl.formatMessage({ id: 'purchaseRequisition.shuzhijingduyi', defaultMessage: '数值精度溢出' }))
throw new Error(intl.formatMessage({ id: 'saleOrder.shuzhijingduyi', defaultMessage: '数值精度溢出' }))
}
callback()
} catch (err) {
......@@ -148,11 +148,11 @@ export const ProductTableCell:React.FC<ProductTableCellProps> = ({
rules={dataIndex === 'quantity' ? [
{
required: true,
message: `${title}${intl.formatMessage({ id: 'purchaseRequisition.bixutianxie', defaultMessage: '必须填写' })}`,
message: `${title}${intl.formatMessage({ id: 'saleOrder.bixutianxie', defaultMessage: '必须填写' })}`,
},
{
pattern: /^\d+(\.\d{1,3})?$/,
message: intl.formatMessage({ id: 'purchaseRequisition.caigoushuliangjin', defaultMessage: '采购数量仅限三位小数' }),
message: intl.formatMessage({ id: 'saleOrder.caigoushuliangjin', defaultMessage: '采购数量仅限三位小数' }),
},
{
validator: validatorNumber
......@@ -160,7 +160,7 @@ export const ProductTableCell:React.FC<ProductTableCellProps> = ({
] : [
{
pattern: /^\d+(\.\d{1,4})?$/,
message: intl.formatMessage({ id: 'purchaseRequisition.danjiajinxiansi', defaultMessage: '单价仅限四位小数' }),
message: intl.formatMessage({ id: 'saleOrder.danjiajinxiansi', defaultMessage: '单价仅限四位小数' }),
},
{
validator: validatorNumber
......@@ -175,7 +175,7 @@ export const ProductTableCell:React.FC<ProductTableCellProps> = ({
<Popover content={
<Row>
<div>
<h3><EnvironmentOutlined/> {intl.formatMessage({ id: 'purchaseRequisition.zitidizhi', defaultMessage: '自提地址' })}</h3>
<h3><EnvironmentOutlined/> {intl.formatMessage({ id: 'saleOrder.zitidizhi', defaultMessage: '自提地址' })}</h3>
{
receiveInfo && <>
<p>{receiveInfo.shipperName} / {receiveInfo.phone}</p>
......
......@@ -49,7 +49,7 @@ export const procurementProcessField = (value) => {
return value
}
const intl = getIntl()
// 单据明细 商品列表
export const productInfoColumns: any[] = [
{
......@@ -60,67 +60,59 @@ export const productInfoColumns: any[] = [
className: 'commonHide'
},
{
title: getIntl().formatMessage({ id: 'purchaseRequisition.wuliaobianhao', defaultMessage: '物料编号' }),
dataIndex: 'code',
align: 'center',
key: 'code',
},
{
title: getIntl().formatMessage({ id: 'purchaseRequisition.wuliaomingcheng', defaultMessage: '物料名称' }),
title: intl.formatMessage({ id: 'saleOrder.shangpinmingcheng', defaultMessage: '商品名称' }),
dataIndex: 'name',
align: 'center',
key: 'name',
},
{
title: getIntl().formatMessage({ id: 'purchaseRequisition.guigexinghao', defaultMessage: '规格型号' }),
dataIndex: 'type',
align: 'center',
key: 'type',
},
{
title: getIntl().formatMessage({ id: 'purchaseRequisition.pinlei', defaultMessage: '品类' }),
title: intl.formatMessage({ id: 'saleOrder.pinlei', defaultMessage: '品类' }),
dataIndex: 'category',
align: 'center',
key: 'category',
},
{
title: getIntl().formatMessage({ id: 'purchaseRequisition.pinpai', defaultMessage: '品牌' }),
title: intl.formatMessage({ id: 'saleOrder.pinpai', defaultMessage: '品牌' }),
dataIndex: 'brand',
align: 'center',
key: 'brand',
},
{
title: getIntl().formatMessage({ id: 'purchaseRequisition.danwei', defaultMessage: '单位' }),
title: intl.formatMessage({ id: 'saleOrder.danwei', defaultMessage: '单位' }),
dataIndex: 'unit',
align: 'center',
key: 'unit',
},
{
title: getIntl().formatMessage({ id: 'purchaseRequisition.yugudanjia', defaultMessage: '预估单价(元)' }),
title: intl.formatMessage({ id: 'saleOrder.dinggoushuliang', defaultMessage: '订购数量' }),
dataIndex: 'quantity',
align: 'center',
key: 'quantity',
},
{
title: intl.formatMessage({ id: 'saleOrder.danjia(yuan)', defaultMessage: '单价(元)' }),
dataIndex: 'price',
align: 'left',
key: 'price',
formItem: 'input',
editable: true,
// render: (t) => `¥${t.toFixed(2)}`
},
{
title: getIntl().formatMessage({ id: 'purchaseRequisition.shuliang', defaultMessage: '数量' }),
dataIndex: 'quantity',
title: intl.formatMessage({ id: 'saleOrder.fahuoshuliang', defaultMessage: '发货数量' }),
dataIndex: 'count',
align: 'center',
key: 'quantity',
key: 'count',
formItem: 'input',
editable: true,
},
{
title: getIntl().formatMessage({ id: 'purchaseRequisition.yugujine', defaultMessage: '预估金额(元)' }),
title: intl.formatMessage({ id: 'saleOrder.fahuojine', defaultMessage: '发货金额(元)' }),
dataIndex: 'amount',
align: 'center',
key: 'amount',
// render: (t, r) => t ? `${Number(t).toFixed(2)}` : null
},
{
title: getIntl().formatMessage({ id: 'purchaseRequisition.caozuo', defaultMessage: '操作' }),
title: intl.formatMessage({ id: 'saleOrder.caozuo', defaultMessage: '操作' }),
dataIndex: 'ctl',
align: 'center',
key: 'ctl',
......
import React, { useState, useEffect } from 'react'
import { history, useIntl } from 'umi'
import { usePageStatus } from '@/hooks/usePageStatus'
import { Button, Col, message, Row } from 'antd'
import { createFormActions, registerVirtualBox, useFormSpy } from '@formily/antd'
import { Button, message } from 'antd'
import { createFormActions } from '@formily/antd'
import { SaveOutlined } from '@ant-design/icons'
import NiceForm from '@/components/NiceForm'
import { increaseSchema } from './schema'
......@@ -11,7 +11,6 @@ import { procurementProcessField, procurementRenderField, procurmentRenderInit }
import { useUpdate } from '@umijs/hooks'
import { help } from '../../common'
import { useProductTable } from './model/useProductTable'
import styled from 'styled-components'
import FormDetailHeader from '@/components/FormDetailHeader'
import FormDetailWrapper from '@/components/FormDetailWrapper'
import { FormDetailContext } from '@/formSchema/context'
......@@ -20,37 +19,6 @@ import { getPurchaseRequisitionDetail, postPurchaseRequisitionCreate, postPurcha
const addSchemaAction = createFormActions()
const RowStyle = styled(props => <Row style={{marginTop: 12, justifyContent: "flex-end"}} justify='end' {...props}>
{props.children}
</Row>)`
.ant-col {
text-align: center
}
.ant-col div {
margin-bottom: 12px;
}
`
// 总计金额联动框
export const MoneyTotalBox = registerVirtualBox('moneyTotalBox', () => {
const intl = useIntl()
const { form } = useFormSpy({ selector: [['onFieldValueChange', 'products']], reducer: v => v })
const data = form.getFieldValue('products')
const sum = data.reduce((prev, next) => (prev*1000 + (next.amount || 0)*1000)/1000, 0)
const total = data.reduce((prev, next) => (prev*1000 + (next.quantity || 0)*1000)/1000, 0)
return <RowStyle>
<Col span={2}>
<div>{intl.formatMessage({ id: 'purchaseRequisition.shuliangheji', defaultMessage: '数量合计' })}</div>
<div>{total.toFixed(2)}</div>
</Col>
<Col span={2}>
<div>{intl.formatMessage({ id: 'purchaseRequisition.jinezongji', defaultMessage: '金额总计' })}</div>
<div>{`${intl.formatMessage({id: 'commodity.products.directChannel.columns.currency'})}${(sum).toFixed(2)}`}</div>
</Col>
</RowStyle>
})
/** 新增销售发货单 */
const AddSaleDelevedOrder:React.FC<{}> = () => {
const [formLoading, setFormLoading] = useState(false)
......@@ -137,7 +105,6 @@ const AddSaleDelevedOrder:React.FC<{}> = () => {
]}
/>
<FormDetailWrapper>
<NiceForm
loading={formLoading}
previewPlaceholder=' '
......@@ -160,7 +127,6 @@ const AddSaleDelevedOrder:React.FC<{}> = () => {
help,
}}
/>
</FormDetailWrapper>
</FormDetailContext.Provider>
</div>)
......
......@@ -26,8 +26,8 @@ export const useProductTable = (ctx: ISchemaFormActions | ISchemaFormAsyncAction
const [productColumns, setProductColumns] = useState(() => {
// 渲染操作
productInfoColumns[productInfoColumns.length - 1].render = (text, record) => <Button type='link' onClick={() => handleDelete(record)}>{intl.formatMessage({ id: 'purchaseRequisition.shanchu', defaultMessage: '删除' })}</Button>
productInfoColumns[productInfoColumns.length - 2].render = (t, r) => r.amount && <span style={{color: 'red'}}>{intl.formatMessage({ id: 'commodity.products.directChannel.columns.currency'})} {Number(r.amount).toFixed(2)}</span>
productInfoColumns[productInfoColumns.length - 1].render = (text, record) => <Button type='link' onClick={() => handleDelete(record)}>{intl.formatMessage({ id: 'saleOrder.shanchu', defaultMessage: '删除' })}</Button>
// productInfoColumns[productInfoColumns.length - 2].render = (t, r) => r.amount && <span style={{color: 'red'}}>{intl.formatMessage({ id: 'commodity.products.directChannel.columns.currency'})} {Number(r.amount).toFixed(2)}</span>
return productInfoColumns
})
......
......@@ -2,13 +2,15 @@ import { ISchema } from '@formily/antd';
import moment from 'moment'
import { getIntl } from 'umi';
const intl = getIntl()
// 基本信息
const basicInfo: ISchema = {
"x-index": 0,
type: 'object',
"x-component": 'MellowCard',
"x-component-props": {
title: '基本信息',
title: intl.formatMessage({ id: 'saleOrder.jibenxinxi', defaultMessage: '基本信息' }),
id: 'basicInfo',
},
properties: {
......@@ -27,17 +29,17 @@ const basicInfo: ISchema = {
properties: {
receiptsType: {
type: 'string',
title: '单据类型',
title: intl.formatMessage({ id: 'saleOrder.danjuleixing', defaultMessage: '单据类型' }),
"x-component": 'text',
default: '销售发货单',
default: intl.formatMessage({ id: 'saleOrder.xiaoshoufahuodan', defaultMessage: '销售发货单' }),
},
digest: {
type: 'string',
title: '单据摘要',
title: intl.formatMessage({ id: 'saleOrder.danjuzhaiyao', defaultMessage: '单据摘要' }),
"x-rules": [
{
required: true,
message: '请输入单据摘要'
message: intl.formatMessage({ id: 'saleOrder.qingshurudanju', defaultMessage: '请输入单据摘要' })
},
{
limitByte: true,
......@@ -51,7 +53,7 @@ const basicInfo: ISchema = {
deliverTime: {
type: 'string',
"x-component": 'date',
title: '单据时间',
title: intl.formatMessage({ id: 'saleOrder.danjushijian', defaultMessage: '单据时间' }),
required: true,
"x-component-props": {
disabledDate: current => {
......@@ -65,7 +67,7 @@ const basicInfo: ISchema = {
},
purpose: {
type: 'string',
title: '对应仓库',
title: intl.formatMessage({ id: 'saleOrder.duiyingcangku', defaultMessage: '对应仓库' }),
"x-rules": [
{
limitByte: true,
......@@ -78,7 +80,7 @@ const basicInfo: ISchema = {
},
purpose1: {
type: 'string',
title: '仓库人员',
title: intl.formatMessage({ id: 'saleOrder.cangkurenyuan', defaultMessage: '仓库人员' }),
"x-rules": [
{
limitByte: true,
......@@ -91,7 +93,7 @@ const basicInfo: ISchema = {
},
remark: {
type: 'string',
title: '备注',
title: intl.formatMessage({ id: 'saleOrder.beizhu', defaultMessage: '备注' }),
"x-rules": [
{
limitByte: true,
......@@ -130,27 +132,27 @@ const relatedInfo: ISchema = {
properties: {
receipts: {
type: 'string',
title: '对应单据',
title: intl.formatMessage({ id: 'saleOrder.duiyingdanju', defaultMessage: '对应单据' }),
"x-component": 'text',
},
delivery: {
type: 'string',
title: '配送方式',
title: intl.formatMessage({ id: 'saleOrder.peisongfangshi', defaultMessage: '配送方式' }),
"x-component": 'text',
},
orderNo: {
type: 'string',
title: '关联单据',
title: intl.formatMessage({ id: 'saleOrder.guanliandanju', defaultMessage: '关联单据' }),
"x-component": 'text',
},
address: {
type: 'string',
title: '收货地址',
title: intl.formatMessage({ id: 'saleOrder.shouhuodizhi', defaultMessage: '收货地址' }),
"x-component": 'text',
},
memberName: {
type: 'string',
title: '会员名称',
title: intl.formatMessage({ id: 'saleOrder.huiyuanmingcheng', defaultMessage: '会员名称' }),
"x-component": 'text',
},
}
......@@ -179,10 +181,6 @@ const material: ISchema = {
components: "{{productComponents}}",
},
},
NO_SUBMIT_SPY: {
type: 'object',
"x-component": "moneyTotalBox"
}
}
}
......
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