Browse Source

Merge branch '165' of uskycloud/usky-web-mobile into master

xf15575941817 1 năm trước cách đây
mục cha
commit
b7d6ce5206
67 tập tin đã thay đổi với 1705 bổ sung2188 xóa
  1. 19 0
      src/api/common/index.js
  2. 19 0
      src/api/common/repairReport.js
  3. 0 1
      src/components/list-test/list-test.vue
  4. 20 20
      src/components/oa-dropdown/index.vue
  5. 6 0
      src/components/oa-scroll/index.vue
  6. 2 2
      src/manifest.json
  7. 44 4
      src/pages.json
  8. 6 6
      src/pages/business/fireIot/alarmManage/alarmDetails/index.vue
  9. 4 8
      src/pages/business/fireIot/alarmManage/index.vue
  10. 7 7
      src/pages/business/fireIot/deviceManage/components/deviceDetails.vue
  11. 4 3
      src/pages/business/fireIot/deviceManage/components/deviceDetailsList.vue
  12. 2 2
      src/pages/business/fireIot/deviceManage/index.vue
  13. 103 102
      src/pages/business/fireIot/facilitiesGather/index.vue
  14. 7 7
      src/pages/business/fireIot/facilitiesManage/facilitiesDetails.vue
  15. 3 2
      src/pages/business/fireIot/facilitiesManage/facilitiesDetailsList.vue
  16. 1 1
      src/pages/business/fireIot/facilitiesManage/index.vue
  17. 1 2
      src/pages/business/mhxf/deviceManage/index.vue
  18. 8 8
      src/pages/business/mhxf/fireReport/components/detailed.vue
  19. 1 1
      src/pages/business/mhxf/informationSelect/index.vue
  20. 3 3
      src/pages/business/mhxf/needMatter/index.vue
  21. 0 904
      src/pages/business/mhxf/unitInfoCollection/index copy.vue
  22. 16 23
      src/pages/business/mhxf/unitInfoCollection/index.vue
  23. 2 2
      src/pages/business/mhxf/xunJian/collect/components/collectDetail.vue
  24. 2 2
      src/pages/business/mhxf/xunJian/collect/components/collectRecord.vue
  25. 3 3
      src/pages/business/mhxf/xunJian/collect/index.vue
  26. 9 9
      src/pages/business/mhxf/xunJian/plan/components/content.vue
  27. 2 2
      src/pages/business/mhxf/xunJian/plan/components/drawer.vue
  28. 2 2
      src/pages/business/mhxf/xunJian/plan/components/report.vue
  29. 7 7
      src/pages/business/mhxf/xunJian/plan/components/siteDetails.vue
  30. 0 7
      src/pages/business/zhxf/funReport/funcAdd/index.vue
  31. 1 3
      src/pages/business/zhxf/funReport/index.vue
  32. 1 10
      src/pages/business/zhxf/messagePush/index.vue
  33. 1 0
      src/pages/common/applicationInfo/index.vue
  34. 77 44
      src/pages/common/customManage/index.vue
  35. 107 0
      src/pages/common/evaluate/index.vue
  36. 0 1
      src/pages/common/export/index.vue
  37. 19 12
      src/pages/common/invoicing/index.vue
  38. 192 0
      src/pages/common/phoneVerify/index.vue
  39. 183 0
      src/pages/common/repairReport/index.vue
  40. 183 0
      src/pages/common/repairReport/record.vue
  41. 6 1
      src/pages/common/success/index.vue
  42. 95 118
      src/pages/common/test/index.vue
  43. 3 6
      src/pages/common/test/test-1.vue
  44. 28 32
      src/pages/index.vue
  45. 1 1
      src/pages/info.vue
  46. 8 39
      src/pages/login.vue
  47. 5 5
      src/pages/mine.vue
  48. 0 466
      src/pages/mine/index.vue
  49. 3 3
      src/pages/mine/info/index.vue
  50. 133 0
      src/pages/mine/secure/fingerprint/index.vue
  51. 10 7
      src/pages/mine/secure/index.vue
  52. 2 2
      src/pages/mine/setting/index.vue
  53. 32 7
      src/pages/serveConfig.vue
  54. 12 1
      src/pages/serveConfigSelect.vue
  55. 7 3
      src/permission.js
  56. 22 0
      src/plugins/common.plugins.js
  57. 2 2
      src/plugins/modal.plugins.js
  58. 8 3
      src/static/iconfont/iconfont.css
  59. BIN
      src/static/iconfont/iconfont.ttf
  60. 65 105
      src/static/scss/index.scss
  61. 33 31
      src/static/scss/public.scss
  62. 20 19
      src/store/modules/setting.js
  63. 86 26
      src/store/modules/user.js
  64. 0 16
      src/utils/constant.js
  65. 51 61
      src/utils/request.js
  66. 4 23
      src/utils/storage.js
  67. 2 1
      uniCloud-aliyun/cloudfunctions/uniPushMessage/index.js

+ 19 - 0
src/api/common/index.js

@@ -0,0 +1,19 @@
+import { request } from "@/utils/request";
+
+//手机号验证
+export function phoneVerify(param) {
+    return request({
+        url: "/service-iot/crmDeviceRepair/phoneVerify",
+        method: "POST",
+        data: param,
+    });
+}
+
+//服务评价
+export function score(param) {
+    return request({
+        url: "/service-iot/crmDeviceRepair/score",
+        method: "POST",
+        data: param,
+    });
+}

+ 19 - 0
src/api/common/repairReport.js

@@ -0,0 +1,19 @@
+import { request } from "@/utils/request";
+
+//报修申请
+export function add(param) {
+    return request({
+        url: "/service-iot/crmDeviceRepair/add",
+        method: "POST",
+        data: param,
+    });
+}
+
+//获取每个手机号提交的历史记录
+export function getHistory(param) {
+    return request({
+        url: "/service-iot/crmDeviceRepair/getHistory",
+        method: "POST",
+        data: param,
+    });
+}

+ 0 - 1
src/components/list-test/list-test.vue

@@ -128,7 +128,6 @@ export default {
 
     // 隐藏显示
     showDetail(e) {
-      // alert(1);
       // 存储点击那一项的状态
       const nowStatu = e.isShow;
       // 将每一项列表的isShow设置为false,让所有的列表都隐藏

+ 20 - 20
src/components/oa-dropdown/index.vue

@@ -1,11 +1,11 @@
 <template>
   <view>
-    <view class="dropdown" :class="dropdownShow ? 'show' : 'none'">
+    <view class="oa-dropdown" :class="dropdownShow ? 'show' : 'none'">
       <view class="content">
         <slot name="content"></slot>
       </view>
     </view>
-    <view v-if="closeOnClickOverlay" class="dropdown" :class="dropdownShow ? 'mask' : 'none'" @click="close()"> </view>
+    <view v-if="closeOnClickOverlay" class="oa-dropdown" :class="dropdownShow ? 'mask' : 'none'" @click="close()"> </view>
   </view>
 </template>
 <script setup>
@@ -32,8 +32,8 @@ function close() {
   emit("close", false);
 }
 </script>
-<style scoped>
-.dropdown {
+<style lang="scss" scoped>
+.oa-dropdown {
   position: absolute;
   width: 100%;
   background-color: #fff;
@@ -42,24 +42,24 @@ function close() {
   z-index: 90;
   transition: max-height 0.4s ease-in-out;
   box-shadow: 0px 1px 2px 0px rgba(141, 141, 141, 0.4);
-}
 
-.dropdown.show {
-  max-height: 100%;
-}
+  &.show {
+    max-height: 100%;
+  }
 
-.dropdown.mask {
-  position: fixed;
-  top: 0;
-  left: 0;
-  right: 0;
-  bottom: 0;
-  background-color: transparent;
-  height: 100%;
-  z-index: 50;
-}
+  &.mask {
+    position: fixed;
+    top: 0;
+    left: 0;
+    right: 0;
+    bottom: 0;
+    background-color: transparent;
+    height: 100%;
+    z-index: 50;
+  }
 
-.dropdown .content {
-  padding: 10px;
+  .content {
+    padding: 10px;
+  }
 }
 </style>

+ 6 - 0
src/components/oa-scroll/index.vue

@@ -10,6 +10,7 @@
     :refresher-triggered="triggered"
     :refresher-background="refresherBackground"
     :scroll-top="scrollTop"
+    :scroll-into-view="scrollIntoView"
     @refresherrefresh="onRefresh"
     @scrolltolower="scrolltolower"
   >
@@ -107,6 +108,11 @@ const props = defineProps({
     type: String,
     default: "#fff",
   },
+  //是否滚动到指定id的位置
+  scrollIntoView: {
+    type: String,
+    default: "",
+  },
 });
 
 const { pageSize, total, scrollTop, customClass, customStyle, refresherLoad, lowerThreshold, refresherEnabled, refresherThreshold, refresherDefaultStyle, refresherBackground } = toRefs(props);

+ 2 - 2
src/manifest.json

@@ -2,8 +2,8 @@
     "name" : "综合智慧云",
     "appid" : "__UNI__36DE3A0",
     "description" : "综合智慧云app,助力企业数字化转型升级",
-    "versionName" : "2.0.5",
-    "versionCode" : 7,
+    "versionName" : "2.0.6",
+    "versionCode" : 8,
     "transformPx" : false,
     /* 5+App特有相关 */
     "app-plus" : {

+ 44 - 4
src/pages.json

@@ -126,6 +126,14 @@
             "enablePullDownRefresh": false
           }
         },
+        {
+          "path": "phoneVerify/index",
+          "style": {
+            "navigationBarTitleText": "",
+            "navigationBarTextStyle": "black",
+            "navigationBarBackgroundColor": "#FFFFFF"
+          }
+        },
         {
           "path": "customManage/index",
           "style": {
@@ -147,6 +155,27 @@
             "navigationBarTitleText": "应用消息",
             "enablePullDownRefresh": false
           }
+        },
+        {
+          "path": "repairReport/index",
+          "style": {
+            "navigationBarTitleText": "报修申请",
+            "enablePullDownRefresh": false
+          }
+        },
+        {
+          "path": "repairReport/record",
+          "style": {
+            "navigationBarTitleText": "报修历史",
+            "enablePullDownRefresh": false
+          }
+        },
+        {
+          "path": "evaluate/index",
+          "style": {
+            "navigationBarTitleText": "服务评价",
+            "enablePullDownRefresh": false
+          }
         }
       ]
     },
@@ -183,14 +212,18 @@
             "enablePullDownRefresh": false
           }
         },
+        {
+          "path": "secure/fingerprint/index",
+          "style": {
+            "navigationBarTitleText": "",
+            "navigationBarTextStyle": "black",
+            "navigationBarBackgroundColor": "#FFFFFF"
+          }
+        },
         {
           "path": "avatar/index",
           "style": {
             "navigationBarTitleText": "修改头像"
-            // "app-plus": {
-            //   "bounce": "none",
-            //   "titleNView": false
-            // }
           }
         },
         {
@@ -214,6 +247,13 @@
               "titleNView": false
             }
           }
+        },
+        {
+          "path": "setting/index",
+          "style": {
+            "navigationBarTitleText": "设置",
+            "enablePullDownRefresh": false
+          }
         }
       ]
     },

+ 6 - 6
src/pages/business/fireIot/alarmManage/alarmDetails/index.vue

@@ -1,7 +1,7 @@
 <template>
   <scroll-view class="scroll-height" :scroll-y="true" :data-theme="'theme-' + proxy.$settingStore.themeColor.name">
     <view class="alarmDetails-container">
-      <view class="flex bg-white padding-15 margin-b-15">
+      <view class="flex bg-white p15 mb15">
         <image style="width: 40px; height: 40px; margin: auto 15px auto 0" :src="dataArray.typeImg ? dataArray.typeImg : '/static/images/404.png'" mode="aspectFill"></image>
 
         <view style="margin: auto auto auto 0">
@@ -15,8 +15,8 @@
         </view>
       </view>
 
-      <view class="bg-white padding-15 margin-b-15">
-        <uni-section class="block margin-b-10" title="基本信息" type="line"></uni-section>
+      <view class="bg-white p15 mb15">
+        <uni-section class="block mb10" title="基本信息" type="line"></uni-section>
 
         <view class="tableType3 padding-0">
           <u-row v-for="da in dataList" :key="da">
@@ -30,8 +30,8 @@
         </view>
       </view>
 
-      <view class="bg-white padding-15 margin-b-15">
-        <uni-section class="block margin-b-10" title="处理内容" type="line"></uni-section>
+      <view class="bg-white p15 mb15">
+        <uni-section class="block mb10" title="处理内容" type="line"></uni-section>
 
         <view>
           <u-radio-group v-model="handleRange" placement="row" v-if="dataArray.handleStatus != 1">
@@ -175,7 +175,7 @@ function handleSubmit(alarmFalse) {
     handleRange: handleRange.value,
   }).then((requset) => {
     if (requset.status === "SUCCESS") {
-      proxy.$tab.redirectTo("/pages/common/success/index");
+      proxy.$tab.navigateTo(`/pages/common/success/index?codeName=提交成功`);
     }
   });
 }

+ 4 - 8
src/pages/business/fireIot/alarmManage/index.vue

@@ -18,8 +18,8 @@
         <u-grid :border="true">
           <u-grid-item v-for="(base, index) in dataList" :key="index" @click="handleToDetails(base.productCode, base.productName)">
             <u-badge type="primary" max="9999" :value="base.total" :showZero="true" :absolute="true" :offset="[10, 10, 0, 0]"></u-badge>
-            <image class="margin-b-15" style="width: 40px; height: 40px; margin-top: 35px" :src="base.typeImg" mode="aspectFill"></image>
-            <text class="margin-b-15 grid-text text-ellipsis">{{ base.productName }}</text>
+            <image class="mb15" style="width: 40px; height: 40px; margin-top: 35px" :src="base.typeImg" mode="aspectFill"></image>
+            <text class="mb15 grid-text text-ellipsis">{{ base.productName }}</text>
           </u-grid-item>
         </u-grid>
       </view>
