cz 1 rok temu
rodzic
commit
cb96849d6d

+ 3 - 0
.env.staging

@@ -10,6 +10,9 @@ VUE_APP_ENV = 'staging'
 # 若依管理系统/生产环境
 VUE_APP_WS_API = ':20010/test-api'
 
+# 若依管理系统/生产环境
+VUE_APP_BASE_API = '/test-api'
+
 
 # 是否在打包时开启压缩,支持 gzip 和 brotli
 VUE_APP_COMPRESS = gzip

+ 58 - 45
public/index.html

@@ -1,47 +1,60 @@
 <!DOCTYPE html>
 <html lang="" class="has-bottombar">
-  <head>
-    <meta charset="utf-8" />
-    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
-    <meta name="viewport" content="width=device-width,initial-scale=1.0" />
-    <meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0;" name="viewport" />
-    <link rel="icon" href="<%= BASE_URL %>favicon.ico" />
-    <title><%= htmlWebpackPlugin.options.title %></title>
-    <meta name="wpk-bid" content="dta_2_131175" />
-    <script>
-      var isDingtalk = navigator && /DingTalk/.test(navigator.userAgent);
-      var isProductEnv =
-        window &&
-        window.location &&
-        window.location.host &&
-        window.location.host.indexOf("127.0.0.1") === -1 &&
-        window.location.host.indexOf("localhost") === -1 &&
-        window.location.host.indexOf("192.168.") === -1;
-      // 如果有其它测试域名,请一起排掉,减少测试环境对生产环境监控的干扰
-      if (isProductEnv) {
-        !(function (c, i, e, b) {
-          var h = i.createElement("script");
-          var f = i.getElementsByTagName("script")[0];
-          h.type = "text/javascript";
-          h.crossorigin = true;
-          h.onload = function () {
-            c[b] || (c[b] = new c.wpkReporter({ bid: "dta_2_131175" }));
-            c[b].installAll();
-          };
-          f.parentNode.insertBefore(h, f);
-          h.src = e;
-        })(window, document, "https://g.alicdn.com/woodpeckerx/jssdk??wpkReporter.js", "__wpk");
-      }
-    </script>
-  </head>
-  <header>
-    
-  </header>
-  <body>
-    <noscript>
-      <strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
-    </noscript>
-    <div id="app"></div>
-    <!-- built files will be auto injected -->
-  </body>
-</html>
+
+<head>
+  <meta charset="utf-8" />
+  <meta http-equiv="X-UA-Compatible" content="IE=edge" />
+  <meta name="viewport" content="width=device-width,initial-scale=1.0" />
+  <meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0;" name="viewport" />
+  <link rel="icon" href="<%= BASE_URL %>favicon.ico" />
+  <title><%= htmlWebpackPlugin.options.title %></title>
+  <meta name="wpk-bid" content="dta_2_131175" />
+  <script>
+    var isDingtalk = navigator && /DingTalk/.test(navigator.userAgent);
+    var isProductEnv =
+      window &&
+      window.location &&
+      window.location.host &&
+      window.location.host.indexOf("127.0.0.1") === -1 &&
+      window.location.host.indexOf("localhost") === -1 &&
+      window.location.host.indexOf("192.168.") === -1;
+    // 如果有其它测试域名,请一起排掉,减少测试环境对生产环境监控的干扰
+    if (isProductEnv) {
+      !(function (c, i, e, b) {
+        var h = i.createElement("script");
+        var f = i.getElementsByTagName("script")[0];
+        h.type = "text/javascript";
+        h.crossorigin = true;
+        h.onload = function () {
+          c[b] || (c[b] = new c.wpkReporter({
+            bid: "dta_2_131175"
+          }));
+          c[b].installAll();
+        };
+        f.parentNode.insertBefore(h, f);
+        h.src = e;
+      })(window, document, "https://g.alicdn.com/woodpeckerx/jssdk??wpkReporter.js", "__wpk");
+    }
+  </script>
+  <!-- 引入uni-app sdk -->
+  <!-- <script type="text/javascript" src="https://unpkg.com/@dcloudio/uni-webview-js@0.0.3/index.js"></script> -->
+  <script type="text/javascript" src="./uni-webview.js"></script>
+
+  <!-- <script src="../src/hybrid_html_uni.webview.1.5.5.js"></script> -->
+  <!-- <script type="text/javascript"
+    src="https://gitcode.net/dcloud/hello-uni-app-x/-/blob/alpha/hybrid/html/uni.webview.1.5.5.js"></script> -->
+</head>
+<header>
+
+</header>
+
+<body>
+  <noscript>
+    <strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled.
+      Please enable it to continue.</strong>
+  </noscript>
+  <div id="app"></div>
+  <!-- built files will be auto injected -->
+</body>
+
+</html>

+ 193 - 0
public/uni-webview.js

@@ -0,0 +1,193 @@
+! function (e, n) {
+  "object" == typeof exports && "undefined" != typeof module ? module.exports = n() : "function" == typeof define && define.amd ? define(n) : (e = e || self).uni = n()
+}(this, (function () {
+  "use strict";
+  try {
+    var e = {};
+    Object.defineProperty(e, "passive", {
+      get: function () {
+        !0
+      }
+    }), window.addEventListener("test-passive", null, e)
+  } catch (e) {}
+  var n = Object.prototype.hasOwnProperty;
+
+  function i(e, i) {
+    return n.call(e, i)
+  }
+  var t = [];
+
+  function r() {
+    return window.__dcloud_weex_postMessage || window.__dcloud_weex_
+  }
+  var o = function (e, n) {
+      var i = {
+        options: {
+          timestamp: +new Date
+        },
+        name: e,
+        arg: n
+      };
+      if (r()) {
+        if ("postMessage" === e) {
+          var o = {
+            data: [n]
+          };
+          return window.__dcloud_weex_postMessage ? window.__dcloud_weex_postMessage(o) : window.__dcloud_weex_.postMessage(JSON.stringify(o))
+        }
+        var a = {
+          type: "WEB_INVOKE_APPSERVICE",
+          args: {
+            data: i,
+            webviewIds: t
+          }
+        };
+        window.__dcloud_weex_postMessage ? window.__dcloud_weex_postMessageToService(a) : window.__dcloud_weex_.postMessageToService(JSON.stringify(a))
+      }
+      if (!window.plus) return window.parent.postMessage({
+        type: "WEB_INVOKE_APPSERVICE",
+        data: i,
+        pageId: ""
+      }, "*");
+      if (0 === t.length) {
+        var d = plus.webview.currentWebview();
+        if (!d) throw new Error("plus.webview.currentWebview() is undefined");
+        var s = d.parent(),
+          w = "";
+        w = s ? s.id : d.id, t.push(w)
+      }
+      if (plus.webview.getWebviewById("__uniapp__service")) plus.webview.postMessageToUniNView({
+        type: "WEB_INVOKE_APPSERVICE",
+        args: {
+          data: i,
+          webviewIds: t
+        }
+      }, "__uniapp__service");
+      else {
+        var u = JSON.stringify(i);
+        plus.webview.getLaunchWebview().evalJS('UniPlusBridge.subscribeHandler("'.concat("WEB_INVOKE_APPSERVICE", '",').concat(u, ",").concat(JSON.stringify(t), ");"))
+      }
+    },
+    a = {
+      navigateTo: function () {
+        var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {},
+          n = e.url;
+        o("navigateTo", {
+          url: encodeURI(n)
+        })
+      },
+      navigateBack: function () {
+        var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {},
+          n = e.delta;
+        o("navigateBack", {
+          delta: parseInt(n) || 1
+        })
+      },
+      switchTab: function () {
+        var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {},
+          n = e.url;
+        o("switchTab", {
+          url: encodeURI(n)
+        })
+      },
+      reLaunch: function () {
+        var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {},
+          n = e.url;
+        o("reLaunch", {
+          url: encodeURI(n)
+        })
+      },
+      redirectTo: function () {
+        var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {},
+          n = e.url;
+        o("redirectTo", {
+          url: encodeURI(n)
+        })
+      },
+      getEnv: function (e) {
+        r() ? e({
+          nvue: !0
+        }) : window.plus ? e({
+          plus: !0
+        }) : e({
+          h5: !0
+        })
+      },
+      postMessage: function () {
+        var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {};
+        o("postMessage", e.data || {})
+      }
+    },
+    d = /uni-app/i.test(navigator.userAgent),
+    s = /Html5Plus/i.test(navigator.userAgent),
+    w = /complete|loaded|interactive/;
+  var u = window.my && navigator.userAgent.indexOf(["t", "n", "e", "i", "l", "C", "y", "a", "p", "i", "l", "A"].reverse().join("")) > -1;
+  var g = window.swan && window.swan.webView && /swan/i.test(navigator.userAgent);
+  var v = window.qq && window.qq.miniProgram && /QQ/i.test(navigator.userAgent) && /miniProgram/i.test(navigator.userAgent);
+  var c = window.tt && window.tt.miniProgram && /toutiaomicroapp/i.test(navigator.userAgent);
+  var m = window.wx && window.wx.miniProgram && /micromessenger/i.test(navigator.userAgent) && /miniProgram/i.test(navigator.userAgent);
+  var p = window.qa && /quickapp/i.test(navigator.userAgent);
+  var f = window.ks && window.ks.miniProgram && /micromessenger/i.test(navigator.userAgent) && /miniProgram/i.test(navigator.userAgent);
+  var l = window.tt && window.tt.miniProgram && /Lark|Feishu/i.test(navigator.userAgent);
+  var _ = window.jd && window.jd.miniProgram && /micromessenger/i.test(navigator.userAgent) && /miniProgram/i.test(navigator.userAgent);
+  var E = window.xhs && window.xhs.miniProgram && /xhsminiapp/i.test(navigator.userAgent);
+  for (var h, P = function () {
+      window.UniAppJSBridge = !0, document.dispatchEvent(new CustomEvent("UniAppJSBridgeReady", {
+        bubbles: !0,
+        cancelable: !0
+      }))
+    }, b = [function (e) {
+      if (d || s) return window.__dcloud_weex_postMessage || window.__dcloud_weex_ ? document.addEventListener("DOMContentLoaded", e) : window.plus && w.test(document.readyState) ? setTimeout(e, 0) : document.addEventListener("plusready", e), a
+    }, function (e) {
+      if (m) return window.WeixinJSBridge && window.WeixinJSBridge.invoke ? setTimeout(e, 0) : document.addEventListener("WeixinJSBridgeReady", e), window.wx.miniProgram
+    }, function (e) {
+      if (v) return window.QQJSBridge && window.QQJSBridge.invoke ? setTimeout(e, 0) : document.addEventListener("QQJSBridgeReady", e), window.qq.miniProgram
+    }, function (e) {
+      if (u) {
+        document.addEventListener("DOMContentLoaded", e);
+        var n = window.my;
+        return {
+          navigateTo: n.navigateTo,
+          navigateBack: n.navigateBack,
+          switchTab: n.switchTab,
+          reLaunch: n.reLaunch,
+          redirectTo: n.redirectTo,
+          postMessage: n.postMessage,
+          getEnv: n.getEnv
+        }
+      }
+    }, function (e) {
+      if (g) return document.addEventListener("DOMContentLoaded", e), window.swan.webView
+    }, function (e) {
+      if (c) return document.addEventListener("DOMContentLoaded", e), window.tt.miniProgram
+    }, function (e) {
+      if (p) {
+        window.QaJSBridge && window.QaJSBridge.invoke ? setTimeout(e, 0) : document.addEventListener("QaJSBridgeReady", e);
+        var n = window.qa;
+        return {
+          navigateTo: n.navigateTo,
+          navigateBack: n.navigateBack,
+          switchTab: n.switchTab,
+          reLaunch: n.reLaunch,
+          redirectTo: n.redirectTo,
+          postMessage: n.postMessage,
+          getEnv: n.getEnv
+        }
+      }
+    }, function (e) {
+      if (f) return window.WeixinJSBridge && window.WeixinJSBridge.invoke ? setTimeout(e, 0) : document.addEventListener("WeixinJSBridgeReady", e), window.ks.miniProgram
+    }, function (e) {
+      if (l) return document.addEventListener("DOMContentLoaded", e), window.tt.miniProgram
+    }, function (e) {
+      if (_) return window.JDJSBridgeReady && window.JDJSBridgeReady.invoke ? setTimeout(e, 0) : document.addEventListener("JDJSBridgeReady", e), window.jd.miniProgram
+    }, function (e) {
+      if (E) return window.xhs.miniProgram
+    }, function (e) {
+      return document.addEventListener("DOMContentLoaded", e), a
+    }], y = 0; y < b.length && !(h = b[y](P)); y++);
+  h || (h = {});
+  var B = "undefined" != typeof uni ? uni : {};
+  if (!B.navigateTo)
+    for (var S in h) i(h, S) && (B[S] = h[S]);
+  return B.webView = h, B
+}));

