soobin пре 3 месеци
родитељ
комит
7cd37a54db

+ 2 - 2
src/assets/language/en.json

@@ -1735,9 +1735,9 @@
   },
   "tax": {
     "taxFee": "Tax Levy",
-    "taxFeeDesc": "Taxes will be automatically collected per transaction when enabled",
+    "taxFeeDesc": "Display only. Requires Nayax configuration",
     "taxRate": "Tax Rate",
-    "ratePlaceholder": "Enter tax rate percentage (0.00-100.00)",
+    "ratePlaceholder": "Enter tax rate percentage (100.00-200.00)",
     "rateRequired": "Tax rate is required",
     "rateInvalid": "Enter valid value with up to 2 decimal places",
     "update": "Apply Now"

+ 3 - 3
src/assets/language/es.json

@@ -1734,11 +1734,11 @@
     },
     "tax": {
         "taxFee": "Recaudación Tributaria",
-        "taxFeeDesc": "Recaudación automática por transacción",
+        "taxFeeDesc": "Solo demostración. Requiere configuración Nayax",
         "taxRate": "Tipo Impositivo",
-        "ratePlaceholder": "Introduzca porcentaje (0,00-100,00)",
+        "ratePlaceholder": "Introduzca porcentaje (100,00-200,00)",
         "rateRequired": "Campo obligatorio",
-        "rateInvalid": "Valor entre 0-100 con 2 decimales",
+        "rateInvalid": "Valor entre 100-200 con 2 decimales",
         "update": "Actualizar ahora"
     },
     "jam": {

+ 3 - 3
src/assets/language/fr.json

@@ -1765,11 +1765,11 @@
     },
     "tax": {
         "taxFee": "Prélèvement Fiscal",
-        "taxFeeDesc": "Collecte automatique des taxes par transaction",
+        "taxFeeDesc": "Affiche le prototype. Configuration Nayax nécessaire",
         "taxRate": "Taux d'Imposition",
-        "ratePlaceholder": "Saisir le taux en % (00,00 à 100,00)",
+        "ratePlaceholder": "Saisir le taux en % (100,00 à 200,00)",
         "rateRequired": "Le taux est obligatoire",
-        "rateInvalid": "Valeur entre 0 et 100 (2 décimales max)",
+        "rateInvalid": "Valeur entre 100 et 200 (2 décimales max)",
         "update": "Mettre à jour"
     },
     "jam": {

+ 3 - 3
src/assets/language/ja.json

@@ -1726,11 +1726,11 @@
     },
     "tax": {
         "taxFee": "課税徴収",
-        "taxFeeDesc": "有効時、取引ごとに自動課税されます",
+        "taxFeeDesc": "表示用機能(Nayaxによる実設定必須)",
         "taxRate": "税率",
-        "ratePlaceholder": "税率パーセンテージを入力(0.00~100.00)",
+        "ratePlaceholder": "税率パーセンテージを入力(100.00~200.00)",
         "rateRequired": "税率の入力必須",
-        "rateInvalid": "0-100の数値を入力(小数点第2位まで)",
+        "rateInvalid": "100-200の数値を入力(小数点第2位まで)",
         "update": "即時適用"
     },
     "jam": {

+ 3 - 3
src/assets/language/pt.json

@@ -1734,11 +1734,11 @@
     },
     "tax": {
         "taxFee": "Cobrança Fiscal",
-        "taxFeeDesc": "Coleta automática de impostos por transação",
+        "taxFeeDesc": "Apenas visualização. Configuração Nayax obrigatória",
         "taxRate": "Alíquota",
-        "ratePlaceholder": "Insira a porcentagem (0,00-100,00)",
+        "ratePlaceholder": "Insira a porcentagem (100,00-200,00)",
         "rateRequired": "Campo obrigatório",
-        "rateInvalid": "Valor entre 0-100 com 2 decimais",
+        "rateInvalid": "Valor entre 100-200 com 2 decimais",
         "update": "Atualizar agora"
     },
     "jam": {

+ 3 - 3
src/assets/language/ru.json

@@ -1765,11 +1765,11 @@
     },
     "tax": {
         "taxFee": "Налоговое взимание",
-        "taxFeeDesc": "Автоматическое удержание налогов при активации",
+        "taxFeeDesc": "Только демонстрация. Требуется настройка Nayax",
         "taxRate": "Налоговая ставка",
-        "ratePlaceholder": "Введите процентную ставку (0,00-100,00)",
+        "ratePlaceholder": "Введите процентную ставку (100,00-200,00)",
         "rateRequired": "Укажите налоговую ставку",
-        "rateInvalid": "Допустимое значение: 0-100 с 2 знаками после запятой",
+        "rateInvalid": "Допустимое значение: 100-200 с 2 знаками после запятой",
         "update": "Применить сейчас"
     },
     "jam": {

+ 3 - 3
src/assets/language/uk.json

@@ -1735,11 +1735,11 @@
     },
     "tax": {
         "taxFee": "Податкове стягнення",
-        "taxFeeDesc": "Автоматичне утримання податків",
+        "taxFeeDesc": "Лише демонстрація. Потрібне налаштування Nayax",
         "taxRate": "Податкова ставка",
-        "ratePlaceholder": "Введіть відсоток (0,00-100,00)",
+        "ratePlaceholder": "Введіть відсоток (100,00-200,00)",
         "rateRequired": "Обов'язкове поле",
-        "rateInvalid": "Допустиме значення: 0-100 з 2 десятковими",
+        "rateInvalid": "Допустиме значення: 100-200 з 2 десятковими",
         "update": "Застосувати"
     },
     "jam": {

+ 2 - 2
src/assets/language/zh.json

@@ -1735,11 +1735,11 @@
   },
   "tax": {
     "taxFee": "税费征收",
-    "taxFeeDesc": "启用后将对每笔交易收取税费",
+    "taxFeeDesc": "当前仅为展示功能,需由Nayax实际配置",
     "taxRate": "税率",
     "ratePlaceholder": "请输入税率百分比",
     "rateRequired": "税率不能为空",
-    "rateInvalid": "请输入0-100之间的有效数值(最多两位小数)",
+    "rateInvalid": "请输入100-200之间的有效数值(最多两位小数)",
     "update": "立即更新"
   },
   "jam": {

+ 5 - 0
src/service/device/index.js

@@ -256,6 +256,11 @@ export function uploadLog(params) {
     return axios.get(`/SZWL-SERVER/tEquipment/uploadLog?${stringToUrl(params)}`);
 }
 
+// 新日志上传
+export function newUploadLog(params) {
+    return axios.get(`/SZWL-SERVER/tEquipment/newUploadLog?${stringToUrl(params)}`);
+}
+
 // 查询日志
 export function queryLog(params) {
     return axios.get(`/SZWL-SERVER/tEquipment/queryLog?${stringToUrl(params)}`);

+ 135 - 27
src/views/apkManage/index.vue

@@ -1,7 +1,10 @@
 <template>
   <div class="advertRuleIdx">
     <s-header :name="$t('apkManage.apkManagement')" :noback="false"></s-header>
-    <div v-if="isDelete" class="headCon l-flex-between o-plr-20 o-pt-26 o-pb-12 kBordBott">
+    <div
+      v-if="isDelete"
+      class="headCon l-flex-between o-plr-20 o-pt-26 o-pb-12 kBordBott"
+    >
       <div class="l-flex-RC c-text-15 c-text-color c-text-b">
         {{ $t("advertManage.advertRule.selected") }}
         {{ selectTotals }}
@@ -11,12 +14,19 @@
         <div @click="cancelClk" class="c-text-c c-text-13 c-color">
           {{ $t("advertManage.advertRule.cancel") }}
         </div>
-        <div @click="noticeClk" class="c-text-c o-ml-24 c-text-13" style="color: #df5e4c">
+        <div
+          @click="noticeClk"
+          class="c-text-c o-ml-24 c-text-13"
+          style="color: #df5e4c"
+        >
           {{ $t("advertManage.advertRule.confirmDel") }}
         </div>
       </div>
     </div>
-    <div v-else class="headCon l-flex-between o-plr-20 o-pt-26 o-pb-12 kBordBott">
+    <div
+      v-else
+      class="headCon l-flex-between o-plr-20 o-pt-26 o-pb-12 kBordBott"
+    >
       <div class="l-flex-RC">
         <div class="ruleIcon"></div>
         <div class="c-text-color c-text-b c-text-15">
@@ -44,27 +54,56 @@
         </div>
       </div>
     </div>
+    <van-tabs v-model:active="active" @click-tab="clickModel">
+      <van-tab :title="$t('device.whole')" name="" />
+      <van-tab
+        v-for="item in modelList"
+        :key="item.id"
+        :title="item.name"
+        :name="item.id"
+      />
+    </van-tabs>
     <div class="contentCon">
       <van-pull-refresh disabled v-model="refreshing" @refresh="onRefresh">
-        <van-list v-model="loading" :finished="finished" :finished-text="$t('common.noMoreTxt')" @load="onLoad"
-          :offset="20" :immediate-check="false">
-          <div @click.self="toEdit(item)" v-for="item in tableData" :key="item.id"
-            class="o-plr-20 o-pt-24 o-pb-12 l-flex-between kBordBott content">
+        <van-list
+          v-model="loading"
+          :finished="finished"
+          :finished-text="$t('common.noMoreTxt')"
+          @load="onLoad"
+          :offset="20"
+          :immediate-check="false"
+        >
+          <div
+            @click.self="toEdit(item)"
+            v-for="item in tableData"
+            :key="item.id"
+            class="o-plr-20 o-pt-24 o-pb-12 l-flex-between kBordBott content"
+          >
             <div>
               <div class="l-flex-RC">
-                <span class="c-color c-text-12">{{ $t('apkManage.version') }}:</span>
+                <span class="c-color c-text-12"
+                  >{{ $t("apkManage.version") }}:</span
+                >
                 <span class="c-text-color c-text-12">{{ item.version }}</span>
               </div>
               <div class="l-flex-RC">
-                <span class="c-color c-text-12">{{ $t('apkManage.versionInfo') }}:</span>
-                <span class="c-text-color c-text-12">{{ item.versionName }}</span>
+                <span class="c-color c-text-12"
+                  >{{ $t("apkManage.versionInfo") }}:</span
+                >
+                <span class="c-text-color c-text-12">{{
+                  item.versionName
+                }}</span>
               </div>
               <div class="l-flex-RC">
-                <span class="c-color c-text-12">{{ $t('apkManage.model') }}:</span>
+                <span class="c-color c-text-12"
+                  >{{ $t("apkManage.model") }}:</span
+                >
                 <span class="c-text-color c-text-12">{{ item.model }}</span>
               </div>
               <div class="l-flex-RC">
-                <span class="c-color c-text-12">{{ $t("advertManage.advertRule.createTime") }}:</span>
+                <span class="c-color c-text-12"
+                  >{{ $t("advertManage.advertRule.createTime") }}:</span
+                >
                 <span class="c-text-color c-text-12">{{
                   Format_time(item.createDate)
                 }}</span>
@@ -85,9 +124,14 @@
       </van-pull-refresh>
     </div>
     <!-- 删除确认弹窗 -->
-    <kDialog :dialogTitle="$t('advertManage.delPopTitle')" :cancelBtnTxt="$t('advertManage.cancelTxt')"
-      :confirmBtnTxt="$t('advertManage.confirmDel')" ref="kDialogRef" :dialogContent="$t('advertManage.delPopContent')"
-      @confirmclk="confirmClk">
+    <kDialog
+      :dialogTitle="$t('advertManage.delPopTitle')"
+      :cancelBtnTxt="$t('advertManage.cancelTxt')"
+      :confirmBtnTxt="$t('advertManage.confirmDel')"
+      ref="kDialogRef"
+      :dialogContent="$t('advertManage.delPopContent')"
+      @confirmclk="confirmClk"
+    >
     </kDialog>
   </div>
 </template>
@@ -96,10 +140,7 @@
 import { Format_time } from "@/common/js/utils";
 import kDialog from "@/components/commom/kDialog/index.vue";
 // 导入接口
-import {
-  Api_getPageApkInfo,
-  Api_getDeletesApk,
-} from "@/service/apkManage";
+import { Api_getPageApkInfo, Api_getDeletesApk } from "@/service/apkManage";
 import { computed, onMounted, reactive, ref, toRefs } from "vue";
 import sHeader from "@/components/SimpleHeader";
 import { useRouter } from "vue-router";
@@ -110,6 +151,55 @@ export default {
   components: { sHeader, kDialog },
   setup() {
     const { t } = useI18n();
+    // 点击标签
+    const active = ref("");
+    // 机型列表
+    const modelList = ref([
+      {
+        name: "301",
+        id: "301",
+      },
+      {
+        name: "320",
+        id: "320",
+      },
+      {
+        name: "280",
+        id: "280",
+      },
+      {
+        name: "P10",
+        id: "P10",
+      },
+      {
+        name: "P20",
+        id: "P20",
+      },
+      {
+        name: "P30",
+        id: "P30",
+      },
+      {
+        name: "SI320",
+        id: "SI320",
+      },
+      {
+        name: "SBC320",
+        id: "SBC320",
+      },
+      {
+        name: "SBM10",
+        id: "SBM10",
+      },
+      {
+        name: "EF210",
+        id: "EF210",
+      },
+      {
+        name: "lua",
+        id: "lua",
+      },
+    ]);
     // 删除确认弹窗
     const kDialogRef = ref(null);
     // 点击确认删除
@@ -133,7 +223,7 @@ export default {
       };
       Api_getDeletesApk(param).then((res) => {
         console.log(res);
-        if (res.data.code === '00000') {
+        if (res.data.code === "00000") {
           isDelete.value = false;
           showToast(res.data.message);
           setTimeout(() => {
@@ -183,7 +273,7 @@ export default {
     const refreshing = ref(false);
     onMounted(() => {
       // 加载样式
-      styleUrl('apkManage');
+      styleUrl("apkManage");
       onRefresh();
     });
     // 下拉刷新
@@ -204,12 +294,19 @@ export default {
       pageNo.value++;
       getList();
     };
+    const param = ref({
+      current: 1,
+      size: 20,
+      model: "",
+    });
     const getList = () => {
-      let param = {
-        current: pageNo.value,
-        size: pageSize.value,
-      };
-      Api_getPageApkInfo(param).then((res) => {
+      // let param = {
+      //   current: pageNo.value,
+      //   size: pageSize.value,
+      // };
+      param.value.current = pageNo.value;
+      param.value.size = pageSize.value;
+      Api_getPageApkInfo(param.value).then((res) => {
         const { data } = res.data;
         refreshing.value = false;
         // 加入删除选中状态
@@ -246,6 +343,14 @@ export default {
         router.push(`/apkManageAdd?row=${JSON.stringify(row)}`);
       }
     };
+    // 点击标签
+    const clickModel = (item) => {
+      console.log(item);
+      ruleData.tableData = [];
+      pageNo.value = 1;
+      param.value.model = item.name;
+      getList();
+    };
     return {
       pageNo,
       pageSize,
@@ -266,9 +371,12 @@ export default {
       noticeClk,
       toEdit,
       Format_time,
+      modelList,
+      active,
+      clickModel,
     };
   },
 };
 </script>
 
-<style lang="less" scoped></style>
+<style lang="less" scoped></style>

+ 1 - 1
src/views/bindBankCard/index.vue

@@ -1337,7 +1337,7 @@ export default {
       }
       if (currentStep.value === 3) {
         if (infoStatus.value != 1) {
-          showToast("请确认认证通过");
+          showToast("请确认信息认证通过");
           return;
         }
         if (auditStatus.value != 1) {

+ 1 - 1
src/views/device/deviceOper.vue

@@ -580,7 +580,7 @@
       <div
         v-if="
           (device.machineType === '0' || device.machineType === null) &&
-          (user.ifForeign == '1' || user.type == 0) &&
+          (user.type == 0 || user.ifForeign === '1') &&
           controlList.includes('C29')
         "
         class="operation-item"

+ 295 - 76
src/views/device/modifyPrice/index.vue

@@ -1,60 +1,111 @@
 <template>
-  <div class="modifyPriceIdx">
-    <s-header :name="$t('device.modifyPricePage.title')" :noback="false"></s-header>
-    <div class="headerCon kBordBott o-plr-10 o-ptb-16 l-flex-RC">
-      <div class="line o-mr-6"></div>
-      <div>
-        <span class="c-color c-text-14">{{ $t('device.modifyPricePage.equipmentName') }}:</span>
-        <span class="c-text-color c-text-14">{{ equipmentName }}</span>
-      </div>
-    </div>
-    <div class="content o-plr-10 o-ptb-16">
-      <div class="l-flex-between o-mb-10">
-        <div>{{ $t('device.modifyPricePage.total') }}{{ tableData.length }}{{ $t('device.modifyPricePage.goods') }}
-        </div>
-        <div class="l-flex-RC" @click="noticeClk">
-          <span>{{ $t('device.modifyPricePage.batchModify') }}</span>
-          <div class="gotoRight"></div>
+  <div class="price-editor">
+    <s-header :name="$t('device.modifyPricePage.title')" :noback="false" />
+    <div class="content-container">
+      <!-- 设备信息卡片 -->
+      <div class="device-card">
+        <div class="device-header">
+          <div class="header-indicator"></div>
+          <h3 class="device-name">
+            {{ $t("device.modifyPricePage.equipmentName") }}:{{
+              equipmentName
+            }}
+          </h3>
         </div>
       </div>
-      <div v-for="(item, index) in tableData" :key="index" class="l-flex-between goodsCon kBordBott o-pb-10">
-        <div class="l-flex-RC">
-          <img class="goodsImg" :src="showSugerPhoto(item)" />
-          <span class="o-ml-6">{{ item.productName }}</span>
-        </div>
-        <div class="l-flex-RC">
-          <div v-if="item.isEdit" class="priceInp">
-            <van-field type="number" label-width="0" :border="false" v-model="item.rmbPrice" clearable label=" " />
-          </div>
-          <div v-else class="c-text-15" style="color: #df5e4c">
-            <!-- 商品价格调整¥ -->
-            <!-- <span>¥</span> -->
-            <span>{{ currencySymbol }}</span>
-            <span>{{ item.rmbPrice }}</span>
-          </div>
-          <div v-if="!item.isEdit" @click="editClk(item, 1)" class="l-flex-RC o-ml-20">
-            <!-- <img class="editIcon" src="../../../assets/device/editIcon.png" alt="" /> -->
-            <div class="editIcon"></div>
-            <span class="editBtn c-text-14">{{ $t('device.modifyPricePage.modify') }}</span>
-            <!-- 74af08 -->
+
+      <!-- 商品列表卡片 -->
+      <div class="goods-card">
+        <!-- 操作头部 -->
+        <div class="card-header">
+          <div class="goods-count">
+            {{ $t("device.modifyPricePage.total") }}
+            <span class="highlight">{{ tableData.length }}</span>
+            {{ $t("device.modifyPricePage.goods") }}
           </div>
-          <div v-else @click="editClk(item, 2)" class="l-flex-RC o-ml-20">
-            <!-- <img class="editIcon" src="../../../assets/device/subIcon.png" alt="" /> -->
-            <div class="editIcon"></div>
-            <span class="editBtn c-text-14">{{ $t('device.modifyPricePage.submit') }}</span>
+          <van-button
+            icon="edit"
+            plain
+            hairline
+            @click="noticeClk"
+            class="batch-btn"
+          >
+            {{ $t("device.modifyPricePage.batchModify") }}
+          </van-button>
+        </div>
+
+        <!-- 商品列表 -->
+        <div class="goods-list">
+          <div
+            v-for="(item, index) in tableData"
+            :key="index"
+            class="goods-item"
+          >
+            <div class="goods-info">
+              <van-image
+                class="goods-image"
+                :src="showSugerPhoto(item)"
+                fit="cover"
+              />
+              <span class="goods-name">{{ item.productName }}</span>
+            </div>
+
+            <div class="price-action">
+              <template v-if="item.isEdit">
+                <van-field
+                  type="number"
+                  v-model="item.rmbPrice"
+                  class="price-input"
+                  :border="false"
+                  clearable
+                >
+                  <template #extra>
+                    <span class="currency-symbol">{{ currencySymbol }}</span>
+                  </template>
+                </van-field>
+                <van-icon
+                  name="success"
+                  class="action-icon"
+                  @click="editClk(item, 2)"
+                />
+              </template>
+              <template v-else>
+                <div class="price-display">
+                  <span class="currency">{{ currencySymbol }}</span>
+                  <span class="price">{{ item.rmbPrice }}</span>
+                </div>
+                <van-icon
+                  name="edit"
+                  class="action-icon"
+                  @click="editClk(item, 1)"
+                />
+              </template>
+            </div>
           </div>
         </div>
       </div>
     </div>
+
     <!-- 批量修改弹窗 -->
-    <kDialog :isCloseForConfirm="false" :dialogTitle="$t('device.modifyPricePage.batchPrice')"
-             :confirmBtnTxt="$t('device.modifyPricePage.modifySubmit')" ref="kDialogRef" @confirmclk="confirmClk">
+    <kDialog
+      :isCloseForConfirm="false"
+      :dialogTitle="$t('device.modifyPricePage.batchPrice')"
+      :confirmBtnTxt="$t('device.modifyPricePage.modifySubmit')"
+      ref="kDialogRef"
+      @confirmclk="confirmClk"
+    >
       <template #content>
-        <div class="cust_vantBorder">
-          <van-field type="number" clearable v-model="cofficentForm.price"
-                     :placeholder="$t('device.modifyPricePage.batchPricePlace')" :label="$t('device.modifyPricePage.batchPrice')">
-          </van-field>
-        </div>
+        <van-field
+          type="number"
+          v-model="cofficentForm.price"
+          :placeholder="$t('device.modifyPricePage.batchPricePlace')"
+          :label="$t('device.modifyPricePage.batchPrice')"
+          class="batch-field"
+        >
+          <template #extra>
+            <span class="currency-symbol">{{ currencySymbol }}</span>
+          </template>
+        </van-field>
       </template>
     </kDialog>
   </div>
@@ -63,14 +114,14 @@
 <script>
 import kDialog from "@/components/commom/kDialog/index.vue";
 // 导入接口
-import { selectProducts, Api_getUpdaProdPrice } from '@/service/device/index';
+import { selectProducts, Api_getUpdaProdPrice } from "@/service/device/index";
 import sHeader from "@/components/SimpleHeader";
 import { reactive, ref } from "@vue/reactivity";
-import { onMounted } from '@vue/runtime-core';
-import { useRoute } from 'vue-router';
-import { showToast } from 'vant';
+import { onMounted } from "@vue/runtime-core";
+import { useRoute } from "vue-router";
+import { showToast } from "vant";
 import { useI18n } from "vue-i18n";
-import { styleUrl } from "../../../common/js/utils";
+// import { styleUrl } from "../../../common/js/utils";
 export default {
   components: { sHeader, kDialog },
   setup() {
@@ -80,20 +131,20 @@ export default {
     const kDialogRef = ref(null);
     // 点击批量修改
     const noticeClk = () => {
-      cofficentForm.price = '';
+      cofficentForm.price = "";
       kDialogRef.value.openDialog();
     };
     // 点击确定按钮
     const confirmClk = () => {
       if (!cofficentForm.price) {
-        showToast(t('device.modifyPricePage.batchPricePlace'));
+        showToast(t("device.modifyPricePage.batchPricePlace"));
         return;
       }
-      cofficentForm.no = '';
+      cofficentForm.no = "";
       cofficentForm.type = 1;
       updatePrice();
       kDialogRef.value.closeDialog();
-    }
+    };
     // 商品图片路径处理
     const showSugerPhoto = (row) => {
       let imgId = row.no;
@@ -107,11 +158,11 @@ export default {
     // 商品数据
     const tableData = ref([]);
     // 设备名称
-    const equipmentName = ref('');
+    const equipmentName = ref("");
     // 刚进页面
     onMounted(() => {
       // 加载样式
-      styleUrl('modifyPrice');
+      // styleUrl("modifyPrice");
       const id = route.query.deviceId || "";
       const name = route.query.name || "";
       if (id) {
@@ -119,50 +170,49 @@ export default {
         equipmentName.value = name;
         getList();
       }
-
     });
     // 获取商品列表
     const getList = () => {
-      selectProducts({ equipmentId: cofficentForm.equipmentId }).then(res => {
-        console.log('res', res)
+      selectProducts({ equipmentId: cofficentForm.equipmentId }).then((res) => {
+        console.log("res", res);
         const { data } = res.data;
         if (data) {
           if (data.length > 0) {
             // 是否修改状态
-            data.forEach(item => {
+            data.forEach((item) => {
               item.isEdit = false;
-            })
+            });
           }
           tableData.value = data;
         }
-      })
-    }
+      });
+    };
     // 修改的价格
     const cofficentForm = reactive({
-      equipmentId: '',
+      equipmentId: "",
       no: "",
       price: "",
       type: "",
     });
     // 自定义货币符号
-    const currencySymbol = ref('¥');
-    const loginUserStr = localStorage.getItem('loginUser');
+    const currencySymbol = ref("¥");
+    const loginUserStr = localStorage.getItem("loginUser");
     const loginUser = JSON.parse(loginUserStr);
-    if (loginUser.currencySymbol) { 
+    if (loginUser.currencySymbol) {
       currencySymbol.value = loginUser.currencySymbol;
     } else {
-      currencySymbol.value = '¥';
+      currencySymbol.value = "¥";
     }
 
     // 点击修改
     const editClk = (row, idx) => {
       // 如果点击的是修改
       if (idx === 1) {
-        tableData.value.forEach(item => {
+        tableData.value.forEach((item) => {
           if (row.id !== item.id) {
             item.isEdit = false;
           }
-        })
+        });
         row.isEdit = !row.isEdit;
       } else {
         cofficentForm.no = row.no;
@@ -173,9 +223,9 @@ export default {
     };
     // 修改价格
     const updatePrice = (row) => {
-      console.log('cofficentForm', cofficentForm)
+      console.log("cofficentForm", cofficentForm);
       // 如果点击的是提交
-      Api_getUpdaProdPrice(cofficentForm).then(res => {
+      Api_getUpdaProdPrice(cofficentForm).then((res) => {
         showToast(res.data.message);
         if (row) {
           row.isEdit = false;
@@ -183,7 +233,7 @@ export default {
         setTimeout(() => {
           getList();
         }, 500);
-      })
+      });
     };
     return {
       cofficentForm,
@@ -201,4 +251,173 @@ export default {
 </script>
 
 <style lang="less" scoped>
-</style>
+@primary-color: #4d6add;
+@card-bg: #ffffff;
+@text-primary: #2d3436;
+@border-color: #e4e7ec;
+
+.price-editor {
+  background: #f8fafb;
+  min-height: 100vh;
+
+  .content-container {
+    background: #f7f8fa;
+    height: calc(100% - 50px);
+    overflow: auto;
+    overflow-x: hidden;
+  }
+}
+
+.device-card {
+  background: @card-bg;
+  border-radius: 12px;
+  box-shadow: 0 2px 12px rgba(0, 0, 0, 0.06);
+  margin: 10px;
+  padding: 16px;
+
+  .device-header {
+    display: flex;
+    align-items: center;
+
+    .header-indicator {
+      width: 3px;
+      height: 20px;
+      background: @primary-color;
+      margin-right: 12px;
+      border-radius: 2px;
+    }
+
+    .device-name {
+      font-size: 15px;
+      color: @text-primary;
+      margin: 0;
+    }
+  }
+}
+
+.goods-card {
+  background: @card-bg;
+  border-radius: 12px;
+  box-shadow: 0 2px 12px rgba(0, 0, 0, 0.06);
+  padding: 16px;
+  margin: 10px;
+
+  .card-header {
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    margin-bottom: 20px;
+
+    .goods-count {
+      color: #666;
+
+      .highlight {
+        color: @primary-color;
+        font-weight: 500;
+        margin: 0 4px;
+      }
+    }
+
+    .batch-btn {
+      height: 32px;
+      padding: 0 16px;
+      font-size: 13px;
+    }
+  }
+}
+
+.goods-list {
+  .goods-item {
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    padding: 12px 0;
+    border-bottom: 1px solid @border-color;
+
+    &:last-child {
+      border-bottom: none;
+    }
+
+    .goods-info {
+      display: flex;
+      align-items: center;
+      flex: 1;
+
+      .goods-image {
+        width: 48px;
+        height: 48px;
+        border-radius: 6px;
+        margin-right: 12px;
+      }
+
+      .goods-name {
+        font-size: 14px;
+        color: @text-primary;
+        max-width: 200px;
+        .ellipsis();
+      }
+    }
+
+    .price-action {
+      display: flex;
+      align-items: center;
+      gap: 12px;
+
+      .price-input {
+        width: 120px;
+        background: #f8fafb;
+        border-radius: 6px;
+        padding: 4px 12px;
+
+        :deep(.van-field__control) {
+          text-align: right;
+        }
+      }
+
+      .currency-symbol {
+        color: @primary-color;
+        margin-left: 4px;
+      }
+
+      .price-display {
+        color: #df5e4c;
+        font-size: 15px;
+      }
+
+      .action-icon {
+        color: @primary-color;
+        font-size: 20px;
+        padding: 8px;
+      }
+    }
+  }
+}
+
+.batch-field {
+  :deep(.van-field__label) {
+    width: 100px;
+  }
+}
+
+.ellipsis() {
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+
+@media (max-width: 480px) {
+  .goods-card {
+    padding: 12px;
+
+    .goods-item {
+      .goods-name {
+        max-width: 160px;
+      }
+    }
+  }
+}
+
+:deep(.van-image__img) {
+  object-fit: contain !important;
+}
+</style>

+ 167 - 36
src/views/device/modulation.vue

@@ -1,35 +1,52 @@
 <template>
-  <!-- 音量调节 -->
-  <div class="modulationPage flex-col">
-    <s-header :name="$t('device.parameterAdjustment')" :noback="false"></s-header>
-    <div class="wrap1 flex-col">
-      <div class="box2 flex-col">
-        <div class="section3 flex-row justify-between">
-          <div class="box3 flex-col"></div>
-          <span class="info1">{{ $t('device.equipmentName') }}:{{ deviceDetal ? deviceDetal.name : '' }}</span>
-        </div>
-        <img class="img1" referrerpolicy="no-referrer"
-             src="../../assets/line.png" />
+  <div class="volume-control">
+    <s-header :name="$t('device.modulation')" :noback="false" />
+
+    <!-- 设备信息卡片 -->
+    <div class="device-card">
+      <div class="device-header">
+        <div class="header-indicator"></div>
+        <h3 class="device-name">
+          {{ $t("device.modifyPricePage.equipmentName") }}:{{ equipmentName }}
+        </h3>
       </div>
-      <div class="box4 flex-row justify-between">
-        <span class="word3">{{ $t('device.slideSliderToAdjustVolume') }} : {{ volume }}</span>
-        <!-- <span class="word4">{{volume}}</span> -->
+    </div>
+
+    <!-- 音量调节卡片 -->
+    <div class="control-card">
+      <div class="volume-display">
+        <span class="volume-label">{{ $t("device.slideSliderToAdjustVolume") }}</span>
+        <div class="volume-value">{{ volume }}</div>
       </div>
-      <van-slider v-model="volume" :max="15" />
-      <van-button round type="primary" class="volumeChangeButton"
-                  @click="volumeChange()">{{ $t('device.submitModification') }}</van-button>
-      <!-- <div class="box6 flex-col"><span class="word5">提交修改</span></div> -->
+
+      <van-slider
+        v-model="volume"
+        :max="15"
+        class="volume-slider"
+        bar-height="4px"
+      >
+        <template #button>
+          <div class="slider-thumb">
+            {{ volume }}
+          </div>
+        </template>
+      </van-slider>
+
+      <van-button round type="primary" class="submit-btn" @click="volumeChange">
+        <van-icon name="volume" class="btn-icon" />
+        {{ $t("device.submitModification") }}
+      </van-button>
     </div>
   </div>
 </template>
 <script>
-import { onMounted, ref } from 'vue';
+import { onMounted, ref } from "vue";
 import sHeader from "@/components/SimpleHeader";
-import { useRoute, useRouter } from 'vue-router';
-import { getDeviceDetal, updateVolume } from '@/service/device'
-import { showFailToast, showDialog } from 'vant';
-import { useI18n } from 'vue-i18n';
-import { styleUrl } from '../../common/js/utils';
+import { useRoute, useRouter } from "vue-router";
+import { getDeviceDetal, updateVolume } from "@/service/device";
+import { showFailToast, showDialog } from "vant";
+import { useI18n } from "vue-i18n";
+// import { styleUrl } from "../../common/js/utils";
 
 export default {
   setup() {
@@ -43,7 +60,6 @@ export default {
     // 初始化页面获取列表
     onMounted(async () => {
       // 加载样式
-      styleUrl('modulation');
       getDeviceDetalFun();
       console.log(deviceId);
     });
@@ -51,36 +67,151 @@ export default {
     // 获取设备列表数据
     const getDeviceDetalFun = async () => {
       const { data } = await getDeviceDetal({ id: deviceId });
-      if (data.code === '00000') {
+      if (data.code === "00000") {
         deviceDetal.value = data.data;
         volume.value = data.data.volume ? data.data.volume : 0;
-      } else { showFailToast(data.message); }
-    }
+      } else {
+        showFailToast(data.message);
+      }
+    };
     // 音量调节保存
     const volumeChange = async () => {
       // const volumeB = 15 / 100 ;
       // const volumeC = parseInt(volume.value * volumeB);
-      const { data } = await updateVolume({ id: deviceId, volume: volume.value.toString() });
+      const { data } = await updateVolume({
+        id: deviceId,
+        volume: volume.value.toString(),
+      });
       if (data.code) {
         showDialog({
-          confirmButtonColor: '#2c87c8',
-          message: t('device.sentSuccessfully'),
+          confirmButtonColor: "#2c87c8",
+          message: t("device.sentSuccessfully"),
         }).then(() => {
           //返回上一页
           router.go(-1);
         });
-      } else { showFailToast(data.message); }
-      console.log('volumeChange', { equipmentId: deviceId, volume: volume.value.toString() });
-    }
+      } else {
+        showFailToast(data.message);
+      }
+      console.log("volumeChange", {
+        equipmentId: deviceId,
+        volume: volume.value.toString(),
+      });
+    };
     return {
       deviceDetal,
       volume,
-      volumeChange
+      volumeChange,
     };
   },
   components: { sHeader },
 };
 </script>
 <style lang="less" scoped>
-@import "../../common/style/common";
+@primary-color: #4d6add;
+@card-bg: #ffffff;
+@text-primary: #2d3436;
+@border-color: #e4e7ec;
+
+.volume-control {
+  background: #f8fafb;
+  min-height: 100vh;
+}
+
+.device-card {
+  background: @card-bg;
+  border-radius: 12px;
+  box-shadow: 0 2px 12px rgba(0,0,0,0.06);
+  margin: 10px;
+  padding: 16px;
+
+  .device-header {
+    display: flex;
+    align-items: center;
+
+    .header-indicator {
+      width: 3px;
+      height: 20px;
+      background: @primary-color;
+      margin-right: 12px;
+      border-radius: 2px;
+    }
+
+    .device-name {
+      font-size: 16px;
+      color: @text-primary;
+      margin: 0;
+    }
+  }
+}
+
+.control-card {
+  background: @card-bg;
+  border-radius: 12px;
+  box-shadow: 0 2px 12px rgba(0,0,0,0.06);
+  padding: 24px 16px;
+  margin: 10px;
+
+  .volume-display {
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    margin-bottom: 32px;
+
+    .volume-label {
+      font-size: 14px;
+      color: #666;
+    }
+
+    .volume-value {
+      font-size: 24px;
+      color: @primary-color;
+      font-weight: bold;
+    }
+  }
+
+  .volume-slider {
+    margin: 0 8px 40px;
+
+    .slider-thumb {
+      width: 36px;
+      height: 36px;
+      background: @primary-color;
+      border-radius: 50%;
+      color: white;
+      font-size: 14px;
+      line-height: 36px;
+      text-align: center;
+      box-shadow: 0 2px 4px rgba(0,0,0,0.1);
+    }
+  }
+
+  .submit-btn {
+    width: 100%;
+    height: 48px;
+    font-size: 16px;
+    box-shadow: 0 4px 12px rgba(77, 194, 148, 0.2);
+
+    .btn-icon {
+      margin-right: 8px;
+      font-size: 18px;
+    }
+  }
+}
+
+@media (max-width: 480px) {
+
+  .control-card {
+    padding: 20px 12px;
+    
+    .volume-display .volume-value {
+      font-size: 22px;
+    }
+
+    .submit-btn {
+      font-size: 14px;
+      height: 44px;
+    }
+  }
+}
 </style>

+ 4 - 2
src/views/device/tax/index.vue

@@ -39,7 +39,7 @@
             :rules="[
               { required: true, message: $t('tax.rateRequired') },
               {
-                pattern: /^([0-9]\d?|100)(\.\d{1,2})?$/,
+                pattern: /^(100(\.\d{1,2})?|1[1-9]\d(\.\d{1,2})?|200(\.0{1,2})?)$/,
                 message: $t('tax.rateInvalid'),
               },
             ]"
@@ -85,7 +85,7 @@ export default {
     const deviceDetal = ref(null);
 
     const taxStatus = ref(false);
-    const taxRate = ref("");
+    const taxRate = ref(100.00);
 
     onMounted(async () => {
       await getDeviceInfo();
@@ -226,11 +226,13 @@ export default {
     font-size: 15px;
     color: #333;
     margin-bottom: 4px;
+    width: 90%;
   }
 
   .payment-desc {
     font-size: 12px;
     color: #666;
+    width: 90%;
   }
 
   .tax-rate-input {

+ 302 - 109
src/views/device/viewLogs/index.vue

@@ -1,65 +1,122 @@
 <template>
-  <div class="viewLogsPage flex-col">
-    <s-header :name="$t('device.viewLogs')" :noback="false"></s-header>
-    <div class="block2 flex-row justify-between">
-      <div class="block3 flex-col"></div>
-      <span class="info2">{{ $t('device.equipmentName') }}:{{ deviceDetail ? deviceDetail.name : '' }}</span>
+  <div class="log-viewer">
+    <s-header :name="$t('device.viewLogs')" :noback="false" />
+
+    <!-- 设备名称标题 -->
+    <div class="device-header">
+      <div class="vertical-indicator"></div>
+      <h3 class="device-name">
+        {{ $t("device.equipmentName") }}:{{ deviceName }}
+      </h3>
     </div>
-    <div class="wrap1 flex-col o-pt-15">
-      <van-field v-model="logsTime" is-link readonly label="日期" placeholder="点击选择时间" @click="chooseTime()" />
-      <van-popup v-model:show="showPicker" round position="bottom">
-        <van-date-picker :min-date="minDate" :max-date="maxDate" @confirm="selectTime" @cancel="showPicker = false" />
-      </van-popup>
-      <van-cell-group>
-        <van-field readonly v-model="message" rows="2" autosize label="使用教程" type="textarea" show-word-limit />
-      </van-cell-group>
-      <div class="button-container">
-        <van-button round style="padding: 1em 2em;" type="primary" @click="uploadLogBtn">上传</van-button>
-        <van-button round style="padding: 1em 2em;" type="primary" @click="queryLogBtn">查询</van-button>
+
+    <!-- 操作卡片 -->
+    <div class="operation-card">
+      <!-- 时间选择 -->
+      <div class="time-picker-card">
+        <van-field
+          v-model="logsTime"
+          is-link
+          readonly
+          label="选择日期"
+          placeholder="点击选择时间"
+          @click="chooseTime"
+          class="time-field"
+        />
+        <van-popup v-model:show="showPicker" round position="bottom">
+          <van-date-picker
+            :min-date="minDate"
+            :max-date="maxDate"
+            @confirm="selectTime"
+            @cancel="showPicker = false"
+          />
+        </van-popup>
+      </div>
+
+      <!-- 使用说明 -->
+      <div class="tutorial-card">
+        <van-field
+          v-model="message"
+          readonly
+          rows="2"
+          autosize
+          label="使用教程"
+          type="textarea"
+          class="tutorial-field"
+        />
+      </div>
+
+      <!-- 新增通道选择 -->
+      <div class="channel-selector">
+        <van-radio-group v-model="channelType" direction="horizontal">
+          <van-radio name="1" icon-size="16px" class="channel-option">
+            默认通道
+          </van-radio>
+          <van-radio name="2" icon-size="16px" class="channel-option">
+            新通道
+          </van-radio>
+        </van-radio-group>
+      </div>
+
+      <!-- 操作按钮 -->
+      <div class="action-buttons">
+        <van-button
+          round
+          type="primary"
+          icon="back-top"
+          @click="uploadLogBtn"
+          class="action-btn"
+        >
+          上传日志
+        </van-button>
+        <van-button
+          round
+          type="success"
+          icon="search"
+          @click="queryLogBtn"
+          class="action-btn"
+        >
+          查询日志
+        </van-button>
+      </div>
+
+      <!-- 文件下载卡片 -->
+      <div v-if="fileName" class="file-card">
+        <van-cell
+          :title="fileName"
+          clickable
+          @click="downloadFile"
+          class="file-item"
+        >
+          <template #right-icon>
+            <van-icon name="down" class="download-icon" />
+          </template>
+        </van-cell>
       </div>
-      <!-- <van-button v-if="!downloading" round :disabled="logsTime === ''" type="primary" class="volumeChangeButton"
-        @click="downloadBtn">{{ $t('device.download') }}</van-button>
-      <van-button v-else disabled loading round class="volumeChangeButton" type="primary"
-        :loading-text="$t('device.downloading')" /> -->
-
-      <van-cell v-if="fileName != ''" :title="fileName" :clickable=true @click="downloadFile">
-        <!-- 使用 right-icon 插槽来自定义右侧图标 -->
-        <template #right-icon>
-          <van-icon name="down" class="search-icon" />
-        </template>
-      </van-cell>
     </div>
   </div>
 </template>
 
 <script>
-import {
-  onMounted,
-  computed,
-  ref
-} from 'vue';
+import { onMounted, computed, ref } from "vue";
 import sHeader from "@/components/SimpleHeader.vue";
 import {
   downloadLog,
   getDeviceDetal,
   uploadLog,
-  queryLog
+  newUploadLog,
+  queryLog,
 } from "@/service/device";
 import { $M_ExportFile } from "@/common/js/utils";
-import {
-  showFailToast,
-  showToast
-} from "vant";
-import {
-  useRoute
-} from "vue-router";
+import { showFailToast, showToast } from "vant";
+import { useRoute } from "vue-router";
 import dateUtil from "@/utils/dateUtil";
-import { styleUrl } from '../../../common/js/utils';
+// import { styleUrl } from "../../../common/js/utils";
 // import {useI18n} from "vue-i18n";
 
-export default ({
+export default {
   components: {
-    sHeader
+    sHeader,
   },
   setup() {
     // const { t } = useI18n();
@@ -69,14 +126,18 @@ export default ({
     const showPicker = ref(false);
     const downloading = ref(false);
     const logsTime = ref(null);
-    const fileName = ref(''); // 文件名
-    const message = ref('选择日期点击上传,等待几秒后点击查询,找到文件点击下载到本地查看。');
-    // const curDate = new Date(); // 获取当前时间日期
+    const fileName = ref(""); // 文件名
+    const message = ref(
+      "选择日期点击上传,等待几秒后点击查询,找到文件点击下载到本地查看。"
+    );
 
     // 计算最小日期为当前日期7天前
     const minDate = computed(() => {
-      const minTimestamp = (new Date()).getTime() - 6 * 24 * 3600 * 1000;
-      const minDate = dateUtil.formateDate(new Date(minTimestamp), "yyyy-MM-dd");
+      const minTimestamp = new Date().getTime() - 6 * 24 * 3600 * 1000;
+      const minDate = dateUtil.formateDate(
+        new Date(minTimestamp),
+        "yyyy-MM-dd"
+      );
       return new Date(minDate);
     });
 
@@ -85,146 +146,139 @@ export default ({
       return new Date();
     });
 
+    // 上传通道
+    const channelType = ref("1");
 
     // 初始化页面获取列表
     onMounted(async () => {
       // 加载样式
-      styleUrl('viewLogs');
       await getDeviceDetailFun();
-      // console.log(deviceDetail.value.name);
     });
 
     // 选择时间
     const chooseTime = () => {
-      // console.log('chooseTime function is called');
       showPicker.value = true;
-      console.log(showPicker.value);
     };
 
-
     const selectTime = ({ selectedValues }) => {
-      // console.log('selectTime function is called', time);
-      // logsTime.value = dateUtil.formateDate(time, "yyyy-MM-dd");
       logsTime.value = selectedValues.join("-");
       showPicker.value = false;
     };
 
     const getDeviceDetailFun = async () => {
-      const {
-        data
-      } = await getDeviceDetal({
-        id: deviceId
+      const { data } = await getDeviceDetal({
+        id: deviceId,
       });
-      if (data.code === '00000') {
+      if (data.code === "00000") {
         deviceDetail.value = data.data;
       } else {
         showFailToast(data.message);
       }
-    }
+    };
 
     const downloadBtn = async () => {
       const pattern = /^\d{4}-\d{2}-\d{2}$/;
       if (logsTime.value == null) {
-        showToast('请选择日期');
+        showToast("请选择日期");
         return;
       }
       if (!pattern.test(logsTime.value)) {
-        showToast('日期格式有误');
+        showToast("日期格式有误");
         return;
       }
-      const formattedDate = logsTime.value.replace(/-/g, '');
+      const formattedDate = logsTime.value.replace(/-/g, "");
       downloading.value = true;
       try {
-        const {
-          headers, data
-        } = await downloadLog({
+        const { headers, data } = await downloadLog({
           equipmentId: deviceId,
           day: formattedDate,
         });
-        console.log('请求成功', headers, data);
+        console.log("请求成功", headers, data);
         $M_ExportFile(data, headers);
       } catch (error) {
-        if (error.code === 'ECONNABORTED') {
+        if (error.code === "ECONNABORTED") {
           // 处理请求超时的错误
-          console.error('请求超时:', error);
+          console.error("请求超时:", error);
           showFailToast("请求超时");
         } else {
           // 处理其他请求错误
-          console.error('请求失败:', error);
+          console.error("请求失败:", error);
           showFailToast("请求失败");
         }
       } finally {
         downloading.value = false;
       }
-    }
+    };
 
     const uploadLogBtn = async () => {
       const pattern = /^\d{4}-\d{2}-\d{2}$/;
-      if (logsTime.value == '') {
-        showToast('请选择日期');
+      if (logsTime.value == "") {
+        showToast("请选择日期");
         return;
       }
       if (!pattern.test(logsTime.value)) {
-        showToast('日期格式有误');
+        showToast("日期格式有误");
         return;
       }
-      const formattedDate = logsTime.value.replace(/-/g, '');
-      const { data } = await uploadLog({
+      const formattedDate = logsTime.value.replace(/-/g, "");
+      const { data } = await (channelType.value == "1"
+        ? uploadLog
+        : newUploadLog)({
         equipmentId: deviceId,
         day: formattedDate,
       });
-      if (data.code == '00000') {
-        showToast('上传信号发送成功,请等待几秒后查询下载');
+      if (data.code == "00000") {
+        showToast("上传信号发送成功,请等待几秒后查询下载");
       } else {
         showFailToast(data.message);
       }
-    }
+    };
 
     // 查询日志是否上传成功
     const queryLogBtn = async () => {
-      if (logsTime.value == '') {
-        showToast('请选择日期');
+      if (logsTime.value == "") {
+        showToast("请选择日期");
         return;
       }
       const pattern = /^\d{4}-\d{2}-\d{2}$/;
       if (!pattern.test(logsTime.value)) {
-        showToast('日期格式有误');
+        showToast("日期格式有误");
         return;
       }
-      const formattedDate = logsTime.value.replace(/-/g, '');
+      const formattedDate = logsTime.value.replace(/-/g, "");
       const { data } = await queryLog({
         equipmentId: deviceId,
         day: formattedDate,
       });
-      if (data.code == '00000') {
+      if (data.code == "00000") {
         // console.log(data.data);
-        showToast("查询成功,点击下载")
+        showToast("查询成功,点击下载");
         fileName.value = data.data.substring(4);
       } else {
-        fileName.value = '';
+        fileName.value = "";
         showToast("找不到文件,请重试上传或检查机器网络");
       }
-    }
+    };
 
     const downloadFile = async () => {
       // 文件链接
-      const fileUrl = 'http://qiniuyun.sunzee.com.cn/log/' + fileName.value;
+      const fileUrl = "https://qiniuyun.sunzee.com.cn/log/" + fileName.value;
       // 文件名
       const newFileName = fileName.value;
       try {
         const response = await fetch(fileUrl, {
           headers: {
-            'Cache-Control': 'no-store', // 禁用缓存
-            'Pragma': 'no-cache',
-          }
+            "Cache-Control": "no-store", // 禁用缓存
+            Pragma: "no-cache",
+          },
         });
-        console.log('response', response);
+        console.log("response", response);
 
         // 将文件内容创建为Blob
         const fileBlob = await response.blob();
 
         // 创建一个下载链接
-        const downloadLink = document.createElement('a');
+        const downloadLink = document.createElement("a");
         downloadLink.href = URL.createObjectURL(fileBlob);
         downloadLink.download = newFileName;
 
@@ -235,9 +289,9 @@ export default ({
         // 清理添加的链接元素
         document.body.removeChild(downloadLink);
       } catch (error) {
-        console.error('请求超时:', error);
+        console.error("请求超时:", error);
       }
-    }
+    };
 
     return {
       deviceDetail,
@@ -253,28 +307,167 @@ export default ({
       uploadLogBtn,
       queryLogBtn,
       fileName,
-      message
-    }
+      message,
+      channelType,
+    };
   },
-
-});
+};
 </script>
 
 <style lang="less" scoped>
 @import "../../../common/style/common";
 
-.search-icon {
-  font-size: 16px;
-  line-height: inherit;
+@primary-color: #4dc294;
+@card-bg: #ffffff;
+@text-primary: #2d3436;
+@border-color: #e4e7ec;
+
+.log-viewer {
+  background: #f8fafb;
+  min-height: 100vh;
 }
 
-.button-container {
+.device-header {
   display: flex;
-  justify-content: center;
   align-items: center;
-  margin-top: 20px;
-  /* 根据需要添加上下边距 */
-  margin-bottom: 30px;
-  gap: 20px;
+  padding: 12px 15px;
+  background: #fff;
+  margin: 10px;
+  border-radius: 8px;
+  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);
+
+  .vertical-indicator {
+    width: 4px;
+    height: 15px;
+    background: var(--active-color, #4d6add);
+    border-radius: 2px;
+    margin-right: 10px;
+  }
+
+  .device-name {
+    margin: 0;
+    font-size: 15px;
+    color: #404d74;
+    font-weight: 550;
+
+    // 长名称处理
+    overflow: hidden;
+    text-overflow: ellipsis;
+    white-space: nowrap;
+    max-width: 70vw;
+  }
+}
+
+.operation-card {
+  background: @card-bg;
+  border-radius: 12px;
+  box-shadow: 0 2px 12px rgba(0, 0, 0, 0.06);
+  padding: 16px;
+  margin: 10px;
+
+  .time-picker-card {
+    margin-bottom: 16px;
+
+    .time-field {
+      :deep(.van-field__label) {
+        width: 80px;
+      }
+    }
+  }
+
+  .tutorial-card {
+    border: 1px solid @border-color;
+    border-radius: 8px;
+    margin-bottom: 24px;
+
+    .tutorial-field {
+      :deep(.van-field__label) {
+        color: @primary-color;
+        font-weight: bold;
+      }
+      :deep(textarea) {
+        color: #666;
+        font-size: 13px;
+      }
+    }
+  }
+
+  .channel-selector {
+    margin: 16px 0;
+    padding: 12px 16px;
+    background: #f8fafb;
+    border-radius: 8px;
+
+    .van-radio-group {
+      display: flex;
+      gap: 24px;
+      justify-content: center;
+    }
+
+    .channel-option {
+      :deep(.van-radio__label) {
+        color: #2d3436;
+        font-size: 14px;
+      }
+
+      :deep(.van-radio__icon) {
+        color: #4dc294;
+      }
+    }
+  }
+
+  .action-buttons {
+    display: grid;
+    grid-template-columns: repeat(2, 1fr);
+    gap: 12px;
+
+    .action-btn {
+      height: 44px;
+      font-size: 15px;
+      box-shadow: 0 4px 12px rgba(77, 194, 148, 0.2);
+
+      &:active {
+        transform: scale(0.98);
+      }
+    }
+  }
+}
+
+.file-card {
+  background: #666;
+  border-radius: 12px;
+  margin: 16px 0;
+  box-shadow: 0 2px 12px rgba(0, 0, 0, 0.06);
+
+  .file-item {
+    :deep(.van-cell__title) {
+      color: @text-primary;
+      font-weight: 500;
+    }
+
+    .download-icon {
+      color: @primary-color;
+      font-size: 18px;
+      margin-left: 8px;
+    }
+
+    &:active {
+      background-color: #f8fafb;
+    }
+  }
+}
+
+@media (max-width: 480px) {
+  .action-buttons {
+    grid-template-columns: 1fr !important;
+
+    .action-btn {
+      width: 100%;
+    }
+  }
+
+  .operation-card {
+    padding: 12px;
+  }
 }
 </style>

+ 16 - 14
src/views/orderCenter/index.vue

@@ -70,10 +70,10 @@
             {{ $t("orderCenter.records") }}
           </div>
           <van-icon
-            name="down"
+            name="upgrade"
             class="export-btn"
             @click="gotoOrderExcel"
-            size="25"
+            size="1rem"
             color="#4d6add"
           />
         </div>
@@ -147,12 +147,15 @@
                   >
                 </div>
                 <div
-                  class="commission-display" 
+                  class="commission-display"
                   v-if="user.ifForeign === '1' && item.tax != null"
                 >
                   <span class="label">{{ $t("orderCenter.tax") }}</span>
                   <span class="value"
-                    >{{ currencySymbol }}{{ item.tax != null ? item.tax.toFixed(2) : '0.00' }}</span
+                    >{{ currencySymbol
+                    }}{{
+                      item.tax != null ? item.tax.toFixed(2) : "0.00"
+                    }}</span
                   >
                 </div>
               </template>
@@ -229,11 +232,13 @@
           <span class="content">{{ showSubcom(refundObject) }}</span>
         </div>
         <div
-        v-if="user.ifForeign === '1' && refundObject.tax != null"
+          v-if="user.ifForeign === '1' && refundObject.tax != null"
           class="orderDetailBox flex-row justify-between"
         >
           <span class="title">{{ $t("orderCenter.tax") }}</span>
-          <span class="content">{{ refundObject.tax != null ? refundObject.tax.toFixed(2) : '0.00' }}</span>
+          <span class="content">{{
+            refundObject.tax != null ? refundObject.tax.toFixed(2) : "0.00"
+          }}</span>
         </div>
         <div class="orderDetailBox flex-row justify-between">
           <span class="title">{{ $t("orderCenter.equipmentNo") }}</span>
@@ -737,10 +742,10 @@ export default {
       })
         .then(async () => {
           const { data } = await sentMessage(params);
-          if (data.code) {
-            showSuccessToast(data.data);
+          if (data.code === "00000") {
+            showSuccessToast("发送成功");
           } else {
-            showFailToast(data.data);
+            showFailToast(data.message);
           }
         })
         .catch(() => {
@@ -1481,7 +1486,6 @@ export default {
             white-space: nowrap;
 
             .currency {
-
               font-size: 0.8em;
             }
           }
@@ -1541,8 +1545,8 @@ export default {
 
       .order-status-badge {
         position: absolute;
-        top: 0;
-        right: 0;
+        top: -5px;
+        right: -1.5px;
         padding: 4px 8px;
         border-radius: 0 8px 0 8px;
         font-size: 12px;
@@ -1607,7 +1611,6 @@ export default {
           gap: 4px;
           margin-top: 5px;
 
-
           .currency {
             color: #4dc193;
             font-size: 16px;
@@ -1795,7 +1798,6 @@ export default {
   .van-card__content {
     height: 50px;
   }
-
 }
 
 .record-dialog {