update
This commit is contained in:
parent
24088d3955
commit
35a6c6832d
@ -614,6 +614,11 @@ export default [
|
||||
name: 'users',
|
||||
component: './Setting/Users/index',
|
||||
},
|
||||
{
|
||||
path: '/setting/department/userstype',
|
||||
name: 'userstype',
|
||||
component: './Setting/UserType/index',
|
||||
},
|
||||
]
|
||||
},
|
||||
{
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "ant-design-pro",
|
||||
"version": "4.5.90",
|
||||
"version": "4.5.91",
|
||||
"private": true,
|
||||
"description": "An out-of-box UI solution for enterprise applications",
|
||||
"scripts": {
|
||||
|
||||
27
src/pages/Setting/UserType/data.d.ts
vendored
Normal file
27
src/pages/Setting/UserType/data.d.ts
vendored
Normal file
@ -0,0 +1,27 @@
|
||||
/*
|
||||
* @Author: cclu
|
||||
* @Date: 2021-12-13 11:01:23
|
||||
* @LastEditors: Please set LastEditors
|
||||
* @LastEditTime: 2022-03-28 18:05:34
|
||||
* @FilePath: \cloud-platform\src\pages\Setting\UserType\data.d.ts
|
||||
* @Description:
|
||||
*
|
||||
* Copyright (c) 2022 by cclu/杭州驿商科技, All Rights Reserved.
|
||||
*/
|
||||
// 模块数据类型
|
||||
export type UserTypeModel = {
|
||||
USERTYPE_ID: number; // 用户类型内码
|
||||
USERTYPE_NAME: string; // 用户类型名称
|
||||
USERTYPE_PID: number; // 用户类型父级内码
|
||||
USERTYPE_INDEX: number; // 用户类型索引
|
||||
USERTYPE_LEVEL: number; // 用户类型级别
|
||||
USERTYPE_GUID: string; // 用户类型唯一标识
|
||||
USERTYPE_ICO: string; // 用户类型图标
|
||||
USERTYPE_PROVINCE: number; // 所属省份
|
||||
USERTYPE_STATUS: number; // 有效状态
|
||||
STAFF_ID: number; // 操作人内码
|
||||
STAFF_NAME: string; // 操作人员
|
||||
OPERATE_DATE: string; // 操作时间
|
||||
USERTYPE_DESC: string; // 备注说明
|
||||
|
||||
}
|
||||
451
src/pages/Setting/UserType/index.tsx
Normal file
451
src/pages/Setting/UserType/index.tsx
Normal file
@ -0,0 +1,451 @@
|
||||
/*
|
||||
* @Author: cclu lkrnchocolateaaron@gmail.com
|
||||
* @Date: 2022-02-17 13:53:19
|
||||
* @LastEditors: cclu lkrnchocolateaaron@gmail.com
|
||||
* @LastEditTime: 2022-05-07 11:24:37
|
||||
* @FilePath: \cloud-platform\src\pages\Setting\UserType\index.tsx
|
||||
* @Description: 账号部门管理
|
||||
*/
|
||||
import React, { useState, useRef } from "react";
|
||||
import useRequest from "@ahooksjs/use-request";
|
||||
import { PlusOutlined } from "@ant-design/icons";
|
||||
import { PageContainer } from "@ant-design/pro-layout";
|
||||
import ProTable from "@ant-design/pro-table";
|
||||
import ProDescriptions from "@ant-design/pro-descriptions";
|
||||
import { Badge, Button, Drawer, Form, message, Switch, TreeSelect } from 'antd';
|
||||
import { ModalForm, ProFormDigit, ProFormSelect, ProFormText, ProFormTextArea } from "@ant-design/pro-form";
|
||||
|
||||
import type { FormInstance } from 'antd';
|
||||
import type { UserTypeModel } from "./data";
|
||||
import type { ProColumns, ActionType } from '@ant-design/pro-table';
|
||||
import type { ProDescriptionsItemProps } from "@ant-design/pro-descriptions"
|
||||
import type { ConnectState } from "@/models/connect";
|
||||
import type { CurrentUser } from '@/models/user';
|
||||
|
||||
|
||||
import { getMerchantTree, getOnwer } from "@/services/options";
|
||||
import { getUserTypeList, delUserType, updataUserType, getUserTypeCount } from './service'
|
||||
import { connect } from "umi";
|
||||
|
||||
/**
|
||||
* @en-US add or update node
|
||||
* @zh-CN 新增或更新分类数据
|
||||
* @param fields 分类数据对象
|
||||
*/
|
||||
const handleAddUpdate = async (fields: UserTypeModel) => {
|
||||
const hide = message.loading('正在提交...')
|
||||
|
||||
const result = await updataUserType(fields)
|
||||
hide()
|
||||
if (result.Result_Code !== 100) {
|
||||
message.error(`${result.Result_Desc}` || `${result.Result_Code}:提交失败`)
|
||||
return false
|
||||
}
|
||||
message.success(fields.USERTYPE_ID ? "更新成功!" : "新建成功!")
|
||||
return true
|
||||
}
|
||||
|
||||
/**
|
||||
* @description: 删除分类
|
||||
* @param {nodeId} 分类id
|
||||
* @return {boolean} 是否执行成功
|
||||
*/
|
||||
const handleDelete = async (nodeId: number) => {
|
||||
const hide = message.loading('正在删除...');
|
||||
try {
|
||||
const result = await delUserType(nodeId)
|
||||
|
||||
hide();
|
||||
if (result.Result_Code !== 100) {
|
||||
message.error(`${result.Result_Code }:${result.Result_Desc}`)
|
||||
return false
|
||||
}
|
||||
message.success("删除成功!")
|
||||
return true
|
||||
} catch (error) {
|
||||
hide();
|
||||
message.error("删除失败")
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
// 数字角标生成
|
||||
const renderBadge = (count: number, active = false) => {
|
||||
return (
|
||||
<Badge
|
||||
count={count}
|
||||
style={{
|
||||
marginTop: -2,
|
||||
marginLeft: 4,
|
||||
color: active ? '#1890FF' : '#999',
|
||||
backgroundColor: active ? '#E6F7FF' : '#eee',
|
||||
}}
|
||||
/>
|
||||
);
|
||||
};
|
||||
|
||||
const UserTypeList: React.FC<{ currentUser: CurrentUser | undefined }> = (props) => {
|
||||
const { currentUser } = props
|
||||
const actionRef = useRef<ActionType>();
|
||||
const formRef = useRef<FormInstance>();
|
||||
const [showDetail, setShowDetail] = useState<boolean>(false); // 是否显示详情
|
||||
const [currentRow, setCurrentRow] = useState<UserTypeModel>(); // 当前选中行
|
||||
const [createModalVisible, handleModalVisible] = useState<boolean>(false); // 发布分类更新窗口的弹窗
|
||||
|
||||
const [userTypeTree, setUserTypeTree] = useState<[]>(); // 树结构数据分类 用于弹出编辑时选择上级
|
||||
const [activeKey, setActiveKey] = useState<React.Key>(`${currentUser?.UserPattern===9000?'1000':currentUser?.UserPattern}`); // 树结构数据分类 用于弹出编辑时选择上级
|
||||
|
||||
// 查询可选商家
|
||||
const { data: merchantTree } = useRequest(async () => {
|
||||
return await getMerchantTree({MerchantPid:currentUser?.BusinessManID||''})
|
||||
})
|
||||
// 查询可选商家
|
||||
const {loading: typeCountLoading,data: typeCount } = useRequest(getUserTypeCount)
|
||||
|
||||
// 表格数据配置 <UserTypeModel|SystemMenuModel>
|
||||
const columns: ProColumns<UserTypeModel>[] = [
|
||||
{
|
||||
title: '分类名称',
|
||||
dataIndex: 'USERTYPE_NAME',
|
||||
hideInDescriptions: true,
|
||||
render: (_, record) => {
|
||||
|
||||
return <a key="fname" onClick={() => {
|
||||
setCurrentRow(record)
|
||||
setShowDetail(true)
|
||||
}}>{record?.USERTYPE_NAME}</a>
|
||||
}
|
||||
},
|
||||
{
|
||||
title: '状态',
|
||||
dataIndex: 'USERTYPE_STATUS',
|
||||
hideInSearch: true,
|
||||
filters: true,
|
||||
valueType: 'select',
|
||||
initialValue: 1,
|
||||
valueEnum: {
|
||||
all: { text: '全部', status: 'Default' },
|
||||
0: { text: '无效', status: 'Default' },
|
||||
1: { text: '有效', status: 'Processing' },
|
||||
},
|
||||
|
||||
},
|
||||
{
|
||||
title: '所属业主',
|
||||
dataIndex: 'USERTYPE_PROVINCE',
|
||||
hideInSearch: true,
|
||||
hideInTable: activeKey==='2000',
|
||||
valueType: "select",
|
||||
request: async () => {
|
||||
const options = await getOnwer()
|
||||
return options;
|
||||
},
|
||||
},
|
||||
{
|
||||
title: '所属商户',
|
||||
dataIndex: 'USERTYPE_PROVINCE',
|
||||
hideInSearch: true,
|
||||
hideInTable: activeKey==='1000',
|
||||
valueType: "treeSelect",
|
||||
fieldProps: {
|
||||
options: merchantTree
|
||||
},
|
||||
|
||||
},
|
||||
{
|
||||
title: '索引',
|
||||
dataIndex: 'USERTYPE_INDEX',
|
||||
hideInSearch: true
|
||||
},
|
||||
|
||||
{
|
||||
title: '说明',
|
||||
dataIndex: 'USERTYPE_DESC',
|
||||
hideInSearch: true
|
||||
},
|
||||
{
|
||||
title: '操作',
|
||||
valueType: 'option',
|
||||
dataIndex: 'option',
|
||||
hideInDescriptions: true,
|
||||
render: (text, record) => [
|
||||
<a
|
||||
key="editable"
|
||||
onClick={() => {
|
||||
|
||||
handleModalVisible(true);
|
||||
if (showDetail) {
|
||||
setShowDetail(false);
|
||||
}
|
||||
|
||||
setCurrentRow({ ...record });
|
||||
}}
|
||||
>
|
||||
编辑
|
||||
</a>,
|
||||
// <Popconfirm // 删除按钮功能
|
||||
// title="确认删除该项菜单吗?"
|
||||
// onConfirm={async () => {
|
||||
// if (record) {
|
||||
// const { USERTYPE_ID } = record
|
||||
// const success = (USERTYPE_ID ? await handleDelete(USERTYPE_ID) : false)
|
||||
// if (success) {
|
||||
// if (actionRef.current) {
|
||||
// actionRef.current.reload();
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }}
|
||||
// >
|
||||
// <a>无效</a>
|
||||
// </Popconfirm>
|
||||
]
|
||||
}
|
||||
|
||||
]
|
||||
|
||||
return (<PageContainer header={{
|
||||
title: '',
|
||||
breadcrumb: {},
|
||||
}}>
|
||||
|
||||
<ProTable<UserTypeModel>
|
||||
|
||||
rowKey="USERTYPE_ID"
|
||||
actionRef={actionRef}
|
||||
request={async (params) => {
|
||||
console.log('params',params)
|
||||
const data = await getUserTypeList({ ...params })
|
||||
setUserTypeTree(data)
|
||||
return { data, success: true }
|
||||
}}
|
||||
search={false}
|
||||
params={{ UserTypePattern: activeKey }}
|
||||
columns={columns}
|
||||
toolbar={{
|
||||
actions: [
|
||||
<Button
|
||||
key="new"
|
||||
icon={<PlusOutlined />}
|
||||
type="primary"
|
||||
onClick={() => {
|
||||
handleModalVisible(true)
|
||||
}}
|
||||
>部门</Button>,
|
||||
],
|
||||
menu: {
|
||||
type: 'tab',
|
||||
activeKey,
|
||||
items: currentUser?.UserPattern===9000 ? [
|
||||
{
|
||||
key: '1000',
|
||||
label: <span>业主{renderBadge(!typeCountLoading ? typeCount?.OwnerUnitCount: '', activeKey === '1000')}</span>,
|
||||
},
|
||||
{
|
||||
key: '4000',
|
||||
label: <span>供应商{renderBadge(!typeCountLoading ?typeCount?.SupplierCount:'', activeKey === '4000')}</span>,
|
||||
},
|
||||
{
|
||||
key: '2000',
|
||||
label: <span>商户{renderBadge(!typeCountLoading ?typeCount?.MerchantCount:'', activeKey === '2000')}</span>,
|
||||
}
|
||||
]:currentUser?.UserPattern===1000 ?[
|
||||
{
|
||||
key: '1000',
|
||||
label: <span>业主{renderBadge(!typeCountLoading ? typeCount?.OwnerUnitCount: '', activeKey === '1000')}</span>,
|
||||
},
|
||||
{
|
||||
key: '4000',
|
||||
label: <span>供应商{renderBadge(!typeCountLoading ?typeCount?.SupplierCount:'', activeKey === '4000')}</span>,
|
||||
},
|
||||
]:[],
|
||||
onChange: (key) => {
|
||||
setActiveKey(key as string);
|
||||
},
|
||||
},
|
||||
}}
|
||||
pagination={{ defaultPageSize: 10 }}
|
||||
/>
|
||||
|
||||
{/* 编辑新增分类弹出框 */}
|
||||
<ModalForm
|
||||
layout={'horizontal'}
|
||||
wrapperCol={{ span: 16 }}
|
||||
labelCol={{ span: 6 }}
|
||||
title={currentRow ? '分类编辑' : '分类新增'}
|
||||
width={600}
|
||||
visible={createModalVisible}
|
||||
formRef={formRef}
|
||||
onVisibleChange={(value) => {
|
||||
handleModalVisible(value)
|
||||
if (value) {
|
||||
formRef.current?.setFieldsValue(
|
||||
currentRow ? {
|
||||
...currentRow, USERTYPE_STATUS: !!currentRow.USERTYPE_STATUS,
|
||||
USERTYPE_PID: currentRow.USERTYPE_PID !== -1 ? currentRow.USERTYPE_PID : ''
|
||||
} : { USERTYPE_STATUS: 1,USERTYPE_PATTERN:activeKey },
|
||||
);
|
||||
} else {
|
||||
formRef.current?.resetFields();
|
||||
setCurrentRow(undefined);
|
||||
}
|
||||
}}
|
||||
onFinish={async (value) => {
|
||||
let newValue: any = { ...value , USERTYPE_PATTERN:activeKey}
|
||||
if (currentRow) { // 编辑数据
|
||||
newValue = { ...currentRow, ...newValue }
|
||||
}
|
||||
|
||||
newValue.USERTYPE_STATUS = value.USERTYPE_STATUS ? 1 : 0
|
||||
newValue.USERTYPE_PID = value.USERTYPE_PID ? value.USERTYPE_PID : -1
|
||||
const success = await handleAddUpdate(newValue as UserTypeModel)
|
||||
|
||||
if (success) {
|
||||
if (actionRef.current) {
|
||||
actionRef.current.reload();
|
||||
}
|
||||
// handleModalVisible(false)
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}}
|
||||
>
|
||||
|
||||
<ProFormText
|
||||
name="USERTYPE_NAME"
|
||||
label="分类名称"
|
||||
placeholder="请输入分类名称"
|
||||
rules={[
|
||||
{
|
||||
required: true,
|
||||
message: '请输入分类名称',
|
||||
},
|
||||
]}
|
||||
/>
|
||||
<Form.Item
|
||||
name="USERTYPE_PID"
|
||||
label="上级分类"
|
||||
>
|
||||
<TreeSelect
|
||||
placeholder="请选择上级分类"
|
||||
dropdownStyle={{ maxHeight: 300, overflow: 'auto' }}
|
||||
// treeDefaultExpandAll
|
||||
treeData={userTypeTree}
|
||||
fieldNames={{
|
||||
label: 'USERTYPE_NAME',
|
||||
value: "USERTYPE_ID",
|
||||
children: "children"
|
||||
}}
|
||||
>
|
||||
</TreeSelect >
|
||||
</Form.Item>
|
||||
{activeKey === '1000' ||activeKey === '4000'
|
||||
?<ProFormSelect
|
||||
name="USERTYPE_PROVINCE"
|
||||
label="业主单位"
|
||||
placeholder="请选择业主单位"
|
||||
rules={[
|
||||
{
|
||||
required: true,
|
||||
message: '请选择业主单位',
|
||||
},
|
||||
]}
|
||||
request={async () => {
|
||||
const options = await getOnwer()
|
||||
return options;
|
||||
}}
|
||||
fieldProps={{
|
||||
fieldNames: {
|
||||
title: 'label',
|
||||
// key: "value"
|
||||
},
|
||||
|
||||
}}
|
||||
/>:''}
|
||||
{activeKey === '2000' &&
|
||||
<Form.Item
|
||||
name="USERTYPE_PROVINCE"
|
||||
label="所属商家"
|
||||
// rules={[
|
||||
// {
|
||||
// required: true,
|
||||
// message: '请选择所属商家',
|
||||
// }
|
||||
// ]}
|
||||
>
|
||||
<TreeSelect
|
||||
treeData={merchantTree}
|
||||
treeDefaultExpandAll
|
||||
showSearch
|
||||
treeNodeFilterProp="label"
|
||||
allowClear
|
||||
/>
|
||||
</Form.Item>}
|
||||
{/* <ProFormSwitch // 当前组件依赖临时过渡使用form.item
|
||||
name="USERTYPE_STATUS"
|
||||
label="是否有效"
|
||||
checkedChildren="有"
|
||||
unCheckedChildren="无"
|
||||
|
||||
/> */}
|
||||
<Form.Item
|
||||
name="USERTYPE_STATUS"
|
||||
label="是否有效"
|
||||
>
|
||||
<Switch
|
||||
checkedChildren="有"
|
||||
unCheckedChildren="无"
|
||||
defaultChecked={currentRow ? !!currentRow.USERTYPE_STATUS : true}
|
||||
/>
|
||||
</Form.Item>
|
||||
|
||||
<ProFormDigit
|
||||
name="USERTYPE_INDEX"
|
||||
label="索引"
|
||||
placeholder="请输入索引"
|
||||
|
||||
min={0}
|
||||
max={9999}
|
||||
fieldProps={{ precision: 0 }}
|
||||
/>
|
||||
|
||||
<ProFormTextArea
|
||||
name="USERTYPE_DESC"
|
||||
label="备注说明"
|
||||
placeholder="请输入说明"
|
||||
/>
|
||||
|
||||
</ModalForm>
|
||||
{/* 分类详情 */}
|
||||
<Drawer
|
||||
width={600}
|
||||
visible={showDetail}
|
||||
onClose={() => {
|
||||
setCurrentRow(undefined);
|
||||
setShowDetail(false);
|
||||
}}
|
||||
closable={false}
|
||||
>
|
||||
{currentRow?.USERTYPE_NAME && (
|
||||
<ProDescriptions<UserTypeModel>
|
||||
column={1}
|
||||
title={currentRow?.USERTYPE_NAME}
|
||||
request={async () => ({
|
||||
data: currentRow || {},
|
||||
})}
|
||||
params={{
|
||||
id: currentRow?.USERTYPE_ID,
|
||||
}}
|
||||
columns={columns as ProDescriptionsItemProps<UserTypeModel>[]}
|
||||
/>
|
||||
)}
|
||||
</Drawer>
|
||||
</PageContainer>
|
||||
)
|
||||
}
|
||||
|
||||
export default connect(({ user }: ConnectState) => ({
|
||||
currentUser: user.currentUser,
|
||||
|
||||
}))(UserTypeList);
|
||||
|
||||
57
src/pages/Setting/UserType/service.ts
Normal file
57
src/pages/Setting/UserType/service.ts
Normal file
@ -0,0 +1,57 @@
|
||||
import request from '@/utils/request';
|
||||
import { wrapTreeNode } from '@/utils/format';
|
||||
import type { UserTypeModel } from './data';
|
||||
|
||||
// 获取模块列表数据
|
||||
export async function getUserTypeList(params?: any) {
|
||||
|
||||
const data = await request('/FrameWork/GetUserTypeList', {
|
||||
method: 'GET',
|
||||
params: {...params,pageindex: params.current,pagesize:params.pageSize},
|
||||
})
|
||||
|
||||
|
||||
if (data.Result_Code !== 100) {
|
||||
return []
|
||||
}
|
||||
const treeTable = wrapTreeNode(data.Result_Data.List);
|
||||
|
||||
return treeTable;
|
||||
}
|
||||
// 获取模块列表数据
|
||||
export async function getUserTypeCount(params?: any) {
|
||||
|
||||
const data = await request('/FrameWork/GetUserTypeCount', {
|
||||
method: 'GET',
|
||||
params,
|
||||
})
|
||||
|
||||
|
||||
if (data.Result_Code !== 100) {
|
||||
return {}
|
||||
}
|
||||
|
||||
return data.Result_Data;
|
||||
}
|
||||
// 更新模块
|
||||
export async function updataUserType(params?: UserTypeModel) {
|
||||
return request('/platform/synchroUserType', {
|
||||
method: 'POST',
|
||||
data: {
|
||||
...params,
|
||||
},
|
||||
requestType: 'form'
|
||||
});
|
||||
}
|
||||
|
||||
// 删除模块
|
||||
export async function delUserType(UserType: number) {
|
||||
return request(`/Platform/DeleteUserType`, {
|
||||
method: 'GET',
|
||||
params: {
|
||||
UserType
|
||||
}
|
||||
});
|
||||
}
|
||||
/* 模块列表end */
|
||||
|
||||
@ -729,7 +729,7 @@ const Edit = ({ tableTab, openType, detail, reloadTable, currentUser, selectTab,
|
||||
console.log('params', params);
|
||||
if (pageType === 'merchantManagement') {
|
||||
const req: any = {
|
||||
ProvinceCode: '530000',
|
||||
// ProvinceCode: '530000',
|
||||
UserTypePattern: 2000
|
||||
}
|
||||
const data = await getUserTypeTree(req)
|
||||
@ -742,7 +742,7 @@ const Edit = ({ tableTab, openType, detail, reloadTable, currentUser, selectTab,
|
||||
return data
|
||||
} if (params.USER_PROVINCE || params.USER_PATTERN) {
|
||||
const req: any = {
|
||||
ProvinceCode: '530000',
|
||||
// ProvinceCode: '530000',
|
||||
UserTypePattern: tableTab === 9000 ? 1000 : tableTab
|
||||
}
|
||||
const data = await getUserTypeTree(req)
|
||||
|
||||
@ -262,7 +262,9 @@ const UserList: React.FC<{ currentUser: CurrentUser | undefined }> = (props) =>
|
||||
checkable
|
||||
style={{ padding: '20px' }}
|
||||
// eslint-disable-next-line no-nested-ternary
|
||||
treeData={!typeLoading ? (currentUser?.UserPattern === 9000 ? userTypeTree : userTypeTree[0]?.children) : []}
|
||||
// 虽然不知道前面为啥要[0].children 但是 领导说 按照下面那行的走 那就遵命
|
||||
// treeData={!typeLoading ? (currentUser?.UserPattern === 9000 ? userTypeTree : userTypeTree[0]?.children) : []}
|
||||
treeData={!typeLoading ? (currentUser?.UserPattern === 9000 ? userTypeTree : userTypeTree) : []}
|
||||
fieldNames={{
|
||||
title: "label",
|
||||
// key: "USERTYPE_ID"
|
||||
|
||||
@ -121,19 +121,19 @@ const Login: React.FC<LoginProps> = (props) => {
|
||||
|
||||
useEffect(async () => {
|
||||
// 先拿到ip
|
||||
let IpInfo: any = await getUserIP()
|
||||
console.log('IpInfoIpInfoIpInfoIpInfo', IpInfo);
|
||||
// let IpInfo: any = await getUserIP()
|
||||
// console.log('IpInfoIpInfoIpInfoIpInfo', IpInfo);
|
||||
// 用ip 去获取信息
|
||||
// let ipDetail: any = await getLocationByIP(IpInfo, 'XrQQuNQRGxap9YH2xmvx3dzuJVkXhTzT')
|
||||
let ipDetail: any = await handleGetIPDetail({ ip: IpInfo })
|
||||
let ipDetail: any = await handleGetIPDetail({})
|
||||
|
||||
console.log('ipDetailipDetailipDetail', ipDetail);
|
||||
const ipRes: any = {
|
||||
country: ipDetail.country,
|
||||
prov: ipDetail.province,
|
||||
city: ipDetail.city,
|
||||
district: ipDetail.district,
|
||||
ip: IpInfo,
|
||||
country: ipDetail?.country,
|
||||
prov: ipDetail?.province,
|
||||
city: ipDetail?.city,
|
||||
district: ipDetail?.district,
|
||||
// ip: IpInfo,
|
||||
}
|
||||
session.set('basicInfo', ipRes);
|
||||
setBaseInfo(ipRes)
|
||||
|
||||
@ -12,5 +12,22 @@ export async function handleGetIPDetail(params: any) {
|
||||
return []
|
||||
}
|
||||
|
||||
return data.content.address_detail
|
||||
if (data.content) {
|
||||
return data.content.address_detail
|
||||
}
|
||||
return null
|
||||
}
|
||||
|
||||
// 同步点餐商品的接口
|
||||
export async function handleNewJavasyncCommodityList(params: any) {
|
||||
|
||||
const data = await request(`/third-party/syncCommodityList`, {
|
||||
method: 'GET',
|
||||
params
|
||||
})
|
||||
|
||||
if (data.Result_Code === 500) {
|
||||
return []
|
||||
}
|
||||
return data
|
||||
}
|
||||
@ -132,25 +132,25 @@ const AfterSalesManage: React.FC<{ currentUser: CurrentUser | undefined }> = (pr
|
||||
ellipsis: true,
|
||||
hideInSearch: true,
|
||||
},
|
||||
{
|
||||
dataIndex: 'FIELDENUM_STATUS',
|
||||
title: '有效状态',
|
||||
align: 'center',
|
||||
width: 120,
|
||||
ellipsis: true,
|
||||
valueType: "select",
|
||||
fieldProps: {
|
||||
options: [
|
||||
{ label: '有效', value: "1" },
|
||||
{ label: '无效', value: "0" }
|
||||
]
|
||||
},
|
||||
// valueEnum: {
|
||||
// "1": "有效",
|
||||
// "0": "无效"
|
||||
// },
|
||||
initialValue: "1"
|
||||
},
|
||||
// {
|
||||
// dataIndex: 'FIELDENUM_STATUS',
|
||||
// title: '有效状态',
|
||||
// align: 'center',
|
||||
// width: 120,
|
||||
// ellipsis: true,
|
||||
// valueType: "select",
|
||||
// fieldProps: {
|
||||
// options: [
|
||||
// { label: '有效', value: "1" },
|
||||
// { label: '无效', value: "0" }
|
||||
// ]
|
||||
// },
|
||||
// // valueEnum: {
|
||||
// // "1": "有效",
|
||||
// // "0": "无效"
|
||||
// // },
|
||||
// initialValue: "1"
|
||||
// },
|
||||
{
|
||||
dataIndex: 'FIELDENUM_DESC',
|
||||
title: '备注说明',
|
||||
@ -226,12 +226,12 @@ const AfterSalesManage: React.FC<{ currentUser: CurrentUser | undefined }> = (pr
|
||||
req = {
|
||||
...currentRow,
|
||||
...res,
|
||||
FIELDENUM_STATUS: 1,
|
||||
}
|
||||
} else {
|
||||
req = {
|
||||
...res,
|
||||
FIELDEXPLAIN_ID: FIELDEXPLAIN_ID,
|
||||
FIELDENUM_PID: -1,
|
||||
FIELDENUM_STATUS: 1,
|
||||
}
|
||||
}
|
||||
const data = await handeSynchroFIELDENUM(req)
|
||||
@ -250,6 +250,22 @@ const AfterSalesManage: React.FC<{ currentUser: CurrentUser | undefined }> = (pr
|
||||
}
|
||||
}
|
||||
|
||||
const markDisabled = (nodes: any, disabledIds: any) => {
|
||||
return nodes.map((node: any) => {
|
||||
const copy = { ...node };
|
||||
|
||||
if (disabledIds.includes(copy.FIELDENUM_ID)) {
|
||||
copy.disabled = true;
|
||||
}
|
||||
|
||||
if (copy.children && Array.isArray(copy.children)) {
|
||||
copy.children = markDisabled(copy.children, disabledIds);
|
||||
}
|
||||
return copy;
|
||||
});
|
||||
};
|
||||
|
||||
|
||||
return (
|
||||
<PageContainer header={{
|
||||
title: '',
|
||||
@ -272,7 +288,7 @@ const AfterSalesManage: React.FC<{ currentUser: CurrentUser | undefined }> = (pr
|
||||
FIELDEXPLAIN_FIELD: 'AFTERSALE_TYPE',
|
||||
FIELDEXPLAIN_ID: "",
|
||||
FIELDENUM_PID: "",
|
||||
FIELDENUM_STATUS: params?.FIELDENUM_STATUS,
|
||||
FIELDENUM_STATUS: 1,
|
||||
SearchKey: ""
|
||||
}
|
||||
const data = await handeGetNestingFIELDENUMList(req);
|
||||
@ -353,8 +369,10 @@ const AfterSalesManage: React.FC<{ currentUser: CurrentUser | undefined }> = (pr
|
||||
setCurrentRow(undefined);
|
||||
}}
|
||||
footer={<ModalFooter
|
||||
confirmLoading={confirmLoading}
|
||||
hideDelete={!currentRow?.FIELDENUM_ID}
|
||||
handleDelete={async () => {
|
||||
handleConfirmLoading(true)
|
||||
await handelDelete(currentRow?.FIELDENUM_ID)
|
||||
}}
|
||||
handleCancel={() => {
|
||||
@ -421,14 +439,15 @@ const AfterSalesManage: React.FC<{ currentUser: CurrentUser | undefined }> = (pr
|
||||
}}
|
||||
>
|
||||
<Row gutter={8}>
|
||||
{/* <Col span={12}>
|
||||
<Col span={12}>
|
||||
<ProFormTreeSelect
|
||||
name="FIELDENUM_PID"
|
||||
label="上级类别"
|
||||
request={async () => {
|
||||
if (typeTreeData && typeTreeData.length > 0) {
|
||||
let list: any = [{ FIELDENUM_NAME: "默认类别", FIELDENUM_ID: -1 }, ...typeTreeData]
|
||||
return list
|
||||
let res = markDisabled(list, currentRow?.FIELDENUM_ID ? [currentRow.FIELDENUM_ID] : [])
|
||||
return res
|
||||
} else {
|
||||
const req = {
|
||||
FIELDEXPLAIN_FIELD: 'AFTERSALE_TYPE',
|
||||
@ -440,8 +459,9 @@ const AfterSalesManage: React.FC<{ currentUser: CurrentUser | undefined }> = (pr
|
||||
const data = await handeGetNestingFIELDENUMList(req);
|
||||
if (data && data.length > 0) {
|
||||
data.unshirft({ FIELDENUM_NAME: "默认类别", FIELDENUM_ID: -1 })
|
||||
let res = markDisabled(data, currentRow?.FIELDENUM_ID ? [currentRow.FIELDENUM_ID] : [])
|
||||
setTypeTreeData(data)
|
||||
return data
|
||||
return res
|
||||
} else {
|
||||
return [{ FIELDENUM_NAME: "默认类别", FIELDENUM_ID: -1 }]
|
||||
}
|
||||
@ -464,7 +484,7 @@ const AfterSalesManage: React.FC<{ currentUser: CurrentUser | undefined }> = (pr
|
||||
}
|
||||
]}
|
||||
/>
|
||||
</Col> */}
|
||||
</Col>
|
||||
<Col span={12}>
|
||||
<ProFormText
|
||||
name="FIELDENUM_NAME"
|
||||
@ -501,7 +521,7 @@ const AfterSalesManage: React.FC<{ currentUser: CurrentUser | undefined }> = (pr
|
||||
]}
|
||||
/>
|
||||
</Col>
|
||||
<Col span={12}>
|
||||
{/* <Col span={12}>
|
||||
<ProFormSelect
|
||||
name="FIELDENUM_STATUS"
|
||||
label="有效状态"
|
||||
@ -513,7 +533,7 @@ const AfterSalesManage: React.FC<{ currentUser: CurrentUser | undefined }> = (pr
|
||||
}
|
||||
]}
|
||||
/>
|
||||
</Col>
|
||||
</Col> */}
|
||||
<Col span={24}>
|
||||
<ProFormTextArea
|
||||
name="FIELDENUM_DESC"
|
||||
|
||||
@ -9,7 +9,7 @@ import Draggable from 'react-draggable';
|
||||
import SubMenu from "antd/lib/menu/SubMenu";
|
||||
import ProTable from '@ant-design/pro-table';
|
||||
import ProDescriptions from '@ant-design/pro-descriptions';
|
||||
import ProForm, { ProFormDatePicker, ProFormDateTimePicker, ProFormDateTimeRangePicker, ProFormMoney, ProFormSelect, ProFormText, ProFormTextArea, ProFormUploadButton } from '@ant-design/pro-form';
|
||||
import ProForm, { ProFormDatePicker, ProFormDateTimePicker, ProFormDateTimeRangePicker, ProFormMoney, ProFormSelect, ProFormText, ProFormTextArea, ProFormTreeSelect, ProFormUploadButton } from '@ant-design/pro-form';
|
||||
import { MenuFoldOutlined, PlusOutlined, ExclamationCircleOutlined } from '@ant-design/icons';
|
||||
import { PageContainer } from '@ant-design/pro-layout';
|
||||
import { Button, Col, Drawer, message, Row, Popconfirm, Space, Image, Modal, Form, Switch, Upload, Tooltip, Descriptions, TreeSelect, Tabs } from 'antd';
|
||||
@ -20,7 +20,7 @@ import type { ActionType, ProColumns } from '@ant-design/pro-table';
|
||||
import type { ProDescriptionsItemProps } from '@ant-design/pro-descriptions';
|
||||
import type { FormInstance } from 'antd';
|
||||
import PageTitleBox from '@/components/PageTitleBox';
|
||||
import { handeGetUSERDEFINEDTYPEList, handlDeleteUSERDEFINEDTYPE, handlSynchroUSERDEFINEDTYPE } from '../service';
|
||||
import { handeGetUSERDEFINEDTYPEList, handlDeleteUSERDEFINEDTYPE, handlGetUSERDEFINEDTYPEList, handlSynchroUSERDEFINEDTYPE } from '../service';
|
||||
import { render } from 'react-dom';
|
||||
import { uploadAHYDPicture, uploadPicture } from '@/services/picture';
|
||||
import { handleSetlogSave } from '@/utils/format';
|
||||
@ -242,6 +242,19 @@ const HomepageAds: React.FC<{ currentUser: CurrentUser | undefined }> = (props)
|
||||
}
|
||||
};
|
||||
|
||||
const processTreeData = (data: any) => {
|
||||
return data.map((item: any) => {
|
||||
if (item.children && item.children.length > 0) {
|
||||
return {
|
||||
...item,
|
||||
disabled: true, // 有子节点的节点禁用
|
||||
children: processTreeData(item.children)
|
||||
};
|
||||
}
|
||||
return item;
|
||||
});
|
||||
};
|
||||
|
||||
return (
|
||||
<div style={{ backgroundColor: "#fff" }}>
|
||||
<div style={{ width: '100%', boxSizing: 'border-box', padding: '24px' }}>
|
||||
@ -253,7 +266,7 @@ const HomepageAds: React.FC<{ currentUser: CurrentUser | undefined }> = (props)
|
||||
{
|
||||
selectTab === "1" ?
|
||||
<ProTable
|
||||
scroll={{ x: "100%" }}
|
||||
scroll={{ x: "100%", y: 'calc(100vh - 440px)' }}
|
||||
formRef={formRef}
|
||||
actionRef={actionRef}
|
||||
search={false}
|
||||
@ -294,7 +307,7 @@ const HomepageAds: React.FC<{ currentUser: CurrentUser | undefined }> = (props)
|
||||
{
|
||||
selectTab === "2" ?
|
||||
<ProTable
|
||||
scroll={{ x: "100%" }}
|
||||
scroll={{ x: "100%", y: 'calc(100vh - 440px)' }}
|
||||
formRef={formRef}
|
||||
actionRef={actionRef}
|
||||
search={false}
|
||||
@ -404,8 +417,10 @@ const HomepageAds: React.FC<{ currentUser: CurrentUser | undefined }> = (props)
|
||||
</Draggable>
|
||||
}}
|
||||
footer={<ModalFooter
|
||||
confirmLoading={confirmLoading}
|
||||
hideDelete={!currentRow?.USERDEFINEDTYPE_ID}
|
||||
handleDelete={async () => {
|
||||
handleConfirmLoading(true)
|
||||
await handelDelete(currentRow?.USERDEFINEDTYPE_ID)
|
||||
}}
|
||||
handleCancel={() => {
|
||||
@ -483,7 +498,32 @@ const HomepageAds: React.FC<{ currentUser: CurrentUser | undefined }> = (props)
|
||||
initialValue={1000}
|
||||
/>
|
||||
</Col>
|
||||
{/* 这个字段暂时用来 判断跳转小程序分类页面的 哪个分类 */}
|
||||
<Col span={12}>
|
||||
<ProFormTreeSelect
|
||||
label={'跳转路径'}
|
||||
name={'SERVERPARTSHOP_ID'}
|
||||
request={async () => {
|
||||
const req = {
|
||||
OWNERUNIT_ID: currentUser?.OwnerUnitId,
|
||||
PROVINCE_CODE: "",
|
||||
GOODSTYPE: 4000,
|
||||
USERDEFINEDTYPE_STATE: 1
|
||||
}
|
||||
const data = await handlGetUSERDEFINEDTYPEList(req);
|
||||
return data
|
||||
}}
|
||||
fieldProps={{
|
||||
fieldNames: {
|
||||
label: "USERDEFINEDTYPE_NAME",
|
||||
value: "USERDEFINEDTYPE_ID"
|
||||
},
|
||||
showSearch: true,
|
||||
treeDefaultExpandAll: true,
|
||||
}}
|
||||
/>
|
||||
</Col>
|
||||
<Col span={24}>
|
||||
<ProFormUploadButton
|
||||
name="USERDEFINEDTYPE_ICO"
|
||||
label="上传附件"
|
||||
|
||||
@ -32,6 +32,7 @@ import OrderCategoryTreeMultiple from './components/OrderCategoryTreeMultiple';
|
||||
import Item from 'antd/lib/list/Item';
|
||||
import { handleSetlogSave } from '@/utils/format';
|
||||
import { highlightText } from '@/utils/highlightText';
|
||||
import { handleNewJavasyncCommodityList } from '@/pages/User/login/service';
|
||||
|
||||
|
||||
const beforeUpload = (file: any) => {
|
||||
@ -371,7 +372,10 @@ const OrderProductManage: React.FC<{ currentUser: CurrentUser | undefined }> = (
|
||||
const data = await handeSyncSellerCommodityInfo({ list: [req] })
|
||||
handleConfirmLoading(false)
|
||||
if (data.Result_Code === 100) {
|
||||
console.log('currentRowcurrentRowcurrentRow', currentRow);
|
||||
|
||||
handleSetlogSave(`${currentRow?.COMMODITY_ID ? '更新' : '新增'}【${data.Result_Data?.COMMODITY_NAME}】成功`)
|
||||
handleUpdateCommodityList(JSON.parse(JSON.stringify(currentRow)))
|
||||
message.success("同步成功!")
|
||||
setCurrentRow(undefined)
|
||||
formRef?.current?.resetFields()
|
||||
@ -384,6 +388,17 @@ const OrderProductManage: React.FC<{ currentUser: CurrentUser | undefined }> = (
|
||||
}
|
||||
};
|
||||
|
||||
// 调用java的更新商户商品的方法
|
||||
const handleUpdateCommodityList = async (obj: any) => {
|
||||
const req: any = {
|
||||
serverpartshopId: obj.SERVERPARTSHOP_IDS,
|
||||
provinceCode: "530000"
|
||||
}
|
||||
const data = await handleNewJavasyncCommodityList(req)
|
||||
console.log('datadata', data);
|
||||
|
||||
}
|
||||
|
||||
// 上传商品图片
|
||||
const handleUploadShopImg = async (formRes: any) => {
|
||||
|
||||
@ -841,6 +856,12 @@ const OrderProductManage: React.FC<{ currentUser: CurrentUser | undefined }> = (
|
||||
label="商品图片"
|
||||
listType="picture-card"
|
||||
accept="image/*"
|
||||
rules={[
|
||||
{
|
||||
required: true,
|
||||
message: "请上传商品图片!"
|
||||
}
|
||||
]}
|
||||
fieldProps={{
|
||||
beforeUpload,
|
||||
maxCount: 1,
|
||||
|
||||
@ -0,0 +1,319 @@
|
||||
import { connect } from "umi";
|
||||
import type { ConnectState } from "@/models/connect";
|
||||
import { useImperativeHandle, useState } from "react";
|
||||
import ProTable from '@ant-design/pro-table';
|
||||
import { Button, Input, InputNumber, TreeSelect } from 'antd';
|
||||
import type { ProColumns } from '@ant-design/pro-table';
|
||||
|
||||
// 定义表格数据类型
|
||||
type TableDataType = {
|
||||
id: string | number;
|
||||
name?: string;
|
||||
barcode?: string;
|
||||
category?: string;
|
||||
unit?: string;
|
||||
specification?: string;
|
||||
price?: number;
|
||||
taxRate?: number;
|
||||
taxCode?: string;
|
||||
};
|
||||
|
||||
// 定义树形数据类型
|
||||
type TreeDataType = {
|
||||
USERDEFINEDTYPE_ID: string | number;
|
||||
USERDEFINEDTYPE_NAME: string;
|
||||
children?: TreeDataType[];
|
||||
};
|
||||
|
||||
type DetailProps = {
|
||||
leftTreeData?: TreeDataType[]
|
||||
onRef?: any
|
||||
};
|
||||
|
||||
const SelectSetMealItems = ({ leftTreeData, onRef }: DetailProps) => {
|
||||
// 判断用户是否点击了 添加套餐商品的按钮
|
||||
const [isClickAdd, setIsClickAdd] = useState<boolean>(false);
|
||||
// 表格数据
|
||||
const [tableData, setTableData] = useState<TableDataType[]>([
|
||||
{
|
||||
id: Date.now(),
|
||||
name: '',
|
||||
barcode: '',
|
||||
category: '',
|
||||
unit: '',
|
||||
specification: '',
|
||||
price: undefined,
|
||||
taxRate: undefined,
|
||||
taxCode: '',
|
||||
}
|
||||
]);
|
||||
|
||||
// 表格列定义
|
||||
const columns: ProColumns<TableDataType>[] = [
|
||||
{
|
||||
title: '商品名称',
|
||||
width: 250,
|
||||
align: 'center',
|
||||
dataIndex: 'name',
|
||||
render: (_, record: TableDataType) => (
|
||||
<Input
|
||||
style={{ width: '100%' }}
|
||||
value={record.name}
|
||||
placeholder="请输入商品名称"
|
||||
onChange={(e) => {
|
||||
const newData = tableData.map((item: TableDataType) => {
|
||||
if (item.id === record.id) {
|
||||
return { ...item, name: e.target.value };
|
||||
}
|
||||
return item;
|
||||
});
|
||||
setTableData(newData);
|
||||
}}
|
||||
/>
|
||||
),
|
||||
},
|
||||
{
|
||||
title: '条码',
|
||||
width: 150,
|
||||
align: 'center',
|
||||
dataIndex: 'barcode',
|
||||
render: (_, record: TableDataType) => (
|
||||
<Input
|
||||
style={{ width: '100%' }}
|
||||
value={record.barcode}
|
||||
placeholder="请输入商品条码"
|
||||
onChange={(e) => {
|
||||
const newData = tableData.map((item: TableDataType) => {
|
||||
if (item.id === record.id) {
|
||||
return { ...item, barcode: e.target.value };
|
||||
}
|
||||
return item;
|
||||
});
|
||||
setTableData(newData);
|
||||
}}
|
||||
/>
|
||||
),
|
||||
},
|
||||
{
|
||||
title: <div style={{ textAlign: 'center' }}>分类</div>,
|
||||
width: 250,
|
||||
align: 'left',
|
||||
dataIndex: 'category',
|
||||
render: (_, record: TableDataType) => (
|
||||
<TreeSelect
|
||||
treeData={leftTreeData}
|
||||
style={{ width: '100%' }}
|
||||
placeholder="请选择商品分类"
|
||||
value={record.category && record.category.length > 0 ? record.category : []}
|
||||
onChange={(e) => {
|
||||
const newData = tableData.map((item: TableDataType) => {
|
||||
if (item.id === record.id) {
|
||||
return { ...item, category: e };
|
||||
}
|
||||
return item;
|
||||
});
|
||||
setTableData(newData);
|
||||
}}
|
||||
fieldNames={{
|
||||
label: "USERDEFINEDTYPE_NAME",
|
||||
value: "USERDEFINEDTYPE_ID",
|
||||
children: "children"
|
||||
}}
|
||||
treeDefaultExpandAll
|
||||
showSearch
|
||||
allowClear
|
||||
multiple
|
||||
treeNodeFilterProp="USERDEFINEDTYPE_NAME"
|
||||
placeholder="请输入商品分类"
|
||||
/>
|
||||
),
|
||||
},
|
||||
{
|
||||
title: '单位',
|
||||
width: 120,
|
||||
align: 'center',
|
||||
dataIndex: 'unit',
|
||||
render: (_, record: TableDataType) => (
|
||||
<Input
|
||||
style={{ width: '100%' }}
|
||||
value={record.unit}
|
||||
placeholder="请输入商品单位"
|
||||
onChange={(e) => {
|
||||
const newData = tableData.map((item: TableDataType) => {
|
||||
if (item.id === record.id) {
|
||||
return { ...item, unit: e.target.value };
|
||||
}
|
||||
return item;
|
||||
});
|
||||
setTableData(newData);
|
||||
}}
|
||||
/>
|
||||
),
|
||||
},
|
||||
{
|
||||
title: '规格',
|
||||
width: 120,
|
||||
align: 'center',
|
||||
dataIndex: 'specification',
|
||||
render: (_, record: TableDataType) => (
|
||||
<Input
|
||||
style={{ width: '100%' }}
|
||||
value={record.specification}
|
||||
placeholder="请输入商品规格"
|
||||
onChange={(e) => {
|
||||
const newData = tableData.map((item: TableDataType) => {
|
||||
if (item.id === record.id) {
|
||||
return { ...item, specification: e.target.value };
|
||||
}
|
||||
return item;
|
||||
});
|
||||
setTableData(newData);
|
||||
}}
|
||||
/>
|
||||
),
|
||||
},
|
||||
{
|
||||
title: '价格',
|
||||
width: 120,
|
||||
align: 'center',
|
||||
dataIndex: 'price',
|
||||
render: (_, record: TableDataType) => (
|
||||
<InputNumber
|
||||
style={{ width: '100%' }}
|
||||
value={record.price}
|
||||
placeholder="请输入商品价格"
|
||||
onChange={(value) => {
|
||||
const newData = tableData.map((item: TableDataType) => {
|
||||
if (item.id === record.id) {
|
||||
return { ...item, price: value as number };
|
||||
}
|
||||
return item;
|
||||
});
|
||||
setTableData(newData);
|
||||
}}
|
||||
/>
|
||||
),
|
||||
},
|
||||
{
|
||||
title: '税率',
|
||||
width: 120,
|
||||
align: 'center',
|
||||
dataIndex: 'taxRate',
|
||||
render: (_, record: TableDataType) => (
|
||||
<InputNumber
|
||||
style={{ width: '100%' }}
|
||||
value={record.taxRate}
|
||||
placeholder="请输入商品税率"
|
||||
onChange={(value) => {
|
||||
const newData = tableData.map((item: TableDataType) => {
|
||||
if (item.id === record.id) {
|
||||
return { ...item, taxRate: value as number };
|
||||
}
|
||||
return item;
|
||||
});
|
||||
setTableData(newData);
|
||||
}}
|
||||
/>
|
||||
),
|
||||
},
|
||||
{
|
||||
title: '税务代码',
|
||||
width: 120,
|
||||
align: 'center',
|
||||
dataIndex: 'taxCode',
|
||||
render: (_, record: TableDataType) => (
|
||||
<Input
|
||||
style={{ width: '100%' }}
|
||||
value={record.taxCode}
|
||||
placeholder="请输入商品税务代码"
|
||||
onChange={(e) => {
|
||||
const newData = tableData.map((item: TableDataType) => {
|
||||
if (item.id === record.id) {
|
||||
return { ...item, taxCode: e.target.value };
|
||||
}
|
||||
return item;
|
||||
});
|
||||
setTableData(newData);
|
||||
}}
|
||||
/>
|
||||
),
|
||||
},
|
||||
{
|
||||
title: '操作',
|
||||
align: 'center',
|
||||
valueType: 'option',
|
||||
width: 60,
|
||||
render: (_, record: TableDataType) => [
|
||||
<a
|
||||
key="delete"
|
||||
onClick={() => {
|
||||
const newData = tableData.filter((item: TableDataType) => item.id !== record.id);
|
||||
setTableData(newData);
|
||||
}}
|
||||
>
|
||||
删除
|
||||
</a>,
|
||||
],
|
||||
},
|
||||
];
|
||||
|
||||
// 暴露表格数据
|
||||
useImperativeHandle(onRef, () => ({
|
||||
tableData
|
||||
}));
|
||||
return (
|
||||
<div>
|
||||
{
|
||||
isClickAdd ?
|
||||
<div>
|
||||
<ProTable
|
||||
rowKey="id"
|
||||
headerTitle="套餐商品"
|
||||
columns={columns}
|
||||
dataSource={tableData}
|
||||
pagination={false}
|
||||
search={false}
|
||||
options={false}
|
||||
bordered
|
||||
toolBarRender={() => [
|
||||
<Button
|
||||
key="add"
|
||||
type={'primary'}
|
||||
onClick={() => {
|
||||
const newData = {
|
||||
id: Date.now(),
|
||||
name: '',
|
||||
barcode: '',
|
||||
category: '',
|
||||
unit: '',
|
||||
specification: '',
|
||||
price: undefined,
|
||||
taxRate: undefined,
|
||||
taxCode: '',
|
||||
};
|
||||
setTableData([...tableData, newData]);
|
||||
}}
|
||||
>
|
||||
添加一行
|
||||
</Button>,
|
||||
<Button onClick={() => {
|
||||
setIsClickAdd(false)
|
||||
}}>
|
||||
取消
|
||||
</Button>
|
||||
]}
|
||||
/>
|
||||
</div> :
|
||||
<div style={{ width: '100%', display: 'flex', alignItems: 'center', justifyContent: 'flex-end' }}>
|
||||
<Button type={'primary'} onClick={() => {
|
||||
setIsClickAdd(true)
|
||||
}}>添加套餐商品</Button>
|
||||
</div>
|
||||
}
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
export default connect(({ user, }: ConnectState) => ({
|
||||
currentUser: user.currentUser,
|
||||
}))(SelectSetMealItems);
|
||||
@ -33,6 +33,7 @@ import { handlecsyncWeChatGetMallGoodsInfo, handlecsyncWeChatGetMallGoodsInfoAll
|
||||
import { isEqual } from 'lodash';
|
||||
import RelevanceCoupon from './component/RelevanceCoupon';
|
||||
import { handleGetCOUPONList } from '@/pages/CardInformation/service';
|
||||
import SelectSetMealItems from './component/SelectSetMealItems';
|
||||
|
||||
|
||||
const beforeUpload = (file: any) => {
|
||||
@ -51,6 +52,7 @@ const COMMODITYTable: React.FC<{ currentUser: CurrentUser | undefined }> = (prop
|
||||
const { currentUser } = props
|
||||
const { confirm } = Modal;
|
||||
const associatedCouponsModalRef = useRef<any>()
|
||||
const setSelectSetMealItemsRef = useRef<any>()
|
||||
const actionRef = useRef<ActionType>();
|
||||
const ruleActionRef = useRef<ActionType>();
|
||||
// 税率的表单
|
||||
@ -1504,7 +1506,6 @@ const COMMODITYTable: React.FC<{ currentUser: CurrentUser | undefined }> = (prop
|
||||
name="USERDEFINEDTYPE_ID"
|
||||
label="商品分类"
|
||||
request={async () => {
|
||||
|
||||
return leftTreeData
|
||||
}}
|
||||
fieldProps={{
|
||||
@ -1650,6 +1651,8 @@ const COMMODITYTable: React.FC<{ currentUser: CurrentUser | undefined }> = (prop
|
||||
label="商品简称"
|
||||
/>
|
||||
</Col>
|
||||
|
||||
|
||||
<Divider orientation="left">商品价值</Divider>
|
||||
<Col span={6}>
|
||||
<ProFormSelect
|
||||
@ -2053,6 +2056,11 @@ const COMMODITYTable: React.FC<{ currentUser: CurrentUser | undefined }> = (prop
|
||||
}}
|
||||
/>
|
||||
</Col>
|
||||
|
||||
{/* 若是一个套餐商品 那么这里就要有一个录入套餐商品的地方 */}
|
||||
<Col span={24}>
|
||||
<SelectSetMealItems onRef={setSelectSetMealItemsRef} leftTreeData={leftTreeData} />
|
||||
</Col>
|
||||
</Row>
|
||||
</ProForm>
|
||||
</Modal>
|
||||
|
||||
@ -59,7 +59,7 @@ const request = extend({
|
||||
errorHandler, // default error handling
|
||||
// prefix: '/EShangApiMain',// 开发
|
||||
prefix: 'https://java.es.eshangtech.com:443', // 正式
|
||||
// prefix: 'http://111.229.213.193:18071', // 正式
|
||||
// prefix: 'http://111.229.213.193:18071', // 测试
|
||||
headers: {
|
||||
token: '',
|
||||
ProvinceCode: '',
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
// 由 scripts/writeVersion.js 自动生成
|
||||
export const VERSION = "4.5.90";
|
||||
export const GIT_HASH = "e555058";
|
||||
export const BUILD_TIME = "2025-12-12T09:26:16.901Z";
|
||||
export const VERSION = "4.5.91";
|
||||
export const GIT_HASH = "24088d3";
|
||||
export const BUILD_TIME = "2025-12-16T11:26:58.433Z";
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user