+ 33 - 0
src/components/TitleInfo/index.vue

@@ -0,0 +1,33 @@
+<template>
+  <div style="background: #fff; padding-left: 10px;">
+    <div class="_title">
+      <div class="line"></div>
+      <div> {{ title }}</div>
+    </div>
+  </div>
+</template>
+
+<script setup>
+import { defineProps } from "vue";
+defineProps({
+  title: String,
+});
+</script>
+
+<style lang="scss" scoped>
+._title {
+  display: flex;
+  align-items: center;
+  font-size: 15px;
+  font-weight: 700;
+  line-height: 36px;
+  // border-bottom: 1px solid #000;
+
+  .line {
+    width: 4px;
+    background-color: #0084ff;
+    height: 15px;
+    margin-right: 8px;
+  }
+}
+</style>

+ 253 - 262
src/components/testForm/index.vue

@@ -1,37 +1,22 @@
 <template>
   <div>
-    <van-form
-      @submit="onSubmit"
-      :disabled="formOption.disabled"
-      :readonly="formOption.readonly"
-      :label-width="formOption.labelWidth"
-      :label-align="formOption.labelAlign || 'top'"
-      :scroll-to-error="formOption.scroll"
-      ref="testForm">
+    <van-form @submit="onSubmit" :disabled="formOption.disabled" :readonly="formOption.readonly" :label-width="formOption.labelWidth"
+              :label-align="formOption.labelAlign || 'top'" :scroll-to-error="formOption.scroll" ref="testForm">
       <van-cell-group inset>
         <div v-for="(i, index) in formConfig" :key="index" :style="i.style || ''">
-          <van-field v-if="i.type == 'title'" style="background: #ecebeb">
+          <van-field v-if="i.type == 'title'" style="border-bottom:1px solid #0084ff;width:45%">
             <template #input>
               <div class="_title">
-                {{ i.title }}
+                <div class="line"></div>
+                <div> {{ i.title }}</div>
               </div>
             </template>
           </van-field>
-          <van-field
-            v-if="i.type == 'input'"
-            v-model="formData[i.prop]"
-            :label="i.label"
-            :name="i.prop"
-            :type="i.itemType ? i.itemType : 'text'"
-            :placeholder="i.placeholder ? i.placeholder : '请输入'"
-            :clearable="i.clearable ? i.clearable : false"
-            :readonly="getFieldReadonly(i)"
-            :rules="getRules(i)"
-            :required="getRequired(i)"
-            :right-icon="i.isNeedRightBtn ? i.rightIcon : ''"
-            @click-right-icon="i.isNeedRightBtn ? i.rightIconClick() : () => {}"
-            @blur="i.isNeedBlurMethon ? i.blurMethon(formData[i.prop]) : () => {}"
-            @input="
+          <van-field v-if="i.type == 'input'" v-model="formData[i.prop]" :label="i.label" :name="i.prop" :type="i.itemType ? i.itemType : 'text'"
+                     :placeholder="i.placeholder ? i.placeholder : '请输入'" :clearable="i.clearable ? i.clearable : false"
+                     :readonly="getFieldReadonly(i)" :rules="getRules(i)" :required="getRequired(i)" :right-icon="i.isNeedRightBtn ? i.rightIcon : ''"
+                     @click-right-icon="i.isNeedRightBtn ? i.rightIconClick() : () => {}"
+                     @blur="i.isNeedBlurMethon ? i.blurMethon(formData[i.prop]) : () => {}" @input="
               () => {
                 return i.inputFn ? i.inputFn(formData[i.prop]) : () => {};
               }
@@ -60,84 +45,41 @@
             </template>
           </van-field>
           <!-- 单选 -->
-          <van-field
-            v-if="i.type == 'picker' && i.itemType == 'onePicker'"
-            v-show="!i.showStatus"
-            :label="i.label"
-            :name="i.prop"
-            v-model="formData[i.prop + 'Name']"
-            is-link
-            :readonly="true"
-            :placeholder="i.placeholder ? i.placeholder : '请选择'"
-            @click="() => (formOption.readonly || i.readonly ? '' : (i.showPicker = true))"
-            :rules="getRules(i)"
-            :required="getRequired(i)">
+          <van-field v-if="i.type == 'picker' && i.itemType == 'onePicker'" v-show="!i.showStatus" :label="i.label" :name="i.prop"
+                     v-model="formData[i.prop + 'Name']" is-link :readonly="true" :placeholder="i.placeholder ? i.placeholder : '请选择'"
+                     @click="() => (formOption.readonly || i.readonly ? '' : (i.showPicker = true))" :rules="getRules(i)" :required="getRequired(i)">
           </van-field>
           <van-popup v-model:show="i.showPicker" round position="bottom" v-if="i.type == 'picker' && i.itemType == 'onePicker'">
-            <van-picker
-              :columns="i.data"
-              :columns-field-names="i.fieldNames ? i.fieldNames : onePickerFieldNames"
-              @cancel="i.showPicker = false"
-              @confirm="(option) => (i.changeFn ? i.changeFn(option, i, index) : onConfirmPicker(option, i, index))" />
+            <van-picker :columns="i.data" :columns-field-names="i.fieldNames ? i.fieldNames : onePickerFieldNames" @cancel="i.showPicker = false"
+                        @confirm="(option) => (i.changeFn ? i.changeFn(option, i, index) : onConfirmPicker(option, i, index))" />
           </van-popup>
           <!-- 多选 -->
-          <van-field
-            v-if="i.type == 'multipleChoice' && i.itemType == 'multiple'"
-            v-show="!i.showStatus"
-            :label="i.label"
-            :name="i.prop"
-            v-model="formData[i.prop + 'Name']"
-            is-link
-            :readonly="true"
-            :placeholder="i.placeholder ? i.placeholder : '请选择'"
-            @click="() => (!formOption.readonly ? (i.showPicker = true) : '')"
-            :rules="getRules(i)"
-            :required="getRequired(i)">
+          <van-field v-if="i.type == 'multipleChoice' && i.itemType == 'multiple'" v-show="!i.showStatus" :label="i.label" :name="i.prop"
+                     v-model="formData[i.prop + 'Name']" is-link :readonly="true" :placeholder="i.placeholder ? i.placeholder : '请选择'"
+                     @click="() => (!formOption.readonly ? (i.showPicker = true) : '')" :rules="getRules(i)" :required="getRequired(i)">
           </van-field>
-          <van-popup
-            v-model:show="i.showPicker"
-            round
-            position="bottom"
-            :style="{ height: '40%' }"
-            v-if="i.type == 'multipleChoice' && i.itemType == 'multiple'">
-            <van-checkbox-group v-model="formData[i.prop]" @change="changeCheckboxGroup(formData, i.prop, i.data, i.fieldNames)" class="multipleChoice">
+          <van-popup v-model:show="i.showPicker" round position="bottom" :style="{ height: '40%' }"
+                     v-if="i.type == 'multipleChoice' && i.itemType == 'multiple'">
+            <van-checkbox-group v-model="formData[i.prop]" @change="changeCheckboxGroup(formData, i.prop, i.data, i.fieldNames)"
+                                class="multipleChoice">
               <van-checkbox v-for="item in i.data" :key="item.value" :name="item.value">{{ item.text }}</van-checkbox>
             </van-checkbox-group>
           </van-popup>
           <!-- 时间选择器 -->
