浏览代码

feat: "同步数据"

Ritchie 1 年之前
父节点
当前提交
92fd024541

+ 6 - 0
src/assets/language/en.json

@@ -1287,6 +1287,7 @@
     "corrEmailPlace": "Please enter the correct email address",
     "corrPhonePlace": "Please enter the correct mobile number",
     "bindWechat": "Bind WeChat",
+    "syncOldData": "Sync Data",
     "airwallex": "Airwallex",
     "currencySymbol": "Currency",
     "currencySymbolPlace": "Please enter currency symbol",
@@ -1394,6 +1395,11 @@
     "successfully": "Add successfully",
     "failed": "Add failure"
   },
+  "syncOldData": {
+    "header": "Sync Data",
+    "title": "Title",
+    "syncing": "Synchronizing"
+  },
   "DIYFlower": {
     "openStatus": "DIY pattern function switch status: On",
     "closeStatus": "DIY pattern function switch status: Off",

+ 6 - 0
src/assets/language/zh.json

@@ -1300,6 +1300,7 @@
     "corrEmailPlace": "请输入正确的邮箱",
     "corrPhonePlace": "请输入正确的手机号",
     "bindWechat": "绑定微信",
+    "syncOldData": "数据同步",
     "airwallex": "空中云汇",
     "currencySymbol": "自定义货币",
     "currencySymbolPlace": "请输入自定义货币",
@@ -1410,6 +1411,11 @@
     "successfully": "添加成功",
     "failed": "添加失败"
   },