@@ -47,16 +47,12 @@ const total = ref(0);
 function init() {
   baseAlarmTypeList({ productName: "", current: current.value, size: pageSize.value }).then((requset) => {
     if (requset.status === "SUCCESS") {
-      dmpProductInfo({ current: current.value, size: 200000 }).then((requset1) => {
+      dmpProductInfo({ current: current.value, size: 2000 }).then((requset1) => {
         if (requset1.status === "SUCCESS") {
           requset.data.records.forEach((e) => {
             requset1.data.records.forEach((el) => {
               if (e.productCode === el.productCode) {
-                e.typeImg = el.typeImg;
-              }
-
-              if (!e.typeImg) {
-                e.typeImg = "/static/images/404.png";
+                e.typeImg = el.typeImg ? el.typeImg : "/static/images/404.png";
               }
             });
           });

+ 7 - 7
src/pages/business/fireIot/deviceManage/components/deviceDetails.vue

@@ -1,7 +1,7 @@
 <template>
   <scroll-view class="scroll-height" :scroll-y="true" :data-theme="'theme-' + proxy.$settingStore.themeColor.name">
     <view class="deviceDetails-container">
-      <view class="flex bg-white padding-15 margin-b-15">
+      <view class="flex bg-white p15 mb15">
         <image style="width: 40px; height: 40px; margin: auto 15px auto 0" :src="'/static/images/404.png'" mode="aspectFill"></image>
 
         <view style="margin: auto auto auto 0">
@@ -15,8 +15,8 @@
         </view>
       </view>
 
-      <view class="bg-white padding-15 margin-b-15">
-        <uni-section class="block margin-b-10" title="基本信息" type="line"></uni-section>
+      <view class="bg-white p15 mb15">
+        <uni-section class="block mb10" title="基本信息" type="line"></uni-section>
 
         <view class="tableType3 padding-0">
           <u-empty v-if="dataList.length <= 0" text="暂无数据" mode="data" icon="http://cdn.uviewui.com/uview/empty/data.png"> </u-empty>
@@ -32,7 +32,7 @@
         </view>
       </view>
 
-      <view class="bg-white padding-15 margin-b-15">
+      <view class="bg-white p15 mb15">
         <!-- 分段器组件 -->
         <view class="app-subsection">
           <u-subsection :list="list" :current="tabPosition" inactiveColor="#303133" :activeColor="proxy.$settingStore.themeColor.color" @change="tabPositionChange" style="width: 100%"></u-subsection>
@@ -40,8 +40,8 @@
 
         <view v-if="tabPosition == 1">
           <view class="flex" :style="{ color: proxy.$settingStore.themeColor.color }">
-            <view class="margin-l-10" style="margin-left: auto" @click="open">选择时间</view>
-            <view class="margin-l-10" @click="modalShow = true">筛选</view>
+            <view class="ml10" style="margin-left: auto" @click="open">选择时间</view>
+            <view class="ml10" @click="modalShow = true">筛选</view>
           </view>
 
           <chart :currentDateList="currentDateList"></chart>
@@ -82,7 +82,7 @@
             "
             :activeColor="proxy.$settingStore.themeColor.color"
           >
-            <u-checkbox class="margin-b-10" v-for="option in checkboxDataList" :key="option" :label="option.attributeName" :name="option.attributeCode"> </u-checkbox>
+            <u-checkbox class="mb10" v-for="option in checkboxDataList" :key="option" :label="option.attributeName" :name="option.attributeCode"> </u-checkbox>
           </u-checkbox-group>
         </view>
       </u-modal>

+ 4 - 3
src/pages/business/fireIot/deviceManage/components/deviceDetailsList.vue

@@ -14,8 +14,9 @@
   >
     <template #default>
       <view class="deviceDetailsList-container">
-        <view class="flex bg-white padding-10" style="position: relative">
+        <view class="flex bg-white p10" style="position: relative">
           <u--input
+            style="width: 100%"
             v-model="deviceName"
             placeholder="请输入设备名称"
             prefixIcon="search"
@@ -24,7 +25,7 @@
             @confirm="dmpDeviceInfoApi()"
             clearable
           ></u--input>
-          <view class="margin-l-10" style="margin-top: auto; margin-bottom: auto" @click="dropdownShow = !dropdownShow">筛选</view>
+          <view class="ml10" style="margin-top: auto; margin-bottom: auto; white-space: nowrap" @click="dropdownShow = !dropdownShow">筛选</view>
         </view>
 
         <oa-dropdown :dropdownShow="dropdownShow" :closeOnClickOverlay="true" @close="dropdownShow = false">
@@ -188,7 +189,7 @@ onLoad((options) => {
     white-space: nowrap;
 
     .deviceName {
-      min-width: 70%;
+      width: 75%;
       color: #000;
     }
 

+ 2 - 2
src/pages/business/fireIot/deviceManage/index.vue

@@ -18,8 +18,8 @@
         <u-grid :border="true">
           <u-grid-item v-for="(base, index) in dataList" :key="index" @click="handleToDevice(base.id, base.productName)">
             <u-badge type="primary" max="9999" :value="base.deviceCount" :showZero="true" :absolute="true" :offset="[10, 10, 0, 0]"></u-badge>
-            <image class="margin-b-15" style="width: 40px; height: 40px; margin-top: 35px" :src="base.typeImg" mode="aspectFill"></image>
-            <text class="margin-b-15 grid-text text-ellipsis">{{ base.productName }}</text>
+            <image class="mb15" style="width: 40px; height: 40px; margin-top: 35px" :src="base.typeImg" mode="aspectFill"></image>
+            <view class="mb15 text-ellipsis" style="width: 100%; text-align: center">{{ base.productName }}</view>
           </u-grid-item>
         </u-grid>
       </view>

+ 103 - 102
src/pages/business/fireIot/facilitiesGather/index.vue

@@ -1,116 +1,117 @@
 <template>
-  <scroll-view class="scroll-height" :scroll-y="true" :data-theme="'theme-' + proxy.$settingStore.themeColor.name">
-    <view id="facilitiesGather">
-      <view class="centerOne">
-        <!-- <view class="title"> </view> -->
-
-        <u--form :model="form" ref="uForm" :rules="rules" labelWidth="90">
-          <view>
-            <view style="padding: 10px 10px 20px 10px; background: #ffffff">
-              <view style="padding-left: 9px">
-                <u-form-item label="所属部门" prop="department" :borderBottom="true" @click="handleAction('所属部门')" required>
-                  <u-input v-model="form.department" placeholder="请选择所属部门" suffixIcon="arrow-right" suffixIconStyle="color: #909399" border="none" disabledColor="transparent" disabled />
-                </u-form-item>
-                <u-form-item label="设施类型" prop="facilityTypeName" :borderBottom="true" @click="handleAction('设施类型')" required>
-                  <u-input v-model="form.facilityTypeName" placeholder="请选择设施类型" suffixIcon="arrow-right" suffixIconStyle="color: #909399" border="none" disabledColor="transparent" disabled />
-                </u-form-item>
-                <u-form-item label="设施名称" prop="facilityName" :borderBottom="true" required>
-                  <u-input v-model="form.facilityName" placeholder="请输入设施名称" border="none" />
-                </u-form-item>
-                <u-form-item label="状态" prop="status" :borderBottom="true" required>
-                  <u-radio-group v-model="form.status" placement="row">
-                    <u-radio v-for="se in sexList" :key="se" :activeColor="proxy.$settingStore.themeColor.color" :label="se.text" :name="se.value" style="margin-right: 15px"></u-radio>
-                  </u-radio-group>
-                </u-form-item>
-                <u-form-item label="设施地址" prop="address" :borderBottom="true" required>
-                  <u-input v-model="form.address" placeholder="请选择设施地址" border="none" disabledColor="transparent" disabled @click="handleAction('设施地址')">
-                    <template #suffix>
-                      <view class="iconfont ucicon-map menu-icon" style="font-size: 18px; color: #909399"> </view>
-                    </template>
-                  </u-input>
-                </u-form-item>
-                <u-form-item label="行政区划" prop="facilityAddress" :borderBottom="true" required>
-                  <view style="width: 100%">
-                    <view style="font-size: 15px"> {{ form.address ? form.address.split(form.facilityAddress)[0] : "" }}</view>
-                    <u-input v-model="form.facilityAddress" placeholder="请输入详细地址" border="none" />
-                  </view>
-                </u-form-item>
-                <u-form-item v-if="form.typeGuise && form.typeGuise != 1" label="类型" prop="gpsAreas" :borderBottom="true" @click="handleAction('类型')" required>
-                  <view style="font-size: 15px">{{ form.typeGuise == 1 ? "点" : form.typeGuise == 2 ? "线" : form.typeGuise == 3 ? "面" : "" }}</view>
-                  <view v-if="form.gpsAreas.length <= 0" style="font-size: 15px; margin: auto; color: #ff0000">未编辑</view>
-                  <view v-if="form.gpsAreas.length > 0" style="font-size: 15px; margin: auto; color: #30bb00">已编辑</view>
-                  <view class="iconfont ucicon-bianji1 menu-icon" style="font-size: 14px; color: #909399"> </view>
-                </u-form-item>
-                <u-form-item label="联系人" prop="contact" :borderBottom="true">
-                  <u-input v-model="form.contact" placeholder="请输入联系人" border="none" />
-                </u-form-item>
-                <u-form-item label="联系电话" prop="contactPhone" :borderBottom="true">
-                  <u-input v-model="form.contactPhone" placeholder="请输入联系电话" border="none" maxlength="11" />
-                </u-form-item>
-                <u-form-item label="设备图片" prop="imagesUrl" :borderBottom="true">
-                  <oa-upload :uploadCount="1" :uploadImage="form.imagesUrl" @uploadSuccessChange="uploadSuccessChange" @uploadDeleteChange="uploadDeleteChange"></oa-upload>
-                </u-form-item>
-                <u-form-item label="备注" prop="facilityDesc" :borderBottom="true">
-                  <u-textarea v-model="form.facilityDesc" placeholder="请输入" border="none" maxlength="30" style="padding: 0px"></u-textarea>
-                </u-form-item>
-
-                <u-form-item v-for="(fo, index) in form.extendData" :key="index" :label="fo.name" :prop="fo.key" :borderBottom="true">
-                  <u-input v-if="fo.type === 'SRK'" v-model="fo.value" :placeholder="'请输入' + fo.name" border="none" disabledColor="transparent" />
-
-                  <u-radio-group v-if="fo.type === 'DXK'" v-model="fo.value" placement="row">
-                    <u-radio
-                      v-for="se in fo.list"
-                      :key="se"
-                      :activeColor="proxy.$settingStore.themeColor.color"
-                      :label="se.attributeValue"
-                      :name="se.attributeCode"
-                      style="margin-right: 15px"
-                    ></u-radio>
-                  </u-radio-group>
-
-                  <u-input
-                    v-if="fo.type === 'XLK'"
-                    v-model="fo.valueName"
-                    :placeholder="'请选择' + fo.name"
-                    suffixIcon="arrow-right"
-                    suffixIconStyle="color: #909399"
-                    border="none"
-                    disabledColor="transparent"
-                    disabled
-                    @click="handleAction('属性', fo)"
-                  />
-                </u-form-item>
-              </view>
+  <oa-scroll
+    id="facilitiesGather"
+    customClass="scroll-height"
+    :customStyle="{}"
+    :refresherLoad="false"
+    :refresherEnabled="false"
+    :refresherDefaultStyle="'none'"
+    :refresherThreshold="44"
+    :refresherBackground="'#f5f6f7'"
+    :data-theme="'theme-' + proxy.$settingStore.themeColor.name"
+  >
+    <view class="centerOne">
+      <!-- <view class="title"> </view> -->
+
+      <u--form :model="form" ref="uForm" :rules="rules" labelWidth="90">
+        <view>
+          <view style="padding: 10px 10px 20px 10px; background: #ffffff">
+            <view style="padding-left: 9px">
+              <u-form-item label="所属部门" prop="department" :borderBottom="true" @click="handleAction('所属部门')" required>
+                <u-input v-model="form.department" placeholder="请选择所属部门" suffixIcon="arrow-right" suffixIconStyle="color: #909399" border="none" disabledColor="transparent" disabled />
+              </u-form-item>
+              <u-form-item label="设施类型" prop="facilityTypeName" :borderBottom="true" @click="handleAction('设施类型')" required>
+                <u-input v-model="form.facilityTypeName" placeholder="请选择设施类型" suffixIcon="arrow-right" suffixIconStyle="color: #909399" border="none" disabledColor="transparent" disabled />
+              </u-form-item>
+              <u-form-item label="设施名称" prop="facilityName" :borderBottom="true" required>
+                <u-input v-model="form.facilityName" placeholder="请输入设施名称" border="none" />
+              </u-form-item>
+              <u-form-item label="状态" prop="status" :borderBottom="true" required>
+                <u-radio-group v-model="form.status" placement="row">
+                  <u-radio v-for="se in sexList" :key="se" :activeColor="proxy.$settingStore.themeColor.color" :label="se.text" :name="se.value" style="margin-right: 15px"></u-radio>
+                </u-radio-group>
+              </u-form-item>
+              <u-form-item label="设施地址" prop="address" :borderBottom="true" required>
+                <u-input v-model="form.address" placeholder="请选择设施地址" border="none" disabledColor="transparent" disabled @click="handleAction('设施地址')">
+                  <template #suffix>
+                    <view class="iconfont ucicon-map menu-icon" style="font-size: 18px; color: #909399"> </view>
+                  </template>
+                </u-input>
+              </u-form-item>
+              <u-form-item label="行政区划" prop="facilityAddress" :borderBottom="true" required>
+                <view style="width: 100%">
+                  <view style="font-size: 15px"> {{ form.address ? form.address.split(form.facilityAddress)[0] : "" }}</view>
+                  <u-input v-model="form.facilityAddress" placeholder="请输入详细地址" border="none" />
+                </view>
+              </u-form-item>
+              <u-form-item v-if="form.typeGuise && form.typeGuise != 1" label="类型" prop="gpsAreas" :borderBottom="true" @click="handleAction('类型')" required>
+                <view style="font-size: 15px">{{ form.typeGuise == 1 ? "点" : form.typeGuise == 2 ? "线" : form.typeGuise == 3 ? "面" : "" }}</view>
+                <view v-if="form.gpsAreas.length <= 0" style="font-size: 15px; margin: auto; color: #ff0000">未编辑</view>
+                <view v-if="form.gpsAreas.length > 0" style="font-size: 15px; margin: auto; color: #30bb00">已编辑</view>
+                <view class="iconfont ucicon-bianji1 menu-icon" style="font-size: 14px; color: #909399"> </view>
+              </u-form-item>
+              <u-form-item label="联系人" prop="contact" :borderBottom="true">
+                <u-input v-model="form.contact" placeholder="请输入联系人" border="none" />
+              </u-form-item>
+              <u-form-item label="联系电话" prop="contactPhone" :borderBottom="true">
+                <u-input v-model="form.contactPhone" placeholder="请输入联系电话" border="none" maxlength="11" />
+              </u-form-item>
+              <u-form-item label="设备图片" prop="imagesUrl" :borderBottom="true">
+                <oa-upload :uploadCount="1" :uploadImage="form.imagesUrl" @uploadSuccessChange="uploadSuccessChange" @uploadDeleteChange="uploadDeleteChange"></oa-upload>
+              </u-form-item>
+              <u-form-item label="备注" prop="facilityDesc" :borderBottom="true">
+                <u-textarea v-model="form.facilityDesc" placeholder="请输入" border="none" maxlength="30" style="padding: 0px"></u-textarea>
+              </u-form-item>
+
+              <u-form-item v-for="(fo, index) in form.extendData" :key="index" :label="fo.name" :prop="fo.key" :borderBottom="true">
+                <u-input v-if="fo.type === 'SRK'" v-model="fo.value" :placeholder="'请输入' + fo.name" border="none" disabledColor="transparent" />
+
+                <u-radio-group v-if="fo.type === 'DXK'" v-model="fo.value" placement="row">
+                  <u-radio v-for="se in fo.list" :key="se" :activeColor="proxy.$settingStore.themeColor.color" :label="se.attributeValue" :name="se.attributeCode" style="margin-right: 15px"></u-radio>
+                </u-radio-group>
+
+                <u-input
+                  v-if="fo.type === 'XLK'"
+                  v-model="fo.valueName"
+                  :placeholder="'请选择' + fo.name"
+                  suffixIcon="arrow-right"
+                  suffixIconStyle="color: #909399"
+                  border="none"
+                  disabledColor="transparent"
+                  disabled
+                  @click="handleAction('属性', fo)"
+                />
+              </u-form-item>
             </view>
           </view>
-        </u--form>
-
-        <view class="app-padding-bottom"> </view>
+        </view>
+      </u--form>
 
+      <view class="app-button">
+        <view class="app-button-padding"></view>
         <view class="app-button-fixed">
           <view class="app-flex">
             <u-button class="app-buttom" style="margin-right: 15px" @click="handleSubmit('取消')" shape="circle"> 取消 </u-button>
-
             <u-button class="app-buttom" type="primary" @click="handleSubmit('提交')" shape="circle"> 提交 </u-button>
           </view>
         </view>
       </view>
-
-      <u-picker
-        :show="actionShow"
-        :columns="actionsList"
-        :title="'请选择' + actionTitle"
-        keyName="name"
-        visibleItemCount="6"
-        :defaultIndex="[actionDefaultIndex]"
-        :closeOnClickOverlay="true"
-        @close="actionShow = false"
-        @cancel="actionShow = false"
-        @confirm="selectAction"
-        @change="changeHandler"
-      ></u-picker>
     </view>
-  </scroll-view>
+
+    <u-picker
+      :show="actionShow"
+      :columns="actionsList"
+      :title="'请选择' + actionTitle"
+      keyName="name"
+      visibleItemCount="6"
+      :defaultIndex="[actionDefaultIndex]"
+      :closeOnClickOverlay="true"
+      @close="actionShow = false"
+      @cancel="actionShow = false"
+      @confirm="selectAction"
+      @change="changeHandler"
+    ></u-picker>
+  </oa-scroll>
 </template>
 
 <script setup>
@@ -381,7 +382,7 @@ function handleSubmit(type) {
 
         add(param).then((requset) => {
           if (requset.status === "SUCCESS") {
-            proxy.$tab.navigateTo(`/pages/common/success/index?showNow=${false}`);
+            proxy.$tab.reLaunch(`/pages/common/success/index?codeName=提交成功&showNow=${false}`);
           }
         });
       })

+ 7 - 7
src/pages/business/fireIot/facilitiesManage/facilitiesDetails.vue

@@ -1,7 +1,7 @@
 <template>
   <scroll-view class="scroll-height" :scroll-y="true" :data-theme="'theme-' + proxy.$settingStore.themeColor.name">
     <view class="facilitiesDetails-container">
-      <view class="flex bg-white padding-15 margin-b-15">
+      <view class="flex bg-white p15 mb15">
         <image style="width: 40px; height: 40px; margin: auto 15px auto 0" :src="dataArray.imagesUrl ? dataArray.imagesUrl : '/static/images/404.png'" mode="aspectFill"></image>
 
         <view style="margin: auto auto auto 0">
@@ -17,8 +17,8 @@
         </view>
       </view>
 
-      <view class="bg-white padding-15 margin-b-15">
-        <uni-section class="block margin-b-10" title="基本信息" type="line"></uni-section>
+      <view class="bg-white p15 mb15">
+        <uni-section class="block mb10" title="基本信息" type="line"></uni-section>
 
         <view class="tableType3 padding-0">
           <u-empty v-if="dataList.length <= 0" text="暂无数据" mode="data" icon="http://cdn.uviewui.com/uview/empty/data.png"> </u-empty>
@@ -34,8 +34,8 @@
         </view>
       </view>
 
-      <view class="bg-white padding-15 margin-b-15">
-        <uni-section class="block margin-b-10" title="关联设备" type="line"></uni-section>
+      <view class="bg-white p15 mb15">
+        <uni-section class="block mb10" title="关联设备" type="line"></uni-section>
 
         <view class="flex margin-bottom-sm" style="height: 35px; line-height: 35px">
           <u-input v-model="deviceId" placeholder="设备编号" @change="deviceInfoApi()" disabledColor="transparent" prefixIcon="search" prefixIconStyle="font-size: 22px;color: #909399" clearable />
@@ -73,8 +73,8 @@
         </view>
       </view>
 
-      <view class="bg-white padding-15 margin-b-15">
-        <uni-section class="block margin-b-10" title="关联建筑" type="line"></uni-section>
+      <view class="bg-white p15 mb15">
+        <uni-section class="block mb10" title="关联建筑" type="line"></uni-section>
 
         <view class="flex margin-bottom-sm" style="height: 35px; line-height: 35px">
           <u-input v-model="buildNum" placeholder="建筑编号" @change="buildInfoApi()" disabledColor="transparent" prefixIcon="search" prefixIconStyle="font-size: 22px;color: #909399" clearable />

+ 3 - 2
src/pages/business/fireIot/facilitiesManage/facilitiesDetailsList.vue

@@ -14,8 +14,9 @@
   >
     <template #default>
       <view class="facilitiesDetailsList-container">
-        <view class="flex bg-white padding-10" style="position: relative">
+        <view class="flex bg-white p10" style="position: relative">
           <u--input
+            style="width: 100%"
             v-model="facilityName"
             placeholder="请输入设施名称"
             prefixIcon="search"
@@ -24,7 +25,7 @@
             @confirm="init()"
             clearable
           ></u--input>
-          <view class="margin-l-10" style="margin-top: auto; margin-bottom: auto" @click="init()">筛选</view>
+          <view class="ml10" style="margin-top: auto; margin-bottom: auto; white-space: nowrap" @click="init()">筛选</view>
         </view>
 
         <view class="menu-list margin-0">

+ 1 - 1
src/pages/business/fireIot/facilitiesManage/index.vue

@@ -43,7 +43,7 @@
     </template>
   </oa-scroll>
 
-  <view style="position: fixed; right: 0; bottom: 50px">
+  <view class="app-scan-fixed">
     <u-image width="67" height="67" src="@/static/images/add.png" shape="circle" @tap="handleToPage()"></u-image>
   </view>
 </template>

+ 1 - 2
src/pages/business/mhxf/deviceManage/index.vue

@@ -17,7 +17,7 @@
         <uni-swipe-action>
           <uni-swipe-action-item class="bg-white">
             <view class="content">
-              <view class="block padding-10">
+              <view class="block p10">
                 <u-input v-model="dataInput" placeholder="请输入设备编号" @blur="blur" shape="circle" prefixIcon="search" prefixIconStyle="color: #0c7bf9"> </u-input>
               </view>
 
@@ -116,7 +116,6 @@ const list = ref([
  */
 function tabsClick(e) {
   current.value = e.index;
-  // alert(current.value)
   dataInput.value = "";
 }
 

+ 8 - 8
src/pages/business/mhxf/fireReport/components/detailed.vue

@@ -7,7 +7,7 @@
       </view>
 
       <view class="content1">
-        <uni-section class="block margin-b-10" title="消防安全风险提示" type="line" titleFontSize="15px"> </uni-section>
+        <uni-section class="block mb10" title="消防安全风险提示" type="line" titleFontSize="15px"> </uni-section>
         <view class="price1">
           <view>
             上海XX公司:
@@ -54,7 +54,7 @@
       </view>
 
       <view class="content2">
-        <uni-section class="block margin-b-10" title="基本情况" type="line" titleFontSize="15px"></uni-section>
+        <uni-section class="block mb10" title="基本情况" type="line" titleFontSize="15px"></uni-section>
         <view class="tableType2 price2">
           <u-row>
             <u-col span="3">
@@ -77,7 +77,7 @@
       </view>
 
       <view class="content2">
-        <uni-section class="block margin-b-10" title="存在问题" type="line" titleFontSize="15px">
+        <uni-section class="block mb10" title="存在问题" type="line" titleFontSize="15px">
           <template v-slot:right>
             <view style="color: #666666; font-size: 14px">整改期限:2023-02-02</view>
           </template>
@@ -109,7 +109,7 @@
       </view>
 
       <view class="content2">
-        <uni-section class="block margin-b-10" title="整体指数分析" type="line" titleFontSize="15px"> </uni-section>
+        <uni-section class="block mb10" title="整体指数分析" type="line" titleFontSize="15px"> </uni-section>
         <view class="tableType1 price2">
           <u-row>
             <u-col span="4">
@@ -153,14 +153,14 @@
       </view>
 
       <view class="content2">
-        <uni-section class="block margin-b-10" title="整体指数分析" type="line" titleFontSize="15px"> </uni-section>
+        <uni-section class="block mb10" title="整体指数分析" type="line" titleFontSize="15px"> </uni-section>
         <view>
           <line-echarts :xAxisDataList="['1月', '2月', '3月', '4月', '5月', '6月']" :seriesDataList="[50, 20, 30, 10, 80, 80]"></line-echarts>
         </view>
       </view>
 
       <view class="content2">
-        <uni-section class="block margin-b-10" title="设备设施状况" type="line" titleFontSize="15px"> </uni-section>
+        <uni-section class="block mb10" title="设备设施状况" type="line" titleFontSize="15px"> </uni-section>
         <view>
           <view style="color: #666666; text-align: center; font-size: 14px">近一周设备在线率</view>
           <line-echarts :xAxisDataList="['周一', '周二', '周三', '周四', '周五', '周六', '周日']" :seriesDataList="[50, 20, 30, 10, 80, 80, 20]"></line-echarts>
@@ -224,7 +224,7 @@
       </view>
 
       <view class="content2">
-        <uni-section class="block margin-b-10" title="监督执法情况" type="line" titleFontSize="15px"> </uni-section>
+        <uni-section class="block mb10" title="监督执法情况" type="line" titleFontSize="15px"> </uni-section>
 
         <view class="tableType2 price2">
           <u-row>
@@ -322,7 +322,7 @@
       </view>
 
       <view class="content2">
-        <uni-section class="block margin-b-10" title="火灾情况分析" type="line" titleFontSize="15px"> </uni-section>
+        <uni-section class="block mb10" title="火灾情况分析" type="line" titleFontSize="15px"> </uni-section>
 
         <view class="tableType2 price2">
           <u-row>

+ 1 - 1
src/pages/business/mhxf/informationSelect/index.vue

@@ -10,7 +10,7 @@
           <uni-swipe-action-item>
             <!-- 各类查询 start -->
             <view class="tableType3">
-              <u-input class="block margin-b-10" v-model="dataInput" :placeholder="placeholderText" @blur="blur" shape="circle" prefixIcon="search" prefixIconStyle="color: #0c7bf9"> </u-input>
+              <u-input class="block mb10" v-model="dataInput" :placeholder="placeholderText" @blur="blur" shape="circle" prefixIcon="search" prefixIconStyle="color: #0c7bf9"> </u-input>
               <u-empty v-if="!dataRes" text="暂无数据" mode="data" icon="http://cdn.uviewui.com/uview/empty/data.png"> </u-empty>
               <view v-if="current == 8">
                 <view class="con">

+ 3 - 3
src/pages/business/mhxf/needMatter/index.vue

@@ -170,10 +170,10 @@
               @confirm="handleConfirm"
             >
               <view style="width: 100%">
-                <uni-section class="block margin-b-10" title="图片上传:" type="line">
+                <uni-section class="block mb10" title="图片上传:" type="line">
                   <u-upload :fileList="fileList" name="6" @afterRead="afterRead" multiple :maxCount="5" width="80" height="80"> </u-upload>
                 </uni-section>
-                <uni-section class="block margin-b-10" title="备注:" type="line">
+                <uni-section class="block mb10" title="备注:" type="line">
                   <u--textarea v-model="textValue" placeholder="请输入内容"></u--textarea>
                 </uni-section>
               </view>
@@ -266,7 +266,7 @@ function handleConfirm() {
 
   let params = {
     reformId: arrayList.value.reformId, //整改单编号
-    reformPerson: useStore.$state.name, //整改提交人
+    reformPerson: useStore.$state.nickName, //整改提交人
     reformRemark: textValue.value, //整改备注
     reformPath1: "", //整改相关图片或文件路径1
     reformPath2: "", //整改相关图片或文件路径2

+ 0 - 904
src/pages/business/mhxf/unitInfoCollection/index copy.vue

@@ -1,904 +0,0 @@
-<template>
-  <view id="unitInfoCollection" v-if="!successBool">
-    <view>
-      <u-notice-bar :text="noticeBarText" :duration="7000" color="#FF0000" bgColor="#FFFFFF"></u-notice-bar>
-    </view>
-
-    <view class="centerOne" v-if="pagingBool">
-      <view class="title"> 单位基本信息(1/2) </view>
-
-      <u--form :model="form" ref="uForm" :rules="rules" labelWidth="130">
-        <view style="padding: 10px 0">
-          <view style="padding: 10px 10px 20px 10px; background: #ffffff">
-            <view style="padding-left: 9px">
-              <u-form-item label="单位名称" prop="companyName" required :borderBottom="true">
-                <u-input v-model="form.companyName" placeholder="请输入单位名称" border="none">
-                  <template #suffix>
-                    <u-icon name="search" color="#999999" size="22" @click="companySubmit(form.companyName)"></u-icon>
-                  </template>
-                </u-input>
-              </u-form-item>
-              <u-form-item label="统一社会信用代码" prop="organization" required :borderBottom="true">
-                <u-input v-model="form.organization" placeholder="请输入统一社会信用代码" border="none" maxlength="18" />
-              </u-form-item>
-              <u-form-item label="法人代表" prop="delegateName" required :borderBottom="true">
-                <u-input v-model="form.delegateName" placeholder="请输入法人代表" border="none" />
-              </u-form-item>
-              <u-form-item label="所属街镇" prop="streetTown" required :borderBottom="true" @click="handleAction('所属街镇')">
-                <u-input v-model="form.streetTown" placeholder="请选择所属街镇" suffixIcon="arrow-right" suffixIconStyle="color: #909399" border="none" disabledColor="transparent" disabled />
-              </u-form-item>
-              <u-form-item label="单位地址" prop="address" required :borderBottom="true">
-                <u-input v-model="form.address" placeholder="请输入单位地址" border="none" />
-              </u-form-item>
-              <u-form-item label="消防管理人电话" prop="fireManagePhone" required :borderBottom="true">
-                <u-input v-model="form.fireManagePhone" placeholder="请输入消防管理人电话" border="none" maxlength="11" />
-              </u-form-item>
-              <u-form-item label="成立时间" prop="foundTime" required :borderBottom="true" @click="handleDateTime('成立时间', 0, form.foundTime)">
-                <u-input v-model="form.foundTime" placeholder="请选择成立时间" border="none" suffixIcon="calendar" suffixIconStyle="color: #909399;font-size:22px" />
-              </u-form-item>
-              <u-form-item label="消防安全责任人" prop="fireDutyName" :borderBottom="true">
-                <u-input v-model="form.fireDutyName" placeholder="请输入消防安全责任人" border="none" />
-              </u-form-item>
-              <u-form-item label="消防安全管理人" prop="fireManageName" :borderBottom="true">
-                <u-input v-model="form.fireManageName" placeholder="请输入消防安全管理人" border="none" />
-              </u-form-item>
-              <u-form-item label="职工人数" prop="employeeNum" :borderBottom="true">
-                <u-input type="digit" v-model="form.employeeNum" placeholder="请输入职工人数" suffixIcon="人" suffixIconStyle="color:#999999;font-size:15px" border="none" />
-              </u-form-item>
-              <u-form-item label="固定资产(万元)" prop="fixedAssets" :borderBottom="true">
-                <u-input type="number" v-model="form.fixedAssets" placeholder="请输入固定资产(万元)" suffixIcon="万元" suffixIconStyle="color:#999999;font-size:15px" border="none" />
-              </u-form-item>
-              <u-form-item label="单位性质" prop="companyNature" :borderBottom="true" @click="handleAction('单位性质')">
-                <u-input v-model="form.companyNature" placeholder="请选择单位性质" suffixIcon="arrow-right" suffixIconStyle="color: #909399" border="none" disabledColor="transparent" disabled />
-              </u-form-item>
-              <u-form-item label="单位建筑面积" prop="buildArea" :borderBottom="true">
-                <u-input type="number" v-model="form.buildArea" placeholder="请输入单位建筑面积" suffixIcon="平方米" suffixIconStyle="color:#999999;font-size:15px" border="none" />
-              </u-form-item>
-            </view>
-          </view>
-        </view>
-      </u--form>
-
-      <view style="padding-bottom: 70px"> </view>
-
-      <view style="position: fixed; left: 0; right: 0; bottom: 0; padding: 15px">
-        <view>
-          <u-button type="primary" style="width: 100%; height: 40px; font-size: 14px" @click="handleSubmit('下一步')" shape="circle"> 下一步 </u-button>
-        </view>
-      </view>
-    </view>
-
-    <view class="centerTwo" v-else>
-      <view class="title"> 所在建筑信息(2/2) </view>
-
-      <u--form ref="uForm1" :model="form" :rules="rules" labelWidth="130">
-        <view style="padding: 10px 0" v-for="(li, index) in form.baseBuildList" :key="index">
-          <view class="" style="padding: 10px 10px 20px 10px; background: #ffffff">
-            <view style="display: flex; overflow: hidden">
-              <image style="width: 15px; height: 15px; margin: auto 10px auto 0" src="@/static/images/unitInfoCollection/icon1.png" />
-              <view style="margin: auto auto auto 0">建筑{{ index + 1 }}</view>
-              <u-icon v-if="form.baseBuildList.length > 1" name="trash" color="#FF0000" size="20" style="float: right" @click="deleteSubmit(index)"></u-icon>
-            </view>
-            <view style="padding-left: 9px">
-              <u-form-item label="建筑名称" :prop="`baseBuildList.${index}.buildName`" required :borderBottom="true">
-                <u-input v-model="li.buildName" placeholder="请输入建筑名称" border="none" />
-              </u-form-item>
-              <u-form-item label="建筑地址" :prop="`baseBuildList.${index}.address`" required :borderBottom="true">
-                <u-input v-model="li.address" placeholder="请输入建筑地址" border="none" />
-              </u-form-item>
-              <u-form-item label="建筑结构" prop="li.buildStructure" required :borderBottom="true" @click="handleAction('建筑结构', index)">
-                <u-input v-model="li.buildStructure" placeholder="请选择建筑结构" border="none" suffixIcon="arrow-right" suffixIconStyle="color: #909399" disabledColor="transparent" disabled />
-              </u-form-item>
-              <u-form-item label="地上层数" prop="li.aboveFloor" required :borderBottom="true">
-                <u-input v-model="li.aboveFloor" placeholder="请输入地上层数" border="none" />
-              </u-form-item>
-              <u-form-item label="地下层数" prop="li.underFloor" :borderBottom="true">
-                <u-input v-model="li.underFloor" placeholder="请输入地下层数" border="none" />
-              </u-form-item>
-              <u-form-item label="建筑面积" prop="li.buildArea" required :borderBottom="true">
-                <u-input v-model="li.buildArea" placeholder="请输入建筑面积" suffixIcon="平方米" suffixIconStyle="color:#999999;font-size:15px" border="none" />
-              </u-form-item>
-              <u-form-item label="地下空间" prop="li.underSpace" :borderBottom="true">
-                <u-input v-model="li.underSpace" placeholder="请输入地下空间面积" suffixIcon="平方米" suffixIconStyle="color:#999999;font-size:15px" border="none" />
-              </u-form-item>
-              <u-form-item label="使用性质" prop="li.useCharacter" required :borderBottom="true" @click="handleAction('使用性质', index)">
-                <u-input v-model="li.useCharacter" placeholder="请选择使用性质" suffixIcon="arrow-right" suffixIconStyle="color: #909399" border="none" disabledColor="transparent" disabled />
-              </u-form-item>
-              <u-form-item label="建成年份" prop="li.completeYear" required :borderBottom="true" @click="handleDateTime('建成年份', index, li.completeYear)">
-                <u-input v-model="li.completeYear" placeholder="请选择建成年份" suffixIcon="calendar" suffixIconStyle="color: #909399;font-size:22px" border="none" />
-              </u-form-item>
-              <u-form-item label="建筑高度" prop="li.buildHigh" required :borderBottom="true">
-                <u-input v-model="li.buildHigh" placeholder="请输入建筑高度" suffixIcon="米" suffixIconStyle="color: #909399;font-size:15px" border="none" />
-              </u-form-item>
-            </view>
-          </view>
-        </view>
-      </u--form>
-
-      <view style="padding-bottom: 70px">
-        <u-button type="primary" style="width: 25%; height: 25px; margin-top: 10px" @click="addSubmit" shape="circle" icon="plus" size="mini"> 添加建筑 </u-button>
-      </view>
-
-      <view style="position: fixed; left: 0; right: 0; bottom: 0; padding: 15px; background-color: transparent">
-        <view style="display: flex">
-          <u-button style="width: 50%; height: 40px; font-size: 14px; margin-right: 15px" @click="handleSubmit('上一步')" shape="circle" customStyle="border-color:#3c9cff;color:#3c9cff">
-            上一步
-          </u-button>
-
-          <u-button type="primary" style="width: 50%; height: 40px; font-size: 14px" @click="handleSubmit('提交')" shape="circle"> 提交 </u-button>
-        </view>
-      </view>
-    </view>
-
-    <u-picker
-      :show="actionShow"
-      :columns="actionsList"
-      :title="'请选择' + actionTitle"
-      keyName="name"
-      visibleItemCount="6"
-      :defaultIndex="[actionIndex]"
-      :closeOnClickOverlay="true"
-      @close="actionShow = false"
-      @cancel="actionShow = false"
-      @confirm="selectAction"
-    ></u-picker>
-
-    <u-datetime-picker
-      :show="showTime"
-      v-model="timeValue"
-      mode="date"
-      @close="showTime = false"
-      @cancel="showTime = false"
-      @confirm="timeSubmit"
-      :closeOnClickOverlay="true"
-      :minDate="Number(new Date('1900'))"
-      :maxDate="Number(new Date())"
-    ></u-datetime-picker>
-
-    <u-modal
-      :show="modalShow"
-      title="系统提示"
-      confirmText="修改"
-      cancelText="新增"
-      :showCancelButton="true"
-      cancelColor="#2979ff"
-      @confirm="handleSubmitApi('是')"
-      @cancel="handleSubmitApi('否')"
-      :closeOnClickOverlay="true"
-      @close="modalShow = false"
-    >
-      <view class="slot-content">
-        <view style="text-align: center; margin-bottom: 10px">是否修改单位名称为“{{ newCompanyName }}”的信息?</view>
-        <view style="text-align: center; font-size: 13px; color: #ff0000">注:“修改”则点击修改,“新增”将提交一条新的记录,如需“取消”操作可点击空白区域</view>
-      </view>
-    </u-modal>
-  </view>
-
-  <view v-else>
-    <view style="display: flex">
-      <image style="width: 120px; height: 120px; margin: 50px auto 20px auto" src="@/static/images/unitInfoCollection/success.png" />
-    </view>
-    <view style="text-align: center; font-weight: 600">提交成功</view>
-  </view>
-</template>
-
-<script setup>
-import { onLoad, onShow, onHide, onLaunch, onReady } from "@dcloudio/uni-app";
-import { ref, onMounted, inject, shallowRef, reactive, toRefs, getCurrentInstance } from "vue";
-import { publicStores, useStores } from "@/store/modules/index";
-import { getToken } from "@/utils/auth";
-
-import { companyByNameSelect, addBaseCompany, delBaseBuild } from "@/api/business/mhxf/unitInfoCollection";
-
-const { proxy } = getCurrentInstance();
-
-const publicStore = publicStores();
-
-const dataList = reactive({
-  form: {
-    companyName: "", //单位名称
-    organization: "", //信用代码
-    delegateName: "", //法人代表姓名
-    streetTown: "", //所属街镇
-    streetTownValue: 0, //所属街镇
-    address: "", //详细地址
-    fireManagePhone: "", //消防安全管理人电话
-    foundTime: "", //单位成立时间
-    fireDutyName: "", //消防安全责任人姓名
-    fireManageName: "", //消防安全管理人姓名
-    employeeNum: "", //职工人数
-    fixedAssets: "", //固定资产(单位:万元)
-    companyNature: "", //单位性质
-    companyNatureValue: 0, //单位性质
-    buildArea: "", //建筑面积
-
-    baseBuildList: [],
-  },
-
-  baseBuildListForm: {
-    buildName: "", //建筑名称
-    address: "", //详细地址
-    buildStructure: "", //建筑结构
-    buildStructureValue: 0, //建筑结构
-    aboveFloor: "", //地上楼层
-    underFloor: "", //地下楼层
-    buildArea: "", //建筑面积
-    underSpace: "", //地下空间
-    useCharacter: "", //使用性质
-    useCharacterValue: 0,
-    completeYear: "", //竣工年份
-    buildHigh: "", //建筑高度
-  },
-
-  rules: {
-    companyName: [
-      {
-        required: true,
-        message: "请输入单位名称",
-        trigger: ["blur", "change"],
-      },
-    ],
-    organization: [
-      {
-        required: true,
-        message: "请输入统一社会信用代码",
-        trigger: ["blur", "change"],
-      },
-      {
-        type: "string",
-        min: 18,
-        required: true,
-        message: "请输入18位统一社会信用代码",
-        trigger: ["change"],
-      },
-    ],
-    delegateName: [
-      {
-        required: true,
-        message: "请输入法人代表",
-        trigger: ["blur", "change"],
-      },
-    ],
-    streetTown: [
-      {
-        required: true,
-        message: "请选择所属街镇",
-        trigger: ["blur", "change"],
-      },
-    ],
-    address: [
-      {
-        required: true,
-        message: "请输入单位地址",
-        trigger: ["blur", "change"],
-      },
-    ],
-    fireManagePhone: [
-      {
-        required: true,
-        message: "请输入消防管理人电话",
-        trigger: ["blur", "change"],
-      },
-      {
-        type: "string",
-        min: 11,
-        required: true,
-        message: "请输入正确11位消防管理人电话",
-        pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/,
-        trigger: ["blur", "change"],
-      },
-    ],
-    foundTime: [
-      {
-        required: true,
-        message: "请选择成立时间",
-        trigger: ["blur", "change"],
-      },
-    ],
-
-    baseBuildList: [],
-  },
-
-  baseBuildListRules: {
-    buildName: [
-      {
-        required: true,
-        message: "请输入建筑名称",
-        trigger: ["blur", "change"],
-      },
-    ],
-
-    address: [
-      {
-        required: true,
-        message: "请输入建筑地址",
-        trigger: ["blur", "change"],
-      },
-    ],
-  },
-
-  noticeBarText: "注:信息提交后不可修改,提交前请核对填写是否有误",
-  pagingBool: true,
-
-  actionIndex: 0,
-  actionTitle: "",
-  actionShow: false,
-  actionsList: [[]],
-  showTime: false,
-  timeValue: Number(new Date()),
-  timeTitle: "",
-  timeIndex: 0,
-
-  modalShow: false,
-});
-
-const { form, baseBuildListForm, rules, baseBuildListRules, noticeBarText, pagingBool, actionTitle, actionIndex, actionsList, actionShow, showTime, timeValue, timeTitle, timeIndex, modalShow } =
-  toRefs(dataList);
-
-const uForm = ref(null);
-const uForm1 = ref(null);
-const newCompanyName = ref("");
-const successBool = ref(false);
-
-/**
- * @单位名称
- * @icon图标按钮点击事件
- */
-function companySubmit(e) {
-  actionsList.value = [[]];
-
-  companyByNameSelect({
-    companyName: e,
-  }).then((res) => {
-    if (res.status == "SUCCESS") {
-      if (res.data.length > 0) {
-        actionShow.value = true;
-        res.data.forEach((el) => {
-          el.name = el.companyName;
-          actionsList.value[0].push(el);
-        });
-        actionTitle.value = "单位名称";
-      } else {
-        proxy.$modal.msg("未匹配到您所输入的单位!");
-      }
-    }
-  });
-}
-
-/**
- * @上一步
- * @下一步
- * @提交
- * @按钮点击事件
- */
-function handleSubmit(value) {
-  if (value === "上一步") {
-    pagingBool.value = true;
-  } else if (value === "下一步") {
-    uForm.value
-      .validate()
-      .then((res) => {
-        uni.$u.toast("校验通过");
-        pagingBool.value = false;
-      })
-      .catch((errors) => {
-        uni.$u.toast("校验失败");
-      });
-  } else if (value === "提交") {
-    if (newCompanyName.value == "") {
-      handleSubmitApi("否");
-    } else {
-      modalShow.value = true;
-    }
-  }
-}
-
-/**
- * @api提交
- */
-function handleSubmitApi(value) {
-  console.log(form.value);
-
-  let param = {};
-
-  uForm1.value
-    .validate()
-    .then((res) => {
-      uni.$u.toast("校验通过");
-
-      param = {
-        baseCompany: {
-          companyName: form.value.companyName, //单位名称
-          organization: form.value.organization, //组织机构代码
-          address: form.value.address, //单位地址
-          foundTime: form.value.foundTime + "T00:00:00", //成立时间
-          companyNature: form.value.companyNature, //单位性质
-        },
-        baseCompanyAttach1: {
-          employeeNum: form.value.employeeNum, //职工人数
-          buildArea: form.value.buildArea, //建筑面积
-          fixedAssets: form.value.fixedAssets, //固定资产
-        },
-        baseCompanyPerson: {
-          delegateName: form.value.delegateName, //法人代表姓名
-          fireDutyName: form.value.fireDutyName, //消防安全责任人姓名
-          fireManageName: form.value.fireManageName, //消防安全管理人姓名
-          fireManagePhone: form.value.fireManagePhone, //消防安全管理人电话
-        },
-        baseBuildList: [],
-      };
-
-      if (value === "是") {
-        param.baseCompany.id = "id" in form.value ? form.value.id : undefined; //主键ID
-        param.baseCompany.companyId = "companyId" in form.value ? form.value.companyId : undefined; //单位ID
-
-        param.baseCompanyAttach1.id = "id1" in form.value ? form.value.id1 : undefined; //附表ID(id1)
-
-        param.baseCompanyPerson.id = "id2" in form.value ? form.value.id2 : undefined; //单位关联人员表ID(id2)
-      }
-
-      form.value.baseBuildList.forEach((el, ind) => {
-        param.baseBuildList.push({
-          buildName: el.buildName, //建筑名称
-          address: el.address, //详细地址
-          buildStructure: el.buildStructureValue, //建筑结构
-          aboveFloor: el.aboveFloor, //地上楼层
-          underFloor: el.underFloor, //地下楼层
-          buildArea: el.buildArea, //建筑面积
-          underSpace: el.underSpace, //地下空间
-          useCharacter: el.useCharacterValue, //使用性质
-          completeYear: el.completeYear, //竣工年份
-          buildHigh: el.buildHigh, //建筑高度
-        });
-
-        if (value === "是") {
-          if ("id" in el) {
-            param.baseBuildList[ind].id = el.id;
-          }
-        }
-      });
-
-      addBaseCompany(param).then((res) => {
-        if (res.status == "SUCCESS") {
-          if (getToken()) {
-            uni.showToast({
-              title: "提交成功",
-            });
-            setTimeout(() => {
-              proxy.$tab.reLaunch("/pages/index");
-            }, 2000);
-          } else {
-            successBool.value = true;
-          }
-        }
-      });
-    })
-    .catch((errors) => {
-      uni.$u.toast("校验失败");
-    });
-}
-
-/**
- * @action弹出框点击事件
- */
-function handleAction(value, index) {
-  actionShow.value = true;
-
-  if (value == "建筑结构") {
-    actionsList.value = [
-      [
-        {
-          value: 2,
-          name: "钢筋混凝土",
-        },
-        {
-          value: 1,
-          name: "砖混结构",
-        },
-        {
-          value: 3,
-          name: "钢结构",
-        },
-        {
-          value: 4,
-          name: "大型钢筋混凝土",
-        },
-        {
-          value: 5,
-          name: "木质结构",
-        },
-        {
-          value: 6,
-          name: "砖木结构",
-        },
-      ],
-    ];
-    actionTitle.value = "建筑结构";
-    actionIndex.value = index;
-  }
-
-  if (value == "使用性质") {
-    actionsList.value = [
-      [
-        {
-          value: 1,
-          name: "饭店、旅馆",
-        },
-        {
-          value: 2,
-          name: "公寓、住宅",
-        },
-        {
-          value: 3,
-          name: "体育场馆",
-        },
-        {
-          value: 4,
-          name: "俱乐部、夜总会、歌舞厅电影院、剧院、礼堂办公、商务科研 (包括实验室等)",
-        },
-        {
-          value: 5,
-          name: "医院",
-        },
-        {
-          value: 6,
-          name: "教学",
-        },
-        {
-          value: 7,
-          name: "商业 (包括商店、商场、集贸市场等)",
-        },
-        {
-          value: 8,
-          name: "金融",
-        },
-        {
-          value: 9,
-          name: "交通",
-        },
-
-        {
-          value: 10,
-          name: "文博馆(包括展览馆、博物馆、图书馆、档案馆、文化馆等)",
-        },
-        {
-          value: 11,
-          name: "通信枢纽、电视广播发射、中转",
-        },
-
-        {
-          value: 12,
-          name: "厂房",
-        },
-        {
-          value: 13,
-          name: "库房",
-        },
-        {
-          value: 14,
-          name: "油气罐站、管线",
-        },
-        {
-          value: 15,
-          name: "综台建筑",
-        },
-        {
-          value: 16,
-          name: "其他",
-        },
-      ],
-    ];
-    actionTitle.value = "使用性质";
-    actionIndex.value = index;
-  }
-
-  if (value == "单位性质") {
-    actionsList.value = [
-      [
-        {
-          value: 1,
-          name: "机关",
-        },
-        {
-          value: 2,
-          name: "团体",
-        },
-        {
-          value: 3,
-          name: "企业",
-        },
-        {
-          value: 4,
-          name: "事业",
-        },
-        {
-          value: 5,
-          name: "其他",
-        },
-      ],
-    ];
-    actionTitle.value = "单位性质";
-  }
-
-  if (value == "所属街镇") {
-    actionsList.value = [
-      [
-        {
-          name: "江川路街道",
-          value: 1201,
-          x: 121.399126538181,
-          y: 31.0099719391863,
-        },
-        {
-          name: "新虹街道",
-          value: 1217,
-          x: 121.319329296294,
-          y: 31.1983901916889,
-        },
-        {
-          name: "古美路街道",
-          value: 1206,
-          x: 121.388451866936,
-          y: 31.1478233480159,
-        },
-        {
-          name: "浦锦街道",
-          value: 1218,
-          x: 121.483929120352,
-          y: 31.089967318558,
-        },
-        {
-          name: "浦江镇",
-          value: 1215,
-          x: 121.524058543447,
-          y: 31.0540039472667,
-        },
-        {
-          name: "吴泾镇",
-          value: 1213,
-          x: 121.454076463728,
-          y: 31.04860402113,
-        },
-        {
-          name: "马桥镇",
-          value: 1214,
-          x: 121.352680027718,
-          y: 31.0213512298508,
-        },
-        {
-          name: "颛桥镇",
-          value: 1209,
-          x: 121.40607138504,
-          y: 31.0612972443508,
-        },
-        {
-          name: "莘庄镇",
-          value: 1207,
-          x: 121.37064864047,
-          y: 31.1154549548722,
-        },
-        {
-          name: "梅陇镇",
-          value: 1212,
-          x: 121.421346814491,
-          y: 31.1069718313722,
-        },
-        {
-          name: "七宝镇",
-          value: 1208,
-          x: 121.350366186317,
-          y: 31.1553292680362,
-        },
-        {
-          name: "虹桥镇",
-          value: 1211,
-          x: 121.37956256207,
-          y: 31.1806219953212,
-        },
-        {
-          name: "华漕镇",
-          value: 1210,
-          x: 121.277541517147,
-          y: 31.2289121171624,
-        },
-        {
-          name: "莘庄工业区",
-          value: 1216,
-          x: 121.376508452784,
-          y: 31.0678185611843,
-        },
-      ],
-    ];
-    actionTitle.value = "所属街镇";
-  }
-}
-
-/**
- * @action弹出框选择事件
- */
-function selectAction(e) {
-  if (actionTitle.value == "建筑结构") {
-    form.value.baseBuildList[actionIndex.value].buildStructure = e.value[0].name;
-    form.value.baseBuildList[actionIndex.value].buildStructureValue = e.value[0].value;
-  }
-
-  if (actionTitle.value == "使用性质") {
-    form.value.baseBuildList[actionIndex.value].useCharacter = e.value[0].name;
-    form.value.baseBuildList[actionIndex.value].useCharacterValue = e.value[0].value;
-  }
-
-  if (actionTitle.value == "单位性质") {
-    form.value.companyNature = e.value[0].name;
-    form.value.companyNatureValue = e.value[0].value;
-  }
-
-  if (actionTitle.value == "所属街镇") {
-    form.value.streetTown = e.value[0].name;
-    form.value.streetTownValue = e.value[0].value;
-  }
-
-  if (actionTitle.value == "单位名称") {
-    form.value.baseBuildList = [];
-
-    newCompanyName.value = e.value[0].companyName;
-    // form.value = e.value[0];
-    form.value.id = e.value[0].id;
-    form.value.id1 = e.value[0].id1;
-    form.value.id2 = e.value[0].id2;
-    form.value.companyId = e.value[0].companyId;
-
-    form.value.companyName = e.value[0].companyName;
-    form.value.organization = e.value[0].organization;
-    form.value.delegateName = e.value[0].delegateName;
-    form.value.address = e.value[0].address;
-    form.value.foundTime = e.value[0].foundTime.split("T")[0];
-
-    if (e.value[0].baseBuildList != null) {
-      form.value.baseBuildList = e.value[0].baseBuildList;
-    } else {
-      form.value.baseBuildList.push(baseBuildListForm.value);
-    }
-
-    form.value.baseBuildList.forEach((el) => {
-      el.buildStructureValue = el.buildStructure;
-
-      el.buildStructure =
-        el.buildStructure == 1
-          ? "砖混结构"
-          : el.buildStructure == 2
-          ? "钢筋混凝土"
-          : el.buildStructure == 3
-          ? "钢结构"
-          : el.buildStructure == 4
-          ? "大型钢筋混凝土"
-          : el.buildStructure == 5
-          ? "木质结构"
-          : el.buildStructure == 6
-          ? "砖木结构"
-          : "未知";
-
-      el.useCharacterValue = el.useCharacter;
-
-      el.useCharacter =
-        el.useCharacter == 1
-          ? "饭店、旅馆"
-          : el.useCharacter == 2
-          ? "公寓、住宅"
-          : el.useCharacter == 3
-          ? "体育场馆"
-          : el.useCharacter == 4
-          ? "俱乐部、夜总会、歌舞厅电影院、剧院、礼堂办公、商务科研 (包括实验室等)"
-          : el.useCharacter == 5
-          ? "医院"
-          : el.useCharacter == 6
-          ? "教学"
-          : el.useCharacter == 7
-          ? "商业 (包括商店、商场、集贸市场等)"
-          : el.useCharacter == 8
-          ? "金融"
-          : el.useCharacter == 9
-          ? "交通"
-          : el.useCharacter == 10
-          ? "文博馆(包括展览馆、博物馆、图书馆、档案馆、文化馆等)"
-          : el.useCharacter == 11
-          ? "通信枢纽、电视广播发射、中转"
-          : el.useCharacter == 12
-          ? "厂房"
-          : el.useCharacter == 13
-          ? "库房"
-          : el.useCharacter == 14
-          ? "油气罐站、管线"
-          : el.useCharacter == 15
-          ? "综台建筑"
-          : el.useCharacter == 16
-          ? "其他"
-          : "未知";
-    });
-  }
-
-  actionShow.value = false;
-}
-
-/**
- * @时间弹出框点击事件
- */
-function handleDateTime(value, index, time) {
-  showTime.value = true;
-  if (value == "成立时间") {
-    timeValue.value = time ? Number(new Date(time)) : Number(new Date());
-    timeIndex.value = index;
-    timeTitle.value = "成立时间";
-  } else if (value == "建成年份") {
-    timeValue.value = time ? Number(new Date(time)) : Number(new Date());
-    timeIndex.value = index;
-    timeTitle.value = "建成年份";
-  }
-}
-
-/**
- * @时间选择器
- * @确定按钮事件
- */
-function timeSubmit(data) {
-  let time = publicStore.formatterDateTime(data.value);
-  let timeData = time.split(" ")[0];
-  if (timeTitle.value == "成立时间") {
-    form.value.foundTime = timeData;
-  } else if (timeTitle.value == "建成年份") {
-    form.value.baseBuildList[timeIndex.value].completeYear = timeData;
-  }
-  showTime.value = false;
-}
-
-/**
- * @添加建筑
- * @按钮点击事件
- */
-function addSubmit() {
-  form.value.baseBuildList.push(baseBuildListForm.value);
-  rules.value.baseBuildList.push(baseBuildListRules.value);
-}
-
-/**
- * @删除建筑
- * @按钮点击事件
- */
-function deleteSubmit(index) {
-  if ("id" in form.value.baseBuildList[index]) {
-    delBaseBuild(form.value.baseBuildList[index].id).then((res) => {
-      if (res.status == "SUCCESS") {
-        form.value.baseBuildList.splice(index, 1);
-      }
-    });
-  } else {
-    form.value.baseBuildList.splice(index, 1);
-  }
-
-  rules.value.baseBuildList.splice(index, 1);
-}
-
-onLoad((options) => {
-  form.value.baseBuildList = [];
-  rules.value.baseBuildList = [];
-
-  form.value.baseBuildList.push(baseBuildListForm.value);
-  rules.value.baseBuildList.push(baseBuildListRules.value);
-
-  if (!getToken()) {
-    document.getElementsByClassName("uni-page-head-hd")[0].style.cssText = "display: none;";
-  }
-});
-</script>
-
-<style lang="scss">
-#unitInfoCollection {
-  .centerOne,
-  .centerTwo {
-    .title {
-      color: #333333;
-      text-align: center;
-      margin-top: 10px;
-    }
-  }
-}
-</style>

+ 16 - 23
src/pages/business/mhxf/unitInfoCollection/index.vue

@@ -1,6 +1,6 @@
 <template>
   <scroll-view class="scroll-height" :scroll-y="true" :data-theme="'theme-' + proxy.$settingStore.themeColor.name">
-    <view id="unitInfoCollection" v-if="!successBool">
+    <view id="unitInfoCollection">
       <view>
         <u-notice-bar text="注:信息提交后不可修改,提交前请核对填写是否有误" :duration="7000" color="#FF0000" bgColor="#FFFFFF"></u-notice-bar>
       </view>
@@ -63,10 +63,11 @@
           </view>
         </u--form>
 
-        <view class="app-padding-bottom"> </view>
-
-        <view class="app-button-fixed">
-          <u-button class="app-buttom" type="primary" @click="handleSubmit('下一步')" shape="circle"> 下一步 </u-button>
+        <view class="app-button">
+          <view class="app-button-padding"></view>
+          <view class="app-button-fixed">
+            <u-button class="app-buttom" type="primary" @click="handleSubmit('下一步')" shape="circle"> 下一步 </u-button>
+          </view>
         </view>
       </view>
 
@@ -244,15 +245,15 @@
           </view>
         </u--form>
 
-        <view class="app-padding-bottom">
-          <u-button type="primary" style="width: 25%; height: 25px; margin-top: 10px" @click="addSubmit('建筑')" shape="circle" icon="plus" size="mini"> 添加建筑 </u-button>
-        </view>
-
-        <view class="app-button-fixed">
-          <view class="app-flex">
-            <u-button class="app-buttom" style="margin-right: 15px" @click="handleSubmit('上一步')" shape="circle"> 上一步 </u-button>
-
-            <u-button class="app-buttom" type="primary" @click="handleSubmit('提交')" shape="circle"> 提交 </u-button>
+        <view class="app-button">
+          <view class="app-button-padding">
+            <u-button type="primary" style="width: 25%; height: 25px; margin-top: 10px" @click="addSubmit('建筑')" shape="circle" icon="plus" size="mini"> 添加建筑 </u-button>
+          </view>
+          <view class="app-button-fixed">
+            <view class="app-flex">
+              <u-button class="app-buttom" style="margin-right: 15px" @click="handleSubmit('上一步')" shape="circle"> 上一步 </u-button>
+              <u-button class="app-buttom" type="primary" @click="handleSubmit('提交')" shape="circle"> 提交 </u-button>
+            </view>
           </view>
         </view>
       </view>
@@ -300,13 +301,6 @@
         </view>
       </u-modal>
     </view>
-
-    <view v-else>
-      <view style="display: flex">
-        <image style="width: 120px; height: 120px; margin: 50px auto 20px auto" src="@/static/images/unitInfoCollection/success.png" />
-      </view>
-      <view style="text-align: center; font-weight: 600">提交成功</view>
-    </view>
   </scroll-view>
 </template>
 
@@ -700,7 +694,6 @@ const {
 const uForm = ref(null);
 const uForm1 = ref(null);
 const newCompanyName = ref("");
-const successBool = ref(false);
 const scanBool = ref(false);
 
 /**
@@ -858,7 +851,7 @@ function handleSubmitApi(value) {
       addBaseCompany(param).then((res) => {
         if (res.status == "SUCCESS") {
           if (scanBool.value) {
-            successBool.value = true;
+            proxy.$tab.reLaunch(`/pages/common/success/index?codeName=提交成功&showNow=${false}`);
           } else {
             uni.showToast({
               title: "提交成功",

+ 2 - 2
src/pages/business/mhxf/xunJian/collect/components/collectDetail.vue

@@ -1,6 +1,6 @@
 <template>
   <scroll-view class="scroll-height" :scroll-y="true" :data-theme="'theme-' + proxy.$settingStore.themeColor.name">
-    <view class="bg-white padding-15">
+    <view class="bg-white p15">
       <u-form ref="form" labelPosition="left" :model="model" :rules="rules" labelWidth="82">
         <u-form-item label="地点号码:" prop="siteNubmber">
           <u-input v-model="model.siteNubmber" disabled></u-input>
@@ -13,7 +13,7 @@
         </u-form-item>
       </u-form>
 
-      <u-button type="primary" class="margin-t-15" style="width: 100%; height: 40px; font-size: 14px" @click="handleInsert()" shape="circle"> 保存 </u-button>
+      <u-button type="primary" class="mt15" style="width: 100%; height: 40px; font-size: 14px" @click="handleInsert()" shape="circle"> 保存 </u-button>
     </view>
   </scroll-view>
 </template>

+ 2 - 2
src/pages/business/mhxf/xunJian/collect/components/collectRecord.vue

@@ -3,8 +3,8 @@
     <view class="example-body" v-if="show">
       <uni-datetime-picker v-model="datetimerange" type="daterange" rangeSeparator="~" @change="confirm" />
     </view>
-    <view v-for="(cu, index) in dataList.siteList" :key="index" class="flex bg-white padding-15 padding-r-0 margin-b-15">
-      <view class="flex margin-r-15">
+    <view v-for="(cu, index) in dataList.siteList" :key="index" class="flex bg-white p15 pt0 mb15">
+      <view class="flex mr15">
         <u-image style="margin: auto" width="40" height="40" src="@/static/images/xunjian/scan.png" v-if="cu.siteType == 1" shape="circle"></u-image>
 
         <u-image style="margin: auto" width="40" height="40" src="@/static/images/xunjian/NFC.png" v-if="cu.siteType == 2" shape="circle"></u-image>

+ 3 - 3
src/pages/business/mhxf/xunJian/collect/index.vue

@@ -3,15 +3,15 @@
     <!-- 按组使用 -->
     <uni-swipe-action>
       <uni-swipe-action-item
-        class="margin-b-15"
+        class="mb15"
         v-for="(cu, index) in xunJianStore.collectDataList"
         :key="index"
         :right-options="options"
         @click="bindClick($event, index)"
         @change="swipeChange($event, index)"
       >
-        <view class="flex bg-white padding-15 padding-r-0">
-          <view class="flex margin-r-15">
+        <view class="flex bg-white p15 pt0">
+          <view class="flex mr15">
             <u-image style="margin: auto" width="40" height="40" src="@/static/images/xunjian/scan.png" v-if="cu.siteType == 1" shape="circle"></u-image>
 
             <u-image style="margin: auto" width="40" height="40" src="@/static/images/xunjian/NFC.png" v-if="cu.siteType == 2" shape="circle"></u-image>

+ 9 - 9
src/pages/business/mhxf/xunJian/plan/components/content.vue

@@ -1,16 +1,16 @@
 <template>
   <scroll-view class="scroll-height" :scroll-y="true" :data-theme="'theme-' + proxy.$settingStore.themeColor.name">
     <view class="xunjian-plan-content">
-      <view class="bg-white padding-15 margin-b-15" v-for="(con, index) in contentList" :key="index">
-        <view class="flex margin-b-10">
-          <uni-section class="block margin-b-10" :title="con.contentTitle" type="line"></uni-section>
+      <view class="bg-white p15 mb15" v-for="(con, index) in contentList" :key="index">
+        <view class="flex mb10">
+          <uni-section class="block mb10" :title="con.contentTitle" type="line"></uni-section>
 
           <view style="margin: auto"> </view>
 
           <u-button v-if="con.remarksBool == false" type="primary" icon="list-dot" shape="circle" @click="remarksClick(index)" customStyle="width: 18px;height: 18px;padding: 0;margin: 0;"> </u-button>
         </view>
         <view>
-          <view class="margin-t-15" v-if="con.submissionMethod == 1">
+          <view class="mt15" v-if="con.submissionMethod == 1">
             <u-checkbox-group
               v-model="con.contentOptionListValue1"
               @change="
@@ -22,7 +22,7 @@
               :activeColor="proxy.$settingStore.themeColor.color"
             >
               <view class="flex" style="width: 100%; flex-wrap: wrap">
-                <view class="margin-b-15" style="width: 50%" v-for="option in con.contentOptionList" :key="option">
+                <view class="mb15" style="width: 50%" v-for="option in con.contentOptionList" :key="option">
                   <u-checkbox :label="option.optionName" :name="option.id" :checked="con.contentOptionListValue1.length > 0 ? con.contentOptionListValue1.indexOf(option.id) >= 0 : false">
                   </u-checkbox>
                 </view>
@@ -34,10 +34,10 @@
               <u-input v-model="con.remarks" placeholder="请输入备注" :disabled="xunJianStore.contentArray.siteList.inspectionStatus == 2" customStyle="height:32px;"></u-input>
             </view>
           </view>
-          <view class="margin-t-15" v-if="con.submissionMethod == 2">
+          <view class="mt15" v-if="con.submissionMethod == 2">
             <u-radio-group placement="row" v-model="con.contentOptionListValue" :activeColor="proxy.$settingStore.themeColor.color">
               <view class="flex" style="width: 100%; flex-wrap: wrap">
-                <view class="margin-b-15" style="width: 50%" v-for="option in con.contentOptionList" :key="option">
+                <view class="mb15" style="width: 50%" v-for="option in con.contentOptionList" :key="option">
                   <u-radio :disabled="xunJianStore.contentArray.siteList.inspectionStatus == 2" :label="option.optionName" :name="option.id"> </u-radio>
                 </view>
               </view>
@@ -48,8 +48,8 @@
               <u-input v-model="con.remarks" placeholder="请输入备注" :disabled="xunJianStore.contentArray.siteList.inspectionStatus == 2" customStyle="height:32px;"></u-input>
             </view>
           </view>
-          <view class="margin-t-15" v-if="con.submissionMethod == 3">
-            <view class="margin-b-15">
+          <view class="mt15" v-if="con.submissionMethod == 3">
+            <view class="mb15">
               <u-textarea v-model="con.contentOptionListValue" placeholder="请输入" maxlength="30" :disabled="xunJianStore.contentArray.siteList.inspectionStatus == 2"></u-textarea>
             </view>
 

+ 2 - 2
src/pages/business/mhxf/xunJian/plan/components/drawer.vue

@@ -1,11 +1,11 @@
 <template>
   <u-popup :show="scanBool" @close="close" @open="open" mode="bottom" :data-theme="'theme-' + proxy.$settingStore.themeColor.name">
     <template #default>
-      <view class="margin-b-15 margin-t-15">
+      <view class="mb15 mt15">
         <h4 style="font-size: 16px; color: #149eff; text-align: center; margin-bottom: 10px">请选择计划</h4>
         <view style="font-size: 12px; color: #b7b7b7; text-align: center"> 当前地点存在于多个计划,请选择目标计划 </view>
       </view>
-      <scroll-view scroll-y class="padding-l-15 padding-r-15" style="height: calc(100vh - 30rem)">
+      <scroll-view scroll-y class="pl15 pr15" style="height: calc(100vh - 30rem)">
         <view v-for="(scan, index) in scanArray" :key="index">
           <view style="display: flex; font-size: 15px; height: 50px; line-height: 50px">
             <view style="margin-right: 15px">

+ 2 - 2
src/pages/business/mhxf/xunJian/plan/components/report.vue

@@ -1,7 +1,7 @@
 <template>
   <scroll-view class="scroll-height" :scroll-y="true" :data-theme="'theme-' + proxy.$settingStore.themeColor.name">
-    <view class="flex margin-b-15 bg-white" style="padding: 15px 0px 15px 15px" v-for="cu in currentDateList" :key="cu">
-      <view class="flex margin-r-15" @click="pulicClick(cu)">
+    <view class="flex mb15 bg-white" style="padding: 15px 0px 15px 15px" v-for="cu in currentDateList" :key="cu">
+      <view class="flex mr15" @click="pulicClick(cu)">
         <u-image style="margin: auto" width="40" height="40" src="@/static/images/xunjian/scan.png" v-if="cu.siteType == 1" shape="circle"></u-image>
 
         <u-image style="margin: auto" width="40" height="40" src="@/static/images/xunjian/NFC.png" v-if="cu.siteType == 2" shape="circle"></u-image>

+ 7 - 7
src/pages/business/mhxf/xunJian/plan/components/siteDetails.vue

@@ -1,7 +1,7 @@
 <template>
   <scroll-view class="scroll-height" :scroll-y="true" :data-theme="'theme-' + proxy.$settingStore.themeColor.name">
     <view class="xunjian-plan-siteDetails">
-      <view class="flex bg-white padding-15 margin-b-15">
+      <view class="flex bg-white p15 mb15">
         <u-image style="margin: auto 15px auto 0" width="40" height="40" src="@/static/images/xunjian/scan.png" v-if="siteList.siteType == 1" shape="circle"></u-image>
         <u-image style="margin: auto 15px auto 0" width="40" height="40" src="@/static/images/xunjian/NFC.png" v-if="siteList.siteType == 2" shape="circle"></u-image>
 
@@ -17,8 +17,8 @@
         </view>
       </view>
 
-      <view class="bg-white padding-15 margin-b-15">
-        <uni-section class="block margin-b-10" title="上报现场" type="line"></uni-section>
+      <view class="bg-white p15 mb15">
+        <uni-section class="block mb10" title="上报现场" type="line"></uni-section>
 
         <oa-upload
           :uploadCount="9"
@@ -33,8 +33,8 @@
         ></oa-upload>
       </view>
 
-      <view class="bg-white padding-15 margin-b-15" style="height: 170px; max-height: 170px">
-        <uni-section class="block margin-b-10" title="备注" type="line"></uni-section>
+      <view class="bg-white p15 mb15" style="height: 170px; max-height: 170px">
+        <uni-section class="block mb10" title="备注" type="line"></uni-section>
 
         <view style="height: calc(100% - 25px)">
           <span v-if="siteList.inspectionStatus == 2">
@@ -45,8 +45,8 @@
         </view>
       </view>
 
-      <view class="bg-white padding-15 margin-b-15">
-        <uni-section class="block margin-b-10" title="消防设施分布图" type="line"></uni-section>
+      <view class="bg-white p15 mb15">
+        <uni-section class="block mb10" title="消防设施分布图" type="line"></uni-section>
 
         <u-image width="100%" :src="siteList.pictureUrl"></u-image>
       </view>

+ 0 - 7
src/pages/business/zhxf/funReport/funcAdd/index.vue

@@ -312,13 +312,6 @@ onReady(() => {
   proxy.$settingStore.systemThemeColor([1]);
 });
 
-watch(
-  () => start_time.value,
-  (val) => {
-    // alert(start_time.value)
-  }
-);
-
 watch(
   () => report_type.value,
   (newVal) => {

+ 1 - 3
src/pages/business/zhxf/funReport/index.vue

@@ -56,11 +56,9 @@
       </view>
     </view>
 
-    <!-- 新增按钮start -->
-    <view style="position: fixed; right: 0; bottom: 50px">
+    <view class="app-scan-fixed">
       <u-image width="67" height="67" src="@/static/images/add.png" shape="circle" @tap="goAddPage()"></u-image>
     </view>
-    <!-- 新增按钮end -->
   </view>
 </template>
 

+ 1 - 10
src/pages/business/zhxf/messagePush/index.vue

@@ -128,16 +128,7 @@ function getCheckList(params = {}) {
 //提交
 async function btnSubmit() {
   // 提交验证
-  // alert(aa.value);
-  // alert(checkedValue.value)
-  // if (!aa.value.length) {
-  // 	uni.showToast({
-  // 		title: "请选择推送选项",
-  // 		icon: "none"
-  // 	});
-  // 	return
-  // }
-
+  
   let mingParams = {};
   if (!flag.value) {
     //不点击默认传参

+ 1 - 0
src/pages/common/applicationInfo/index.vue

@@ -172,6 +172,7 @@ onNavigationBarButtonTap((e) => {
 
       &-cont {
         font-weight: 600;
+        color: #000000;
       }
 
       &-buttom {

+ 77 - 44
src/pages/common/customManage/index.vue

@@ -1,6 +1,6 @@
 <template>
   <oa-scroll
-    customClass=" scroll-height"
+    customClass="customManage-container scroll-height"
     :pageSize="pageSize"
     :total="total"
     :refresherLoad="true"
@@ -10,54 +10,54 @@
     :refresherBackground="'#f5f6f7'"
     @load="load"
     @refresh="refresh"
+    :data-theme="'theme-' + proxy.$settingStore.themeColor.name"
   >
     <template #default>
-      <view class="customManage-container" :data-theme="'theme-' + proxy.$settingStore.themeColor.name">
-        <view class="flex bg-white padding-10" style="position: relative">
-          <u--input
-            v-model="projectName"
-            placeholder="搜索"
-            prefixIcon="search"
-            prefixIconStyle="font-size: 22px;color: #909399"
-            customStyle="height:30px;background-color:#f5f6fa;"
-            @confirm="selectListApi()"
-            clearable
-          ></u--input>
-          <view class="margin-l-10" style="margin-top: auto; margin-bottom: auto" @click="dropdownShow = !dropdownShow">筛选</view>
-        </view>
+      <view class="search-area flex bg-white p10">
+        <u--input
+          style="width: 100%"
+          v-model="projectName"
+          placeholder="搜索"
+          prefixIcon="search"
+          prefixIconStyle="font-size: 22px;color: #909399"
+          customStyle="height:30px;background-color:#f5f6fa; "
+          @confirm="selectListApi()"
+          clearable
+        ></u--input>
+        <view class="search-area-buttom ml10" @click="dropdownShow = !dropdownShow">筛选</view>
+      </view>
 
-        <oa-dropdown :dropdownShow="dropdownShow" :closeOnClickOverlay="true" @close="dropdownShow = false">
-          <template #content>
-            <u-radio-group v-model="radioValue" placement="column" iconPlacement="right" @change="radioChange">
-              <u-radio v-for="ra in radioList" :key="ra" :activeColor="proxy.$settingStore.themeColor.color" :label="ra.label" :name="ra.value"></u-radio>
-            </u-radio-group>
-          </template>
-        </oa-dropdown>
-
-        <view class="container-area menu-list margin-lr-0" v-for="data in dataList" :key="data">
-          <view class="list-cell" style="color: #666666; line-height: 30px">
-            <view class="menu-item-box" style="font-size: 16px; font-weight: 600; color: #000000">
-              <view> {{ data.projectName }} </view>
+      <oa-dropdown :dropdownShow="dropdownShow" :closeOnClickOverlay="true" @close="dropdownShow = false">
+        <template #content>
+          <u-radio-group v-model="radioValue" placement="column" iconPlacement="right" @change="radioChange">
+            <u-radio v-for="ra in radioList" :key="ra" :activeColor="proxy.$settingStore.themeColor.color" :label="ra.label" :name="ra.value"></u-radio>
+          </u-radio-group>
+        </template>
+      </oa-dropdown>
+
+      <view class="content-area menu-list mlr0" v-for="data in dataList" :key="data">
+        <view class="list-cell" style="color: #666666; line-height: 30px">
+          <view class="content-area-top menu-item-box">
+            <view> {{ data.projectName }} </view>
+          </view>
+          <view class="content-area-row_wrap menu-item-box">
+            <view class="content-area-row_wrap-view"> 项目编号:{{ data.projectId }} </view>
+            <view class="content-area-row_wrap-view"> 到期时间:{{ data.expireTime ? data.expireTime.split("T")[0] : "" }} </view>
+            <view class="content-area-row_wrap-view"> 客户负责人:{{ data.customPerson }} </view>
+            <view class="content-area-row_wrap-view">
+              维保费:<span style="color: red">¥{{ data.maintainAmount }}</span>
             </view>
-            <view class="menu-item-box" style="font-size: 13px; flex-flow: row wrap">
-              <view style="min-width: 50%"> 项目编号:{{ data.projectId }} </view>
-              <view style="min-width: 50%"> 到期时间:{{ data.expireTime ? data.expireTime.split("T")[0] : "" }} </view>
-              <view style="min-width: 50%"> 客户负责人:{{ data.customPerson }} </view>
-              <view style="min-width: 50%"> 维保费:¥{{ data.maintainAmount }} </view>
-              <view style="min-width: 50%; display: flex; white-space: nowrap">
-                <view style="margin-right: 5px">客户电话:{{ data.phone }}</view>
-                <view class="iconfont ucicon-a-copy menu-icon" style="font-size: 14px; color: #909399; margin-left: 5px" @click="copy(data.phone)"> </view>
-                <view class="iconfont ucicon-dial menu-icon" style="font-size: 14px; color: #909399; margin-left: 5px" @click="proxy.$common.makePhoneCall(data.phone)"> </view>
-              </view>
-              <view style="min-width: 50%">
-                状态:
-                <span :style="`color: ${data.maintainStatus == 1 ? '#16bf00' : 'red'} `">
-                  {{ data.maintainStatus == 1 ? "使用中" : "已到期" }}
-                </span>
-              </view>
-              <view style="min-width: 50%"> 客户地址: {{ data.customAddress }} </view>
-              <view style="min-width: 50%">销售负责人:{{ data.salePerson }}</view>
+            <view class="content-area-row_wrap-view">
+              <view style="margin-right: 5px">客户电话:{{ data.phone }}</view>
+              <view class="iconfont ucicon-a-copy menu-icon" @click="copy(data.phone)"> </view>
+              <view class="iconfont ucicon-dial menu-icon" @click="proxy.$common.makePhoneCall(data.phone)"> </view>
             </view>
+            <view class="content-area-row_wrap-view">
+              <view>状态:</view>
+              <view :style="`color: ${data.maintainStatus == 1 ? '#16bf00' : 'red'} `"> {{ data.maintainStatus == 1 ? "使用中" : "已到期" }}</view>
+            </view>
+            <view class="content-area-row_wrap-view"> 客户地址: {{ data.customAddress }} </view>
+            <view class="content-area-row_wrap-view">销售负责人:{{ data.salePerson }}</view>
           </view>
         </view>
       </view>
@@ -204,5 +204,38 @@ onNavigationBarButtonTap((e) => {
 }
 
 .customManage-container {
+  .search-area {
+    position: relative;
+
+    &-buttom {
+      margin-top: auto;
+      margin-bottom: auto;
+      white-space: nowrap;
+    }
+  }
+
+  .content-area {
+    &-top {
+      font-size: 16px;
+      font-weight: 600;
+      color: #000000;
+    }
+
+    &-row_wrap {
+      font-size: 13px;
+      flex-flow: row wrap;
+
+      &-view {
+        display: flex;
+        min-width: 50%;
+        white-space: nowrap;
+        > .iconfont {
+          font-size: 14px;
+          color: #909399;
+          margin-left: 5px;
+        }
+      }
+    }
+  }
 }
 </style>

+ 107 - 0
src/pages/common/evaluate/index.vue

@@ -0,0 +1,107 @@
+<template>
+  <oa-scroll
+    customClass="scroll-height"
+    :customStyle="{}"
+    :refresherLoad="false"
+    :refresherEnabled="false"
+    :refresherDefaultStyle="'none'"
+    :refresherThreshold="44"
+    :refresherBackground="'#f5f6f7'"
+    :data-theme="'theme-' + proxy.$settingStore.themeColor.name"
+  >
+    <view class="menu-list">
+      <view class="list-cell">
+        <view class="menu-item-box">
+          <view style="font-size: 14px; font-weight: 600"> 为了更好提升我们的服务,请您对我们的服务人员进行评价、留下您宝贵的意见,我们将会不断完善我们的服务。 </view>
+        </view>
+      </view>
+    </view>
+
+    <view class="menu-list">
+      <view class="list-cell">
+        <view class="menu-item-box mb15">
+          <view style="font-size: 14px; font-weight: 600"> 总体满意度 </view>
+        </view>
+        <view class="menu-item-box">
+          <u-rate :count="rateCount" v-model="rateValue" :size="24" :gutter="0" :minCount="0" :touchable="true" :allowHalf="true" :activeColor="proxy.$settingStore.themeColor.color"></u-rate>
+          <view style="font-size: 14px; margin: auto 0 auto auto">我的评分: {{ rateValue }}分</view>
+        </view>
+      </view>
+    </view>
+
+    <view class="menu-list">
+      <view class="list-cell">
+        <view class="menu-item-box mb15">
+          <view style="font-size: 14px; font-weight: 600"> 建议或意见 </view>
+        </view>
+        <view class="menu-item-box">
+          <u--textarea v-model="textareaValue" border="none" placeholder="请留下您的宝贵意见,这对我们很重要哦~" maxlength="100" style="padding: 0"></u--textarea>
+        </view>
+      </view>
+    </view>
+
+    <view class="app-button">
+      <view class="app-button-padding"></view>
+      <view class="app-button-fixed">
+        <u-button class="app-buttom" type="primary" @click="handleSubmit('提交')" shape="circle"> 提交 </u-button>
+      </view>
+    </view>
+  </oa-scroll>
+</template>
+
+<script setup>
+import config from "@/config";
+import storage from "@/utils/storage";
+import { onLoad, onShow, onReady, onHide, onLaunch, onNavigationBarButtonTap, onPageScroll } from "@dcloudio/uni-app";
+import { ref, reactive, computed, getCurrentInstance, toRefs, inject } from "vue";
+import { publicStores, useStores } from "@/store/modules/index";
+
+import { score } from "@/api/common/index.js";
+
+const { proxy } = getCurrentInstance();
+const publicStore = publicStores();
+
+const data = reactive({
+  rateCount: 5,
+  rateValue: 0,
+  textareaValue: "",
+  repairCode: "",
+  statusBool: true,
+});
+const { rateCount, rateValue, textareaValue, repairCode, statusBool } = toRefs(data);
+
+/**
+ * @提交
+ */
+function handleSubmit(value) {
+  score({
+    repairCode: repairCode.value,
+    score: rateValue.value,
+    appraiseContent: textareaValue.value,
+  }).then((requset) => {
+    if (requset.status === "SUCCESS") {
+      proxy.$tab.navigateTo(`/pages/common/success/index?codeName=评价成功&showNow=${statusBool.value}`);
+    }
+  });
+}
+
+onLoad((options) => {
+  if ("statusBool" in options) {
+    statusBool.value = options.statusBool;
+    document.getElementsByClassName("uni-page-head-hd")[0].style.cssText = "display: none;";
+  }
+
+  if ("repairCode" in options) {
+    repairCode.value = options.repairCode;
+  }
+});
+
+onReady(() => {});
+
+onShow(() => {
+  //调用系统主题颜色
+  proxy.$settingStore.systemThemeColor([1]);
+});
+</script>
+
+<style lang="scss" scoped></style>

+ 0 - 1
src/pages/common/export/index.vue

@@ -115,7 +115,6 @@ function exportButton() {
   var end_time = datetimerange[1] ? `end_time/${datetimerange[1]}/` : "";
   let exportUrl = config.BASE_URL + url2 + `/${start_time}${end_time}company_code/${uni.getStorageSync("selectedCode")}/`;
   var ua = window.navigator.userAgent.toLowerCase();
-  // alert(exportUrl)
   if (ua.match(/MicroMessenger/i) == "micromessenger") {
     uni.showModal({
       showCancel: false,

+ 19 - 12
src/pages/common/invoicing/index.vue

@@ -3,7 +3,17 @@
     <u-tabs :list="tabsList" :current="tabsCurrent" @click="tabsClick" lineColor="#333" :activeStyle="{ color: '#333' }" :inactiveStyle="{ color: '#909399' }" :scrollable="false"></u-tabs>
   </u-sticky>
 
-  <scroll-view class="invoicing-container scroll-height" :scroll-y="true" :scroll-into-view="scrollIntoView" :data-theme="'theme-' + proxy.$settingStore.themeColor.name">
+  <oa-scroll
+    customClass="invoicing-container scroll-height"
+    :customStyle="{}"
+    :refresherLoad="false"
+    :refresherEnabled="false"
+    :refresherDefaultStyle="'none'"
+    :refresherThreshold="44"
+    :refresherBackground="'#f5f6f7'"
+    :scrollIntoView="scrollIntoView"
+    :data-theme="'theme-' + proxy.$settingStore.themeColor.name"
+  >
     <view v-show="tabsCurrent == 0">
       <u-notice-bar id="noticeBar" v-if="promptStatus" text="注:查询到您近期有开票记录,请勿重复开票" :duration="9000" color="#FF0000" bgColor="#FFFFFF"></u-notice-bar>
 
@@ -108,15 +118,16 @@
         </view>
       </view>
 
-      <view class="app-padding-bottom"> </view>
-
-      <view class="app-button-fixed">
-        <u-button class="app-buttom" type="primary" @click="handleSubmit('提交')" shape="circle"> 提交 </u-button>
+      <view class="app-button">
+        <view class="app-button-padding" :style="{ paddingBottom: `calc(60px +  44px + ${proxy.$settingStore.tabBarHeight}) !important` }"></view>
+        <view class="app-button-fixed">
+          <u-button class="app-buttom" type="primary" @click="handleSubmit('提交')" shape="circle"> 提交 </u-button>
+        </view>
       </view>
     </view>
 
     <view v-show="tabsCurrent == 1">
-      <view class="menu-list margin-t-0 margin-lr-0" style="padding: 0.625rem">
+      <view class="menu-list mt0 mlr0" style="padding: 0.625rem">
         <view class="list-cell">
           <view class="menu-item-box" style="justify-content: center; margin-bottom: 15px; font-size: 15px">
             <view>对公转账</view>
@@ -152,7 +163,7 @@
         </view>
       </view>
     </view>
-  </scroll-view>
+  </oa-scroll>
 </template>
 
 <script setup>
@@ -325,7 +336,7 @@ function handleSubmit(value) {
             };
             crmInvoiceInfo(param).then((requset) => {
               if (requset.status === "SUCCESS") {
-                proxy.$tab.navigateTo("/pages/common/success/index");
+                proxy.$tab.navigateTo("/pages/common/success/index?codeName=提交成功");
               }
             });
           }
@@ -406,8 +417,4 @@ onNavigationBarButtonTap((e) => {
 :deep(.uni-page-head__title) {
   opacity: 1 !important;
 }
-
-.invoicing-container {
-  height: calc(100vh - env(safe-area-inset-top) - 44px) !important;
-}
 </style>

+ 192 - 0
src/pages/common/phoneVerify/index.vue

@@ -0,0 +1,192 @@
+<template>
+  <view class="phoneVerify-container">
+    <view class="content-area">
+      <view class="content-area-top">
+        <text class="content-area-top-icon iconfont ucicon-phone"></text>
+      </view>
+
+      <view class="content-area-text">
+        <text class="title">手机号验证</text>
+      </view>
+
+      <view class="content-area-center">
+        <u-input v-model="phone" prefixIcon="phone" placeholder="请输入手机号码" />
+
+        <u-input v-model="verify" prefixIcon="email" placeholder="请输入验证码" :maxlength="6">
+          <template #suffix>
+            <button class="content-area-center-verify" @click="getVerifyCode">{{ !codeTime ? "获取验证码" : codeTime + "s" }}</button>
+          </template>
+        </u-input>
+      </view>
+
+      <u-button class="content-area-submit" type="primary" :plain="false" text="验 证" color="#2a98ff" @click="submitRes()"></u-button>
+    </view>
+  </view>
+</template>
+
+<script setup>
+import { onLoad, onShow, onReady, onHide, onLaunch, onNavigationBarButtonTap, onPageScroll, onBackPress, onUnload } from "@dcloudio/uni-app";
+import { reactive, getCurrentInstance, toRefs, inject } from "vue";
+
+import { getCodeImg } from "@/api/login";
+import { phoneVerify } from "@/api/common/index.js";
+
+const { proxy } = getCurrentInstance();
+
+const data = reactive({
+  phone: undefined,
+  verify: undefined,
+  codeTime: 0,
+  path: "",
+});
+
+const { phone, verify, codeTime, path } = toRefs(data);
+
+/** 点击发送验证码 */
+function getVerifyCode() {
+  verify.value = undefined;
+  useStore.GetCodeImg({
+    phone: phone.value,
+    success: (res) => {
+      proxy.$modal.msgSuccess("发送成功");
+    },
+  });
+}
+
+/** 点击提交按钮 */
+function submitRes() {
+  if (!phone.value) {
+    proxy.$modal.msg("请输入手机号码");
+    return;
+  }
+  if (!/^1(?:3\d|4[4-9]|5[0-35-9]|6[67]|7[013-8]|8\d|9\d)\d{8}$/.test(phone.value)) {
+    proxy.$modal.msg("请输入正确的手机号码");
+    return;
+  }
+  if (!verify.value) {
+    proxy.$modal.msg("请输入验证码");
+    return;
+  }
+  phoneVerify({
+    phone: phone.value,
+    verify: verify.value,
+  }).then((requset) => {
+    if (requset.status === "SUCCESS") {
+      proxy.$tab.redirectTo(path.value + `?statusBool=${true}&phone=${phone.value}`);
+    }
+  });
+}
+
+onShow(() => {
+  useStore.SetInterval("codeTime"); //调用倒计时定时器
+});
+
+onLoad((options) => {
+  if ("path" in options) {
+    path.value = options.path;
+  }
+});
+</script>
+
+<style lang="scss" scoped>
+.phoneVerify-container {
+  position: fixed;
+  top: 0;
+  left: 0;
+  right: 0;
+  bottom: 0;
+  display: flex;
+  width: 100%;
+  height: 100vh;
+  background-color: $uni-bg-color;
+
+  .content-area {
+    position: relative;
+    z-index: 1;
+    width: 100%;
+    padding: 150px 50px 0px;
+
+    &-top {
+      display: flex;
+      align-items: center;
+      justify-content: center;
+      margin-bottom: 15px;
+
+      &-icon {
+        font-size: 50px;
+        color: #2a98ff;
+      }
+    }
+
+    &-text {
+      display: flex;
+      position: relative;
+      margin-bottom: 30px;
+      .title {
+        margin: auto;
+        color: #000;
+        font-size: 16px;
+        font-weight: 600;
+      }
+    }
+
+    // 登录页-服务器配置样式 开始
+    &-center {
+      :deep(.u-input) {
+        height: 45px;
+        border: 0 !important;
+        border-radius: 8px;
+        margin-bottom: 15px;
+        padding: 5px 12px !important;
+        background-color: #f5f6fa !important;
+      }
+
+      :deep(.input-placeholder) {
+        color: #c0c4cc !important;
+      }
+
+      :deep(.uni-input-wrapper) {
+        font-size: 16px;
+      }
+
+      :deep(.u-icon__icon) {
+        font-size: 24px !important;
+        line-height: 24px !important;
+        color: gray !important;
+      }
+
+      :deep(.iconfont) {
+        color: gray !important;
+      }
+
+      :deep(:-webkit-autofill) {
+        caret-color: #000; // 设置光标颜色
+        // -webkit-text-fill-color: gray !important;
+        -webkit-box-shadow: 0 0 0px 1000px transparent inset !important;
+        background-color: transparent;
+        background-image: none;
+        transition: background-color 50000s ease-in-out 0s; //背景色透明  生效时长  过渡效果  启用时延迟的时间
+      }
+
+      &-verify {
+        color: #2a98ff;
+        font-size: 14px;
+        padding-left: 0px;
+        padding-right: 0px;
+        background-color: transparent;
+
+        &::after {
+          border: 0px;
+        }
+      }
+    }
+
+    &-submit {
+      background: #2a98ff;
+      color: #fff;
+      border: 0px;
+      margin-top: 30px;
+    }
+  }
+}
+</style>

+ 183 - 0
src/pages/common/repairReport/index.vue

@@ -0,0 +1,183 @@
+<template>
+  <oa-scroll
+    customClass="scroll-height"
+    :customStyle="{}"
+    :refresherLoad="false"
+    :refresherEnabled="false"
+    :refresherDefaultStyle="'none'"
+    :refresherThreshold="44"
+    :refresherBackground="'#f5f6f7'"
+    :data-theme="'theme-' + proxy.$settingStore.themeColor.name"
+  >
+    <view class="menu-list margin-0">
+      <view class="list-cell">
+        <view class="menu-item-box" style="font-size: 15px">
+          <view style="margin-right: auto; color: #666666"></view>
+          <view style="color: #149eff" @click="proxy.$tab.navigateTo(`/pages/common/repairReport/record`)">报修历史</view>
+        </view>
+
+        <u--form :model="form" ref="uForm" :rules="rules" labelWidth="80">
+          <view style="padding: 10px 0 10px 0; background: #ffffff">
+            <view style="padding-left: 9px">
+              <u-form-item label="项目名称" prop="projectName" :borderBottom="true" required>
+                <u-input v-model="form.projectName" placeholder="请填写项目名称" border="none" />
+              </u-form-item>
+              <u-form-item label="项目地址" prop="projectAddress" :borderBottom="true" required>
+                <u-input v-model="form.projectAddress" placeholder="请填写项目地址" border="none" />
+              </u-form-item>
+              <u-form-item label="报修人" prop="reflectName" :borderBottom="true" required>
+                <u-input v-model="form.reflectName" placeholder="请填写报修人" border="none" maxlength="10" />
+              </u-form-item>
+              <u-form-item label="手机号" prop="reflectPhone" :borderBottom="true" required>
+                <u-input v-model="form.reflectPhone" placeholder="请填写手机号" border="none" maxlength="11" />
+              </u-form-item>
+              <u-form-item label="问题描述" prop="repairContent" :borderBottom="true" required>
+                <u--textarea v-model="form.repairContent" border="none" placeholder="请填写问题描述" maxlength="100" style="padding: 0"></u--textarea>
+              </u-form-item>
+              <u-form-item label="上传图片" prop="paymentReceipt" :borderBottom="true">
+                <oa-upload :uploadCount="1" :uploadImage="form.paymentReceipt" @uploadSuccessChange="uploadSuccessChange" @uploadDeleteChange="uploadDeleteChange"></oa-upload>
+                <view style="color: #666666">图片支持png、jpg</view>
+              </u-form-item>
+            </view>
+          </view>
+        </u--form>
+      </view>
+    </view>
+
+    <view class="app-button">
+      <view class="app-button-padding"></view>
+      <view class="app-button-fixed">
+        <u-button class="app-buttom" type="primary" @click="handleSubmit('提交')" shape="circle"> 提交 </u-button>
+      </view>
+    </view>
+  </oa-scroll>
+</template>
+
+<script setup>
+import config from "@/config";
+import storage from "@/utils/storage";
+import { onLoad, onShow, onReady, onHide, onLaunch, onNavigationBarButtonTap, onPageScroll } from "@dcloudio/uni-app";
+import { ref, reactive, computed, getCurrentInstance, toRefs, inject } from "vue";
+import { publicStores, useStores } from "@/store/modules/index";
+
+import { add } from "@/api/common/repairReport.js";
+
+const { proxy } = getCurrentInstance();
+const publicStore = publicStores();
+
+const uForm = ref(null);
+const data = reactive({
+  form: {
+    projectName: "", //项目名称
+    projectAddress: "", //项目地址
+    reflectName: "", //报修人
+    reflectPhone: "", //报修手机号码
+    repairContent: "", //报修内容
+    repairPicture: "", //报修图片
+  },
+
+  rules: {
+    projectName: [
+      {
+        required: true,
+        message: "请填写项目名称",
+        trigger: ["blur", "change"],
+      },
+    ],
+    projectName: [
+      {
+        required: true,
+        message: "请填写项目地址",
+        trigger: ["blur", "change"],
+      },
+    ],
+    reflectName: [
+      {
+        required: true,
+        message: "请填写报修人",
+        trigger: ["blur", "change"],
+      },
+    ],
+    reflectPhone: [
+      {
+        required: true,
+        message: "请填写手机号",
+        trigger: ["blur", "change"],
+      },
+      {
+        type: "string",
+        min: 11,
+        required: true,
+        message: "请填写正确11位手机号",
+        pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/,
+        trigger: ["blur", "change"],
+      },
+    ],
+    repairContent: [
+      {
+        required: true,
+        message: "请填写问题描述",
+        trigger: ["blur", "change"],
+      },
+    ],
+  },
+});
+
+const { form, rules } = toRefs(data);
+
+/**
+ * @提交
+ */
+function handleSubmit(value) {
+  uForm.value
+    .validate()
+    .then((res) => {
+      uni.$u.toast("校验通过");
+      add(form.value).then((requset) => {
+        if (requset.status === "SUCCESS") {
+          proxy.$tab.navigateTo(`/pages/common/success/index?codeName=提交成功`);
+          form.value = {
+            projectName: "", //项目名称
+            projectAddress: "", //项目地址
+            reflectName: "", //报修人
+            reflectPhone: "", //报修手机号码
+            repairContent: "", //报修内容
+            repairPicture: "", //报修图片
+          };
+        }
+      });
+    })
+    .catch((errors) => {
+      uni.$u.toast("校验失败");
+    });
+}
+
+/**
+ * @图片上传成功回调
+ */
+function uploadSuccessChange(e) {
+  form.value.repairPicture = e.url;
+}
+
+/**
+ * @图片删除回调
+ */
+function uploadDeleteChange(e) {
+  form.value.repairPicture = e;
+}
+
+onLoad((options) => {
+  if ("statusBool" in options) {
+    document.getElementsByClassName("uni-page-head-hd")[0].style.cssText = "display: none;";
+  }
+});
+
+onReady(() => {});
+
+onShow(() => {
+  //调用系统主题颜色
+  proxy.$settingStore.systemThemeColor([1]);
+});
+</script>
+
+<style lang="scss" scoped></style>

+ 183 - 0
src/pages/common/repairReport/record.vue

@@ -0,0 +1,183 @@
+<template>
+  <oa-scroll
+    v-if="dataStatus"
+    customClass="repairReport-record-container scroll-height"
+    :pageSize="pageSize"
+    :total="total"
+    :refresherLoad="true"
+    :refresherEnabled="true"
+    :refresherDefaultStyle="'none'"
+    :refresherThreshold="44"
+    :refresherBackground="'#f5f6f7'"
+    @load="load"
+    @refresh="refresh"
+    :data-theme="'theme-' + proxy.$settingStore.themeColor.name"
+  >
+    <template #default>
+      <view class="menu-list margin-0">
+        <view class="list-cell list-cell-arrow" v-for="(base, index) in dataList" :key="index">
+          <view class="menu-item-box">
+            <view class="content-area">
+              <view class="content-area-top">
+                <view class="content-area-top-time">
+                  {{ base.repairStatus == 1 ? (base.createTime ? base.createTime.replace("T", " ") : "") : base.handleTime ? base.handleTime.replace("T", " ") : "" }}
+                </view>
+                <view class="content-area-top-status" v-if="base.repairStatus == 1" style="background-color: #23dedc"> 受理中 </view>
+                <view class="content-area-top-status" v-if="base.repairStatus == 2" style="background-color: #12c100"> 处理完成 </view>
+              </view>
+              <view class="content-area-center">
+                <view class="content-area-center-view text-ellipsis" style="width: 17%; font-weight: 600"> {{ base.reflectName }} </view>
+                <view class="content-area-center-view text-ellipsis" style="width: 33%"> {{ base.reflectPhone }}</view>
+                <view class="content-area-center-view text-ellipsis" style="width: 50%"> {{ base.repairContent }}</view>
+              </view>
+              <view class="content-area-center">
+                <view class="content-area-center-view text-ellipsis" style="width: 40%"> {{ base.projectName }} </view>
+                <view class="content-area-center-view text-ellipsis" style="width: 60%"> {{ base.projectAddress }}</view>
+              </view>
+            </view>
+          </view>
+        </view>
+      </view>
+    </template>
+  </oa-scroll>
+</template>
+
+<script setup>
+import { onLoad, onShow, onReady, onHide, onLaunch, onNavigationBarButtonTap, onPageScroll, onBackPress, onUnload } from "@dcloudio/uni-app";
+import { ref, reactive, computed, getCurrentInstance, toRefs, inject } from "vue";
+import { getToken, setToken, removeToken } from "@/utils/auth";
+import { publicStores, useStores } from "@/store/modules/index";
+
+import { getHistory } from "@/api/common/repairReport.js";
+
+const { proxy } = getCurrentInstance();
+const useStore = useStores();
+const publicStore = publicStores();
+
+const dataList = ref([]);
+const dataStatus = ref(false);
+const pageSize = ref(20);
+const current = ref(1);
+const total = ref(0);
+
+const data = reactive({
+  phone: getToken() ? useStore.$state.phonenumber : undefined,
+  verify: undefined,
+});
+const { phone, verify } = toRefs(data);
+
+/**
+ * @页面初始化
+ */
+function init() {
+  getSelectListApi();
+}
+
+/**
+ * @列表查询
+ * @api接口查询
+ */
+function getSelectListApi() {
+  dataStatus.value = true;
+  getHistory({
+    size: pageSize.value,
+    current: current.value,
+    phone: phone.value,
+    verify: verify.value,
+  }).then((requset) => {
+    if (requset.status === "SUCCESS") {
+      dataList.value = requset.data.records;
+      total.value = requset.data.total;
+    }
+  });
+}
+
+/**
+ * @scrollView加载数据
+ */
+function load() {
+  pageSize.value += 10;
+  init();
+}
+
+/**
+ * @scrollView刷新数据
+ */
+function refresh() {
+  pageSize.value = 20;
+  total.value = 0;
+  init();
+}
+
+onReady(() => {});
+
+onShow(() => {
+  //调用系统主题颜色
+  proxy.$settingStore.systemThemeColor([1]);
+});
+
+onLoad((options) => {
+  if ("statusBool" in options && "phone" in options) {
+    dataStatus.value = options.statusBool;
+    phone.value = options.phone;
+  }
+
+  if (!getToken() && !dataStatus.value) {
+    proxy.$tab.redirectTo(`/pages/common/phoneVerify/index?path=${"/pages/common/repairReport/record"}`);
+  } else {
+    init();
+  }
+});
+</script>
+
+<style lang="scss" scoped>
+.repairReport-record-container {
+  .content-area {
+    width: 100%;
+    display: flex;
+    flex-flow: row wrap;
+    padding-right: 10px;
+
+    &-top {
+      min-width: 100%;
+      font-size: 15px;
+      display: flex;
+      white-space: nowrap;
+
+      &-time {
+        width: 75%;
+        margin: auto 0;
+        font-size: 14px;
+        color: rgb(102, 102, 102);
+      }
+
+      &-name {
+        width: 75%;
+        color: #000;
+      }
+
+      &-status {
+        max-width: 30%;
+        margin: auto 0 auto auto;
+        font-size: 12px;
+        color: #ffffff;
+        padding: 0 5px;
+        border-radius: 20px;
+        line-height: 20px;
+      }
+    }
+
+    &-center {
+      display: flex;
+      min-width: 100%;
+      margin-top: 10px;
+      font-size: 14px;
+      color: rgb(102, 102, 102);
+
+      &-view {
+        margin: auto 0;
+      }
+    }
+  }
+}
+</style>

+ 6 - 1
src/pages/common/success/index.vue

@@ -4,7 +4,7 @@
       <view style="display: flex">
         <image style="width: 120px; height: 120px; margin: 50px auto 20px auto" src="@/static/images/unitInfoCollection/success.png" />
       </view>
-      <view style="text-align: center; font-weight: 600">提交成功</view>
+      <view style="text-align: center; font-weight: 600">{{ codeName }}</view>
     </view>
 
     <view class="app-button-fixed" v-if="showNow" style="box-shadow: 0px 0px 15px 0 rgba(0, 0, 0, 0)">
@@ -24,6 +24,7 @@ const publicStore = publicStores();
 
 const { proxy } = getCurrentInstance();
 const showNow = ref(true);
+const codeName = ref("");
 
 /**
  * @返回上一级
@@ -36,6 +37,10 @@ onLoad((options) => {
   if ("showNow" in options) {
     showNow.value = options.showNow;
   }
+
+  if ("codeName" in options) {
+    codeName.value = options.codeName;
+  }
 });
 </script>
 

+ 95 - 118
src/pages/common/test/index.vue

@@ -1,126 +1,103 @@
 <template>
-	<view>
-		<view @tap="goCamera()" class="cameraButton">
-			拍照按钮
-		</view>
-		
-		<view class="uni-list list-pd">
-			<view class="uni-uploader__files">
-				<view v-for="(image, index) in imageList" :key="index" class="abc">
-					<view class="uni-uploader__file" style="inline-block">
-						<view class="delete " :style="{'z-index': 99}" @tap="onDeleteClick(index)">x</view>
-						<view class=" images-one">
-							<image class="uni-uploader__img image-bg" :src="image" :data-src="image"
-								@tap="previewImage"></image>
-						</view>
-
-					</view>
-				</view>
-				<view class="uni-uploader__input-box" v-show="imageList.length > 0">
-					<view class="uni-uploader__input" @tap="onGetImgClick"></view>
-				</view>
-			</view>
-		</view>
-
-
-
-	</view>
+  <view>
+    <view @tap="goCamera()" class="cameraButton"> 拍照按钮 </view>
+
+    <view class="uni-list list-pd">
+      <view class="uni-uploader__files">
+        <view v-for="(image, index) in imageList" :key="index" class="abc">
+          <view class="uni-uploader__file" style="inline-block">
+            <view class="delete" :style="{ 'z-index': 99 }" @tap="onDeleteClick(index)">x</view>
+            <view class="images-one">
+              <image class="uni-uploader__img image-bg" :src="image" :data-src="image" @tap="previewImage"></image>
+            </view>
+          </view>
+        </view>
+        <view class="uni-uploader__input-box" v-show="imageList.length > 0">
+          <view class="uni-uploader__input" @tap="onGetImgClick"></view>
+        </view>
+      </view>
+    </view>
+  </view>
 </template>
 
 <script>
-	export default {
-		data() {
-			return {
-
-				imageList: [],
-
-			}
-		},
-		mounted() {
-
-		},
-
-
-		//拍照
-		methods: {
-
-			// 删除图片
-			onDeleteClick(index) {
-				this.imageList.splice(index, 1)
-			},
-			// previewImage() {
-			// 	// 预览功能,相关博客有
-			// },
-
-
-
-			goCamera() {
-				const that = this
-				uni.chooseImage({
-					count: 2, // 最多可以选择的图片张数,默认9
-					sizeType: ['original', 'compressed'], //original 原图,compressed 压缩图,默认二者都有
-					sourceType: ['camera'], //album 从相册选图,camera 使用相机,默认二者都有。如需直接开相机或直接选相册,请只使用一个选项
-					success: function(res) {
-						
-						var tempFilePaths = res.tempFilePaths[0]
-						alert(1)
-						alert(tempFilePaths)
-						const len = that.imageList.length
-						if (len >= 2) {
-							uni.showToast({
-								title: '图片最多上传2张'
-							})
-						} else {
-							for (let i = 0; i < 2 - len; i++) {
-								if (res.tempFilePaths[i]) that.imageList.push(res.tempFilePaths[i])
-							}
-						}
-					}
-				})
-
-			},
-
-
-
-
-		}
-
-	}
+export default {
+  data() {
+    return {
+      imageList: [],
+    };
+  },
+  mounted() {},
+
+  //拍照
+  methods: {
+    // 删除图片
+    onDeleteClick(index) {
+      this.imageList.splice(index, 1);
+    },
+    // previewImage() {
+    // 	// 预览功能,相关博客有
+    // },
+
+    goCamera() {
+      const that = this;
+      uni.chooseImage({
+        count: 2, // 最多可以选择的图片张数,默认9
+        sizeType: ["original", "compressed"], //original 原图,compressed 压缩图,默认二者都有
+        sourceType: ["camera"], //album 从相册选图,camera 使用相机,默认二者都有。如需直接开相机或直接选相册,请只使用一个选项
+        success: function (res) {
+          var tempFilePaths = res.tempFilePaths[0];
+          alert(tempFilePaths);
+          const len = that.imageList.length;
+          if (len >= 2) {
+            uni.showToast({
+              title: "图片最多上传2张",
+            });
+          } else {
+            for (let i = 0; i < 2 - len; i++) {
+              if (res.tempFilePaths[i]) that.imageList.push(res.tempFilePaths[i]);
+            }
+          }
+        },
+      });
+    },
+  },
+};
 </script>
 
 <style>
-	.cameraButton {
-		border: 1px solid red;
-		display: inline-block;
-		border-radius: 10rpx;
-		padding: 10rpx
-	}
-
-	.images-one {
-		white-space: nowrap;
-		position: relative;
-		width: 150rpx;
-		height: 150rpx;
-		background-size: cover;
-		background-position: center;
-		vertical-align: middle;
-		font-size: 1.5em;
-		display: inline-block;
-		margin-right: 20rpx
-	}
-
-	.image-bg {
-		position: absolute;
-		z-index: -1;
-		left: 0;
-		right: 0;
-		bottom: 0;
-		right: 0;
-		width: 100%;
-		height: 100%;
-	}
-
-	.abc {
-		display: inline-block
-	}
+.cameraButton {
+  border: 1px solid red;
+  display: inline-block;
+  border-radius: 10rpx;
+  padding: 10rpx;
+}
+
+.images-one {
+  white-space: nowrap;
+  position: relative;
+  width: 150rpx;
+  height: 150rpx;
+  background-size: cover;
+  background-position: center;
+  vertical-align: middle;
+  font-size: 1.5em;
+  display: inline-block;
+  margin-right: 20rpx;
+}
+
+.image-bg {
+  position: absolute;
+  z-index: -1;
+  left: 0;
+  right: 0;
+  bottom: 0;
+  right: 0;
+  width: 100%;
+  height: 100%;
+}
+
+.abc {
+  display: inline-block;
+}
 </style>

+ 3 - 6
src/pages/common/test/test-1.vue

@@ -79,7 +79,7 @@ export default {
     },
 
     scancode: function () {
-      alert(1);
+      console.log(1);
       this.$wx.scanQRCode({
         needResult: 1, // 默认为0,扫描结果由微信处理,1则直接返回扫描结果,
 
@@ -88,7 +88,7 @@ export default {
         success: function (res) {
           setTimeout(function () {
             /* 放200ms后执行的代码 */
-            alert(2);
+            console.log(2);
           }, 1000);
 
           var result = res.resultStr; // 当needResult 为 1 时,扫码返回的结果
@@ -99,7 +99,4 @@ export default {
 };
 </script>
 
-
-
-<style lang="scss">
-</style>
+<style lang="scss"></style>

+ 28 - 32
src/pages/index.vue

@@ -52,7 +52,7 @@
 
         <image v-if="!swiperBool" style="width: 100%; height: 160px" src="@/static/images/index/banner1.png"></image>
 
-        <view class="app-common-notice bg-white radius shadow-default margin-lr-sm margin-bottom-sm">
+        <view class="app-common-notice bg-white radius shadow-default margin-lr-sm margin-bottom-sm" v-if="weatherData.length != 0">
           <!-- <view class="info">
             <view class="info-header">
               <view class="info-title text-df">综合智慧云</view>
@@ -64,13 +64,13 @@
           <view class="weather radius">
             <view class="weather-header">
               <view class="iconfont ucicon-address icon"></view>
-              <view style="margin: 0 15px 0 0">{{ weatherData.length != 0 ? weatherData[0].location : "" }}</view>
+              <view style="margin: 0 15px 0 0">{{ weatherData[0].location || "上海" }}</view>
               <view style="margin: 0 auto 0 0">今天</view>
-              <view style="margin: 0 0 0 0">{{ weatherData.length != 0 ? weatherData[0].text : "" }}</view>
+              <view style="margin: 0 0 0 0">{{ weatherData[0].text || "未知" }}</view>
             </view>
             <view class="weather-center">
-              <view class="temperature">{{ weatherData.length != 0 ? weatherData[0].today.low + "/" + weatherData[0].today.high : "0℃" }}</view>
-              <image class="image" :src="`${weatherData.length != 0 ? '/static/icons/white/' + weatherData[0].code.now + '.png' : ''}`" mode="heightFix" style="height: 30px"></image>
+              <view class="temperature">{{ weatherData[0].today.low + "/" + weatherData[0].today.high || "0℃" }}</view>
+              <image class="image" :src="`${'/static/icons/white/' + weatherData[0].code.now + '.png'}`" mode="heightFix" style="height: 30px"></image>
             </view>
           </view>
         </view>
@@ -195,18 +195,6 @@ function getWeather(string) {
   });
 }
 
-onLoad((option) => {
-  uni.hideTabBar(); //隐藏自带tabbar
-
-  if (uni.getStorageSync(useStore.$state.name + useStore.$state.tenantId)) {
-    recentlyUsed.value = uni.getStorageSync(useStore.$state.name + useStore.$state.tenantId);
-  }
-
-  getAppRoutersData(); //调用路由信息接口
-  getMobileBannerApi(); //调用banner图接口
-  getLocation(); //调用获取地理位置方法
-});
-
 /**
  * @scrollView刷新数据
  */
@@ -307,22 +295,16 @@ function navItemClick(item) {
     item.sort = 0;
 
     recentlyUsed.value.push(item);
-
-    if (recentlyUsed.value.length > 0) {
-      recentlyUsed.value = recentlyUsed.value.filter((currentValue, currentIndex, selfArr) => {
-        return selfArr.findIndex((x) => x.path === currentValue.path) === currentIndex;
-      });
-
-      recentlyUsed.value.filter((el) => {
-        if (el.path === item.path) {
-          el.sort++;
-        }
-      });
-    }
-
+    recentlyUsed.value = proxy.$common.uniq(recentlyUsed.value, "path");
+    recentlyUsed.value.filter((el) => {
+      if (el.path === item.path) {
+        el.meta.icon = item.meta.icon;
+        el.sort++;
+      }
+    });
     recentlyUsed.value = publicStore.sortEvent(recentlyUsed.value, 1);
 
-    uni.setStorageSync(useStore.$state.name + useStore.$state.tenantId, recentlyUsed.value);
+    uni.setStorageSync(useStore.$state.nickName + useStore.$state.tenantId, recentlyUsed.value);
 
     if (item.path.indexOf("http") != -1) {
       uni.navigateTo({
@@ -394,7 +376,21 @@ function getAppRoutersData() {
   });
 }
 
-onShow(() => {});
+onLoad((option) => {
+  uni.hideTabBar(); //隐藏自带tabbar
+
+  getAppRoutersData(); //调用路由信息接口
+  getMobileBannerApi(); //调用banner图接口
+  getLocation(); //调用获取地理位置方法
+});
+
+onShow(() => {
+  if (uni.getStorageSync(useStore.$state.nickName + useStore.$state.tenantId)) {
+    recentlyUsed.value = uni.getStorageSync(useStore.$state.nickName + useStore.$state.tenantId);
+  } else {
+    recentlyUsed.value = [];
+  }
+});
 </script>
 
 <style lang="scss" scoped>

+ 1 - 1
src/pages/info.vue

@@ -17,7 +17,7 @@
   </u-navbar>
 
   <u-sticky style="top: 0px">
-    <view class="padding-lr padding-tb-10" :class="'bg-' + proxy.$settingStore.themeColor.name">
+    <view class="padding-lr ptb10" :class="'bg-' + proxy.$settingStore.themeColor.name">
       <u--input placeholder="搜索" prefixIcon="search" prefixIconStyle="font-size: 22px;color: #909399" customStyle="height:35px;background-color:#f5f6fa;"></u--input>
     </view>
   </u-sticky>

+ 8 - 39
src/pages/login.vue

@@ -26,8 +26,7 @@
 
         <u-input v-model="verify" prefixIcon="email" placeholder="请输入验证码" :maxlength="6">
           <template #suffix>
-            <button class="verify" @click="getVerifyCode">{{ !codeTime ? "获取验证码" : codeTime + "s" }}</button>
-            <!-- <u-button @click="getVerifyCode">{{ !codeTime ? "获取验证码" : codeTime + "s" }}</u-button> -->
+            <button class="verify" @click="getVerifyCode">{{ !useStore.codeTime ? "获取验证码" : useStore.codeTime + "s" }}</button>
           </template>
         </u-input>
       </view>
@@ -71,8 +70,6 @@ import config from "@/config";
 import { onLoad, onShow, onHide, onLaunch, onReady } from "@dcloudio/uni-app";
 import { reactive, getCurrentInstance, toRefs, inject } from "vue";
 import { publicStores, useStores } from "@/store/modules/index";
-import { getToken, setToken, removeToken } from "@/utils/auth";
-import { getCodeImg } from "@/api/login";
 
 const useStore = useStores();
 const publicStore = publicStores();
@@ -83,7 +80,6 @@ const data = reactive({
   /** login数据 */
   phone: undefined,
   verify: undefined,
-  codeTime: 0,
   switchText: "验证码登录",
   username: undefined,
   password: undefined,
@@ -94,7 +90,7 @@ const data = reactive({
   userChecked: [true],
 });
 
-const { phone, verify, codeTime, switchText, username, password, inputIconBool, linkUrl, userChecked } = toRefs(data);
+const { phone, verify, switchText, username, password, inputIconBool, linkUrl, userChecked } = toRefs(data);
 
 function goSeverConfig() {
   proxy.$tab.navigateTo("/pages/serveConfigSelect");
@@ -117,42 +113,14 @@ function getVerifyCode() {
     return;
   }
   //#endif
-
-  if (!phone.value) {
-    proxy.$modal.msg("请输入手机号码");
-    return;
-  }
-  if (!/^1(?:3\d|4[4-9]|5[0-35-9]|6[67]|7[013-8]|8\d|9\d)\d{8}$/.test(phone.value)) {
-    proxy.$modal.msg("请输入正确的手机号码");
-    return;
-  }
-
-  //#ifdef APP-PLUS || MP-WEIXIN
-  if (!userChecked.value[0]) {
-    proxy.$modal.msg("请在阅读并同意 用户协议和隐私协议后登录");
-    return;
-  }
-  //#endif
-
+  
   verify.value = undefined;
-  getCodeImg({
+  useStore.GetCodeImg({
     phone: phone.value,
-  }).then((res) => {
-    console.log(res);
+    success: (res) => {
+      proxy.$modal.msgSuccess("发送成功");
+    },
   });
-  if (codeTime.value > 0) {
-    proxy.$modal.msg("不能重复获取");
-    return;
-  } else {
-    codeTime.value = 60;
-    let timer = setInterval(() => {
-      codeTime.value--;
-      if (codeTime.value < 1) {
-        clearInterval(timer);
-        codeTime.value = 0;
-      }
-    }, 1000);
-  }
 }
 
 /**
@@ -269,6 +237,7 @@ function handlePrivacy() {
 
 onShow(() => {
   env();
+  useStore.SetInterval("codeTime"); //调用倒计时定时器
 });
 
 onLoad((options) => {});

+ 5 - 5
src/pages/mine.vue

@@ -4,13 +4,13 @@
     <view class="header-section" :class="'bg-' + themeColor.name" :style="{ paddingTop: proxy.$settingStore.StatusBar ? proxy.$settingStore.StatusBar + 20 + 'px' : '55px' }">
       <view class="flex padding justify-between">
         <view class="flex align-center">
-          <view v-if="!avatar" class="cu-avatar xl round bg-white" @click="handleToAvatar(1)">
+          <view v-if="!avatar" class="cu-avatar xl round bg-white" @click="!data.nickName ? handleToLogin() : handleToAvatar(1)">
             <view class="iconfont ucicon-people text-gray icon"></view>
           </view>
           <image v-if="avatar" @click="handleToAvatar(2)" :src="avatar" class="cu-avatar xl round"> </image>
-          <view v-if="!data.name" @click="handleToLogin" class="login-tip"> 点击登录 </view>
-          <view v-if="data.name" class="user-info">
-            <view class="u_title"> {{ data.name }} </view>
+          <view v-if="!data.nickName" @click="handleToLogin()" class="login-tip"> 点击登录 </view>
+          <view v-if="data.nickName" class="user-info">
+            <view class="u_title"> {{ data.nickName }} </view>
             <view class="u_title"> {{ data.phone }} </view>
           </view>
         </view>
@@ -204,7 +204,7 @@ const windowHeight = computed(() => {
 });
 
 const data = reactive({
-  name: useStore.$state.name,
+  nickName: useStore.$state.nickName,
   phone: useStore.$state.phonenumber,
   version: config.appInfo.version,
 

+ 0 - 466
src/pages/mine/index.vue

@@ -1,466 +0,0 @@
-<template>
-  <view :data-theme="'theme-' + proxy.$settingStore.themeColor.name" class="mine-container" :style="{ height: `calc(100vh - 50.67px)` }">
-    <!--顶部个人信息栏-->
-    <view class="header-section" :class="'bg-' + themeColor.name" :style="{ paddingTop: proxy.$settingStore.StatusBar ? proxy.$settingStore.StatusBar + 20 + 'px' : '55px' }">
-      <view class="flex padding justify-between">
-        <view class="flex align-center">
-          <view v-if="!avatar" class="cu-avatar xl round bg-white" @click="handleToAvatar(1)">
-            <view class="iconfont ucicon-people text-gray icon"></view>
-          </view>
-          <image v-if="avatar" @click="handleToAvatar(2)" :src="avatar" class="cu-avatar xl round"> </image>
-          <view v-if="!data.name" @click="handleToLogin" class="login-tip"> 点击登录 </view>
-          <view v-if="data.name" class="user-info">
-            <view class="u_title"> {{ data.name }} </view>
-            <view class="u_title"> {{ data.phone }} </view>
-          </view>
-        </view>
-        <view class="flex align-center"> </view>
-      </view>
-
-      <view class="vip-card-box"> </view>
-    </view>
-
-    <view
-      class="content-section"
-      :style="[
-        {
-          transform: coverTransform,
-          transition: coverTransition,
-        },
-      ]"
-      @touchstart="coverTouchstart"
-      @touchmove="coverTouchmove"
-      @touchend="coverTouchend"
-    >
-      <image class="mine-image" src="@/static/images/mine/arc.png"></image>
-
-      <view class="menu-list">
-        <view class="list-cell list-cell-arrow" @click="proxy.$settingStore.handleToEditInfo()">
-          <view class="menu-item-box">
-            <view class="iconfont ucicon-user menu-icon"></view>
-            <view>我的信息</view>
-          </view>
-        </view>
-        <view class="list-cell list-cell-arrow" @click="proxy.$settingStore.handleToSecure()">
-          <view class="menu-item-box">
-            <view class="iconfont ucicon-yanzheng menu-icon"></view>
-            <view>账号与安全</view>
-          </view>
-        </view>
-        <view class="list-cell list-cell-arrow" @click="proxy.$settingStore.handleAbout()">
-          <view class="menu-item-box">
-            <view class="iconfont ucicon-aixin menu-icon"></view>
-            <view>关于我们</view>
-          </view>
-        </view>
-        <view class="list-cell list-cell-arrow" @click="proxy.$settingStore.handleHelp()">
-          <view class="menu-item-box">
-            <view class="iconfont ucicon-Help menu-icon"></view>
-            <view>常见问题</view>
-          </view>
-        </view>
-        <view class="list-cell list-cell-arrow" @click="proxy.$settingStore.handleCleanTmp()">
-          <view class="menu-item-box">
-            <view class="iconfont ucicon-qinglihuancun menu-icon"></view>
-            <view>清理缓存</view>
-            <view style="margin: 0 15px 0 auto; font-size: 14px; color: #909399">{{ proxy.$settingStore.currentSize }}</view>
-          </view>
-        </view>
-        <view class="list-cell list-cell-arrow" @click="proxy.$settingStore.handleToUpgrade()">
-          <view class="menu-item-box">
-            <view class="iconfont ucicon-jianchagengxin menu-icon"></view>
-            <view>检查更新</view>
-          </view>
-        </view>
-        <!-- <view class="list-cell list-cell-arrow" @click="proxy.$settingStore.handleSetting()">
-          <view class="menu-item-box">
-            <view class="iconfont ucicon-shezhi menu-icon"></view>
-            <view>设置</view>
-          </view>
-        </view> -->
-      </view>
-
-      <!-- <view class="menu-list">
-        <view class="list-cell list-cell-arrow" @click="goMessagePush()">
-          <view class="menu-item-box">
-            <view class="iconfont ucicon-aixin menu-icon"></view>
-            <view>推送设置</view>
-          </view>
-        </view>
-        <view class="list-cell list-cell-arrow" @click="goBuilding()">
-          <view class="menu-item-box">
-            <view class="iconfont ucicon-aixin menu-icon"></view>
-            <view>建筑管理</view>
-          </view>
-        </view>
-        <view class="list-cell list-cell-arrow" @click="goFunReport()">
-          <view class="menu-item-box">
-            <view class="iconfont ucicon-aixin menu-icon"></view>
-            <view>功能报备</view>
-          </view>
-        </view>
-      </view> -->
-
-      <view class="cu-list menu">
-        <view class="cu-item" style="margin-top: 0; margin-bottom: 0">
-          <view class="content flex align-center">
-            <text class="iconfont ucicon-colorlens" :class="'text-' + themeColor.name"></text>
-            <view class="padding solid radius shadow-blur" :class="'bg-' + themeColor.name" style="margin-left: 10px"></view>
-            <view class="title" style="margin-left: 10px">
-              主题色:<text :class="'text-' + themeColor.name">{{ themeColor.title }}</text>
-            </view>
-          </view>
-          <view class="action">
-            <button class="cu-btn round shadow" @click="colorModal = true" :class="'bg-' + themeColor.name">
-              <text class="iconfont ucicon-colorlens"></text>
-              选择主题
-            </button>
-          </view>
-        </view>
-      </view>
-
-      <view class="cu-list menu">
-        <view class="cu-item">
-          <view class="content text-center" @click="proxy.$settingStore.handleLogout">
-            <text class="text-black">退出登录</text>
-          </view>
-        </view>
-      </view>
-    </view>
-
-    <!-- <view class="cu-list menu-avatar padding-lr-sm padding-top-sm">
-      <view class="cu-item" @tap="goSiteManage" v-if="permissionLabel == 1">
-        <view class="cu-avatar" style="background-image: url(@/static/images/setting/setting-icon2.png)"></view>
-        <view class="content">
-          <view class="">站点管理</view>
-        </view>
-        <view class="nav-right">
-          <view class="text-grey">
-            <text class="icon iconfont margin-right-xs margin-left-lg">&#xe629;</text>
-          </view>
-        </view>
-      </view>
-      <view class="cu-item" @tap="goAuthManage" v-if="permissionLabel == 1">
-        <view class="cu-avatar" style="background-image: url(@/static/images/setting/setting-icon4.png)"></view>
-        <view class="content">
-          <view class="">权限管理</view>
-        </view>
-        <view class="nav-right">
-          <view class="text-grey">
-            <text class="icon iconfont margin-right-xs margin-left-lg">&#xe629;</text>
-          </view>
-        </view>
-      </view>
-    </view> -->
-
-    <!-- 选择颜色模态框 -->
-    <view class="cu-modal" :class="{ show: colorModal }">
-      <view class="cu-dialog">
-        <view class="cu-bar justify-end solid-bottom">
-          <view class="content">选择颜色</view>
-          <view class="action" @tap="colorModal = false">
-            <u-icon name="close" size="14"></u-icon>
-            <text class="cuIcon-close text-red"></text>
-          </view>
-        </view>
-        <view class="grid col-5 padding">
-          <view class="padding-xs" v-for="(item, index) in themeList" :key="index" @tap="SetColor(item)" :data-color="item.name">
-            <view class="padding-tb radius" :class="'bg-' + item.name">
-              {{ item.title }}
-            </view>
-          </view>
-        </view>
-      </view>
-    </view>
-  </view>
-
-  <oa-tabbar :tabbarValue="2"></oa-tabbar>
-</template>
-
-<script setup>
-import config from "@/config";
-import storage from "@/utils/storage";
-import { onLoad, onShow, onReady, onHide, onLaunch, onNavigationBarButtonTap, onPageScroll } from "@dcloudio/uni-app";
-import { ref, reactive, computed, getCurrentInstance, toRefs, inject } from "vue";
-import { publicStores, useStores } from "@/store/modules/index";
-
-import { uploadAvatar, updateUserProfile } from "@/api/system/user";
-import { getAuthorization } from "@/api/business/zhxf/messagePush/index.js";
-
-const useStore = useStores();
-
-const { proxy } = getCurrentInstance();
-
-const avatar = computed(() => {
-  return useStore.$state.avatar;
-});
-
-const themeColor = computed(() => {
-  return proxy.$settingStore.themeColor;
-});
-
-const windowHeight = computed(() => {
-  return uni.getSystemInfoSync().windowHeight - 50;
-});
-
-const data = reactive({
-  name: useStore.$state.name,
-  phone: useStore.$state.phonenumber,
-  version: config.appInfo.version,
-
-  coverTransform: "translateY(0px)",
-  coverTransition: "0s",
-  moving: false,
-
-  colorModal: false,
-  themeList: proxy.$constData.themeList,
-});
-
-const { coverTransform, coverTransition, moving, colorModal, themeList } = toRefs(data);
-
-const permissionLabel = ref(0);
-
-function getAuthorizationApi(params) {
-  getAuthorization(params).then((res) => {
-    permissionLabel.value = res.data.permissionLabel;
-  });
-}
-
-/**
- * @推送设置
- */
-function goMessagePush() {
-  proxy.$tab.navigateTo("/pages/business/zhxf/messagePush/index");
-}
-
-/**
- * @建筑管理
- */
-function goBuilding() {
-  proxy.$tab.navigateTo("/pages/business/zhxf/building/index");
-}
-
-/**
- * @功能报备
- */
-function goFunReport() {
-  proxy.$tab.navigateTo("/pages/business/zhxf/funReport/index");
-}
-
-/**
- * @主题颜色选择
- */
-function SetColor(item) {
-  colorModal.value = false;
-  proxy.$settingStore.SET_THEMECOLOR(item);
-  proxy.$settingStore.systemThemeColor([1, 2]);
-}
-
-/**
- * @点击登录
- */
-function handleToLogin() {
-  proxy.$tab.reLaunch("/pages/login");
-}
-
-/**
- * @upload上传头像
- * @api接口请求
- */
-function uploadApi(res) {
-  let data = { name: "file", filePath: res.tempFilePaths[0] };
-  uploadAvatar(data).then((response) => {
-    useStore.$state.avatar = response.data.url;
-    updateUserProfile({
-      avatar: response.data.url,
-    }).then(() => {});
-  });
-}
-
-/**
- * @点击头像
- */
-function handleToAvatar(type) {
-  if (type == 1) {
-    uni.chooseImage({
-      count: 1, //默认9
-      sizeType: ["original", "compressed"], //可以指定是原图还是压缩图,默认二者都有
-      sourceType: ["album", "camera"], //从相册选择、摄像头
-      success: function (res) {
-        uploadApi(res);
-      },
-    });
-  } else if (type == 2) {
-    proxy.$tab.navigateTo("/pages/mine/avatar/index");
-  }
-}
-
-let startY = 0,
-  moveY = 0,
-  pageAtTop = true;
-
-/**
- * @触摸开始
- */
-function coverTouchstart(e) {
-  if (pageAtTop === false) {
-    return;
-  }
-  coverTransition.value = "transform .1s linear";
-  startY = e.touches[0].clientY;
-}
-
-/**
- * @触摸移动
- */
-function coverTouchmove(e) {
-  moveY = e.touches[0].clientY;
-  let moveDistance = moveY - startY;
-  if (moveDistance < 0) {
-    moving.value = false;
-    return;
-  }
-  moving.value = true;
-  if (moveDistance >= 80 && moveDistance < 100) {
-    moveDistance = 80;
-  }
-  if (moveDistance > 0 && moveDistance <= 80) {
-    coverTransform.value = `translateY(${moveDistance}px)`;
-  }
-}
-
-/**
- * @触摸结束
- */
-function coverTouchend() {
-  if (moving.value === false) {
-    return;
-  }
-  moving.value = false;
-  coverTransition.value = "transform 0.3s cubic-bezier(.21,1.93,.53,.64)";
-  coverTransform.value = "translateY(0px)";
-}
-
-onShow(() => {});
-
-onReady(() => {});
-
-onLoad((options) => {
-  uni.hideTabBar(); //隐藏自带tabbar
-});
-
-// 自定义导航事件
-onNavigationBarButtonTap((e) => {
-  if (e.float == "right") {
-    proxy.$tab.navigateTo("/pages/mine/setting/index");
-  }
-});
-</script>
-
-<style lang="scss" scoped>
-.mine-container {
-  width: 100%;
-  height: 100vh;
-
-  .header-section {
-    padding: 55px 15px 0 15px;
-
-    .login-tip {
-      font-size: 18px;
-      margin-left: 10px;
-    }
-
-    .cu-avatar {
-      border: 2px solid #eaeaea;
-
-      .icon {
-        font-size: 40px;
-      }
-    }
-
-    .user-info {
-      margin-left: 15px;
-
-      .u_title {
-        font-size: 18px;
-        line-height: 30px;
-      }
-    }
-
-    .vip-card-box {
-      display: flex;
-      flex-direction: column;
-      color: #f7d680;
-      height: 132px;
-      background: url("@/static/images/mine/vip-card.png");
-      background-size: 100% 100%;
-      border-radius: 8px 8px 0 0;
-      overflow: hidden;
-      position: relative;
-      padding: 11px 13px;
-    }
-  }
-
-  .content-section {
-    position: relative;
-    margin-top: -85px;
-    padding-bottom: 50.67px;
-    background-color: #f5f6f7;
-
-    .mine-image {
-      position: absolute;
-      left: 0;
-      top: -16px;
-      width: 100%;
-      height: 36upx;
-    }
-
-    .mine-actions {
-      margin: 0.625rem 0.625rem;
-      padding: 20px 0px;
-      border-radius: 8px;
-      background-color: white;
-
-      .action-item {
-        .icon {
-          font-size: 28px;
-        }
-
-        .text {
-          display: block;
-          font-size: 13px;
-          margin: 8px 0px;
-        }
-      }
-    }
-  }
-
-  .cu-list.menu-avatar .cu-item {
-    border-radius: 5px;
-    padding: 30rpx 0;
-    box-shadow: 1px 1px 4px rgb(26 26 26 / 10%);
-    .cu-avatar {
-      background-color: rgba(0, 0, 0, 0);
-      background-size: 100% 100%;
-      left: 26rpx;
-    }
-    .content {
-      left: 130rpx;
-      font-size: 32rpx;
-    }
-  }
-}
-
-.item-box {
-  background-color: #ffffff;
-  margin: 30rpx;
-  display: flex;
-  flex-direction: row;
-  justify-content: center;
-  align-items: center;
-  padding: 10rpx;
-  border-radius: 8rpx;
-  color: #303133;
-  font-size: 32rpx;
-}
-</style>

+ 3 - 3
src/pages/mine/info/index.vue

@@ -5,7 +5,7 @@
     </u-sticky>
 
     <view class="content-section" v-show="tabsCurrent == 0">
-      <view class="menu-list margin-t-0 margin-lr-0">
+      <view class="menu-list mt0 mlr0">
         <view class="list-cell list-cell-arrow" @click="proxy.$settingStore.handleToAvatar(2)">
           <view class="menu-item-box">
             <view class="title">头像</view>
@@ -43,7 +43,7 @@
         </view>
       </view>
 
-      <view class="menu-list margin-t-0 margin-lr-0">
+      <view class="menu-list mt0 mlr0">
         <view class="list-cell list-cell-arrow" @click="proxy.$modal.showToast('模块建设中~')">
           <view class="menu-item-box">
             <view>个人实名认证</view>
@@ -95,7 +95,7 @@
 
   <u-modal :show="modalShow" :showConfirmButton="true" :showCancelButton="true" @cancel="modalShow = false" @confirm="handleConfirm">
     <view class="slot-content" style="width: 100%">
-      <view class="margin-b-15" style="color: #909399">{{ modalTitle }}</view>
+      <view class="mb15" style="color: #909399">{{ modalTitle }}</view>
 
       <view v-if="modalTitle === '修改昵称'">
         <u--input v-model="userArr.nickName" :maxlength="5" :placeholder="modalTitle" border="bottom" clearable></u--input>

+ 133 - 0
src/pages/mine/secure/fingerprint/index.vue

@@ -0,0 +1,133 @@
+<template>
+  <view class="bg-white scroll-height fingerprint-container">
+    <view class="content-area">
+      <text class="content-area-icon iconfont ucicon-zhiwen"></text>
+      <view class="content-area-text">启用指纹登录,让登录更便捷</view>
+      <view class="content-area-center">启用后,可通过设备本地的指纹验证方式快速登录。</view>
+
+      <u-button type="primary" :plain="false" text="开启指纹登录" color="#2a98ff" @click="fingerprint()"></u-button>
+    </view>
+  </view>
+
+  <u-modal :show="modalShow" confirmText="取消" @confirm="modalConfirm">
+    <view class="slot-content">
+      <text class="content-area-icon iconfont ucicon-zhiwen"></text>
+      <view
+        style="font-size: 15px; text-align: center"
+        :style="{
+          color: modalContent === '请验证指纹' || modalContent === '正在验证指纹...' ? '#000' : 'red',
+        }"
+      >
+        {{ modalContent }}
+      </view>
+    </view>
+  </u-modal>
+</template>
+
+<script setup>
+import { onLoad, onShow, onReady, onHide, onLaunch, onNavigationBarButtonTap, onPageScroll } from "@dcloudio/uni-app";
+import { ref, reactive, computed, getCurrentInstance, toRefs, inject } from "vue";
+import { publicStores, useStores } from "@/store/modules/index";
+
+import { loginLogList } from "@/api/mine/secure/loginLog.js";
+
+const useStore = useStores();
+const { proxy } = getCurrentInstance();
+
+const modalShow = ref(false);
+const modalContent = ref("");
+
+function modalConfirm() {
+  // #ifdef APP-PLUS
+  modalShow.value = false;
+  plus.fingerprint.cancel();
+  // #endif
+}
+
+function fingerprint() {
+  // #ifdef APP-PLUS
+  modalShow.value = true;
+  modalContent.value = "请验证指纹";
+  plus.fingerprint.authenticate(
+    function () {
+      modalContent.value = "正在验证指纹...";
+      setTimeout(() => {
+        modalShow.value = false;
+      }, 1000);
+    },
+    function (e) {
+      switch (e.code) {
+        case e.AUTHENTICATE_MISMATCH:
+          modalContent.value = "指纹匹配失败,请重新输入";
+          break;
+        case e.AUTHENTICATE_OVERLIMIT:
+          plus.nativeUI.closeWaiting(); //兼容Android平台关闭等待框
+          modalContent.value = "指纹识别失败次数超出限制,请使用其它方式进行认证";
+          break;
+        case e.CANCEL:
+          plus.nativeUI.toast("已取消识别");
+          break;
+        default:
+          plus.nativeUI.closeWaiting(); //兼容Android平台关闭等待框
+          modalContent.value = "指纹识别失败,请重试";
+          break;
+      }
+    }
+  );
+  // #endif
+
+  // #ifdef MP-WEIXIN
+  wx.startSoterAuthentication({
+    requestAuthModes: ["fingerPrint"],
+    challenge: "123456",
+    authContent: "请用指纹解锁",
+    success(res) {
+      uni.showToast({
+        title: "识别成功",
+        mask: false,
+        duration: 1500,
+      });
+    },
+  });
+  // #endif
+}
+
+onLoad((options) => {});
+
+onReady(() => {});
+
+// 自定义导航事件
+onNavigationBarButtonTap((e) => {});
+</script>
+<style lang="scss" scoped>
+.fingerprint-container {
+  .content-area {
+    padding: 150px 50px 0px;
+
+    &-icon {
+      display: flex;
+      justify-content: center;
+      font-size: 50px;
+      margin-bottom: 30px;
+      color: #2a98ff;
+    }
+
+    &-text {
+      display: flex;
+      justify-content: center;
+      font-weight: 600;
+      margin-bottom: 10px;
+      color: #000;
+      font-size: 16px;
+    }
+
+    &-center {
+      display: flex;
+      justify-content: center;
+      margin-bottom: 30px;
+      color: #96a6b5;
+      font-size: 15px;
+    }
+  }
+}
+</style>

+ 10 - 7
src/pages/mine/secure/index.vue

@@ -1,12 +1,12 @@
 <template>
   <view :data-theme="'theme-' + proxy.$settingStore.themeColor.name" class="secure-container">
     <view class="content-section">
-      <view class="menu-list margin-t-0 margin-lr-0">
+      <view class="menu-list mt0 mlr0">
         <view></view>
         <image style="width: 100%; height: 160px" src="@/static/images/index/banner2.jpg" mode="widthFix"></image>
       </view>
 
-      <view class="menu-list margin-t-0 margin-lr-0">
+      <view class="menu-list mt0 mlr0">
         <view class="list-cell list-cell-arrow" @click="handleUserModal('修改手机号')">
           <view class="menu-item-box">
             <view class="title">手机号码</view>
@@ -21,12 +21,15 @@
         </view>
       </view>
 
-      <view class="menu-list margin-t-0 margin-lr-0">
+      <view class="menu-list mt0 mlr0">
+        <!-- #ifdef APP-PLUS || MP-WEIXIN -->
         <view class="list-cell list-cell-arrow" @click="proxy.$modal.showToast('模块建设中~')">
+          <!-- <view class="list-cell list-cell-arrow" @click="proxy.$tab.navigateTo(`/pages/mine/secure/fingerprint/index`)"> -->
           <view class="menu-item-box">
             <view class="title">指纹登录</view>
           </view>
         </view>
+        <!-- #endif -->
         <view class="list-cell list-cell-arrow" @click="proxy.$modal.showToast('模块建设中~')">
           <view class="menu-item-box">
             <view class="title">人脸</view>
@@ -39,7 +42,7 @@
         </view>
       </view>
 
-      <view class="menu-list margin-t-0 margin-lr-0">
+      <view class="menu-list mt0 mlr0">
         <view class="list-cell list-cell-arrow" @click="proxy.$tab.navigateTo(`/pages/mine/secure/loginLog/index`)">
           <view class="menu-item-box">
             <view class="title">登录日志</view>
@@ -56,20 +59,20 @@
 
   <u-modal :show="modalShow" :showConfirmButton="true" :showCancelButton="true" @cancel="modalShow = false" @confirm="handleConfirm">
     <view class="slot-content" style="width: 100%">
-      <view class="margin-b-15" style="color: #909399">{{ modalTitle }}</view>
+      <view class="mb15" style="color: #909399">{{ modalTitle }}</view>
 
       <view v-if="modalTitle === '修改手机号'">
         <u--input v-model="userArr.phonenumber" :maxlength="11" :placeholder="modalTitle" border="bottom" clearable></u--input>
       </view>
 
       <view v-if="modalTitle === '修改密码'">
-        <u-input class="margin-b-15" v-model="oldPassword" placeholder="请输入旧密码" :password="oldPasswordBool" border="bottom">
+        <u-input class="mb15" v-model="oldPassword" placeholder="请输入旧密码" :password="oldPasswordBool" border="bottom">
           <template #suffix>
             <text :class="!oldPasswordBool ? 'iconfont ucicon-eye' : 'iconfont ucicon-eye-close'" @click="oldPasswordBool = !oldPasswordBool"></text>
           </template>
         </u-input>
 
-        <u-input class="margin-b-15" v-model="newPassword" placeholder="请输入新密码" :password="newPasswordBool" border="bottom">
+        <u-input class="mb15" v-model="newPassword" placeholder="请输入新密码" :password="newPasswordBool" border="bottom">
           <template #suffix>
             <text :class="!newPasswordBool ? 'iconfont ucicon-eye' : 'iconfont ucicon-eye-close'" @click="newPasswordBool = !newPasswordBool"></text>
           </template>

+ 2 - 2
src/pages/mine/setting/index.vue

@@ -1,6 +1,6 @@
 <template>
   <view class="setting-container" :style="{ height: `${windowHeight}px` }">
-    <view class="menu-list margin-lr-0">
+    <view class="menu-list mlr0">
       <view class="list-cell list-cell-arrow" @click="proxy.$settingStore.handleToEditInfo()">
         <view class="menu-item-box">
           <view class="iconfont ucicon-user menu-icon"></view>
@@ -9,7 +9,7 @@
       </view>
     </view>
 
-    <view class="menu-list margin-t-0 margin-lr-0">
+    <view class="menu-list mt0 mlr0">
       <view class="list-cell list-cell-arrow" @click="proxy.$settingStore.handleAbout()">
         <view class="menu-item-box">
           <view class="iconfont ucicon-aixin menu-icon"></view>

+ 32 - 7
src/pages/serveConfig.vue

@@ -52,10 +52,11 @@ const dataList = reactive({
   linkUrl: "", //链接地址
   port: "",
   content: "",
+  index: "",
 });
 
 const uForm = ref(null);
-const { linkUrl, port, content } = toRefs(dataList);
+const { linkUrl, port, content, index } = toRefs(dataList);
 
 /**
  * @扫一扫
@@ -109,12 +110,20 @@ function handleSubmit() {
   //   return;
   // }
 
-  if (!port.value) {
-    uni.setStorageSync("serveUrl", linkUrl.value);
-    publicStore.setServeList(linkUrl.value, content.value);
+  if (index.value) {
+    let serveList = uni.getStorageSync("serveList");
+    serveList[0].radiolist[index.value].linkUrl = !port.value ? linkUrl.value : linkUrl.value + ":" + port.value;
+    serveList[0].radiolist[index.value].content = content.value;
+    uni.setStorageSync("serveUrl", !port.value ? linkUrl.value : linkUrl.value + ":" + port.value);
+    uni.setStorageSync("serveList", serveList);
   } else {
-    uni.setStorageSync("serveUrl", linkUrl.value + ":" + port.value);
-    publicStore.setServeList(linkUrl.value + ":" + port.value, content.value);
+    if (!port.value) {
+      uni.setStorageSync("serveUrl", linkUrl.value);
+      publicStore.setServeList(linkUrl.value, content.value);
+    } else {
+      uni.setStorageSync("serveUrl", linkUrl.value + ":" + port.value);
+      publicStore.setServeList(linkUrl.value + ":" + port.value, content.value);
+    }
   }
 
   config.baseUrl = "http://" + uni.getStorageSync("serveUrl") + "/prod-api";
@@ -128,7 +137,23 @@ function navigateTo() {
   proxy.$tab.navigateBack(1);
 }
 
-onLoad((options) => {});
+onLoad((options) => {
+  if ("index" in options) {
+    index.value = options.index;
+    let serveList = uni.getStorageSync("serveList");
+    var serveArray = serveList[0].radiolist[options.index];
+
+    if (serveArray.linkUrl.indexOf(":") != -1) {
+      linkUrl.value = serveArray.linkUrl.split(":")[0];
+      port.value = serveArray.linkUrl.split(":")[1];
+      content.value = serveArray.content;
+    } else {
+      linkUrl.value = serveArray.linkUrl;
+      port.value = "";
+      content.value = serveArray.content;
+    }
+  }
+});
 </script>
 
 <style lang="scss" scoped>

+ 12 - 1
src/pages/serveConfigSelect.vue

@@ -24,6 +24,10 @@
             <div v-if="item.id != radiovalue" style="margin: auto 0 auto 0; height: 100%" @click="deleteRadio(index)">
               <u-icon name="close" color="#a0a4af" size="14"></u-icon>
             </div>
+
+            <div v-if="item.id == radiovalue" style="margin: auto 0 auto 0; height: 100%" @click="editRadio(index)">
+              <u-icon name="arrow-right" color="#a0a4af" size="14"></u-icon>
+            </div>
           </div>
         </u-radio-group>
       </div>
@@ -91,6 +95,14 @@ function deleteRadio(index) {
   proxy.$tab.redirectTo("/pages/serveConfigSelect"); //重载当前页
 }
 
+/**
+ * @编辑
+ * @按钮点击事件
+ */
+function editRadio(index) {
+  proxy.$tab.navigateTo("/pages/serveConfig?index=" + index);
+}
+
 /**
  * @扫一扫
  * @按钮点击事件
@@ -159,7 +171,6 @@ function navigateTo() {
  */
 function init() {
   let serveList = uni.getStorageSync("serveList");
-  console.log(serveList);
   if (serveList.length > 0) {
     radiolist.value = serveList[0].radiolist;
     radiovalue.value = serveList[0].radiovalue;

+ 7 - 3
src/permission.js

@@ -11,9 +11,13 @@ const whiteList = [
   "/pages/serveConfigSelect",
   "/pages/common/textview/index1",
   "/pages/common/webview/index",
-  "/pages/business/mhxf/unitInfoCollection/index",
-  "/pages/common/invoicing/index",
-  "/pages/common/success/index"
+  "/pages/business/mhxf/unitInfoCollection/index",//单位信息采集
+  "/pages/common/invoicing/index",//开票管理
+  "/pages/common/success/index",//成功
+  "/pages/common/phoneVerify/index",//手机号验证
+  "/pages/common/repairReport/index",//报修申请
+  "/pages/common/repairReport/record",//报修历史
+  "/pages/common/evaluate/record",//服务评价
 ];
 
 // 检查地址白名单

+ 22 - 0
src/plugins/common.plugins.js

@@ -147,4 +147,26 @@ export default {
     }
     return fmt;
   },
+
+  /**
+   * @数组对象去重
+   * @methods data 需要去重的数据
+   * @methods objectName 需要去重的对象名称
+   */
+  uniq(data, objectName) {
+    if (!objectName) {
+      var newArr = [...new Set(data)]
+
+      return newArr;
+    } else {
+      let obj = {};
+
+      let peon = data.reduce((cur, next) => {
+        obj[next[objectName]] ? "" : obj[next[objectName]] = true && cur.push(next);
+        return cur;
+      }, []) //设置cur默认类型为数组,并且初始值为空的数组
+
+      return peon;
+    }
+  }
 };

+ 2 - 2
src/plugins/modal.plugins.js

@@ -25,9 +25,9 @@ export default {
     uni.hideToast();
   },
   // 弹出提示
-  alert(content) {
+  alert(title, content) {
     uni.showModal({
-      title: "提示",
+      title: title,
       content: content,
       showCancel: false,
       mask: true,

+ 8 - 3
src/static/iconfont/iconfont.css

@@ -1,8 +1,8 @@
 @font-face {
   font-family: "iconfont"; /* Project id 3620854 */
-  src: url("https://at.alicdn.com/t/c/font_3620854_kdcp7gpqqz.woff2?t=1691730084858") format("woff2"), 
-       url("https://at.alicdn.com/t/c/font_3620854_kdcp7gpqqz.woff?t=1691730084858") format("woff"),
-       url("https://at.alicdn.com/t/c/font_3620854_kdcp7gpqqz.ttf?t=1691730084858") format("truetype");
+  src: url("https://at.alicdn.com/t/c/font_3620854_k0vl6lrxxy.woff2?t=1693536081618") format("woff2"),
+       url("https://at.alicdn.com/t/c/font_3620854_k0vl6lrxxy.woff?t=1693536081618") format("woff"),
+       url("https://at.alicdn.com/t/c/font_3620854_k0vl6lrxxy.ttf?t=1693536081618") format("truetype");
 }
 
 .iconfont {
@@ -13,6 +13,10 @@
   -moz-osx-font-smoothing: grayscale;
 }
 
+.ucicon-zhiwen:before {
+  content: "\e74f";
+}
+
 .ucicon-position:before {
   content: "\e618";
 }
@@ -232,3 +236,4 @@
 .ucicon-eye-close:before {
   content: "\e8ff";
 }
+

BIN
src/static/iconfont/iconfont.ttf


+ 65 - 105
src/static/scss/index.scss

@@ -19,112 +19,72 @@
     box-shadow: 1px 1px 4px rgb(26 26 26 / 10%)
 }
 
-//padding-0
-.padding-t-0 {
-    padding-top: 0px;
-}
-
-.padding-b-0 {
-    padding-bottom: 0px
-}
-
-.padding-l-0 {
-    padding-left: 0px;
-}
-
-.padding-r-0 {
-    padding-right: 0px
-}
-
-.padding-lr-0 {
-    padding-left: 0px;
-    padding-right: 0px
-}
-
-.padding-tb-0 {
-    padding-top: 0px;
-    padding-bottom: 0px
-}
-
-//padding-10
-.padding-10 {
-    padding: 10px;
-}
-
-.padding-tb-10 {
-    padding-top: 10px;
-    padding-bottom: 10px
-}
-
-//padding-15
-.padding-15 {
-    padding: 15px;
-}
-
-.padding-t-15 {
-    padding-top: 15px;
-}
-
-.padding-r-15 {
-    padding-right: 15px
-}
-
-.padding-l-15 {
-    padding-left: 15px;
-}
-
-.padding-b-15 {
-    padding-bottom: 15px
-}
-
-.padding-lr-15 {
-    padding-left: 15px;
-    padding-right: 15px
-}
-
-.padding-tb-15 {
-    padding-top: 15px;
-    padding-bottom: 15px
-}
-
-//margin-0
-.margin-t-0 {
-    margin-top: 0px;
-}
-
-.margin-lr-0 {
-    margin-left: 0px;
-    margin-right: 0px
-}
-
-//margin-10
-.margin-b-10 {
-    margin-bottom: 10px
-}
-
-.margin-l-10 {
-    margin-left: 10px;
-}
-
-.margin-r-10 {
-    margin-right: 10px;
-}
-
-//margin-15
-.margin-t-15 {
-    margin-top: 15px
-}
-
-.margin-l-15 {
-    margin-left: 15px;
-}
-
-.margin-r-15 {
-    margin-right: 15px;
-}
 
-.margin-b-15 {
-    margin-bottom: 15px
+/* 外边距、内边距全局样式
+------------------------------- */
+@for $i from 0 through 100 {
+
+    // margin
+    .m#{$i} {
+        margin: #{$i}px !important;
+    }
+
+    .mt#{$i} {
+        margin-top: #{$i}px !important;
+    }
+
+    .mr#{$i} {
+        margin-right: #{$i}px !important;
+    }
+
+    .mb#{$i} {
+        margin-bottom: #{$i}px !important;
+    }
+
+    .ml#{$i} {
+        margin-left: #{$i}px !important;
+    }
+
+    .mlr#{$i} {
+        margin-left: #{$i}px !important;
+        margin-right: #{$i}px !important;
+    }
+
+    .mtb#{$i} {
+        margin-top: #{$i}px !important;
+        margin-bottom: #{$i}px !important;
+    }
+
+    // padding
+    .p#{$i} {
+        padding: #{$i}px !important;
+    }
+
+    .pt#{$i} {
+        padding-top: #{$i}px !important;
+    }
+
+    .pr#{$i} {
+        padding-right: #{$i}px !important;
+    }
+
+    .pb#{$i} {
+        padding-bottom: #{$i}px !important;
+    }
+
+    .pl#{$i} {
+        padding-left: #{$i}px !important;
+    }
+
+    .plr#{$i} {
+        padding-left: #{$i}px !important;
+        padding-right: #{$i}px !important;
+    }
+
+    .ptb#{$i} {
+        padding-top: #{$i}px !important;
+        padding-bottom: #{$i}px !important;
+    }
 }
 
 .text-ellipsis {

+ 33 - 31
src/static/scss/public.scss

@@ -214,41 +214,45 @@ uni-input {
 }
 
 
-//APP底部安全距离
-.app-padding-bottom {
-  padding-bottom: calc(constant(safe-area-inset-bottom) + 20px + 40px) !important;
-  padding-bottom: calc(env(safe-area-inset-bottom) + 20px + 40px) !important;
-}
+//公共按钮样式
+.app-button {
 
-//公共按钮绝对定位
-.app-button-fixed {
-  position: fixed;
-  left: 0;
-  right: 0;
-  bottom: 0;
-  padding: 10px 15px 10px 15px;
-  background-color: #fff;
-  box-shadow: 0px 0px 15px 0 rgba(0, 0, 0, 0.1);
-  z-index: 50;
-
-  .app-buttom {
-    display: block;
-    width: 100%;
-    height: 40px;
-    font-size: 14px;
-    //#ifdef APP-PLUS || MP-WEIXIN
-    margin-bottom: constant(safe-area-inset-bottom);
-    margin-bottom: env(safe-area-inset-bottom);
-    //#endif
+  //按钮底部安全距离
+  &-padding {
+    padding-bottom: calc(constant(safe-area-inset-bottom) + 20px + 40px) !important;
+    padding-bottom: calc(env(safe-area-inset-bottom) + 20px + 40px) !important;
   }
 
-  .app-flex {
-    display: flex;
+  //公共按钮绝对定位
+  &-fixed {
+    position: fixed;
+    left: 0;
+    right: 0;
+    bottom: 0;
+    padding: 10px 15px 10px 15px;
+    background-color: #fff;
+    box-shadow: 0px 0px 15px 0 rgba(0, 0, 0, 0.1);
+    z-index: 50;
 
     .app-buttom {
-      width: 50%;
+      display: block;
+      width: 100%;
       height: 40px;
       font-size: 14px;
+      //#ifdef APP-PLUS || MP-WEIXIN
+      margin-bottom: constant(safe-area-inset-bottom);
+      margin-bottom: env(safe-area-inset-bottom);
+      //#endif
+    }
+
+    .app-flex {
+      display: flex;
+
+      .app-buttom {
+        width: 50%;
+        height: 40px;
+        font-size: 14px;
+      }
     }
   }
 }
@@ -257,7 +261,7 @@ uni-input {
 .app-scan-fixed {
   position: fixed;
   right: 0;
-  bottom: 50px
+  bottom: 80px;
 }
 
 //公共scroll-view样式
@@ -278,8 +282,6 @@ uni-input {
   margin-top: -20px;
   z-index: 50;
 
-
-
   .info {
     padding: 10px;
 

+ 20 - 19
src/store/modules/setting.js

@@ -1,7 +1,6 @@
 
 import { defineStore } from "pinia";
 import storage from "@/utils/storage";
-import constant from "@/utils/constant";
 import modal from "@/plugins/modal.plugins.js";
 import tab from "@/plugins/tab.plugins.js";
 import setting from "@/plugins/setting.plugins.js";
@@ -12,21 +11,17 @@ import { uploadAvatar, updateUserProfile } from "@/api/system/user";
 const settingStore = defineStore("setting", {
     state: () => ({
         currentSize: "",//APP缓存
-
-        themeColor: storage.get(constant.themeColor),//主题
-
         barHeight: 0,//微信小程序顶部安全距离
         webViewHeight: "",//webView整体高度-铺满
-        StatusBar: 0,//app顶部安全距离
-        tabBarHeight: "",//app底部安全距离
-        barHightTop: "",//app头部计算距离
+        StatusBar: 0,//APP顶部安全距离
+        tabBarHeight: "",//APP底部安全距离
+        barHightTop: "",//APP头部计算距离
 
+        themeColor: storage.get("themeColor"),//主题
+        fingerprintUserList: storage.get("fingerprintUserList"),//指纹登录用户数据
     }),
     persist: {
-        // 自定义数据持久化方式
-        // key: 'store-key', 指定key进行存储,此时非key的值不会持久化,刷新就会丢失
         storage: window ? window.localStorage : uni.setStorageSync(), // 指定换成地址
-        // paths: ['nested.data'],// 指定需要持久化的state的路径名称
         beforeRestore: (context) => {
             console.log("Before" + context);
         },
@@ -108,13 +103,21 @@ const settingStore = defineStore("setting", {
          * @清理缓存
          */
         handleCleanTmp() {
+            const useStore = useStores();
+
             // #ifdef H5
-            modal.showToast("H5暂不支持此功能");
+            uni.showToast({
+                title: "缓存清理完成",
+                duration: 2000,
+                mask: true,
+            });
             // #endif
 
             // #ifdef APP-PLUS
-            setting.clearCache();
+            setting.clearCache();//清除应用访问缓存
             // #endif
+
+            uni.removeStorageSync(useStore.$state.nickName + useStore.$state.tenantId);//清除首页宫格缓存
         },
 
         /**
@@ -131,7 +134,6 @@ const settingStore = defineStore("setting", {
             tab.navigateTo("/pages/mine/secure/index");
         },
 
-
         /**
          * @设置
          */
@@ -139,8 +141,6 @@ const settingStore = defineStore("setting", {
             tab.navigateTo("/pages/mine/setting/index");
         },
 
-
-
         /**
          * @退出登录
          */
@@ -153,7 +153,6 @@ const settingStore = defineStore("setting", {
             });
         },
 
-
         /**
          * @点击头像
          */
@@ -187,12 +186,14 @@ const settingStore = defineStore("setting", {
             });
         },
 
-
         SET_THEMECOLOR(themeColor) {
-            // storage.get(constant.name)
             this.themeColor = themeColor;
-            storage.set(constant.themeColor, themeColor);
+            storage.set("themeColor", themeColor);
         },
+        SET_FINGERPRINT(array) {
+            this.fingerprintUserList = array;
+            storage.set("fingerprintUserList", array);
+        }
     },
 });
 

+ 86 - 26
src/store/modules/user.js

@@ -1,30 +1,35 @@
 import storage from "@/utils/storage";
-import constant from "@/utils/constant";
-import { login, logout, getInfo, getMobileTenantConfig } from "@/api/login";
-import { getUserProfile } from "@/api/system/user";
 import { getToken, setToken, removeToken } from "@/utils/auth";
 import { defineStore } from "pinia";
+// 接口引用
+import { login, logout, getInfo, getMobileTenantConfig, getCodeImg } from "@/api/login";
+import { getUserProfile } from "@/api/system/user";
+// 组件引用
 import modal from "@/plugins/modal.plugins.js";
 
 const useStores = defineStore("useStores", {
   state: () => ({
     token: getToken(),
-    name: storage.get(constant.name),//用户名称
-    phonenumber: storage.get(constant.phonenumber),//用户手机号
-    avatar: storage.get(constant.avatar),
-    roles: storage.get(constant.roles),
-    permissions: storage.get(constant.permissions),
-
-    loginTitle: storage.get(constant.loginTitle),
-    loginBottomTitle: storage.get(constant.loginFooter),
-    loginBg: storage.get(constant.loginBackUrl),
-    loginLogo: storage.get(constant.loginLogo),
-    tenantId: storage.get(constant.tenantId),
+    name: storage.get("name"),//用户名称
+    nickName: storage.get("nickName"),//用户昵称
+    phonenumber: storage.get("phonenumber"),//用户手机号
+    avatar: storage.get("avatar"),
+    roles: storage.get("roles"),
+    permissions: storage.get("permissions"),
+
+    loginTitle: storage.get("loginTitle"),
+    loginBottomTitle: storage.get("loginBottomTitle"),
+    loginBg: storage.get("loginBg"),
+    loginLogo: storage.get("loginLogo"),
+    tenantId: storage.get("tenantId"),
 
     user: {},
     userArr: {},
     postGroup: "", //岗位
     roleGroup: "", //角色
+
+    codeTime: 0,//验证码倒计时
+    codeTimeInterval: null,//验证码倒计时定时器
   }),
   persist: {
     // 自定义数据持久化方式
@@ -97,7 +102,8 @@ const useStores = defineStore("useStores", {
               this.SET_ROLES(["ROLE_DEFAULT"]);
             }
 
-            this.SET_NAME(data.user.nickName);
+            this.SET_NAME(data.user.userName);
+            this.SET_NICKNAME(data.user.nickName);
             this.SET_PHONE(data.user.phonenumber);
             this.SET_AVATAR(data.user.avatar);
 
@@ -110,6 +116,57 @@ const useStores = defineStore("useStores", {
       });
     },
 
+    /**
+     * @获取手机验证码
+     * @param { 手机号 } phone 
+     * @param { 成功 } success 
+     * @param { 失败 } error 
+     */
+    GetCodeImg({ phone, success, error }) {
+      if (!phone) {
+        modal.msg("请输入手机号码");
+        return;
+      }
+      if (!/^1(?:3\d|4[4-9]|5[0-35-9]|6[67]|7[013-8]|8\d|9\d)\d{8}$/.test(phone)) {
+        modal.msg("请输入正确的手机号码");
+        return;
+      }
+
+      if (this.codeTime > 0) {
+        modal.msg("不能重复获取");
+        return;
+      } else {
+        modal.loading("加载中");
+        getCodeImg({
+          phone: phone,
+        }).then((res) => {
+          if (res.status === "SUCCESS") {
+            success(res)
+            modal.closeLoading();
+          } else {
+            error(res)
+          }
+        });
+
+        this.codeTime = 60;
+        this.SetInterval("codeTime");
+      }
+    },
+
+    // 手机验证码倒计时定时器
+    SetInterval(key) {
+      if (this.codeTimeInterval) {
+        clearInterval(this.codeTimeInterval);
+      }
+      this.codeTimeInterval = setInterval(() => {
+        this[key]--;
+        if (this[key] < 1) {
+          clearInterval(this.codeTimeInterval);
+          this[key] = 0;
+        }
+      }, 1000);
+    },
+
     // 退出系统
     LogOut() {
       return new Promise((resolve, reject) => {
@@ -141,41 +198,44 @@ const useStores = defineStore("useStores", {
     },
     SET_NAME(name) {
       this.name = name;
-      storage.set(constant.name, name);
+      storage.set("name", name);
+    },
+    SET_NICKNAME(nickName) {
+      this.nickName = nickName;
+      storage.set("nickName", nickName);
     },
     SET_PHONE(phonenumber) {
       this.phonenumber = phonenumber;
-      storage.set(constant.phonenumber, phonenumber);
+      storage.set("phonenumber", phonenumber);
     },
     SET_AVATAR(avatar) {
       this.avatar = avatar;
-      storage.set(constant.avatar, avatar);
+      storage.set("avatar", avatar);
     },
     SET_ROLES(roles) {
       this.roles = roles;
-      storage.set(constant.roles, roles);
+      storage.set("roles", roles);
     },
     SET_PERMISSIONS(permissions) {
       this.permissions = permissions;
-      storage.set(constant.permissions, permissions);
+      storage.set("permissions", permissions);
     },
-
     SET_LOGINMOBILELIST(loginMobileList) {
       //title
       this.loginTitle = loginMobileList.loginTitle
-      storage.set(constant.loginTitle, loginMobileList.loginTitle);
+      storage.set("loginTitle", loginMobileList.loginTitle);
       //bottomTitle
       this.loginBottomTitle = loginMobileList.loginBottomTitle
-      storage.set(constant.loginBottomTitle, loginMobileList.loginBottomTitle);
+      storage.set("loginBottomTitle", loginMobileList.loginBottomTitle);
       //bg
       this.loginBg = loginMobileList.loginBg
-      storage.set(constant.loginBg, loginMobileList.loginBg);
+      storage.set("loginBg", loginMobileList.loginBg);
       //logo
       this.loginLogo = loginMobileList.loginLogo
-      storage.set(constant.loginLogo, loginMobileList.loginLogo);
+      storage.set("loginLogo", loginMobileList.loginLogo);
       //tenantId
       this.tenantId = loginMobileList.tenantId
-      storage.set(constant.tenantId, loginMobileList.tenantId);
+      storage.set("tenantId", loginMobileList.tenantId);
     }
   },
 });

+ 0 - 16
src/utils/constant.js

@@ -1,16 +0,0 @@
-const constant = {
-  avatar: 'vuex_avatar',
-  name: 'vuex_name',
-  roles: 'vuex_roles',
-  permissions: 'vuex_permissions',
-
-  loginTitle: 'vuex_loginTitle',
-  loginBottomTitle: 'vuex_loginBottomTitle',
-  loginBg: 'vuex_loginBg',
-  loginLogo: 'vuex_loginLogo',
-  tenantId: 'vuex_tenantId',
-
-  themeColor: 'vuex_themeColor'
-}
-
-export default constant

+ 51 - 61
src/utils/request.js

@@ -6,8 +6,55 @@ import common from "@/plugins/common.plugins";
 
 let timeout = 10000;
 
-const request = (config) => {
+/**
+ * @校验结果方法
+ * @param {数据集} res 
+ * @param {结果抛出} resolve 
+ * @param {控制台打印} reject 
+ */
+function verification(res, resolve, reject) {
   const useStore = useStores();
+  const data = typeof res.data === "string" ? JSON.parse(res.data) : res.data;
+  const code = data.code || 200;
+
+  if (code === 401) {
+    // modal.confirm("登录状态已过期,您可以继续留在该页面,或者重新登录?").then((res) => {
+    //   if (res) {
+    //     useStore.LogOut().then((res) => {
+    //       uni.reLaunch({ url: "/pages/login" });
+    //     });
+    //   }
+    // });
+
+    uni.reLaunch({ url: "/pages/login" });
+    modal.closeLoading();
+    reject("无效的会话,或者会话已过期,请重新登录。");
+  } else if (code === 404 || res.statusCode === 404) {
+    if (data.msg.indexOf(":") !== -1) {
+      modal.msg(data.msg.split(":")[1]);
+      reject(data.msg.split(":")[1]);
+    } else {
+      modal.msg(data.msg);
+      reject(data.msg);
+    }
+    modal.closeLoading();
+  } else if (code === 500 || res.statusCode === 500) {
+    if (data.msg.indexOf(":") !== -1) {
+      modal.msg(data.msg.split(":")[1]);
+      reject(data.msg.split(":")[1]);
+    } else {
+      modal.msg(data.msg);
+      reject(data.msg);
+    }
+    modal.closeLoading();
+  } else if (code !== 200 && code !== "0") {
+    reject(code);
+  }
+  resolve(data);
+}
+
+const request = (config) => {
+
   // 是否需要设置 token
   const isToken = (config.headers || {}).isToken === false;
   config.header = config.header || {};
@@ -30,47 +77,13 @@ const request = (config) => {
         header: config.header,
         dataType: "json",
       })
-      .then((response) => {
-        let res = response;
+      .then((res) => {
         if (res.error) {
           modal.msg("后端接口连接异常");
           reject("后端接口连接异常");
           return;
         }
-        const code = res.data.code || 200;
-
-        if (code === 401) {
-          modal.confirm("登录状态已过期,您可以继续留在该页面,或者重新登录?").then((res) => {
-            if (res) {
-              useStore.LogOut().then((res) => {
-                uni.reLaunch({ url: "/pages/login" });
-              });
-            }
-          });
-          modal.closeLoading();
-          reject("无效的会话,或者会话已过期,请重新登录。");
-        } else if (code === 404 || res.statusCode === 404) {
-          if (res.data.msg.indexOf(":") !== -1) {
-            modal.msg(res.data.msg.split(":")[1]);
-            reject(res.data.msg.split(":")[1]);
-          } else {
-            modal.msg(res.data.msg);
-            reject(res.data.msg);
-          }
-          modal.closeLoading();
-        } else if (code === 500 || res.statusCode === 500) {
-          if (res.data.msg.indexOf(":") !== -1) {
-            modal.msg(res.data.msg.split(":")[1]);
-            reject(res.data.msg.split(":")[1]);
-          } else {
-            modal.msg(res.data.msg);
-            reject(res.data.msg);
-          }
-          modal.closeLoading();
-        } else if (code !== 200 && code !== "0") {
-          reject(code);
-        }
-        resolve(res.data);
+        verification(res, resolve, reject);//调用校验结果方法
       })
       .catch((error) => {
         let { message } = error;
@@ -111,30 +124,7 @@ const uploads = (config) => {
       header: config.header,
       formData: config.formData,
       success: (res) => {
-        let result = JSON.parse(res.data);
-        const code = result.code || 200;
-        if (code === 200) {
-          resolve(result);
-        } else if (code == 401) {
-          modal.confirm("登录状态已过期,您可以继续留在该页面,或者重新登录?").then((res) => {
-            if (res) {
-              useStore.LogOut().then((res) => {
-                uni.reLaunch({ url: "/pages/login" });
-              });
-            }
-          });
-          reject("无效的会话,或者会话已过期,请重新登录。");
-        } else if (code === 500 || res.statusCode === 500) {
-          if (res.data.msg.indexOf(":") !== -1) {
-            modal.msg(res.data.msg.split(":")[1]);
-            reject(res.data.msg.split(":")[1]);
-          } else {
-            modal.msg(res.data.msg);
-            reject(res.data.msg);
-          }
-        } else if (code !== 200 && code !== "0") {
-          reject(code);
-        }
+        verification(res, resolve, reject);//调用校验结果方法
       },
       fail: (error) => {
         let { message } = error;

+ 4 - 23
src/utils/storage.js

@@ -1,34 +1,15 @@
-import constant from './constant'
-
 // 存储变量名
 let storageKey = 'storage_data'
 
-// 存储节点变量名
-let storageNodeKeys = [
-  constant.avatar,
-  constant.name,
-  constant.phonenumber,
-  constant.roles,
-  constant.permissions,
-  constant.loginTitle,
-  constant.loginBottomTitle,
-  constant.loginBg,
-  constant.loginLogo,
-  constant.tenantId,
-  constant.themeColor
-]
-
 // 存储的数据
 let storageData = uni.getStorageSync(storageKey) || {}
 
 const storage = {
   set: function (key, value) {
-    if (storageNodeKeys.indexOf(key) != -1) {
-      let tmp = uni.getStorageSync(storageKey)
-      tmp = tmp ? tmp : {}
-      tmp[key] = value
-      uni.setStorageSync(storageKey, tmp)
-    }
+    let tmp = uni.getStorageSync(storageKey)
+    tmp = tmp ? tmp : {}
+    tmp[key] = value
+    uni.setStorageSync(storageKey, tmp)
   },
   get: function (key) {
     return storageData[key] || ""

+ 2 - 1
uniCloud-aliyun/cloudfunctions/uniPushMessage/index.js

@@ -9,7 +9,8 @@ exports.main = async (event, context) => {
 		"title": obj.title, // 标题  
 		"content": obj.content, // 内容  
 		"payload": obj.payload, // 数据
-		// "force_notification": true, //填写true,客户端就会对在线消息自动创建“通知栏消息”。  
+		"getui_big_data_tag": obj.getui_big_data_tag, //根据条件筛选设备推送
+		// "force_notification": true, //填写true,客户端就会对在线消息自动创建“通知栏消息”。
 		"request_id": obj.request_id, //请求唯一标识号,10-32位之间;如果request_id重复,会导致消息丢失  
 		"options": obj.options, //消息分类,没申请可以不传这个参数  
 	})