Commit 36c37873 authored by Bill's avatar Bill

fix: 修改生产通知单

parent 3b303fb8
registry = "http://10.0.0.21:8081/repository/node-group/"
# registry = "https://registry.npmjs.org/"
\ No newline at end of file
# registry = "http://10.0.0.21:8081/repository/node-group/"
registry = "http://10.0.0.19:7001/repository/node-group/"
# registry = "https://registry.npmjs.org/"
......@@ -54,6 +54,14 @@ const HandlingRoute = {
component: '@/pages/handling/assign/detail',
hideInMenu: true
},
// 修改
{
path: '/memberCenter/handling/assign/tobeAddQuery/edit',
name: 'assignProductionEdit',
icon: 'smile',
component: '@/pages/handling/assign/add',
hideInMenu: true
},
// 指派生产通知单 -> 待审核通知单(一级)
{
path: '/memberCenter/handling/assign/pendingFirst',
......
......@@ -491,6 +491,7 @@ export default {
'menu.handling.confirm.createProcessInvoice': '新建加工发货单',
'menu.handling.confirm.createLogisticsOrder': '新建物流单',
'menu.handling.confirm.pendingReceiptDetail': '待确认回单生产通知单详情',
'menu.handling.assign.assignProductionEdit': '修改生产通知单',
// 售后能力
'menu.afterService': '售后',
'menu.afterService.exchangeApplication': '换货申请',
......
......@@ -30,26 +30,26 @@ const { getSettleAccountsPlatformConfigGetMemberSettlementStrategyDetail } = Pub
const common_columns: any = [
{ title: 'ID', dataIndex: 'memberId' },
{
title: '会员名称',
dataIndex: 'name',
{
title: '会员名称',
dataIndex: 'name',
render: (text: string, record: any) => {
return record.name || record.memberName
}
},
{ title: '会员类型', dataIndex: 'memberTypeName' },
{ title: '会员角色', dataIndex: 'roleName' },
{
title: '会员等级',
dataIndex: 'levelTag',
{
title: '会员等级',
dataIndex: 'levelTag',
render: (text: string, record: any) => {
return record.levelTag || record.levelName
}
}
},
]
const MemberSettleAdd: React.FC = () => {
const [visible, setVisible] = useState(false)
const [memberRowSelection, memberRowCtl] = useRowSelectionTable({ customKey: 'memberId' });
const [memberRowSelection, memberRowCtl] = useRowSelectionTable({ customKey: 'id' });
const [initialValue, setInitialValue] = useState({});
const { id, preview } = usePageStatus();
const [submitLoading, setSubmitLoading ] = useState(false);
......@@ -58,28 +58,28 @@ const MemberSettleAdd: React.FC = () => {
const tableAddButton = () => {
return (
<div>
<Button
onClick={() => setVisible(true)}
style={{marginBottom: 16}}
block
icon={<PlusOutlined/>}
<Button
onClick={() => setVisible(true)}
style={{marginBottom: 16}}
block
icon={<PlusOutlined/>}
type='dashed'
>
选择适用会员
</Button>
</Button>
</div>
)
}
const columns = common_columns.concat(
[
{
title: '操作',
{
title: '操作',
render: (text, record) => {
return (
<div onClick={() => handleRemove(record.memberId)}>删除</div>
)
}
}
}
]
);
......@@ -133,8 +133,8 @@ const MemberSettleAdd: React.FC = () => {
const serviceActions = isAdd
? PublicApi.postSettleAccountsPlatformConfigAddMemberSettlementStrategy
: PublicApi.postSettleAccountsPlatformConfigUpdateMemberSettlementStrategy
const postData = {...tempData, id: id || 0 }
const postData = {...tempData, id: id || 0 }
setSubmitLoading(true);
setUnsaved(false);
......@@ -196,7 +196,7 @@ const MemberSettleAdd: React.FC = () => {
message.error({content: res.message})
}
}
getInfo();
}
......@@ -222,13 +222,13 @@ const MemberSettleAdd: React.FC = () => {
onSubmit={values => handleSubmit(values)}
schema={addSchema}
effects={() => {
useAsyncSelect(
"settlementOrderType",
useAsyncSelect(
"settlementOrderType",
fetchOptions(PublicApi.getSettleAccountsCommonGetStrategySettlementOrderType)
)
}}
/>
<ModalTable
modalTitle='选择适用会员'
confirm={handleOkAddMember}
......@@ -238,11 +238,11 @@ const MemberSettleAdd: React.FC = () => {
rowSelection={memberRowSelection}
fetchTableData={params => fetchMemberData(params)}
tableProps={{
rowKey: 'memberId',
rowKey: 'id',
}}
formilyProps={
{
ctx: {
ctx: {
schema: memberSchema,
actions: formActions,
components: { ModalSearch: Search, SearchSelect, Submit } ,
......@@ -269,4 +269,4 @@ const MemberSettleAdd: React.FC = () => {
)
}
export default MemberSettleAdd
\ No newline at end of file
export default MemberSettleAdd
This diff is collapsed.
......@@ -77,20 +77,23 @@ const basicTab = {
display: false,
},
source: {
type: 'radio',
type: 'object',
title: '通知单来源',
required: true,
enum: [
{
label: '订单加工',
value: 1
},
{
label: '商品加工',
value: 2
}
],
default: 1
"x-component": 'Radio',
"x-component-props": {
options: [
{
label: '订单加工',
value: 1
},
{
label: '商品加工',
value: 2
}
],
default: 1
}
},
deliveryDate: {
......
......@@ -282,6 +282,22 @@ const Detail: React.FC<{}> = () => {
}
}
/**
* 手工发货
*/
const handleManualDeliver = (value) => {
const postData = {
produceNoticeOrderId: id,
manualDeliverBO: value,
}
PublicApi.postEnhanceProcessToBeDeliveryManualDeliver(postData)
.then(({data, code}) => {
if(code === 1000) {
getInfo()
}
})
}
return (
<PageHeaderWrapper
title={
......@@ -331,9 +347,9 @@ const Detail: React.FC<{}> = () => {
}
{
// 这里手工发货需要某个字段值去判断
pathname === (PENDING_DELIVERD_PATH + "/detail")
pathname === (PENDING_DELIVERD_PATH + "/detail") && info && info.outerStatus === 29
? (
<DeliverGood mode="view">
<DeliverGood mode="edit" handleManualDeliver={handleManualDeliver} deliveryType={info.deliveryType}>
<Button loading={loading} type="primary" >手工发货</Button>
</DeliverGood>
)
......@@ -357,23 +373,28 @@ const Detail: React.FC<{}> = () => {
</div>
{/* 这里全部是走 非手工发货,当有手工发货按钮是,此时下面收发货明细隐藏 */}
<div style={{marginTop: '20px'}}>
<ReceiptDeliveryDetailsCard>
<StatisticsTab tab="收发货统计" columns={receiveColumns(info.source === 2 ? 'product' : 'order')} dataSource={info.details}></StatisticsTab>
{
info.pnoReceiveDeliverDetailDOList &&
info.pnoReceiveDeliverDetailDOList.length > 0
? <DetailTab
tab="收发货明细"
columns={pnoReceiveDeliverDetailDOListColumns}
dataSource={info.pnoReceiveDeliverDetailDOList}
handleConfirm={handleConfirm}
/>
: null
}
{
info && info.outerStatus === 26
? <div style={{marginTop: '20px'}}>
<ReceiptDeliveryDetailsCard>
<StatisticsTab tab="收发货统计" columns={receiveColumns(info.source === 2 ? 'product' : 'order')} dataSource={info.details}></StatisticsTab>
{
info.pnoReceiveDeliverDetailDOList &&
info.pnoReceiveDeliverDetailDOList.length > 0
? <DetailTab
tab="收发货明细"
columns={pnoReceiveDeliverDetailDOListColumns}
dataSource={info.pnoReceiveDeliverDetailDOList}
handleConfirm={handleConfirm}
/>
: null
}
</ReceiptDeliveryDetailsCard>
</div>
: null
}
</ReceiptDeliveryDetailsCard>
</div>
<div style={{marginTop: '20px'}}>
<DeliveryInfomation
deliveryDate={info.deliveryDate}
......
......@@ -328,3 +328,6 @@ export const DELIEVER_AND_RECEIVE_INNER_STATUS = {
'8_1': 5,
'8_2': 6
}
// 用户当前的会员类型:1-企业会员,2-企业个人会员,3-渠道企业会员,4-渠道个人会员
export const ENTERPRISE_MALL = {"1": 1, "2": 1, "3": 3, '4': 4}; // 根据当前用户角色查询商城
import React, { useState } from 'react';
import { message } from 'antd';
export const useRowSelection = (options) => {
const { type = 'checkbox', primaryKey = "id", func, ...others } = options;
const [selectedKeys, setSelectedKeys] = useState([]);
const [hasSelectedRows, setSelectedRows] = useState<any[]>([]);
const [loading, setLoading] = useState(false);
const rowSelection = {
type: type,
selectedRowKeys: selectedKeys,
onSelect: async (record: any, selected: boolean, selectedRows: any[], nativeEvent) => {
const tempKey = record[primaryKey];
if(type === 'radio') {
setSelectedKeys(record[tempKey]);
setSelectedRows(selectedRows);
return ;
}
let newArray = [];
if(selected) {
newArray = hasSelectedRows.concat(record);
} else {
// 如果是删除, 那么我们直接筛选key
newArray = hasSelectedRows.filter((item) => record[primaryKey] !== item[primaryKey] );
}
if(func) {
setLoading(true)
const {isSuccess, data} = await func(newArray);
setLoading(false);
if(!isSuccess) {
message.info(data.tips);
return;
}
}
setSelectedKeys(newArray.map((item) => item[primaryKey]));
setSelectedRows(newArray);
},
onSelectAll: async (selected: boolean, selectedRows: any[], changeRows: any[]) => {
let newArray = [];
if(selected) {
newArray = hasSelectedRows.concat(changeRows);
} else {
// 如果是删除, 那么我们直接筛选key
const removekeys = changeRows.map((item) => item[primaryKey]);
newArray = hasSelectedRows.filter((item) => !removekeys.includes(item[primaryKey]));
}
if(func && selected) {
setLoading(true)
const {isSuccess, data} = await func(newArray);
setLoading(false);
if(!isSuccess) {
message.info(data.tips);
return;
}
}
setSelectedKeys(newArray.map((item) => item[primaryKey]));
setSelectedRows(newArray);
},
...others,
}
return { rowSelection, loading, hasSelectedRows, selectedKeys, setSelectedRows, setSelectedKeys };
}
import React, { useState, useCallback } from 'react';
import { Button, Modal, DatePicker, Row, Col } from 'antd';
import NiceForm from '@/components/NiceForm';
import { createAsyncFormActions } from '@formily/antd';
import { createAsyncFormActions, FormEffectHooks } from '@formily/antd';
import { PublicApi } from '@/services/api';
import { useAsyncSelect } from '@/formSchema/effects/useAsyncSelect';
import styles from './index.less';
import { Link } from 'umi'
const formActions = createAsyncFormActions();
const { onFieldValueChange$, onFieldMount$ } = FormEffectHooks
interface Iprops {
children: React.ReactNode,
mode: 'view' | 'edit'
mode: 'view' | 'edit',
handleManualDeliver?: (value: any) => void
deliveryType: 1 | 2
}
const schema = {
type: 'object',
properties: {
layout: {
type: "object",
"x-component": "mega-layout",
"x-component-props": {
"labelAlign": "top",
"full": true
const getSchema = (type) => {
const others = type == 1
? {
deliveryNo: {
type: 'string',
title: '发货单号',
"x-rules": [
{
required: true,
message: '请填写发货单号'
},
{
limitByte: true, // 自定义校验规则
maxByte: 20,
}
]
},
properties: {
address: {
type: 'string',
"title": "发货地址",
enum: [],
"x-rules": [
{
required: true,
message: '请选择发货地址'
}
]
},
time: {
type: 'time',
title: '发货时间',
"x-component": 'DatePicker',
"x-rules": [
{
required: true,
message: '请选择发货时间'
}
]
logisticsName: {
type: 'string',
title: '物流公司',
enum: [],
"x-rules": [
{
required: true,
message: '请选择物流公司'
}
]
},
logisticsCode: {
type: 'string',
display: false
}
}
: {}
return {
type: 'object',
properties: {
layout: {
type: "object",
"x-component": "mega-layout",
"x-component-props": {
"labelAlign": "top",
"full": true
},
no: {
type: 'string',
title: '发货单号',
"x-rules": [
{
required: true,
message: '请填写发货单号'
properties: {
deliveryAddress: {
type: 'string',
"title": "发货地址",
enum: [],
"x-rules": [
{
required: true,
message: '请选择发货地址'
}
]
},
deliveryTime: {
type: 'string',
title: '发货时间',
"x-component": 'DatePicker',
"x-component-props": {
format: 'YYYY-MM-DD HH:mm:ss'
},
{
limitByte: true, // 自定义校验规则
maxByte: 20,
}
]
},
company: {
type: 'string',
title: '物流公司',
enum: [],
"x-rules": [
{
required: true,
message: '请选择物流公司'
}
]
"x-rules": [
{
required: true,
message: '请选择发货时间'
}
]
},
...others,
}
}
}
}
}
const DeliverGood: React.FC<Iprops> = (props) => {
const { mode,} = props;
const { mode,} = props;
const [visible, setVisible] = useState(false);
const schema = getSchema(props.deliveryType)
const handleOk = () => {
if(mode === 'edit') {
formActions.submit()
......@@ -92,6 +110,10 @@ const DeliverGood: React.FC<Iprops> = (props) => {
const handleSubmit = (value) => {
setVisible(false);
const {deliveryTime, ...rest} = value;
if(props.handleManualDeliver) {
props.handleManualDeliver({...rest, deliveryTime: deliveryTime.valueOf() });
}
}
const fetchDelieverAddress = useCallback(async () => {
......@@ -100,7 +122,7 @@ const DeliverGood: React.FC<Iprops> = (props) => {
return data.data.map((item) => {
return {
label: item.fullAddress + " / " + item.shipperName + " / " + item.phone,
value: item.id
value: item.fullAddress + " / " + item.shipperName + " / " + item.phone,
}
})
}
......@@ -108,7 +130,6 @@ const DeliverGood: React.FC<Iprops> = (props) => {
}, [])
const fetchCompany = useCallback(async() => {
// /logistics/select/listCompany
const { data, code } = await PublicApi.getLogisticsSelectListCompany({cooperateType: '2'});
if(code === 1000) {
return data.map((item) => {
......@@ -121,6 +142,14 @@ const DeliverGood: React.FC<Iprops> = (props) => {
return []
}, [])
const effects = () => {
console.log(123);
onFieldValueChange$('logisticsName').subscribe((fieldState) => {
// console.log(fieldState);
// formActions.setFieldValue()
})
}
return (
<div>
<div onClick={() => setVisible(true)}>
......@@ -133,7 +162,7 @@ const DeliverGood: React.FC<Iprops> = (props) => {
title="发货处理"
onOk={handleOk}
onCancel={handleCancel}
>
>
{
mode === 'edit'
? <NiceForm
......@@ -141,8 +170,9 @@ const DeliverGood: React.FC<Iprops> = (props) => {
components={{DatePicker}}
onSubmit={handleSubmit}
effects={($, actions) => {
useAsyncSelect("address", fetchDelieverAddress);
useAsyncSelect("company", fetchCompany)
// effects();
useAsyncSelect("deliveryAddress", fetchDelieverAddress);
useAsyncSelect("logisticsName", fetchCompany);
}}
schema={schema}
/>
......@@ -165,10 +195,9 @@ const DeliverGood: React.FC<Iprops> = (props) => {
</Row>
</div>
}
</Modal>
</div>
)
}
export default DeliverGood
\ No newline at end of file
export default DeliverGood
......@@ -10,7 +10,7 @@ const actions = createAsyncFormActions();
const { onFieldInit$, onFieldMount$ } = FormEffectHooks
const EnterPrise = ({visible, cancel, ...restProps}) => {
const [selectRow, memberRowCtl] = useRowSelectionTable({ customKey: 'memberId', type: 'radio' });
const [selectRow, memberRowCtl] = useRowSelectionTable({ customKey: 'id', type: 'radio'});
const fetchData = useCallback(async (params: any) => {
let res = await PublicApi.getMemberManageLowerPageBynamerole(params);
return res;
......
......@@ -132,7 +132,7 @@ export const schema = {
"x-component": "Table",
"x-component-props": {
"columns": columns,
"rowKey": "memberId",
"rowKey": "id",
"pagination":false,
"rowSelection": "{{rowSelection}}"
}
......
......@@ -58,6 +58,9 @@ const ProcessProducts = ({visible, cancel, rowSelection, ...restProps}) => {
price: item.price, //单价,
hasProcessNum: item.processNum || 0,
fullId: item.id, //订单商品唯一id
shopId: record.shopId,
memberId: item.memberId,
memberRoleId: item.memberRoleId,
}
}
)
......
import React, { useState, useEffect, useCallback } from 'react';
import { Modal} from 'antd';
import { Modal, Spin } from 'antd';
import { PublicApi } from '@/services/api';
import EyePreview from '@/components/EyePreview';
import { BasicForm, TablePagination, SearchForm } from '../ModalForTable'
......@@ -18,7 +18,7 @@ const MALL_NAME = {
"3": "渠道商城",
"4": "渠道自有商城"
}
const ProcessProducts = ({visible, cancel, rowSelection, ...restProps}) => {
const ProcessProducts = ({visible, cancel, rowSelection, loading, ...restProps}) => {
const authInfo = getAuth();
const fetchData = useCallback(async (params: any) => {
console.log(params);
......@@ -36,16 +36,16 @@ const ProcessProducts = ({visible, cancel, rowSelection, ...restProps}) => {
const columns = [
{ title: 'ID', dataIndex: 'id'},
{ title: '商品名称', dataIndex: 'name'},
{
title: '上架商城',
dataIndex: 'shop',
{
title: '上架商城',
dataIndex: 'shop',
render: (text, record) => {
return MALL_NAME[authInfo.memberType]
}
},
{ title: '品类', dataIndex: 'customerCategoryName'},
{ title: '品牌', dataIndex: 'brandName'}
]
]
const onOk = () => {
// restProps.onOk(setSelectRow)
......@@ -89,20 +89,23 @@ const ProcessProducts = ({visible, cancel, rowSelection, ...restProps}) => {
>
{
visible
? <SearchForm
request={fetchData}
schema={schema}
actions={actions}
effects={effects}
expressionScope={{rowSelection: rowSelection, columns: columns}}
></SearchForm>
?
<Spin spinning={loading}>
<SearchForm
request={fetchData}
schema={schema}
actions={actions}
effects={effects}
expressionScope={{rowSelection: rowSelection, columns: columns}}
/>
</Spin>
: null
}
</Modal>
)
}
export default ProcessProducts
\ No newline at end of file
export default ProcessProducts
......@@ -149,9 +149,13 @@ const Query: React.FC<{}> = (props) => {
{
actionMap[pathname]
}
{
pathname === ASSIGN_TO_BE_ADD_QUERY
? <a onClick={() => handleUpdateOrDelete('delete', {id: record.id})}>删除</a>
? <Space>
<Link to={`${ASSIGN_TO_BE_ADD_QUERY}/edit?id=${record.id}`}>修改</Link>
<a onClick={() => handleUpdateOrDelete('delete', {id: record.id})}>删除</a>
</Space>
: null
}
</Space>
......@@ -295,7 +299,7 @@ const Query: React.FC<{}> = (props) => {
let searchData = {
...rest,
startTime: st,
endTtime: et
endTime: et
}
ref.current.reload(searchData)
}, [ref])
......
......@@ -207,7 +207,7 @@ const Query: React.FC<{}> = (props) => {
let searchData = {
...rest,
startTime: st,
endTtime: et
endTime: et
}
ref.current.reload(searchData)
......
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