-          <van-field
-            v-if="i.type == 'picker' && i.itemType == 'datePicker'"
-            :label="i.label"
-            :name="i.prop"
-            v-model="formData[i.prop]"
-            is-link
-            :readonly="true"
-            :placeholder="i.placeholder ? i.placeholder : '请选择'"
-            @click="() => (!formOption.readonly ? (i.showPicker = true) : '')"
-            :rules="getRules(i)"
-            :required="getRequired(i)">
+          <van-field v-if="i.type == 'picker' && i.itemType == 'datePicker'" :label="i.label" :name="i.prop" v-model="formData[i.prop]" is-link
+                     :readonly="true" :placeholder="i.placeholder ? i.placeholder : '请选择'"
+                     @click="() => (!formOption.readonly ? (i.showPicker = true) : '')" :rules="getRules(i)" :required="getRequired(i)">
           </van-field>
           <van-popup v-model:show="i.showPicker" round position="bottom" v-if="i.type == 'picker' && i.itemType == 'datePicker'">
-            <van-date-picker
-              @confirm="(option) => onConfirmPicker(option, i, index)"
-              @cancel="i.showPicker = false"
-              :min-date="i.minDate"
-              :max-date="i.maxDate"
-              :columns-type="i.columnsType" />
+            <van-date-picker @confirm="(option) => onConfirmPicker(option, i, index)" @cancel="i.showPicker = false" :min-date="i.minDate"
+                             :max-date="i.maxDate" :columns-type="i.columnsType" />
           </van-popup>
           <!-- 时间选择器 带时分秒 -->
 
-          <van-field
-            v-if="i.type == 'picker' && i.itemType == 'datePickerTime'"
-            :label="i.label"
-            :name="i.prop"
-            v-model="formData[i.prop]"
-            is-link
-            :readonly="true"
-            :placeholder="i.placeholder ? i.placeholder : '请选择'"
-            @click="() => (!formOption.readonly ? (i.needDefault ? defaultTimeFn(i, index) : (i.showPicker = true)) : '')"
-            :rules="getRules(i)"
-            :required="getRequired(i)">
+          <van-field v-if="i.type == 'picker' && i.itemType == 'datePickerTime'" :label="i.label" :name="i.prop" v-model="formData[i.prop]" is-link
+                     :readonly="true" :placeholder="i.placeholder ? i.placeholder : '请选择'"
+                     @click="() => (!formOption.readonly ? (i.needDefault ? defaultTimeFn(i, index) : (i.showPicker = true)) : '')"
+                     :rules="getRules(i)" :required="getRequired(i)">
           </van-field>
           <van-popup v-model:show="i.showPicker" round position="bottom" v-if="i.type == 'picker' && i.itemType == 'datePickerTime'">
             <van-picker-group :tabs="['日期', '时间']" @confirm="() => datePickerTimeConfirm(i, index)" @cancel="i.showPicker = false">
@@ -146,52 +88,29 @@
             </van-picker-group>
           </van-popup>
           <!-- 级联 城市 -->
-          <van-field
-            v-if="i.type == 'cascader' && i.itemType == 'city'"
-            :label="i.label"
-            :name="i.prop"
-            v-model="formData[i.prop + 'Name']"
-            is-link
-            :readonly="true"
-            :placeholder="i.placeholder ? i.placeholder : '请选择'"
-            @click="() => (!formOption.readonly ? (i.showPicker = true) : '')"
-            :rules="getRules(i)"
-            :required="getRequired(i)" />
+          <van-field v-if="i.type == 'cascader' && i.itemType == 'city'" :label="i.label" :name="i.prop" v-model="formData[i.prop + 'Name']" is-link
+                     :readonly="true" :placeholder="i.placeholder ? i.placeholder : '请选择'"
+                     @click="() => (!formOption.readonly ? (i.showPicker = true) : '')" :rules="getRules(i)" :required="getRequired(i)" />
           <van-popup v-if="i.type == 'cascader' && i.itemType == 'city'" v-model:show="i.showPicker" round position="bottom">
-            <van-cascader
-              v-model="formData[i.prop]"
-              :title="i.title ? i.title : '请选择'"
-              :options="cityOption"
-              @close="i.showPicker = false"
-              @change="(option) => cityOnChange(option, i, index)"
-              @finish="(option) => (i.finishFn ? i.finishFn(option) : () => (i.showPicker = false))" />
+            <van-cascader v-model="formData[i.prop]" :title="i.title ? i.title : '请选择'" :options="cityOption" @close="i.showPicker = false"
+                          @change="(option) => cityOnChange(option, i, index)"
+                          @finish="(option) => (i.finishFn ? i.finishFn(option) : () => (i.showPicker = false))" />
           </van-popup>
           <!-- 级联 公共 -->
-          <van-field
-            v-if="i.type == 'cascader' && i.itemType == 'common'"
-            :label="i.label"
-            :name="i.prop"
-            v-model="formData[i.prop + 'Name']"
-            is-link
-            :readonly="true"
-            :placeholder="i.placeholder ? i.placeholder : '请选择'"
-            @click="() => (!formOption.readonly ? (i.showPicker = true) : '')"
-            :rules="getRules(i)"
-            :required="getRequired(i)" />
+          <van-field v-if="i.type == 'cascader' && i.itemType == 'common'" :label="i.label" :name="i.prop" v-model="formData[i.prop + 'Name']" is-link
+                     :readonly="true" :placeholder="i.placeholder ? i.placeholder : '请选择'"
+                     @click="() => (!formOption.readonly ? (i.showPicker = true) : '')" :rules="getRules(i)" :required="getRequired(i)" />
           <van-popup v-if="i.type == 'cascader' && i.itemType == 'common'" v-model:show="i.showPicker" round position="bottom">
-            <van-cascader
-              v-model="formData[i.prop]"
-              :title="i.title ? i.title : '请选择'"
-              :options="i.data"
-              :field-names="i.fieldNames ? i.fieldNames : fieldNames"
-              @close="i.showPicker = false"
-              @change="(option) => commonOnChange(option, i, index)"
-              @finish="(option) => (i.finishFn ? i.finishFn(i, option) : handleCommonFinish(index))" />
+            <van-cascader v-model="formData[i.prop]" :title="i.title ? i.title : '请选择'" :options="i.data"
+                          :field-names="i.fieldNames ? i.fieldNames : fieldNames" @close="i.showPicker = false"
+                          @change="(option) => commonOnChange(option, i, index)"
+                          @finish="(option) => (i.finishFn ? i.finishFn(i, option) : handleCommonFinish(index))" />
           </van-popup>
           <!-- 文件上传 -->
           <van-field name="uploader" v-if="i.type == 'upload'" :label="i.label" :readonly="i.readonly ? true : false">
             <template #input>
-              <van-uploader v-model="formData[i.prop]" :after-read="afterRead" multiple :max-count="9" :max-size="5 * 1024 * 1024" @oversize="onOversize" />
+              <van-uploader v-model="formData[i.prop]" :after-read="afterRead" multiple :max-count="9" :max-size="5 * 1024 * 1024"
+                            @oversize="onOversize" />
             </template>
           </van-field>
           <!-- 插槽 -->
@@ -208,48 +127,25 @@
       <van-cell-group inset v-for="(item, index) in formData[btnConfigCopy.prop]" :key="index">
         <div class="row">
           <div>{{ btnConfigCopy.listTitle || "明细" }}{{ index + 1 }}</div>
-          <van-button
-            plain
-            type="primary"
-            @click="handleRemove(index, btnConfigCopy)"
-            size="mini"
-            style="border: none; background: #ecebeb"
-            :disabled="formOption.readonly"
-            v-if="formOption.btnConfig !== undefined && formOption.btnConfig.isNeed"
-            >删除</van-button
-          >
+          <van-button plain type="primary" @click="handleRemove(index, btnConfigCopy)" size="mini" style="border: none; background: #ecebeb"
+                      :disabled="formOption.readonly" v-if="formOption.btnConfig !== undefined && formOption.btnConfig.isNeed">删除</van-button>
         </div>
         <!-- 循环表单数据 -->
         <div v-for="(i, sonIndex) in btnConfigCopy.listConfig" :key="i.prop">
-          <van-field
-            v-if="i.type == 'input'"
-            v-model="formData[btnConfigCopy.prop][index][i.prop]"
-            :label="i.label"
-            :name="i.prop"
-            :type="i.itemType ? i.itemType : 'text'"
-            :placeholder="i.placeholder ? i.placeholder : '请输入'"
-            :clearable="i.clearable ? i.clearable : false"
-            :readonly="getFieldReadonly(i)"
-            :rules="getRules(i)"
-            :required="getRequired(i)"
-            @change="
+          <van-field v-if="i.type == 'input'" v-model="formData[btnConfigCopy.prop][index][i.prop]" :label="i.label" :name="i.prop"
+                     :type="i.itemType ? i.itemType : 'text'" :placeholder="i.placeholder ? i.placeholder : '请输入'"
+                     :clearable="i.clearable ? i.clearable : false" :readonly="getFieldReadonly(i)" :rules="getRules(i)" :required="getRequired(i)"
+                     @change="
               (val) => {
                 return i.changeFn ? i.changeFn(index, val) : () => {};
               }
             ">
           </van-field>
           <!-- 单选 -->
-          <van-field
-            v-if="i.type == 'picker' && i.itemType == 'onePicker'"
-            :label="i.label"
-            :name="i.prop"
-            v-model="formData[btnConfigCopy.prop][index][i.prop + 'Name']"
-            is-link
-            :readonly="true"
-            :placeholder="i.placeholder ? i.placeholder : '请选择'"
-            @click="handleListItemClick(i, index, sonIndex)"
-            :rules="getRules(i)"
-            :required="getRequired(i)">
+          <van-field v-if="i.type == 'picker' && i.itemType == 'onePicker'" :label="i.label" :name="i.prop"
+                     v-model="formData[btnConfigCopy.prop][index][i.prop + 'Name']" is-link :readonly="true"
+                     :placeholder="i.placeholder ? i.placeholder : '请选择'" @click="handleListItemClick(i, index, sonIndex)" :rules="getRules(i)"
+                     :required="getRequired(i)">
             <template #input v-if="i.isShowScanCode">
               <div style="display: flex; height: 24px">
                 <div style="width: calc(100vw - 100px)">
