上架商品压缩图片功能添加

This commit is contained in:
ylj20011123 2025-12-19 16:40:40 +08:00
parent ee6fa92adc
commit 1f17ff805d
11 changed files with 461 additions and 208 deletions

View File

@ -1,6 +1,6 @@
{ {
"name": "ant-design-pro", "name": "ant-design-pro",
"version": "4.5.91", "version": "4.5.92",
"private": true, "private": true,
"description": "An out-of-box UI solution for enterprise applications", "description": "An out-of-box UI solution for enterprise applications",
"scripts": { "scripts": {

View File

@ -57,7 +57,7 @@ const handleDelete = async (nodeId: number) => {
hide(); hide();
if (result.Result_Code !== 100) { if (result.Result_Code !== 100) {
message.error(`${result.Result_Code }:${result.Result_Desc}`) message.error(`${result.Result_Code}:${result.Result_Desc}`)
return false return false
} }
message.success("删除成功!") message.success("删除成功!")
@ -93,14 +93,14 @@ const UserTypeList: React.FC<{ currentUser: CurrentUser | undefined }> = (props)
const [createModalVisible, handleModalVisible] = useState<boolean>(false); // 发布分类更新窗口的弹窗 const [createModalVisible, handleModalVisible] = useState<boolean>(false); // 发布分类更新窗口的弹窗
const [userTypeTree, setUserTypeTree] = useState<[]>(); // 树结构数据分类 用于弹出编辑时选择上级 const [userTypeTree, setUserTypeTree] = useState<[]>(); // 树结构数据分类 用于弹出编辑时选择上级
const [activeKey, setActiveKey] = useState<React.Key>(`${currentUser?.UserPattern===9000?'1000':currentUser?.UserPattern}`); // 树结构数据分类 用于弹出编辑时选择上级 const [activeKey, setActiveKey] = useState<React.Key>(`${currentUser?.UserPattern === 9000 ? '1000' : currentUser?.UserPattern}`); // 树结构数据分类 用于弹出编辑时选择上级
// 查询可选商家 // 查询可选商家
const { data: merchantTree } = useRequest(async () => { const { data: merchantTree } = useRequest(async () => {
return await getMerchantTree({MerchantPid:currentUser?.BusinessManID||''}) return await getMerchantTree({ MerchantPid: currentUser?.BusinessManID || '' })
}) })
// 查询可选商家 // 查询可选商家
const {loading: typeCountLoading,data: typeCount } = useRequest(getUserTypeCount) const { loading: typeCountLoading, data: typeCount } = useRequest(getUserTypeCount)
// 表格数据配置 <UserTypeModel|SystemMenuModel> // 表格数据配置 <UserTypeModel|SystemMenuModel>
const columns: ProColumns<UserTypeModel>[] = [ const columns: ProColumns<UserTypeModel>[] = [
@ -134,7 +134,7 @@ const UserTypeList: React.FC<{ currentUser: CurrentUser | undefined }> = (props)
title: '所属业主', title: '所属业主',
dataIndex: 'USERTYPE_PROVINCE', dataIndex: 'USERTYPE_PROVINCE',
hideInSearch: true, hideInSearch: true,
hideInTable: activeKey==='2000', hideInTable: activeKey === '2000',
valueType: "select", valueType: "select",
request: async () => { request: async () => {
const options = await getOnwer() const options = await getOnwer()
@ -145,7 +145,7 @@ const UserTypeList: React.FC<{ currentUser: CurrentUser | undefined }> = (props)
title: '所属商户', title: '所属商户',
dataIndex: 'USERTYPE_PROVINCE', dataIndex: 'USERTYPE_PROVINCE',
hideInSearch: true, hideInSearch: true,
hideInTable: activeKey==='1000', hideInTable: activeKey === '1000',
valueType: "treeSelect", valueType: "treeSelect",
fieldProps: { fieldProps: {
options: merchantTree options: merchantTree
@ -210,17 +210,16 @@ const UserTypeList: React.FC<{ currentUser: CurrentUser | undefined }> = (props)
}}> }}>
<ProTable<UserTypeModel> <ProTable<UserTypeModel>
rowKey="USERTYPE_ID" rowKey="USERTYPE_ID"
actionRef={actionRef} actionRef={actionRef}
request={async (params) => { request={async (params) => {
console.log('params',params) console.log('params', params)
const data = await getUserTypeList({ ...params }) const data = await getUserTypeList({ ...params })
setUserTypeTree(data) setUserTypeTree(data)
return { data, success: true } return { data, success: true }
}} }}
search={false} search={false}
params={{ UserTypePattern: activeKey }} params={{ UserTypePattern: activeKey, ShowStatus: true }}
columns={columns} columns={columns}
toolbar={{ toolbar={{
actions: [ actions: [
@ -236,29 +235,29 @@ const UserTypeList: React.FC<{ currentUser: CurrentUser | undefined }> = (props)
menu: { menu: {
type: 'tab', type: 'tab',
activeKey, activeKey,
items: currentUser?.UserPattern===9000 ? [ items: currentUser?.UserPattern === 9000 ? [
{ {
key: '1000', key: '1000',
label: <span>{renderBadge(!typeCountLoading ? typeCount?.OwnerUnitCount: '', activeKey === '1000')}</span>, label: <span>{renderBadge(!typeCountLoading ? typeCount?.OwnerUnitCount : '', activeKey === '1000')}</span>,
}, },
{ {
key: '4000', key: '4000',
label: <span>{renderBadge(!typeCountLoading ?typeCount?.SupplierCount:'', activeKey === '4000')}</span>, label: <span>{renderBadge(!typeCountLoading ? typeCount?.SupplierCount : '', activeKey === '4000')}</span>,
}, },
{ {
key: '2000', key: '2000',
label: <span>{renderBadge(!typeCountLoading ?typeCount?.MerchantCount:'', activeKey === '2000')}</span>, label: <span>{renderBadge(!typeCountLoading ? typeCount?.MerchantCount : '', activeKey === '2000')}</span>,
} }
]:currentUser?.UserPattern===1000 ?[ ] : currentUser?.UserPattern === 1000 ? [
{ {
key: '1000', key: '1000',
label: <span>{renderBadge(!typeCountLoading ? typeCount?.OwnerUnitCount: '', activeKey === '1000')}</span>, label: <span>{renderBadge(!typeCountLoading ? typeCount?.OwnerUnitCount : '', activeKey === '1000')}</span>,
}, },
{ {
key: '4000', key: '4000',
label: <span>{renderBadge(!typeCountLoading ?typeCount?.SupplierCount:'', activeKey === '4000')}</span>, label: <span>{renderBadge(!typeCountLoading ? typeCount?.SupplierCount : '', activeKey === '4000')}</span>,
}, },
]:[], ] : [],
onChange: (key) => { onChange: (key) => {
setActiveKey(key as string); setActiveKey(key as string);
}, },
@ -283,7 +282,7 @@ const UserTypeList: React.FC<{ currentUser: CurrentUser | undefined }> = (props)
currentRow ? { currentRow ? {
...currentRow, USERTYPE_STATUS: !!currentRow.USERTYPE_STATUS, ...currentRow, USERTYPE_STATUS: !!currentRow.USERTYPE_STATUS,
USERTYPE_PID: currentRow.USERTYPE_PID !== -1 ? currentRow.USERTYPE_PID : '' USERTYPE_PID: currentRow.USERTYPE_PID !== -1 ? currentRow.USERTYPE_PID : ''
} : { USERTYPE_STATUS: 1,USERTYPE_PATTERN:activeKey }, } : { USERTYPE_STATUS: 1, USERTYPE_PATTERN: activeKey },
); );
} else { } else {
formRef.current?.resetFields(); formRef.current?.resetFields();
@ -291,7 +290,7 @@ const UserTypeList: React.FC<{ currentUser: CurrentUser | undefined }> = (props)
} }
}} }}
onFinish={async (value) => { onFinish={async (value) => {
let newValue: any = { ...value , USERTYPE_PATTERN:activeKey} let newValue: any = { ...value, USERTYPE_PATTERN: activeKey }
if (currentRow) { // 编辑数据 if (currentRow) { // 编辑数据
newValue = { ...currentRow, ...newValue } newValue = { ...currentRow, ...newValue }
} }
@ -339,8 +338,8 @@ const UserTypeList: React.FC<{ currentUser: CurrentUser | undefined }> = (props)
> >
</TreeSelect > </TreeSelect >
</Form.Item> </Form.Item>
{activeKey === '1000' ||activeKey === '4000' {activeKey === '1000' || activeKey === '4000'
?<ProFormSelect ? <ProFormSelect
name="USERTYPE_PROVINCE" name="USERTYPE_PROVINCE"
label="业主单位" label="业主单位"
placeholder="请选择业主单位" placeholder="请选择业主单位"
@ -361,7 +360,7 @@ const UserTypeList: React.FC<{ currentUser: CurrentUser | undefined }> = (props)
}, },
}} }}
/>:''} /> : ''}
{activeKey === '2000' && {activeKey === '2000' &&
<Form.Item <Form.Item
name="USERTYPE_PROVINCE" name="USERTYPE_PROVINCE"

View File

@ -508,7 +508,8 @@ const HomepageAds: React.FC<{ currentUser: CurrentUser | undefined }> = (props)
OWNERUNIT_ID: currentUser?.OwnerUnitId, OWNERUNIT_ID: currentUser?.OwnerUnitId,
PROVINCE_CODE: "", PROVINCE_CODE: "",
GOODSTYPE: 4000, GOODSTYPE: 4000,
USERDEFINEDTYPE_STATE: 1 USERDEFINEDTYPE_STATE: 1,
SCANCODE_ORDER: 1
} }
const data = await handlGetUSERDEFINEDTYPEList(req); const data = await handlGetUSERDEFINEDTYPEList(req);
return data return data

View File

@ -474,7 +474,8 @@ const OrderCategoryManage: React.FC<{ currentUser: CurrentUser | undefined }> =
preserve={false} preserve={false}
initialValues={currentRow ? { initialValues={currentRow ? {
...currentRow, ...currentRow,
PRESALE_TIME: currentRow?.PRESALE_TYPE ? [currentRow?.PRESALE_STARTTIME, currentRow?.PRESALE_ENDTIME] : "" PRESALE_TIME: currentRow?.PRESALE_TYPE ? [currentRow?.PRESALE_STARTTIME, currentRow?.PRESALE_ENDTIME] : "",
USERDEFINEDTYPE_DATE: moment(currentRow?.USERDEFINEDTYPE_DATE).format('YYYY-MM-DD HH:mm:ss'),
} : { } : {
USERDEFINEDTYPE_STATE: 1, USERDEFINEDTYPE_STATE: 1,
USERDEFINEDTYPE_DATE: moment().format('YYYY-MM-DD HH:mm:ss'), USERDEFINEDTYPE_DATE: moment().format('YYYY-MM-DD HH:mm:ss'),

View File

@ -50,10 +50,11 @@ const LeftSelectMallType = ({ setSelectedId, reload, actionRef, currentUser, wid
return USERDEFINEDTYPEList return USERDEFINEDTYPEList
} else { } else {
const req = { const req = {
OWNERUNIT_ID: currentUser?.OwnerUnitId, OWNERUNIT_ID: '911',
PROVINCE_CODE: "", PROVINCE_CODE: "",
GOODSTYPE: 4000, GOODSTYPE: 4000,
USERDEFINEDTYPE_STATE: 1 USERDEFINEDTYPE_STATE: 1,
SCANCODE_ORDER: 1
} }
const data = await handlGetUSERDEFINEDTYPEList(req); const data = await handlGetUSERDEFINEDTYPEList(req);
setTreeView(data) setTreeView(data)

View File

@ -5,18 +5,7 @@ import ProTable from '@ant-design/pro-table';
import { Button, Input, InputNumber, TreeSelect } from 'antd'; import { Button, Input, InputNumber, TreeSelect } from 'antd';
import type { ProColumns } from '@ant-design/pro-table'; 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 = { type TreeDataType = {
@ -28,42 +17,31 @@ type TreeDataType = {
type DetailProps = { type DetailProps = {
leftTreeData?: TreeDataType[] leftTreeData?: TreeDataType[]
onRef?: any onRef?: any
comboCommodityDetail?: any // 查询到的套餐数据
}; };
const SelectSetMealItems = ({ leftTreeData, onRef }: DetailProps) => { const SelectSetMealItems = ({ leftTreeData, onRef, comboCommodityDetail }: DetailProps) => {
// 判断用户是否点击了 添加套餐商品的按钮 // 判断用户是否点击了 添加套餐商品的按钮
const [isClickAdd, setIsClickAdd] = useState<boolean>(false); const [isClickAdd, setIsClickAdd] = useState<boolean>(comboCommodityDetail && comboCommodityDetail.length > 0 ? true : false);
// 表格数据 // 表格数据
const [tableData, setTableData] = useState<TableDataType[]>([ const [tableData, setTableData] = useState<any>(comboCommodityDetail && comboCommodityDetail.length > 0 ? comboCommodityDetail : []);
{
id: Date.now(),
name: '',
barcode: '',
category: '',
unit: '',
specification: '',
price: undefined,
taxRate: undefined,
taxCode: '',
}
]);
// 表格列定义 // 表格列定义
const columns: ProColumns<TableDataType>[] = [ const columns: any = [
{ {
title: '商品名称', title: '商品名称',
width: 250, width: 250,
align: 'center', align: 'center',
dataIndex: 'name', dataIndex: 'COMMODITY_NAME',
render: (_, record: TableDataType) => ( render: (_, record: any) => (
<Input <Input
style={{ width: '100%' }} style={{ width: '100%' }}
value={record.name} value={record.COMMODITY_NAME}
placeholder="请输入商品名称" placeholder="请输入商品名称"
onChange={(e) => { onChange={(e) => {
const newData = tableData.map((item: TableDataType) => { const newData = tableData.map((item: any) => {
if (item.id === record.id) { if (item.id === record.id) {
return { ...item, name: e.target.value }; return { ...item, COMMODITY_NAME: e.target.value };
} }
return item; return item;
}); });
@ -76,16 +54,16 @@ const SelectSetMealItems = ({ leftTreeData, onRef }: DetailProps) => {
title: '条码', title: '条码',
width: 150, width: 150,
align: 'center', align: 'center',
dataIndex: 'barcode', dataIndex: 'COMMODITY_BARCODE',
render: (_, record: TableDataType) => ( render: (_, record: any) => (
<Input <Input
style={{ width: '100%' }} style={{ width: '100%' }}
value={record.barcode} value={record.COMMODITY_BARCODE}
placeholder="请输入商品条码" placeholder="请输入商品条码"
onChange={(e) => { onChange={(e) => {
const newData = tableData.map((item: TableDataType) => { const newData = tableData.map((item: any) => {
if (item.id === record.id) { if (item.id === record.id) {
return { ...item, barcode: e.target.value }; return { ...item, COMMODITY_BARCODE: e.target.value };
} }
return item; return item;
}); });
@ -94,54 +72,54 @@ const SelectSetMealItems = ({ leftTreeData, onRef }: DetailProps) => {
/> />
), ),
}, },
{ // {
title: <div style={{ textAlign: 'center' }}></div>, // title: <div style={{ textAlign: 'center' }}>分类</div>,
width: 250, // width: 250,
align: 'left', // align: 'left',
dataIndex: 'category', // dataIndex: 'USERDEFINEDTYPE_ID',
render: (_, record: TableDataType) => ( // render: (_, record: any) => (
<TreeSelect // <TreeSelect
treeData={leftTreeData} // treeData={leftTreeData}
style={{ width: '100%' }} // style={{ width: '100%' }}
placeholder="请选择商品分类" // placeholder="请选择商品分类"
value={record.category && record.category.length > 0 ? record.category : []} // value={record.USERDEFINEDTYPE_ID && record.USERDEFINEDTYPE_ID.length > 0 ? record.USERDEFINEDTYPE_ID : []}
onChange={(e) => { // onChange={(e) => {
const newData = tableData.map((item: TableDataType) => { // const newData = tableData.map((item: any) => {
if (item.id === record.id) { // if (item.id === record.id) {
return { ...item, category: e }; // return { ...item, USERDEFINEDTYPE_ID: e };
} // }
return item; // return item;
}); // });
setTableData(newData); // setTableData(newData);
}} // }}
fieldNames={{ // fieldNames={{
label: "USERDEFINEDTYPE_NAME", // label: "USERDEFINEDTYPE_NAME",
value: "USERDEFINEDTYPE_ID", // value: "USERDEFINEDTYPE_ID",
children: "children" // children: "children"
}} // }}
treeDefaultExpandAll // treeDefaultExpandAll
showSearch // showSearch
allowClear // allowClear
multiple // multiple
treeNodeFilterProp="USERDEFINEDTYPE_NAME" // treeNodeFilterProp="USERDEFINEDTYPE_NAME"
placeholder="请输入商品分类" // placeholder="请输入商品分类"
/> // />
), // ),
}, // },
{ {
title: '单位', title: '单位',
width: 120, width: 120,
align: 'center', align: 'center',
dataIndex: 'unit', dataIndex: 'COMMODITY_UNIT',
render: (_, record: TableDataType) => ( render: (_, record: any) => (
<Input <Input
style={{ width: '100%' }} style={{ width: '100%' }}
value={record.unit} value={record.COMMODITY_UNIT}
placeholder="请输入商品单位" placeholder="请输入商品单位"
onChange={(e) => { onChange={(e) => {
const newData = tableData.map((item: TableDataType) => { const newData = tableData.map((item: any) => {
if (item.id === record.id) { if (item.id === record.id) {
return { ...item, unit: e.target.value }; return { ...item, COMMODITY_UNIT: e.target.value };
} }
return item; return item;
}); });
@ -154,16 +132,16 @@ const SelectSetMealItems = ({ leftTreeData, onRef }: DetailProps) => {
title: '规格', title: '规格',
width: 120, width: 120,
align: 'center', align: 'center',
dataIndex: 'specification', dataIndex: 'COMMODITY_RULE',
render: (_, record: TableDataType) => ( render: (_, record: any) => (
<Input <Input
style={{ width: '100%' }} style={{ width: '100%' }}
value={record.specification} value={record.COMMODITY_RULE}
placeholder="请输入商品规格" placeholder="请输入商品规格"
onChange={(e) => { onChange={(e) => {
const newData = tableData.map((item: TableDataType) => { const newData = tableData.map((item: any) => {
if (item.id === record.id) { if (item.id === record.id) {
return { ...item, specification: e.target.value }; return { ...item, COMMODITY_RULE: e.target.value };
} }
return item; return item;
}); });
@ -173,19 +151,19 @@ const SelectSetMealItems = ({ leftTreeData, onRef }: DetailProps) => {
), ),
}, },
{ {
title: '', title: '市场价',
width: 120, width: 120,
align: 'center', align: 'center',
dataIndex: 'price', dataIndex: 'COMMODITY_RETAILPRICE',
render: (_, record: TableDataType) => ( render: (_, record: any) => (
<InputNumber <InputNumber
style={{ width: '100%' }} style={{ width: '100%' }}
value={record.price} value={record.COMMODITY_RETAILPRICE}
placeholder="请输入商品价格" placeholder="请输入市场价"
onChange={(value) => { onChange={(value) => {
const newData = tableData.map((item: TableDataType) => { const newData = tableData.map((item: any) => {
if (item.id === record.id) { if (item.id === record.id) {
return { ...item, price: value as number }; return { ...item, COMMODITY_RETAILPRICE: value as number };
} }
return item; return item;
}); });
@ -194,20 +172,65 @@ const SelectSetMealItems = ({ leftTreeData, onRef }: DetailProps) => {
/> />
), ),
}, },
{
title: '零售价格',
width: 120,
align: 'center',
dataIndex: 'COMMODITY_MEMBERPRICE',
render: (_, record: any) => (
<InputNumber
style={{ width: '100%' }}
value={record.COMMODITY_MEMBERPRICE}
placeholder="请输入零售价格"
onChange={(value) => {
const newData = tableData.map((item: any) => {
if (item.id === record.id) {
return { ...item, COMMODITY_MEMBERPRICE: value as number };
}
return item;
});
setTableData(newData);
}}
/>
),
},
{
title: '商品成本',
width: 120,
align: 'center',
dataIndex: 'COMMODITY_PURCHASEPRICE',
render: (_, record: any) => (
<InputNumber
style={{ width: '100%' }}
value={record.COMMODITY_PURCHASEPRICE}
placeholder="请输入商品成本"
onChange={(value) => {
const newData = tableData.map((item: any) => {
if (item.id === record.id) {
return { ...item, COMMODITY_PURCHASEPRICE: value as number };
}
return item;
});
setTableData(newData);
}}
/>
),
},
{ {
title: '税率', title: '税率',
width: 120, width: 120,
align: 'center', align: 'center',
dataIndex: 'taxRate', dataIndex: 'DUTY_PARAGRAPH',
render: (_, record: TableDataType) => ( render: (_, record: any) => (
<InputNumber <InputNumber
style={{ width: '100%' }} style={{ width: '100%' }}
value={record.taxRate} value={record.DUTY_PARAGRAPH}
placeholder="请输入商品税率" placeholder="请输入商品税率"
onChange={(value) => { onChange={(value) => {
const newData = tableData.map((item: TableDataType) => { const newData = tableData.map((item: any) => {
if (item.id === record.id) { if (item.id === record.id) {
return { ...item, taxRate: value as number }; return { ...item, DUTY_PARAGRAPH: value as number };
} }
return item; return item;
}); });
@ -220,16 +243,16 @@ const SelectSetMealItems = ({ leftTreeData, onRef }: DetailProps) => {
title: '税务代码', title: '税务代码',
width: 120, width: 120,
align: 'center', align: 'center',
dataIndex: 'taxCode', dataIndex: 'TAX_CODE',
render: (_, record: TableDataType) => ( render: (_, record: any) => (
<Input <Input
style={{ width: '100%' }} style={{ width: '100%' }}
value={record.taxCode} value={record.TAX_CODE}
placeholder="请输入商品税务代码" placeholder="请输入商品税务代码"
onChange={(e) => { onChange={(e) => {
const newData = tableData.map((item: TableDataType) => { const newData = tableData.map((item: any) => {
if (item.id === record.id) { if (item.id === record.id) {
return { ...item, taxCode: e.target.value }; return { ...item, TAX_CODE: e.target.value };
} }
return item; return item;
}); });
@ -243,11 +266,11 @@ const SelectSetMealItems = ({ leftTreeData, onRef }: DetailProps) => {
align: 'center', align: 'center',
valueType: 'option', valueType: 'option',
width: 60, width: 60,
render: (_, record: TableDataType) => [ render: (_, record: any) => [
<a <a
key="delete" key="delete"
onClick={() => { onClick={() => {
const newData = tableData.filter((item: TableDataType) => item.id !== record.id); const newData = tableData.filter((item: any) => item.id !== record.id);
setTableData(newData); setTableData(newData);
}} }}
> >
@ -282,14 +305,6 @@ const SelectSetMealItems = ({ leftTreeData, onRef }: DetailProps) => {
onClick={() => { onClick={() => {
const newData = { const newData = {
id: Date.now(), id: Date.now(),
name: '',
barcode: '',
category: '',
unit: '',
specification: '',
price: undefined,
taxRate: undefined,
taxCode: '',
}; };
setTableData([...tableData, newData]); setTableData([...tableData, newData]);
}} }}

View File

@ -24,9 +24,10 @@ import { getFieldEnumTree, getFieldEnumName } from "@/services/options"; // 枚
import { getList, delcommodity, updatecommodity } from './service'; // 接口相关对象的引用 import { getList, delcommodity, updatecommodity } from './service'; // 接口相关对象的引用
import PageTitleBox from "@/components/PageTitleBox"; import PageTitleBox from "@/components/PageTitleBox";
import LeftSelectMallType from './component/LeftSelectMallType'; import LeftSelectMallType from './component/LeftSelectMallType';
import { handeDeleteCOMMODITY, handeDeleteRTCOMMODITY_MULTI, handeGetCOMMODITY_MULTIList, handeGetCOMMODITYDetail, handeGetCOMMODITYList, handeGetMERCHANTSList, handeGetRTCOMMODITY_MULTIList, handeSetCommodityState, handeSetGoodsDutyParagraph, handeSynchroCOMMODITY, handeSynchroRTCOMMODITYMULTIList, handleGetBRANDList, handlGetUSERDEFINEDTYPEList } from '../service'; import { handeDeleteCOMMODITY, handeDeleteRTCOMMODITY_MULTI, handeGetComboCommodityDetail, handeGetCOMMODITY_MULTIList, handeGetCOMMODITYDetail, handeGetCOMMODITYList, handeGetMERCHANTSList, handeGetRTCOMMODITY_MULTIList, handeSetCommodityState, handeSetGoodsDutyParagraph, handeSyncComboCommodity, handeSynchroCOMMODITY, handeSynchroRTCOMMODITYMULTIList, handleGetBRANDList, handlGetUSERDEFINEDTYPEList } from '../service';
import session from '@/utils/session'; import session from '@/utils/session';
import { deleteAHYDPicture, deletePicture, uploadAHYDPicture, uploadPicture } from '@/services/picture'; import { deleteAHYDPicture, deletePicture, uploadAHYDPicture, uploadPicture } from '@/services/picture';
import { resizeImageHalf } from '@/utils/resizeImageHalf';
import { exportXlsxFromProColumnsExcelJS, formatTreeData, handleSetlogSave } from '@/utils/format'; import { exportXlsxFromProColumnsExcelJS, formatTreeData, handleSetlogSave } from '@/utils/format';
import { highlightText } from '@/utils/highlightText'; import { highlightText } from '@/utils/highlightText';
import { handlecsyncWeChatGetMallGoodsInfo, handlecsyncWeChatGetMallGoodsInfoAll } from '@/pages/operatingMerchants/service'; import { handlecsyncWeChatGetMallGoodsInfo, handlecsyncWeChatGetMallGoodsInfoAll } from '@/pages/operatingMerchants/service';
@ -117,6 +118,8 @@ const COMMODITYTable: React.FC<{ currentUser: CurrentUser | undefined }> = (prop
const [rateLoading, setRateLoading] = useState<boolean>(false) const [rateLoading, setRateLoading] = useState<boolean>(false)
// 点开的商品详情信息 // 点开的商品详情信息
const [currentRowDetail, setCurrentRowDetail] = useState<any>() const [currentRowDetail, setCurrentRowDetail] = useState<any>()
// 套餐商品数据
const [comboCommodityDetail, setComboCommodityDetail] = useState<any>()
// 关联卡券的 悬浮框 显示 // 关联卡券的 悬浮框 显示
const [associatedCouponsModal, setAssociatedCouponsModal] = useState<boolean>(false) const [associatedCouponsModal, setAssociatedCouponsModal] = useState<boolean>(false)
// 关联卡券的选择列表 // 关联卡券的选择列表
@ -738,6 +741,21 @@ const COMMODITYTable: React.FC<{ currentUser: CurrentUser | undefined }> = (prop
}; };
const handleAddUpdate = async (res: any, type?: string) => { const handleAddUpdate = async (res: any, type?: string) => {
console.log('setSelectSetMealItemsRef', setSelectSetMealItemsRef.current)
console.log('resresresresresresresres', res)
let itemList = setSelectSetMealItemsRef.current.tableData
if (itemList && itemList.length > 0) {
itemList.forEach((item: any) => {
// item.USERDEFINEDTYPE_ID = item.USERDEFINEDTYPE_ID && item.USERDEFINEDTYPE_ID.length > 0 ? item.USERDEFINEDTYPE_ID.toString() : item.USERDEFINEDTYPE_ID
item.COMMODITY_TYPE = 4000
item.UPPER_STATE = 1
item.PROVINCE_CODE = currentUser?.ProvinceCode
item.COMMODITY_STATE = 1
item.OWNERUNIT_ID = currentUser?.OwnerUnitId
item.OWNERUNIT_NAME = currentUser?.OwnerUnitName
})
}
let req: any = {} let req: any = {}
if (currentRow?.USERDEFINEDTYPE_ID && type !== 'saveAs') { if (currentRow?.USERDEFINEDTYPE_ID && type !== 'saveAs') {
req = { req = {
@ -788,11 +806,18 @@ const COMMODITYTable: React.FC<{ currentUser: CurrentUser | undefined }> = (prop
} }
} }
const data = await handeSynchroCOMMODITY(req) // 同步商品数据 因为添加了套餐数据 最方便的方法 就是在当前基础上 换接口 所以换入参
handleConfirmLoading(false) const newReq: any = {
commodityModel: req,
singleCommodityList: itemList && itemList.length > 0 ? itemList : ''
}
console.log('newReqnewReq', newReq);
// const data = await handeSynchroCOMMODITY(req)
const data = await handeSyncComboCommodity(newReq)
if (data.Result_Code === 100) { if (data.Result_Code === 100) {
await handleUploadShopImg(res, data.Result_Data) await handleUploadShopImg(res, data.Result_Data?.commodityModel)
handleSetlogSave(`${currentRow?.USERDEFINEDTYPE_ID ? '更新' : '新增'}商品【${data.Result_Data?.COMMODITY_NAME}`) handleSetlogSave(`${currentRow?.USERDEFINEDTYPE_ID ? '更新' : '新增'}商品【${data.Result_Data?.COMMODITY_NAME}`)
@ -828,29 +853,45 @@ const COMMODITYTable: React.FC<{ currentUser: CurrentUser | undefined }> = (prop
session.set("USERDEFINEDTYPEList", data) session.set("USERDEFINEDTYPEList", data)
list = data list = data
} }
let resPid: any = '' let resPid: any = []
if (list && list.length > 0) { if (list && list.length > 0) {
let obj: any = {} let obj: any = {}
list.forEach((item: any) => { list.forEach((item: any) => {
let childrenTypeList: any = [] let childrenTypeList: any = []
if (item.children && item.children.length > 0) [ if (item.children && item.children.length > 0) {
item.children.forEach((subItem: any) => { item.children.forEach((subItem: any) => {
childrenTypeList.push(subItem.USERDEFINEDTYPE_ID) childrenTypeList.push(subItem.USERDEFINEDTYPE_ID)
}) })
] }
obj[item.USERDEFINEDTYPE_ID] = childrenTypeList obj[item.USERDEFINEDTYPE_ID] = childrenTypeList
}) })
for (let key in obj) { // 可能存在多个大类的情况
if (obj[key].indexOf(Number(data.Result_Data?.USERDEFINEDTYPE_ID)) !== -1) { let UserDefinedTypeIdsList = data.Result_Data?.commodityModel?.UserDefinedTypeIds.split(',')
resPid = key
}
}
}
handlecsyncWeChatGetMallGoodsInfo({ appId: 'wxee018fb96955552a', userdefinedTypeId: resPid }) for (let key in obj) {
if (UserDefinedTypeIdsList && UserDefinedTypeIdsList.length > 0) {
UserDefinedTypeIdsList.forEach((item: any) => {
if (obj[key].indexOf(Number(item)) !== -1) {
// resPid = key
resPid.push(key)
}
})
}
// if (obj[key].indexOf(Number(data.Result_Data?.commodityModel?.USERDEFINEDTYPE_ID)) !== -1) {
// resPid = key
// }
}
}
if (resPid && resPid.length > 0) {
for (let i = 0; i < resPid.length; i++) {
handlecsyncWeChatGetMallGoodsInfo({ appId: 'wxee018fb96955552a', userdefinedTypeId: resPid[i] })
}
}
handleConfirmLoading(false)
} else { } else {
message.error(data.Result_Desc) message.error(data.Result_Desc)
handleConfirmLoading(false)
} }
}; };
@ -860,10 +901,28 @@ const COMMODITYTable: React.FC<{ currentUser: CurrentUser | undefined }> = (prop
// 主图 // 主图
if (formRes.mainImgList && formRes.mainImgList.length > 0) { if (formRes.mainImgList && formRes.mainImgList.length > 0) {
const formData = new FormData(); const formData = new FormData();
formRes.mainImgList.forEach((file: any) => { // 遍历文件列表,压缩后再上传
formData.append('files[]', file.originFileObj); for (const file of formRes.mainImgList) {
formData.append('ImageName', typeof file !== 'string' ? file?.name : ''); // 跳过已经上传的文件(有 ImageId 的)
}); if (file.ImageId) {
continue;
}
// 获取原始文件
const originalFile = file.originFileObj || file;
try {
// 压缩图片
const compressedFile = await resizeImageHalf(originalFile);
// 使用压缩后的文件
formData.append('files[]', compressedFile);
formData.append('ImageName', compressedFile.name);
} catch (err) {
// 如果压缩失败,使用原图
formData.append('files[]', originalFile);
formData.append('ImageName', originalFile.name);
}
}
formData.append('TableId', shopData.COMMODITY_ID); formData.append('TableId', shopData.COMMODITY_ID);
formData.append('imageType', "1000"); formData.append('imageType', "1000");
formData.append('TableType', "1207"); formData.append('TableType', "1207");
@ -874,10 +933,25 @@ const COMMODITYTable: React.FC<{ currentUser: CurrentUser | undefined }> = (prop
// 头部轮播图 // 头部轮播图
if (formRes.headerImgList && formRes.headerImgList.length > 0) { if (formRes.headerImgList && formRes.headerImgList.length > 0) {
const formData = new FormData(); const formData = new FormData();
formRes.headerImgList.forEach((file: any) => { // formRes.headerImgList.forEach((file: any) => {
formData.append('files[]', file.originFileObj); // formData.append('files[]', file.originFileObj);
formData.append('ImageName', typeof file !== 'string' ? file?.name : ''); // formData.append('ImageName', typeof file !== 'string' ? file?.name : '');
}); // });
for (const file of formRes.headerImgList) {
// 跳过已经上传的文件(有 ImageId 的)
if (file.ImageId) {
continue;
}
// 获取原始文件
const originalFile = file.originFileObj || file;
// 压缩图片
const compressedFile = await resizeImageHalf(originalFile);
// 使用压缩后的文件
formData.append('files[]', compressedFile);
formData.append('ImageName', compressedFile.name);
}
formData.append('TableId', shopData.COMMODITY_ID); formData.append('TableId', shopData.COMMODITY_ID);
formData.append('imageType', "2000"); formData.append('imageType', "2000");
formData.append('TableType', "1207"); formData.append('TableType', "1207");
@ -888,10 +962,24 @@ const COMMODITYTable: React.FC<{ currentUser: CurrentUser | undefined }> = (prop
// 头部轮播图 // 头部轮播图
if (formRes.detailImgList && formRes.detailImgList.length > 0) { if (formRes.detailImgList && formRes.detailImgList.length > 0) {
const formData = new FormData(); const formData = new FormData();
formRes.detailImgList.forEach((file: any) => { for (const file of formRes.detailImgList) {
formData.append('files[]', file.originFileObj); // 跳过已经上传的文件(有 ImageId 的)
formData.append('ImageName', typeof file !== 'string' ? file?.name : ''); if (file.ImageId) {
}); continue;
}
// 获取原始文件
const originalFile = file.originFileObj || file;
// 压缩图片
const compressedFile = await resizeImageHalf(originalFile);
// 使用压缩后的文件
formData.append('files[]', compressedFile);
formData.append('ImageName', compressedFile.name);
}
// formRes.detailImgList.forEach((file: any) => {
// formData.append('files[]', file.originFileObj);
// formData.append('ImageName', typeof file !== 'string' ? file?.name : '');
// });
formData.append('TableId', shopData.COMMODITY_ID); formData.append('TableId', shopData.COMMODITY_ID);
formData.append('imageType', "5000"); formData.append('imageType', "5000");
formData.append('TableType', "1207"); formData.append('TableType', "1207");
@ -1127,7 +1215,10 @@ const COMMODITYTable: React.FC<{ currentUser: CurrentUser | undefined }> = (prop
}}>excel</Button> }}>excel</Button>
], ],
}} }}
pagination={{ defaultPageSize: 10 }} pagination={{
defaultPageSize: 50,
pageSizeOptions: ['50', '100', '200', '500', '1000'],
}}
rowSelection={{ rowSelection={{
type: 'checkbox', type: 'checkbox',
selectedRowKeys: selectShopRowKey, selectedRowKeys: selectShopRowKey,
@ -1233,6 +1324,7 @@ const COMMODITYTable: React.FC<{ currentUser: CurrentUser | undefined }> = (prop
</div> </div>
<div> <div>
<Button loading={confirmLoading} onClick={() => { <Button loading={confirmLoading} onClick={() => {
handleConfirmLoading(true)
let oldFormRes: any = { let oldFormRes: any = {
COMMODITY_NAME: currentRow?.COMMODITY_NAME, COMMODITY_NAME: currentRow?.COMMODITY_NAME,
BRAND_ID: `${currentRow?.BRAND_NAME}-${currentRow?.BRAND_ID}`, BRAND_ID: `${currentRow?.BRAND_NAME}-${currentRow?.BRAND_ID}`,
@ -1277,10 +1369,10 @@ const COMMODITYTable: React.FC<{ currentUser: CurrentUser | undefined }> = (prop
let newFormRes: any = formRef.current?.getFieldsValue(names) let newFormRes: any = formRef.current?.getFieldsValue(names)
if (isEqual(normalize(oldFormRes), normalize(newFormRes))) { if (isEqual(normalize(oldFormRes), normalize(newFormRes))) {
handleConfirmLoading(false)
message.error('与原商品一致,无法另存为!') message.error('与原商品一致,无法另存为!')
} else { } else {
formRef?.current?.validateFields().then(async (newValue) => { formRef?.current?.validateFields().then(async (newValue) => {
handleConfirmLoading(true)
await handleAddUpdate(newValue, 'saveAs'); await handleAddUpdate(newValue, 'saveAs');
}) })
// 如果有开关,要把开关的代码写进去 // 如果有开关,要把开关的代码写进去
@ -1302,6 +1394,7 @@ const COMMODITYTable: React.FC<{ currentUser: CurrentUser | undefined }> = (prop
setHeaderImgList([]) setHeaderImgList([])
setDetailImgList([]) setDetailImgList([])
setCurrentRowDetail(undefined) setCurrentRowDetail(undefined)
setComboCommodityDetail([])
setRelevanceCouponList([]) setRelevanceCouponList([])
setSelectRelevanceId([]) setSelectRelevanceId([])
}}> </Button> }}> </Button>
@ -1339,9 +1432,17 @@ const COMMODITYTable: React.FC<{ currentUser: CurrentUser | undefined }> = (prop
labelCol={{ style: { width: 80 } }} labelCol={{ style: { width: 80 } }}
preserve={false} preserve={false}
request={async () => { request={async () => {
console.log('currentRowcurrentRowcurrentRow', currentRow);
if (currentRow?.COMMODITY_ID) { if (currentRow?.COMMODITY_ID) {
const data = await handeGetCOMMODITYDetail({ COMMODITYId: currentRow?.COMMODITY_ID }) // const data = await handeGetCOMMODITYDetail({ COMMODITYId: currentRow?.COMMODITY_ID })
const res: any = await handeGetComboCommodityDetail({ COMMODITYId: currentRow?.COMMODITY_ID })
console.log('商品详情', res);
let data: any = res.commodityModel
setCurrentRowDetail(data) setCurrentRowDetail(data)
setComboCommodityDetail(res.singleCommodityList || [])
let mainImgList: any = [] let mainImgList: any = []
let headerImgList: any = [] let headerImgList: any = []
@ -1385,13 +1486,16 @@ const COMMODITYTable: React.FC<{ currentUser: CurrentUser | undefined }> = (prop
setHeaderImgList(headerImgList) setHeaderImgList(headerImgList)
setDetailImgList(detailImgList) setDetailImgList(detailImgList)
console.log('dsadjmaskda', data.CouponIds ? data.CouponIds.split(',').map(Number) : []);
return { return {
...data, ...data,
USERDEFINEDTYPE_ID: data.UserDefinedTypeIds ? data.UserDefinedTypeIds.split(',').map(Number) : [], USERDEFINEDTYPE_ID: data.UserDefinedTypeIds ? data.UserDefinedTypeIds.split(',').map(Number) : [],
BRAND_ID: `${data?.BRAND_NAME}-${data?.BRAND_ID}`, BRAND_ID: `${data?.BRAND_NAME}-${data?.BRAND_ID}`,
MERCHANTS_ID: `${data?.MERCHANTS_NAME}-${data?.MERCHANTS_ID}`, MERCHANTS_ID: `${data?.MERCHANTS_NAME}-${data?.MERCHANTS_ID}`,
UPPER_DATE: data.UPPER_DATE && data.OFF_DATE ? [data.UPPER_DATE, data.OFF_DATE] : [], UPPER_DATE: data.UPPER_DATE && data.OFF_DATE ? [data.UPPER_DATE, data.OFF_DATE] : [],
relevanceCoupon: data.CouponIds.split(',').map(Number) relevanceCoupon: data.CouponIds ? data.CouponIds.split(',').map(Number) : []
// mainImgList: mainImgList, // mainImgList: mainImgList,
// headerImgList: headerImgList, // headerImgList: headerImgList,
// detailImgList: detailImgList, // detailImgList: detailImgList,
@ -1648,7 +1752,7 @@ const COMMODITYTable: React.FC<{ currentUser: CurrentUser | undefined }> = (prop
<Col span={24}> <Col span={24}>
<ProFormTextArea <ProFormTextArea
name="COMMODITY_DESC" name="COMMODITY_DESC"
label="商品简" label="商品简"
/> />
</Col> </Col>
@ -1889,14 +1993,6 @@ const COMMODITYTable: React.FC<{ currentUser: CurrentUser | undefined }> = (prop
handlePreview(1) handlePreview(1)
}, },
fileList: mainImgList, // 绑定 fileList fileList: mainImgList, // 绑定 fileList
customRequest: ({ file, onSuccess }) => {
// 自定义上传,不实际发送请求
setTimeout(() => {
if (onSuccess) {
onSuccess({});
}
}, 0);
},
onChange: async (info: any) => { onChange: async (info: any) => {
if (info.file.status === 'removed') { if (info.file.status === 'removed') {
const index = mainImgList.findIndex(n => n.uid === info.file.uid); const index = mainImgList.findIndex(n => n.uid === info.file.uid);
@ -1906,7 +2002,6 @@ const COMMODITYTable: React.FC<{ currentUser: CurrentUser | undefined }> = (prop
async onOk() { async onOk() {
if (info.file.ImageId) { if (info.file.ImageId) {
const deleteLoading = message.loading('正在删除...') const deleteLoading = message.loading('正在删除...')
// const success = await deletePicture(info.file?.ImagePath, info.file?.uid, '', '6000')
const success = await deleteAHYDPicture(info.file?.ImagePath, info.file?.uid, '', '6000') const success = await deleteAHYDPicture(info.file?.ImagePath, info.file?.uid, '', '6000')
deleteLoading() deleteLoading()
@ -2059,7 +2154,7 @@ const COMMODITYTable: React.FC<{ currentUser: CurrentUser | undefined }> = (prop
{/* 若是一个套餐商品 那么这里就要有一个录入套餐商品的地方 */} {/* 若是一个套餐商品 那么这里就要有一个录入套餐商品的地方 */}
<Col span={24}> <Col span={24}>
<SelectSetMealItems onRef={setSelectSetMealItemsRef} leftTreeData={leftTreeData} /> <SelectSetMealItems onRef={setSelectSetMealItemsRef} leftTreeData={leftTreeData} comboCommodityDetail={comboCommodityDetail} />
</Col> </Col>
</Row> </Row>
</ProForm> </ProForm>

View File

@ -440,7 +440,10 @@ const SupplierClassification: React.FC<{ currentUser: CurrentUser | undefined }>
submitter={false} submitter={false}
labelCol={{ style: { width: 80 } }} labelCol={{ style: { width: 80 } }}
preserve={false} preserve={false}
initialValues={currentRow ? currentRow : { initialValues={currentRow ? {
...currentRow,
OPERATE_DATE: moment(currentRow?.OPERATE_DATE).format('YYYY-MM-DD HH:mm:ss'),
} : {
OPERATE_DATE: moment().format('YYYY-MM-DD HH:mm:ss'), OPERATE_DATE: moment().format('YYYY-MM-DD HH:mm:ss'),
OWNERUNIT_NAME: currentUser?.OwnerUnitName, OWNERUNIT_NAME: currentUser?.OwnerUnitName,
AUTOTYPE_VALID: 1 AUTOTYPE_VALID: 1

View File

@ -300,6 +300,33 @@ export async function handeSynchroCOMMODITY(params: any) {
return data return data
} }
// 同步套餐商品数据
export async function handeSyncComboCommodity(params: any) {
// const data = await requestEncryption(`/MallBasic/SyncComboCommodity`, {
const data = await requestEncryption(`/MallBasic/SyncComboCommodity`, {
method: 'POST',
data: { ...params, requestEncryption: true }
})
if (data.Result_Code !== 100) {
return []
}
return data
}
// 同步套餐商品详情
export async function handeGetComboCommodityDetail(params: any) {
// const data = await requestEncryption(`/MallBasic/SyncComboCommodity`, {
const data = await requestEncryption(`/MallBasic/GetComboCommodityDetail`, {
method: 'POST',
data: { ...params, requestEncryption: true }
})
if (data.Result_Code !== 100) {
return []
}
return data.Result_Data
}
// 获取商品详情 // 获取商品详情
export async function handeGetCOMMODITYDetail(params: any) { export async function handeGetCOMMODITYDetail(params: any) {
const data = await requestEncryption(`/MallBasic/GetCOMMODITYDetail`, { const data = await requestEncryption(`/MallBasic/GetCOMMODITYDetail`, {

View File

@ -0,0 +1,111 @@
/**
*
*
*/
export interface ResizeHalfOptions {
quality?: number;
}
/**
*
* @param file
* @param options (0-10.8)
* @returns
*/
export const resizeImageHalf = (
file: File,
options: ResizeHalfOptions = {}
): Promise<File> => {
const {
quality = 0.8
} = options;
return new Promise((resolve, reject) => {
if (!file || !file.type.includes('image')) {
reject(new Error('无效的图片文件'));
return;
}
const reader = new FileReader();
reader.onload = (e) => {
const img = new Image();
img.onload = () => {
resizeToHalfDimensions(img, file, quality, resolve, reject);
};
img.onerror = () => reject(new Error('图片加载失败'));
img.src = e.target?.result as string;
};
reader.onerror = () => reject(new Error('文件读取失败'));
reader.readAsDataURL(file);
});
};
/**
* -
*/
function resizeToHalfDimensions(
img: HTMLImageElement,
originalFile: File,
quality: number,
resolve: (file: File) => void,
reject: (error: Error) => void
) {
// 判断是否需要压缩:只有当长或宽任意一边大于500px时才压缩
if (img.width <= 500 && img.height <= 500) {
console.log(`图片尺寸 ${img.width}x${img.height} 不大于500px,无需压缩,返回原图`);
resolve(originalFile);
return;
}
const canvas = document.createElement('canvas');
const ctx = canvas.getContext('2d');
if (!ctx) {
reject(new Error('浏览器不支持Canvas'));
return;
}
// 计算减半后的尺寸
const halfWidth = Math.floor(img.width / 2);
const halfHeight = Math.floor(img.height / 2);
console.log(`原图尺寸: ${img.width}x${img.height}`);
console.log(`减半后尺寸: ${halfWidth}x${halfHeight}`);
// 设置canvas尺寸为原图的一半
canvas.width = halfWidth;
canvas.height = halfHeight;
// 在canvas上绘制缩小后的图片
// 使用平滑缩放算法以获得更好的图像质量
ctx.imageSmoothingEnabled = true;
ctx.imageSmoothingQuality = 'high';
ctx.drawImage(img, 0, 0, halfWidth, halfHeight);
// 将canvas转换为Blob并创建新的File对象
canvas.toBlob(
(blob) => {
if (!blob) {
reject(new Error('图片处理失败'));
return;
}
// 保持原始文件名不变,避免服务器端根据文件名做特殊处理
const newFileName = originalFile.name;
// 创建压缩后的文件对象
const resizedFile = new File([blob], newFileName, {
type: originalFile.type,
lastModified: Date.now()
});
console.log(`✅ 图片尺寸减半完成: ${img.width}x${img.height}${halfWidth}x${halfHeight}`);
console.log(`文件大小: ${(originalFile.size / 1024).toFixed(1)}KB → ${(resizedFile.size / 1024).toFixed(1)}KB`);
resolve(resizedFile);
},
originalFile.type,
quality
);
}

View File

@ -1,4 +1,4 @@
// 由 scripts/writeVersion.js 自动生成 // 由 scripts/writeVersion.js 自动生成
export const VERSION = "4.5.91"; export const VERSION = "4.5.92";
export const GIT_HASH = "24088d3"; export const GIT_HASH = "ee6fa92";
export const BUILD_TIME = "2025-12-16T11:26:58.433Z"; export const BUILD_TIME = "2025-12-19T01:04:57.460Z";