Commit eba9ace8 authored by XieZhiXiong's avatar XieZhiXiong

Merge branch 'dev-srm' of http://10.0.0.22:3000/lingxi/lingxi-business-paltform into dev-srm

parents 8aabc003 e086f89a
......@@ -295,6 +295,14 @@ const CommodityRoute: RouterChild = {
icon: 'smile',
component: './repositories',
},
// 仓位-批量新增
{
path: '/memberCenter/commodityAbility/repositories/batchAdd',
name: 'batchAddRepository',
icon: 'smile',
component: './repositories/batchAddRepository',
hideInMenu: true,
},
// 仓位-新增
{
path: '/memberCenter/commodityAbility/repositories/add',
......
.ulStyle {
list-style: none;
padding-left: 0px;
.wranText {
display: flex;
align-items: center;
font-size: 14px;
color: #909399;
padding: 6px 0px 6px 70px;
span {
width: 16px;
height: 16px;
line-height: 16px;
text-align: center;
border-radius: 8px;
overflow: hidden;
display: inline-block;
color: #FFFFFF;
background-color: #6198FF;
margin-right: 8px;
}
}
.wranText1 {
text-align: center;
font-size: 14px;
color: #303133;
}
.wranText1:nth-child(2) {
color: #909399;
}
}
.iconParent {
text-align: center;
padding-top: 24px;
.iconStyle {
font-size: 45px;
color: #00b37a;
}
}
.footer {
margin-top: 66px;
padding: 12px 120px;
border-top: 1px solid #F4F5F7;
button {
width: 100%;
}
}
.firstStepCheck {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: #FFFFFF;
}
import React, { ReactNode, useState } from 'react';
import { Modal, Button, Result, Upload, Progress } from 'antd';
import { CheckCircleOutlined, CloseCircleOutlined, FileExcelFilled } from '@ant-design/icons';
import style from './index.less';
import { uploadFileExcel } from '@/services/file';
interface UploadImportProps {
/** 标题 */
title?: ReactNode,
/** 显示隐藏 */
visible?: boolean,
/** 宽度 */
width?: string | number,
/** 检查的接口 */
checkfetch?: string,
/** 导入的接口 */
importfetch?: Promise<unknown>,
/** 完成导入 */
onClose?: (e) => void,
/** 成功导入后返回数据 */
fetchData?: (e) => void,
}
const UploadImport: React.FC<UploadImportProps> = (props: any) => {
const { visible, title, width, fetchData, checkfetch, importfetch, onClose } = props;
const [percent, setPercent] = useState<number>(0);
const [step, setStep] = useState<number>(0);
const [fileList, setFileList] = useState<any[]>([]);
const [exceptionCheck, setExceptionCheck] = useState<boolean>(false)
/** 第一步: 导入检查 -> 成功 or 失败 */
const firstStep = <>
<ul className={style.ulStyle}>
<li className={style.wranText}><span>1</span>点击下载 EXCEL文件模板 下载</li>
<li className={style.wranText}><span>2</span>按照模板整理货品资料</li>
<li className={style.wranText}><span>3</span>点击导入按钮,导入整理好的货品资料</li>
</ul>
</>
const firstStepLoading = <>
<ul className={style.ulStyle}>
<li className={style.wranText1}>正在进行数据导入检查</li>
<li className={style.wranText1}>请稍后…</li>
</ul>
</>
const firstStep1 = <>
<ul className={style.ulStyle}>
<li className={style.wranText1}>无错误格式数据</li>
<li className={style.wranText1}>继续导入请按下一步</li>
</ul>
</>
const firstStep2 = <>
<ul className={style.ulStyle}>
<li className={style.wranText1}>存在错误格式数据,已生成错误日志</li>
<li className={style.wranText1}>请导出错误日志修正数据后再次导入</li>
</ul>
</>
const checkbeforeUpload = file => {
setFileList([file]);
let extension = file.name.split('.')[1];
const flag = ['xlsx', 'xls'].includes(extension)
return flag;
}
const checkOnChange = ({ file }) => {
setExceptionCheck(true)
setPercent(file.percent)
if (file.response) {
const { code } = file.response;
if (code !== 1000) {
setStep(2)
return
}
setStep(1)
console.log(file, 965)
}
}
const handleNext = () => {
console.log(fileList, 98)
const formData = new FormData();
fileList.forEach(file => {
formData.append('file', file);
});
uploadFileExcel(formData).then(res => {
if (res.code !== 1000) {
setStep(4)
return
}
fetchData(res.data)
setStep(3)
})
}
/** 第二步: 导入 -> 成功 or 失败 */
const firstStep3 = <>
<ul className={style.ulStyle}>
<li className={style.wranText1}>数据全部导入成功</li>
<li className={style.wranText1}>继续导入请点击继续导入,导入完成请点击导入完成</li>
</ul>
</>
const firstStep4 = <>
<ul className={style.ulStyle}>
<li className={style.wranText1}>数据导入失败,存在无法导入的数据</li>
<li className={style.wranText1}>已生成错误日志,请导出错误日志修正数据后再次导入</li>
</ul>
</>
const continueImport = () => {
setStep(0)
}
return (
<Modal
title={title}
width={width}
footer={null}
bodyStyle={{ padding: 0, position: 'relative' }}
visible={visible}
>
{step === 0 && (
<>
<Result
style={{ padding: 0 }}
icon={<li className={style.iconParent}><FileExcelFilled className={style.iconStyle} /></li>}
title={firstStep}
extra={
<div className={style.footer}>
<Upload
action={checkfetch}
showUploadList={false}
beforeUpload={checkbeforeUpload}
onChange={checkOnChange}
>
<Button type="primary">导入</Button>
</Upload>
</div>
}
/>
{ exceptionCheck && (
<div className={style.firstStepCheck}>
<Result
style={{ padding: 0 }}
icon={<Progress
type="circle"
format={percent => `${percent} %`}
width={64}
style={{ paddingTop: '24px' }}
percent={percent}
/>}
title={firstStepLoading}
/>
</div>
)}
</>
)}
{ step === 1 && (
<Result
icon={<li className={style.iconParent}><CheckCircleOutlined className={style.iconStyle} /></li>}
style={{ padding: 0, minHeight: '327px' }}
title={firstStep1}
extra={<Button type='primary' onClick={handleNext}>下一步</Button>}
/>
)}
{ step === 2 && (
<Result
icon={<li className={style.iconParent}><CloseCircleOutlined className={style.iconStyle} /></li>}
style={{ padding: 0, minHeight: '327px' }}
title={firstStep2}
extra={<Button>导出错误日志</Button>}
/>
)}
{ step === 3 && (
<Result
icon={<li className={style.iconParent}><CheckCircleOutlined className={style.iconStyle} /></li>}
style={{ padding: 0, minHeight: '327px' }}
title={firstStep3}
extra={
<>
<Button type='primary' onClick={continueImport}>继续导入</Button>
<Button onClick={onClose}>导入完成</Button>
</>
}
/>
)}
{ step === 4 && (
<Result
icon={<li className={style.iconParent}><CloseCircleOutlined className={style.iconStyle} /></li>}
style={{ padding: 0, minHeight: '327px' }}
title={firstStep4}
extra={<Button>导出错误日志</Button>}
/>
)}
</Modal>
)
}
UploadImport.defaultProps = {
title: 'Modal',
width: 400,
}
UploadImport.displayName = 'UploadImport';
export default UploadImport;
......@@ -96,13 +96,14 @@ export const useBidDetail = (options: OrderDetailHookProps) => {
if (code === 1000) {
setFormData(data)
if(data?.deliverAddress) {
PublicApi.getLogisticsReceiverAddressGet({id: data.deliverAddress}).then(_res => {
const { data: _data } = _res
const { provinceName, cityName, districtName, address } = _data
if(code === 1000) {
setAddress(`${provinceName}/${cityName}/${districtName}/${address}`)
}
})
// PublicApi.getLogisticsReceiverAddressGet({id: data.deliverAddress}).then(_res => {
// const { data: _data } = _res
// const { provinceName, cityName, districtName, address } = _data
// if(code === 1000) {
// setAddress(`${provinceName}/${cityName}/${districtName}/${address}`)
// }
// })
setAddress(data.deliverAddress)
}
} else {
message.error(msg)
......
......@@ -134,6 +134,12 @@ const AddNewBid:React.FC<AddNewBidProps> = (props) => {
if(id) {
params['id'] = id
}
addSchemaAction.getFieldState('deliverAddressId', state => {
if(params?.deliverAddressId) {
params['deliverAddress'] = state.props.enum.filter(item => item['value'] === params['deliverAddressId'])[0]['label']
}
})
let res = await PublicApi.postPurchaseInviteTenderSaveOrUpdateInviteTender(params)
if(res.code === 1000) {
history.goBack()
......@@ -201,7 +207,7 @@ const AddNewBid:React.FC<AddNewBidProps> = (props) => {
effects={($, ctx) => {
$('onFormMount').subscribe(async () => {
const addressRes = await PublicApi.getLogisticsSelectListReceiverAddress()
ctx.setFieldState('deliverAddress', state => {
ctx.setFieldState('deliverAddressId', state => {
state.props.enum = addressRes.data.map(item => ({ label: item.fullAddress, value: item.id }))
})
......
......@@ -635,7 +635,7 @@ const otherRequset: ISchema = {
wrapperCol: 10
},
properties: {
deliverAddress: {
deliverAddressId: {
type: 'number',
title: '交付地址',
enum: [],
......
......@@ -79,16 +79,16 @@ export const useSelfTable = () => {
{
title: '外部状态',
align: 'left',
dataIndex: 'isSend',
key: 'isSend',
render: (t, r) => <CustomTag status={r.submitTenderOutStatus} type='tenderOut' />
dataIndex: 'inviteTender',
key: 'inviteTender',
render: (t, r) => <CustomTag status={r.inviteTender.inviteTenderOutStatus} type='out' />
},
{
title: '内部状态',
align: 'left',
dataIndex: 'submitTenderInStatus',
key: 'submitTenderInStatus',
render: (t, r) => <CustomBadge status={t} type='tenderInside' />
render: (t, r) => "待审核报名"
},
]
......
......@@ -68,16 +68,16 @@ export const useSelfTable = () => {
{
title: '外部状态',
align: 'left',
dataIndex: 'submitTenderOutStatus',
key: 'submitTenderOutStatus',
render: text => <CustomTag status={text} type='tenderOut' />
dataIndex: 'inviteTender',
key: 'inviteTender',
render: (t, r) => <CustomTag status={r.inviteTender.inviteTenderOutStatus} type='out' />
},
{
title: '内部状态',
align: 'left',
dataIndex: 'submitTenderInStatus',
key: 'submitTenderInStatus',
render: (text) => <CustomBadge status={text} type='tenderInside' />
render: (text) => '待审核资格预审'
},
]
......
......@@ -20,24 +20,8 @@ const TenderSearch: React.FC<{}> = () => {
} = useSelfTable()
const fetchTableData = async (params) => {
let _params = params.inviteTenderInStatusList ? { ...params, inviteTenderInStatusList: [params.inviteTenderInStatusList] } : {...params}
let __params = _params.inviteTenderOutStatusList ? {
..._params,
inviteTenderOutStatusList: [_params.inviteTenderOutStatusList]
} : {
..._params,
inviteTenderOutStatusList: [
BidOuterWorkState.Not_Qualifications_Check,
BidOuterWorkState.Not_Submit_Tender,
BidOuterWorkState.Not_Open_Tender,
BidOuterWorkState.Not_Selection_Tender,
BidOuterWorkState.Not_Finish_Notice,
BidOuterWorkState.Not_Win_Notice,
BidOuterWorkState.Finish_Invite_Tender,
BidOuterWorkState.Discard_Tender,
]
}
const { data } = await PublicApi.postPurchaseInviteTenderGetSubmitTenderList(__params, { ctlType: "none" })
let _params = params.submitTenderOutStatusList ? { ...params, submitTenderOutStatusList: [params.submitTenderOutStatusList] } : {...params}
const { data } = await PublicApi.postPurchaseInviteTenderGetSubmitTenderList(_params, { ctlType: "none" })
return data
}
......
......@@ -44,7 +44,7 @@ export const useSelfTable = () => {
align: 'left',
dataIndex: 'inviteTender',
key: 'inviteTender',
render: (text, record) => formatTimeString(record.inviteTender.inviteTenderStartTime),
render: (text, record) => formatTimeString(record.submitTenderTime),
width: 200
},
{
......@@ -65,9 +65,9 @@ export const useSelfTable = () => {
{
title: '外部状态',
align: 'left',
dataIndex: 'submitTenderOutStatus',
key: 'submitTenderOutStatus',
render: (text, record) => <CustomTag status={record.submitTenderOutStatus} type='tenderOut' />
dataIndex: 'inviteTender',
key: 'inviteTender',
render: (text, record) => <CustomTag status={record.inviteTender.inviteTenderOutStatus} type='out' />
},
// {
// title: '内部状态',
......
......@@ -60,21 +60,11 @@ export const tableListSchema: ISchema = {
"x-component-props": {
placeholder: '请选择外部状态'
},
enum: Object.keys(TenderOutStateTexts).filter(_item => Number(_item) >= 7).map(item => ({
enum: Object.keys(TenderOutStateTexts).filter(_item => Number(_item) >= 8).map(item => ({
label: TenderOutStateTexts[item],
value: item,
}))
},
// "interiorState": {
// type: 'string',
// "x-component-props": {
// placeholder: '请选择内部状态'
// },
// enum: Object.keys(PurchaseOrderInsideWorkStateTexts).map(item => ({
// label: PurchaseOrderInsideWorkStateTexts[item],
// value: item,
// }))
// },
submit: {
'x-component': 'Submit',
'x-component-props': {
......
......@@ -4,7 +4,7 @@ import { unixChangeRender } from "@/pages/procurement/callForBids/addNewBid/cons
/** 参数字段转换为form数据 */
export const fieldTransformRender = (params) => {
let result: any = {}
result['submitTenderId'] = params.id
result['inviteTenderId'] = params.inviteTender.id
result['inviteTenderCode'] = params.inviteTender.code
result['remark'] = params.inviteTender.remark
result['memberName'] = params.inviteTender.memberName
......
......@@ -30,7 +30,7 @@ export const formSchema: ISchema = {
labelAlign: 'left'
},
properties: {
submitTenderId: {
inviteTenderId: {
type: 'string',
title: '招标ID',
readOnly: true,
......
......@@ -171,9 +171,10 @@ const AddTender:React.FC<AddTenderProps> = (props) => {
$('onFormMount').subscribe(async () => {
$('onFieldValueChange', 'deliverAddress').subscribe(async state => {
if(state.value) {
const res = await PublicApi.getLogisticsReceiverAddressGet({id: state.value})
const { provinceName, cityName, districtName, address } = res.data
ctx.setFieldValue('fullAddress', `${provinceName}${cityName}${districtName}${address}`)
// const res = await PublicApi.getLogisticsReceiverAddressGet({id: state.value})
// const { provinceName, cityName, districtName, address } = res.data
// ctx.setFieldValue('fullAddress', `${provinceName}${cityName}${districtName}${address}`)
ctx.setFieldValue('fullAddress', state.value)
}
})
})
......
import React from 'react'
import { history } from 'umi'
import { Button, Card, message } from 'antd'
import { PageHeaderWrapper } from '@ant-design/pro-layout'
import {
SaveOutlined,
} from '@ant-design/icons'
import ReutrnEle from '@/components/ReturnEle';
import './index.less'
import { batchRepositDetailSchema } from './schema'
import { createFormActions } from '@formily/antd'
import { omit } from '@/utils'
import { PublicApi } from '@/services/api'
import { usePageStatus, PageStatus } from '@/hooks/usePageStatus'
import BatchPositionSetting from './components/BatchPositionSetting'
const addSchemaAction = createFormActions()
const BatchAddRepository:React.FC<{}> = (props) => {
const {
id,
preview,
pageStatus
} = usePageStatus()
// 整体表单提交
const formSubmit = async (values) => {
const params = {...values}
console.log(params, 'params')
if (params['applyMember']) {
params['applyMember'] = params['applyMember']
}
if (params['commodityList']) {
params['commodityList'] = params['commodityList'].map(item =>({
productId: item.id,
productName: item.name,
category: item.customerCategoryName,
brand: item.brandName,
unit: item.unitName,
goodsId: item?.goodsId || null,
itemNo: item?.goodsCode || null,
goodsName: item?.goodsName || null,
}))
}
if(!params['isAllMemberShare'] && !params['applyMember']?.length) {
message.error('请选择指定会员')
} else {
addSchemaAction.getFieldState('warehouseId', prevState => {
if(prevState.value) {
params['warehouseName'] = prevState.props.enum.filter((item: any) => item.value === prevState.value)[0]['label']
}
})
addSchemaAction.getFieldState('shopIds', state => {
params['shopIds'] = state.value.map(item => state.props['x-component-props'].dataSource.filter(_ => _.id === item)[0])
})
let res = await PublicApi.postProductFreightSpaceAddBatch(params)
if(res.code === 1000) {
setTimeout(() => {
history.goBack(-1)
}, 1000)
}
}
}
return (
<PageHeaderWrapper
onBack={() => history.goBack()}
backIcon={<ReutrnEle description="返回"/>}
className='addRepository'
title={pageStatus === PageStatus.PREVIEW ? '查看仓位' : '批量新增仓位'}
extra={(
pageStatus !== PageStatus.PREVIEW
? (
<Button key="1" onClick={() => addSchemaAction.submit()} type="primary" icon={<SaveOutlined />}>
保存
</Button>
)
: null
)}
>
<Card className=''>
{/* <WrapperLayout> */}
<BatchPositionSetting addSchemaAction={addSchemaAction} schema={batchRepositDetailSchema} formSubmit={formSubmit}/>
{/* </WrapperLayout> */}
</Card>
</PageHeaderWrapper>
)
}
export default BatchAddRepository
This diff is collapsed.
import React, { useRef } from 'react';
import { history } from 'umi';
import { Button, Card, Space } from 'antd';
import { Button, Card, Space, Tooltip } from 'antd';
import { PageHeaderWrapper } from '@ant-design/pro-layout';
import { PlusOutlined } from '@ant-design/icons';
import { PlusOutlined, QuestionCircleOutlined } from '@ant-design/icons';
import { StandardTable } from 'god';
import { ColumnType } from 'antd/lib/table/interface';
import EyePreview from '@/components/EyePreview';
import StatusSwitch from '@/components/StatusSwitch';
import NiceForm from '@/components/NiceForm';
import { createFormActions, FormEffectHooks } from '@formily/antd';
import { createFormActions, FormEffectHooks, ISchema } from '@formily/antd';
import { useStateFilterSearchLinkageEffect } from '@/formSchema/effects/useFilterSearch';
import { FORM_FILTER_PATH } from '@/formSchema/const';
import { repositSchema } from './schema';
import { PublicApi } from '@/services/api';
import { searchBrandOptionEffect, searchCustomerCategoryOptionEffect } from './effects';
import { treeReduction } from '@/utils';
import ModalForm from '@/components/ModalForm';
import { useHttpRequest } from '@/hooks/useHttpRequest';
import { useRowSelectionTable } from '@/hooks/useRowSelectionTable';
import { PATTERN_MAPS } from '@/constants/regExp';
const formActions = createFormActions();
const modalSchemaAction = createFormActions()
// 模拟请求
const fetchData = async (params: any) => {
if(params?.category) {
formActions.getFieldState('category', state => {
......@@ -38,6 +42,10 @@ const fetchData = async (params: any) => {
const Repositories: React.FC<{}> = () => {
const ref = useRef<any>({});
const modalRef = useRef<any>({})
const [rowSelection, RowCtl] = useRowSelectionTable({ customKey: 'id' });
const { run, loading } = useHttpRequest(PublicApi.postProductFreightSpaceUpdateBatch, {ctlType: 'none'})
const columns: ColumnType<any>[] = [
{
title: '仓位ID',
......@@ -112,6 +120,86 @@ const Repositories: React.FC<{}> = () => {
},
];
const modalSchema: ISchema = {
type: 'object',
properties: {
NO_SUBMIT: {
type: 'object',
"x-component": "mega-layout",
"x-component-props": {
labelAlign: 'left',
labelCol: 5,
},
properties: {
type: {
type: 'radio',
required: true,
enum: [
{
label: '直接修改仓位库存(默认)',
value: 1
},
{
label: '按比率调整仓位库存',
value: 2
}
],
default: 1,
"x-linkages": [
{
type: 'value:visible',
target: 'inventoryAmount',
"condition": "{{$value === 1}}"
},
{
type: 'value:visible',
target: 'inventoryRate',
"condition": "{{$value === 2}}"
},
]
},
inventoryAmount: {
type: 'number',
title: '{{help("仓位库存", "输入仓位库存后,点击确定,将用新输入的仓位库存批量调整原仓位库存")}}',
"x-component-props": {
placeholder: "请填写仓位库存",
style: { width: '100%' }
},
'x-rules': [
{
required: true,
message: '请填写仓位库存',
},
{
pattern: PATTERN_MAPS.weight,
message: '请填写正数,最多保留3位小数',
},
],
},
inventoryRate: {
type: 'string',
title: '{{help("仓位库存调整比率", "输入百分比,即按原仓位库存调增百分或调减百分比,调减请输入负值")}}',
"x-component-props": {
placeholder: "请填写仓位库存",
style: { width: '100%' },
suffix: '%'
},
'x-rules': [
{
required: true,
message: '请填写仓位库存调整比率',
},
{
pattern: /^\d+(\.\d{1,3})?$/,
message: '税率仅限三位小数',
}
],
},
}
}
}
}
const handleSee = (record: any) => {
console.log('see');
history.push(`/repositories/viewRepository?id=${record.key}`);
......@@ -140,6 +228,41 @@ const Repositories: React.FC<{}> = () => {
history.push(`/memberCenter/commodityAbility/repositories/add`);
};
const handleBatchAdd = () => {
history.push(`/memberCenter/commodityAbility/repositories/batchAdd`);
}
const handleSubmit = async (value) => {
console.log(value, 'vvv')
const { code } = run({...value, inventory: value?.inventoryAmount || value?.inventoryRate})
if(code === 1000) {
modalRef.current.setVisible(false)
setTimeout(() => {
ref.current.reload()
}, 600)
}
}
const handleConfirm = () => {
modalSchemaAction.submit()
}
const help = (text: string, desc: string) => (<>
{text}&nbsp;
<Tooltip title={desc}>
<QuestionCircleOutlined />
</Tooltip>
</>)
const handleFormatter = (value) => {
// value => `${value}%`
console.log(value)
}
const handleParser = (value) => {
console.log(value)
}
const controllerBtns = <Space>
<Button
type="primary"
......@@ -148,6 +271,8 @@ const Repositories: React.FC<{}> = () => {
>
新建
</Button>
<Button onClick={handleBatchAdd}>批量新建</Button>
<Button onClick={() => modalRef.current.setVisible(true)}>批量修改</Button>
</Space>
return (
......@@ -157,6 +282,7 @@ const Repositories: React.FC<{}> = () => {
columns={columns}
currentRef={ref}
tableProps={{ rowKey: 'id' }}
rowSelection={rowSelection}
fetchTableData={(params: any) => fetchData(params)}
controlRender={
<NiceForm
......@@ -184,6 +310,30 @@ const Repositories: React.FC<{}> = () => {
}
/>
</Card>
<ModalForm
modalTitle='批量修改仓位库存'
previewPlaceholder=' '
currentRef={modalRef}
schema={modalSchema}
actions={modalSchemaAction}
onSubmit={handleSubmit}
confirm={handleConfirm}
modalProps={{
confirmLoading: loading
}}
effects={($, ctx) => {
$('onFieldInit', 'type').subscribe(() => {
setTimeout(() => {
ctx.setFieldValue('type', 1)
}, 500)
})
}}
expressionScope={{
help,
handleParser,
handleFormatter,
}}
/>
</PageHeaderWrapper>
);
};
......
......@@ -289,10 +289,10 @@ export const repositMoreSchema: ISchema = padRequiredMessage({
label: '按仓位随机扣减',
value: 1
},
{
label: '按仓库位置远近扣除',
value: 2
}
// {
// label: '按仓库位置远近扣除',
// value: 2
// }
],
default: 1
}
......@@ -521,10 +521,170 @@ export const repositDetailSchema: ISchema = padRequiredMessage({
label: '按仓位随机扣减',
value: 1
},
// {
// label: '按仓库位置远近扣除',
// value: 2
// }
],
default: 1
}
}
}
}
},
"tab-2": {
"type": "object",
"x-component": "tabpane",
"x-component-props": {
"tab": "适用商城"
},
"properties": {
MEGA_LAYOUT2: {
type: 'object',
"x-component": 'mega-layout',
"x-component-props": {
labelCol: 4,
labelAlign: 'left'
},
properties: {
"shopIds": {
"type": "array:number",
"x-component": 'CardCheckBox',
"x-component-props": {
dataSource: []
},
"title": "适用商城",
required: true,
}
}
}
}
},
"tab-3": {
type: 'object',
"x-component": 'tabpane',
"x-component-props": {
"tab": "适用会员"
},
properties: {
MEGA_LAYOUT3: {
type: 'object',
"x-component": 'mega-layout',
"x-component-props": {
labelCol: 4,
labelAlign: 'left'
},
properties: {
"isAllMemberShare": {
"type": "radio",
enum: [
{ label: '所有会员共享(默认)', value: 1 },
{ label: '指定会员', value: 0 },
],
"title": "选择会员",
default: 1,
required: true,
"x-linkages": [
{
label: '按仓库位置远近扣除',
value: 2
type: 'value:visible',
target: 'applyMember',
"condition": "{{!$value}}"
}
]
},
applyMember: {
type: 'array:number',
"x-component": 'MultTable',
"x-component-props": {
rowKey: 'memberId',
columns: "{{tableColumns}}",
prefix: "{{tableAddButton}}",
pagination: {
"onChange": "{{paginationChange}}",
"total": "{{membersLength}}"
}
}
}
}
}
}
}
}
}
}
})
// 批量新增仓位
export const batchRepositDetailSchema: ISchema = padRequiredMessage({
type: 'object',
properties: {
REPOSIT_TABS: {
type: 'object',
"x-component": "tab",
"x-component-props": {
type: 'card',
},
properties: {
"tab-1": {
"type": "object",
"x-component": "tabpane",
"x-component-props": {
"tab": "基本信息"
},
"properties": {
MEGA_LAYOUT1: {
type: 'object',
"x-component": 'mega-layout',
"x-component-props": {
labelCol: 4,
wrapperCol: 8,
labelAlign: 'left'
},
properties: {
shopType: {
type: 'string',
enum: getShopTypeMap,
title: '商城类型',
required: true
},
warehouseId: {
type: 'string',
title: '仓库名称',
enum: []
},
inventory: {
type: 'number',
"x-mega-props": {
full: true
},
required: true,
title: '分配仓位库存',
"x-rules": [
{
validator: value => {
return value > Number.MAX_SAFE_INTEGER
},
message:'仓位库存数值已超出最大限度',
},
{
pattern: /^\d+(\.\d{1,3})?$/,
message: '仓位库存数值仅限三位小数',
},
]
},
inventoryDeductWay: {
type: 'radio',
title: '库存扣减方式',
required: true,
enum: [
{
label: '按仓位随机扣减',
value: 1
},
// {
// label: '按仓库位置远近扣除',
// value: 2
// }
],
default: 1
}
......@@ -533,6 +693,38 @@ export const repositDetailSchema: ISchema = padRequiredMessage({
}
},
"tab-2": {
type: 'object',
"x-component": 'tabpane',
"x-component-props": {
"tab": "适用商品"
},
properties: {
MEGA_LAYOUT3: {
type: 'object',
"x-component": 'mega-layout',
"x-component-props": {
labelCol: 4,
labelAlign: 'left'
},
properties: {
commodityList: {
type: 'array:number',
"x-component": 'MultTable',
"x-component-props": {
rowKey: 'id',
columns: "{{tableProductColumns}}",
prefix: "{{tableAddProductButton}}",
// pagination: {
// "onChange": "{{paginationChange}}",
// "total": "{{membersLength}}"
// }
}
}
}
}
}
},
"tab-3": {
"type": "object",
"x-component": "tabpane",
"x-component-props": {
......@@ -560,7 +752,7 @@ export const repositDetailSchema: ISchema = padRequiredMessage({
}
}
},
"tab-3": {
"tab-4": {
type: 'object',
"x-component": 'tabpane',
"x-component-props": {
......@@ -727,10 +919,10 @@ export const repositTabOneSchema: ISchema = padRequiredMessage({
label: '按仓位随机扣减',
value: 1
},
{
label: '按仓库位置远近扣除',
value: 2
}
// {
// label: '按仓库位置远近扣除',
// value: 2
// }
],
default: 1
}
......
......@@ -37,6 +37,7 @@ const BidDetailLayout: React.FC<BidDetailLayoutProps> = (props: any) => {
const columns: ColumnType<any>[] = [
{
title: '物料编号/名称',
key: 'number',
dataIndex: 'number',
render: (text: any, record: any) => (
<Space direction='vertical'>
......@@ -45,12 +46,13 @@ const BidDetailLayout: React.FC<BidDetailLayoutProps> = (props: any) => {
</Space>
)
},
{ title: '规格型号', dataIndex: 'model', },
{ title: '品类', dataIndex: 'category', },
{ title: '品牌', dataIndex: 'brand', },
{ title: '规格型号',key: 'model', dataIndex: 'model', },
{ title: '品类',key: 'category', dataIndex: 'category', },
{ title: '品牌',key: 'brand', dataIndex: 'brand', },
{
title: '采购数量/单位',
dataIndex: 'unit',
key: 'unit',
render: (text: any, record: any) => (
<Space direction='vertical'>
<Text type='secondary' key={'unit_1'} >{record.purchaseCount}</Text>
......@@ -61,6 +63,7 @@ const BidDetailLayout: React.FC<BidDetailLayoutProps> = (props: any) => {
{
title: '含税/税率',
dataIndex: 'isTax',
key: 'isTax',
render: (text: any, record: any) => (
<Space direction='vertical'>
<Text type='secondary' key={'isTax_1'} >{transforType[text]}</Text>
......@@ -70,12 +73,14 @@ const BidDetailLayout: React.FC<BidDetailLayoutProps> = (props: any) => {
},
{
title: '单价(含税)',
dataIndex: 'price',
dataIndex: 'unitPrice',
key: 'unitPrice',
render: (text: any, record: any) => <Text type='secondary'>¥{priceFormat(text)}</Text>
},
{
title: '金额(含税)',
dataIndex: 'price',
key: 'price',
render: (text: any, record: any) => <Text type='secondary'>¥{priceFormat(text)}</Text>
},
]
......
......@@ -30,7 +30,7 @@ const DemandPlanMaterialLayout: React.FC<IPROPS> = (props: any) => {
dataIndex: 'number',
render: (text: any, record: any) => (
<Space direction='vertical' size={0}>
<EyePreview class type='button'>{text}</EyePreview>
<Typography.Text>{text}</Typography.Text>
<Typography.Text>{record.name}</Typography.Text>
</Space>
)
......
......@@ -114,7 +114,7 @@ const LowestQuotationRecord: React.FC<TableCommonLayoutProps> = (props: any) =>
</div>
<div className={selfStyles.baseItem}>
<h5 className={selfStyles.label}>报价总额(含税): </h5>
<h5 className={selfStyles.content}>{effect?.reportPrice ? priceFormat(effect?.reportPrice) : '-'}</h5>
<h5 className={selfStyles.content}>{effect?.reportPrice ? `¥ ${priceFormat(effect?.reportPrice)}` : '-'}</h5>
</div>
<StandardTable
currentRef={currentRef}
......
import React from 'react';
import { Drawer, Table, Space, Typography } from 'antd';
import { ColumnType } from 'antd/lib/table/interface';
import moment from 'moment';
interface DrawerLayoutProps {
dataSource: any,
visible: boolean,
onClose: () => void,
}
const DrawerLayout: React.FC<DrawerLayoutProps> = (props: any) => {
const { dataSource, visible, onClose } = props;
const format = (text) => {
return <>{moment(text).format("YYYY-MM-DD HH:mm:ss")}</>
}
const columns: ColumnType<any>[] = [
{
title: '需求计划编号/摘要',
key: 'needPlanNo',
dataIndex: 'needPlanNo',
render: (text: any, record: any) => (
<Space direction='vertical' size={0}>
<Typography.Text>{text}</Typography.Text>
<Typography.Text>{record.summary}</Typography.Text>
</Space>
)
},
{
title: '计划开始日期/结束时间',
key: 'startTime',
dataIndex: 'startTime',
render: (text: any, record: any) => (
<Space direction='vertical' size={0}>
<Typography.Text>{format(text)}</Typography.Text>
<Typography.Text>{format(record.endTime)}</Typography.Text>
</Space>
)
},
{
title: '编制部门',
key: 'department',
dataIndex: 'department',
},
{
title: '编制人',
key: 'userName',
dataIndex: 'userName',
},
{
title: '需求数量',
key: 'needCount',
dataIndex: 'needCount',
},
{
title: '成本价',
key: 'costPrice',
dataIndex: 'costPrice',
},
{
title: '需求金额',
key: 'needPrice',
dataIndex: 'needPrice',
},
{
title: '到货日期',
key: 'arriveTime',
dataIndex: 'arriveTime',
render: (text: any) => format(text)
},
]
return (
<Drawer
title='需求计划明细'
placement='right'
visible={visible}
onClose={onClose}
width="72.9%"
>
<Table
rowKey={'id'}
columns={columns}
dataSource={dataSource}
/>
</Drawer>
)
}
export default DrawerLayout;
import React, { useRef } from 'react';
import React, { useRef, useState } from 'react';
import { StandardTable } from 'god';
import { Space, Typography, Button } from 'antd';
import Card from '../../../card';
import EyePreview from '@/components/EyePreview';
import { ColumnType } from 'antd/lib/table/interface';
import moment from 'moment';
import DrawerLayout from './drawer';
export interface IPROPS {
id?: number,
......@@ -17,11 +17,10 @@ export interface IPROPS {
}
const PurchasePlanMaterialLayout: React.FC<IPROPS> = (props: any) => {
const format = (text) => {
return <>{moment(text).format("YYYY-MM-DD HH:mm:ss")}</>
}
const { id, fetch, layoutTitle, column } = props;
const currentRef = useRef({});
const [visible, setVisible] = useState<boolean>(false);
const [dataSource, setDataSource] = useState<any>([]);
const columns: ColumnType<any>[] = [
{
......@@ -76,10 +75,15 @@ const PurchasePlanMaterialLayout: React.FC<IPROPS> = (props: any) => {
title: '操作',
key: 'operate',
dataIndex: 'operate',
render: (_t: any) => <Button type='link'>查看需求计划明细</Button>
render: (_t: any, record: any) => <Button type='link' onClick={() => handleClick(record)}>查看需求计划明细</Button>
}
];
const handleClick = (data: any) => {
setDataSource(data.purchaseNeedPlanDetailList);
setVisible(true);
}
const productlist = (params: any) => {
return new Promise(resolve => {
fetch({ id, ...params }).then((res: any) => {
......@@ -99,6 +103,11 @@ const PurchasePlanMaterialLayout: React.FC<IPROPS> = (props: any) => {
tableProps={{ rowKey: 'id' }}
fetchTableData={(params: any) => productlist(params)}
/>
<DrawerLayout
dataSource={dataSource}
visible={visible}
onClose={() => setVisible(false)}
/>
</Card>
)
}
......
......@@ -8,6 +8,7 @@ import Material from './components/material';
import moment from 'moment'
import { PublicApi } from '@/services/api';
import { isEmpty } from 'lodash';
import UploadImport from '@/components/UploadImport';
const { TabPane } = Tabs;
......@@ -120,8 +121,10 @@ const DemandPlanAddedForm = () => {
</TabPane>
</Tabs>
</Card>
<UploadImport
width='400px'
/>
</PageHeaderWrapper>
)
}
......
......@@ -95,7 +95,7 @@ const DemandDetailed = () => {
memberId: null,
memberRoleId: null,
operation: item.operate,
position: '',
position: item.jobTitle,
purchaseInquiryId: null,
roleName: item.operator,
state: item.step + 1,
......
......@@ -113,7 +113,7 @@ const SearchDetail = () => {
setResultEffect([
{
col: [
{ label: '中标金额(含税)', extra: data?.sumAwardPrice ? priceFormat(data?.sumAwardPrice) : '-', type: 'text' },
{ label: '中标金额(含税)', extra: data?.sumAwardPrice ? ${priceFormat(data?.sumAwardPrice)}` : '-', type: 'text' },
{ label: '中标理由', extra: '价格最低', type: 'text' },
]
},
......
......@@ -13,9 +13,8 @@ import { ColumnType } from 'antd/lib/table/interface';
import { PlusOutlined } from '@ant-design/icons';
import style from './index.less';
import DrawerWrite from '../modal/drawerWrite';
import Import from '../modal/import';
import { PublicApi } from '@/services/api';
import UploadModal from '@/components/UploadModal';
import UploadImport from '@/components/UploadImport';
const layout: any = {
colon: false,
......@@ -212,6 +211,12 @@ const Material: React.FC<Iprops> = (props: any) => {
setFlag(false);
}
}
/** 导入列表 */
const fetchData = (data: any) => {
if (Object.keys(data).length > 0) {
setDataSource([...dataSource, ...data]);
}
}
useEffect(() => {
searchCategoryTree('0');
}, [])
......@@ -295,15 +300,13 @@ const Material: React.FC<Iprops> = (props: any) => {
)}
{materielMode === 2
&& (
<UploadModal
visibleModal={flag}
fileText='货品资料'
onCancel={() => setFlag(false)}
<UploadImport
visible={flag}
title='导入'
checkfetch='/api/purchase/purchase/inquiry/import/excel/check'
fetchData={fetchData}
onClose={() => setFlag(false)}
/>
// <Import
// flag={flag}
// onClose={() => setFlag(false)}
// />
)}
</Form>
</>
......
......@@ -73,7 +73,7 @@ const SubmitInquiry = () => {
<>
<Popconfirm title="确定要审核吗?" okText="是" cancelText="否" onConfirm={() => fetchSubmitBatch(record.id)}>
<Button type='link'>
审核
提交
</Button>
</Popconfirm>
</>
......@@ -93,9 +93,9 @@ const SubmitInquiry = () => {
<Col span={6}>
<Button
disabled={rowkeys.length === 0}
onClick={fetchSubmitBatch}
onClick={() => fetchSubmitBatch()}
>
批量提交审核
批量提交
</Button>
</Col>
</Row>
......
declare namespace FileAPI {
}
\ No newline at end of file
import umiRequest from 'umi-request';
import request from '@/utils/request';
/**
* @description 上传文件
* @author xjm
* @date 2020-06-15
* @export
*/
export async function uploadFile(params) {
return request('/file/upload', {
prefix: '/api/file',
method: 'post',
data: params,
headers: {
'Content-Type': "application/formData"
},
ctlType: 'message'
})
}
export async function uploadFileExcel(params) {
return umiRequest('/purchase/inquiry/import/excel', {
prefix: '/api/purchase',
method: 'post',
data: params,
requestType: 'form'
})
}
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