MarketingSystemDataExportTool/web/modules/state.js

269 lines
6.0 KiB
JavaScript

/**
* 状态管理模块 - 拆分状态对象,提供初始化函数
* @module state
*/
;(function() {
'use strict';
/**
* 创建模板表单初始状态
* @param {string} [datasource='marketing'] - 数据源
* @returns {Object} 模板表单状态
*/
const createTemplateFormState = (datasource = 'marketing') => ({
name: '',
datasource: datasource,
main_table: datasource === 'ymt' ? 'order_info' : 'order',
orderType: datasource === 'ymt' ? 2 : 1,
fieldsRaw: '',
fieldsSel: [],
file_format: 'xlsx',
visibility: 'private'
});
/**
* 创建编辑表单初始状态
* @returns {Object} 编辑表单状态
*/
const createEditFormState = () => ({
id: null,
name: '',
datasource: 'marketing',
main_table: 'order',
orderType: 1,
fieldsSel: [],
visibility: 'private',
file_format: 'xlsx'
});
/**
* 创建导出表单初始状态
* @returns {Object} 导出表单状态
*/
const createExportFormState = () => ({
tplId: null,
datasource: 'marketing',
file_format: 'xlsx',
dateRange: [],
// 营销系统筛选条件
creatorIds: [],
creatorIdsRaw: '',
resellerId: null,
planId: null,
keyBatchId: null,
codeBatchId: null,
voucherChannelActivityId: '',
// 易码通筛选条件
ymtCreatorId: '',
ymtMerchantId: '',
ymtActivityId: ''
});
/**
* 创建导出模板状态
* @returns {Object} 导出模板状态
*/
const createExportTemplateState = () => ({
id: null,
filters: {},
main_table: '',
fields: [],
datasource: '',
file_format: ''
});
/**
* 创建任务列表状态
* @returns {Object} 任务列表状态
*/
const createJobsState = () => ({
jobs: [],
jobsVisible: false,
jobsTplId: null,
jobsPage: 1,
jobsPageSize: 10,
jobsTotal: 0
});
/**
* 创建SQL预览状态
* @returns {Object} SQL预览状态
*/
const createSqlPreviewState = () => ({
sqlVisible: false,
sqlText: '',
sqlExplainDesc: ''
});
/**
* 创建对话框状态
* @returns {Object} 对话框状态
*/
const createDialogState = () => {
const { CONSTANTS } = window.AppConfig || {};
const defaultWidth = CONSTANTS?.DIALOG_DEFAULT_WIDTH || 900;
const editDefaultWidth = CONSTANTS?.DIALOG_EDIT_DEFAULT_WIDTH || 900;
return {
createVisible: false,
editVisible: false,
exportVisible: false,
exportSubmitting: false,
createWidth: localStorage.getItem('tplDialogWidth') || (defaultWidth + 'px'),
editWidth: localStorage.getItem('tplEditDialogWidth') || (editDefaultWidth + 'px')
};
};
/**
* 创建完整的应用状态
* @returns {Object} 完整应用状态
*/
const createAppState = () => {
return {
// 模板列表
templates: [],
// 当前任务详情
job: {},
// 模板表单
form: createTemplateFormState(),
// 编辑表单
edit: createEditFormState(),
// 导出表单
exportForm: createExportFormState(),
// 导出模板详情
exportTpl: createExportTemplateState(),
// 任务列表
...createJobsState(),
// SQL 预览
...createSqlPreviewState(),
// 对话框
...createDialogState()
};
};
/**
* 重置模板表单
* @param {Object} form - 表单对象
* @param {string} [datasource='marketing'] - 数据源
*/
const resetTemplateForm = (form, datasource = 'marketing') => {
const initial = createTemplateFormState(datasource);
Object.assign(form, initial);
};
/**
* 重置编辑表单
* @param {Object} edit - 编辑表单对象
*/
const resetEditForm = (edit) => {
const initial = createEditFormState();
Object.assign(edit, initial);
};
/**
* 重置导出表单
* @param {Object} exportForm - 导出表单对象
*/
const resetExportForm = (exportForm) => {
const initial = createExportFormState();
Object.assign(exportForm, initial);
};
/**
* 表单验证规则工厂
*/
const ValidationRules = {
/**
* 创建模板表单验证规则
* @returns {Object} 验证规则
*/
createTemplateRules() {
return {
name: [{ required: true, message: '请输入模板名称', trigger: 'blur' }],
datasource: [{ required: true, message: '请选择数据源', trigger: 'change' }],
main_table: [{ required: true, message: '请选择导出场景', trigger: 'change' }],
orderType: [{ required: true, message: '请选择订单类型', trigger: 'change' }],
fieldsSel: [{
validator: (_rule, val, cb) => {
if (Array.isArray(val) && val.length > 0) {
cb();
} else {
cb(new Error('请至少选择一个字段'));
}
},
trigger: 'change'
}],
file_format: [{ required: true, message: '请选择输出格式', trigger: 'change' }],
visibility: [{ required: true, message: '请选择可见性', trigger: 'change' }]
};
},
/**
* 创建编辑表单验证规则
* @returns {Object} 验证规则
*/
createEditRules() {
return {
name: [{ required: true, message: '请输入模板名称', trigger: 'blur' }],
orderType: [{ required: true, message: '请选择订单类型', trigger: 'change' }],
fieldsSel: [{
validator: (_rule, val, cb) => {
if (Array.isArray(val) && val.length > 0) {
cb();
} else {
cb(new Error('请至少选择一个字段'));
}
},
trigger: 'change'
}]
};
},
/**
* 创建导出表单验证规则
* @returns {Object} 验证规则
*/
createExportRules() {
return {
tplId: [{ required: true, message: '请选择模板', trigger: 'change' }],
dateRange: [{
validator: (_rule, val, cb) => {
if (Array.isArray(val) && val.length === 2) {
cb();
} else {
cb(new Error('请选择时间范围'));
}
},
trigger: 'change'
}]
};
}
};
// 导出模块
window.StateModule = {
createTemplateFormState,
createEditFormState,
createExportFormState,
createExportTemplateState,
createJobsState,
createSqlPreviewState,
createDialogState,
createAppState,
resetTemplateForm,
resetEditForm,
resetExportForm,
ValidationRules
};
})();