Sfoglia il codice sorgente

feat:添加英文切换

wangsisi 4 giorni fa
parent
commit
b2ed5f06d1

+ 76 - 2
src/i18n/messages.js

@@ -59,6 +59,9 @@ export default {
         growthReport: {
             title: "长势报告",
             cropTitle: "作物长势报告",
+            weatherRiskReport: "气象风险报告",
+            switchCategory: "切换品类",
+            noRiskData: "暂无气象风险数据",
             weatherRisk: "气象风险",
             cropLychee: "荔枝",
             phenologyFruitExpansion: "转色期",
@@ -202,6 +205,40 @@ export default {
             prescription: "药物处方",
             executionMethod: "执行方式",
         },
+        workExecute: {
+            pending: "待接受",
+            accepted: "已接受",
+            executing: "执行中",
+            completed: "已完成",
+            timeout: "已超时",
+            unqualified: "未达标",
+            acceptTimeout: "接受超时",
+            executeTimeout: "执行超时",
+            completeTimeout: "完成超时",
+            farmWorkType: "农事类型",
+            farmFilter: "农场筛选",
+            batchAccept: "批量接受",
+            responsible: "负责人:",
+            farmWorkDetail: "农事详情:",
+            farmSituation: "农情研判:",
+            executeTime: "执行时间",
+            executeArea: "执行区域",
+            executeMachine: "执行农机",
+            unqualifiedReason: "未达标原因:",
+            defaultUnqualifiedReason: "未在合适时间执行,药液未充分喷撒吸收",
+            before: "前",
+            after: "后",
+            fromFarm: "来自某某农场农场",
+            noData: "暂无数据",
+            all: "全部",
+            redispatch: "重新派发",
+            remindAccept: "提醒接受",
+            remindExecute: "提醒执行",
+            remindComplete: "提醒完成",
+            redispatchAgain: "重新下发",
+            remindSuccess: "提醒成功!",
+            redispatchMsg: "重新派发:{name}",
+        },
     },
     en: {
         tabbar: {
@@ -261,6 +298,9 @@ export default {
         growthReport: {
             title: "Growth Report",
             cropTitle: "Crop Growth Report",
+            weatherRiskReport: "Weather RiskReport",
+            switchCategory: "Switch category",
+            noRiskData: "No weather risk data",
             weatherRisk: "Weather risks",
             cropLychee: "Lychee",
             phenologyFruitExpansion: "Color change stage",
@@ -323,9 +363,9 @@ export default {
             selectReproductiveToast: "Please select reproductive stage",
         },
         agriFile: {
-            legendZone: "Management Zone",
+            legendZone: "Management zone",
             legendGrowth: "Growth Abnormality",
-            legendPest: "Pest & Disease",
+            legendPest: "Pest &Disease",
             scaleNormal: "Normal",
             scaleGood: "Good",
             scaleExcellent: "Excellent",
@@ -404,5 +444,39 @@ export default {
             prescription: "Rx",
             executionMethod: "Method",
         },
+        workExecute: {
+            pending: "Pending",
+            accepted: "Accepted",
+            executing: "In progress",
+            completed: "Completed",
+            timeout: "Timed out",
+            unqualified: "Below standard",
+            acceptTimeout: "Acceptance overdue",
+            executeTimeout: "Execution overdue",
+            completeTimeout: "Completion overdue",
+            farmWorkType: "Farm work type",
+            farmFilter: "Farm filter",
+            batchAccept: "Batch accept",
+            responsible: "Responsible: ",
+            farmWorkDetail: "Details: ",
+            farmSituation: "Assessment: ",
+            executeTime: "Execution time",
+            executeArea: "Execution area",
+            executeMachine: "Machinery",
+            unqualifiedReason: "Reason: ",
+            defaultUnqualifiedReason: "Not executed at the right time; spray was not fully absorbed",
+            before: "Before",
+            after: "After",
+            fromFarm: "From demo farm",
+            noData: "No data",
+            all: "All",
+            redispatch: "Redispatch",
+            remindAccept: "Remind to accept",
+            remindExecute: "Remind to execute",
+            remindComplete: "Remind to complete",
+            redispatchAgain: "Redispatch",
+            remindSuccess: "Reminder sent!",
+            redispatchMsg: "Redispatched: {name}",
+        },
     },
 };

+ 7 - 3
src/views/old_mini/growth_report/components/RiskReportContent.vue

@@ -1,7 +1,7 @@
 <template>
     <div class="risk-report-content">
-        <div v-if="loading" class="panel-state">加载中...</div>
-        <div v-else-if="!riskList.length" class="panel-state">暂无气象风险数据</div>
+        <div v-if="loading" class="panel-state">{{ t("agriFile.loading") }}</div>
+        <div v-else-if="!riskList.length" class="panel-state">{{ t("growthReport.noRiskData") }}</div>
         <div
             v-else
             v-for="(item, index) in riskList"
@@ -10,7 +10,7 @@
         >
             <div class="risk-card__head">
                 <img class="risk-card__icon" src="@/assets/img/report/weather-icon.png" alt="" />
-                <span class="risk-card__label">{{ item.title || "气象风险" }}</span>
+                <span class="risk-card__label">{{ item.title || t("growthReport.weatherRisk") }}</span>
             </div>
             <div class="risk-card__content">
                 <img class="risk-card__thumb" :src="item.image || defaultThumb" alt="" />
@@ -21,6 +21,10 @@
 </template>
 
 <script setup>
+import { useI18n } from "@/i18n";
+
+const { t } = useI18n();
+
 defineProps({
     loading: {
         type: Boolean,

+ 98 - 17
src/views/old_mini/growth_report/components/RiskReportPanel.vue

@@ -15,14 +15,32 @@
     >
         <template v-if="viewType === 'risk'">
             <div class="panel-header-zone">
-                <div class="panel-header">
-                    <div class="panel-header__left">
-                        <span class="panel-header__bar"></span>
-                        <span class="panel-header__title">气象风险报告</span>
-                        <span class="panel-header__date">{{ reportDate }}</span>
+                <div class="panel-header" :class="{ 'panel-header--en': locale === 'en' }">
+                    <div class="panel-header__row">
+                        <div class="panel-header__left">
+                            <span class="panel-header__bar"></span>
+                            <span
+                                class="panel-header__title panel-header__title--toggle"
+                                @click="toggleLocale"
+                            >{{ t("growthReport.weatherRiskReport") }}</span>
+                            <span v-if="locale !== 'en'" class="panel-header__date">{{ reportDate }}</span>
+                        </div>
+                        <span v-if="locale === 'en'" class="panel-header__date">{{ reportDate }}</span>
+                        <div
+                            v-if="locale !== 'en'"
+                            class="panel-header__switch"
+                            @click="handleSwitchCategory"
+                        >
+                            <span>{{ t("growthReport.switchCategory") }}</span>
+                            <icon name="arrow-down" class="panel-header__switch-icon" />
+                        </div>
                     </div>
-                    <div class="panel-header__switch" @click="handleSwitchCategory">
-                        <span>切换品类</span>
+                    <div
+                        v-if="locale === 'en'"
+                        class="panel-header__switch panel-header__switch--en"
+                        @click="handleSwitchCategory"
+                    >
+                        <span>{{ t("growthReport.switchCategory") }}</span>
                         <icon name="arrow-down" class="panel-header__switch-icon" />
                     </div>
                 </div>
@@ -46,9 +64,11 @@
 import { FloatingPanel, Icon } from "vant";
 import { computed, ref, watch } from "vue";
 import { useStore } from "vuex";
+import { useI18n } from "@/i18n";
 import PlotDetailContent from "./PlotDetailContent.vue";
 import RiskReportContent from "./RiskReportContent.vue";
 
+const { t, toggleLocale, locale } = useI18n();
 const store = useStore();
 const tabBarHeight = computed(() => store.state.home.tabBarHeight);
 
@@ -65,23 +85,33 @@ const props = defineProps({
 
 const emit = defineEmits(["switchCategory", "expandProgress", "closePlotDetail"]);
 
-const formatReportDate = (date = new Date()) => {
+const MONTHS_EN = [
+    "January", "February", "March", "April", "May", "June",
+    "July", "August", "September", "October", "November", "December",
+];
+
+const formatReportDate = (date = new Date(), lang = "zh") => {
     const year = date.getFullYear();
-    const month = String(date.getMonth() + 1).padStart(2, "0");
-    const day = String(date.getDate()).padStart(2, "0");
-    return `${year}.${month}.${day}`;
+    const month = date.getMonth() + 1;
+    const day = date.getDate();
+    if (lang === "en") {
+        return `${MONTHS_EN[month - 1]} ${day}, ${year}`;
+    }
+    return `${year}.${String(month).padStart(2, "0")}.${String(day).padStart(2, "0")}`;
 };
 
-const reportDate = ref(formatReportDate());
+const reportDate = computed(() => formatReportDate(new Date(), locale.value));
 const loading = ref(false);
-const riskList = ref([
+const riskList = computed(() => [
     {
-        title: "气象风险",
-        description: "花期短暂,果期集中,成熟迅速花期短暂,花期短暂,果期集中,成熟迅速花期短暂",
+        title: t("growthReport.weatherRisk"),
+        description:
+            "花期短暂,果期集中,成熟迅速花期短暂,花期短暂,果期集中,成熟迅速花期短暂",
     },
     {
-        title: "气象风险",
-        description: "花期短暂,果期集中,成熟迅速花期短暂,花期短暂,果期集中,成熟迅速花期短暂",
+        title: t("growthReport.weatherRisk"),
+        description:
+            "花期短暂,果期集中,成熟迅速花期短暂,花期短暂,果期集中,成熟迅速花期短暂",
     },
 ]);
 
@@ -239,6 +269,52 @@ const handleHeightChange = () => {
     padding: 2px 12px 8px;
     box-sizing: border-box;
 
+    &__row {
+        display: flex;
+        align-items: center;
+        justify-content: space-between;
+        width: 100%;
+        gap: 8px;
+        min-width: 0;
+    }
+
+    &--en {
+        flex-direction: column;
+        align-items: flex-start;
+        gap: 10px;
+        padding-bottom: 10px;
+
+        .panel-header__row {
+            width: 100%;
+        }
+
+        .panel-header__left {
+            flex: 1;
+            min-width: 0;
+        }
+
+        .panel-header__title {
+            font-size: 17px;
+            font-weight: 600;
+            color: #000;
+        }
+
+        .panel-header__date {
+            flex-shrink: 0;
+            padding: 4px 8px;
+            font-size: 12px;
+            color: #313131;
+            background: rgba(255, 255, 255, 0.72);
+            border-radius: 4px;
+        }
+
+        .panel-header__switch--en {
+            padding: 4px 10px;
+            border-radius: 4px;
+            border-color: rgba(33, 153, 248, 0.75);
+        }
+    }
+
     &__left {
         display: flex;
         align-items: center;
@@ -255,6 +331,11 @@ const handleHeightChange = () => {
     &__title {
         font-size: 16px;
         font-weight: 500;
+
+        &--toggle {
+            cursor: pointer;
+            user-select: none;
+        }
     }
 
     &__date {

+ 33 - 6
src/views/old_mini/growth_report/index.vue

@@ -18,7 +18,7 @@
                 @selectGarden="handleGardenSelected" />
         </div>
         <div class="report-content" v-show="activeGardenTab === 'current'">
-            <div class="map-legend">
+            <div class="map-legend" :class="{ 'map-legend--en': locale === 'en' }">
                 <div
                     v-for="item in mapLegendItems"
                     :key="item.key"
@@ -44,6 +44,7 @@
 import { computed, nextTick, onActivated, ref } from "vue";
 import { useRoute, useRouter } from "vue-router";
 import { useStore } from "vuex";
+import { useI18n } from "@/i18n";
 import weatherInfo from "@/components/weatherInfo.vue";
 import gardenList from "@/components/gardenList.vue";
 import GrowthReportMap from "./growthReportMap.js";
@@ -53,6 +54,7 @@ import * as util from "@/common/ol_common.js";
 const DEFAULT_FARM_POINT = "POINT(113.6142086995688 23.585836479509055)";
 
 const store = useStore();
+const { t, locale } = useI18n();
 const route = useRoute();
 const router = useRouter();
 const tabBarHeight = computed(() => store.state.home.tabBarHeight);
@@ -131,11 +133,11 @@ const initGrowthReportMap = async () => {
     await syncMapByFarm();
 };
 
-const mapLegendItems = [
-    { key: "zone", label: "管理分区", pillClass: "map-legend__pill--zone" },
-    { key: "growth", label: "长势异常", pillClass: "map-legend__pill--growth" },
-    { key: "pest", label: "病虫害异常", pillClass: "map-legend__pill--pest" },
-];
+const mapLegendItems = computed(() => [
+    { key: "zone", label: t("agriFile.legendZone"), pillClass: "map-legend__pill--zone" },
+    { key: "growth", label: t("agriFile.legendGrowth"), pillClass: "map-legend__pill--growth" },
+    { key: "pest", label: t("agriFile.legendPest"), pillClass: "map-legend__pill--pest" },
+]);
 
 const handleReportTabClick = (item) => {
     if (item.key === "historyRisk") {
@@ -256,6 +258,31 @@ onActivated(async () => {
             border-radius: 4px;
             box-sizing: border-box;
 
+            &--en {
+                flex-direction: column;
+                align-items: flex-start;
+                gap: 6px;
+                padding: 8px 10px;
+                background: rgba(0, 0, 0, 0.72);
+                border-radius: 6px;
+
+                .map-legend__item {
+                    gap: 6px;
+                }
+
+                .map-legend__pill {
+                    width: 18px;
+                    height: 4px;
+                    flex-shrink: 0;
+                }
+
+                .map-legend__text {
+                    font-size: 11px;
+                    line-height: 1.2;
+                    white-space: nowrap;
+                }
+            }
+
             &__item {
                 display: flex;
                 align-items: center;

+ 68 - 51
src/views/old_mini/work_execute/index.vue

@@ -9,33 +9,34 @@
         <div class="task-list">
             <div class="list-filter">
                 <div class="filter-item" :class="{ active: activeIndex === 0 }" @click="handleActiveFilter(0)">
-                    待接受({{ taskCounts[0] || 0 }})
+                    {{ t("workExecute.pending") }}({{ taskCounts[0] || 0 }})
                 </div>
                 <div class="filter-item" :class="{ active: activeIndex === 2 }" @click="handleActiveFilter(2)">
-                    已接受({{ taskCounts[2] || 0 }})
+                    {{ t("workExecute.accepted") }}({{ taskCounts[2] || 0 }})
                 </div>
                 <div class="filter-item" :class="{ active: activeIndex === 3 }" @click="handleActiveFilter(3)">
-                    执行中({{ taskCounts[3] || 0 }})
+                    {{ t("workExecute.executing") }}({{ taskCounts[3] || 0 }})
                 </div>
                 <div class="filter-item" :class="{ active: activeIndex === 4 }" @click="handleActiveFilter(3)">
-                    已完成({{ taskCounts[4] || 0 }})
+                    {{ t("workExecute.completed") }}({{ taskCounts[4] || 0 }})
                 </div>
             </div>
             <div class="list-box">
                 <div class="list-header">
                     <div class="select-group">
-                        <el-select class="select-item" v-model="selectParma.farmWorkTypeId" placeholder="农事类型"
+                        <el-select class="select-item" v-model="selectParma.farmWorkTypeId" :placeholder="t('workExecute.farmWorkType')"
                             @change="getSimpleList">
-                            <el-option v-for="item in farmWorkTypeList" :key="item.id" :label="item.name"
+                            <el-option v-for="item in farmWorkTypeList" :key="item.id"
+                                :label="item.id === 0 ? t('workExecute.all') : item.name"
                                 :value="item.id" />
                         </el-select>
-                        <el-select class="select-item" v-model="selectParma.districtCode" placeholder="农场筛选"
+                        <el-select class="select-item" v-model="selectParma.districtCode" :placeholder="t('workExecute.farmFilter')"
                             @change="getSimpleList">
                             <el-option v-for="item in districtList" :key="item.code" :label="item.name"
                                 :value="item.code" />
                         </el-select>
                     </div>
-                    <div class="action-btn">批量接受</div>
+                    <!-- <div class="action-btn">{{ t("workExecute.batchAccept") }}</div> -->
                 </div>
                 <!-- 任务列表 -->
                 <div class="work-task-list" v-loading="loading" element-loading-background="rgba(0, 0, 0, 0.3)">
@@ -54,20 +55,20 @@
                             {{ getTimeoutText() }}
                         </span>
                         <span class="task-tag" v-else>
-                            {{ activeStatus }}
+                            {{ getStatusLabel(activeStatus) }}
                         </span>
                         <div class="item-content">
                             <div class="item-info">
                                 <div class="info-item">
-                                    <div class="info-name">负责人:</div><span class="val-text">
+                                    <div class="info-name">{{ t("workExecute.responsible") }}</div><span class="val-text">
                                         某某某、某某某</span>
                                 </div>
                                 <div class="info-item" v-if="mode !== 'review'">
-                                    <div class="info-name">农事详情:</div><span class="val-text">
+                                    <div class="info-name">{{ t("workExecute.farmWorkDetail") }}</div><span class="val-text">
                                         {{ item.operation?.drug }}</span>
                                 </div>
                                 <div class="info-item">
-                                    <div class="info-name">农情研判:</div><span class="val-text">
+                                    <div class="info-name">{{ t("workExecute.farmSituation") }}</div><span class="val-text">
                                         {{ item.operation?.work_reason }}</span>
                                 </div>
                             </div>
@@ -77,30 +78,30 @@
                                         <div class="stat-value">
                                             {{ item.time ? formatGMTToYMD(item.time) : "--" }}
                                         </div>
-                                        <div class="stat-label">执行时间</div>
+                                        <div class="stat-label">{{ t("workExecute.executeTime") }}</div>
                                     </div>
                                     <div class="cell-line"></div>
                                     <div class="stat-cell">
                                         <div class="stat-value">{{ item.geohash_sample || "--" }}</div>
-                                        <div class="stat-label">执行区域</div>
+                                        <div class="stat-label">{{ t("workExecute.executeArea") }}</div>
                                     </div>
                                     <div class="cell-line"></div>
                                     <div class="stat-cell">
                                         <div class="stat-value">{{ item.operation?.machine_code || "--" }}</div>
-                                        <div class="stat-label">执行农机</div>
+                                        <div class="stat-label">{{ t("workExecute.executeMachine") }}</div>
                                     </div>
                                 </div>
                             </div>
                         </div>
 
                         <div class="unqualified-reason" v-if="activeStatus === '未达标'">
-                            未达标原因:{{ item.operation?.reason || "未在合适时间执行,药液未充分喷撒吸收" }}
+                            {{ t("workExecute.unqualifiedReason") }}{{ item.operation?.reason || t("workExecute.defaultUnqualifiedReason") }}
                         </div>
 
                         <div class="compare-imgs" v-if="activeStatus === '未达标' && (item.beforeImage || item.afterImage)"
                             @click.stop>
-                            <div class="img-tag"></div>
-                            <div class="img-tag right-tag"></div>
+                            <div class="img-tag">{{ t("workExecute.before") }}</div>
+                            <div class="img-tag right-tag">{{ t("workExecute.after") }}</div>
                             <div class="img-item" v-if="item.beforeImage">
                                 <img :src="getWorkImageUrl(item.beforeImage)" alt="" />
                             </div>
@@ -110,7 +111,7 @@
                         </div>
 
                         <div class="task-footer">
-                            <div class="farm-info">来自某某农场农场</div>
+                            <div class="farm-info">{{ t("workExecute.fromFarm") }}</div>
                             <div class="btn-group" v-if="getItemStatusButtons(index).length">
                                 <div v-for="btn in getItemStatusButtons(index)" :key="btn.label" class="edit-btn"
                                     :class="btn.type" @click.stop="handleStatusBtn(btn, item, index)">
@@ -121,7 +122,7 @@
 
                     </div>
 
-                    <div class="empty-tip" v-if="!loading && taskList.length === 0">暂无数据</div>
+                    <div class="empty-tip" v-if="!loading && taskList.length === 0">{{ t("workExecute.noData") }}</div>
                 </div>
             </div>
         </div>
@@ -143,7 +144,9 @@ import { WarningFilled } from "@element-plus/icons-vue";
 import { ElMessage } from "element-plus";
 import config from "@/api/config.js";
 import customCalendar from "./components/calendar.vue";
+import { useI18n } from "@/i18n";
 
+const { t } = useI18n();
 const store = useStore();
 const router = useRouter();
 const route = useRoute();
@@ -233,31 +236,49 @@ const activeStatus = ref("待接受");
 
 const STATUS_BTN_MAP = {
     待接受: [
-        { label: "重新派发", type: "normal", action: "redispatch" },
-        { label: "提醒接受", type: "primary", action: "remindAccept" },
+        { labelKey: "workExecute.redispatch", type: "normal", action: "redispatch" },
+        { labelKey: "workExecute.remindAccept", type: "primary", action: "remindAccept" },
     ],
-    已接受: [{ label: "提醒执行", type: "primary", action: "remindExecute" }],
-    执行中: [{ label: "提醒完成", type: "primary", action: "remindComplete" }],
+    已接受: [{ labelKey: "workExecute.remindExecute", type: "primary", action: "remindExecute" }],
+    执行中: [{ labelKey: "workExecute.remindComplete", type: "primary", action: "remindComplete" }],
     已超时: [
-        { label: "重新派发", type: "normal", action: "redispatch" },
-        { label: "提醒接受", type: "primary", action: "remindAccept" },
+        { labelKey: "workExecute.redispatch", type: "normal", action: "redispatch" },
+        { labelKey: "workExecute.remindAccept", type: "primary", action: "remindAccept" },
     ],
-    未达标: [{ label: "重新下发", type: "primary", action: "redispatch" }],
+    未达标: [{ labelKey: "workExecute.redispatchAgain", type: "primary", action: "redispatch" }],
 };
 
+const STATUS_LABEL_MAP = {
+    待接受: "workExecute.pending",
+    已接受: "workExecute.accepted",
+    执行中: "workExecute.executing",
+    已完成: "workExecute.completed",
+    已超时: "workExecute.timeout",
+    未达标: "workExecute.unqualified",
+};
+
+const getStatusLabel = (status) => t(STATUS_LABEL_MAP[status] || status);
+
 const isTimeoutItem = (index) => index === 0;
 
 const getTimeoutRemindBtn = () => {
     const map = {
-        待接受: { label: "提醒接受", type: "primary", action: "remindAccept" },
-        已接受: { label: "提醒执行", type: "primary", action: "remindExecute" },
-        执行中: { label: "提醒完成", type: "primary", action: "remindComplete" },
+        待接受: { labelKey: "workExecute.remindAccept", type: "primary", action: "remindAccept" },
+        已接受: { labelKey: "workExecute.remindExecute", type: "primary", action: "remindExecute" },
+        执行中: { labelKey: "workExecute.remindComplete", type: "primary", action: "remindComplete" },
     };
-    return map[activeStatus.value];
+    const btn = map[activeStatus.value];
+    return btn ? { ...btn, label: t(btn.labelKey) } : null;
 };
 
+const mapStatusButtons = (buttons) =>
+    buttons.map((btn) => ({
+        ...btn,
+        label: t(btn.labelKey),
+    }));
+
 const getItemStatusButtons = (index) => {
-    const baseButtons = STATUS_BTN_MAP[activeStatus.value] || [];
+    const baseButtons = mapStatusButtons(STATUS_BTN_MAP[activeStatus.value] || []);
     if (!isTimeoutItem(index)) {
         return baseButtons;
     }
@@ -267,24 +288,23 @@ const getItemStatusButtons = (index) => {
     const remindBtn = getTimeoutRemindBtn();
     if (remindBtn) {
         return [
-            { label: "重新派发", type: "normal", action: "redispatch" },
+            { label: t("workExecute.redispatch"), type: "normal", action: "redispatch" },
             remindBtn,
         ];
     }
-    return [{ label: "重新派发", type: "normal", action: "redispatch" }, ...baseButtons];
+    return [
+        { label: t("workExecute.redispatch"), type: "normal", action: "redispatch" },
+        ...baseButtons,
+    ];
 };
 
 const getTimeoutText = () => {
-    switch (activeStatus.value) {
-        case "待接受":
-            return "接受超时";
-        case "已接受":
-            return "执行超时";
-        case "执行中":
-            return "完成超时";
-        default:
-            return "已超时";
-    }
+    const map = {
+        待接受: "workExecute.acceptTimeout",
+        已接受: "workExecute.executeTimeout",
+        执行中: "workExecute.completeTimeout",
+    };
+    return t(map[activeStatus.value] || "workExecute.timeout");
 };
 
 const formatGMTToYMD = (gmtString) => {
@@ -299,14 +319,11 @@ const getWorkImageUrl = (image) => {
 
 const handleItem = (item, index) => {
     router.push({
-        path: "/work_detail",
+        path: "/agri_record_detail",
         query: {
             miniJson: JSON.stringify({
                 id: item.operation?.work_id,
                 status: activeStatus.value,
-                time: item.time,
-                geohash_sample: item.geohash_sample,
-                machine_code: item.operation?.machine_code,
             }),
         },
     });
@@ -314,9 +331,9 @@ const handleItem = (item, index) => {
 
 const handleStatusBtn = (btn, item, index) => {
     if (btn.action === "redispatch") {
-        ElMessage.info(`重新派发:${item.operation?.name}`);
+        ElMessage.info(t("workExecute.redispatchMsg", { name: item.operation?.name }));
     } else {
-        ElMessage.success("提醒成功!");
+        ElMessage.success(t("workExecute.remindSuccess"));
     }
 };
 
@@ -675,7 +692,7 @@ function handleRemindCustomer(item) {
         margin-top: 10px;
 
         .filter-item {
-            padding: 0 12px;
+            padding: 0 6px;
             height: 32px;
             color: #1D2129;
             font-size: 14px;