@@ -262,54 +158,35 @@
             </template>
           </van-field>
           <!-- 时间选择器 -->
-          <van-field
-            v-if="i.type == 'picker' && i.itemType == 'datePicker'"
-            :label="i.label"
-            :name="i.prop"
-            v-model="formData[btnConfigCopy.prop][index][i.prop]"
-            is-link
-            :readonly="true"
-            :placeholder="i.placeholder ? i.placeholder : '请选择'"
-            @click="handleListItemClick(i, index, sonIndex)"
-            :rules="getRules(i)"
-            :required="getRequired(i)">
+          <van-field v-if="i.type == 'picker' && i.itemType == 'datePicker'" :label="i.label" :name="i.prop"
+                     v-model="formData[btnConfigCopy.prop][index][i.prop]" is-link :readonly="true"
+                     :placeholder="i.placeholder ? i.placeholder : '请选择'" @click="handleListItemClick(i, index, sonIndex)" :rules="getRules(i)"
+                     :required="getRequired(i)">
           </van-field>
         </div>
       </van-cell-group>
       <!-- 单独写个循环,保证弹窗唯一 -->
       <div v-for="(item, index) in btnConfigCopy.listConfig" :key="index">
         <van-popup v-model:show="item.showPicker" round position="bottom" v-if="item.type == 'picker' && item.itemType == 'onePicker'">
-          <van-picker
-            :columns="item.data"
-            :columns-field-names="item.fieldNames ? item.fieldNames : onePickerFieldNames"
-            @cancel="item.showPicker = false"
-            @confirm="
+          <van-picker :columns="item.data" :columns-field-names="item.fieldNames ? item.fieldNames : onePickerFieldNames"
+                      @cancel="item.showPicker = false" @confirm="
               (option) => (item.changeFn ? item.changeFn(option, item, currentIndex, currentSonIndex, btnConfigCopy.prop) : onConfirmListPicker(option, item))
             " />
         </van-popup>
         <van-popup v-model:show="item.showPicker" round position="bottom" v-if="item.type == 'picker' && item.itemType == 'datePicker'">
-          <van-date-picker
-            @confirm="(option) => onConfirmListPicker(option, item)"
-            @cancel="item.showPicker = false"
-            :min-date="item.minDate"
-            :max-date="item.maxDate"
-            :columns-type="item.columnsType" />
+          <van-date-picker @confirm="(option) => onConfirmListPicker(option, item)" @cancel="item.showPicker = false" :min-date="item.minDate"
+                           :max-date="item.maxDate" :columns-type="item.columnsType" />
         </van-popup>
       </div>
 
       <!-- 按钮 -->
       <div class="btn-box" v-if="formOption.btnConfig !== undefined && formOption.btnConfig.isNeed">
-        <van-button
-          :plain="btnConfigCopy.plain ? btnConfigCopy.plain : false"
-          :type="btnConfigCopy.itemType ? btnConfigCopy.itemType : 'primary'"
-          :size="btnConfigCopy.size ? btnConfigCopy.size : 'small'"
-          style="width: 100%; border: none"
-          @click="handlePush()">
+        <van-button :plain="btnConfigCopy.plain ? btnConfigCopy.plain : false" :type="btnConfigCopy.itemType ? btnConfigCopy.itemType : 'primary'"
+                    :size="btnConfigCopy.size ? btnConfigCopy.size : 'small'" style="width: 100%; border: none" @click="handlePush()">
           <template #icon>
             <van-icon :name="btnConfigCopy.icon ? btnConfigCopy.icon : 'plus'" :size="12" />
           </template>
-          {{ btnConfigCopy.btnName ? btnConfigCopy.btnName : "添加" }}</van-button
-        >
+          {{ btnConfigCopy.btnName ? btnConfigCopy.btnName : "添加" }}</van-button>
       </div>
       <div style="margin: 16px" v-show="!formOption.hiddenSubmitBtn">
         <van-button round block type="primary" native-type="submit">
@@ -328,7 +205,15 @@
 <script setup>
 import { showLoadingToast, closeToast, showNotify } from "vant";
 import { formatDate } from "@/utils/auth";
