You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
182 lines
5.3 KiB
JavaScript
182 lines
5.3 KiB
JavaScript
import { useEffect, useState } from 'react';
|
|
import { useTranslation } from 'react-i18next';
|
|
import useAuthStore from '@/stores/Auth';
|
|
import { PERM_OVERSEA, PERM_AIR_TICKET, PERM_PRODUCTS_MANAGEMENT } from '@/config';
|
|
import { isEmpty } from '@/utils/commons';
|
|
|
|
/**
|
|
* 产品管理 相关的预设数据
|
|
* 项目类型
|
|
* * 酒店预定 1
|
|
* * 火车 2
|
|
* * 飞机票务 3
|
|
* * 游船 4
|
|
* * 快巴 5
|
|
* * 旅行社(综费) 6
|
|
* * 景点 7
|
|
* * 特殊项目 8
|
|
* * 其他 9
|
|
* * 酒店 A
|
|
* * 超公里 B
|
|
* * 餐费 C
|
|
* * 小包价 D // 包价线路
|
|
* * 站 X
|
|
* * 购物 S
|
|
* * 餐 R (餐厅)
|
|
* * 娱乐 E
|
|
* * 精华线路 T
|
|
* * 客人testimonial F
|
|
* * 线路订单 O
|
|
* * 省 P
|
|
* * 信息 I
|
|
* * 国家 G
|
|
* * 城市 K
|
|
* * 图片 H
|
|
* * 地图 M
|
|
* * 包价线路 L (已废弃)
|
|
* * 节日节庆 V
|
|
* * 火车站 N
|
|
* * 手机租赁 Z
|
|
* * ---- webht 类型, 20240624 新增HT类型 ----
|
|
* * 导游 Q
|
|
* * 车费 J
|
|
*/
|
|
|
|
export const useProductsTypes = (showAll = false) => {
|
|
const [types, setTypes] = useState([]);
|
|
const { t, i18n } = useTranslation();
|
|
|
|
useEffect(() => {
|
|
const allItem = [{ label: t('All'), value: '', key: '' }];
|
|
const newData = [
|
|
{ label: t('products:type.Experience'), value: '6', key: '6' },
|
|
{ label: t('products:type.UltraService'), value: 'B', key: 'B' },
|
|
{ label: t('products:type.Car'), value: 'J', key: 'J' },
|
|
{ label: t('products:type.Guide'), value: 'Q', key: 'Q' },
|
|
{ label: t('products:type.Attractions'), value: '7', key: '7' }, // landscape
|
|
{ label: t('products:type.Meals'), value: 'R', key: 'R' },
|
|
{ label: t('products:type.Extras'), value: '8', key: '8' },
|
|
{ label: t('products:type.Package'), value: 'D', key: 'D' },
|
|
];
|
|
const res = showAll ? [...allItem, ...newData] : newData;
|
|
setTypes(res);
|
|
}, [i18n.language]);
|
|
|
|
return types;
|
|
};
|
|
export const useProductsTypesMapVal = (value) => {
|
|
const stateSets = useProductsTypes();
|
|
const stateMapVal = stateSets.reduce((r, c) => ({ ...r, [`${c.value}`]: c }), {});
|
|
return stateMapVal;
|
|
};
|
|
|
|
export const useProductsAuditStates = () => {
|
|
const [types, setTypes] = useState([]);
|
|
const { t, i18n } = useTranslation();
|
|
|
|
useEffect(() => {
|
|
const newData = [
|
|
{ key: '-1', value: '-1', label: t('products:auditState.New'), color: 'muted' },
|
|
{ key: '0', value: '0', label: t('products:auditState.Pending'), color: '' },
|
|
{ key: '2', value: '2', label: t('products:auditState.Approved'), color: 'primary' },
|
|
{ key: '3', value: '3', label: t('products:auditState.Rejected'), color: 'danger' },
|
|
{ key: '1', value: '1', label: t('products:auditState.Published'), color: 'primary' },
|
|
// ELSE 未知
|
|
];
|
|
setTypes(newData);
|
|
}, [i18n.language]);
|
|
|
|
return types;
|
|
};
|
|
|
|
export const useProductsAuditStatesMapVal = (value) => {
|
|
const stateSets = useProductsAuditStates();
|
|
const stateMapVal = stateSets.reduce((r, c) => ({ ...r, [`${c.value}`]: c }), {});
|
|
return stateMapVal;
|
|
};
|
|
|
|
/**
|
|
* @ignore
|
|
*/
|
|
export const useProductsTypesFieldsets = (type) => {
|
|
const [isPermitted] = useAuthStore((state) => [state.isPermitted]);
|
|
const infoDefault = [['code'], ['title']];
|
|
const infoAdmin = ['remarks', 'dept']; // 'display_to_c'
|
|
const infoDisplay = isPermitted(PERM_PRODUCTS_MANAGEMENT) ? ['display_to_c'] : [];
|
|
const infoTypesMap = {
|
|
'6': [['city'], []],
|
|
'B': [['city', 'km'], []],
|
|
'J': [['city', 'recommends_rate', 'duration', ...infoDisplay], ['description']],
|
|
'Q': [['city', 'recommends_rate', 'duration', ...infoDisplay], ['description']],
|
|
'D': [['city', 'recommends_rate', 'duration', ...infoDisplay], ['description']],
|
|
'7': [['city', 'recommends_rate', 'duration', ...infoDisplay, 'open_weekdays'], ['description']],
|
|
'R': [['city'], ['description']],
|
|
'8': [[...infoDisplay], []],
|
|
};
|
|
const thisTypeFieldset = (_type) => {
|
|
if (isEmpty(_type)) {
|
|
return infoDefault;
|
|
}
|
|
const adminSet = isPermitted(PERM_PRODUCTS_MANAGEMENT) ? infoAdmin : [];
|
|
return [
|
|
[...infoDefault[0], ...infoTypesMap[_type][0], ...adminSet],
|
|
[...infoDefault[1], ...infoTypesMap[_type][1]],
|
|
];
|
|
};
|
|
return thisTypeFieldset(type);
|
|
};
|
|
|
|
export const useNewProductRecord = () => {
|
|
return {
|
|
info: {
|
|
'id': null,
|
|
'title': '',
|
|
'code': '',
|
|
'product_type_id': '',
|
|
'product_type_name': '',
|
|
'remarks': '',
|
|
'duration': 0,
|
|
'duration_unit': 'h',
|
|
'open_weekdays': '',
|
|
'recommends_rate': 0,
|
|
'dept_id': 0,
|
|
'dept_name': '',
|
|
'display_to_c': 0,
|
|
'km': 0,
|
|
'city_id': 0,
|
|
'city_name': '',
|
|
},
|
|
default_lgc: {
|
|
'title': '',
|
|
'description': '',
|
|
'lgc': 1,
|
|
'id': null,
|
|
},
|
|
default_quotation: {
|
|
'id': null,
|
|
'adult_cost': 0,
|
|
'child_cost': 0,
|
|
'currency': 'CNY',
|
|
'unit_id': '1',
|
|
'unit_name': '每团',
|
|
'group_size_min': 1,
|
|
'group_size_max': 2,
|
|
'use_dates_start': '',
|
|
'use_dates_end': '',
|
|
'weekdays': '',
|
|
'audit_state_id': -1,
|
|
'audit_state_name': '',
|
|
'lastedit_changed': '',
|
|
},
|
|
lgc_details: [
|
|
{
|
|
'title': '',
|
|
'description': '',
|
|
'lgc': 1,
|
|
'id': null,
|
|
},
|
|
],
|
|
quotation: [],
|
|
};
|
|
};
|