|
@@ -14,32 +14,34 @@ import { dayColumns, weekColumns, monthColumns } from '../../utils/columns';
|
|
|
import { ComponentSize, ElMessage, FormInstance, FormRules } from 'element-plus';
|
|
|
import enLocale from 'element-plus/es/locale/lang/en';
|
|
|
import Selector from '/@/views/reportManage/dataCenter/normalDisplay/components/Selector/index.vue';
|
|
|
-
|
|
|
dayjs.extend(isoWeek);
|
|
|
|
|
|
-const router = useRouter();
|
|
|
+// const router = useRouter();
|
|
|
const route = useRoute();
|
|
|
const dateType = <string>route.query.dateType;
|
|
|
|
|
|
+// 筛选查询
|
|
|
+const selectorRef = ref(null);
|
|
|
+const taskIds = ref({});
|
|
|
+
|
|
|
//日期选择
|
|
|
-const dailyEntryTime = ref(dayjs().format('YYYY-MM-DD'));
|
|
|
-const dailyTime = ref(dayjs().subtract(1, 'day').format('YYYY-MM-DD'));
|
|
|
+// const dailyEntryTime = ref(dayjs().format('YYYY-MM-DD'));
|
|
|
+const dailySalesTime = ref(dayjs().subtract(1, 'day').format('YYYY-MM-DD'));
|
|
|
|
|
|
const weeklyEntryTime = ref(null);
|
|
|
-const weeklySalesTime = ref(null);
|
|
|
+// const weeklySalesTime = ref(null);
|
|
|
const weeklyAdTime = ref(null);
|
|
|
|
|
|
-const entryStartDate = ref('');
|
|
|
-const entryEndDate = ref('');
|
|
|
-const salesStartDate = ref('');
|
|
|
-const salesEndDate = ref('');
|
|
|
+const entryStartDate = ref(dayjs().locale('en').startOf('week').format('YYYY-MM-DD'));
|
|
|
+const entryEndDate = ref(dayjs().locale('en').endOf('week').format('YYYY-MM-DD'));
|
|
|
+// const salesStartDate = ref('');
|
|
|
+// const salesEndDate = ref('');
|
|
|
const adStartDate = ref('');
|
|
|
const adEndDate = ref('');
|
|
|
|
|
|
const monthlyEntryTime = ref(null);
|
|
|
const startDate = ref(null);
|
|
|
const endDate = ref(null);
|
|
|
-
|
|
|
const shortcuts = [
|
|
|
{
|
|
|
text: '今天',
|
|
@@ -63,26 +65,15 @@ const shortcuts = [
|
|
|
},
|
|
|
];
|
|
|
|
|
|
-function handleDayChange(event) {
|
|
|
- const $dailyEntryTime = dailyEntryTime.value;
|
|
|
- if ($dailyEntryTime) {
|
|
|
- const dailyTimeValue = new Date($dailyEntryTime);
|
|
|
- dailyTimeValue.setDate(dailyTimeValue.getDate());
|
|
|
- dailyTime.value = dailyTimeValue.toISOString().split('T')[0];
|
|
|
- } else {
|
|
|
- dailyTime.value = '';
|
|
|
- }
|
|
|
+function handleDayChange(value) {
|
|
|
+ dailySalesTime.value = dayjs(value).format('YYYY-MM-DD');
|
|
|
+ fetchCurrentTaskData();
|
|
|
}
|
|
|
|
|
|
const handleWeekChange = () => {
|
|
|
if (weeklyEntryTime.value) {
|
|
|
entryStartDate.value = dayjs(weeklyEntryTime.value).locale('en').startOf('week').format('YYYY-MM-DD');
|
|
|
entryEndDate.value = dayjs(weeklyEntryTime.value).locale('en').endOf('week').format('YYYY-MM-DD');
|
|
|
-
|
|
|
- weeklySalesTime.value = weeklyEntryTime.value;
|
|
|
- salesStartDate.value = entryStartDate.value;
|
|
|
- salesEndDate.value = entryEndDate.value;
|
|
|
-
|
|
|
const adDate = dayjs(weeklyEntryTime.value).locale('en').subtract(7, 'day');
|
|
|
weeklyAdTime.value = adDate.format('YYYY-WW');
|
|
|
adStartDate.value = adDate.startOf('week').format('YYYY-MM-DD');
|
|
@@ -90,10 +81,6 @@ const handleWeekChange = () => {
|
|
|
}
|
|
|
};
|
|
|
|
|
|
-const entryFormat = computed(() => `${entryStartDate.value} to ${entryEndDate.value}`);
|
|
|
-const salesFormat = computed(() => `${salesStartDate.value} to ${salesEndDate.value}`);
|
|
|
-const adFormat = computed(() => `${adStartDate.value} to ${adEndDate.value}`);
|
|
|
-
|
|
|
watch(weeklyEntryTime, handleWeekChange);
|
|
|
|
|
|
const handleMonthChange = (value) => {
|
|
@@ -104,31 +91,51 @@ const handleMonthChange = (value) => {
|
|
|
const lastDay = new Date(year, month, 0).getDate();
|
|
|
startDate.value = `${year}-${String(month).padStart(2, '0')}-01`;
|
|
|
endDate.value = `${year}-${String(month).padStart(2, '0')}-${lastDay}`;
|
|
|
+ // console.log('start', startDate.value, 'end', endDate.value);
|
|
|
} else {
|
|
|
startDate.value = null;
|
|
|
endDate.value = null;
|
|
|
}
|
|
|
};
|
|
|
+
|
|
|
+const entryFormat = computed(() => `${entryStartDate.value} to ${entryEndDate.value}`);
|
|
|
+const adFormat = computed(() => `${adStartDate.value} to ${adEndDate.value}`);
|
|
|
const monthlyEntryFormat = computed(() => `${startDate.value} to ${endDate.value}`);
|
|
|
|
|
|
const disabledDate = (time: Date) => {
|
|
|
return time.getTime() > Date.now();
|
|
|
};
|
|
|
|
|
|
+function setDefaultDate() {
|
|
|
+ switch (dateType) {
|
|
|
+ case 'day':
|
|
|
+ dailySalesTime.value = dayjs().subtract(1, 'day').format('YYYY-MM-DD');
|
|
|
+ break;
|
|
|
+ case 'week':
|
|
|
+ weeklyEntryTime.value = dayjs().locale('en').subtract(1, 'week').startOf('week').format('YYYY-MM-DD');
|
|
|
+ handleWeekChange();
|
|
|
+ break;
|
|
|
+ case 'month':
|
|
|
+ monthlyEntryTime.value = new Date();
|
|
|
+ startDate.value = dayjs(monthlyEntryTime.value).startOf('month').format('YYYY-MM-DD');
|
|
|
+ endDate.value = dayjs(monthlyEntryTime.value).endOf('month').format('YYYY-MM-DD');
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
//表单
|
|
|
interface taskDataForm {
|
|
|
- sales: number;
|
|
|
- ad_sales: number;
|
|
|
- ad_cost: number;
|
|
|
+ sales_original: number,
|
|
|
+ ad_sales_original: number,
|
|
|
+ ad_cost_original: number,
|
|
|
|
|
|
total_sales_current_monthly: number;
|
|
|
impression: number;
|
|
|
ad_click: number;
|
|
|
ad_order: number;
|
|
|
- money_by_amazon: number;
|
|
|
- money_by_other: number;
|
|
|
- session: string;
|
|
|
- order: string;
|
|
|
+ money_by_amazon_original: number;
|
|
|
+ money_by_other_original: number;
|
|
|
+ session: number;
|
|
|
+ order: number;
|
|
|
availableSalesDay: number;
|
|
|
intransitInventory: number;
|
|
|
overseasStorage: number;
|
|
@@ -139,21 +146,22 @@ const formSize = ref<ComponentSize>('default');
|
|
|
const dayFormVisible = ref(false);
|
|
|
const taskDataFormRef = ref<FormInstance>();
|
|
|
const taskDataForm = reactive({
|
|
|
- sales: null,
|
|
|
- ad_sales: null,
|
|
|
- ad_cost: null,
|
|
|
+ sales_original: null,
|
|
|
+ ad_sales_original: null,
|
|
|
+ ad_cost_original: null,
|
|
|
total_sales_current_monthly: null,
|
|
|
impression: null,
|
|
|
ad_click: null,
|
|
|
ad_order: null,
|
|
|
- money_by_amazon: null,
|
|
|
- money_by_other: null,
|
|
|
- session: '',
|
|
|
- order: '',
|
|
|
+ // money_by_other: null,
|
|
|
+ session: null,
|
|
|
+ order: null,
|
|
|
availableSalesDay: null,
|
|
|
intransitInventory: null,
|
|
|
overseasStorage: null,
|
|
|
refundRate: null,
|
|
|
+ money_by_amazon_original:null,
|
|
|
+ money_by_other_original:null,
|
|
|
});
|
|
|
|
|
|
const resetForm = (formEl: FormInstance | undefined) => {
|
|
@@ -161,17 +169,17 @@ const resetForm = (formEl: FormInstance | undefined) => {
|
|
|
formEl.resetFields();
|
|
|
};
|
|
|
const rules = reactive<FormRules>({
|
|
|
- sales: [{required: true, message: '请输入销售额', trigger: 'blur'}],
|
|
|
- ad_sales: [{required: true, message: '请输入广告销售额', trigger: 'blur'}],
|
|
|
- ad_cost: [{required: true, message: '请输入广告花费', trigger: 'blur'}],
|
|
|
+ sales_original: [{required: true, message: '请输入销售额', trigger: 'blur'}],
|
|
|
+ ad_sales_original: [{required: true, message: '请输入广告销售额', trigger: 'blur'}],
|
|
|
+ ad_cost_original: [{required: true, message: '请输入广告花费', trigger: 'blur'}],
|
|
|
total_sales_current_monthly: [{required: true, message: '请输入当月销售额', trigger: 'blur'}],
|
|
|
impression: [{required: true, message: '请输入广告展示量', trigger: 'blur'}],
|
|
|
ad_click: [{required: true, message: '请输入广告点击量', trigger: 'blur'}],
|
|
|
ad_order: [{required: true, message: '请输入广告订单量', trigger: 'blur'}],
|
|
|
- money_by_amazon: [{required: true, message: '请输入亚马逊佣金', trigger: 'blur'}],
|
|
|
- money_by_other: [{required: true, message: '请输入其他佣金', trigger: 'blur'}],
|
|
|
+ money_by_amazon_original: [{required: true, message: '请输入亚马逊佣金', trigger: 'blur'}],
|
|
|
+ money_by_other_original: [{required: true, message: '请输入其他佣金', trigger: 'blur'}],
|
|
|
session: [{required: true, message: '请输入会话数', trigger: 'blur'}],
|
|
|
- order: [{required: true, message: '请输入转化', trigger: 'blur'}],
|
|
|
+ order: [{required: true, message: '请输入订单', trigger: 'blur'}],
|
|
|
availableSalesDay: [{required: true, message: '请输入可用销量天数', trigger: 'blur'}],
|
|
|
intransitInventory: [{required: true, message: '请输入在途库存', trigger: 'blur'}],
|
|
|
overseasStorage: [{required: true, message: '请输入海外仓库存', trigger: 'blur'}],
|
|
@@ -189,16 +197,16 @@ const monthData = [];
|
|
|
interface RowVO {
|
|
|
id: number;
|
|
|
task: number;
|
|
|
- sales: number;
|
|
|
- ad_sales: number;
|
|
|
- ad_cost: number;
|
|
|
-
|
|
|
+ // ad_cost: number;
|
|
|
+ sales_original: number,
|
|
|
+ ad_sales_original: number,
|
|
|
+ ad_cost_original: number,
|
|
|
total_sales_current_monthly: number;
|
|
|
impression: number;
|
|
|
ad_click: number;
|
|
|
ad_order: number;
|
|
|
- money_by_amazon: number;
|
|
|
- money_by_other: number;
|
|
|
+ money_by_amazon_original: number;
|
|
|
+ money_by_other_original: number;
|
|
|
session: string;
|
|
|
order: string;
|
|
|
availableSalesDay: number;
|
|
@@ -208,9 +216,11 @@ interface RowVO {
|
|
|
}
|
|
|
|
|
|
const xGrid = ref<VxeGridInstance<RowVO>>();
|
|
|
+const originalDataMap = new Map();
|
|
|
+
|
|
|
const gridOptions = reactive({
|
|
|
border: false,
|
|
|
- height: 900,
|
|
|
+ height: 800,
|
|
|
align: null,
|
|
|
round: true,
|
|
|
loading: false,
|
|
@@ -249,7 +259,6 @@ const gridOptions = reactive({
|
|
|
}
|
|
|
});
|
|
|
|
|
|
-
|
|
|
const gridEvents = {
|
|
|
pageChange({currentPage, pageSize}) {
|
|
|
if (gridOptions.pagerConfig) {
|
|
@@ -269,9 +278,14 @@ const hasActiveEditRow = (row: RowVO) => {
|
|
|
return false;
|
|
|
};
|
|
|
|
|
|
-const clearRowEvent = () => {
|
|
|
+const clearRowEvent = (row: RowVO) => {
|
|
|
const $grid = xGrid.value;
|
|
|
if ($grid) {
|
|
|
+ const originalData = originalDataMap.get(row.id);
|
|
|
+ if (originalData) {
|
|
|
+ Object.assign(row, originalData);
|
|
|
+ originalDataMap.delete(row.id);
|
|
|
+ }
|
|
|
$grid.clearEdit();
|
|
|
}
|
|
|
};
|
|
@@ -279,19 +293,27 @@ const clearRowEvent = () => {
|
|
|
const handelEditRow = (row: RowVO) => {
|
|
|
const $grid = xGrid.value;
|
|
|
if ($grid) {
|
|
|
+ originalDataMap.set(row.id, { ...row });
|
|
|
$grid.setEditRow(row);
|
|
|
}
|
|
|
};
|
|
|
|
|
|
+function updateDataChange(newId) {
|
|
|
+ if (selectorRef.value) {
|
|
|
+ taskIds.value = newId.value;
|
|
|
+ fetchCurrentTaskData()
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
// 获取表格数据
|
|
|
let dateParams;
|
|
|
-
|
|
|
async function fetchTaskData(apiFunction) {
|
|
|
try {
|
|
|
gridOptions.loading = true;
|
|
|
const resp = await apiFunction({
|
|
|
page: gridOptions.pagerConfig.currentPage,
|
|
|
limit: gridOptions.pagerConfig.pageSize,
|
|
|
+ task_ids: taskIds.value,
|
|
|
...dateParams
|
|
|
});
|
|
|
gridOptions[dateType].data = resp.data;
|
|
@@ -303,18 +325,6 @@ async function fetchTaskData(apiFunction) {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-watch(dailyTime, () => {
|
|
|
- fetchCurrentTaskData();
|
|
|
-});
|
|
|
-
|
|
|
-watch(salesEndDate, () => {
|
|
|
- fetchCurrentTaskData();
|
|
|
-});
|
|
|
-
|
|
|
-watch(endDate, () => {
|
|
|
- fetchCurrentTaskData();
|
|
|
-});
|
|
|
-
|
|
|
async function fetchDayTaskData() {
|
|
|
await fetchTaskData(getDayTaskData);
|
|
|
}
|
|
@@ -330,19 +340,19 @@ async function fetchMonthTaskData() {
|
|
|
function fetchCurrentTaskData() {
|
|
|
if (dateType === 'day') {
|
|
|
dateParams = {
|
|
|
- day_start_date: dailyTime.value,
|
|
|
- day_end_date: dailyTime.value
|
|
|
+ day_start_date: dailySalesTime.value,
|
|
|
+ day_end_date: dailySalesTime.value
|
|
|
};
|
|
|
fetchDayTaskData();
|
|
|
} else if (dateType === 'week') {
|
|
|
dateParams = {
|
|
|
- week_start_date: salesEndDate.value,
|
|
|
- week_end_date: salesEndDate.value
|
|
|
+ week_start_date: entryStartDate.value,
|
|
|
+ week_end_date: entryEndDate.value
|
|
|
};
|
|
|
fetchWeekTaskData();
|
|
|
} else if (dateType === 'month') {
|
|
|
dateParams = {
|
|
|
- month_start_date: endDate.value,
|
|
|
+ month_start_date: startDate.value,
|
|
|
month_end_date: endDate.value
|
|
|
};
|
|
|
fetchMonthTaskData();
|
|
@@ -357,37 +367,54 @@ const editEvent = async (row: RowVO) => {
|
|
|
dayFormVisible.value = true;
|
|
|
};
|
|
|
|
|
|
-const validateNumericFields = (fields: Record<string, any>): boolean => {
|
|
|
- const numericFields = ['sales', 'total_sales_current_monthly', 'ad_sales', 'ad_cost', 'impression', 'ad_click', 'ad_order', 'money_by_amazon', 'money_by_other', 'availableSalesDay', 'intransitInventory', 'overseasStorage', 'refundRate'];
|
|
|
-
|
|
|
- for (const field of numericFields) {
|
|
|
- if (fields[field] !== null && fields[field] !== undefined && isNaN(Number(fields[field]))) {
|
|
|
- const column = weekColumns.value.find(col => col.field === field);
|
|
|
- const title = column ? column.title : field;
|
|
|
- ElMessage.warning(`${title} 必须为数字`);
|
|
|
- return false;
|
|
|
+// 校验数据
|
|
|
+const validateNumericFields = (fields: Record<string, any>, fieldsToValidate: string[]): boolean => {
|
|
|
+ const numericFields = ['sales_original', 'total_sales_current_monthly', 'ad_sales_original', 'ad_cost_original', 'money_by_amazon_original', 'money_by_other_original', 'refundRate'];
|
|
|
+ const integerFields = ['impression', 'ad_click', 'ad_order', 'session', 'order', 'availableSalesDay', 'intransitInventory', 'overseasStorage'];
|
|
|
+
|
|
|
+ for (const field of fieldsToValidate) {
|
|
|
+ const value = fields[field];
|
|
|
+ if (numericFields.includes(field)) {
|
|
|
+ if (value === null || value === undefined || value === '') {
|
|
|
+ const column = weekColumns.value.find(col => col.field === field);
|
|
|
+ const title = column ? column.title : field;
|
|
|
+ ElMessage.warning(`${title} 不能为空`);
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ if (isNaN(Number(value))) {
|
|
|
+ const column = weekColumns.value.find(col => col.field === field);
|
|
|
+ const title = column ? column.title : field;
|
|
|
+ ElMessage.warning(`${title} 必须为数字`);
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ } else if (integerFields.includes(field)) {
|
|
|
+ if (value === null || value === undefined || value === '') {
|
|
|
+ const column = weekColumns.value.find(col => col.field === field);
|
|
|
+ const title = column ? column.title : field;
|
|
|
+ ElMessage.warning(`${title} 不能为空`);
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ if (!Number.isInteger(Number(value)) || isNaN(Number(value))) {
|
|
|
+ const column = weekColumns.value.find(col => col.field === field);
|
|
|
+ const title = column ? column.title : field;
|
|
|
+ ElMessage.warning(`${title} 必须为整数`);
|
|
|
+ return false;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
return true;
|
|
|
};
|
|
|
|
|
|
//创建日数据
|
|
|
async function createDayData() {
|
|
|
- // if (
|
|
|
- // isNaN(parseFloat(taskDataForm.sales)) ||
|
|
|
- // isNaN(parseFloat(taskDataForm.ad_sales)) ||
|
|
|
- // isNaN(parseFloat(taskDataForm.ad_cost))
|
|
|
- // ) {
|
|
|
- // ElMessage.warning('销售额、广告销售额、广告花费必须为数字');
|
|
|
- // return; // 停止执行后续操作
|
|
|
- // }
|
|
|
if (!validateNumericFields(taskDataForm)) return;
|
|
|
const body = {
|
|
|
- sales: taskDataForm.sales,
|
|
|
- ad_sales: taskDataForm.ad_sales,
|
|
|
- ad_cost: taskDataForm.ad_cost,
|
|
|
- enter_datetime: dailyEntryTime.value,
|
|
|
- data_datetime: dailyTime.value,
|
|
|
+ sales_original: taskDataForm.sales_original,
|
|
|
+ ad_sales_original: taskDataForm.ad_sales_original,
|
|
|
+ ad_cost_original: taskDataForm.ad_cost_original,
|
|
|
+ // enter_datetime: dailySalesTime.value,
|
|
|
+ data_datetime: dailySalesTime.value,
|
|
|
task: taskId,
|
|
|
};
|
|
|
if (!currentId) {
|
|
@@ -410,29 +437,27 @@ async function createDayData() {
|
|
|
|
|
|
//创建周数据
|
|
|
async function createWeekData() {
|
|
|
-
|
|
|
+ if (!validateNumericFields(taskDataForm)) return;
|
|
|
const body = {
|
|
|
- sales: taskDataForm.sales,
|
|
|
+ sales_original: taskDataForm.sales_original,
|
|
|
+ ad_sales_original: taskDataForm.ad_sales_original,
|
|
|
+ ad_cost_original: taskDataForm.ad_cost_original,
|
|
|
total_sales_current_monthly: taskDataForm.total_sales_current_monthly,
|
|
|
- ad_sales: taskDataForm.ad_sales,
|
|
|
- ad_cost: taskDataForm.ad_cost,
|
|
|
impression: taskDataForm.impression,
|
|
|
ad_click: taskDataForm.ad_click,
|
|
|
ad_order: taskDataForm.ad_order,
|
|
|
- money_by_amazon: taskDataForm.money_by_amazon,
|
|
|
- money_by_other: taskDataForm.money_by_other,
|
|
|
+ money_by_amazon_original: taskDataForm.money_by_amazon_original,
|
|
|
+ money_by_other_original: taskDataForm.money_by_other_original,
|
|
|
session: taskDataForm.session,
|
|
|
order: taskDataForm.order,
|
|
|
availableSalesDay: taskDataForm.availableSalesDay,
|
|
|
intransitInventory: taskDataForm.intransitInventory,
|
|
|
overseasStorage: taskDataForm.overseasStorage,
|
|
|
refundRate: taskDataForm.refundRate,
|
|
|
- sales_start_time: salesStartDate.value,
|
|
|
- sales_end_time: salesEndDate.value,
|
|
|
+ sales_start_time: entryStartDate.value,
|
|
|
+ sales_end_time: entryEndDate.value,
|
|
|
ad_start_time: adStartDate.value,
|
|
|
ad_end_time: adEndDate.value,
|
|
|
- enter_start_datetime: entryStartDate.value,
|
|
|
- enter_end_datetime: entryEndDate.value,
|
|
|
task: taskId,
|
|
|
};
|
|
|
if (!currentId) {
|
|
@@ -455,17 +480,16 @@ async function createWeekData() {
|
|
|
|
|
|
//创建月数据
|
|
|
async function createMonthData() {
|
|
|
+ if (!validateNumericFields(taskDataForm)) return;
|
|
|
const body = {
|
|
|
- sales: taskDataForm.sales,
|
|
|
- ad_sales: taskDataForm.ad_sales,
|
|
|
- ad_cost: taskDataForm.ad_cost,
|
|
|
+ sales_original: taskDataForm.sales_original,
|
|
|
+ ad_sales_original: taskDataForm.ad_sales_original,
|
|
|
+ ad_cost_original: taskDataForm.ad_cost_original,
|
|
|
impression: taskDataForm.impression,
|
|
|
ad_click: taskDataForm.ad_click,
|
|
|
ad_order: taskDataForm.ad_order,
|
|
|
data_start_time: startDate.value,
|
|
|
data_end_time: endDate.value,
|
|
|
- enter_start_time: startDate.value,
|
|
|
- enter_end_time: endDate.value,
|
|
|
task: taskId,
|
|
|
};
|
|
|
if (!currentId) {
|
|
@@ -509,13 +533,13 @@ const submitForm = async (formEl: FormInstance | undefined) => {
|
|
|
async function updateDayData(row: RowVO) {
|
|
|
const $grid = xGrid.value;
|
|
|
if ($grid) {
|
|
|
+
|
|
|
const body = {
|
|
|
id: row.id,
|
|
|
- sales: row.sales,
|
|
|
- ad_sales: row.ad_sales,
|
|
|
- ad_cost: row.ad_cost,
|
|
|
- enter_datetime: dailyEntryTime.value,
|
|
|
- data_datetime: dailyTime.value,
|
|
|
+ sales_original: row.sales_original,
|
|
|
+ ad_sales_original: row.ad_sales_original,
|
|
|
+ ad_cost_original: row.ad_cost_original,
|
|
|
+ data_datetime: dailySalesTime.value,
|
|
|
task: row.task,
|
|
|
};
|
|
|
try {
|
|
@@ -539,23 +563,23 @@ async function updateWeekData(row: RowVO) {
|
|
|
if ($grid) {
|
|
|
const body = {
|
|
|
id: row.id,
|
|
|
- sales: row.sales,
|
|
|
+ sales_original: row.sales_original,
|
|
|
+ ad_sales_original: row.ad_sales_original,
|
|
|
+ ad_cost_original: row.ad_cost_original,
|
|
|
total_sales_current_monthly: row.total_sales_current_monthly,
|
|
|
- ad_sales: row.ad_sales,
|
|
|
- ad_cost: row.ad_cost,
|
|
|
impression: row.impression,
|
|
|
ad_click: row.ad_click,
|
|
|
ad_order: row.ad_order,
|
|
|
- money_by_amazon: row.money_by_amazon,
|
|
|
- money_by_other: row.money_by_other,
|
|
|
+ money_by_amazon_original: row.money_by_amazon_original,
|
|
|
+ money_by_other_original: row.money_by_other_original,
|
|
|
session: row.session,
|
|
|
order: row.order,
|
|
|
availableSalesDay: row.availableSalesDay,
|
|
|
intransitInventory: row.intransitInventory,
|
|
|
overseasStorage: row.overseasStorage,
|
|
|
refundRate: row.refundRate,
|
|
|
- sales_start_time: salesStartDate.value,
|
|
|
- sales_end_time: salesEndDate.value,
|
|
|
+ sales_start_time: entryStartDate.value,
|
|
|
+ sales_end_time: entryEndDate.value,
|
|
|
ad_start_time: adStartDate.value,
|
|
|
ad_end_time: adEndDate.value,
|
|
|
enter_start_datetime: entryStartDate.value,
|
|
@@ -583,9 +607,9 @@ async function updateMonthData(row: RowVO) {
|
|
|
if ($grid) {
|
|
|
const body = {
|
|
|
id: row.id,
|
|
|
- sales: row.sales,
|
|
|
- ad_sales: row.ad_sales,
|
|
|
- ad_cost: row.ad_cost,
|
|
|
+ sales_original: row.sales_original,
|
|
|
+ ad_sales_original: row.ad_sales_original,
|
|
|
+ ad_cost_original: row.ad_cost_original,
|
|
|
impression: row.impression,
|
|
|
ad_click: row.ad_click,
|
|
|
ad_order: row.ad_order,
|
|
@@ -613,20 +637,19 @@ async function updateMonthData(row: RowVO) {
|
|
|
const editRowEvent = async (row: any) => {
|
|
|
const $grid = xGrid.value;
|
|
|
if ($grid) {
|
|
|
- await $grid.clearEdit();
|
|
|
if (dateType === 'day') {
|
|
|
+ const fieldsToValidate = ['sales_original', 'ad_sales_original', 'ad_cost_original'];
|
|
|
+ if (!validateNumericFields(row, fieldsToValidate)) return; // 验证字段
|
|
|
await updateDayData(row);
|
|
|
} else if (dateType === 'week') {
|
|
|
+ const fieldsToValidate = ['sales_original', 'ad_sales_original', 'ad_cost_original', 'total_sales_current_monthly', 'impression', 'ad_click', 'ad_order', 'money_by_amazon_original', 'money_by_other_original', 'session', 'order', 'availableSalesDay', 'intransitInventory', 'overseasStorage', 'refundRate'];
|
|
|
+ if (!validateNumericFields(row, fieldsToValidate)) return; // 验证字段
|
|
|
await updateWeekData(row);
|
|
|
} else if (dateType === 'month') {
|
|
|
+ const fieldsToValidate = ['sales_original', 'ad_sales_original', 'ad_cost_original', 'impression', 'ad_click', 'ad_order',];
|
|
|
await updateMonthData(row);
|
|
|
}
|
|
|
-
|
|
|
- gridOptions.loading = true;
|
|
|
- // 模拟异步保存
|
|
|
- setTimeout(() => {
|
|
|
- gridOptions.loading = false;
|
|
|
- }, 300);
|
|
|
+ await $grid.clearEdit();
|
|
|
}
|
|
|
};
|
|
|
|
|
@@ -639,18 +662,19 @@ const currentGridOptions = computed(() => {
|
|
|
});
|
|
|
|
|
|
const filteredDayColumns = computed(() => {
|
|
|
- return dayColumns.value.filter(item => !['平台编号', '平台名称', '国家', '品牌', '操作', '运营'].includes(item.title));
|
|
|
+ return dayColumns.value.filter(item => !['平台编号', '平台名称', '国家', '品牌', '操作', '运营','销售额','广告销售额','广告花费'].includes(item.title));
|
|
|
});
|
|
|
|
|
|
const filteredWeekColumns = computed(() => {
|
|
|
- return weekColumns.value.filter(item => !['平台编号', '平台名称', '国家', '品牌', '操作', '运营'].includes(item.title));
|
|
|
+ return weekColumns.value.filter(item => !['平台编号', '平台名称', '国家', '品牌', '操作', '运营','销售额','广告销售额','广告花费'].includes(item.title));
|
|
|
});
|
|
|
|
|
|
const filteredMonthColumns = computed(() => {
|
|
|
- return monthColumns.value.filter(item => !['平台编号', '平台名称', '国家', '品牌', '操作', '运营'].includes(item.title));
|
|
|
+ return monthColumns.value.filter(item => !['平台编号', '平台名称', '国家', '品牌', '操作', '运营','销售额','广告销售额','广告花费'].includes(item.title));
|
|
|
});
|
|
|
|
|
|
onMounted(() => {
|
|
|
+ setDefaultDate();
|
|
|
fetchCurrentTaskData();
|
|
|
});
|
|
|
</script>
|
|
@@ -659,27 +683,28 @@ onMounted(() => {
|
|
|
<div>
|
|
|
<el-card class="custom-card-style justify-between my-1.5 mx-2" >
|
|
|
<div class="custom-card-style flex gap-1.5 justify-between my-1.5 mx-2" >
|
|
|
- <!--<Selector ref="selectorRef" @update:updateData="updateDataChange" />-->
|
|
|
+ <Selector ref="selectorRef" @update:updateData="updateDataChange" />
|
|
|
<div v-if="dateType === 'day'" class="demo-date-picker">
|
|
|
<div class="block">
|
|
|
<span class="demonstration">日数据时间:</span>
|
|
|
<el-date-picker
|
|
|
- v-model="dailyTime"
|
|
|
+ v-model="dailySalesTime"
|
|
|
:shortcuts="shortcuts"
|
|
|
- disabled
|
|
|
- type="Date"
|
|
|
- />
|
|
|
- </div>
|
|
|
- <div class="block">
|
|
|
- <span class="demonstration">日录入数据时间:</span>
|
|
|
- <el-date-picker
|
|
|
- v-model="dailyEntryTime"
|
|
|
:disabled-date="disabledDate"
|
|
|
- :shortcuts="shortcuts"
|
|
|
type="Date"
|
|
|
@change="handleDayChange"
|
|
|
/>
|
|
|
</div>
|
|
|
+ <!--<div class="block">-->
|
|
|
+ <!-- <span class="demonstration">日录入数据时间:</span>-->
|
|
|
+ <!-- <el-date-picker-->
|
|
|
+ <!-- v-model="dailyEntryTime"-->
|
|
|
+ <!-- :disabled-date="disabledDate"-->
|
|
|
+ <!-- :shortcuts="shortcuts"-->
|
|
|
+ <!-- type="Date"-->
|
|
|
+ <!-- @change="handleDayChange"-->
|
|
|
+ <!-- />-->
|
|
|
+ <!--</div>-->
|
|
|
</div>
|
|
|
<div v-if="dateType === 'week'" class="demo-date-picker">
|
|
|
<el-config-provider :locale="enLocale">
|
|
@@ -693,18 +718,18 @@ onMounted(() => {
|
|
|
type="week"
|
|
|
/>
|
|
|
</div>
|
|
|
+ <!--<div class="block">-->
|
|
|
+ <!-- <span class="demonstration">周销售数据时间:</span>-->
|
|
|
+ <!-- <el-date-picker-->
|
|
|
+ <!-- v-model="weeklySalesTime"-->
|
|
|
+ <!-- :format="salesFormat"-->
|
|
|
+ <!-- disabled-->
|
|
|
+ <!-- placeholder="选择一周"-->
|
|
|
+ <!-- type="week"-->
|
|
|
+ <!-- />-->
|
|
|
+ <!--</div>-->
|
|
|
<div class="block">
|
|
|
<span class="demonstration">周销售数据时间:</span>
|
|
|
- <el-date-picker
|
|
|
- v-model="weeklySalesTime"
|
|
|
- :format="salesFormat"
|
|
|
- disabled
|
|
|
- placeholder="选择一周"
|
|
|
- type="week"
|
|
|
- />
|
|
|
- </div>
|
|
|
- <div class="block">
|
|
|
- <span class="demonstration">周录入数据时间:</span>
|
|
|
<el-date-picker
|
|
|
v-model="weeklyEntryTime"
|
|
|
:disabled-date="disabledDate"
|
|
@@ -718,7 +743,7 @@ onMounted(() => {
|
|
|
</div>
|
|
|
<div v-if="dateType === 'month'" class="demo-date-picker">
|
|
|
<div class="block">
|
|
|
- <span class="demonstration">月录入数据时间:</span>
|
|
|
+ <span class="demonstration">月数据时间:</span>
|
|
|
<el-date-picker
|
|
|
v-model="monthlyEntryTime"
|
|
|
:disabled-date="disabledDate"
|
|
@@ -737,7 +762,7 @@ onMounted(() => {
|
|
|
<vxe-grid ref="xGrid" stripe v-bind="currentGridOptions" v-on="gridEvents">
|
|
|
<template #operate="{ row }">
|
|
|
<template v-if="hasActiveEditRow(row)">
|
|
|
- <el-button link size="small" @click="clearRowEvent">取消</el-button>
|
|
|
+ <el-button link size="small" @click="clearRowEvent(row)">取消</el-button>
|
|
|
<el-button link size="small" type="warning" @click="editRowEvent(row)">保存</el-button>
|
|
|
</template>
|
|
|
<template v-else>
|
|
@@ -745,14 +770,14 @@ onMounted(() => {
|
|
|
</template>
|
|
|
<el-button :disabled="row.id" link size="small" type="primary" @click="editEvent(row)">创建</el-button>
|
|
|
</template>
|
|
|
- <template #sales_edit="{ row }">
|
|
|
- <vxe-input v-model="row.sales"></vxe-input>
|
|
|
+ <template #sales_original_edit="{ row }">
|
|
|
+ <vxe-input v-model="row.sales_original"></vxe-input>
|
|
|
</template>
|
|
|
- <template #ad_sales_edit="{ row }">
|
|
|
- <vxe-input v-model="row.ad_sales"></vxe-input>
|
|
|
+ <template #ad_sales_original_edit="{ row }">
|
|
|
+ <vxe-input v-model="row.ad_sales_original"></vxe-input>
|
|
|
</template>
|
|
|
- <template #ad_cost_edit="{ row }">
|
|
|
- <vxe-input v-model="row.ad_cost"></vxe-input>
|
|
|
+ <template #ad_cost_original_edit="{ row }">
|
|
|
+ <vxe-input v-model="row.ad_cost_original"></vxe-input>
|
|
|
</template>
|
|
|
<template #total_sales_current_monthly_edit="{ row }">
|
|
|
<vxe-input v-model="row.total_sales_current_monthly"></vxe-input>
|
|
@@ -767,10 +792,10 @@ onMounted(() => {
|
|
|
<vxe-input v-model="row.ad_order"></vxe-input>
|
|
|
</template>
|
|
|
<template #money_by_amazon_edit="{ row }">
|
|
|
- <vxe-input v-model="row.money_by_amazon"></vxe-input>
|
|
|
+ <vxe-input v-model="row.money_by_amazon_original"></vxe-input>
|
|
|
</template>
|
|
|
<template #money_by_other_edit="{ row }">
|
|
|
- <vxe-input v-model="row.money_by_other"></vxe-input>
|
|
|
+ <vxe-input v-model="row.money_by_other_original"></vxe-input>
|
|
|
</template>
|
|
|
<template #session_edit="{ row }">
|
|
|
<vxe-input v-model="row.session"></vxe-input>
|