|
|
@@ -46,7 +46,6 @@
|
|
|
</el-radio>
|
|
|
<div class="annual-row">
|
|
|
<div class="date-group">
|
|
|
- <!-- 日期选择器代码保持不变 -->
|
|
|
<el-select v-model="queryParams.annual" placeholder="" class="date-select"
|
|
|
:disabled="queryParams.targetPeriodType !== TARGET_PERIOD_TYPE.ANNUAL">
|
|
|
<el-option v-for="year in years" :key="year" :label="year" :value="year"></el-option>
|
|
|
@@ -74,7 +73,7 @@
|
|
|
:show-business-type="false"
|
|
|
/>
|
|
|
<div class="btn-section" style="padding-left: 78px; margin-top: 25px;">
|
|
|
- <button class="operate-btn" @click="handleConfirm" v-hasPermi="['fcbi:sales:sum']">集計</button>
|
|
|
+ <button class="operate-btn" @click="handleAggregate" v-hasPermi="['fcbi:sales:sum']">集計</button>
|
|
|
</div>
|
|
|
</div>
|
|
|
</div>
|
|
|
@@ -88,19 +87,20 @@ import { useSurveyStore, useSurveySalesStore } from '@/store/surveyStore';
|
|
|
import { useRouter } from 'vue-router';
|
|
|
import { AGGREGATION_TYPE, TARGET_PERIOD_TYPE } from '@/constants';
|
|
|
|
|
|
+const currentYear = new Date().getFullYear();
|
|
|
+const years = Array.from({ length: 11 }, (_, i) => currentYear + i);
|
|
|
+const months = Array.from({ length: 12 }, (_, i) => i + 1);
|
|
|
+const error = ref('');
|
|
|
const { proxy } = getCurrentInstance();
|
|
|
const surveyStore = useSurveyStore();
|
|
|
const surveySalesStore = useSurveySalesStore();
|
|
|
const router = useRouter();
|
|
|
|
|
|
-// 导出常量以便在模板中使用
|
|
|
-defineExpose({
|
|
|
- AGGREGATION_TYPE,
|
|
|
- TARGET_PERIOD_TYPE
|
|
|
-});
|
|
|
+// テンプレートで定数を使用可能にするため、エクスポートします
|
|
|
+defineExpose({ AGGREGATION_TYPE, TARGET_PERIOD_TYPE });
|
|
|
|
|
|
/**
|
|
|
- * データ辞書から品牌と業務タイプのデータを取得します
|
|
|
+ * データ辞書からブランドと業務タイプのデータを取得します
|
|
|
*/
|
|
|
const { yamada_fc_brand: yamadaFcBrand } = proxy.useDict('yamada_fc_brand');
|
|
|
const { yamada_business_type: yamadaBusinessType } = proxy.useDict('yamada_business_type');
|
|
|
@@ -110,10 +110,6 @@ const { yamada_business_type: yamadaBusinessType } = proxy.useDict('yamada_busin
|
|
|
*/
|
|
|
const regionTree = ref([]);
|
|
|
const selectedRegions = ref([]);
|
|
|
-const error = ref('');
|
|
|
-const currentYear = new Date().getFullYear();
|
|
|
-const years = Array.from({ length: 11 }, (_, i) => currentYear + i);
|
|
|
-const months = Array.from({ length: 12 }, (_, i) => i + 1);
|
|
|
|
|
|
/**
|
|
|
* フォームの入力データを保持するオブジェクトです
|
|
|
@@ -137,7 +133,7 @@ const { queryParams } = toRefs(data);
|
|
|
* 地域ツリーのデータが更新されたときに、選択された地域を更新します
|
|
|
*/
|
|
|
watch(() => regionTree.value, (newVal) => {
|
|
|
- if (newVal && newVal.length > 0) {
|
|
|
+ if (newVal?.length) {
|
|
|
updateSelectedRegions(newVal);
|
|
|
}
|
|
|
}, { deep: true });
|
|
|
@@ -164,9 +160,10 @@ onMounted(async () => {
|
|
|
if (response?.success) {
|
|
|
const regions = response.data.regions || [];
|
|
|
regionTree.value = regions;
|
|
|
+ console.log(regions);
|
|
|
surveyStore.setRegionTree(regions)
|
|
|
- if (regionTree.value.length > 0) {
|
|
|
- updateSelectedRegions(regionTree.value);
|
|
|
+ if (regions.length) {
|
|
|
+ updateSelectedRegions(regions);
|
|
|
}
|
|
|
} else {
|
|
|
error.value = response?.message || '地域データの取得に失敗しました';
|
|
|
@@ -174,8 +171,8 @@ onMounted(async () => {
|
|
|
console.error('地域データの取得に失敗しました:', response);
|
|
|
}
|
|
|
} catch (err) {
|
|
|
- error.value = '地域データの取得中にエラーが発生しました';
|
|
|
- proxy.$message.error(error.value);
|
|
|
+ const errorMsg = '地域データの取得中にエラーが発生しました';
|
|
|
+ proxy.$message.error(errorMsg);
|
|
|
console.error('地域データの取得中にエラーが発生しました:', err);
|
|
|
}
|
|
|
});
|
|
|
@@ -185,25 +182,23 @@ onMounted(async () => {
|
|
|
*/
|
|
|
const handleCheckChange = (regionId, isChecked) => {
|
|
|
const region = findRegionById(regionTree.value, regionId);
|
|
|
- if (region) {
|
|
|
- if (isChecked) {
|
|
|
- if (!selectedRegions.value.some(r => r.regionCode === region.regionCode)) {
|
|
|
- selectedRegions.value.push({
|
|
|
- regionCode: region.regionCode
|
|
|
- });
|
|
|
- }
|
|
|
- } else {
|
|
|
- selectedRegions.value = selectedRegions.value.filter(r => r.regionCode !== region.regionCode);
|
|
|
+ if (!region) return;
|
|
|
+
|
|
|
+ if (isChecked) {
|
|
|
+ if (!selectedRegions.value.some(r => r.regionCode === region.regionCode)) {
|
|
|
+ selectedRegions.value.push({ regionCode: region.regionCode });
|
|
|
}
|
|
|
- queryParams.value.regions = [...selectedRegions.value];
|
|
|
+ } else {
|
|
|
+ selectedRegions.value = selectedRegions.value.filter(r => r.regionCode !== region.regionCode);
|
|
|
}
|
|
|
+ queryParams.value.regions = [...selectedRegions.value];
|
|
|
};
|
|
|
|
|
|
/**
|
|
|
* 指定されたIDを持つ地域ノードをツリーから再帰的に検索します
|
|
|
*/
|
|
|
const findRegionById = (nodes, id) => {
|
|
|
- if (!nodes || !nodes.length) return null;
|
|
|
+ if (!nodes?.length) return null;
|
|
|
|
|
|
for (const node of nodes) {
|
|
|
if (node.id === id) {
|
|
|
@@ -223,7 +218,7 @@ const findRegionById = (nodes, id) => {
|
|
|
* 選択されたすべての地域を再帰的に更新し、サブノードのみを収集します
|
|
|
*/
|
|
|
const updateSelectedRegions = (nodes) => {
|
|
|
- if (!nodes || !nodes.length) return;
|
|
|
+ if (!nodes?.length) return;
|
|
|
selectedRegions.value = [];
|
|
|
// 最上位ノードは親ノードとしてマークされ、再帰的に子ノードを処理します
|
|
|
collectSelectedRegions(nodes, true);
|
|
|
@@ -276,33 +271,29 @@ const validateForm = () => {
|
|
|
};
|
|
|
|
|
|
/**
|
|
|
- * 確認ボタンをクリックしたときの処理関数です
|
|
|
- * @constructor
|
|
|
+ * 集計ボタンをクリックしたときの処理関数です
|
|
|
*/
|
|
|
-const handleConfirm = () => {
|
|
|
-
|
|
|
+const handleAggregate = () => {
|
|
|
const errors = validateForm();
|
|
|
-
|
|
|
- if (errors.length > 0) {
|
|
|
- errors.forEach(error => {
|
|
|
- proxy.$message.warning(error);
|
|
|
- });
|
|
|
+ if (errors.length) {
|
|
|
+ errors.forEach(error => proxy.$message.warning(error));
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
let salesFlag = 0;
|
|
|
- const isMonth = queryParams.value.targetPeriodType === TARGET_PERIOD_TYPE.MONTHLY;
|
|
|
+ const isMonthly = queryParams.value.targetPeriodType === TARGET_PERIOD_TYPE.MONTHLY;
|
|
|
+ const { aggregationType } = queryParams.value;
|
|
|
|
|
|
- switch (queryParams.value.aggregationType) {
|
|
|
+ switch (aggregationType) {
|
|
|
case AGGREGATION_TYPE.FC:
|
|
|
- const hasArea = queryParams.value.regions && queryParams.value.regions.length > 0;
|
|
|
- salesFlag = isMonth ? (hasArea ? 1 : 2) : (hasArea ? 3 : 4);
|
|
|
+ const hasArea = queryParams.value.regions?.length > 0;
|
|
|
+ salesFlag = isMonthly ? (hasArea ? 1 : 2) : (hasArea ? 3 : 4);
|
|
|
break;
|
|
|
case AGGREGATION_TYPE.AREA:
|
|
|
- salesFlag = isMonth ? 7 : 8;
|
|
|
+ salesFlag = isMonthly ? 7 : 8;
|
|
|
break;
|
|
|
case AGGREGATION_TYPE.STORE:
|
|
|
- salesFlag = isMonth ? 5 : 6;
|
|
|
+ salesFlag = isMonthly ? 5 : 6;
|
|
|
break;
|
|
|
default:
|
|
|
proxy.$message.warning('集計種別を選択してください');
|
|
|
@@ -311,21 +302,21 @@ const handleConfirm = () => {
|
|
|
|
|
|
const transferData = {
|
|
|
targetPeriodType: queryParams.value.targetPeriodType,
|
|
|
- startYear: isMonth ? queryParams.value.startYear : null,
|
|
|
- startMonth: isMonth ? queryParams.value.startMonth : null,
|
|
|
- annual: !isMonth ? queryParams.value.annual : null,
|
|
|
+ startYear: isMonthly ? queryParams.value.startYear : null,
|
|
|
+ startMonth: isMonthly ? queryParams.value.startMonth : null,
|
|
|
+ annual: !isMonthly ? queryParams.value.annual : null,
|
|
|
brandCodes: queryParams.value.brandCode,
|
|
|
- regionCodes: queryParams.value.regions.map(region => region.regionCode),
|
|
|
+ regionCodes: queryParams.value.regions.map(r => r.regionCode),
|
|
|
aggregationType: queryParams.value.aggregationType,
|
|
|
salesFlag: salesFlag
|
|
|
};
|
|
|
-
|
|
|
+console.log(transferData);
|
|
|
surveySalesStore.setSalesData(transferData);
|
|
|
router.push({ name: 'salesSumResult' });
|
|
|
};
|
|
|
|
|
|
/**
|
|
|
- * キャンセルボタンをクリックしたときの処理関数です
|
|
|
+ * リセットボタンをクリックしたときの処理関数です
|
|
|
*/
|
|
|
const resetForm = () => {
|
|
|
queryParams.value.targetPeriodType = TARGET_PERIOD_TYPE.MONTHLY;
|
|
|
@@ -336,15 +327,17 @@ const resetForm = () => {
|
|
|
queryParams.value.brandCode = [];
|
|
|
queryParams.value.regions = [];
|
|
|
selectedRegions.value = [];
|
|
|
- if (regionTree.value.length > 0) {
|
|
|
+ if (regionTree.value.length) {
|
|
|
resetRegionTreeCheck(regionTree.value);
|
|
|
}
|
|
|
};
|
|
|
-
|
|
|
+/**
|
|
|
+ * 地域ツリーのチェック状態をリセットします
|
|
|
+ */
|
|
|
const resetRegionTreeCheck = (nodes) => {
|
|
|
nodes.forEach(node => {
|
|
|
node.checked = false;
|
|
|
- if (node.children && node.children.length > 0) {
|
|
|
+ if (node.children?.length) {
|
|
|
resetRegionTreeCheck(node.children);
|
|
|
}
|
|
|
});
|