Commit 7792d18d authored by LeeJiancong's avatar LeeJiancong

'新增需求单回显'

parents b875ac75 668eafb4
......@@ -103,6 +103,13 @@ const TranactionRoute = {
key: 'readyAddOrder',
component: '@/pages/transaction/purchaseOrder/readyAddOrder'
},
{
path: '/memberCenter/tranactionAbility/purchaseOrder/readyAddOrder/orderDetail',
name: 'orderDetail',
key: 'orderDetail',
hideInMenu: true,
component: '@/pages/transaction/purchaseOrder/readyAddOrder/detail'
},
]
}
]
......
......@@ -41,6 +41,10 @@ const serviceConfig = {
},
method: 'get'
},
orderMode: {
url: '/order/rule/configuration/all',
method: 'get'
}
// site: {
// url: '/manage/paas/site/all',
// method: 'get',
......
import React from 'react'
import { Slider, Input, Space } from 'antd'
import { Slider, Input, Space, InputNumber } from 'antd'
const CustomSlider = (props) => {
const value = props.value || 0
......@@ -16,7 +16,7 @@ const CustomSlider = (props) => {
{
isNumber ?
<div>
<Input type='number' className='underline_input' max={max} value={props.value} onChange={e => props.mutators.change(e.target.value)}/>
<InputNumber className='underline_input' min={0} max={max || 0} value={props.value} onChange={fieldValue => props.mutators.change(fieldValue)}/>
</div>
:
<Space>
......
......@@ -10,15 +10,17 @@
}
.underline_input {
max-width: 200px;
width: 200px;
background: none;
border: none;
outline: none;
font-size: 32px;
border-bottom: 1px solid #DFE1E6;
padding: 8px 19px;
text-align: center;
display: inline-block;
display: block;
input {
text-align: center;
}
&:focus{
box-shadow: none;
border-bottom: 1px solid #DFE1E6;
......
export interface MemberType {
id: number;
typeName: string;
}
export interface BusinessType {
id: number;
typeName: string;
}
export interface UseType {
memberType: MemberType[];
businessType: BusinessType[];
}
export interface UserRegister {
useType: UseType;
}
export interface ShopInfo {
id: number;
name: string;
type: number;
environment: number;
logoUrl: string;
describe?: any;
state: number;
url: string;
}
export interface OrderMode {
value: number;
label: string;
platformType: number;
}
export interface Web {
shopInfo: ShopInfo[];
orderMode: OrderMode[];
}
export interface CountryList {
name: string;
key: string;
icon: string;
}
export interface Global {
siteId: number;
siteUrl: string;
logo: string;
countryList: CountryList[];
}
export interface RootObject {
userRegister: UserRegister;
web: Web;
global: Global;
}
\ No newline at end of file
// 离开页面时,如果有编辑过表单,需要进行提示
import { useState } from 'react'
export const useLeavePageWarn = (initState = false) => {
const [isEditForm, setIsEditForm] = useState(initState)
return [isEditForm, setIsEditForm]
}
\ No newline at end of file
......@@ -107,6 +107,7 @@ export default {
'menu.tranactionAbility.purchaseOrder': '采购订单',
'menu.tranactionAbility.purchaseOrder.purchaseOrderSearch': '订单查询',
'menu.tranactionAbility.purchaseOrder.readyAddOrder': '待新增订单',
'menu.tranactionAbility.purchaseOrder.orderDetail': '订单详情',
//物流能力
'menu.logisticsAbility': '物流',
......
......@@ -23,6 +23,7 @@ import { GetProductCustomerGetCustomerAttributeResponse } from '@/services';
const treeActions = createTreeActions()
const fetchAttributeTreeData = async (params?) => {
// @ts-ignore
const res = await PublicApi.getProductCustomerGetCustomerAttributeTree({filterInput: true})
return res
}
......
......@@ -303,6 +303,7 @@ const Goods: React.FC<{}> = () => {
ref.current.reload()
})
},
okType: 'danger',
onCancel() {
console.log('Cancel');
},
......
......@@ -31,6 +31,7 @@ const AddProducts: React.FC<{}> = (props) => {
const { ProductStore } = store
const {
productSelectAttribute,
priceAttributeParams,
productAttributeAndImageParams,
areaOption,
productDescription,
......@@ -131,12 +132,11 @@ const AddProducts: React.FC<{}> = (props) => {
if(productAttributeAndImageParams.length>0){
productAttributeAndImageParams.map(_item => {
console.log(_item, '_item')
_item.goods = { id: _item.goodsId } // id为0表示无货品
delete _item.goodsId
if(_item.attributeAndValueList.length>0){
_item.goods = { id: _item.goodsId }
delete _item.goodsId
_item.attributeAndValueList.map(__item => {
delete __item.customerAttributeName
// __item.customerAttributeValueId = __item.id
// **** 新字段结构变更
__item.customerAttribute = { id: __item.customerAttributeId }
__item.customerAttributeValue = { id: __item.id, value: __item.value }
......@@ -145,8 +145,6 @@ const AddProducts: React.FC<{}> = (props) => {
delete __item.customerAttributeId
})
}
// _item.attributeAndValueList = _item.goodsCustomerAttributeList
// delete _item.goodsCustomerAttributeList
if(_item.commodityPic.length>0){
// 编辑情况下兼顾手动添加图片列表属性
_item.commodityPic = _item.commodityPic.map(__item => __item?.response?.data || __item?.url)
......@@ -157,31 +155,30 @@ const AddProducts: React.FC<{}> = (props) => {
throw new Error('每项请至少上传一张商品图片!')
}
})
}
else{
}else{
throw new Error('每项请至少上传一张商品图片!')
}
}catch(e){
return e
}
_params.unitPriceAndPicList = productAttributeAndImageParams
}else{
}else{ // 编辑 没有点击商品图片
_params.unitPriceAndPicList = productInfoByEdit.unitPriceAndPicList
}
if(clickTabIndex.indexOf("3")===-1)
if(clickTabIndex.indexOf("3")===-1) // 商品属性
_params.commodityAttributeList = productInfoByEdit.commodityAttributeList
if(clickTabIndex.indexOf("4")===-1){
if(clickTabIndex.indexOf("4")===-1){ // 价格属性
_params.unitId = productInfoByEdit.unitId
_params.unitName = productInfoByEdit.unitName
_params.minOrder = productInfoByEdit.minOrder
_params.priceType = productInfoByEdit.priceType
_params.isMemberPrice = productInfoByEdit.isMemberPrice
}
if(clickTabIndex.indexOf("6")===-1)
if(clickTabIndex.indexOf("6")===-1) // 商品描述
_params.commodityRemark = productInfoByEdit.commodityRemark
if(clickTabIndex.indexOf("7")===-1)
if(clickTabIndex.indexOf("7")===-1) // 物流
_params.logistics = productInfoByEdit.logistics
if(clickTabIndex.indexOf("8")===-1){
if(clickTabIndex.indexOf("8")===-1){ // 其他
_params.isInvoice = productInfoByEdit.isInvoice
_params.marks = productInfoByEdit.marks
_params.packing = productInfoByEdit.packing
......
......@@ -40,11 +40,17 @@ const OtherForm: React.FC<Iprops> = (props) => {
ref={otherFormRef}
colon={false}
autoComplete="off"
initialValues={history.location.query?.id ? getOtherFormParamsByEdit : { isInvoice: false }}
initialValues={history.location.query?.id ? getOtherFormParamsByEdit : {}}
>
<Form.Item
name="isInvoice"
label="提供发票"
rules={[
{
required: true,
message: '请选择是否提供发票'
}
]}
>
<Radio.Group size="small">
<Radio.Button value={true} style={{ width: 100, textAlign: 'center' }}></Radio.Button>
......
......@@ -9,6 +9,7 @@ import { EyeOutlined, QuestionCircleOutlined, SettingOutlined, PlusOutlined, Min
import { inject, observer } from 'mobx-react'
import { store } from '@/store'
import { IProductSelectAttribute } from '@/module/productModule'
const layout = {
labelCol: {
......@@ -83,20 +84,15 @@ const PriceAttributeForm: React.FC<Iprops> = (props) => {
console.log('重新构造')
},[productName, selectedGoods, productSelectAttribute, planPrice])
/* 构建表格列和data */
const constructedCallback = () => {
let _col = [];
let col_productName = { title: '商品名称', dataIndex: '商品名称', key: '商品名称' }
_col.push(col_productName)
let _priceAttribute = productSelectAttribute.filter(_item=>_item.isPrice)
let len = _priceAttribute.length
console.log(productName, _priceAttribute, len, productSelectAttribute, _tableDataSource, '---construct---')
/* 生成建表所需要的属性 属性值等数组数据 */
const generateNeedData = (hasAttribute: IProductSelectAttribute[]) => {
let _temp_attributeObjArr = [] // 取id备用
let _temp_attributeValObjArr = [] // 取id备用
let _attributeNameArr = []
let _attributeValueArr = []
if(len){ // 提取价格属性 属性名数组 属性值SKU数组
_priceAttribute.map(_item=>{
if(hasAttribute.length){ // 提取价格属性 属性名数组 属性值SKU数组 /*编辑情况下直接进入此页面length为空 此时需获取调用接口返回的数据生成*/
hasAttribute.map(_item=>{
_attributeNameArr.push(_item.attributeName) // 用于列header
_temp_attributeObjArr.push({attributeName: _item.attributeName, customerAttributeId: _item.customerAttributeId})
let _tempArr = []
......@@ -108,9 +104,83 @@ const PriceAttributeForm: React.FC<Iprops> = (props) => {
_attributeValueArr.push(_tempArr) // 价格属性的属性值数组 用于SKU组合
_temp_attributeValObjArr.push(_tempObjArr)
})
}else if(history.location.query?.id){ // 此时没有属性并且处于编辑状态 取接口返回的数据
_attributeNameArr = productInfoByEdit.unitPriceAndPicList[0].attributeAndValueList.map(_ => _.customerAttribute.name)
_attributeValueArr = [productInfoByEdit.unitPriceAndPicList.map(item => item.attributeAndValueList.map(_ => _.customerAttributeValue.value))]
_temp_attributeObjArr = productInfoByEdit.unitPriceAndPicList[0].attributeAndValueList.map(item => {
return {
attributeName: item.customerAttribute.name,
customerAttributeId: item.customerAttribute.id
}
})
let allAttributeList = productInfoByEdit.unitPriceAndPicList.map(item => item.attributeAndValueList).reduce(
function(a, b) {
return a.concat(b);
},
[]
);
let fixedAttributeList = allAttributeList.map(_ => {
return {
id: _.customerAttributeValue.id,
value: _.customerAttributeValue.value,
attributeId: _.customerAttribute.id
}
})
let uniqueAttributeList = Object.values(fixedAttributeList.reduce((item, next)=>{
item[next.id] = next
return item
},{}))
_temp_attributeValObjArr = Object.values(groupBy(uniqueAttributeList, 'attributeId'))
// console.log(_attributeNameArr, _attributeValueArr, _temp_attributeObjArr, _temp_attributeValObjArr, '直接进入tab的情况下所需数据')
}
console.log(_priceAttribute, _attributeNameArr, _attributeValueArr, _temp_attributeObjArr, _temp_attributeValObjArr, '---constructimg---') // ..............................
if(selectedGoods.length>0){
return {
_attributeNameArr,
_attributeValueArr,
_temp_attributeObjArr,
_temp_attributeValObjArr
}
}
/* 构建表格列和data */
const constructedCallback = () => {
let _col = [];
let col_productName = { title: '商品名称', dataIndex: '商品名称', key: '商品名称' }
_col.push(col_productName)
let _priceAttribute = productSelectAttribute.filter(_item=>_item.isPrice)
// 生成下文构建表格需要的数据
let needObject = generateNeedData(_priceAttribute)
let { _attributeNameArr, _attributeValueArr, _temp_attributeObjArr, _temp_attributeValObjArr } = needObject
// let len = _priceAttribute.length
// console.log(productName, _priceAttribute, len, productSelectAttribute, _tableDataSource, '---construct data---')
// let _temp_attributeObjArr = [] // 取id备用
// let _temp_attributeValObjArr = [] // 取id备用
// let _attributeNameArr = []
// let _attributeValueArr = []
// if(len){ // 提取价格属性 属性名数组 属性值SKU数组
// _priceAttribute.map(_item=>{
// _attributeNameArr.push(_item.attributeName) // 用于列header
// _temp_attributeObjArr.push({attributeName: _item.attributeName, customerAttributeId: _item.customerAttributeId})
// let _tempArr = []
// let _tempObjArr = [] // 取id备用
// _item.customerAttributeValueList.map(__item => {
// _tempArr.push(__item.value)
// _tempObjArr.push({id: __item.id, value: __item.value})
// })
// _attributeValueArr.push(_tempArr) // 价格属性的属性值数组 用于SKU组合
// _temp_attributeValObjArr.push(_tempObjArr)
// })
// }
console.log(_priceAttribute, _attributeNameArr, _attributeValueArr, _temp_attributeObjArr, _temp_attributeValObjArr, selectedGoods, '---constructimg---') // 编辑直接进入价格设置 都为空数组
if(selectedGoods.length>0){ // 编辑情况下 select货品列表可能会采用接口数据
_col.push({
title: '对应货品',
dataIndex: '对应货品',
......@@ -126,6 +196,30 @@ const PriceAttributeForm: React.FC<Iprops> = (props) => {
</Select>
</>
})
}else if(history.location.query?.id){ // 此时没有货品并且处于编辑状态 取接口返回的数据
let _goods: any[] = Object.values(productInfoByEdit.unitPriceAndPicList.map(_ => _.goods))
if(_goods.indexOf(null)===-1){
let goodsInApi : any = Object.values(_goods).reduce((item, next)=>{
item[next.id] = next
return item
},{})
_col.push({
title: '对应货品',
dataIndex: '对应货品',
key: '对应货品',
width: 360,
render: (text: any, record: any) => <>
<Select style={{width:'100%'}} defaultValue={text} onChange={(v)=> {tableSelelctChange(v, record) }}>
{
goodsInApi.length>0 && goodsInApi.map(_item => (
<Option key={_item.id} value={_item.id}>{_item.code}/{_item.name}/{_item.type}/¥{_item.costPrice}</Option>
))
}
</Select>
</>
})
}
}
if(_attributeNameArr.length>0){
......@@ -172,7 +266,7 @@ const PriceAttributeForm: React.FC<Iprops> = (props) => {
setAttributeObjArr(_temp_attributeObjArr)
setAttributeValObjArr(_temp_attributeValObjArr)
console.log(combineArray,'combine')
console.log(combineArray, 'combine')
let _tableData: any[] = []
if(combineArray?.length>0){ // length存在 表示表格的行数(有价格属性组合)
combineArray.map((_rowArr: any[], i: any) => { // _rowArr 属性值数组
......@@ -181,8 +275,6 @@ const PriceAttributeForm: React.FC<Iprops> = (props) => {
_tempObj[_attributeNameArr[index]] = __rowArr
}) : _tempObj[_attributeNameArr[i]||_attributeNameArr[0]] = _rowArr // 当一项变动的时候 找_attributeNameArr可能会找不到 找不到的情况下置为索引0的那项
// _tempObj['对应货品'] = selectedGoods.length > 0 ? selectedGoods[0].id : 0 // 编辑情况下 对应货品id和单价 特殊处理
// _tempObj['单价'] = {}
if(productInfoByEdit?.id){
// 编辑的时候,先指定数据中的货品id,如果是重新组合的不存在id就使用选择的货品中的第一个,如果没有置为0;同理,不存在单价就置为{}
_tempObj['对应货品'] = productInfoByEdit.unitPriceAndPicList[i]?.goods?.id || selectedGoods[0]?.id || 0
......@@ -201,7 +293,7 @@ const PriceAttributeForm: React.FC<Iprops> = (props) => {
_tableData.push(_tempObj)
}
console.log(_tableData, '_tableData') // 只有一项 变动情况下表格数据的key获取不到 //..............Bug:再进来这里依旧有数据..................
console.log(_tableData, '_tableData') // 只有一项 变动情况下表格数据的key获取不到
_tableDataSource = _tableData
setTableDataSource(productName ? _tableDataSource : []) // 通过商品名称来判断是否显示表格数据
......@@ -214,15 +306,16 @@ const PriceAttributeForm: React.FC<Iprops> = (props) => {
/* 生成传输数据 */
const constructedPrarams = () => {
let _paramsArray: any[] = [];
let _paramsArray: any[] = [];
console.log('生成传输数据', combineAttributeArray, attributeObjArr, attributeValObjArr, tableDataSource)
Array.isArray(combineAttributeArray) ? combineAttributeArray.map((item, index)=>{ // 非数组情况下默认无组合 从table数据中获取 // 当属性减少的时候 这个combine数组还是之前的
let _tempArr: any = []
Array.isArray(item) ? item.map((_item, _index)=>{
Array.isArray(item) ? item.map((_item, _index) => {
let _tempObject: any = {};
_tempObject.customerAttributeId = attributeObjArr[_index].customerAttributeId
_tempObject.customerAttributeName = attributeObjArr[_index].attributeName
_tempObject.id = attributeValObjArr[_index].find(__item=>__item.value===item[_index]).id
// _tempObject.id = attributeValObjArr[_index].find(__item=>__item.value===item[_index]).id /** 解决原有 若属性或者属性值顺序错乱无法找到正确值的问题 */
_tempObject.id = attributeValObjArr.map(item =>item.find(_ => _.value===_item)).filter(__ => __)[0].id
_tempObject.value = item[_index]
_tempArr.push(_tempObject)
}) : _tempArr.push({
......@@ -401,6 +494,23 @@ const PriceAttributeForm: React.FC<Iprops> = (props) => {
setSetPriceModal(true)
}
/**
* 按属性归类
* @param objectArray
* @param {string} property
*/
const groupBy = (objectArray, property) => {
return objectArray.reduce(function (acc, obj) {
let key = obj[property];
if (!acc[key]) {
acc[key] = []
}
acc[key].push(obj)
return acc
}, {})
}
return (<>
<Form
{...layout}
......@@ -409,7 +519,7 @@ const PriceAttributeForm: React.FC<Iprops> = (props) => {
labelAlign="left"
ref={priceFormRef}
colon={false}
initialValues={productInfoByEdit?.id ? getPriceAttributeFormParamsByEdit : {isMemberPrice: false}}
initialValues={productInfoByEdit?.id ? getPriceAttributeFormParamsByEdit : {isMemberPrice: false, priceType: planPrice}}
autoComplete="off"
>
<Form.Item
......@@ -485,7 +595,7 @@ const PriceAttributeForm: React.FC<Iprops> = (props) => {
required: true,
message: '请选择产品定价类型'
}]}
initialValue={planPrice}
// initialValue={planPrice}
>
<Radio.Group onChange={handlePlanPriceChange}>
<Radio value={1}>现货价格</Radio>
......
......@@ -50,10 +50,8 @@ const ProductImageForm: React.FC<Iprops> = (props) => {
/* 给数据添加图片字段 */
useEffect(()=>{
// console.log('图片111', priceAttributeParams)
let _priceAttributeParams: any = []
if(productInfoByEdit?.id){ // id判断是否新增还是编辑
// console.log('图片222', priceAttributeParams)
setSetImageType(productInfoByEdit.isAllAttributePic)
setIsAllAttributePic(productInfoByEdit.isAllAttributePic)
let _commodityPicList = productInfoByEdit.unitPriceAndPicList.map(_ => _.commodityPic)
......@@ -87,7 +85,7 @@ const ProductImageForm: React.FC<Iprops> = (props) => {
// }
setPriceAttributeParamsByRender(_priceAttributeParams)
setProductAttributeAndImageParams(_priceAttributeParams)
console.log(_priceAttributeParams, priceAttributeParams, '_p') // 这里可能为空数组
console.log(_priceAttributeParams, priceAttributeParams, '_p') // 这里可能为空数组 ** 如果不到此页面 前一个是旧数据 后面的为新数据
// 初始化若是按所有属性共用做显示处理
if(setImageType && _priceAttributeParams.length>0){
setCommonImageList(_priceAttributeParams[0].commodityPic)
......
......@@ -41,6 +41,7 @@ const SelectGoodsForm: React.FC<Iprops> = (props) => {
item[next.id] = next;
return item
},{}))
console.log(goodsArr, 'goods')
if(goodsArr.length>0){
setIsChecked(true)
setIsSelectGoods(true)
......
......@@ -84,13 +84,11 @@ const Products: React.FC<{}> = () => {
{
title: 'ID',
dataIndex: 'id',
align: 'center',
key: 'id',
},
{
title: '商品名称',
dataIndex: 'name',
align: 'center',
key: 'name',
className: 'commonPickColor',
render: (text: any, record: any) => <span className="commonPickColor" onClick={() => handleSee(record)}>{text}&nbsp;<EyeOutlined /></span>
......@@ -98,19 +96,16 @@ const Products: React.FC<{}> = () => {
{
title: '品类',
dataIndex: ['customerCategory', 'name'],
align: 'center',
key: 'customerCategory.name',
},
{
title: '品牌',
dataIndex: ['brand', 'name'],
align: 'center',
key: 'brand.name',
},
{
title: '单位',
dataIndex: 'unitName',
align: 'center',
key: 'unitName',
},
{
......@@ -156,7 +151,6 @@ const Products: React.FC<{}> = () => {
{
title: '审核状态',
dataIndex: 'status',
align: 'center',
key: 'status',
render: (text: any, record: any) => {
let component: ReactNode = null
......@@ -205,40 +199,7 @@ const Products: React.FC<{}> = () => {
{
title: '操作',
dataIndex: 'option',
align: 'center',
render: (text: any, record: any) => renderOptionButton(record)
// {
// return (
// <>
// <Popconfirm
// title="确定要执行这个操作?"
// onConfirm={() => handleBatchDelete([record.id])}
// onCancel={cancel}
// okText="是"
// cancelText="否"
// >
// <Button type='link'>删除</Button>
// </Popconfirm>
// <Dropdown overlay={
// <Menu>
// <Menu.Item>
// {record.status === 1 ? <Button type='link' onClick={()=>clickSubmitCheck(record)}>提交审核</Button> : ''}
// </Menu.Item>
// {(record.status === 4 || record.status === 6) ? <Menu.Item><Button type='link' onClick={() => clickUp(1, record.id)}>上架</Button></Menu.Item> : ''}
// {record.status === 5 ? <Menu.Item><Button type='link' onClick={() => clickUp(0, record.id)}>下架</Button></Menu.Item> : ''}
// {record.status === 3 || record.status === 1 ? <Menu.Item><Button type='link' onClick={() => clickModify(record.id)}>修改</Button></Menu.Item> : ''}
// <Menu.Item>
// <Button type='link' onClick={()=>clickCopy(record)}>复制</Button>
// </Menu.Item>
// </Menu>
// }>
// <a className="ant-dropdown-link" onClick={e => e.preventDefault()}>
// 更多 <CaretDownOutlined />
// </a>
// </Dropdown>
// </>
// )
// }
}
];
......
......@@ -360,7 +360,7 @@ const viewProducts: React.FC<{}> = () => {
<Col span={20}>
<p>
{
productDetail?.commodityAreaList.map(_item => <p>{_item.provinceName+'/'+(_item.cityName||'')}</p>)
productDetail?.commodityAreaList.length>0 ? productDetail?.commodityAreaList.map(_item => <p>{_item.provinceName+'/'+(_item.cityName||'')}</p>) : '全国'
}
</p>
</Col>
......
import React, {useState, useRef, useEffect} from 'react'
import { history } from 'umi'
import { history, Prompt } from 'umi'
import moment from 'moment'
import { Button, Card, Row, Tabs, Tag } from 'antd'
import { PageHeaderWrapper } from '@ant-design/pro-layout'
......@@ -12,7 +12,7 @@ import './index.less'
import NiceForm from '@/components/NiceForm'
import { repositInSchema, repositOutSchema, repositTabOneSchema } from './schema'
import { createFormActions, FormEffectHooks, FormProvider, FormSpy, createAsyncFormActions } from '@formily/antd'
import { getStepNumber } from '@/utils'
import { getStepNumber, padRequiredMessage } from '@/utils'
import { PublicApi } from '@/services/api'
import { usePageStatus } from '@/hooks/usePageStatus'
import { useInitValue } from '@/formSchema/effects/useInitValue'
......@@ -20,6 +20,7 @@ import { useLinkageUtils } from '@/utils/formEffectUtils'
import { useUnitPreview } from './effects'
import PositionSetting from './components/PositionSetting'
import { useHttpRequest } from '@/hooks/useHttpRequest'
import { useLeavePageWarn } from '@/hooks/useLeavePageWarn'
const addSchemaAction = createFormActions()
const repositInAction = createAsyncFormActions()
......@@ -31,6 +32,7 @@ const AddRepository:React.FC<{}> = (props) => {
} = usePageStatus()
// 获取到的所有仓库, 用于选中后获得仓库库存
const [reposits, setReposits] = useState<any>([])
const [isEdit, setIsEdit] = useState(false)
const { data: foldValue, loading: foldLoading, run: foldFn } = useHttpRequest(PublicApi.postWarehouseFreightSpaceAllotFold)
const { data: exportValue, loading: exportLoading, run: exportFn } = useHttpRequest(PublicApi.postWarehouseFreightSpaceAllotExport)
......@@ -98,6 +100,7 @@ const AddRepository:React.FC<{}> = (props) => {
repositInAction.setFieldValue('NO_SUBMIT2', bringUpTheInventory)
repositInAction.setFieldValue('NO_SUBMIT1', callInInventory)
repositInAction.setFieldValue('foldInventory', '')
tableRecordRef.current.reload && tableRecordRef.current.reload()
}
......@@ -115,6 +118,7 @@ const AddRepository:React.FC<{}> = (props) => {
repositOutAction.setFieldValue('NO_SUBMIT1', bringUpTheInventory)
repositOutAction.setFieldValue('NO_SUBMIT2', callInInventory)
repositOutAction.setFieldValue('foldInventory', 0)
tableRecordRef.current.reload && tableRecordRef.current.reload()
}
......@@ -140,16 +144,22 @@ const AddRepository:React.FC<{}> = (props) => {
inventory: values.inventory,
inventoryDeductWay: values.inventoryDeductWay,
shopIds: values.shopIds,
isAllMemberShare: values.isAllMemberShare
isAllMemberShare: values.isAllMemberShare,
shopType: values.shopType
}
if (values['applyMember']) {
params['applyMember'] = values['applyMember'].map(v => v.memberId)
}
setIsEdit(false)
await PublicApi.postWarehouseFreightSpaceUpdata(params)
setTimeout(() => {
history.goBack(-1)
}, 1000)
}
const onPublicFieldChange = () => {
setIsEdit(true)
}
return (
<PageHeaderWrapper
onBack={() => history.goBack()}
......@@ -167,7 +177,7 @@ const AddRepository:React.FC<{}> = (props) => {
<Tabs type='card' defaultActiveKey='tab1' onChange={topTableChange}>
<Tabs.TabPane key='tab1' tab='仓位设置'>
<PositionSetting addSchemaAction={addSchemaAction} schema={repositTabOneSchema} formSubmit={formSubmit}/>
<PositionSetting onFieldChange={onPublicFieldChange} addSchemaAction={addSchemaAction} schema={repositTabOneSchema} formSubmit={formSubmit}/>
</Tabs.TabPane>
<Tabs.TabPane key='tab2' tab='库存调入\调拨'>
<Tabs defaultActiveKey='tab2-1' tabPosition='left'>
......@@ -182,6 +192,9 @@ const AddRepository:React.FC<{}> = (props) => {
onSubmit={handleRespotIn}
effects={async ($, {setFieldState}) => {
const utils = useLinkageUtils()
// FormEffectHooks.onFormInputChange$().subscribe(() => {
// setIsEdit(true)
// })
FormEffectHooks.onFormMount$().subscribe(() => {
const name = spyForm.getFieldValue('name')
const asyncEnums = reposits.map(v => ({
......@@ -190,8 +203,12 @@ const AddRepository:React.FC<{}> = (props) => {
}))
utils.enum('freightSpaceId', asyncEnums)
$('onFieldInputChange', 'freightSpaceId').subscribe(state => {
const numberValue = reposits.find(v => v.id === state.value).inventory || 0
const repositValue = reposits.find(v => v.id === state.value)
const numberValue = repositValue.inventory || 0
utils.value('NO_SUBMIT1', numberValue)
setFieldState('NO_SUBMIT1', state => {
state.props.title = `当前仓位库存(${repositValue.unit})`
})
setFieldState('foldInventory', state => {
state.props["x-component-props"].max = numberValue
state.props["x-component-props"].marks = getStepNumber(numberValue)
......@@ -202,6 +219,10 @@ const AddRepository:React.FC<{}> = (props) => {
{label: name, value: id}
])
utils.value('foldFreightSpaceId', id)
setFieldState('NO_SUBMIT2', state => {
state.props.title = `当前仓位库存(${initValue.unit})`
})
utils.value('NO_SUBMIT2', spyForm.getFieldValue('inventory'))
})
}}
......@@ -225,6 +246,9 @@ const AddRepository:React.FC<{}> = (props) => {
onSubmit={handleRespotOut}
effects={async ($, {setFieldState}) => {
const utils = useLinkageUtils()
// FormEffectHooks.onFormInputChange$().subscribe(() => {
// setIsEdit(true)
// })
FormEffectHooks.onFormMount$().subscribe(() => {
const name = spyForm.getFieldValue('name')
const inventoryNumber = spyForm.getFieldValue('inventory')
......@@ -271,7 +295,7 @@ const AddRepository:React.FC<{}> = (props) => {
</Tabs>
</FormProvider>
</Card>
<Prompt when={isEdit as boolean} message="有未提交的数据, 你确定要离开么?" />
</PageHeaderWrapper>
)
}
......
......@@ -3,7 +3,7 @@ import { usePageStatus, PageStatus } from '@/hooks/usePageStatus'
import { useInitValue } from '@/formSchema/effects/useInitValue'
import EyePreview from '@/components/EyePreview'
import { findItemAndDelete } from '@/utils'
import { ISchemaFormActions, ISchema } from '@formily/antd'
import { ISchemaFormActions, ISchema, FormEffectHooks } from '@formily/antd'
import { useRowSelectionTable } from '@/hooks/useRowSelectionTable'
import { createAddRepositoryEffect, useUnitPreview } from '../effects'
import { PublicApi } from '@/services/api'
......@@ -24,6 +24,7 @@ import Submit from '@/components/NiceForm/components/Submit'
export interface PositionSettingProps {
addSchemaAction: ISchemaFormActions,
schema: ISchema,
onFieldChange?(),
formSubmit?(values)
}
......@@ -35,7 +36,7 @@ const fetchMemberList = async (params) => {
const PositionSetting:React.FC<PositionSettingProps> = (props) => {
const { addSchemaAction, schema, formSubmit } = props
const { addSchemaAction, schema, formSubmit, onFieldChange = () => {} } = props
const [visibleChannelMember, setVisibleChannelMember] = useState(false)
const [visibleChannelRroduct, setVisibleChannelRroduct] = useState(false)
......@@ -296,12 +297,18 @@ const PositionSetting:React.FC<PositionSettingProps> = (props) => {
connectProduct
}}
effects={($, { setFieldState }) => {
FormEffectHooks.onFormInputChange$().subscribe(() => {
onFieldChange()
})
createAddRepositoryEffect(addSchemaAction)
$('onFieldValueChange', 'shopType').subscribe(parentState => {
if (parentState.value) {
console.log('review')
setFieldState('shopIds', state => {
state.props["x-component-props"].dataSource = GlobalConfig.web.shopInfo.filter(v => v.type === parentState.value)
state.props["x-component-props"].dataSource = pageStatus === PageStatus.PREVIEW ?
GlobalConfig.web.shopInfo.filter(v => v.type === parentState.value && state.value.includes(v.id))
:
GlobalConfig.web.shopInfo.filter(v => v.type === parentState.value)
})
}
})
......
......@@ -4,6 +4,7 @@ import { FORM_FILTER_PATH } from '@/formSchema/const';
import { GlobalConfig } from '@/global/config';
import { PublicApi } from '@/services/api';
import { SHOP_TYPES } from '@/constants';
import { padRequiredMessage } from '@/utils';
// 将获取的商城转化为可用类型
const getShopTypeMap = (() => {
......@@ -19,7 +20,7 @@ const getShopTypeMap = (() => {
}, [])
})()
export const repositSchema: ISchema = {
export const repositSchema: ISchema = padRequiredMessage({
type: 'object',
properties: {
megaLayout: {
......@@ -89,7 +90,7 @@ export const repositSchema: ISchema = {
type: 'string',
"x-component": 'SearchSelect',
"x-component-props": {
fetchSearch: PublicApi.getProductSelectGetSelectCategory,
fetchSearch: PublicApi.getProductSelectGetSelectCustomerCategory,
placeholder: '请选择品类',
style: {
width: 160,
......@@ -125,9 +126,9 @@ export const repositSchema: ISchema = {
}
}
}
}
})
export const repositMoreSchema: ISchema = {
export const repositMoreSchema: ISchema = padRequiredMessage({
type: 'object',
properties: {
REPOSIT_TABS: {
......@@ -336,10 +337,10 @@ export const repositMoreSchema: ISchema = {
}
}
}
}
})
// 新增仓位
export const repositDetailSchema: ISchema = {
export const repositDetailSchema: ISchema = padRequiredMessage({
type: 'object',
properties: {
REPOSIT_TABS: {
......@@ -371,7 +372,13 @@ export const repositDetailSchema: ISchema = {
title: '仓位名称',
"x-component-props": {
placeholder: '建议名称:商品名称+商城名称+渠道描述'
}
},
"x-rules": [
{
limitByte: true,
maxByte: 60
}
]
},
shopType: {
type: 'string',
......@@ -527,10 +534,10 @@ export const repositDetailSchema: ISchema = {
}
}
}
}
})
// 仓位设置
export const repositTabOneSchema: ISchema = {
export const repositTabOneSchema: ISchema = padRequiredMessage({
type: 'object',
properties: {
REPOSIT_TABS: {
......@@ -563,7 +570,13 @@ export const repositTabOneSchema: ISchema = {
editable: false,
"x-component-props": {
placeholder: '建议名称:商品名称+商城名称+渠道描述'
}
},
"x-rules": [
{
limitByte: true,
maxByte: 60
}
]
},
shopType: {
type: 'string',
......@@ -720,10 +733,10 @@ export const repositTabOneSchema: ISchema = {
}
}
}
}
})
// 库存调入
export const repositInSchema: ISchema = {
export const repositInSchema: ISchema = padRequiredMessage({
type: 'object',
properties: {
repos_layout: {
......@@ -761,14 +774,14 @@ export const repositInSchema: ISchema = {
'NO_SUBMIT1': {
type: 'object',
readOnly: true,
title: '当前仓位库存(尺)',
"x-component": 'CircleBox',
title: '当前仓位库存',
default: 0
},
'NO_SUBMIT2': {
type: 'object',
title: '当前仓位库存(尺)',
"x-component": 'CircleBox',
title: '当前仓位库存',
default: 0
},
"foldInventory": {
......@@ -801,10 +814,10 @@ export const repositInSchema: ISchema = {
}
}
}
}
})
// 库存调出
export const repositOutSchema: ISchema = {
export const repositOutSchema: ISchema = padRequiredMessage({
type: 'object',
properties: {
repos_layout: {
......@@ -842,14 +855,14 @@ export const repositOutSchema: ISchema = {
'NO_SUBMIT1': {
type: 'object',
readOnly: true,
title: '当前仓位库存(尺)',
"x-component": 'CircleBox',
title: '当前仓位库存',
default: 0
},
'NO_SUBMIT2': {
type: 'object',
title: '当前仓位库存(尺)',
"x-component": 'CircleBox',
title: '当前仓位库存',
default: 0
},
"foldInventory": {
......@@ -882,4 +895,4 @@ export const repositOutSchema: ISchema = {
}
}
}
}
})
export enum OrderModalType {
/**
* 进货单下单
*/
PURCHASE_ORDER = 5,
/**
* 手工下单
*/
HAND_ORDER,
/**
* 询价报价下单
*/
INQUIRY_QUOTATION_ORDER,
/**
* 需求报价下单
*/
DEMAND_QUOTATION_ORDER,
/**
* 合并订单下单
*/
CONSOLIDATED_ORDER,
/**
* 渠道直采进货单下单
*/
CHANNEL_DIRECT_PURCHASE_ORDER,
/**
* 渠道直采手工下单
*/
CHANNEL_DIRECT_MINING_ORDER,
/**
* 渠道现货进货单下单
*/
CHANNEL_SPOT_PURCHASE_ORDER,
/**
* 渠道现货手工下单
*/
CHANNEL_SPOT_MANUAL_ORDER,
}
export const orderTypeLabel = ['',
'询价采购',
'需求采购',
'现货采购',
'集采',
'积分兑换',
'渠道直采',
'渠道现货',
'渠道积分兑换'
]
\ No newline at end of file
import React from 'react'
import { history } from 'umi'
import { PageHeaderWrapper } from '@ant-design/pro-layout'
import ReutrnEle from '@/components/ReturnEle'
import { usePageStatus, PageStatus } from '@/hooks/usePageStatus'
import { Button, Card } from 'antd'
import { createFormActions } from '@formily/antd'
import { SaveOutlined, LinkOutlined } from '@ant-design/icons'
import NiceForm from '@/components/NiceForm'
import { orderDetailSchema } from './schema'
import { useDetailOrder } from './model/useDetailOrder'
import ModalTable from '@/components/ModalTable'
import { useModelTypeChange } from './effects'
import { OrderModalType, orderTypeLabel } from './constant'
export interface PurchaseOrderDetailProps {}
const addSchemaAction = createFormActions()
// 采购订单详情页. 包含新增和编辑
const PurchaseOrderDetail:React.FC<PurchaseOrderDetailProps> = (props) => {
const { orderModel } = history.location.query
const { productColumns, setShowProBtn, showProBtn } = useDetailOrder({
orderModel
})
// 页面进入时, 当前所处的下单模式
const { pageStatus } = usePageStatus()
const handleOrderNo = () => {}
const handleOrderMember = () => {}
const orderNoPrice = pageStatus !== PageStatus.PREVIEW && <div className='connectBtn' onClick={handleOrderNo}><LinkOutlined style={{marginRight: 4}}/>选择</div>
const orderMember = pageStatus !== PageStatus.PREVIEW && <div className='connectBtn' onClick={handleOrderMember}><LinkOutlined style={{marginRight: 4}}/>选择</div>
const productAddButton = showProBtn && <Button block type='default' style={{margin: '24px auto'}}>选择订单商品</Button>
return (
<PageHeaderWrapper
onBack={() => history.goBack()}
backIcon={<ReutrnEle description="返回"/>}
className='addRepository'
title={pageStatus === PageStatus.PREVIEW ? '查看订单' : '新建订单'}
extra={[
<Button key="1" onClick={() => addSchemaAction.submit()} type="primary" icon={<SaveOutlined />}>
保存
</Button>,
]}
>
<Card className=''>
<NiceForm
actions={addSchemaAction}
schema={orderDetailSchema}
className='useConnectBtnWrapper'
effects={($, ctx) => {
useModelTypeChange(state => {
const { value } = state
// 报价单的值 等同于是否填写过报价单
const quotationOrderValue = ctx.getFieldValue('quotationNo')
// 当选择了手工下单、渠道直采手工下单、渠道现货手工下单、或者选择了合并订单下单并未选择报价单则需要显示商品列表添加接口
if (
value === OrderModalType.HAND_ORDER ||
value === OrderModalType.CHANNEL_DIRECT_MINING_ORDER ||
value === OrderModalType.CHANNEL_SPOT_MANUAL_ORDER ||
(value === OrderModalType.CONSOLIDATED_ORDER && quotationOrderValue)
) {
setShowProBtn(true)
} else {
setShowProBtn(false)
}
// 选择某种类型时, 需显示对应的订单类型
ctx.setFieldValue('type', orderTypeLabel[value - 4]) // -4 获得对应的数组下标, 由于id是固定的
})
}}
expressionScope={{
orderNoPrice,
orderMember,
productColumns,
productAddButton
}}
/>
</Card>
<ModalTable
modalTitle='选择订单商品'
columns={productColumns}
/>
</PageHeaderWrapper>
)
}
PurchaseOrderDetail.defaultProps = {}
export default PurchaseOrderDetail
\ No newline at end of file
import { ISchemaFormActions, FormEffectHooks } from '@formily/antd';
export const useModelTypeChange = (callback) => {
// 下单模式发生改变时
FormEffectHooks.onFieldValueChange$('orderModel').subscribe(state => {
callback(state)
})
}
\ No newline at end of file
import React from 'react'
import { history } from 'umi'
import { Card, Button, Space, Dropdown, Menu } from 'antd'
import { StandardTable } from 'god'
import { PageHeaderWrapper } from '@ant-design/pro-layout'
......@@ -67,7 +68,7 @@ const ReadyAddOrder:React.FC<ReadyAddOrderProps> = (props) => {
}}
formilyChilds={{
children: <Space>
<Button icon={<PlusCircleOutlined/>} type='primary'>新建</Button>
<Button icon={<PlusCircleOutlined/>} type='primary' onClick={() => history.push('/memberCenter/tranactionAbility/purchaseOrder/readyAddOrder/orderDetail')}>新建</Button>
<Button>批量提交审核</Button>
<DropDeleteDown>
<Menu onClick={(e) => handleMenuClick(e)}>
......
import React, { useState } from 'react'
import { OrderModalType } from '../constant'
export const useDetailOrder = (options) => {
// const [productDataSource, setProductDataSource] = useState
const [showProBtn, setShowProBtn] = useState(options.orderModel)
const [showMemberType, setShowMemberType] = useState(false)
const productColumns: any[] = [
{
title: '商品ID',
dataIndex: 'id',
align: 'center',
key: 'id',
},
{
title: '商品名称',
dataIndex: 'name',
align: 'center',
key: 'name',
},
{
title: '品类',
dataIndex: 'customerCategoryName',
align: 'center',
key: 'customerCategoryName',
},
{
title: '品牌',
dataIndex: 'brandName',
align: 'center',
key: 'brandName',
},
]
return {
productColumns,
showProBtn,
setShowProBtn,
showMemberType,
setShowMemberType
}
}
\ No newline at end of file
import { ISchema } from '@formily/antd';
import { FORM_FILTER_PATH } from '@/formSchema/const';
import { GlobalConfig } from '@/global/config';
export const tableListSchema: ISchema = {
type: 'object',
......@@ -8,7 +9,7 @@ export const tableListSchema: ISchema = {
type: 'string',
"x-component": 'SearchFilter',
'x-component-props': {
placeholder: '搜索',
placeholder: '请输入订单编号',
align: 'flex-end',
},
},
......@@ -28,6 +29,12 @@ export const tableListSchema: ISchema = {
placeholder: '请输入订单摘要',
}
},
"supplyMembersName": {
type: 'string',
"x-component-props": {
placeholder: '请输入供应会员名称'
}
},
"[startCreateTime,endCreateTime]": {
type: 'array',
"x-component": 'daterangepicker',
......@@ -44,4 +51,164 @@ export const tableListSchema: ISchema = {
},
},
}
}
/**
* 订单详情(新增订单, 编辑订单)
*/
// 基本信息
const basicInfo: ISchema = {
type: 'object',
"x-component": 'tabpane',
"x-component-props": {
tab: '基本信息'
},
properties: {
NO_SUBMIT_LAYOUT: {
type: 'object',
"x-component": 'mega-layout',
"x-component-props": {
labelCol: 4,
labelAlign: 'left',
wrapperCol: 10
},
properties: {
orderModel: {
type: 'string',
enum: GlobalConfig.web.orderMode.map(v => { delete v.platformType ;return v}),
title: '下单模式'
},
orderThe: {
type: 'string',
title: '订单摘要',
"x-rules": [
{
limitByte: true,
maxByte: 60
}
]
},
quotationNo: {
type: 'string',
title: '对应报价单号',
"x-component-props": {
disabled: true,
addonAfter: "{{orderNoPrice}}"
},
},
supplyMembersName: {
type: 'string',
title: '供应会员',
"x-component-props": {
disabled: true,
addonAfter: "{{orderMember}}"
},
},
orderNo: {
type: 'string',
title: '订单编号',
"x-component": 'text'
},
type: {
type: 'string',
title: '订单类型',
"x-component": 'text'
},
createTime: {
type: 'string',
title: '下单时间'
},
interiorState: {
type: 'string',
title: '内部状态'
},
externalState: {
type: 'string',
title: '外部状态'
},
}
},
}
}
// 订单商品
const orderProduct: ISchema = {
type: 'object',
"x-component": 'tabpane',
"x-component-props": {
tab: '订单商品'
},
properties: {
orderProductRequests: {
type: 'array',
"x-component": 'MultTable',
"x-component-props": {
rowKey: 'id',
columns: "{{productColumns}}",
prefix: "{{productAddButton}}"
}
}
}
}
// 支付信息
const payInfo = {
type: 'object',
"x-component": 'tabpane',
"x-component-props": {
tab: '支付信息'
},
properties: {
}
}
// 交付信息
const submitInfo = {
type: 'object',
"x-component": 'tabpane',
"x-component-props": {
tab: '交付信息'
},
properties: {
}
}
// 其他信息
const ortherInfo = {
type: 'object',
"x-component": 'tabpane',
"x-component-props": {
tab: '其他信息'
},
properties: {
}
}
// 流转记录
const transformRecord = {
type: 'object',
"x-component": 'tabpane',
"x-component-props": {
tab: '流转记录'
},
properties: {
}
}
// 新增订单详情
export const orderDetailSchema: ISchema = {
type: 'object',
properties: {
NO_SUBMIT_TABS: {
type: 'object',
"x-component": 'tab',
properties: {
NO_SUBMIT_TABPANE1: basicInfo,
NO_SUBMIT_TABPANE2: orderProduct,
NO_SUBMIT_TABPANE3: payInfo,
NO_SUBMIT_TABPANE4: submitInfo,
NO_SUBMIT_TABPANE5: ortherInfo,
NO_SUBMIT_TABPANE6: transformRecord,
}
}
}
}
\ No newline at end of file
......@@ -203,6 +203,12 @@ export const dupliArr = (arr: any[]) => {
// 获取最小的差距值
export const getDistanceNumber = (target, step, min) => {
// 当递归到只能被1整除时, 直接返回target
if (step === 1) {
return {
[target]: target
}
}
const value = target / step
if (value >= min) {
let num = 0
......@@ -214,17 +220,17 @@ export const getDistanceNumber = (target, step, min) => {
result[target] = target
return result
} else {
return getDistanceNumber(target, step--, min)
return getDistanceNumber(target, --step, min)
}
}
// 将数字拆分成指定区间
export const getStepNumber = (target: number, step?: number) => {
if (target === 0) {
return null
return {}
}
// 最小相差10
const minDistance = 10
const minDistance = 4
step = step || 4
......@@ -392,6 +398,30 @@ export const getQueryStringParams = (url?: string) => {
return queryString.parse(searchParam)
}
// 填充必填的schema message提示
export const padRequiredMessage = (originSchema: ISchema) => {
const messageSwich = (type) => {
return type ? '请选择' : '请输入'
}
const todoFn = (targetSchema) => {
}
Object.entries(originSchema.properties).map(([key, value]) => {
if (value.required) {
const isSelect = value.enum
const message = messageSwich(isSelect) + (value.title || '')
value['x-rules'] = Array.isArray(value['x-rules']) ? value['x-rules'].concat([{ message, required: true }]) : [{message, required: true}]
}
if (value.properties) {
padRequiredMessage(value)
}
return value
})
return originSchema
}
export default {
isArray,
isObject,
......
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