-import { ref, getCurrentInstance, onMounted, reactive, computed, toRefs, watch } from "vue";
+import {
+  ref,
+  getCurrentInstance,
+  onMounted,
+  reactive,
+  computed,
+  toRefs,
+  watch,
+} from "vue";
 const props = defineProps({
   modelValue: {
     type: Object,
@@ -369,12 +254,22 @@ const handleOtherBtnClick = () => {
 
 // 获取验证规则
 const getRules = (i) => {
-  if (rules.value.hasOwnProperty(i.prop) && rules.value[i.prop] && !getFieldReadonly(i) && !formOption.readonly) {
+  if (
+    rules.value.hasOwnProperty(i.prop) &&
+    rules.value[i.prop] &&
+    !getFieldReadonly(i) &&
+    !formOption.readonly
+  ) {
     return rules.value[i.prop];
   }
 };
 const getRequired = (i) => {
-  if (rules.value.hasOwnProperty(i.prop) && rules.value[i.prop] && !getFieldReadonly(i) && !formOption.readonly) {
+  if (
+    rules.value.hasOwnProperty(i.prop) &&
+    rules.value[i.prop] &&
+    !getFieldReadonly(i) &&
+    !formOption.readonly
+  ) {
     return true;
   }
   return false;
@@ -422,14 +317,20 @@ const recursionFn = (arr, val, valueAtt, childrenAtt) => {
 };
 const selectDataEcho = (item, val) => {
   if (item.type === "picker" && item.itemType === "onePicker") {
-    const textAtt = item.fieldNames ? item.fieldNames.text : onePickerFieldNames.text;
-    const valueAtt = item.fieldNames ? item.fieldNames.value : onePickerFieldNames.value;
+    const textAtt = item.fieldNames
+      ? item.fieldNames.text
+      : onePickerFieldNames.text;
+    const valueAtt = item.fieldNames
+      ? item.fieldNames.value
+      : onePickerFieldNames.value;
     const current = item.data.find((x) => x[valueAtt] === val);
     return current ? current[textAtt] : "";
   } else if (item.type === "cascader" && item.itemType === "common") {
     const textAtt = item.fieldNames ? item.fieldNames.text : fieldNames.text;
     const valueAtt = item.fieldNames ? item.fieldNames.value : fieldNames.value;
-    const childrenAtt = item.fieldNames ? item.fieldNames.children : fieldNames.children;
+    const childrenAtt = item.fieldNames
+      ? item.fieldNames.children
+      : fieldNames.children;
     const arr = item.data ? item.data : [];
     const current = recursionFn(arr, val, valueAtt, childrenAtt);
     return current ? current[textAtt] : "";
@@ -445,7 +346,11 @@ const formDataListShowLabel = () => {
       const jele = btnConfigCopy.listConfig[j];
       if (jele.type === "picker" && jele.itemType !== "datePicker") {
         if (jele.data && jele.data.length > 0) {
-          formData.value[btnConfigCopy.prop][i][jele.prop + "Name"] = selectDataEcho(jele, formData.value[btnConfigCopy.prop][i][jele.prop]);
+          formData.value[btnConfigCopy.prop][i][jele.prop + "Name"] =
+            selectDataEcho(
+              jele,
+              formData.value[btnConfigCopy.prop][i][jele.prop]
+            );
         } else {
           if (callListNum.value <= 3) {
             setTimeout(() => {
@@ -465,7 +370,11 @@ const formDataListShowLabelOne = () => {
       const jele = btnConfigCopy.listConfig[j];
       if (jele.type === "picker" && jele.itemType !== "datePicker") {
         if (jele.data && jele.data.length > 0) {
-          formData.value[btnConfigCopy.prop][i][jele.prop + "Name"] = selectDataEcho(jele, formData.value[btnConfigCopy.prop][i][jele.prop]);
+          formData.value[btnConfigCopy.prop][i][jele.prop + "Name"] =
+            selectDataEcho(
+              jele,
+              formData.value[btnConfigCopy.prop][i][jele.prop]
+            );
         }
       }
     }
@@ -477,7 +386,10 @@ const formDataShowLabel = () => {
     const element = formConfig.value[i];
     if (element.type === "picker" && element.itemType !== "datePicker") {
       if (element.data && element.data.length > 0) {
-        formData.value[element.prop + "Name"] = selectDataEcho(element, formData.value[element.prop]);
+        formData.value[element.prop + "Name"] = selectDataEcho(
+          element,
+          formData.value[element.prop]
+        );
       } else {
         if (callNum.value <= 3) {
           setTimeout(() => {
@@ -489,7 +401,10 @@ const formDataShowLabel = () => {
       }
     } else if (element.type === "cascader" && element.itemType === "common") {
       if (element.data && element.data.length > 0) {
-        formData.value[element.prop + "Name"] = selectDataEcho(element, formData.value[element.prop]);
+        formData.value[element.prop + "Name"] = selectDataEcho(
+          element,
+          formData.value[element.prop]
+        );
       } else {
         if (callNum.value <= 3) {
           setTimeout(() => {
@@ -508,11 +423,17 @@ const formDataShowLabelOne = () => {
     const element = formConfig.value[i];
     if (element.type === "picker" && element.itemType !== "datePicker") {
       if (element.data && element.data.length > 0) {
-        formData.value[element.prop + "Name"] = selectDataEcho(element, formData.value[element.prop]);
+        formData.value[element.prop + "Name"] = selectDataEcho(
+          element,
+          formData.value[element.prop]
+        );
       }
     } else if (element.type === "cascader" && element.itemType === "common") {
       if (element.data && element.data.length > 0) {
-        formData.value[element.prop + "Name"] = selectDataEcho(element, formData.value[element.prop]);
+        formData.value[element.prop + "Name"] = selectDataEcho(
+          element,
+          formData.value[element.prop]
+        );
       }
     }
   }
@@ -530,7 +451,10 @@ const formDataInit = () => {
     upload: [],
   };
   // 判断是否需要按钮
-  if (formOption.value.btnConfig && Object.keys(formOption.value.btnConfig).length > 0) {
+  if (
+    formOption.value.btnConfig &&
+    Object.keys(formOption.value.btnConfig).length > 0
+  ) {
     btnConfigCopy = { ...formOption.value.btnConfig };
     if (formData.value[btnConfigCopy.prop] === undefined) {
       formData.value[btnConfigCopy.prop] = [];
@@ -540,11 +464,18 @@ const formDataInit = () => {
   let cityStatus = true;
   for (let i = 0; i < formConfig.value.length; i++) {
     const element = formConfig.value[i];
-    if (element.type === "cascader" && element.itemType === "city" && cityStatus) {
+    if (
+      element.type === "cascader" &&
+      element.itemType === "city" &&
+      cityStatus
+    ) {
       cityStatus = false;
       cityOptionInit();
     }
-    if (formData.value[element.prop] === undefined || formData.value[element.prop] === "") {
+    if (
+      formData.value[element.prop] === undefined ||
+      formData.value[element.prop] === ""
+    ) {
       if (element.type === "slot") {
         continue;
       } else if (element.type === "picker" || element.type === "cascader") {
@@ -568,12 +499,24 @@ const onConfirmPicker = (option, item, index) => {
   if (option.selectedOptions[0]) {
     switch (item.itemType) {
       case "onePicker": {
-        formData.value[item.prop + "Name"] = option.selectedOptions[0][item.fieldNames.text ? item.fieldNames.text : onePickerFieldNames.text];
-        formData.value[item.prop] = option.selectedOptions[0][item.fieldNames.value ? item.fieldNames.value : onePickerFieldNames.value];
+        formData.value[item.prop + "Name"] =
+          option.selectedOptions[0][
+            item.fieldNames.text
+              ? item.fieldNames.text
+              : onePickerFieldNames.text
+          ];
+        formData.value[item.prop] =
+          option.selectedOptions[0][
+            item.fieldNames.value
+              ? item.fieldNames.value
+              : onePickerFieldNames.value
+          ];
         formConfig.value[index].showPicker = false;
       }
       case "datePicker": {
-        formData.value[item.prop] = option.selectedValues.join(item.split ? item.split : "-");
+        formData.value[item.prop] = option.selectedValues.join(
+          item.split ? item.split : "-"
+        );
         formConfig.value[index].showPicker = false;
       }
     }
@@ -599,14 +542,23 @@ const handleListItemClick = (i, index, sonIndex) => {
 const onConfirmListPicker = (option, item) => {
   switch (item.itemType) {
     case "onePicker": {
-      formData.value[btnConfigCopy.prop][currentIndex.value][item.prop + "Name"] =
-        option.selectedOptions[0][item.fieldNames.text ? item.fieldNames.text : onePickerFieldNames.text];
+      formData.value[btnConfigCopy.prop][currentIndex.value][
+        item.prop + "Name"
+      ] =
+        option.selectedOptions[0][
+          item.fieldNames.text ? item.fieldNames.text : onePickerFieldNames.text
+        ];
       formData.value[btnConfigCopy.prop][currentIndex.value][item.prop] =
-        option.selectedOptions[0][item.fieldNames.value ? item.fieldNames.value : onePickerFieldNames.value];
+        option.selectedOptions[0][
+          item.fieldNames.value
+            ? item.fieldNames.value
+            : onePickerFieldNames.value
+        ];
       btnConfigCopy.listConfig[currentSonIndex.value].showPicker = false;
     }
     case "datePicker": {
-      formData.value[btnConfigCopy.prop][currentIndex.value][item.prop] = option.selectedValues.join(item.split ? item.split : "-");
+      formData.value[btnConfigCopy.prop][currentIndex.value][item.prop] =
+        option.selectedValues.join(item.split ? item.split : "-");
       btnConfigCopy.listConfig[currentSonIndex.value].showPicker = false;
     }
   }
@@ -629,55 +581,72 @@ const handleRemove = (index, item) => {
 // 拉去城市最近数据及处理
 const getAreaInfo = (selectedOptions, item, index) => {
   showLoadingToast("加载中...");
-  proxy.post("/customizeArea/list", { parentId: selectedOptions.value }).then((res) => {
-    let countryIndex = selectedOptions.selectedOptions[0].index;
-    let provinceIndex = selectedOptions.tabIndex === 1 ? selectedOptions.selectedOptions[1].index : null;
-    let cityIndex = selectedOptions.tabIndex === 2 ? selectedOptions.selectedOptions[2].index : null;
-    //已经没有下级数据
-    if (res.data.length === 0) {
-      if (selectedOptions.tabIndex === 1) {
-        formData.value[item.prop + "Name"] = selectedOptions.selectedOptions.map((item) => item.text).join(" ");
+  proxy
+    .post("/customizeArea/list", { parentId: selectedOptions.value })
+    .then((res) => {
+      let countryIndex = selectedOptions.selectedOptions[0].index;
+      let provinceIndex =
+        selectedOptions.tabIndex === 1
+          ? selectedOptions.selectedOptions[1].index
+          : null;
+      let cityIndex =
+        selectedOptions.tabIndex === 2
+          ? selectedOptions.selectedOptions[2].index
+          : null;
+      //已经没有下级数据
+      if (res.data.length === 0) {
+        if (selectedOptions.tabIndex === 1) {
+          formData.value[item.prop + "Name"] = selectedOptions.selectedOptions
+            .map((item) => item.text)
+            .join(" ");
+          formConfig.value[index].showPicker = false;
+          formData.value.cityObj = selectedOptions;
+          return;
+        }
+      }
+      if (selectedOptions.tabIndex === 2) {
+        formData.value[item.prop + "Name"] = selectedOptions.selectedOptions
+          .map((item) => item.text)
+          .join(" ");
         formConfig.value[index].showPicker = false;
         formData.value.cityObj = selectedOptions;
         return;
       }
-    }
-    if (selectedOptions.tabIndex === 2) {
-      formData.value[item.prop + "Name"] = selectedOptions.selectedOptions.map((item) => item.text).join(" ");
-      formConfig.value[index].showPicker = false;
-      formData.value.cityObj = selectedOptions;
-      return;
-    }
-    if (selectedOptions.tabIndex === 0) {
-      cityOption.value[countryIndex].children = res.data.map((item, index) => {
-        return {
-          ...item,
-          index: index,
-          text: item.name,
-          value: item.id,
-        };
-      });
-    } else if (selectedOptions.tabIndex === 1) {
-      cityOption.value[countryIndex].children[provinceIndex].children = res.data.map((item, index) => {
-        return {
-          ...item,
-          index: index,
-          text: item.name,
-          value: item.id,
-        };
-      });
-    } else if (selectedOptions.tabIndex === 2) {
-      cityOption.value[countryIndex].children[provinceIndex].children[cityIndex].children = res.data.map((item, index) => {
-        return {
-          ...item,
-          index: index,
-          text: item.name,
-          value: item.id,
-        };
-      });
-    }
-    closeToast();
-  });
+      if (selectedOptions.tabIndex === 0) {
+        cityOption.value[countryIndex].children = res.data.map(
+          (item, index) => {
+            return {
+              ...item,
+              index: index,
+              text: item.name,
+              value: item.id,
+            };
+          }
+        );
+      } else if (selectedOptions.tabIndex === 1) {
+        cityOption.value[countryIndex].children[provinceIndex].children =
+          res.data.map((item, index) => {
+            return {
+              ...item,
+              index: index,
+              text: item.name,
+              value: item.id,
+            };
+          });
+      } else if (selectedOptions.tabIndex === 2) {
+        cityOption.value[countryIndex].children[provinceIndex].children[
+          cityIndex
+        ].children = res.data.map((item, index) => {
+          return {
+            ...item,
+            index: index,
+            text: item.name,
+            value: item.id,
+          };
+        });
+      }
+      closeToast();
+    });
 };
 // 城市变动事件
 const cityOnChange = (options, item, index) => {
@@ -686,7 +655,8 @@ const cityOnChange = (options, item, index) => {
 
 const commonOnChange = ({ selectedOptions }, item, index) => {
   const textAtt = item.fieldNames ? item.fieldNames.text : fieldNames.text;
-  formData.value[item.prop + "Name"] = selectedOptions[selectedOptions.length - 1][textAtt];
+  formData.value[item.prop + "Name"] =
+    selectedOptions[selectedOptions.length - 1][textAtt];
 };
 const handleCommonFinish = (index) => {
   formConfig.value[index].showPicker = false;
@@ -777,7 +747,12 @@ watch(
 watch(
   () => formData.value[btnConfigCopy.prop],
   (val) => {
-    if (formOption.value.btnConfig !== undefined && !formOption.value.btnConfig.isNeed && val && val.length > 0) {
+    if (
+      formOption.value.btnConfig !== undefined &&
+      !formOption.value.btnConfig.isNeed &&
+      val &&
+      val.length > 0
+    ) {
       formDataListShowLabel();
     }
   }
@@ -801,12 +776,19 @@ const changeCheckboxGroup = (form, label, data, fieldNames) => {
 const datePickerDateArr = ref([]);
 const datePickerTimeArr = ref([]);
 const datePickerTimeConfirm = (item, index) => {
-  formData.value[item.prop] = datePickerDateArr.value.join("-") + " " + datePickerTimeArr.value.join(":");
+  formData.value[item.prop] =
+    datePickerDateArr.value.join("-") + " " + datePickerTimeArr.value.join(":");
   formConfig.value[index].showPicker = false;
 };
 const defaultTimeFn = (item, index) => {
-  datePickerDateArr.value = formatDate(new Date(formData.value[item.prop]), "yyyy-MM-dd").split("-");
-  datePickerTimeArr.value = formatDate(new Date(formData.value[item.prop]), "hh:mm:ss").split(":");
+  datePickerDateArr.value = formatDate(
+    new Date(formData.value[item.prop]),
+    "yyyy-MM-dd"
+  ).split("-");
+  datePickerTimeArr.value = formatDate(
+    new Date(formData.value[item.prop]),
+    "hh:mm:ss"
+  ).split(":");
   formConfig.value[index].showPicker = true;
 };
 const validateForm = async () => {
@@ -843,8 +825,17 @@ defineExpose({
   padding: 0 15px;
 }
 ._title {
+  display: flex;
+  align-items: center;
   font-size: 14px;
   font-weight: 700;
+  margin-left: -10px;
+  .line {
+    width: 4px;
+    background-color: #0084ff;
+    height: 15px;
+    margin-right: 8px;
+  }
 }
 ::v-deep {
   .multipleChoice {

+ 5 - 1
src/main.js

@@ -11,7 +11,8 @@ import {
   dictValueLabel,
   formChange,
   formChangeTwo,
-  deepClone
+  deepClone,
+  getFile
 } from "@/utils/util";
 import {
   handleTree
@@ -48,6 +49,9 @@ app.config.globalProperties.formChangeTwo = formChangeTwo;
 app.config.globalProperties.deepClone = deepClone;
 app.config.globalProperties.handleTree = handleTree;
 
+app.config.globalProperties.getFile = getFile;
+
+
 
 //pinia
 app.use(store);

+ 15 - 11
src/router/index.js

@@ -437,22 +437,26 @@ const routes = [{
 				name: '生产任务新增',
 				component: () => import('../views/MES/produce/task/add.vue')
 			},
-
 			{
-				path: 'reportWork',
+				path: 'productionReport',
 				name: '生产报工',
-				component: () => import('../views/MES/produceManage/reportWork/index.vue')
-			},
-			{
-				path: 'reportWorkAdd',
-				name: '生产报工新增',
-				component: () => import('../views/MES/produceManage/reportWork/add.vue')
+				component: () => import('../views/MES/productionReport/index.vue')
 			},
 			{
-				path: 'reportWorkDtl',
-				name: '生产报工详情',
-				component: () => import('../views/MES/produceManage/reportWork/details.vue')
+				path: 'productionReportAdd',
+				name: '生产报工添加',
+				component: () => import('../views/MES/productionReport/add.vue')
 			},
+			// {
+			// 	path: 'reportWorkAdd',
+			// 	name: '生产报工新增',
+			// 	component: () => import('../views/MES/produceManage/reportWork/add.vue')
+			// },
+			// {
+			// 	path: 'reportWorkDtl',
+			// 	name: '生产报工详情',
+			// 	component: () => import('../views/MES/produceManage/reportWork/details.vue')
+			// },
 			{
 				path: 'lineSide',
 				name: '线边管理',

+ 30 - 2
src/utils/util.js

@@ -1,4 +1,32 @@
-import { post, get } from "@/utils/axios";
+import {
+  post,
+  get
+} from "@/utils/axios";
+
+// businessIdList 业务id列表  dataSource 数据源  att  要对应的属性  fileAtt  要赋值的属性  filePathAtt  取第一张图片的属性
+export function getFile(businessIdList, dataSource, att = 'id', fileAtt = 'fileList', filePathAtt = '') {
+  if (businessIdList && businessIdList.length > 0 && dataSource && dataSource.length > 0) {
+    post("/fileInfo/getList", {
+      businessIdList,
+    }).then((res) => {
+      let data = res.data
+      for (let i = 0; i < dataSource.length; i++) {
+        const ele = dataSource[i];
+        for (const key in data) {
+          if (ele[att] == key && data[key] && data[key].length > 0) {
+            ele[fileAtt] = data[key]
+            if (filePathAtt) {
+              ele[filePathAtt] = data[key][0].fileUrl
+            }
+          }
+        }
+
+      }
+    });
+  }
+  return false
+}
+
 export function getDictOne(key) {
   return new Promise((resolve, reject) => {
     let dictObj = {};
@@ -131,4 +159,4 @@ export function deepClone(data) {
     return data;
   }
   return obj;
-}
+}

+ 21 - 65
src/views/MES/produce/task/add.vue

@@ -1,81 +1,33 @@
 <template>
   <div class="form" style="padding-bottom: 60px">
-    <van-nav-bar
-      :title="$t('task.name')"
-      :left-text="$t('common.back')"
-      left-arrow
-      @click-left="onClickLeft"
-    >
+    <van-nav-bar :title="$t('task.name')" :left-text="$t('common.back')" left-arrow @click-left="onClickLeft">
     </van-nav-bar>
     <van-form @submit="onSubmit" label-align="top" style="margin-top: 20px">
       <van-cell-group inset>
-        <van-field
-          v-model="formData.productionPlanIdName"
-          is-link
-          readonly
-          :label="$t('task.productionPlan')"
-          :placeholder="$t('task.selectProductionPlan')"
-          @click="typeModal = true"
-          :rules="[{ required: true, message: $t('task.productionPlanCanNotBeEmpty') }]"
-          required
-        />
+        <van-field v-model="formData.productionPlanIdName" is-link readonly :label="$t('task.productionPlan')"
+                   :placeholder="$t('task.selectProductionPlan')" @click="typeModal = true"
+                   :rules="[{ required: true, message: $t('task.productionPlanCanNotBeEmpty') }]" required />
         <van-popup v-model:show="typeModal" round position="bottom">
-          <van-picker
-            :columns="columns"
-            @cancel="typeModal = false"
-            @confirm="onConfirm"
-          />
+          <van-picker :columns="columns" @cancel="typeModal = false" @confirm="onConfirm" />
         </van-popup>
         <van-field v-model="formData.productName" readonly :label="$t('task.productName')" />
-        <van-field
-          v-model="formData.waitQuantity"
-          readonly
-          :label="$t('task.toBeProducedQuantity')"
-        />
+        <van-field v-model="formData.waitQuantity" readonly :label="$t('task.toBeProducedQuantity')" />
       </van-cell-group>
 
       <van-cell-group inset style="margin-top: 10px">
-        <van-field
-          v-model="formData.quantity"
-          :label="$t('task.taskQuantity')"
-          :placeholder="$t('task.pleaseEnterTheTaskQuantity')"
-          type="number"
-          :rules="[{ required: true, message: $t('task.taskQuantityCanNotBeEmpty') }]"
-          required
-        />
-        <van-field
-          v-model="formData.personLiableName"
-          is-link
-          readonly
-          :label="$t('task.principal')"
-          :placeholder="$t('task.selectPrincipal')"
-          @click="typeModalOne = true"
-          :rules="[{ required: true, message: $t('task.principalCanNotBeEmpty') }]"
-          required
-        />
+        <van-field v-model="formData.quantity" :label="$t('task.taskQuantity')" :placeholder="$t('task.pleaseEnterTheTaskQuantity')" type="number"
+                   :rules="[{ required: true, message: $t('task.taskQuantityCanNotBeEmpty') }]" required />
+        <van-field v-model="formData.personLiableName" is-link readonly :label="$t('task.principal')" :placeholder="$t('task.selectPrincipal')"
+                   @click="typeModalOne = true" :rules="[{ required: true, message: $t('task.principalCanNotBeEmpty') }]" required />
         <van-popup v-model:show="typeModalOne" round position="bottom">
-          <van-picker
-            :columns="columnsOne"
-            @cancel="typeModalOne = false"
-            @confirm="onConfirmOne"
-          />
+          <van-picker :columns="columnsOne" @cancel="typeModalOne = false" @confirm="onConfirmOne" />
         </van-popup>
 
-        <van-field
-          v-model="formData.dueDate"
-          is-link
-          readonly
-          :label="$t('task.completionDeadline')"
-          :placeholder="$t('task.selectCompletionDeadline')"
-          @click="showPicker = true"
-          :rules="[{ required: true, message: $t('task.completionDeadlineCanNotBeEmpty') }]"
-          required
-        />
+        <van-field v-model="formData.dueDate" is-link readonly :label="$t('task.completionDeadline')"
+                   :placeholder="$t('task.selectCompletionDeadline')" @click="showPicker = true"
+                   :rules="[{ required: true, message: $t('task.completionDeadlineCanNotBeEmpty') }]" required />
         <van-popup v-model:show="showPicker" position="bottom">
-          <van-date-picker
-            @confirm="onConfirmTime"
-            @cancel="showPicker = false"
-          />
+          <van-date-picker @confirm="onConfirmTime" @cancel="showPicker = false" />
         </van-popup>
       </van-cell-group>
 
@@ -164,10 +116,14 @@ const onClickLeft = () => history.back();
 
 const onSubmit = () => {
   if (Number(formData.value.quantity) > Number(formData.value.waitQuantity)) {
-    return showFailToast(proxy.$t("task.taskQuantityCanNotBeGreaterThanTheToBeProducedQuantity"));
+    return showFailToast(
+      proxy.$t("task.taskQuantityCanNotBeGreaterThanTheToBeProducedQuantity")
+    );
   }
   if (proxy.compareTime(formData.value.startDate, formData.value.dueDate)) {
-    return showFailToast(proxy.$t("task.completionDeadlineCanNotBeEarlierThanThePlanStartTime"));
+    return showFailToast(
+      proxy.$t("task.completionDeadlineCanNotBeEarlierThanThePlanStartTime")
+    );
   }
 
   proxy.post("/productionTask/add", formData.value).then(

+ 232 - 0
src/views/MES/productionReport/add.vue

@@ -0,0 +1,232 @@
+<template>
+  <div class="form" style="padding-bottom: 60px">
+    <van-nav-bar :title="'生产报工'" :left-text="$t('common.back')" left-arrow @click-left="onClickLeft">
+    </van-nav-bar>
+    <van-form @submit="onSubmit" label-align="top" style="margin-top: 20px">
+      <TitleInfo :title="'产品信息'"></TitleInfo>
+      <van-cell-group inset>
+        <van-field v-model="formData.productCode" readonly label="编码" />
+        <van-field v-model="formData.productName" readonly label="名称" />
+        <van-field v-model="formData.productSize" readonly label="尺寸cm" />
+        <van-field readonly label="产品图 / 设计图">
+          <template #input>
+            <div style="display:flex;">
+              <div style="margin-right:20px">
+                <img v-if="formData.productUrl" :src="formData.productUrl" alt="" class="pic"
+                     @click="onPreviewFile(formData.productImgName,formData.productUrl)">
+              </div>
+              <div>
+                <img v-if="formData.productUrlOne" :src="formData.productUrlOne" alt="" class="pic"
+                     @click="onPreviewFile(formData.productImgNameOne,formData.productUrlOne)">
+              </div>
+            </div>
+          </template>
+        </van-field>
+        <van-field v-model="formData.quantity" readonly label="数量" />
+      </van-cell-group>
+      <TitleInfo :title="'原材料信息'"></TitleInfo>
+      <van-cell-group inset>
+        <van-field v-model="formData.rawMaterialCode" readonly label="编码" />
+        <van-field v-model="formData.rawMaterialName" readonly label="名称" />
+        <van-field v-model="formData.materialSize" readonly label="尺寸cm" />
+      </van-cell-group>
+      <TitleInfo :title="'包材信息'"></TitleInfo>
+      <div style="padding:10px 10px;background:#fff">
+        <table border class="table">
+          <thead>
+            <tr>
+              <th style="width:90px;">编码</th>
+              <th style="min-width:100px">名称</th>
+              <th style="width:50px">数量</th>
+            </tr>
+          </thead>
+          <tbody v-if="formData.contractProductBomList && formData.contractProductBomList.length>0">
+            <tr v-for="item in formData.contractProductBomList" :key="item.id">
+              <td>{{item.productCode}}</td>
+              <td>{{item.productName}}</td>
+              <td>{{item.quantity}}</td>
+            </tr>
+          </tbody>
+        </table>
+      </div>
+      <TitleInfo :title="'报工'"></TitleInfo>
+      <van-cell-group inset>
+        <van-field v-model="formData.finishQuantity" readonly label="已报工数量" />
+        <van-field v-model="submitData.productionProcessesIdName" is-link label="工序" :placeholder="'请选择工序'" @click="showPicker = true"
+                   :rules="[{ required: true, message: '请选择工序'}]" required />
+        <van-field v-model="submitData.quantity" label="数量" :type="'digit'" />
+      </van-cell-group>
+      <van-popup v-model:show="showPicker" round position="bottom">
+        <van-picker :columns="columns" @cancel="showPicker = false" @confirm="onConfirm" />
+      </van-popup>
+      <div style="margin: 16px">
+        <van-button round block type="primary" native-type="submit">
+          提交
+        </van-button>
+      </div>
+    </van-form>
+  </div>
+</template>
+
+<script setup>
+import { ref, getCurrentInstance, onMounted } from "vue";
+import { showSuccessToast, showFailToast } from "vant";
+import { useRoute } from "vue-router";
+import TitleInfo from "@/components/TitleInfo/index.vue";
+
+const proxy = getCurrentInstance().proxy;
+const route = useRoute();
+const showPicker = ref(false);
+const formData = ref({
+  productName: "",
+  waitQuantity: "",
+  productionPlanId: "",
+  productionPlanIdName: "",
+  personLiableId: "",
+  personLiableName: "",
+  status: "",
+  quantity: "",
+  dueDate: "",
+});
+const submitData = ref({});
+
+const columns = ref([]);
+
+const getDict = () => {};
+
+const onConfirm = ({ selectedOptions }) => {
+  formData.value.finishQuantity = selectedOptions[0].finishQuantity;
+  submitData.value.productionProcessesId = selectedOptions[0].value;
+  submitData.value.productionProcessesIdName = selectedOptions[0].text;
+  showPicker.value = false;
+};
+
+const onClickLeft = () => history.back();
+
+const onSubmit = () => {
+  if (Number(submitData.value.quantity) < 1) {
+    return showFailToast("报工数量不能为0");
+  }
+  if (
+    Number(formData.value.finishQuantity) + Number(submitData.value.quantity) >
+    Number(formData.value.quantity)
+  ) {
+    return showFailToast("已报工数量加报工数量不可大于生产数量");
+  } else {
+    proxy.post("/productionReportingDetail/add", submitData.value).then(
+      (res) => {
+        setTimeout(() => {
+          showSuccessToast(proxy.$t("common.addSuccess"));
+          proxy.$router.push("/main/working");
+        }, 500);
+      },
+      (err) => {
+        return showFailToast(err.message);
+      }
+    );
+  }
+};
+const getDetail = () => {
+  proxy.post("/produceOrderDetail/detail", { id: route.query.id }).then(
+    (res) => {
+      submitData.value = {
+        productionTaskId: route.query.id,
+        productionProcessesId: "",
+        quantity: "",
+      };
+      columns.value = res.data.productionTaskProgressList.map((x) => ({
+        ...x,
+        text: x.progressName,
+        value: x.processesId,
+      }));
+      formData.value = res.data;
+      formData.value.productSize = `${res.data.productLength} * ${res.data.productWidth} * ${res.data.productHeight}`;
+      formData.value.materialSize = `${res.data.rawMaterialLength} * ${res.data.rawMaterialWidth} * ${res.data.rawMaterialHeight}`;
+      let ids = [formData.value.productId];
+      let idsOne = [formData.value.contractDetailId];
+
+      proxy
+        .post("/fileInfo/getList", {
+          businessIdList: ids,
+        })
+        .then((res) => {
+          if (res.data && res.data[formData.value.productId]) {
+            formData.value.productUrl =
+              res.data[formData.value.productId][0].fileUrl;
+            formData.value.productImgName =
+              res.data[formData.value.productId][0].fileName;
+          }
+        });
+      proxy
+        .post("/fileInfo/getList", {
+          businessIdList: idsOne,
+        })
+        .then((res) => {
+          if (res.data && res.data[formData.value.contractDetailId]) {
+            formData.value.productUrlOne =
+              res.data[formData.value.contractDetailId][0].fileUrl;
+            formData.value.productImgNameOne =
+              res.data[formData.value.contractDetailId][0].fileName;
+          }
+        });
+    },
+    (err) => {
+      onClickLeft();
+    }
+  );
+};
+onMounted(() => {
+  if (route.query && route.query.id) {
+    getDetail();
+  }
+  getDict();
+});
+
+const onPreviewFile = (name, url) => {
+  uni.postMessage({
+    data: {
+      type: "file",
+      url: url,
+      name: name,
+    },
+  });
+};
+</script>
+<style lang="scss" scoped>
+.row {
+  display: flex;
+  padding: 5px 10px 0 10px;
+  justify-content: space-between;
+  align-items: center;
+  .title {
+    flex: 1;
+  }
+  .delete {
+    width: 20px;
+    cursor: pointer;
+    text-align: center;
+  }
+}
+
+.table {
+  border-collapse: collapse;
+  border-spacing: 0;
+  width: 100%;
+  border-color: #ebeef5;
+  color: #606266;
+  thead tr th {
+    padding: 6px 0px 6px 4px;
+    text-align: left;
+  }
+  td {
+    text-align: left;
+    padding: 6px 0px 6px 4px;
+  }
+}
+.pic {
+  width: 50px;
+  height: 50px;
+  object-fit: contain;
+  vertical-align: middle;
+}
+</style>

+ 163 - 0
src/views/MES/productionReport/index.vue

@@ -0,0 +1,163 @@
+<template>
+  <div style="padding-bottom: 60px">
+    <van-nav-bar :title="'生产报工'" left-text="" left-arrow @click-left="onClickLeft" @click-right="handleScanCode">
+      <!-- <template #right> 扫码 </template> -->
+    </van-nav-bar>
+    <!-- <van-search v-model="req.keyword" :placeholder="$t('common.pleaseEnterKeywords')" @search="onRefresh" />
+
+    <van-pull-refresh v-model="loading" @refresh="onRefresh">
+      <div class="list">
+        <van-list v-model:loading="loading" :finished="finished" :finished-text="$t('common.noMore')" @load="onLoad" style="margin-bottom: 60px">
+          <commonList :data="listData" :config="listConfig" :showMore="false"></commonList>
+        </van-list>
+      </div>
+    </van-pull-refresh> -->
+    <div style="padding:20px">
+      <van-button type="success" style="width:100%;height:200px;font-size:36px" @click="handleScanCode">扫码</van-button>
+
+    </div>
+  </div>
+</template>
+<script setup>
+import { ref, getCurrentInstance, onMounted, nextTick } from "vue";
+import commonList from "@/components/common-list.vue";
+import { useRoute } from "vue-router";
+const loading = ref(false);
+const router = useRoute();
+const req = ref({
+  pageNum: 1,
+  keyword: null,
+});
+const finished = ref(false);
+const proxy = getCurrentInstance().proxy;
+const listData = ref([]);
+
+const listConfig = ref([
+  {
+    label: proxy.t("task.taskCode"),
+    prop: "code",
+  },
+  {
+    label: proxy.t("task.taskCode"),
+    prop: "productName",
+  },
+
+  {
+    label: proxy.t("task.productName"),
+    prop: "quantity",
+  },
+  {
+    label: proxy.t("task.taskQuantity"),
+    prop: "dueDate",
+  },
+  {
+    label: proxy.t("task.principal"),
+    prop: "personLiableName",
+  },
+]);
+const onRefresh = () => {
+  req.value.pageNum = 1;
+  finished.value = false;
+  getList("refresh");
+};
+const onLoad = () => {
+  // getList();
+};
+
+const onClickLeft = () => proxy.$router.push("/main/working");
+
+const onClickRight = () => {
+  proxy.$router.push("/main/taskAdd");
+};
+proxy.uploadDdRightBtn(onClickRight, proxy.t("common.add"));
+// const toDtl = (row) => {
+//   proxy.$router.push({
+//     path: "taskDtl",
+//     query: {
+//       id: row.id,
+//     },
+//   });
+// };
+
+const getList = (type) => {
+  loading.value = true;
+  proxy
+    .post("/productionTask/page", req.value)
+    .then((res) => {
+      // const data = res.data.rows.map((x) => ({
+      //   ...x,
+      //   time: x.startDate + " ~ " + x.stopDate,
+      //   statusName:
+      //     x.status == 0
+      //       ? "未开始"
+      //       : x.status == 1
+      //       ? "进行中"
+      //       : x.status == 2
+      //       ? "完成"
+      //       : "",
+      // }));
+      // if (type === "refresh") {
+      //   listData.value = data;
+      // } else {
+      //   listData.value = listData.value.concat(data);
+      // }
+      listData.value =
+        type === "refresh"
+          ? res.data.rows
+          : listData.value.concat(res.data.rows);
+      if (req.value.pageNum * 10 >= res.data.total) {
+        finished.value = true;
+      }
+      req.value.pageNum++;
+      loading.value = false;
+    })
+    .catch((err) => {
+      loading.value = false;
+    });
+};
+
+getList();
+
+const handleScanCode = () => {
+  // proxy.$router.push({
+  //   path: "/main/productionReportAdd",
+  //   query: {
+  //     id: "contract_flow",
+  //   },
+  // });
+  uni.postMessage({
+    data: {
+      type: "scanCode",
+    },
+  });
+};
+
+const showScanData = (val) => {
+  proxy.post("/productionTaskDetail/snInfo", { productSn: val }).then((res) => {
+    if (res.data && res.data.productId) {
+      formData.data.productId = res.data.productId;
+      formData.data.productSn = res.data.productSn;
+      formData.data.code = res.data.contractCode;
+      formData.data.productName = res.data.productName;
+      formData.data.productSpec = res.data.productSpec;
+      formData.data.customerName = res.data.customerName;
+    }
+  });
+};
+
+onMounted(() => {
+  nextTick(() => {
+    window.getVueMessage = (data) => {
+      if (data) {
+        showScanData(data);
+      }
+    };
+  });
+});
+</script>
+
+<style lang="scss" scoped>
+.list {
+  min-height: 70vh;
+}
+</style>

+ 69 - 55
src/views/working/index.vue

@@ -1,26 +1,22 @@
 <template>
   <div class="working">
-    <van-search
-      v-model="keyword"
-      :placeholder="$t('common.pleaseEnterKeywords')"
-      @update:model-value="searchFn"
-    />
+    <van-search v-model="keyword" :placeholder="$t('common.pleaseEnterKeywords')" @update:model-value="searchFn" />
     <van-swipe class="my-swipe" indicator-color="white" style="margin-top:10px">
       <van-swipe-item @click="toWinfaster">
         <img src="../../assets/images/banner1.png" alt="">
       </van-swipe-item>
       <van-swipe-item>2</van-swipe-item>
     </van-swipe>
-    
+
     <div class="card" v-if="keyword">
       <div class="title">{{$t('common.searchResults')}}</div>
       <ul>
         <li v-for="j in searchList" :key="j.path" @click="toRouter(j)" :style="colorRgb(j.background || '#0084FF',0.1)">
-          <div class="icon"  :style="colorRgb(j.background || '#0084FF',1)">
-            <i class="iconfont" :class="'icon-' + j.meta.icon" ></i>
-            
+          <div class="icon" :style="colorRgb(j.background || '#0084FF',1)">
+            <i class="iconfont" :class="'icon-' + j.meta.icon"></i>
+
           </div>
-          
+
           <div class="yuan" :style="colorRgb(j.background || '#0084FF',0.2)"></div>
           <div class="text">{{ j.meta.title }}</div>
         </li>
@@ -31,11 +27,11 @@
       <div class="title">{{ i.meta.title }}</div>
       <ul>
         <li v-for="j in i.children" :key="j.path" @click="toRouter(j)" :style="colorRgb(j.background || '#0084FF',0.1)">
-          <div class="icon"  :style="colorRgb(j.background || '#0084FF',1)">
-            <i class="iconfont" :class="'icon-' + j.meta.icon" ></i>
-            
+          <div class="icon" :style="colorRgb(j.background || '#0084FF',1)">
+            <i class="iconfont" :class="'icon-' + j.meta.icon"></i>
+
           </div>
-          
+
           <div class="yuan" :style="colorRgb(j.background || '#0084FF',0.2)"></div>
           <div class="text">{{ j.meta.title }}</div>
         </li>
@@ -44,13 +40,13 @@
   </div>
 </template>
 <script>
- export default {
-    name:'working'
- }
+export default {
+  name: "working",
+};
 </script>
 <script setup name="working">
-import { nextTick } from "vue";
-import { ref, reactive, getCurrentInstance, toRaw,onActivated } from "vue";
+import { nextTick, onMounted } from "vue";
+import { ref, reactive, getCurrentInstance, toRaw, onActivated } from "vue";
 const proxy = getCurrentInstance().proxy;
 console.log(toRaw(proxy), "asss");
 const routerData = ref([]);
@@ -58,13 +54,11 @@ const getRouter = () => {
   proxy.get("getRouters", {}).then((res) => {
     for (let i = 0; i < res.data.length; i++) {
       const element = res.data[i];
-      if(element.type == 2){
-        
+      if (element.type == 2) {
         routerData.value = element.children;
-        console.log(routerData.value)
+        console.log(routerData.value);
       }
     }
-    
   });
 };
 
@@ -72,17 +66,16 @@ const keyword = ref(null);
 const searchList = ref([]);
 const searchFn = (text) => {
   searchList.value = [];
-  if(!text) return
+  if (!text) return;
   //在routerData中查找
-  routerData.value.map(item => {
-    item.children.map(item => {
-      if(item.meta.title.indexOf(text) > -1){
-        searchList.value.push(item)
+  routerData.value.map((item) => {
+    item.children.map((item) => {
+      if (item.meta.title.indexOf(text) > -1) {
+        searchList.value.push(item);
       }
-    })
-    
-  })
-  console.log(searchList)
+    });
+  });
+  console.log(searchList);
 };
 getRouter();
 const toWinfaster = () => {
@@ -98,9 +91,7 @@ const colorRgb = (sColor, alpha) => {
     if (sColor.length === 4) {
       var sColorNew = "#";
       for (var i = 1; i < 4; i += 1) {
-        sColorNew += sColor
-          .slice(i, i + 1)
-          .concat(sColor.slice(i, i + 1));
+        sColorNew += sColor.slice(i, i + 1).concat(sColor.slice(i, i + 1));
       }
       sColor = sColorNew;
     }
@@ -109,29 +100,53 @@ const colorRgb = (sColor, alpha) => {
     for (var i = 1; i < 7; i += 2) {
       sColorChange.push(parseInt("0x" + sColor.slice(i, i + 2)));
     }
-    return (
-      "background:rgba(" + sColorChange.join(",") + "," + alpha + ")"
-    );
+    return "background:rgba(" + sColorChange.join(",") + "," + alpha + ")";
   } else {
     return sColor;
   }
 };
 const toRouter = (item) => {
   //获取class为main的滚动条位置
+  if (item.meta && item.meta.title == "生产报工") {
+    uni.postMessage({
+      data: {
+        type: "scanCode",
+      },
+    });
+  } else {
+    sessionStorage.setItem(
+      "scrollTop",
+      document.querySelector("#main").scrollTop
+    );
+    proxy.$router.push(item.path);
+  }
+};
 
-  
-  sessionStorage.setItem("scrollTop", document.querySelector('#main').scrollTop);
-  proxy.$router.push(item.path);
+const showScanData = (val) => {
+  proxy.$router.push({
+    path: "/main/productionReportAdd",
+    query: {
+      id: val,
+    },
+  });
 };
 
+onMounted(() => {
+  nextTick(() => {
+    window.getVueMessage = (data) => {
+      if (data) {
+        showScanData(data);
+      }
+    };
+  });
+});
+
 //keep 生命周期
 onActivated(() => {
   const scrollTop = sessionStorage.getItem("scrollTop");
   nextTick(() => {
-    document.querySelector('#main').scrollTop = scrollTop;
+    document.querySelector("#main").scrollTop = scrollTop;
   });
-  
-  
 });
 </script>
 <style lang="scss" scoped>
@@ -140,22 +155,22 @@ onActivated(() => {
   padding: 12px;
   color: #333;
   position: relative;
-  top:-46px;
-  
-  .my-swipe{
+  top: -46px;
+
+  .my-swipe {
     height: 150px;
     background: #0084ff;
     color: #fff;
     border-radius: 5px;
     text-align: center;
-    .van-swipe-item{
+    .van-swipe-item {
       height: 150px;
       text-align: center;
       line-height: 150px;
-      img{
+      img {
         width: 100%;
         height: 100%;
-      }        
+      }
     }
   }
   .card {
@@ -191,7 +206,7 @@ onActivated(() => {
 
       li {
         width: 23%;
-        
+
         padding: 12px;
         margin: 10px 1% 0;
         box-sizing: border-box;
@@ -209,7 +224,7 @@ onActivated(() => {
           font-size: 14px;
           z-index: 2;
           position: relative;
-          .iconfont{
+          .iconfont {
             font-size: 14px;
           }
         }
@@ -217,7 +232,7 @@ onActivated(() => {
           font-size: 12px;
           height: 26px;
           line-height: 14px;
-          margin-top:12px;
+          margin-top: 12px;
           color: #333;
           font-weight: bold;
           position: relative;
@@ -228,9 +243,8 @@ onActivated(() => {
           display: -webkit-box;
           -webkit-line-clamp: 2;
           -webkit-box-orient: vertical;
-          
         }
-        .yuan{
+        .yuan {
           width: 20px;
           height: 20px;
           border-radius: 50%;

+ 1 - 1
vue.config.js

@@ -30,7 +30,7 @@ module.exports = defineConfig({
 				rewrite: (p) => p.replace(/^\/test-api/, '')
 			},
 			'/prod-api': {
-				target: 'http://139.9.102.170:9900',
+				target: 'http://121.37.194.75:20011/',
 				changeOrigin: true,
 				rewrite: (p) => p.replace(/^\/prod-api/, '')
 			}