bmc-common-resource
v1.1.162
Published
通用枚举、常量和资源的npm包
Readme
bmc-common-resource
这是一个npm包,用于定义多个项目共用的枚举、常量、资源和数据模型。通过集中管理这些公共资源,可以确保在不同项目中保持一致性,减少代码重复,并简化维护工作。
安装
npm install bmc-common-resource --save主要功能
1. 枚举和常量
包含系统中使用的各种枚举和对应的选项数组,确保各项目中使用相同的枚举值。
2. 空间配置模块
提供房间、分组、分类等数据配置和关联关系的定义,支持空间配置的统一管理。
3. 数据模型
提供统一的前端数据模型定义,如报价单项等,确保数据结构一致性。
4. 工具函数
提供各种业务相关的工具函数,如UUID生成、价格计算等。
使用示例
报价清单状态 (solution_status)
import { solution_status, solution_status_options } from 'bmc-common-resource';
// 使用枚举
const status = solution_status.DRAFT;
// 使用选项数组(适用于下拉菜单等UI组件)
console.log(solution_status_options);
// 输出:[{name: '草稿', value: 'DRAFT'}, ...]货币单位 (CURRENCY_UNIT_ENUM)
import { CURRENCY_UNIT_ENUM, CURRENCY_UNIT_OPTIONS } from 'bmc-common-resource';
// 使用枚举
const currency = CURRENCY_UNIT_ENUM.CNY;
// 使用选项数组
console.log(CURRENCY_UNIT_OPTIONS);
// 输出:[{name: '人民币', value: 'CNY'}, ...]产品供货模式 (supply_mode)
import { supply_mode, supply_mode_options } from 'bmc-common-resource';
// 使用枚举
const mode = supply_mode.own_production;
// 使用选项数组
console.log(supply_mode_options);
// 输出:[{name: '自制生产', value: 'own_production'}, ...]价格标识 (price_flag)
import {
price_flag,
price_flag_options,
ListType,
getPriceFlagOptionsByListType,
isPriceFlagValidForListType
} from 'bmc-common-resource';
// 使用枚举
const flag = price_flag.stdConf;
// 使用完整选项数组
console.log(price_flag_options);
// 输出:[{name: '标配', value: 'stdConf'}, ...]
// 根据清单类型获取可用的价格标识选项
const salesOptions = getPriceFlagOptionsByListType(ListType.SALES);
console.log(salesOptions);
// 输出: 销售清单可用的价格标识选项数组
// 检查价格标识是否适用于某类清单
const isValid = isPriceFlagValidForListType(price_flag.gift, ListType.PURCHASE);
console.log(isValid); // 输出: true,因为赠品适用于采购清单舍入规则 (rounding_rule)
import { rounding_rule, rounding_rule_options } from 'bmc-common-resource';
// 使用枚举
const rule = rounding_rule.SINGLE_SET_EIGHT;
// 使用选项数组
console.log(rounding_rule_options);
// 输出:[{name: '个位四舍五入', value: 'SINGLE_SET_EIGHT'}, ...]
// 在价格计算场景中使用
function applyRoundingRule(price: number, rule: rounding_rule): number {
switch (rule) {
case rounding_rule.SINGLE_ROUND:
return Math.round(price);
case rounding_rule.SINGLE_SET_EIGHT:
return Math.floor(price / 10) * 10 + 8;
case rounding_rule.SINGLE_SET_NINE:
return Math.floor(price / 10) * 10 + 9;
case rounding_rule.SINGLE_SET_TEN:
return Math.ceil(price / 10) * 10;
// ... 其他规则实现
default:
return price;
}
}
// 应用舍入规则示例
const originalPrice = 1234.56;
const roundedPrice = applyRoundingRule(originalPrice, rounding_rule.SINGLE_SET_NINE);
console.log(roundedPrice); // 输出: 1239报价产品项 (QuotationItem)
import { QuotationItem } from 'bmc-common-resource';
// 创建新的报价产品项
const item = new QuotationItem({
uuid: 'abc-123',
productId: 'prod001',
spuName: '悬浮式电视柜-XWSTDSG34804752600',
unitPrice: 1299,
roomName: '客厅',
roomCode: 'drawing',
width: 1200,
height: 400,
depth: 500
});
// 设置价格信息
item.priceFlag = 'positive';
item.standardPrice = item.unitPrice * item.measure * item.count; // 计算标准金额
item.itemDiscount = 85; // 85折
console.log(item);空间配置 (solution模块)
import {
ROOM_TYPES,
CLASSIFY_TYPES,
GROUP_TYPES,
PRODUCT_CATEGORIES,
getProductCategoriesByGroupType,
getClassifyRoomsAndGroups,
getSortedRoomTypes
} from 'bmc-common-resource';
// 获取所有房间类型,并按排序
const roomTypes = getSortedRoomTypes();
console.log(roomTypes);
// 输出: [{name: '全屋', order: 0}, {name: '客厅', order: 1}, ...]
// 获取分组下的产品分类
const cabinetCategories = getProductCategoriesByGroupType('CABINET_TYPE');
console.log(cabinetCategories);
// 输出: [{categoryName: '厅柜', categoryCode: 'HALL_CABINET'}, ...]
// 获取定制家具品项的所有房间和分组
const roomsAndGroups = getClassifyRoomsAndGroups('CUSTOM_FURNITURE');
console.log(roomsAndGroups);生成UUID
import { generateUUID } from 'bmc-common-resource';
const id = generateUUID();
console.log(id); // 输出: 例如 "f47ac10b-58cc-4372-a567-0e02b2c3d479"价格计算工具
import { calcStandardPrice, calcActualPrice, price_flag } from 'bmc-common-resource';
// 计算标准金额(计量 * 数量 * 单价)
const standardPrice = calcStandardPrice(
1.5, // 计量
2, // 数量
1000, // 单价
price_flag.positive // 价格标识
);
console.log(standardPrice); // 输出: 3000
// 计算实际金额(标准金额 * 非标系数 * 折扣率)
const actualPrice = calcActualPrice(
standardPrice, // 标准金额
1.2, // 非标系数
85, // 折扣率(85%)
price_flag.positive
);
console.log(actualPrice); // 输出: 3060枚举值说明
solution_status (报价清单状态)
| 值 | 说明 |
|----|------|
| DRAFT | 草稿 |
| ACTIVE | 可用 |
| LOCKED | 锁定 |
| REVOKED | 已作废 |
| PRE_SIGNED | 预签 |
| SIGNED | 已签 |
| SIGNED_REVOKED | 已签作废 |
CURRENCY_UNIT_ENUM (货币单位)
| 值 | 说明 |
|----|------|
| CNY | 人民币 |
| USD | 美元 |
| EUR | 欧元 |
| GBP | 英镑 |
| HKD | 港币 |
supply_mode (产品供货模式)
| 值 | 说明 |
|----|------|
| own_production | 自制生产 |
| brand_agency | 品牌代理 |
| wholesale_procur | 批发采购 |
| cross_border_pro | 跨境采购 |
| oem_contract | OEM代工 |
price_flag (价格标识)
| 值 | 说明 |
|----|------|
| stdConf | 标配 |
| gift | 赠品 |
| present | 礼品 |
| package | 套餐 |
| positive | 正价 |
| specialPrice | 特价 |
| fixPrice | 定价 |
| returnedPurchase | 退货 |
| refund | 退款 |
| sample | 样品 |
| returning_inventory | 退库 |
| backup_warehouse | 备库 |
| sec_kill_product | 秒杀品 |
| activity_product | 活动产品 |
| product_stock | 库存产品 |
rounding_rule (舍入规则)
| 值 | 说明 |
|----|------|
| SINGLE_ROUND | 个位四舍五入 |
| SINGLE_SET_EIGHT | 个位凑"8" |
| SINGLE_SET_NINE | 个位凑"9" |
| SINGLE_SET_TEN | 个位进十 |
| SINGLE_PLUS_ONE | 个位替换 "4"或"7" (加 "1") |
| TEN_PLUS_ONE | 十位替换 "4"或"7" (加 "1") |
| SINGLE_TEN_PLUS_ONE | 个位和十位替换 "4"或"7" (加 "1") |
ListType (清单类型)
| 值 | 说明 |
|----|------|
| PURCHASE | 采购清单 |
| SALES | 销售清单 |
| INVENTORY | 库存清单 |
| RETURN | 退货清单 |
| OTHER | 其他清单 |
空间配置模块说明
空间配置模块提供了一套完整的房间、分组和产品分类的关联关系定义,主要包含以下内容:
房间类型 (ROOM_TYPES)
定义了系统支持的所有房间类型,如客厅、卧室、厨房等,每种类型包含名称、排序值等属性。
分组类型 (GROUP_TYPES)
定义了产品的功能分组,如柜类、功能五金、配套电器等,每种分组可包含多个产品分类。
产品分类 (PRODUCT_CATEGORIES)
定义了具体的产品分类,如厅柜、书柜、抽屉等,用于组织和筛选产品。
品项定义 (CLASSIFY_TYPES)
定义了顶层的产品品项归类,如定制家具等,一个品项可涵盖多种房间和分组。
关联关系
通过CLASSIFY_ROOM_GROUP_MAP定义了品项、房间和分组之间的多层关联,支持灵活的产品筛选和分类展示。
数据模型说明
QuotationItem
报价产品项类,用于统一定义前端报价单产品项的数据结构,包含以下主要维度:
- 基础信息: uuid, productId, unitPrice等
- 产品维度: spuName, spuId, brandId, categoryCode等
- 空间维度: roomName, roomCode, groupName, groupCode等
- 物理维度: width, height, depth, moveDirection等
- 业务维度: measureUnit, measure, priceFlag, standardPrice等
- 价格体系: productCoefficient, itemDiscount等
- 可视化数据: picture等
- 层级关系: children, components等
各清单类型对应的价格标识:
采购清单 (PURCHASE)
- 标配 (stdConf)
- 赠品 (gift)
- 样品 (sample)
- 正价 (positive)
- 特价 (specialPrice)
- 定价 (fixPrice)
销售清单 (SALES)
- 标配 (stdConf)
- 赠品 (gift)
- 礼品 (present)
- 套餐 (package)
- 正价 (positive)
- 特价 (specialPrice)
- 定价 (fixPrice)
- 秒杀品 (sec_kill_product)
- 活动产品 (activity_product)
库存清单 (INVENTORY)
- 标配 (stdConf)
- 备库 (backup_warehouse)
- 库存产品 (product_stock)
退货清单 (RETURN)
- 退货 (returnedPurchase)
- 退款 (refund)
- 退库 (returning_inventory)
其他清单 (OTHER)
- 标配 (stdConf)
- 正价 (positive)
- 样品 (sample)
开发说明
添加新的枚举或常量
- 在
src/enums目录下创建新文件 - 在
src/enums/index.ts中导出 - 如需选项数组,在
src/constants目录下创建对应的选项文件 - 运行
npm run build构建
添加新的数据模型
- 在相应的
src/modules/xxx/models目录下创建新文件 - 在对应的
models/index.ts中导出 - 确保
scripts/generate-exports.js脚本可以正确识别和导出该模型 - 运行
npm run build构建
添加工具函数
- 在
src/utils目录下的相应文件中添加函数 - 确保在
utils/index.ts中导出 - 运行
npm run build构建
使用说明
所有枚举、常量、工具函数和数据模型都可以直接从包的根路径导入:
import {
// 枚举和常量
solution_status,
CURRENCY_UNIT_ENUM,
supply_mode,
price_flag,
ListType,
// 对应的选项数组
solution_status_options,
CURRENCY_UNIT_OPTIONS,
supply_mode_options,
price_flag_options,
// 工具函数
getPriceFlagOptionsByListType,
generateUUID,
calcStandardPrice,
calcActualPrice,
// 空间配置
ROOM_TYPES,
GROUP_TYPES,
PRODUCT_CATEGORIES,
CLASSIFY_TYPES,
// 数据模型
QuotationItem
} from 'bmc-common-resource';字典类型定义说明
概述
本项目中的字典类型定义用于管理系统中的各种选项数据,如客户来源、进程阶段等。所有字典选项都遵循统一的类型定义规范,确保类型安全和使用一致性。
核心类型定义
基础接口
interface DictionaryOption<T = string> {
/** 标签 */
label: string;
/** 值 */
value: T;
}这是一个泛型接口,用于定义所有字典选项的基础结构:
label: 选项的显示文本value: 选项的值,使用泛型参数 T 来指定具体类型
字典标识枚举
enum DICTIONARY_IDENTIFY_ENUM {
/** 客户来源 */
CUSTOMER_SOURCE = 'CUSTOMER_SOURCE',
/** 进程阶段 */
PROCESS_STAGE = 'PROCESS_STAGE'
}定义了系统中所有字典类型的标识。
特定字典选项接口
// 客户来源选项
interface CustomerSourceOption extends DictionaryOption<CustomerSourceType> {}
// 进程阶段选项
interface ProcessStageOption extends DictionaryOption<ProcessStageType> {}这些接口继承自基础 DictionaryOption 接口,并指定了具体的值类型。
使用注意事项
- 所有字典选项都应该是平级的,不包含嵌套结构
- 每个选项必须包含
label和value两个属性 value的类型必须与对应的枚举类型匹配- 字典标识必须使用
DICTIONARY_IDENTIFY_ENUM中定义的值
