Sfoglia il codice sorgente

倒计时/保修申请/报修历史/服务评价/手机号验证(功能模块完成)

fanghuisheng 1 anno fa
parent
commit
6030fe3f04

+ 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,
+    });
+}

+ 29 - 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
+          }
         }
       ]
     },
@@ -195,10 +224,6 @@
           "path": "avatar/index",
           "style": {
             "navigationBarTitleText": "修改头像"
-            // "app-plus": {
-            //   "bounce": "none",
-            //   "titleNView": false
-            // }
           }
         },
         {

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

@@ -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=提交成功`);
     }
   });
 }

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

@@ -382,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}`);
           }
         });
       })

+ 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>

+ 2 - 10
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>
@@ -301,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>
 
@@ -701,7 +694,6 @@ const {
 const uForm = ref(null);
 const uForm1 = ref(null);
 const newCompanyName = ref("");
-const successBool = ref(false);
 const scanBool = ref(false);
 
 /**
@@ -859,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: "提交成功",

+ 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>

+ 1 - 1
src/pages/common/invoicing/index.vue

@@ -336,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=提交成功");
               }
             });
           }

+ 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>
 

+ 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) => {});

+ 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>

+ 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",//服务评价
 ];
 
 // 检查地址白名单

+ 58 - 2
src/store/modules/user.js

@@ -1,8 +1,10 @@
 import storage from "@/utils/storage";
-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", {
@@ -25,6 +27,9 @@ const useStores = defineStore("useStores", {
     userArr: {},
     postGroup: "", //岗位
     roleGroup: "", //角色
+
+    codeTime: 0,//验证码倒计时
+    codeTimeInterval: null,//验证码倒计时定时器
   }),
   persist: {
     // 自定义数据持久化方式
@@ -111,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) => {