diff --git a/config/routes.ts b/config/routes.ts index f42cdf2..67cd931 100644 --- a/config/routes.ts +++ b/config/routes.ts @@ -614,6 +614,11 @@ export default [ name: 'users', component: './Setting/Users/index', }, + { + path: '/setting/department/userstype', + name: 'userstype', + component: './Setting/UserType/index', + }, ] }, { diff --git a/dist.zip b/dist.zip index bd08bb6..bebda2f 100644 Binary files a/dist.zip and b/dist.zip differ diff --git a/package.json b/package.json index 0c761e4..0857a24 100644 --- a/package.json +++ b/package.json @@ -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": { diff --git a/src/pages/Setting/UserType/data.d.ts b/src/pages/Setting/UserType/data.d.ts new file mode 100644 index 0000000..7ab39c5 --- /dev/null +++ b/src/pages/Setting/UserType/data.d.ts @@ -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; // 备注说明 + +} diff --git a/src/pages/Setting/UserType/index.tsx b/src/pages/Setting/UserType/index.tsx new file mode 100644 index 0000000..701227d --- /dev/null +++ b/src/pages/Setting/UserType/index.tsx @@ -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 ( + + ); +}; + +const UserTypeList: React.FC<{ currentUser: CurrentUser | undefined }> = (props) => { + const { currentUser } = props + const actionRef = useRef(); + const formRef = useRef(); + const [showDetail, setShowDetail] = useState(false); // 是否显示详情 + const [currentRow, setCurrentRow] = useState(); // 当前选中行 + const [createModalVisible, handleModalVisible] = useState(false); // 发布分类更新窗口的弹窗 + + const [userTypeTree, setUserTypeTree] = useState<[]>(); // 树结构数据分类 用于弹出编辑时选择上级 + const [activeKey, setActiveKey] = useState(`${currentUser?.UserPattern===9000?'1000':currentUser?.UserPattern}`); // 树结构数据分类 用于弹出编辑时选择上级 + + // 查询可选商家 + const { data: merchantTree } = useRequest(async () => { + return await getMerchantTree({MerchantPid:currentUser?.BusinessManID||''}) + }) + // 查询可选商家 + const {loading: typeCountLoading,data: typeCount } = useRequest(getUserTypeCount) + + // 表格数据配置 + const columns: ProColumns[] = [ + { + title: '分类名称', + dataIndex: 'USERTYPE_NAME', + hideInDescriptions: true, + render: (_, record) => { + + return { + setCurrentRow(record) + setShowDetail(true) + }}>{record?.USERTYPE_NAME} + } + }, + { + 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) => [ + { + + handleModalVisible(true); + if (showDetail) { + setShowDetail(false); + } + + setCurrentRow({ ...record }); + }} + > + 编辑 + , + // { + // if (record) { + // const { USERTYPE_ID } = record + // const success = (USERTYPE_ID ? await handleDelete(USERTYPE_ID) : false) + // if (success) { + // if (actionRef.current) { + // actionRef.current.reload(); + // } + // } + // } + // }} + // > + // 无效 + // + ] + } + + ] + + return ( + + + + 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: [ + , + ], + menu: { + type: 'tab', + activeKey, + items: currentUser?.UserPattern===9000 ? [ + { + key: '1000', + label: 业主{renderBadge(!typeCountLoading ? typeCount?.OwnerUnitCount: '', activeKey === '1000')}, + }, + { + key: '4000', + label: 供应商{renderBadge(!typeCountLoading ?typeCount?.SupplierCount:'', activeKey === '4000')}, + }, + { + key: '2000', + label: 商户{renderBadge(!typeCountLoading ?typeCount?.MerchantCount:'', activeKey === '2000')}, + } + ]:currentUser?.UserPattern===1000 ?[ + { + key: '1000', + label: 业主{renderBadge(!typeCountLoading ? typeCount?.OwnerUnitCount: '', activeKey === '1000')}, + }, + { + key: '4000', + label: 供应商{renderBadge(!typeCountLoading ?typeCount?.SupplierCount:'', activeKey === '4000')}, + }, + ]:[], + onChange: (key) => { + setActiveKey(key as string); + }, + }, + }} + pagination={{ defaultPageSize: 10 }} + /> + + {/* 编辑新增分类弹出框 */} + { + 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 + }} + > + + + + + + + {activeKey === '1000' ||activeKey === '4000' + ? { + const options = await getOnwer() + return options; + }} + fieldProps={{ + fieldNames: { + title: 'label', + // key: "value" + }, + + }} + />:''} + {activeKey === '2000' && + + + } + {/* */} + + + + + + + + + + {/* 分类详情 */} + { + setCurrentRow(undefined); + setShowDetail(false); + }} + closable={false} + > + {currentRow?.USERTYPE_NAME && ( + + column={1} + title={currentRow?.USERTYPE_NAME} + request={async () => ({ + data: currentRow || {}, + })} + params={{ + id: currentRow?.USERTYPE_ID, + }} + columns={columns as ProDescriptionsItemProps[]} + /> + )} + + + ) +} + +export default connect(({ user }: ConnectState) => ({ + currentUser: user.currentUser, + +}))(UserTypeList); + diff --git a/src/pages/Setting/UserType/service.ts b/src/pages/Setting/UserType/service.ts new file mode 100644 index 0000000..624a04b --- /dev/null +++ b/src/pages/Setting/UserType/service.ts @@ -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 */ + diff --git a/src/pages/Setting/Users/components/edit.tsx b/src/pages/Setting/Users/components/edit.tsx index 9414695..dd1986f 100644 --- a/src/pages/Setting/Users/components/edit.tsx +++ b/src/pages/Setting/Users/components/edit.tsx @@ -50,7 +50,7 @@ const handelResetPassWord = async (item: { UserId: number, Password: string }) = /** * @description: 主体编辑函数 * @param {function} reloadTable 是否已经更新数据 - * @param {UserModel} detail 编辑账户数据时的数据对象 + * @param {UserModel} detail 编辑账户数据时的数据对象 * @param {CurrentUser} user 当前用户的用户信息 * @return {ReactDOM} 返回页面节点 */ @@ -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) diff --git a/src/pages/Setting/Users/index.tsx b/src/pages/Setting/Users/index.tsx index 6ddf45b..969ecda 100644 --- a/src/pages/Setting/Users/index.tsx +++ b/src/pages/Setting/Users/index.tsx @@ -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" diff --git a/src/pages/User/login/index.tsx b/src/pages/User/login/index.tsx index 920046d..05fe4be 100644 --- a/src/pages/User/login/index.tsx +++ b/src/pages/User/login/index.tsx @@ -121,19 +121,19 @@ const Login: React.FC = (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) diff --git a/src/pages/User/login/service.ts b/src/pages/User/login/service.ts index 5effbd8..aa3838b 100644 --- a/src/pages/User/login/service.ts +++ b/src/pages/User/login/service.ts @@ -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 } \ No newline at end of file diff --git a/src/pages/travelMember/AfterSalesManage/index.tsx b/src/pages/travelMember/AfterSalesManage/index.tsx index 2fdf092..a1ff989 100644 --- a/src/pages/travelMember/AfterSalesManage/index.tsx +++ b/src/pages/travelMember/AfterSalesManage/index.tsx @@ -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 ( = (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={ { + handleConfirmLoading(true) await handelDelete(currentRow?.FIELDENUM_ID) }} handleCancel={() => { @@ -421,14 +439,15 @@ const AfterSalesManage: React.FC<{ currentUser: CurrentUser | undefined }> = (pr }} > - {/* + { 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 } ]} /> - */} + = (pr ]} /> - + {/* = (pr } ]} /> - + */} = (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 (
@@ -253,7 +266,7 @@ const HomepageAds: React.FC<{ currentUser: CurrentUser | undefined }> = (props) { selectTab === "1" ? = (props) { selectTab === "2" ? = (props) }} footer={ { + handleConfirmLoading(true) await handelDelete(currentRow?.USERDEFINEDTYPE_ID) }} handleCancel={() => { @@ -483,7 +498,32 @@ const HomepageAds: React.FC<{ currentUser: CurrentUser | undefined }> = (props) initialValue={1000} /> + {/* 这个字段暂时用来 判断跳转小程序分类页面的 哪个分类 */} + { + 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, + }} + /> + + { @@ -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, diff --git a/src/pages/travelMember/ProductListingManagement/component/SelectSetMealItems.tsx b/src/pages/travelMember/ProductListingManagement/component/SelectSetMealItems.tsx new file mode 100644 index 0000000..41b8e63 --- /dev/null +++ b/src/pages/travelMember/ProductListingManagement/component/SelectSetMealItems.tsx @@ -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(false); + // 表格数据 + const [tableData, setTableData] = useState([ + { + id: Date.now(), + name: '', + barcode: '', + category: '', + unit: '', + specification: '', + price: undefined, + taxRate: undefined, + taxCode: '', + } + ]); + + // 表格列定义 + const columns: ProColumns[] = [ + { + title: '商品名称', + width: 250, + align: 'center', + dataIndex: 'name', + render: (_, record: TableDataType) => ( + { + 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) => ( + { + const newData = tableData.map((item: TableDataType) => { + if (item.id === record.id) { + return { ...item, barcode: e.target.value }; + } + return item; + }); + setTableData(newData); + }} + /> + ), + }, + { + title:
分类
, + width: 250, + align: 'left', + dataIndex: 'category', + render: (_, record: TableDataType) => ( + 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) => ( + { + 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) => ( + { + 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) => ( + { + 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) => ( + { + 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) => ( + { + 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) => [ + { + const newData = tableData.filter((item: TableDataType) => item.id !== record.id); + setTableData(newData); + }} + > + 删除 + , + ], + }, + ]; + + // 暴露表格数据 + useImperativeHandle(onRef, () => ({ + tableData + })); + return ( +
+ { + isClickAdd ? +
+ [ + , + + ]} + /> +
: +
+ +
+ } +
+ ) +} + +export default connect(({ user, }: ConnectState) => ({ + currentUser: user.currentUser, +}))(SelectSetMealItems); \ No newline at end of file diff --git a/src/pages/travelMember/ProductListingManagement/index.tsx b/src/pages/travelMember/ProductListingManagement/index.tsx index a618f77..35c7bd2 100644 --- a/src/pages/travelMember/ProductListingManagement/index.tsx +++ b/src/pages/travelMember/ProductListingManagement/index.tsx @@ -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() + const setSelectSetMealItemsRef = useRef() const actionRef = useRef(); const ruleActionRef = useRef(); // 税率的表单 @@ -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="商品简称" /> + + 商品价值 = (prop }} /> + + {/* 若是一个套餐商品 那么这里就要有一个录入套餐商品的地方 */} + + + diff --git a/src/utils/requestNewJava.ts b/src/utils/requestNewJava.ts index f92663d..45cc344 100644 --- a/src/utils/requestNewJava.ts +++ b/src/utils/requestNewJava.ts @@ -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: '', diff --git a/src/versionEnv.ts b/src/versionEnv.ts index 6a6d00d..45e93a5 100644 --- a/src/versionEnv.ts +++ b/src/versionEnv.ts @@ -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";