Files
ONE-OS/ONEOS-web/CRM/新建供应商.jsx
王冕 a27e3b8e43 feat: sync full workspace including web modules, docs, and configurations to Gitea
Optimized the root .gitignore to exclude virtual environments, node modules,
and temp folders to ensure clean and lightweight version tracking.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-09 18:12:25 +08:00

348 lines
17 KiB
JavaScript

// 【重要】必须使用 const Component 作为组件变量名
// ONEOS-web 示例项目 - CRM 新建供应商 (完美复刻 Arco Design Pro 分组表单)
const Component = function () {
var useState = React.useState;
var antd = window.antd;
var Button = antd.Button;
var Space = antd.Space;
var Input = antd.Input;
var Select = antd.Select;
var Cascader = antd.Cascader;
var Form = antd.Form;
var Row = antd.Row;
var Col = antd.Col;
var Breadcrumb = antd.Breadcrumb;
var Menu = antd.Menu;
var Layout = antd.Layout;
var message = antd.message;
var Typography = antd.Typography;
var Avatar = antd.Avatar;
var Badge = antd.Badge;
var Card = antd.Card;
var Header = Layout.Header;
var Content = Layout.Content;
var Sider = Layout.Sider;
var Title = Typography.Title;
var _currentMenu = useState('crm-supplier');
var currentMenu = _currentMenu[0];
var setCurrentMenu = _currentMenu[1];
var handleMenuClick = function (e) {
setCurrentMenu(e.key);
if (e.key === 'contract-list') {
message.info('跳转至 合同列表');
window.location.hash = '合同列表';
} else if (e.key === 'erp-order') {
message.info('跳转至 ERP 订单管理');
window.location.hash = '订单管理';
} else if (e.key === 'asset-overview') {
message.info('跳转至 资产概览');
window.location.hash = '资产概览';
} else if (e.key === 'crm-list') {
message.info('跳转至 客户列表');
window.location.hash = '客户列表';
} else if (e.key === 'crm-supplier') {
message.info('跳转至 供应商管理');
window.location.hash = '供应商管理';
}
};
// 自定义 SVG 图标(高保真还原 Arco 风格)
var SettingIcon = function() { return React.createElement('svg', { viewBox: '0 0 48 48', width: 16, height: 16, fill: 'none', stroke: 'currentColor', strokeWidth: 4 }, React.createElement('path', { d: 'M18.797 6.732A1 1 0 0 1 19.76 6h8.48a1 1 0 0 1 .964.732l1.285 4.628a1 1 0 0 0 1.213.7l4.651-1.2a1 1 0 0 1 1.116.468l4.24 7.344a1 1 0 0 1-.153 1.2L38.193 23.3a1 1 0 0 0 0 1.402l3.364 3.427a1 1 0 0 1 .153 1.2l-4.24 7.344a1 1 0 0 1-1.116.468l-4.65-1.2a1 1 0 0 0-1.214.7l-1.285 4.628a1 1 0 0 1-.964.732h-8.48a1 1 0 0 1-.963-.732L17.51 36.64a1 1 0 0 0-1.213-.7l-4.65 1.2a1 1 0 0 1-1.116-.468l-4.24-7.344a1 1 0 0 1 .153-1.2L9.809 24.7a1 1 0 0 0 0-1.402l-3.364-3.427a1 1 0 0 1-.153-1.2l4.24-7.344a1 1 0 0 1 1.116-.468l4.65 1.2a1 1 0 0 0 1.213-.7l1.286-4.628Z' }), React.createElement('path', { d: 'M30 24a6 6 0 1 1-12 0 6 6 0 0 1 12 0Z' })); };
var NoticeIcon = function() { return React.createElement('svg', { viewBox: '0 0 48 48', width: 18, height: 18, fill: 'none', stroke: 'currentColor', strokeWidth: 4 }, React.createElement('path', { d: 'M39 34h3v4H6v-4h3V20.218a15 15 0 0 1 30 0V34ZM24 44a6 6 0 0 1-6-6h12a6 6 0 0 1-6 6Z' })); };
var FormIcon = function() { return React.createElement('svg', { viewBox: '0 0 48 48', width: 14, height: 14, fill: 'none', stroke: 'currentColor', strokeWidth: 4, strokeLinecap: 'butt', strokeLinejoin: 'miter' }, React.createElement('path', { d: 'M18.797 6.732A1 1 0 0 1 19.76 6h8.48a1 1 0 0 1 .964.732l1.285 4.628a1 1 0 0 0 1.213.7l4.651-1.2a1 1 0 0 1 1.116.468l4.24 7.344a1 1 0 0 1-.153 1.2L38.193 23.3a1 1 0 0 0 0 1.402l3.364 3.427a1 1 0 0 1 .153 1.2l-4.24 7.344a1 1 0 0 1-1.116.468l-4.65-1.2a1 1 0 0 0-1.214.7l-1.285 4.628a1 1 0 0 1-.964.732h-8.48a1 1 0 0 1-.963-.732L17.51 36.64a1 1 0 0 0-1.213-.7l-4.65 1.2a1 1 0 0 1-1.116-.468l-4.24-7.344a1 1 0 0 1 .153-1.2L9.809 24.7a1 1 0 0 0 0-1.402l-3.364-3.427a1 1 0 0 1-.153-1.2l4.24-7.344a1 1 0 0 1 1.116-.468l4.65 1.2a1 1 0 0 0 1.213-.7l1.286-4.628Z' }), React.createElement('path', { d: 'M30 24a6 6 0 1 1-12 0 6 6 0 0 1 12 0Z' })); };
var menuItems = [
{
key: 'contract',
label: '合同管理',
icon: React.createElement('span', { className: 'anticon' }, '📄'),
children: [
{ key: 'contract-list', label: '合同列表' }
]
},
{
key: 'crm',
label: 'CRM 管理',
icon: React.createElement('span', { className: 'anticon' }, '👥'),
children: [
{ key: 'crm-list', label: '客户列表' },
{ key: 'crm-supplier', label: '供应商管理' },
{ key: 'crm-analysis', label: 'CRM 分析' }
]
},
{
key: 'erp',
label: 'ERP 订单管理',
icon: React.createElement('span', { className: 'anticon' }, '📦'),
children: [
{ key: 'erp-order', label: '订单管理' }
]
},
{
key: 'asset',
label: '资产管理',
icon: React.createElement('span', { className: 'anticon' }, '🚗'),
children: [
{ key: 'asset-overview', label: '资产概览' }
]
}
];
// 供应商类型下拉选项
var supplierTypeOptions = [
{ label: '整车企业', value: '整车企业' },
{ label: '车辆外租企业', value: '车辆外租企业' },
{ label: '加氢站', value: '加氢站' },
{ label: '充电站', value: '充电站' },
{ label: '维修站', value: '维修站' },
{ label: '备件供应商', value: '备件供应商' },
{ label: '保险公司', value: '保险公司' },
{ label: '救援车队', value: '救援车队' },
{ label: '其他', value: '其他' }
];
return React.createElement(Layout, { className: 'arco-theme-overrides', style: { minHeight: '100vh', background: '#f2f3f5', fontFamily: 'Inter, Helvetica, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", sans-serif' } },
// 内联 CSS 以实现最高保真度的 Arco UI
React.createElement('style', null, `
.arco-theme-overrides .ant-btn { border-radius: 4px; box-shadow: none; font-size: 14px; }
.arco-theme-overrides .ant-btn-primary { background-color: #165dff; border-color: #165dff; }
.arco-theme-overrides .ant-btn-primary:hover { background-color: #4080ff; border-color: #4080ff; }
.arco-theme-overrides .ant-btn-default { background-color: #f2f3f5; border-color: transparent; color: #4e5969; }
.arco-theme-overrides .ant-btn-default:hover { background-color: #e5e6eb; border-color: transparent; color: #4e5969; }
.arco-theme-overrides .ant-menu-light .ant-menu-item-selected { background-color: #f2f9fe; color: #165dff; }
.arco-theme-overrides .ant-menu-light .ant-menu-item-selected::after { border-right-color: #165dff; }
/* 输入组件默认、Hover、Focus样式复刻 */
.arco-theme-overrides .ant-input, .arco-theme-overrides .ant-select-selector, .arco-theme-overrides .ant-cascader { border-radius: 2px; border: 1px solid #e5e6eb; background-color: #f2f3f5; transition: all 0.1s cubic-bezier(0, 0, 1, 1); }
.arco-theme-overrides .ant-input:hover, .arco-theme-overrides .ant-select:not(.ant-select-disabled):hover .ant-select-selector, .arco-theme-overrides .ant-cascader:hover { background-color: #e5e6eb; border-color: transparent; }
.arco-theme-overrides .ant-input:focus, .arco-theme-overrides .ant-input-focused, .arco-theme-overrides .ant-select-focused .ant-select-selector, .arco-theme-overrides .ant-cascader-focused { background-color: #fff; border: 1px solid #165dff !important; box-shadow: 0 0 0 2px rgba(22, 93, 255, 0.2) !important; outline: 0; }
/* 垂直表单标签样式复刻 */
.arco-theme-overrides .ant-form-vertical .ant-form-item-label { padding: 0 0 8px; line-height: 1.5715; }
.arco-theme-overrides .ant-form-vertical .ant-form-item-label > label { color: #1d2129; font-weight: 400; height: auto; }
.arco-theme-overrides .ant-form-item-label > label::after { display: none !important; content: "" !important; margin: 0 !important; }
.arco-theme-overrides .ant-form-item { margin-bottom: 24px; }
/* 卡片样式复刻 */
.arco-theme-overrides .ant-card { border: none; border-radius: 4px; margin-bottom: 16px; background: transparent; }
.arco-theme-overrides .ant-card-body { padding: 20px 20px 0 20px; background: #fff; }
/* 标题样式复刻 */
.arco-theme-overrides .arco-section-title { font-size: 16px; font-weight: 500; color: #1d2129; margin-bottom: 20px; }
/* 输入框高度统一 */
.arco-theme-overrides .ant-input, .arco-theme-overrides .ant-select-selector, .arco-theme-overrides .ant-cascader .ant-select-selector { height: 32px !important; min-height: 32px !important; display: flex; align-items: center; padding: 0 12px; }
.arco-theme-overrides .ant-input { padding: 4px 12px; }
.arco-theme-overrides .ant-select-selection-item { line-height: 30px !important; }
.arco-theme-overrides .ant-breadcrumb { color: #86909c; font-size: 14px; }
.arco-theme-overrides .ant-breadcrumb a { color: #4e5969; }
.arco-theme-overrides .ant-breadcrumb a:hover { color: #165dff; background-color: transparent; }
`),
// 顶部 Header
React.createElement(Header, {
style: {
background: '#fff',
padding: '0 20px',
display: 'flex',
justifyContent: 'space-between',
alignItems: 'center',
borderBottom: '1px solid #e5e6eb',
height: 60,
position: 'fixed',
top: 0,
left: 0,
right: 0,
zIndex: 100
}
},
// 左侧 Logo
React.createElement('div', { style: { display: 'flex', alignItems: 'center', gap: 12 } },
React.createElement('div', { style: { width: 32, height: 32, background: '#165dff', borderRadius: 4, display: 'flex', justifyContent: 'center', alignItems: 'center', color: '#fff', fontWeight: 'bold' } }, 'A'),
React.createElement('div', { style: { fontSize: '20px', fontWeight: '600', color: '#1d2129', letterSpacing: '0.5px' } }, 'Arco Pro')
),
// 右侧工具栏
React.createElement('div', { style: { display: 'flex', alignItems: 'center', gap: 20 } },
React.createElement(Input.Search, { placeholder: '搜索功能', style: { width: 220, borderRadius: 16 } }),
React.createElement(Badge, { dot: true, offset: [-2, 4] },
React.createElement('span', { style: { color: '#4e5969', cursor: 'pointer', display: 'flex' }, title: '消息通知' }, React.createElement(NoticeIcon, null))
),
React.createElement('span', { style: { color: '#4e5969', cursor: 'pointer', display: 'flex' }, title: '设置' }, React.createElement(SettingIcon, null)),
React.createElement(Avatar, { size: 32, src: 'https://p1-arco.byteimg.com/tos-cn-i-uwbnlip3yd/3ee5f13fb09879ecb5185e440cef6eb9.png~tplv-uwbnlip3yd-webp.webp', style: { cursor: 'pointer' } })
)
),
// 下方主体内容
React.createElement(Layout, { style: { paddingTop: 60 } },
// 左侧菜单 Sider
React.createElement(Sider, {
width: 220,
style: {
background: '#fff',
borderRight: '1px solid #e5e6eb',
position: 'fixed',
top: 60,
left: 0,
height: 'calc(100vh - 60px)',
overflowY: 'auto',
zIndex: 99
}
},
React.createElement(Menu, {
mode: 'inline',
selectedKeys: [currentMenu],
defaultOpenKeys: ['crm'],
items: menuItems,
onClick: handleMenuClick,
style: { borderRight: 'none', padding: '8px', background: '#fff' }
})
),
// 右侧内容 Content
React.createElement(Content, { style: { marginLeft: 220, padding: '16px 20px 60px 20px', minHeight: 'calc(100vh - 60px)', display: 'flex', flexDirection: 'column' } },
React.createElement('div', { style: { padding: '16px 20px 0 20px', marginBottom: 0, background: '#fff' } },
React.createElement(Breadcrumb, {
separator: React.createElement('span', { style: { color: '#c9cdd4' } }, '/'),
items: [
{ title: React.createElement(FormIcon, { style: { display: 'inline-flex', alignItems: 'center', fontSize: 14, transform: 'translate(-2px, 1px)' } }) },
{ title: '表单页' },
{ title: React.createElement('span', { style: { color: '#1d2129' } }, '分组表单') }
]
}),
React.createElement(Title, { level: 4, style: { marginTop: 16, marginBottom: 20, fontWeight: 700, color: '#1d2129', fontSize: 16 } }, '新建供应商')
),
React.createElement('div', { style: { padding: '0', display: 'flex', flexDirection: 'column', flex: 1 } },
React.createElement(Form, { layout: 'vertical' },
// 供应商信息分组
React.createElement(Card, { bordered: false, bodyStyle: { padding: '20px 20px 0 20px' } },
React.createElement('div', { className: 'arco-section-title' }, '供应商信息'),
React.createElement(Row, { gutter: 24 },
React.createElement(Col, { span: 8 },
React.createElement(Form.Item, { label: '供应商名称', required: true },
React.createElement(Input, { placeholder: '请输入供应商名称' })
)
),
React.createElement(Col, { span: 8 },
React.createElement(Form.Item, { label: '类型', required: true },
React.createElement(Select, { placeholder: '请选择类型', options: supplierTypeOptions })
)
),
React.createElement(Col, { span: 8 },
React.createElement(Form.Item, { label: '所属城市' },
React.createElement(Cascader, { placeholder: '请选择省-市', options: [{ value: 'zhejiang', label: '浙江', children: [{ value: 'hangzhou', label: '杭州' }, { value: 'ningbo', label: '宁波' }] }, { value: 'jiangsu', label: '江苏', children: [{ value: 'nanjing', label: '南京' }] }] })
)
),
React.createElement(Col, { span: 8 },
React.createElement(Form.Item, { label: '所在地址' },
React.createElement(Input, { placeholder: '请输入所在地址' })
)
),
React.createElement(Col, { span: 8 },
React.createElement(Form.Item, { label: '区域' },
React.createElement(Input, { placeholder: '请输入区域' })
)
),
React.createElement(Col, { span: 8 },
React.createElement(Form.Item, { label: '业务负责部门' },
React.createElement(Input, { placeholder: '请输入业务负责部门' })
)
),
React.createElement(Col, { span: 8 },
React.createElement(Form.Item, { label: '业务负责人员' },
React.createElement(Input, { placeholder: '请输入业务负责人员' })
)
),
React.createElement(Col, { span: 24 },
React.createElement(Form.Item, { label: '备注' },
React.createElement(Input.TextArea, { placeholder: '请输入备注', autoSize: { minRows: 3, maxRows: 5 }, style: { height: 'auto', minHeight: 'auto' } })
)
)
)
),
// 联系人信息分组
React.createElement(Card, { bordered: false, bodyStyle: { padding: '20px 20px 0 20px' } },
React.createElement('div', { className: 'arco-section-title' }, '联系人信息'),
React.createElement(Row, { gutter: 24 },
React.createElement(Col, { span: 8 },
React.createElement(Form.Item, { label: '姓名' },
React.createElement(Input, { placeholder: '请输入姓名' })
)
),
React.createElement(Col, { span: 8 },
React.createElement(Form.Item, { label: '手机号' },
React.createElement(Input, { placeholder: '请输入手机号' })
)
),
React.createElement(Col, { span: 8 },
React.createElement(Form.Item, { label: '职位' },
React.createElement(Input, { placeholder: '请输入职位' })
)
)
)
),
// 付款及开票信息分组
React.createElement(Card, { bordered: false, bodyStyle: { padding: '20px 20px 0 20px', marginBottom: 16 } },
React.createElement('div', { className: 'arco-section-title' }, '付款及开票信息'),
React.createElement(Row, { gutter: 24 },
React.createElement(Col, { span: 8 },
React.createElement(Form.Item, { label: '纳税人识别号' },
React.createElement(Input, { placeholder: '请输入纳税人识别号' })
)
),
React.createElement(Col, { span: 8 },
React.createElement(Form.Item, { label: '注册地址' },
React.createElement(Input, { placeholder: '请输入注册地址' })
)
),
React.createElement(Col, { span: 8 },
React.createElement(Form.Item, { label: '注册电话' },
React.createElement(Input, { placeholder: '请输入注册电话' })
)
),
React.createElement(Col, { span: 8 },
React.createElement(Form.Item, { label: '开户行' },
React.createElement(Input, { placeholder: '请输入开户行' })
)
),
React.createElement(Col, { span: 8 },
React.createElement(Form.Item, { label: '账号' },
React.createElement(Input, { placeholder: '请输入账号' })
)
)
)
)
)
)
)
),
// 底部固定操作栏
React.createElement('div', {
style: {
position: 'fixed',
bottom: 0,
right: 0,
width: 'calc(100% - 220px)',
padding: '16px 20px',
background: '#fff',
borderTop: '1px solid #e5e6eb',
textAlign: 'right',
zIndex: 100
}
},
React.createElement(Space, { size: 16 },
React.createElement(Button, { size: 'large', onClick: function() { message.info('重置成功'); } }, '重置'),
React.createElement(Button, { type: 'primary', size: 'large', onClick: function() { message.success('提交成功'); } }, '提交')
)
)
);
};
if (typeof module !== 'undefined' && module.exports) module.exports = Component;