+  "syncOldData": {
+    "header": "数据同步",
+    "title": "标题",
+    "syncing": "同步中"
+  },
   "DIYFlower": {
     "openStatus": "DIY花型功能开关状态:开启",
     "closeStatus": "DIY花型功能开关状态:关闭",

二进制
src/assets/user/loginOut.png


二进制
src/assets/user/syncOldDataIcon.png


+ 2 - 2
src/common/style/base.less

@@ -9,8 +9,8 @@ html,body{
 input{
   border: none;
   outline: none;
-  -webkit-appearance: none;
-  -webkit-appearance: none;
+  // -webkit-appearance: none;
+  // -webkit-appearance: none;
   -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
 }
 textarea{

+ 2 - 1
src/main.js

@@ -4,7 +4,7 @@ import {
   AddressList, Field, CellGroup, Cell, SwipeCell, Icon, Stepper, Card, Checkbox, CheckboxGroup, Button, Swipe, SwipeItem,
   PullRefresh, List, Tab, Tabs, SubmitBar, Toast, Skeleton, RadioGroup, Radio, NoticeBar, ActionSheet, Cascader, Col, Row,
   Slider, DatetimePicker, Switch, Calendar, Picker, Uploader, Tag, DropdownMenu, DropdownItem, Notify, ConfigProvider, NavBar,
-  Area, Popover, Collapse, CollapseItem
+  Area, Popover, Collapse, CollapseItem, Progress
 } from 'vant';
 import { Image as VanImage } from 'vant';
 import App from './App.vue'
@@ -84,6 +84,7 @@ app.use(ActionBarButton)
   .use(Popover)
   .use(Collapse)
   .use(CollapseItem)
+  .use(Progress)
   
 
 app.use(router)

+ 7 - 0
src/router/index.js

@@ -49,6 +49,13 @@ const router = createRouter({
       component: () => import("@/views/bindWechat.vue"),
       meta: { index: 1, noLogin: true },
     },
+    // 数据同步
+    {
+      path: "/syncOldData",
+      name: "syncOldData",
+      component: () => import("@/views/syncOldData/index.vue"),
+      meta: { index: 1},
+    },
     // 修改密码页面
     {
       path: "/changepassword",

+ 6 - 0
src/service/syncOldData/index.js

@@ -0,0 +1,6 @@
+import axios from '../../utils/axios';
+
+// 同步订单数据
+export function syncAllData(params) {
+  return axios.post(`/PAY-SERVER/syncOrder/byCAT?adminId=${params.username}&clientId=${params.clientId}&startTime=${params.startTime}&endTime=${params.endTime}`, params);
+}

+ 18 - 7
src/styles/user/index.less

@@ -144,7 +144,7 @@
                         background: #fff url("../../assets/user/taskMessageIcon.png") top center no-repeat;
                         background-size: 100%;
                         width: 0.55rem;
-                        height: 0.6rem;
+                        height: 0.55rem;
                         right: 0.2rem;
                         top: 0.45rem;
                     }
@@ -188,8 +188,8 @@
                         position: absolute;
                         background: #fff url("../../assets/user/shandeMchIcon.png") top center no-repeat;
                         background-size: 100%;
-                        width: 0.6rem;
-                        height: 0.6rem;
+                        width: 0.55rem;
+                        height: 0.55rem;
                         right: 0.2rem;
                         top: 0.4rem;
                     }
@@ -199,8 +199,19 @@
                         position: absolute;
                         background: #fff url("../../assets/user/bindWechatIcon.png") top center no-repeat;
                         background-size: 100%;
-                        width: 0.6rem;
-                        height: 0.6rem;
+                        width: 0.55rem;
+                        height: 0.55rem;
+                        right: 0.2rem;
+                        top: 0.4rem;
+                    }
+
+                    &.syncOldDataIcon::after {
+                        content: "";
+                        position: absolute;
+                        background: #fff url("../../assets/user/syncOldDataIcon.png") top center no-repeat;
+                        background-size: 100%;
+                        width: 0.55rem;
+                        height: 0.55rem;
                         right: 0.2rem;
                         top: 0.4rem;
                     }
@@ -221,8 +232,8 @@
                         position: absolute;
                         background: #fff url("../../assets/user/self.png") top center no-repeat;
                         background-size: 100%;
-                        width: 0.53rem;
-                        height: 0.53rem;
+                        width: 0.55rem;
+                        height: 0.55rem;
                         right: 0.2rem;
                         top: 0.4rem;
                     }

+ 14 - 33
src/views/bindWechat.vue

@@ -1,42 +1,23 @@
 <template>
   <!-- 绑定微信 -->
   <div class="bindWechat">
-    <s-header
-        :name="$t('wechat.headerName')"
-        :noback="false"
-    ></s-header>
+    <s-header :name="$t('wechat.headerName')" :noback="false"></s-header>
     <div class="loginFormBox">
       <van-form @submit="onSubmit">
         <!-- 微信头像 -->
         <div style="display: flex;justify-content: center;align-items: center">
-          <van-image
-              width="100px"
-              height="100px"
-              :src="wechatInfo.avatarUrl"
-              fit="cover"
-              radius="50%"
-              style="margin: auto"
-          />
+          <van-image width="100px" height="100px" :src="wechatInfo.avatarUrl" fit="cover" radius="50%"
+            style="margin: auto" />
         </div>
         <br>
         <br>
         <br>
         <div class="buttonBox">
           <!-- 取消绑定微信,返回登录页 -->
-          <van-button
-              round
-              type="primary"
-              class="register"
-              @click="cancelClick"
-          >{{ $t('bindWechat.cancel') }}
+          <van-button round type="primary" class="register" @click="cancelClick">{{ $t('bindWechat.cancel') }}
           </van-button>
           <!-- 用户回车,默认触发 form 表单提交操作 -->
-          <van-button
-              round
-              type="primary"
-              native-type="submit"
-              id="bind-btn"
-          >{{ $t('bindWechat.bindCommit') }}
+          <van-button round type="primary" native-type="submit" id="bind-btn">{{ $t('bindWechat.bindCommit') }}
           </van-button>
         </div>
 
@@ -46,20 +27,20 @@
 </template>
 
 <script>
-import {onMounted, reactive, ref} from "vue";
-import {Toast} from "vant";
-import {bindWechat, getAvatar} from "@/service/bindWechat";
-import {setLocal, getLocal, navigatorLanguage, getLoginUser, styleUrl} from "@/common/js/utils";
+import { onMounted, reactive, ref } from "vue";
+import { Toast } from "vant";
+import { bindWechat, getAvatar } from "@/service/bindWechat";
+import { setLocal, getLocal, navigatorLanguage, getLoginUser, styleUrl } from "@/common/js/utils";
 import sHeader from "@/components/SimpleHeader";
 import logiLogoImgUrl from "@/assets/login/logo.png";
-import {useRouter} from "vue-router";
-import {useI18n} from "vue-i18n";
+import { useRouter } from "vue-router";
+import { useI18n } from "vue-i18n";
 
 export default {
   setup: function () {
     let languageName = ref(getLocal("curLang"));
     // eslint-disable-next-line no-unused-vars
-    const {t} = useI18n();
+    const { t } = useI18n();
 
     const checked = ref(false); // 是否记住密码状态
     const userName = ref("");
@@ -90,7 +71,7 @@ export default {
     const onSubmit = async () => {
       try {
         const { data } = await bindWechat(
-            user.id
+          user.id
         );
         if (data.code === "00000") {
           console.log(data.data);
@@ -133,7 +114,7 @@ export default {
       wechatInfo
     };
   },
-  components: {sHeader},
+  components: { sHeader },
 };
 </script>
 

+ 4 - 4
src/views/device/viewLogs/index.vue

@@ -8,13 +8,13 @@
     <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-datetime-picker type="date" :min-date="minDate" :max-date="maxDate"
-                             @confirm="selectTime" @cancel="showPicker = false" />
+        <van-datetime-picker type="date" :min-date="minDate" :max-date="maxDate" @confirm="selectTime"
+          @cancel="showPicker = false" />
       </van-popup>
       <van-button v-if="!downloading" round :disabled="logsTime === ''" type="primary" class="volumeChangeButton"
-                  @click="downloadBtn">{{ $t('device.download') }}</van-button>
+        @click="downloadBtn">{{ $t('device.download') }}</van-button>
       <van-button v-else disabled loading round class="volumeChangeButton" type="primary"
-                  :loading-text="$t('device.downloading')" />
+        :loading-text="$t('device.downloading')" />
     </div>
   </div>
 </template>

+ 136 - 0
src/views/syncOldData/index.vue

@@ -0,0 +1,136 @@
+<template>
+    <!-- 一键同步 -->
+    <div class="syncOldData" style="background-color:#ebedf0">
+        <s-header :name="$t('syncOldData.header')" :noback="true"></s-header>
+        <br>
+        <div>
+
+            <van-form @submit="onSubmit">
+                <van-cell-group inset>
+                    <van-field v-model="username" name="用户名" label="用户名" placeholder="用户名"
+                        :rules="[{ required: true, message: '请填写用户名' }]" />
+                    <van-field v-model="clientId" name="机器唯一码" label="机器唯一码" placeholder="eg.161199389060165244806465"
+                        :rules="[{ required: true, message: '请填写机器唯一码' }]" />
+
+                    <van-field v-model="startDate" is-link readonly name="开始日期" label="开始日期" placeholder="选择开始日期"
+                        @click="showPicker1 = true" :rules="[{ required: true, message: '请选择开始日期' }]">
+                    </van-field>
+                    <van-popup v-model:show="showPicker1" position="bottom">
+                        <van-datetime-picker type="date" @confirm="startDateConfirm" :min-date="minDate" :max-date="maxDate"
+                            @cancel="showPicker1 = false" />
+                    </van-popup>
+
+                    <van-field v-model="endDate" is-link readonly name="结束日期" label="结束日期" placeholder="选择结束日期 "
+                        @click="showPicker2 = true" :rules="[{ required: true, message: '请选择结束日期' }]">
+                    </van-field>
+                    <van-popup v-model:show="showPicker2" position="bottom">
+                        <van-datetime-picker type="date" @confirm="endDateConfirm" :min-date="minDate" :max-date="maxDate"
+                            @cancel="showPicker2 = false" />
+                    </van-popup>
+
+                </van-cell-group>
+                <div style="margin: 16px; display: flex; justify-content: center; align-items: center;">
+                    <van-button round class="custom-button" type="primary" size="small" @click="prevStep" :disabled="cancelBtn">
+                        取消
+                    </van-button>
+                    <div style="width: 20%;"></div>
+                    <van-button round class="custom-button" type="primary" size="small" native-type="submit"
+                        @click="syncOldAllClk" :loading=reqApi :loading-text="$t('syncOldData.syncing')" >
+                        一键同步
+                    </van-button>
+                </div>
+            </van-form>
+        </div>
+    </div>
+</template>
+
+<script>
+import { Toast } from 'vant';
+import { ref } from 'vue';
+import sHeader from "../../components/SimpleHeader";
+import router from '../../router';
+import { syncAllData } from '@/service/syncOldData/index';
+import dateUtil from '../../utils/dateUtil';
+
+export default {
+    components: { sHeader },
+
+    setup() {
+        const username = ref("");
+        const clientId = ref("");
+        const startDate = ref("");
+        const endDate = ref("");
+        const showPicker1 = ref(false);
+        const showPicker2 = ref(false);
+        const reqApi = ref(false);
+        const cancelBtn = ref(false);
+
+
+        const syncOldAllClk = async () => {
+            reqApi.value = true;
+            cancelBtn.value = true;
+            try {
+                const { data } = await syncAllData({
+                    username: username.value,
+                    clientId: clientId.value,
+                    startTime: startDate.value,
+                    endTime: endDate.value,
+                });
+                if (data.code === '00000') {
+                    reqApi.value = false;
+                    cancelBtn.value = false;
+                    Toast.success(data.msg);
+                } else {
+                    reqApi.value = false;
+                    cancelBtn.value = false;
+                    Toast.fail(data.msg);
+                }
+            } catch (error) {
+                console.error(error);
+                reqApi.value = false;
+                cancelBtn.value = false;
+                Toast.fail("同步失败");
+            }
+        }
+        const prevStep = () => {
+            router.go(-1);
+        }
+
+        const startDateConfirm = (time) => {
+            startDate.value = dateUtil.formateDate(time, "yyyy-MM-dd hh:mm:ss");
+
+            showPicker1.value = false;
+        }
+
+        const endDateConfirm = (time) => {
+            endDate.value = dateUtil.formateDate(time, "yyyy-MM-dd hh:mm:ss");
+
+            showPicker2.value = false;
+        }
+
+        return {
+            username,
+            clientId,
+            startDate,
+            endDate,
+            showPicker1,
+            showPicker2,
+            startDateConfirm,
+            endDateConfirm,
+            minDate: new Date(2023, 2, 19),
+            maxDate: new Date(2025, 10, 1),
+            prevStep,
+            syncOldAllClk,
+            reqApi,
+            cancelBtn,
+        }
+    }
+
+}
+</script>
+
+<style>
+.custom-button {
+    width: 120px;
+}
+</style>

+ 187 - 0
src/views/syncOldData/step.vue

@@ -0,0 +1,187 @@
+<template>
+    <!-- 数据同步 -->
+    <div class="syncOldData" style="background-color:#ebedf0">
+        <s-header :name="$t('syncOldData.header')" :noback="false"></s-header>
+        <br>
+        <div>
+            <van-progress :percentage="percentNum" :color="progressColor" />
+            <br>
+            <van-form v-if="step === 1" @submit="onSubmitStep1">
+                <van-cell-group inset>
+                    <van-field v-model="username" name="用户名" label="用户名" placeholder="用户名"
+                        :rules="[{ required: true, message: '请填写用户名' }]" />
+                </van-cell-group>
+                <div style="margin: 16px; display: flex; justify-content: center; align-items: center;">
+                    <van-button round block type="primary" native-type="submit" size="small"
+                        style="width: 150px; margin-right: 8px;">
+                        同步权限
+                    </van-button>
+                </div>
+            </van-form>
+
+            <van-form v-if="step === 2" @submit="onSubmitStep2">
+                <van-cell-group inset>
+                    <van-field v-model="username" name="用户名" label="用户名" placeholder="用户名"
+                        :rules="[{ required: true, message: '请填写用户名' }]" />
+                    <van-field v-model="clientId" name="机器唯一码" label="机器唯一码" placeholder="机器唯一码"
+                        :rules="[{ required: true, message: '请填写机器唯一码' }]" />
+                </van-cell-group>
+                <div style="margin: 16px; display: flex; justify-content: center; align-items: center;">
+                    <van-button round block type="primary" size="small" @click="prevStep" disabled>
+                        上一步
+                    </van-button>
+                    <div style="width: 100px;"></div>
+                    <van-button round block type="primary" size="small" native-type="submit">
+                        同步设备
+                    </van-button>
+                </div>
+            </van-form>
+
+            <van-form v-if="step === 3" @submit="onSubmitStep3">
+                <van-cell-group inset>
+                    <van-field v-model="username" name="用户名" label="用户名" placeholder="用户名"
+                        :rules="[{ required: true, message: '请填写用户名' }]" />
+                    <van-field v-model="clientId" name="机器唯一码" label="机器唯一码" placeholder="机器唯一码"
+                        :rules="[{ required: true, message: '请填写机器唯一码' }]" />
+
+                    <van-field v-model="startDate" is-link readonly name="开始日期" label="开始日期" placeholder="选择开始日期"
+                        @click="showPicker1 = true" :rules="[{ required: true, message: '请选择开始日期' }]">
+                    </van-field>
+                    <van-popup v-model:show="showPicker1" position="bottom">
+                        <van-datetime-picker type="date" @confirm="onConfirm1" :min-date="minDate" :max-date="maxDate"
+                            @cancel="showPicker1 = false" />
+                    </van-popup>
+
+                    <van-field v-model="endDate" is-link readonly name="结束日期" label="结束日期" placeholder="选择结束日期 "
+                        @click="showPicker2 = true" :rules="[{ required: true, message: '请选择结束日期' }]">
+                    </van-field>
+                    <van-popup v-model:show="showPicker2" position="bottom">
+                        <van-datetime-picker type="date" @confirm="onConfirm2" :min-date="minDate" :max-date="maxDate"
+                            @cancel="showPicker2 = false" />
+                    </van-popup>
+
+                    <!-- <van-datetime-picker v-model="currentDate" type="date" title="选择开始日期年月日" :min-date="minDate"
+                        :max-date="maxDate" />
+                    <van-datetime-picker v-model="currentDate" type="date" title="选择结束日期年月日" :min-date="minDate"
+                        :max-date="maxDate" /> -->
+                </van-cell-group>
+                <div style="margin: 16px; display: flex; justify-content: center; align-items: center;">
+                    <van-button round block type="primary" size="small" @click="prevStep" disabled>
+                        上一步
+                    </van-button>
+                    <div style="width: 100px;"></div>
+                    <van-button round block type="primary" size="small" native-type="submit">
+                        同步订单
+                    </van-button>
+                </div>
+            </van-form>
+
+            <van-form v-if="step === 4" @submit="onSubmitStep4">
+                <van-row justify="center">
+                    <van-col span="12">
+                        <van-image width="10rem" height="10rem" fit="cover" position="center"
+                            :src="require('../../assets/user/syncOldDataIcon.png')" />
+                        
+                        <p style="display: center;">同步完成</p>
+                    </van-col>
+                </van-row>
+                <van-cell-group inset>
+                    <van-cell>
+                        <p style="text-align: center;">同步完成</p>
+                    </van-cell>
+                </van-cell-group>
+
+            </van-form>
+        </div>
+
+    </div>
+</template>
+
+<script>
+import { ref } from 'vue';
+import sHeader from "../../components/SimpleHeader";
+
+export default {
+    components: { sHeader },
+
+    setup() {
+        const percentNum = ref(0);
+        const step = ref(1);
+        const username = ref("");
+        const clientId = ref("");
+        const startDate = ref("");
+        const endDate = ref("");
+        const showPicker1 = ref(false);
+        const showPicker2 = ref(false);
+        const progressColor = ref("#1989fa");
+
+        const prevStep = () => {
+            step.value--;
+        }
+
+        const onConfirm1 = (value) => {
+            console.log("confirm1");
+            console.log("startDate>>>", startDate.value);
+            startDate.value = value;
+            console.log("showPicker1>>>", showPicker1);
+            showPicker1.value = false;
+        }
+
+        const onConfirm2 = (value) => {
+            console.log("confirm2");
+            console.log("endDate>>>", endDate.value);
+            endDate.value = value;
+            console.log("showPicker2>>>", showPicker2);
+            showPicker2.value = false;
+        }
+
+        const onSubmitStep1 = async () => {
+            console.log("submit1");
+            step.value = 2;
+            percentNum.value = 20;
+        }
+
+        const onSubmitStep2 = async () => {
+            console.log("submit2");
+            step.value = 3;
+            percentNum.value = 40;
+        }
+
+        const onSubmitStep3 = async () => {
+            console.log("submit3");
+            percentNum.value = 80;
+            step.value = 4;
+        }
+
+        const onSubmitStep4 = async () => {
+            console.log("submit4");
+            percentNum.value = 100;
+            progressColor.value = "#0dbc79";
+        }
+
+
+        return {
+            step,
+            onSubmitStep1,
+            onSubmitStep2,
+            onSubmitStep3,
+            onSubmitStep4,
+            percentNum,
+            username,
+            clientId,
+            showPicker1,
+            showPicker2,
+            startDate,
+            endDate,
+            onConfirm1,
+            onConfirm2,
+            minDate: new Date(2023, 2, 19),
+            maxDate: new Date(2025, 10, 1),
+            progressColor,
+            prevStep
+        }
+    }
+}
+</script>
+
+<style></style>

+ 12 - 1
src/views/user.vue

@@ -221,6 +221,17 @@
             </div>
           </div>
 
+          <!-- 数据同步 -->
+          <div v-if="user.type == '0'" class="taskListRow flex-col" @click="pushPageList('/syncOldData')">
+          <!-- <div class="taskListRow flex-col" @click="pushPageList('/syncOldData')"> -->
+            <div class="taskIcon syncOldDataIcon"></div>
+            <div class="taskRight">
+              <div class="taskTitle">
+                {{ $t("user.syncOldData") }}
+              </div>
+            </div>
+          </div>
+
           <!-- 修改密码 -->
           <div class="taskListRow flex-col" @click="pushPageList('/changepassword')">
             <div class="taskIcon changePasswordIcon"></div>
@@ -720,5 +731,5 @@ export default {
 </script>
 
 <style lang="less" scoped>
-@import "../common/style/mixin.less";
+@import "../common/style/mixin";
 </style>