فهرست منبع

油品信息管理,结算管理

YLZH 1 سال پیش
والد
کامیت
ab5ea38f63

+ 0 - 4
.husky/commit-msg

@@ -1,4 +0,0 @@
-#!/bin/sh
-. "$(dirname "$0")/_/husky.sh"
-
-npx commitlint --edit $1

+ 0 - 4
.husky/pre-commit

@@ -1,4 +0,0 @@
-#!/bin/sh
-. "$(dirname "$0")/_/husky.sh"
-
-npx lint-staged --allow-empty $1

+ 4 - 5
package.json

@@ -62,9 +62,10 @@
     "@dcloudio/uni-mp-weixin": "3.0.0-3081220230817001",
     "@dcloudio/uni-quickapp-webview": "3.0.0-3081220230817001",
     "js-md5": "^0.8.3",
+    "moment": "^2.30.1",
     "vue": "^3.2.45",
     "vue-i18n": "^9.1.9",
-    "wot-design-uni": "^0.1.57"
+    "wot-design-uni": "0.2.22"
   },
   "devDependencies": {
     "@commitlint/cli": "^17.4.4",
@@ -89,7 +90,7 @@
     "git-cz": "^4.9.0",
     "husky": "^8.0.3",
     "inquirer": "8.0.0",
-    "lint-staged": "^13.2.0",
+
     "mini-types": "^0.1.7",
     "miniprogram-api-typings": "^3.9.0",
     "npm-run-all": "^4.1.5",
@@ -118,9 +119,7 @@
     "Android >= 4.4",
     "ios >= 9"
   ],
-  "lint-staged": {
-    "*.{js,ts,vue}": "eslint --fix --ext .js,.vue,.ts src"
-  },
+
   "uni-app": {
     "scripts": {
       "mp-dingtalk": {

+ 5 - 6
src/App.vue

@@ -11,14 +11,14 @@
 import { onLaunch, onShow, onHide } from '@dcloudio/uni-app'
 onLaunch((ctx) => {
   console.log('App Launch')
-})
+});
 onShow(() => {
   const updateManager = uni.getUpdateManager();
 
   updateManager.onCheckForUpdate(function (res) {
     // 请求完新版本信息的回调
     console.log(res.hasUpdate);
-  });
+  })
 
   updateManager.onUpdateReady(function (res) {
     uni.showModal({
@@ -29,10 +29,9 @@ onShow(() => {
           // 新的版本已经下载好,调用 applyUpdate 应用新版本并重启
           updateManager.applyUpdate();
         }
-      }
+      },
     });
-
-  });
+  })
 
   updateManager.onUpdateFailed(function (res) {
     // 新的版本下载失败
@@ -40,7 +39,7 @@ onShow(() => {
 })
 onHide(() => {
   console.log('App Hide')
-})
+});
 </script>
 <style>
 /* 全局样式 */

+ 58 - 7
src/api/DemoApi.ts

@@ -11,6 +11,7 @@ import http from '@/http/HttpClient';
 import BaseResponse from '@/model/BaseResponse';
 import Chanel from '@/model/Chanel';
 import UserInfo from '@/model/UserInfo';
+import getTime from '@/utils/getTime';
 // 这里将API方法统一管理
 export default class DemoApi {
   // 获取项目名称
@@ -18,11 +19,16 @@ export default class DemoApi {
     return http
       .server(data)
       .get(
-        'bi-api/report/dataapi/project_info?date=202402&month=202401&themonth=202402&quarter=20240&year=2024&theyear=2024&today=20240202&yesterday=20240201&lart30=20240103&startTime=202302&endTime=202401'
+        'bi-api/report/dataapi/project_info' +
+          `?${Object.keys(getTime)
+            .map((key) => {
+              return `${key}=${getTime[key]}`;
+            })
+            .join('&')}`
       )
       .then((res) => {
         return res.data;
-      });
+      })
   }
   //  获取客户列表 getCustomerList
 
@@ -30,11 +36,16 @@ export default class DemoApi {
     return http
       .server(data)
       .get(
-        'bi-api/report/dataapi/customerinfo_api?date=202402&month=202401&themonth=202402&quarter=20240&year=2024&theyear=2024&today=20240202&yesterday=20240201&lart30=20240103&startTime=202302&endTime=202401'
+        'bi-api/report/dataapi/customerinfo_api' +
+          `?${Object.keys(getTime)
+            .map((key) => {
+              return `${key}=${getTime[key]}`;
+            })
+            .join('&')}`
       )
       .then((res) => {
         return res.data;
-      });
+      })
   }
 
   // config 结算管理 接口
@@ -44,16 +55,56 @@ export default class DemoApi {
       .get('visual-api/paas/visualdev/OnlineDev/' + data + '/Config')
       .then((res) => {
         return res.data;
-      });
+      })
   }
   // 项目列表
   static getFormDataList(data): Promise<BaseResponse<Chanel[]>> {
-    console.log('🚀 ~ DemoApi ~ getFormDataList ~ data:', data);
     return http
       .server()
       .post('bi-api/cube/browser/' + data.dbLinkId, data)
       .then((res) => {
         return res.data;
-      });
+      })
+  }
+  // 获取表单Url
+  static getSelectOptionsUrl(id): Promise<BaseResponse<Chanel[]>> {
+    return http
+      .server()
+      .get('bi-api/report/dataapi/detail?id=' + id)
+      .then((res) => {
+        return res.data;
+      })
+  }
+  // 根据url拼接
+  static getSelectOptionsUrlByParams(url): Promise<BaseResponse<Chanel[]>> {
+    return http
+      .server()
+      .get(
+        url +
+          `?${Object.keys(getTime)
+            .map((key) => {
+              return `${key}=${getTime[key]}`;
+            })
+            .join('&')}`
+      )
+      .then((res) => {
+        return res.data;
+      })
+  }
+  // 编辑
+  // https://miniapp.zhangmushiye.com/visual-api/paas/visualdev/OnlineDev/v2
+  static getEditData(data): Promise<BaseResponse<Chanel[]>> {
+    return http
+      .server()
+      .put(
+        'visual-api/paas/visualdev/OnlineDev/v2/' +
+          data.formKey +
+          '/' +
+          data.id,
+        data.data
+      )
+      .then((res) => {
+        return res.data;
+      })
   }
 }

+ 274 - 0
src/components/formList.vue

@@ -0,0 +1,274 @@
+<template>
+  <wd-form ref="form" :model="dataForm" :rules="rules">
+    <wd-cell-group :border="formItemBorder">
+      <template v-for="(item, i) in filedList" :key="i">
+        <wd-input
+          v-if="item.__config__.jnpfKey === 'comInput' && item.__config__.viewDataType === 'STRING'"
+          v-model="dataForm[item.__vModel__]"
+          :label="item.__config__.label"
+          :prop="item.__vModel__"
+          :placeholder="item.placeholder"
+          :disabled="item.disabled"
+          :readonly="item.readonly"
+          :clearable="item.clearable"
+          :label-width="labelWidth"
+          type="text"
+        />
+        <wd-input
+          v-if="item.__config__.jnpfKey === 'comInput' && item.__config__.viewDataType === 'NUMBER'"
+          v-model="dataForm[item.__vModel__]"
+          :label="item.__config__.label"
+          :prop="item.__vModel__"
+          :placeholder="item.placeholder"
+          :disabled="item.disabled"
+          :readonly="item.readonly"
+          :clearable="item.clearable"
+          :label-width="labelWidth"
+          type="text"
+        />
+        <wd-cell
+          v-if="item.__config__.jnpfKey === 'numInput'"
+          :title="item.__config__.label"
+          :title-width="labelWidth"
+          :prop="item.__vModel__"
+        >
+          <view style="text-align: left">
+            <wd-input-number
+              v-model="dataForm[item.__vModel__]"
+              :label="item.__config__.label"
+              :prop="item.__vModel__"
+              :placeholder="item.placeholder"
+              :disabled="item.disabled"
+              :readonly="item.readonly"
+              :label-width="labelWidth"
+              :clearable="item.clearable"
+              :min="0"
+              :precision="2"
+              input-width="140rpx"
+            />
+          </view>
+        </wd-cell>
+        <wd-select-picker
+          v-if="item.__config__.jnpfKey === 'select'"
+          v-model="dataForm[item.__vModel__]"
+          :value="dataForm[item.__vModel__]"
+          :columns="item.__slot__.options"
+          :value-key="item.__config__.props.value"
+          :label-key="item.__config__.props.label"
+          :label="item.__config__.label"
+          :prop="item.__vModel__"
+          :placeholder="item.placeholder"
+          :disabled="item.disabled"
+          :readonly="item.readonly"
+          :clearable="item.clearable"
+          :label-width="labelWidth"
+          type="radio"
+        />
+
+        <!-- 时间戳 -->
+        <wd-calendar
+          v-if="item.__config__.jnpfKey === 'date'"
+          v-model="dataForm[item.__vModel__]"
+          :label="item.__config__.label"
+          :prop="item.__vModel__"
+          :placeholder="item.placeholder"
+          :disabled="item.disabled"
+          :readonly="item.readonly"
+          :clearable="item.clearable"
+          :label-width="labelWidth"
+          type="date"
+        />
+        <!-- uploadImg -->
+        <wd-cell
+          v-if="item.__config__.jnpfKey === 'uploadImg'"
+          :title="item.__config__.label"
+          :title-width="labelWidth"
+          :prop="dataForm[item.__vModel__]"
+        >
+          <wd-upload
+            :ref="upload_ + item.__vModel__"
+            :file-list="dataForm[item.__vModel__]"
+            :action="config.baseURL + 'api/file/uploadFile'"
+            @change="handleChangeFile"
+          />
+        </wd-cell>
+      </template>
+    </wd-cell-group>
+    <view class="footer">
+      <wd-button type="primary" size="large" block @click="handleSubmit">提交</wd-button>
+    </view>
+  </wd-form>
+  <wd-toast />
+</template>
+<script lang="ts" setup>
+import DemoApi from '@/api/DemoApi';
+import { defineProps, toRefs, ref } from 'vue';
+import { useToast } from 'wot-design-uni';
+import config from '@/http/config';
+const props = defineProps({
+  formKey: {
+    type: String,
+    default: '',
+  },
+  id: {
+    type: String,
+    default: '',
+  },
+  dataForm: {
+    type: Object,
+    default: () => ({}),
+  },
+  rules: {
+    type: Object,
+    default: () => ({}),
+  },
+  formItemBorder: {
+    type: Boolean,
+    default: true,
+  },
+  labelWidth: {
+    type: String,
+    default: '180rpx',
+  },
+  filedList: {
+    type: Array,
+    default: () => [],
+  },
+  oldFormData: {
+    type: String,
+    default: '',
+  },
+  uplodKey: {
+    type: Number,
+    default: null,
+  },
+});
+
+const {
+  refName,
+  formKey,
+  id,
+  dataForm,
+  rules,
+  oldFormData,
+  formItemBorder,
+  labelWidth,
+  filedList,
+  uplodKey,
+} = toRefs(props);
+console.log('🚀 ~ filedList,:', filedList);
+const form = ref();
+const toast = useToast();
+function handleSubmit() {
+  form.value
+    .validate()
+    .then(({ valid, errors }) => {
+      if (valid) {
+        if (uplodKey.value) {
+          dataForm.value[uplodKey.value] = dataForm.value[uplodKey.value].map((item) => {
+            return {
+              name: item.name,
+              fileld: item.fileld,
+              url: item.fileld,
+            };
+          })
+        }
+        const params = {
+          id: id.value,
+          formKey: formKey.value,
+          data: [
+            {
+              data: JSON.stringify(dataForm.value),
+              id: id.value,
+              oldData: oldFormData.value,
+            },
+          ],
+        };
+        DemoApi.getEditData(params).then((res) => {
+          toast.close();
+          if (uplodKey.value) {
+            dataForm.value[uplodKey.value] = dataForm.value[uplodKey.value].map((item) => {
+              return {
+                name: item.name,
+                fileld: item.fileld,
+                url: config.baseURL + item.fileld,
+              };
+            })
+          }
+
+          if (res.code === 200) {
+            toast.success('更新成功');
+          } else {
+            toast.error('提交失败');
+          }
+        });
+      }
+    })
+    .catch((error) => {
+      console.log(error, 'error');
+    })
+}
+watch(
+  () => filedList.value,
+  (newVal) => {
+    initSelectOptions();
+  }
+);
+function initSelectOptions() {
+  filedList.value.forEach((item) => {
+    if (item.__config__.jnpfKey === 'select' && dataForm.value[item.__vModel__] !== '') {
+      const findAll = item.__slot__.options.find(
+        (cell) => cell[item.__config__.props.value] === dataForm.value[item.__vModel__]
+      );
+      if (!findAll) {
+        item.__slot__.options = [
+          {
+            [item.__config__.props.value]: dataForm.value[item.__vModel__],
+            [item.__config__.props.label]: dataForm.value[item.__vModel__],
+          },
+        ];
+      }
+    } //   DemoApi.getSelectOptionsUrl(item.__config__.propsUrl).then((res) => {
+    //     let url = 'bi-api' + res.data.apiUrl;
+    //     // 去除第一位的/
+    //     DemoApi.getSelectOptionsUrlByParams(url).then((resp) => {
+    //       item.selectOptions = resp.data.map((cell) => {
+    //         let obj = {};
+    //         obj[item.__config__.props.value] = cell.项目名称;
+    //         return obj;
+    //       });
+    //     });
+    //   });
+    // } else if (item.__config__.jnpfKey === 'select') {
+    //   item.selectOptions = item.__slot__.options || [];
+    // }
+  });
+}
+
+function handleChangeFile({ fileList }) {
+  // 如果不是数组
+  const arr = [];
+  if (!Array.isArray(fileList)) {
+    fileList = [];
+  }
+  for (let i = 0; i < fileList.length; i++) {
+    const val = fileList[i];
+    const response = JSON.parse(val.response);
+
+    if (response.code === 200) {
+      const obj = {
+        url: config.baseURL + response.msg,
+        name: response.msg,
+        fileld: response.msg,
+      };
+      arr.push(obj);
+    }
+  }
+  dataForm.value[uplodKey.value] = arr;
+}
+</script>
+<style lang="scss" scoped>
+.footer {
+  padding: 20px;
+}
+</style>

+ 4 - 1
src/http/AxiosCancelToken.ts

@@ -9,7 +9,10 @@
  */
 import axios, { AxiosRequestConfig, CancelTokenSource } from 'axios'
 
-const requestMap: Map<string, CancelTokenSource> = new Map<string, CancelTokenSource>() //请求&AbortController的map
+const requestMap: Map<string, CancelTokenSource> = new Map<
+  string,
+  CancelTokenSource
+>() //请求&AbortController的map
 
 export default class AxiosCancelToken {
   /**

+ 19 - 12
src/http/HttpClient.ts

@@ -16,26 +16,31 @@ export default class ApiClient {
     return ApiClient.create(baseURL, abortRequest)
   }
 
-  private static create(baseURL: string, abortRequest: 'same' | 'all' | 'none' = 'none') {
+  private static create(
+    baseURL: string,
+    abortRequest: 'same' | 'all' | 'none' = 'none'
+  ) {
     const instance = axios.create({
       withCredentials: true,
       baseURL: baseURL,
-      adapter: uniAdapter // 指定适配器
+      adapter: uniAdapter, // 指定适配器
     })
     instance.interceptors.request.use(
       (request) => {
         // 设置conten-type
-        request.headers ? (request.headers['Content-Type'] = 'application/json') : (request.headers = { 'Content-Type': 'application/json' })
+        request.headers
+          ? (request.headers['Content-Type'] = 'application/json')
+          : (request.headers = { 'Content-Type': 'application/json' })
         // 设置请求唯一标识(便于查询请求日志)
         request.headers.trace_id = new Date().getTime()
         request.headers['Blade-Auth'] = 'bearer ' + uni.getStorageSync('token') // 从本地缓存中获取token
         switch (abortRequest) {
           case 'all':
             axiosCancelToken.removeAllRequest()
-            break
+            break;
           case 'same':
             axiosCancelToken.removeRequest(request)
-            break
+            break;
           default:
             break
         }
@@ -81,16 +86,18 @@ export default class ApiClient {
           //   break
           case 1:
             error.msg = '网络超时!'
-            break
+            break;
           case 401:
             oauthStore.logout()
+
             setTimeout(() => {
               uni.showToast({ title: '登录已过期,请重新登录!', icon: 'none' })
             }, 300)
             // 如果当前页面不是登录页面则跳转至登录页面
             if (
               !pages[pages.length - 1].$page ||
-              (pages[pages.length - 1].$page && pages[pages.length - 1].$page.fullPath !== '/pages/login/Login')
+              (pages[pages.length - 1].$page &&
+                pages[pages.length - 1].$page.fullPath !== '/pages/login/Login')
             ) {
               uni.reLaunch({ url: '/pagesOther/login/Login' })
             }
@@ -98,19 +105,19 @@ export default class ApiClient {
 
           case 403:
             error.msg = `${error.status} 禁止访问!`
-            break
+            break;
           case 500:
             error.msg = `${error.status} 服务内部异常!`
-            break
+            break;
           case 502:
             error.msg = `${error.status} 服务器暂不可用!`
-            break
+            break;
           case 503:
             error.msg = `${error.status} 服务器升级中!`
-            break
+            break;
           case 404:
             error.msg = `${error.status} 服务器无回应!`
-            break
+            break;
           default:
             error.msg = `${error.status} 未知错误!`
         }

+ 2 - 2
src/http/config.ts

@@ -1,4 +1,4 @@
 const baseURL = 'https://miniapp.zhangmushiye.com/'
 export default {
-    baseURL
-}
+  baseURL,
+}

+ 1 - 1
src/main.ts

@@ -22,6 +22,6 @@ export function createApp() {
   app.use(pinia)
   return {
     app,
-    pinia
+    pinia,
   }
 }

+ 14 - 0
src/pages.json

@@ -94,6 +94,20 @@
         "navigationStyle": "default",
         "navigationBarTitleText": "结算管理"
       }
+    },
+    {
+      "path": "pages/oils/list",
+      "style": {
+        "navigationStyle": "default",
+        "navigationBarTitleText": "油品信息管理"
+      }
+    },
+    {
+      "path": "pages/oils/form",
+      "style": {
+        "navigationStyle": "default",
+        "navigationBarTitleText": "油品信息管理"
+      }
     }
   ],
   "tabBar": {

+ 2 - 2
src/pages/cart/Cart.vue

@@ -3,13 +3,13 @@
  * @Date: 2021-12-22 15:19:08
  * @LastEditTime: 2023-09-02 22:25:25
  * @LastEditors: weisheng
- * @Description: 
+ * @Description:
  * @FilePath: \wot-starter\src\pages\cart\Cart.vue
  * 记得注释
 -->
 <template>
   <view class="home">
-    <wd-cell title="清除登录信息" @click="doLogout" icon="ic_shutdown_line" is-link />
+    <wd-cell title="清除登录信息" icon="ic_shutdown_line" is-link @click="doLogout" />
   </view>
 </template>
 

+ 4 - 4
src/pages/home/Home.vue

@@ -17,7 +17,7 @@
             <wd-cell title="采购管理" is-link icon="edit" to="/pages/publish/Publish" />
             <wd-cell title="结算管理" is-link icon="spool" to="/pages/settlement/list" />
             <wd-cell title="回款打款管理" is-link icon="spool" to="/pages/home/history" />
-            <wd-cell title="油品信息管理" is-link icon="spool" to="/pages/home/history" />
+            <wd-cell title="油品信息管理" is-link icon="location" to="/pages/oils/list" />
           </template>
         </wd-cell-group>
         <wd-cell title="退出当前账号" @click="doLogout" icon="translate-bold" is-link />
@@ -27,12 +27,12 @@
 </template>
 
 <script lang="ts" setup>
-import { useMessage, useNotify } from 'wot-design-uni';
+import { useMessage } from 'wot-design-uni';
 import { useToast } from 'wot-design-uni';
 const toast = useToast();
 const message = useMessage();
 const { userInfo } = storeToRefs(useAuthStore()); // 解构pinia的store
-console.log(userInfo.value);
+// console.log(userInfo.value);
 
 const router = useRouter();
 const target = ref({});
@@ -70,7 +70,7 @@ function doLogout() {
     })
     .catch((error) => {
       console.log(error);
-    });
+    })
 }
 </script>
 

+ 15 - 15
src/pages/home/drvier.vue

@@ -25,52 +25,52 @@
   </view>
 </template>
 <script setup>
-import {onShow} from "@dcloudio/uni-app";
+import { onShow } from '@dcloudio/uni-app';
 
-const {userInfo} = storeToRefs(useAuthStore()) // 解构pinia的store
+const { userInfo } = storeToRefs(useAuthStore()) // 解构pinia的store
 const list = ref([])
 onShow(() => {
   getList()
-})
+});
 const getList = () => {
   uni.request({
     url: 'https://miniapp.zhangmushiye.com/bi-api/report/dataapi/drivers',
     method: 'GET',
     data: {
-      name: userInfo.value.name
+      name: userInfo.value.name,
     },
     success: (res) => {
       list.value = res.data.data
-    }
+    },
   })
-}
+};
 
 const goAdd = () => {
   uni.navigateTo({
-    url: '/pages/publish/driver'
+    url: '/pages/publish/driver',
   })
-}
+};
 
 const openPhone = (item) => {
   uni.makePhoneCall({
-    phoneNumber: item.COL_1
+    phoneNumber: item.COL_1,
   })
-}
+};
 
 const goEdit = (item) => {
   uni.navigateTo({
-    url: '/pages/publish/driver?item=' + encodeURIComponent(JSON.stringify(item))
+    url: '/pages/publish/driver?item=' + encodeURIComponent(JSON.stringify(item)),
   })
-}
+};
 </script>
 
 <style scoped lang="scss">
-.drvier-list{
+.drvier-list {
   position: relative;
-  .add{
+  .add {
     position: fixed;
     // 安全区域
     bottom: var(--safe-area-inset-bottom);
   }
 }
-</style>
+</style>

+ 40 - 33
src/pages/home/drvierhistory.vue

@@ -4,30 +4,37 @@
     <template v-for="item in list" :key="item.ID">
       <wd-card :title="'司机:' + item.COL_11">
         <view class="flex flex-col">
-            <view class="flex justify-between">
-              <view>项目:</view>
-              {{ item.COL_10 }}
-            </view>
-            <view class="flex justify-between">
-              <view>油品名称:</view>
-              {{ item.COL_1 }}
-            </view>
-            <view class="flex justify-between">
-              <view>油品型号:</view>
-              {{ item.COL_2 }}
-            </view>
-            <view class="flex justify-between">
-              <view>加油数量:</view>
-              {{ item.COL_3 }} {{ item.unit_type }}
-            </view>
+          <view class="flex justify-between">
+            <view>项目:</view>
+            {{ item.COL_10 }}
+          </view>
+          <view class="flex justify-between">
+            <view>油品名称:</view>
+            {{ item.COL_1 }}
+          </view>
+          <view class="flex justify-between">
+            <view>油品型号:</view>
+            {{ item.COL_2 }}
+          </view>
+          <view class="flex justify-between">
+            <view>加油数量:</view>
+            {{ item.COL_3 }} {{ item.unit_type }}
+          </view>
           <view class="flex justify-between">
             <view>加油日期:</view>
             {{ item.COL_0 }}
           </view>
-            <view class="flex items-center justify-between">
-              单据:
-              <wd-img v-for="(v,index) in item.imgList" :key="index" :width="50" :height="50" :src="'https://miniapp.zhangmushiye.com/' + v.url.msg" @click="previewImage(item, index)"/>
-            </view>
+          <view class="flex items-center justify-between">
+            单据:
+            <wd-img
+              v-for="(v, index) in item.imgList"
+              :key="index"
+              :width="50"
+              :height="50"
+              :src="'https://miniapp.zhangmushiye.com/' + v.url.msg"
+              @click="previewImage(item, index)"
+            />
+          </view>
         </view>
       </wd-card>
     </template>
@@ -35,18 +42,18 @@
 </template>
 
 <script setup>
-import dayjs from "dayjs";
+import dayjs from 'dayjs';
 const { userInfo } = storeToRefs(useAuthStore())
 
 const list = ref([])
 const params = {
   mobile: userInfo.value.COL_1,
-  COL_0: dayjs().format('YYYY-MM-DD')
+  COL_0: dayjs().format('YYYY-MM-DD'),
 }
 
 onShow(() => {
   getList()
-})
+});
 const getList = () => {
   uni.request({
     url: 'https://miniapp.zhangmushiye.com/bi-api/report/dataapi/duizhangdrvierhis',
@@ -58,34 +65,34 @@ const getList = () => {
         if (item.COL_19) {
           item.COL_19 = JSON.parse(item.COL_19)
           item.imgList = item.COL_19
-        }else{
+        } else {
           item.imgList = [
             {
               url: {
-                msg: ''
-              }
-            }
+                msg: '',
+              },
+            },
           ]
         }
         return item
-      })
-    }
+      });
+    },
   })
-}
+};
 
 const handleConfirm = ({ value }) => {
   params.COL_0 = dayjs(value).format('YYYY-MM-DD')
   getList()
-}
+};
 
 const previewImage = (item, index) => {
   uni.previewImage({
     urls: item.imgList.map((item) => {
       return 'https://miniapp.zhangmushiye.com/' + item.url.msg
     }),
-    current: index
+    current: index,
   })
-}
+};
 </script>
 
 <style lang="scss"></style>

+ 25 - 11
src/pages/home/history.vue

@@ -22,11 +22,25 @@
             </view>
             <view class="flex items-center mt-4 flex-wrap gap-1">
               单据:
-              <wd-img v-for="(v,index) in item.imgList" :key="index" :width="50" :height="50" :src="'https://miniapp.zhangmushiye.com/' + v.url" @click="previewImage(item,index)"/>
+              <wd-img
+                v-for="(v, index) in item.imgList"
+                :key="index"
+                :width="50"
+                :height="50"
+                :src="'https://miniapp.zhangmushiye.com/' + v.url"
+                @click="previewImage(item, index)"
+              />
             </view>
           </view>
           <view class="">
-            <wd-button v-if="item.settlement_type != 1" size="small" type="warning" @click="goEdit(item)">编辑</wd-button>
+            <wd-button
+              v-if="item.settlement_type != 1"
+              size="small"
+              type="warning"
+              @click="goEdit(item)"
+            >
+              编辑
+            </wd-button>
           </view>
         </view>
       </wd-card>
@@ -36,18 +50,18 @@
 
 <script setup>
 import DemoApi from '@/api/DemoApi'
-import router from "@/router";
+import router from '@/router';
 
 const { userInfo } = storeToRefs(useAuthStore())
 
 const list = ref([])
 const params = {
-  mobile: userInfo.value.COL_1
+  mobile: userInfo.value.COL_1,
 }
 
 onShow(() => {
   getList()
-})
+});
 const getList = () => {
   if (userInfo.value.type) {
     DemoApi.duizhanghistory(params).then((res) => {
@@ -62,7 +76,7 @@ const getList = () => {
           item.imgList = item.COL_15
         }
         return item
-      })
+      });
     })
   } else {
     DemoApi.history(params).then((res) => {
@@ -72,18 +86,18 @@ const getList = () => {
           item.imgList = item.COL_19
         }
         return item
-      })
+      });
     })
   }
 }
 const goEdit = (item) => {
   if (userInfo.value.type) {
     uni.navigateTo({
-      url: `/pages/publish/Duizhang?query=${encodeURIComponent(JSON.stringify(item))}`
+      url: `/pages/publish/Duizhang?query=${encodeURIComponent(JSON.stringify(item))}`,
     })
   } else {
     uni.navigateTo({
-      url: `/pages/publish/Publish?query=${encodeURIComponent(JSON.stringify(item))}`
+      url: `/pages/publish/Publish?query=${encodeURIComponent(JSON.stringify(item))}`,
     })
   }
 }
@@ -93,9 +107,9 @@ const previewImage = (item, index) => {
     current: index,
     urls: item.imgList.map((item) => {
       return 'https://miniapp.zhangmushiye.com/' + item.url.msg
-    })
+    }),
   })
-}
+};
 </script>
 
 <style lang="scss"></style>

+ 20 - 21
src/pages/login/Login.vue

@@ -1,59 +1,59 @@
 <template>
-  <wd-toast></wd-toast>
+  <wd-toast />
   <view class="login">
     <view class="login-main">
       <view style="text-align: center; width: 100%">
-        <image src="@/static/logo.png" style="height: 400rpx; width: 560rpx"></image>
+        <image src="@/static/logo.png" style="height: 400rpx; width: 560rpx" />
       </view>
       <!--      <text class="login-main-title">欢迎登陆</text>-->
       <!--      <view class="login-main-subtitle">樟木实业有限公司</view>-->
       <view class="login-main-body">
-        <view class="h-30"></view>
-        <div class="flex justify-center"></div>
-        <view class="h-20"></view>
+        <view class="h-30" />
+        <div class="flex justify-center" />
+        <view class="h-20" />
         <wd-input
           key="username"
+          v-model="username"
           label-width="115rpx"
           label="用户名:"
-          v-model="username"
           clearable
           placeholder="请输入用户名"
           :maxlength="20"
-        ></wd-input>
-        <view class="border border-full h-1"></view>
+        />
+        <view class="border border-full h-1" />
         <wd-input
           key="username"
+          v-model="password"
           label-width="115rpx"
           label="密码:"
           show-password
-          v-model="password"
           clearable
           placeholder="请输入密码"
-        ></wd-input>
+        />
         <wd-input
           key="username"
+          v-model="code"
           label-width="115rpx"
           label="验证码:"
           :focus="codeFocus"
-          v-model="code"
           clearable
           placeholder="验证码"
           :use-suffix-slot="true"
         >
           <template #suffix>
-            <wd-img :width="'200rpx'" :height="'90rpx'" @click="getCode" :src="codeSrc"></wd-img>
+            <wd-img :width="'200rpx'" :height="'90rpx'" :src="codeSrc" @click="getCode" />
           </template>
         </wd-input>
         <view class="login-password">
-          <view class="h-20"></view>
+          <view class="h-20" />
           <wd-button size="large" block type="success" @click="doLogin">登录</wd-button>
-          <view class="h-20"></view>
+          <view class="h-20" />
           <view
             style="color: #333; font-size: 28rpx"
             class="text-center"
             @click="openPrivacyContract"
           >
-            <wd-checkbox :modelValue="isAuth" shape="square">
+            <wd-checkbox :model-value="isAuth" shape="square">
               <text style="color: #333">《用户隐私保护指引》</text>
             </wd-checkbox>
           </view>
@@ -79,7 +79,7 @@ const router = useRouter(); // 路由
 // 登录按钮是否禁用
 const disabled = computed(() => {
   return !username.value || !name.value || !code.value;
-});
+})
 // 验证码图片地址
 const codeSrc = ref<string>(
   'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7'
@@ -106,7 +106,7 @@ getCode();
 async function doLogin() {
   if (!isAuth.value) {
     toast.error('请先阅读《用户隐私保护指引》');
-    return;
+    return
   }
   toast.loading({ loadingType: 'ring', msg: '登录中' });
   uni.request({
@@ -129,7 +129,7 @@ async function doLogin() {
         toast.close();
         toast.error(res.data.error_description);
         getCode();
-        return;
+        return
       }
       if (res.data.access_token) {
         toast.close();
@@ -157,7 +157,7 @@ const openPrivacyContract = () => {
       isAuth.value = false;
     },
   });
-};
+}
 </script>
 
 <style lang="scss" scoped>
@@ -205,10 +205,9 @@ const openPrivacyContract = () => {
       position: relative;
       box-sizing: border-box;
       width: 100%;
-      height: 548rpx;
       border-radius: 30rpx;
       background-color: rgba(255, 255, 255, 0.9);
-      padding: 20rpx 20rpx 90rpx 20rpx;
+      padding: 20rpx 20rpx 60rpx 20rpx;
       margin-top: 100rpx;
       .login-password {
         padding: 10rpx;

+ 6 - 6
src/pages/login/cmp/LoginInput.vue

@@ -37,13 +37,13 @@
 <script lang="ts" setup>
 interface Props {
   // 输入框值
-  modelValue: string | number
+  modelValue: string | number;
   // 是否为密码类型
-  password: boolean
+  password: boolean;
   // 占位符
-  placeholder: string
+  placeholder: string;
   // 是否显示清除按钮
-  clearable: boolean
+  clearable: boolean;
 }
 
 // Props 赋予初始值
@@ -51,7 +51,7 @@ const props = withDefaults(defineProps<Props>(), {
   modelValue: '',
   password: false,
   placeholder: '',
-  clearable: true
+  clearable: true,
 })
 
 const focus = ref<boolean>(false) // 输入框是否聚焦
@@ -60,7 +60,7 @@ const showPassword = ref<boolean>(false) // 是否显示密码
 // 隐藏按钮图标
 const icon = computed(() => {
   return showPassword.value ? 'view' : 'eye-close'
-})
+});
 
 // 事件
 // v-model

+ 7 - 4
src/pages/mine/Mine.vue

@@ -19,7 +19,10 @@
       <view class="headerheight"></view>
       <view class="header">
         <view class="header-user">
-          <image src="https://fastly.jsdelivr.net/npm/@vant/assets/cat.jpeg" class="header-user-avatar"></image>
+          <image
+            src="https://fastly.jsdelivr.net/npm/@vant/assets/cat.jpeg"
+            class="header-user-avatar"
+          ></image>
           <view class="header-user-nickname">
             <view class="nickname">杨子🧑‍💻</view>
             <view class="info">新疆项目</view>
@@ -56,7 +59,7 @@ const { userInfo } = storeToRefs(useAuthStore()) // 解构pinia的store
 const router = useRouter()
 const target = ref<Record<string, number>>({
   运送数: 99,
-  票单数: 99
+  票单数: 99,
 })
 
 /**
@@ -68,7 +71,7 @@ function doScan() {
       // 扫码内容
       const code: string = res.result || ''
       toast.show(`扫码内容:${code}`)
-    }
+    },
   })
 }
 
@@ -85,7 +88,7 @@ function doLogout() {
     })
     .catch((error) => {
       console.log(error)
-    })
+    });
 }
 </script>
 

+ 57 - 0
src/pages/oils/form.vue

@@ -0,0 +1,57 @@
+<template>
+  <view class="settlement-form">
+    <form-list
+      :id="id"
+      :filed-list="formDataSet.fields"
+      :form-key="formKey"
+      :data-form="dataForm"
+      :old-form-data="JSON.stringify(dataForm)"
+    />
+  </view>
+</template>
+<script setup lang="ts">
+import DemoApi from '@/api/DemoApi';
+import formList from '@/components/formList.vue';
+import config from '@/http/config';
+
+const formKey = ref<string>('');
+const id = ref<string>('');
+const filedsData = ref<Object>([]);
+onLoad((option) => {
+  formKey.value = option.formKey;
+  filedsData.value = JSON.parse(option.filedsData || '{}');
+  id.value = filedsData.value.id;
+  init();
+})
+const formDataSet = ref({});
+const dataForm = ref({});
+const rules = ref({});
+function init() {
+  DemoApi.getConfig(formKey.value).then((res) => {
+    formDataSet.value = JSON.parse(res.data.formData || '{}');
+    const obj = {};
+    const objAllSet = {};
+    formDataSet.value.fields.map((item) => {
+      obj[item.__vModel__] = item.defaultValue || null;
+      objAllSet[item.__vModel__] = item.__config__.jnpfKey;
+      if (item.__config__.required) {
+        rules.value[item.__vModel__] = [
+          { required: true, message: item.__config__.label + '未填写' },
+        ];
+      }
+    });
+
+    Object.keys(obj).map((key) => {
+      Object.values(filedsData.value).map((item) => {
+        if (parseInt(item.fieldId) === parseInt(key)) {
+          obj[key] = item.value;
+        }
+      });
+      if (objAllSet[key] === 'date') {
+        obj[key] = new Date(obj[key]).getTime();
+      }
+    });
+    dataForm.value = obj;
+  })
+}
+</script>

+ 297 - 0
src/pages/oils/list.vue

@@ -0,0 +1,297 @@
+<template>
+  <view class="settlement-form">
+    <view class="search-view">
+      <wd-search
+        v-model="value"
+        cancel-txt="搜索"
+        @change="searchChange"
+        @cancel="cancelChange"
+        @focus="searchFocus"
+      >
+        <template #prefix>
+          <wd-popover v-model="show" mode="menu" :content="menu" @menuclick="changeSearchType">
+            <view class="search-type">
+              <text>{{ searchType }}</text>
+              <wd-icon custom-class="icon-arrow" name="fill-arrow-down" />
+            </view>
+          </wd-popover>
+        </template>
+      </wd-search>
+    </view>
+    <wd-action-sheet
+      v-model="showSheet"
+      :title="searchType"
+      :actions="actions"
+      @close="close"
+      @select="select"
+    />
+
+    <template v-for="(item, index) in settlementList" :key="index">
+      <wd-card :title="'项目编号:' + item.COL_0.value">
+        <view class="justify-between items-center flex">
+          <view>
+            <template v-for="(field, index) in showListField">
+              <view>{{ field.content }}: {{ item[field.field].value }}</view>
+            </template>
+          </view>
+          <view class="">
+            <wd-button size="small" type="warning" @click="goEdit(item)">编辑</wd-button>
+          </view>
+        </view>
+      </wd-card>
+    </template>
+  </view>
+  <view class="pagination">
+    <wd-pagination
+      v-model="pageQuery.current"
+      :page-size="pageQuery.size"
+      :total="pageQuery.total"
+      show-icon
+      @change="handleChangePagination"
+    />
+  </view>
+</template>
+<script setup lang="ts">
+import DemoApi from '@/api/DemoApi';
+import router from '@/router';
+import { ref } from 'vue';
+import { useToast } from 'wot-design-uni';
+const show = ref<boolean>(false);
+const searchType = ref<string>('项目名称');
+const value = ref<string>('');
+const menu = ref([
+  {
+    content: '项目名称',
+    filedName: 'projectName',
+  },
+]);
+const showListField = ref([
+  {
+    content: '项目名称',
+    field: 'COL_1',
+  },
+  {
+    content: '油品名称',
+    field: 'COL_4',
+  }, // 油品型号
+  {
+    content: '油品型号',
+    field: 'COL_5',
+  }, // 合同定油品密度 6
+  {
+    content: '合同定油品密度',
+    field: 'COL_6',
+  },
+]);
+const showSheet = ref<boolean>(false);
+function changeSearchType({ item, index }) {
+  searchType.value = item.content;
+  show.value = false;
+  showSheet.value = true;
+  if (index === 0) {
+    actions.value = projectList.value;
+  } else if (index === 1) {
+    actions.value = oilList.value;
+  } else if (index === 2) {
+    actions.value = userList.value;
+  }
+}
+function searchFocus() {
+  showSheet.value = true;
+}
+function searchChange(value) {
+  // 如果输入框为空则清空 searchForm
+  if (!value.value) {
+    searchForm.value = {
+      projectName: '',
+      oilName: '',
+      customerName: '',
+    };
+    getSettlementList();
+  }
+}
+// cancelChange
+function cancelChange(value) {
+  getSettlementList();
+}
+const actions = ref([]);
+// 油品名称
+const oilList = ref([{ name: '柴油' }, { name: '汽油' }]);
+// 客户名称
+const userList = ref([]);
+// 获取客户列表
+const getUserList = () => {
+  DemoApi.getCustomerList().then((res) => {
+    userList.value = res.data.map((item) => {
+      return { name: item.COL_ALIAS_1 };
+    })
+  });
+}
+getUserList();
+const projectList = ref([]);
+const getProjectList = () => {
+  // 获取项目列表
+  DemoApi.getProjectNameList().then((res) => {
+    projectList.value = res.data.map((item) => {
+      return { name: item.项目名称 };
+    })
+    actions.value = projectList.value;
+  })
+};
+getProjectList();
+
+function close() {
+  showSheet.value = false;
+}
+const searchForm = ref({
+  projectName: '',
+  oilName: '',
+  customerName: '',
+});
+const toast = useToast();
+
+function select({ item, index }) {
+  showSheet.value = false;
+  if (searchType.value === '项目名称') {
+    searchForm.value.projectName = item.name;
+  } else if (searchType.value === '油品名称') {
+    searchForm.value.oilName = item.name;
+  } else if (searchType.value === '客户名称') {
+    searchForm.value.customerName = item.name;
+  }
+  value.value = item.name;
+}
+// 分页数据
+const pageQuery = ref({
+  current: 1,
+  size: 20,
+  descs: 536,
+  total: 0,
+});
+
+// 获取结算管理列表
+const formKey = ref<string>('a6decb955c72427dedf7db22a4142934');
+const idKeyData = ref<string>('');
+const settlementList = ref([]);
+const tableData = ref([]);
+const getSettlementList = () => {
+  DemoApi.getConfig(formKey.value).then((res) => {
+    const { dbLinkId, idKey } = res.data;
+    idKeyData.value = idKey;
+    tableData.value = JSON.parse(res.data.tables || '[]');
+    // 匹配fieldName == menu name的值 并且再menu添加 fieldId
+    menu.value.map((item) => {
+      tableData.value.map((table) => {
+        if (table.fieldName === item.content) {
+          item.fieldId = table.fieldId;
+        }
+      });
+    })
+    const params = {
+      dbLinkId,
+      pageQuery: pageQuery.value,
+      paramList: [],
+    };
+    pageQuery.value.descs = JSON.parse(res.data.columnData || '{}')?.defaultSidx;
+    menu.value.map((item) => {
+      const obj = {
+        cubeColumnId: item.fieldId,
+        function: 'in',
+        values: [],
+      };
+      if (searchForm.value[item.filedName]) {
+        obj.values.push(searchForm.value[item.filedName]);
+      }
+      params.paramList.push(obj);
+    })
+
+    DemoApi.getFormDataList(params).then((resp) => {
+      const { columnDict, pageData } = resp.data;
+      pageQuery.value.total = pageData.total;
+      pageQuery.value.current = pageData.current;
+      pageQuery.value.size = pageData.size;
+      // columnDict 是 pageData.records 和 tableData 的映射关系
+      // columnDict的key是tableData的fieldId,value是pageData.records的 key
+      // pageData.records 是后台返回的数据
+      // tableData 是前台配置的表头
+      const idKey = columnDict[idKeyData.value];
+      const arr = [];
+      pageData.records.map((val) => {
+        const obj = {};
+        obj.id = val[idKey];
+        for (const key in columnDict) {
+          tableData.value.map((item) => {
+            if (item.fieldId == key) {
+              // obj[item.field] = val[columnDict[key]];
+              obj[item.field] = {
+                value: val[columnDict[key]],
+                field: item.field,
+                fieldName: item.fieldName,
+                fieldId: item.fieldId,
+                pageDataRecordKey: columnDict[key],
+              };
+            }
+          });
+        }
+        arr.push(obj);
+      })
+      // 回到顶部
+      settlementList.value = arr;
+    })
+  });
+}
+getSettlementList();
+function handleChangePagination() {
+  getSettlementList();
+}
+function goEdit(item) {
+  router.push({
+    path: 'pages/oils/form',
+    query: { filedsData: JSON.stringify(item || '[]'), formKey: formKey.value },
+  });
+}
+</script>
+
+<style lang="scss" scoped>
+.search-type {
+  position: relative;
+  height: 30px;
+  line-height: 30px;
+  padding: 0 8px 0 16px;
+}
+.search-type::after {
+  position: absolute;
+  content: '';
+  width: 1px;
+  right: 0;
+  top: 5px;
+  bottom: 5px;
+  background: rgba(0, 0, 0, 0.25);
+}
+.search-type {
+  :deep(.icon-arrow) {
+    display: inline-block;
+    font-size: 20px;
+    vertical-align: middle;
+  }
+}
+// 固定底部
+.pagination {
+  position: fixed;
+  bottom: 0;
+  left: 0;
+  width: 100%;
+  z-index: 1;
+}
+.settlement-form {
+  padding: 75rpx 0;
+}
+// 固定到顶部
+.search-view {
+  position: fixed;
+  top: 0;
+  left: 0;
+  width: 100%;
+  z-index: 1;
+}
+</style>

+ 142 - 114
src/pages/publish/driver.vue

@@ -1,18 +1,48 @@
 <template>
   <view class="pt4 px-2 publish h-full">
-    <wd-message-box/>
-    <wd-toast/>
+    <wd-message-box />
+    <wd-toast />
     <view class="form">
       <form @submit="formSubmit">
         <wd-cell-group custom-class="group" title="基础信息" border>
-          <wd-input type="text" label="司机姓名" placeholder="请输入司机姓名" required v-model="formData.COL_0.value"/>
-          <wd-input type="text" label="手机号码" placeholder="请输入手机号码" required v-model="formData.COL_1.value"/>
-          <wd-input type="text" label="身份证号" placeholder="请输入身份证号" required v-model="formData.COL_2.value"/>
-          <wd-picker required :columns="userInfo.xiangmuList" label="项目名称" v-model="formData.COL_3.value" value-key="COL_3" label-key="COL_3" @confirm="xiangmuChange"/>
+          <wd-input
+            v-model="formData.COL_0.value"
+            type="text"
+            label="司机姓名"
+            placeholder="请输入司机姓名"
+            required
+          />
+          <wd-input
+            v-model="formData.COL_1.value"
+            type="text"
+            label="手机号码"
+            placeholder="请输入手机号码"
+            required
+          />
+          <wd-input
+            v-model="formData.COL_2.value"
+            type="text"
+            label="身份证号"
+            placeholder="请输入身份证号"
+            required
+          />
+          <wd-picker
+            v-model="formData.COL_3.value"
+            required
+            :columns="userInfo.xiangmuList"
+            label="项目名称"
+            value-key="COL_3"
+            label-key="COL_3"
+            @confirm="xiangmuChange"
+          />
         </wd-cell-group>
         <view class="text-center p3">
           <wd-button block type="success" @click="formSubmit">提交</wd-button>
-          <view style="color:#444;font-size: 28rpx" class="text-center mt-4" @click="openPrivacyContract">
+          <view
+            style="color: #444; font-size: 28rpx"
+            class="text-center mt-4"
+            @click="openPrivacyContract"
+          >
             《用户隐私保护指引》
           </view>
         </view>
@@ -22,71 +52,71 @@
 </template>
 
 <script setup>
-const {userInfo} = storeToRefs(useAuthStore())
-import {useMessage} from 'wot-design-uni'
-import {useToast} from 'wot-design-uni'
-import DemoApi from "@/api/DemoApi";
+const { userInfo } = storeToRefs(useAuthStore())
+import { useMessage } from 'wot-design-uni'
+import { useToast } from 'wot-design-uni'
+import DemoApi from '@/api/DemoApi';
 const toast = useToast()
 const messageBox = useMessage()
 const formData = ref({
   COL_0: {
-    "field": "COL_0",
-    "fieldId": 365,
-    "fieldName": "司机",
-    "dataType": "STRING",
-    "tableAliasName": "iPWTm",
-    "tableName": "mdm_driver"
+    field: 'COL_0',
+    fieldId: 365,
+    fieldName: '司机',
+    dataType: 'STRING',
+    tableAliasName: 'iPWTm',
+    tableName: 'mdm_driver',
   },
   COL_1: {
-    "field": "COL_1",
-    "fieldId": 366,
-    "fieldName": "手机号码",
-    "dataType": "STRING",
-    "tableAliasName": "iPWTm",
-    "tableName": "mdm_driver"
+    field: 'COL_1',
+    fieldId: 366,
+    fieldName: '手机号码',
+    dataType: 'STRING',
+    tableAliasName: 'iPWTm',
+    tableName: 'mdm_driver',
   },
   COL_2: {
-    "field": "COL_2",
-    "fieldId": 367,
-    "fieldName": "身份证号",
-    "dataType": "STRING",
-    "tableAliasName": "iPWTm",
-    "tableName": "mdm_driver"
+    field: 'COL_2',
+    fieldId: 367,
+    fieldName: '身份证号',
+    dataType: 'STRING',
+    tableAliasName: 'iPWTm',
+    tableName: 'mdm_driver',
   },
   COL_3: {
-    "field": "COL_3",
-    "fieldId": 368,
-    "fieldName": "负责项目名称",
-    "dataType": "STRING",
-    "tableAliasName": "iPWTm",
-    "tableName": "mdm_driver"
+    field: 'COL_3',
+    fieldId: 368,
+    fieldName: '负责项目名称',
+    dataType: 'STRING',
+    tableAliasName: 'iPWTm',
+    tableName: 'mdm_driver',
   },
   COL_4: {
-    "field": "COL_4",
-    "fieldId": 369,
-    "fieldName": "项目编号",
-    "dataType": "STRING",
-    "tableAliasName": "iPWTm",
-    "tableName": "mdm_driver"
+    field: 'COL_4',
+    fieldId: 369,
+    fieldName: '项目编号',
+    dataType: 'STRING',
+    tableAliasName: 'iPWTm',
+    tableName: 'mdm_driver',
   },
   COL_5: {
-    "field": "COL_5",
-    "fieldId": 370,
-    "fieldName": "队长名",
-    "dataType": "STRING",
-    "tableAliasName": "iPWTm",
-    "tableName": "mdm_driver",
-    value: userInfo.value.name
+    field: 'COL_5',
+    fieldId: 370,
+    fieldName: '队长名',
+    dataType: 'STRING',
+    tableAliasName: 'iPWTm',
+    tableName: 'mdm_driver',
+    value: userInfo.value.name,
   },
   COL_6: {
-    "field": "COL_6",
-    "fieldId": 371,
-    "fieldName": "队长手机号码",
-    "dataType": "STRING",
-    "tableAliasName": "iPWTm",
-    "tableName": "mdm_driver",
-    value: userInfo.value.COL_1
-  }
+    field: 'COL_6',
+    fieldId: 371,
+    fieldName: '队长手机号码',
+    dataType: 'STRING',
+    tableAliasName: 'iPWTm',
+    tableName: 'mdm_driver',
+    value: userInfo.value.COL_1,
+  },
 })
 
 let id = ''
@@ -96,80 +126,80 @@ onLoad((options) => {
     id = item.ID
     Object.values(formData.value).forEach((item2) => {
       item2.value = item[item2.field]
-    })
+    });
   }
 })
 
 const xiangmuChange = (e) => {
   formData.value.COL_3.value = e.value
   formData.value.COL_4.value = e.selectedItems.COL_4
-}
+};
 const formSubmit = () => {
   if (!formData.value.COL_0.value) {
     toast.error('请输入司机姓名')
-    return
+    return;
   }
   if (!formData.value.COL_1.value) {
     toast.error('请输入手机号码')
-    return
+    return;
   }
   if (!formData.value.COL_3.value) {
     toast.error('请选择项目名称')
-    return
+    return;
   }
   let params = {}
   Object.values(formData.value).forEach((item) => {
-    let value = item.value
+    const value = item.value
     params[item.fieldId] = value
-  })
+  });
   params = JSON.stringify(params)
   messageBox
-      .confirm({
-        title: '提示',
-        msg: '确认提交吗?'
-      })
-      .then(() => {
-        toast.loading({loadingType: 'ring', msg: '提交中'})
-        let url = 'https://miniapp.zhangmushiye.com/visual-api/paas/visualdev/OnlineDev/289135d883f74b176a1045620f95877e'
-        if (id) {
-          url = url + '/' + id
-          // PUT 提交
-          uni.request({
-            url,
-            method: 'PUT',
-            data: {
-              data: params,
-              id
-            },
-            success: (res) => {
-              toast.success('提交成功')
-              uni.navigateBack()
-            },
-            fail: (err) => {
-              toast.error('提交失败')
-            }
-          })
-        }else{
-          uni.request({
-            url,
-            method: 'POST',
-            data: {
-              data: params,
-            },
-            success: (res) => {
-              toast.success('提交成功')
-              uni.navigateBack()
-            },
-            fail: (err) => {
-              toast.error('提交失败')
-            }
-          })
-        }
-
-      })
-      .catch((error) => {
-        console.log(error)
-      })
+    .confirm({
+      title: '提示',
+      msg: '确认提交吗?',
+    })
+    .then(() => {
+      toast.loading({ loadingType: 'ring', msg: '提交中' })
+      let url =
+        'https://miniapp.zhangmushiye.com/visual-api/paas/visualdev/OnlineDev/289135d883f74b176a1045620f95877e'
+      if (id) {
+        url = url + '/' + id
+        // PUT 提交
+        uni.request({
+          url,
+          method: 'PUT',
+          data: {
+            data: params,
+            id,
+          },
+          success: (res) => {
+            toast.success('提交成功')
+            uni.navigateBack()
+          },
+          fail: (err) => {
+            toast.error('提交失败')
+          },
+        })
+      } else {
+        uni.request({
+          url,
+          method: 'POST',
+          data: {
+            data: params,
+          },
+          success: (res) => {
+            toast.success('提交成功')
+            uni.navigateBack()
+          },
+          fail: (err) => {
+            toast.error('提交失败')
+          },
+        })
+      }
+    })
+    .catch((error) => {
+      console.log(error)
+    });
 }
 
 const openPrivacyContract = () => {
@@ -179,11 +209,9 @@ const openPrivacyContract = () => {
     },
     fail: (err) => {
       isAuth.value = false
-    }
+    },
   })
-}
+};
 </script>
 
-<style scoped lang="scss">
-
-</style>
+<style scoped lang="scss"></style>

+ 316 - 295
src/pages/publish/duizhang.vue

@@ -1,18 +1,35 @@
 <template>
   <view class="pt4 px-2 publish h-full">
-    <wd-message-box/>
-    <wd-toast/>
+    <wd-message-box />
+    <wd-toast />
     <view class="form">
       <form @submit="formSubmit">
         <wd-cell-group custom-class="group" title="基础信息" border>
-          <wd-calendar v-model="formData.COL_0.value" label="提油日期"/>
-          <wd-picker required :columns="columns" label="项目名称" value-key="COL_4" label-key="COL_3"
-                     v-model="formData.COL_20.value"/>
-          <wd-picker :disabled="!formData.COL_20.value" required :columns="kehuList" label-key="label" value-key="value"
-                     label="采购单"
-                     v-model="formData.COL_4.value"/>
-          <wd-input type="digit" label="提油数量" placeholder="请输入提油" required
-                    v-model="formData.COL_6.value"/>
+          <wd-calendar v-model="formData.COL_0.value" label="提油日期" />
+          <wd-picker
+            v-model="formData.COL_20.value"
+            required
+            :columns="columns"
+            label="项目名称"
+            value-key="COL_4"
+            label-key="COL_3"
+          />
+          <wd-picker
+            v-model="formData.COL_4.value"
+            :disabled="!formData.COL_20.value"
+            required
+            :columns="kehuList"
+            label-key="label"
+            value-key="value"
+            label="采购单"
+          />
+          <wd-input
+            v-model="formData.COL_6.value"
+            type="digit"
+            label="提油数量"
+            placeholder="请输入提油"
+            required
+          />
         </wd-cell-group>
         <wd-cell title="提油单位" title-width="90px" required>
           <wd-radio-group v-model="formData.unit_type.value" size="small" shape="button" inline>
@@ -21,9 +38,13 @@
           </wd-radio-group>
         </wd-cell>
         <wd-cell-group title="票据上传" border class="p3">
-          <view class="h-10"></view>
-          <wd-upload multiple :file-list="fileList" action="https://miniapp.zhangmushiye.com/api/file/uploadFile"
-                     @change="handleChange"></wd-upload>
+          <view class="h-10" />
+          <wd-upload
+            multiple
+            :file-list="fileList"
+            action="https://miniapp.zhangmushiye.com/api/file/uploadFile"
+            @change="handleChange"
+          />
         </wd-cell-group>
         <!--        密度:{{ formData.other.COL_6 }} 吨数:{{ total.ton }} 单价:{{ formData.other.COL_7 }} 金额:{{ total.price }}-->
         <view class="text-center p3">
@@ -37,215 +58,214 @@
 <script setup>
 import dayjs from 'dayjs'
 
-const {userInfo} = storeToRefs(useAuthStore())
+const { userInfo } = storeToRefs(useAuthStore())
 
-import {useMessage} from 'wot-design-uni'
-import {useToast} from 'wot-design-uni'
+import { useMessage } from 'wot-design-uni'
+import { useToast } from 'wot-design-uni'
 
 const toast = useToast()
 const messageBox = useMessage()
-import {ref} from 'vue'
-
+import { ref } from 'vue'
 
 const formData = ref({
   COL_0: {
-    "field": "COL_0",
-    "fieldId": 637,
-    "fieldName": "提油日期",
-    "dataType": "DATETIME",
-    "tableAliasName": "uKXdX",
-    "tableName": "ODS_Pickup",
-    value: dayjs().format('YYYY-MM-DD')
+    field: 'COL_0',
+    fieldId: 637,
+    fieldName: '提油日期',
+    dataType: 'DATETIME',
+    tableAliasName: 'uKXdX',
+    tableName: 'ODS_Pickup',
+    value: dayjs().format('YYYY-MM-DD'),
   },
   COL_1: {
-    "field": "COL_1",
-    "fieldId": 638,
-    "fieldName": "项目名称",
-    "dataType": "STRING",
-    "tableAliasName": "uKXdX",
-    "tableName": "ODS_Pickup",
-    value: ''
+    field: 'COL_1',
+    fieldId: 638,
+    fieldName: '项目名称',
+    dataType: 'STRING',
+    tableAliasName: 'uKXdX',
+    tableName: 'ODS_Pickup',
+    value: '',
   },
   COL_2: {
-    "field": "COL_2",
-    "fieldId": 639,
-    "fieldName": "油品名称",
-    "dataType": "STRING",
-    "tableAliasName": "uKXdX",
-    "tableName": "ODS_Pickup",
-    value: ''
+    field: 'COL_2',
+    fieldId: 639,
+    fieldName: '油品名称',
+    dataType: 'STRING',
+    tableAliasName: 'uKXdX',
+    tableName: 'ODS_Pickup',
+    value: '',
   },
   COL_3: {
-    "field": "COL_3",
-    "fieldId": 640,
-    "fieldName": "油品型号",
-    "dataType": "STRING",
-    "tableAliasName": "uKXdX",
-    "tableName": "ODS_Pickup",
-    value: ''
+    field: 'COL_3',
+    fieldId: 640,
+    fieldName: '油品型号',
+    dataType: 'STRING',
+    tableAliasName: 'uKXdX',
+    tableName: 'ODS_Pickup',
+    value: '',
   },
   COL_4: {
-    "field": "COL_4",
-    "fieldId": 641,
-    "fieldName": "采购单号",
-    "dataType": "STRING",
-    "tableAliasName": "uKXdX",
-    "tableName": "ODS_Pickup",
-    value: ''
+    field: 'COL_4',
+    fieldId: 641,
+    fieldName: '采购单号',
+    dataType: 'STRING',
+    tableAliasName: 'uKXdX',
+    tableName: 'ODS_Pickup',
+    value: '',
   },
   COL_5: {
-    "field": "COL_5",
-    "fieldId": 653,
-    "fieldName": "打款数量(吨)",
-    "dataType": "NUMBER",
-    "tableAliasName": "uKXdX",
-    "tableName": "ODS_Pickup",
-    value: ''
+    field: 'COL_5',
+    fieldId: 653,
+    fieldName: '打款数量(吨)',
+    dataType: 'NUMBER',
+    tableAliasName: 'uKXdX',
+    tableName: 'ODS_Pickup',
+    value: '',
   },
   COL_6: {
-    "field": "COL_6",
-    "fieldId": 654,
-    "fieldName": "实际提油",
-    "dataType": "NUMBER",
-    "tableAliasName": "uKXdX",
-    "tableName": "ODS_Pickup",
-    value: ''
+    field: 'COL_6',
+    fieldId: 654,
+    fieldName: '实际提油',
+    dataType: 'NUMBER',
+    tableAliasName: 'uKXdX',
+    tableName: 'ODS_Pickup',
+    value: '',
   },
   COL_7: {
-    "field": "COL_7",
-    "fieldId": 655,
-    "fieldName": "单价",
-    "dataType": "NUMBER",
-    "tableAliasName": "uKXdX",
-    "tableName": "ODS_Pickup",
-    value: ''
+    field: 'COL_7',
+    fieldId: 655,
+    fieldName: '单价',
+    dataType: 'NUMBER',
+    tableAliasName: 'uKXdX',
+    tableName: 'ODS_Pickup',
+    value: '',
   },
   COL_8: {
-    "field": "COL_8",
-    "fieldId": 656,
-    "fieldName": "金额",
-    "dataType": "NUMBER",
-    "tableAliasName": "uKXdX",
-    "tableName": "ODS_Pickup",
-    value: ''
+    field: 'COL_8',
+    fieldId: 656,
+    fieldName: '金额',
+    dataType: 'NUMBER',
+    tableAliasName: 'uKXdX',
+    tableName: 'ODS_Pickup',
+    value: '',
   },
   COL_9: {
-    "field": "COL_9",
-    "fieldId": 657,
-    "fieldName": "密度",
-    "dataType": "NUMBER",
-    "tableAliasName": "uKXdX",
-    "tableName": "ODS_Pickup",
-    value: ''
+    field: 'COL_9',
+    fieldId: 657,
+    fieldName: '密度',
+    dataType: 'NUMBER',
+    tableAliasName: 'uKXdX',
+    tableName: 'ODS_Pickup',
+    value: '',
   },
   COL_10: {
-    "field": "COL_10",
-    "fieldId": 658,
-    "fieldName": "折升",
-    "dataType": "NUMBER",
-    "tableAliasName": "uKXdX",
-    "tableName": "ODS_Pickup",
-    value: ''
+    field: 'COL_10',
+    fieldId: 658,
+    fieldName: '折升',
+    dataType: 'NUMBER',
+    tableAliasName: 'uKXdX',
+    tableName: 'ODS_Pickup',
+    value: '',
   },
   COL_11: {
-    "field": "COL_11",
-    "fieldId": 642,
-    "fieldName": "付款单位",
-    "dataType": "STRING",
-    "tableAliasName": "uKXdX",
-    "tableName": "ODS_Pickup",
-    value: ''
+    field: 'COL_11',
+    fieldId: 642,
+    fieldName: '付款单位',
+    dataType: 'STRING',
+    tableAliasName: 'uKXdX',
+    tableName: 'ODS_Pickup',
+    value: '',
   },
   COL_12: {
-    "field": "COL_12",
-    "fieldId": 643,
-    "fieldName": "收款单位",
-    "dataType": "STRING",
-    "tableAliasName": "uKXdX",
-    "tableName": "ODS_Pickup",
-    value: ''
+    field: 'COL_12',
+    fieldId: 643,
+    fieldName: '收款单位',
+    dataType: 'STRING',
+    tableAliasName: 'uKXdX',
+    tableName: 'ODS_Pickup',
+    value: '',
   },
   COL_13: {
-    "field": "COL_13",
-    "fieldId": 644,
-    "fieldName": "提油人",
-    "dataType": "STRING",
-    "tableAliasName": "uKXdX",
-    "tableName": "ODS_Pickup",
-    value: ''
+    field: 'COL_13',
+    fieldId: 644,
+    fieldName: '提油人',
+    dataType: 'STRING',
+    tableAliasName: 'uKXdX',
+    tableName: 'ODS_Pickup',
+    value: '',
   },
   COL_14: {
-    "field": "COL_14",
-    "fieldId": 645,
-    "fieldName": "车牌号",
-    "dataType": "STRING",
-    "tableAliasName": "uKXdX",
-    "tableName": "ODS_Pickup",
-    value: ''
+    field: 'COL_14',
+    fieldId: 645,
+    fieldName: '车牌号',
+    dataType: 'STRING',
+    tableAliasName: 'uKXdX',
+    tableName: 'ODS_Pickup',
+    value: '',
   },
   COL_15: {
-    "field": "COL_15",
-    "fieldId": 646,
-    "fieldName": "单据照片",
-    "dataType": "STRING",
-    "tableAliasName": "uKXdX",
-    "tableName": "ODS_Pickup",
-    value: ''
+    field: 'COL_15',
+    fieldId: 646,
+    fieldName: '单据照片',
+    dataType: 'STRING',
+    tableAliasName: 'uKXdX',
+    tableName: 'ODS_Pickup',
+    value: '',
   },
   COL_16: {
-    "field": "COL_16",
-    "fieldId": 647,
-    "fieldName": "采购单名称",
-    "dataType": "STRING",
-    "tableAliasName": "uKXdX",
-    "tableName": "ODS_Pickup",
-    value: ''
+    field: 'COL_16',
+    fieldId: 647,
+    fieldName: '采购单名称',
+    dataType: 'STRING',
+    tableAliasName: 'uKXdX',
+    tableName: 'ODS_Pickup',
+    value: '',
   },
   COL_17: {
-    "field": "COL_17",
-    "fieldId": 648,
-    "fieldName": "提油人手机号码",
-    "dataType": "STRING",
-    "tableAliasName": "uKXdX",
-    "tableName": "ODS_Pickup",
-    value: ''
+    field: 'COL_17',
+    fieldId: 648,
+    fieldName: '提油人手机号码',
+    dataType: 'STRING',
+    tableAliasName: 'uKXdX',
+    tableName: 'ODS_Pickup',
+    value: '',
   },
   COL_18: {
-    "field": "COL_18",
-    "fieldId": 649,
-    "fieldName": "提交日期",
-    "dataType": "DATETIME",
-    "tableAliasName": "uKXdX",
-    "tableName": "ODS_Pickup",
-    value: dayjs().valueOf()
+    field: 'COL_18',
+    fieldId: 649,
+    fieldName: '提交日期',
+    dataType: 'DATETIME',
+    tableAliasName: 'uKXdX',
+    tableName: 'ODS_Pickup',
+    value: dayjs().valueOf(),
   },
   COL_19: {
-    "field": "COL_19",
-    "fieldId": 650,
-    "fieldName": "最后修改日期",
-    "dataType": "DATETIME",
-    "tableAliasName": "uKXdX",
-    "tableName": "ODS_Pickup",
-    value: dayjs().valueOf()
+    field: 'COL_19',
+    fieldId: 650,
+    fieldName: '最后修改日期',
+    dataType: 'DATETIME',
+    tableAliasName: 'uKXdX',
+    tableName: 'ODS_Pickup',
+    value: dayjs().valueOf(),
   },
   COL_20: {
-    "field": "COL_20",
-    "fieldId": 651,
-    "fieldName": "项目编号",
-    "dataType": "STRING",
-    "tableAliasName": "uKXdX",
-    "tableName": "ODS_Pickup",
-    value: ''
+    field: 'COL_20',
+    fieldId: 651,
+    fieldName: '项目编号',
+    dataType: 'STRING',
+    tableAliasName: 'uKXdX',
+    tableName: 'ODS_Pickup',
+    value: '',
   },
   unit_type: {
-    "field": "unit_type",
-    "fieldId": 781,
-    "fieldName": "单位吨或者升",
-    "dataType": "STRING",
-    "tableAliasName": "uKXdX",
-    "tableName": "ods_pickup",
-    value: ''
-  }
+    field: 'unit_type',
+    fieldId: 781,
+    fieldName: '单位吨或者升',
+    dataType: 'STRING',
+    tableAliasName: 'uKXdX',
+    tableName: 'ods_pickup',
+    value: '',
+  },
 })
 
 let id = ''
@@ -255,107 +275,108 @@ onLoad((options) => {
     id = item.ID
     Object.values(formData.value).forEach((item2) => {
       item2.value = item[item2.field]
-    })
+    });
     fileList.value = item.COL_15.map((item) => {
       return {
         name: item.name,
-        url: 'https://miniapp.zhangmushiye.com/' + item.url
+        url: 'https://miniapp.zhangmushiye.com/' + item.url,
       }
-    })
+    });
   }
 })
 
 const formSubmit = () => {
   if (!formData.value.COL_9.value) {
     toast.show('请选择项目名称')
-    return
+    return;
   }
   // 采购单号
   if (!formData.value.COL_4.value) {
     toast.show('请选择采购单号')
-    return
+    return;
   }
   // 提油数量
   if (!formData.value.COL_6.value) {
     toast.show('请输入提油数量')
-    return
+    return;
   }
   // 单位
   if (!formData.value.unit_type.value) {
     toast.show('请选择单位')
-    return
+    return;
   }
   // 单据照片
   if (!formData.value.COL_15.value) {
     toast.show('请上传单据照片')
-    return
+    return;
   }
   let params = {}
   Object.values(formData.value).forEach((item) => {
-    let value = item.value
+    const value = item.value
     params[item.fieldId] = value
-  })
+  });
   params[637] = dayjs(params[637]).valueOf()
   if (id) {
     params[649] = dayjs(params[649]).valueOf()
     params[650] = dayjs().valueOf()
   }
   params[646] = params[646].map((item) => {
-    if (item.url.msg.includes('miniapp.zhangmushiye.com')){
+    if (item.url.msg.includes('miniapp.zhangmushiye.com')) {
       item.url.msg = item.url.msg.replace('https://miniapp.zhangmushiye.com/', '')
     }
     return {
-      url: item.url.msg
+      url: item.url.msg,
     }
-  })
+  });
 
   params = JSON.stringify(params)
   messageBox
-      .confirm({
-        title: '提示',
-        msg: '确认提交吗?'
-      })
-      .then(() => {
-        toast.loading({loadingType: 'ring', msg: '提交中'})
-        let url = 'https://miniapp.zhangmushiye.com/visual-api/paas/visualdev/OnlineDev/63af99d0ee724d149a30b9a782397844'
-        if (id) {
-          url = url + '/' + id
-          // PUT 提交
-          uni.request({
-            url,
-            method: 'PUT',
-            data: {
-              data: params,
-              id
-            },
-            success: (res) => {
-              toast.success('提交成功')
-              uni.navigateBack()
-            },
-            fail: (err) => {
-              toast.error('提交失败')
-            }
-          })
-        } else {
-          uni.request({
-            url,
-            method: 'POST',
-            data: {
-              data: params,
-            },
-            success: (res) => {
-              toast.success('提交成功')
-              uni.navigateBack()
-            },
-            fail: (err) => {
-              toast.error('提交失败')
-            }
-          })
-        }
-      })
-      .catch((error) => {
-        console.log(error)
-      })
+    .confirm({
+      title: '提示',
+      msg: '确认提交吗?',
+    })
+    .then(() => {
+      toast.loading({ loadingType: 'ring', msg: '提交中' })
+      let url =
+        'https://miniapp.zhangmushiye.com/visual-api/paas/visualdev/OnlineDev/63af99d0ee724d149a30b9a782397844'
+      if (id) {
+        url = url + '/' + id
+        // PUT 提交
+        uni.request({
+          url,
+          method: 'PUT',
+          data: {
+            data: params,
+            id,
+          },
+          success: (res) => {
+            toast.success('提交成功')
+            uni.navigateBack()
+          },
+          fail: (err) => {
+            toast.error('提交失败')
+          },
+        })
+      } else {
+        uni.request({
+          url,
+          method: 'POST',
+          data: {
+            data: params,
+          },
+          success: (res) => {
+            toast.success('提交成功')
+            uni.navigateBack()
+          },
+          fail: (err) => {
+            toast.error('提交失败')
+          },
+        })
+      }
+    })
+    .catch((error) => {
+      console.log(error)
+    });
 }
 
 // 获取gps
@@ -371,7 +392,7 @@ import DemoApi from '@/api/DemoApi'
 const fileList = ref([])
 
 function handleChange(files) {
-  let file = []
+  const file = []
   files.fileList.forEach((item) => {
     const response = {}
     try {
@@ -379,16 +400,16 @@ function handleChange(files) {
     } catch (e) {
       response.msg = item.response
     }
-    if (!item.response){
+    if (!item.response) {
       response.msg = {
-        msg: item.url
+        msg: item.url,
       }
     }
     file.push({
       name: '收据图片',
-      url: response.msg
+      url: response.msg,
     })
-  })
+  });
   formData.value.COL_15.value = file
 }
 
@@ -398,71 +419,71 @@ columns.value = userInfo.value.xiangmuList
 // 单据列表
 const kehuList = ref([])
 watch(
-    () => formData.value.COL_20.value,
-    (val) => {
-      DemoApi.purchase({xiangmu_id: val}).then((res) => {
-        kehuList.value = res.data.map((item) => {
-          item.COL_0 = dayjs(item.COL_0).format('YYYY-MM-DD')
-          item.label = `${item.label}_${item.COL_0}${item.CGID ? '_' + item.CGID : ''}`
-          item.value = item.CGID || item.label
-          return item
-        })
-      })
-    }
+  () => formData.value.COL_20.value,
+  (val) => {
+    DemoApi.purchase({ xiangmu_id: val }).then((res) => {
+      kehuList.value = res.data.map((item) => {
+        item.COL_0 = dayjs(item.COL_0).format('YYYY-MM-DD')
+        item.label = `${item.label}_${item.COL_0}${item.CGID ? '_' + item.CGID : ''}`
+        item.value = item.CGID || item.label
+        return item
+      });
+    })
+  }
 )
 
 watch(
-    formData.value,
-    async (val) => {
-      if (val.COL_4.value) {
-        const item = kehuList.value.find((item) => item.value === val.COL_4.value)
-        console.log(item)
-        console.log({COL_0: val.COL_20.value, COL_4: item.COL_2, COL_5: item.COL_3})
+  formData.value,
+  async (val) => {
+    if (val.COL_4.value) {
+      const item = kehuList.value.find((item) => item.value === val.COL_4.value)
+      console.log(item)
+      console.log({ COL_0: val.COL_20.value, COL_4: item.COL_2, COL_5: item.COL_3 })
 
-        await uni.request({
-          url: 'https://miniapp.zhangmushiye.com/bi-api/report/dataapi/qiumidu',
-          method: 'GET',
-          data: {COL_0: val.COL_20.value, COL_4: item.COL_2, COL_5: item.COL_3},
-          header: {
-            'content-type': 'application/json',
-            'Authorization': 'Bearer ' + userInfo.value.token
-          },
-          success: (res) => {
-            if (res.data.data.length > 0) {
-              formData.value.COL_9.value = res.data.data[0].COL_6
-            }
-            // 密度
+      await uni.request({
+        url: 'https://miniapp.zhangmushiye.com/bi-api/report/dataapi/qiumidu',
+        method: 'GET',
+        data: { COL_0: val.COL_20.value, COL_4: item.COL_2, COL_5: item.COL_3 },
+        header: {
+          'content-type': 'application/json',
+          Authorization: 'Bearer ' + userInfo.value.token,
+        },
+        success: (res) => {
+          if (res.data.data.length > 0) {
+            formData.value.COL_9.value = res.data.data[0].COL_6
           }
-        })
-        // 项目名称
-        formData.value.COL_1.value = item.COL_15
-        // 油品名称
-        formData.value.COL_2.value = item.COL_2
-        // 油品型号
-        formData.value.COL_3.value = item.COL_3
-        // 采购单名称
-        formData.value.COL_16.value = item.label
-        // 打款数量
-        formData.value.COL_5.value = item.COL_4
+          // 密度
+        },
+      })
+      // 项目名称
+      formData.value.COL_1.value = item.COL_15
+      // 油品名称
+      formData.value.COL_2.value = item.COL_2
+      // 油品型号
+      formData.value.COL_3.value = item.COL_3
+      // 采购单名称
+      formData.value.COL_16.value = item.label
+      // 打款数量
+      formData.value.COL_5.value = item.COL_4
 
-        // 采购单价
-        formData.value.COL_7.value = item.COL_5
-        // 采购金额
-        formData.value.COL_8.value = item.COL_5 * val.COL_6.value
-        // 折升
-        formData.value.COL_10.value = (val.COL_6.value / 0.83 * 1000).toFixed(3)
-        // 付款单位
-        formData.value.COL_11.value = item.COL_13
-        // 收款单位
-        formData.value.COL_12.value = item.COL_12
-        // 提油人
-        formData.value.COL_13.value = userInfo.value.name
-        // 提油人手机号码
-        formData.value.COL_17.value = userInfo.value.COL_1
-        console.log(formData.value)
-      }
-    },
-    {deep: true}
+      // 采购单价
+      formData.value.COL_7.value = item.COL_5
+      // 采购金额
+      formData.value.COL_8.value = item.COL_5 * val.COL_6.value
+      // 折升
+      formData.value.COL_10.value = ((val.COL_6.value / 0.83) * 1000).toFixed(3)
+      // 付款单位
+      formData.value.COL_11.value = item.COL_13
+      // 收款单位
+      formData.value.COL_12.value = item.COL_12
+      // 提油人
+      formData.value.COL_13.value = userInfo.value.name
+      // 提油人手机号码
+      formData.value.COL_17.value = userInfo.value.COL_1
+      console.log(formData.value)
+    }
+  },
+  { deep: true }
 )
 </script>
 

+ 207 - 179
src/pages/publish/publish.vue

@@ -1,35 +1,54 @@
 <template>
   <view class="pt4 px-2 publish h-full">
-    <wd-message-box/>
-    <wd-toast/>
+    <wd-message-box />
+    <wd-toast />
     <view class="form">
       <form @submit="formSubmit">
         <wd-cell-group custom-class="group" title="基础信息" border>
-          <wd-calendar v-model="formData.COL_0.value" label="加油日期"/>
-          <wd-picker required :columns="xiangmuList" label="项目名称" value-key="COL_4" label-key="COL_3"
-                     v-model="formData.COL_9.value"/>
-          <wd-picker :disabled="!formData.COL_9.value" required :columns="kehuList" value-key="COL_1" label-key="COL_1"
-                     label="客户名称" v-model="formData.COL_8.value" @confirm="kehuChange"/>
+          <wd-calendar v-model="formData.COL_0.value" label="加油日期" />
           <wd-picker
-              :disabled="!formData.COL_9.value"
-              required
-              :columns="columns"
-              value-key="COL_4"
-              label-key="COL_4"
-              label="油品名称"
-              v-model="formData.COL_1.value"
+            v-model="formData.COL_9.value"
+            required
+            :columns="xiangmuList"
+            label="项目名称"
+            value-key="COL_4"
+            label-key="COL_3"
           />
           <wd-picker
-              :disabled="!formData.COL_9.value"
-              required
-              :columns="oilModelList"
-              value-key="COL_5"
-              label-key="COL_5"
-              label="油品型号"
-              v-model="formData.COL_2.value"
+            v-model="formData.COL_8.value"
+            :disabled="!formData.COL_9.value"
+            required
+            :columns="kehuList"
+            value-key="COL_1"
+            label-key="COL_1"
+            label="客户名称"
+            @confirm="kehuChange"
+          />
+          <wd-picker
+            v-model="formData.COL_1.value"
+            :disabled="!formData.COL_9.value"
+            required
+            :columns="columns"
+            value-key="COL_4"
+            label-key="COL_4"
+            label="油品名称"
+          />
+          <wd-picker
+            v-model="formData.COL_2.value"
+            :disabled="!formData.COL_9.value"
+            required
+            :columns="oilModelList"
+            value-key="COL_5"
+            label-key="COL_5"
+            label="油品型号"
+          />
+          <wd-input
+            v-model="formData.COL_3.value"
+            type="digit"
+            label="加油数量"
+            placeholder="请输入提油数量"
+            required
           />
-          <wd-input type="digit"  label="加油数量" placeholder="请输入提油数量" required
-                    v-model="formData.COL_3.value"/>
         </wd-cell-group>
         <wd-cell title="加油单位" title-width="90px" required>
           <wd-radio-group v-model="formData.unit_type.value" size="small" shape="button" inline>
@@ -38,9 +57,13 @@
           </wd-radio-group>
         </wd-cell>
         <wd-cell-group title="票据上传" border class="p3">
-          <view class="h-10"></view>
-          <wd-upload multiple :file-list="fileList" action="https://miniapp.zhangmushiye.com/api/file/uploadFile"
-                     @change="handleChange"></wd-upload>
+          <view class="h-10" />
+          <wd-upload
+            multiple
+            :file-list="fileList"
+            action="https://miniapp.zhangmushiye.com/api/file/uploadFile"
+            @change="handleChange"
+          />
         </wd-cell-group>
         <!--        密度:{{ formData.other.COL_6 }} 吨数:{{ total.ton }} 单价:{{ formData.other.COL_7 }} 金额:{{ total.price }}-->
         <view class="text-center p3">
@@ -54,14 +77,14 @@
 <script setup>
 import dayjs from 'dayjs'
 
-const {userInfo} = storeToRefs(useAuthStore())
+const { userInfo } = storeToRefs(useAuthStore())
 
-import {useMessage} from 'wot-design-uni'
-import {useToast} from 'wot-design-uni'
+import { useMessage } from 'wot-design-uni'
+import { useToast } from 'wot-design-uni'
 
 const toast = useToast()
 const messageBox = useMessage()
-import {ref} from 'vue'
+import { ref } from 'vue'
 
 const formData = ref({
   COL_0: {
@@ -71,7 +94,7 @@ const formData = ref({
     dataType: 'DATETIME',
     tableAliasName: 'GsjST',
     tableName: 'ODS_Oildelivery',
-    value: dayjs().format('YYYY-MM-DD')
+    value: dayjs().format('YYYY-MM-DD'),
   },
   COL_3: {
     field: 'COL_3',
@@ -80,7 +103,7 @@ const formData = ref({
     dataType: 'NUMBER',
     tableAliasName: 'GsjST',
     tableName: 'ODS_Oildelivery',
-    value: ''
+    value: '',
   },
   COL_1: {
     field: 'COL_1',
@@ -89,7 +112,7 @@ const formData = ref({
     dataType: 'STRING',
     tableAliasName: 'GsjST',
     tableName: 'ODS_Oildelivery',
-    value: ''
+    value: '',
   },
   COL_4: {
     field: 'COL_4',
@@ -98,7 +121,7 @@ const formData = ref({
     dataType: 'NUMBER',
     tableAliasName: 'GsjST',
     tableName: 'ODS_Oildelivery',
-    value: ''
+    value: '',
   },
   COL_2: {
     field: 'COL_2',
@@ -107,7 +130,7 @@ const formData = ref({
     dataType: 'STRING',
     tableAliasName: 'GsjST',
     tableName: 'ODS_Oildelivery',
-    value: ''
+    value: '',
   },
   COL_5: {
     field: 'COL_5',
@@ -116,7 +139,7 @@ const formData = ref({
     dataType: 'NUMBER',
     tableAliasName: 'GsjST',
     tableName: 'ODS_Oildelivery',
-    value: ''
+    value: '',
   },
   COL_6: {
     field: 'COL_6',
@@ -125,7 +148,7 @@ const formData = ref({
     dataType: 'STRING',
     tableAliasName: 'GsjST',
     tableName: 'ODS_Oildelivery',
-    value: ''
+    value: '',
   },
   COL_7: {
     field: 'COL_7',
@@ -134,7 +157,7 @@ const formData = ref({
     dataType: 'STRING',
     tableAliasName: 'GsjST',
     tableName: 'ODS_Oildelivery',
-    value: ''
+    value: '',
   },
   COL_8: {
     field: 'COL_8',
@@ -143,7 +166,7 @@ const formData = ref({
     dataType: 'STRING',
     tableAliasName: 'GsjST',
     tableName: 'ODS_Oildelivery',
-    value: ''
+    value: '',
   },
   COL_9: {
     field: 'COL_9',
@@ -152,7 +175,7 @@ const formData = ref({
     dataType: 'STRING',
     tableAliasName: 'GsjST',
     tableName: 'ODS_Oildelivery',
-    value: ''
+    value: '',
   },
   COL_10: {
     field: 'COL_10',
@@ -161,7 +184,7 @@ const formData = ref({
     dataType: 'STRING',
     tableAliasName: 'GsjST',
     tableName: 'ODS_Oildelivery',
-    value: ''
+    value: '',
   },
   COL_11: {
     field: 'COL_11',
@@ -170,7 +193,7 @@ const formData = ref({
     dataType: 'STRING',
     tableAliasName: 'GsjST',
     tableName: 'ODS_Oildelivery',
-    value: userInfo.value.name
+    value: userInfo.value.name,
   },
   COL_12: {
     field: 'COL_12',
@@ -179,7 +202,7 @@ const formData = ref({
     dataType: 'STRING',
     tableAliasName: 'GsjST',
     tableName: 'ODS_Oildelivery',
-    value: userInfo.value.COL_5
+    value: userInfo.value.COL_5,
   },
   COL_13: {
     field: 'COL_13',
@@ -188,7 +211,7 @@ const formData = ref({
     dataType: 'STRING',
     tableAliasName: 'GsjST',
     tableName: 'ODS_Oildelivery',
-    value: ''
+    value: '',
   },
   COL_14: {
     field: 'COL_14',
@@ -197,7 +220,7 @@ const formData = ref({
     dataType: 'STRING',
     tableAliasName: 'GsjST',
     tableName: 'ODS_Oildelivery',
-    value: ''
+    value: '',
   },
   COL_15: {
     field: 'COL_15',
@@ -206,7 +229,7 @@ const formData = ref({
     dataType: 'STRING',
     tableAliasName: 'GsjST',
     tableName: 'ODS_Oildelivery',
-    value: userInfo.value.COL_1
+    value: userInfo.value.COL_1,
   },
   COL_16: {
     field: 'COL_16',
@@ -215,7 +238,7 @@ const formData = ref({
     dataType: 'STRING',
     tableAliasName: 'GsjST',
     tableName: 'ODS_Oildelivery',
-    value: ''
+    value: '',
   },
   COL_17: {
     field: 'COL_17',
@@ -224,7 +247,7 @@ const formData = ref({
     dataType: 'DATETIME',
     tableAliasName: 'GsjST',
     tableName: 'ODS_Oildelivery',
-    value: dayjs().valueOf()
+    value: dayjs().valueOf(),
   },
   COL_18: {
     field: 'COL_18',
@@ -233,7 +256,7 @@ const formData = ref({
     dataType: 'DATETIME',
     tableAliasName: 'GsjST',
     tableName: 'ODS_Oildelivery',
-    value: dayjs().valueOf()
+    value: dayjs().valueOf(),
   },
   COL_19: {
     field: 'COL_19',
@@ -242,24 +265,24 @@ const formData = ref({
     dataType: 'STRING',
     tableAliasName: 'GsjST',
     tableName: 'ODS_Oildelivery',
-    value: ''
+    value: '',
   },
   unit_type: {
-    "field": "unit_type",
-    "fieldId": 782,
-    "fieldName": "单位吨或者升",
-    "dataType": "STRING",
-    "tableAliasName": "GsjST",
-    "tableName": "ods_oildelivery",
-    value: ''
-  }
+    field: 'unit_type',
+    fieldId: 782,
+    fieldName: '单位吨或者升',
+    dataType: 'STRING',
+    tableAliasName: 'GsjST',
+    tableName: 'ods_oildelivery',
+    value: '',
+  },
 })
 
 let id = ''
 onLoad((options) => {
   if (options.query) {
     // 正在加载
-    toast.loading({loadingType: 'ring', msg: '加载中'})
+    toast.loading({ loadingType: 'ring', msg: '加载中' })
     const item = JSON.parse(decodeURIComponent(options.query))
     console.log(item)
     id = item.ID
@@ -267,43 +290,42 @@ onLoad((options) => {
       url: 'https://miniapp.zhangmushiye.com/bi-api/report/dataapi/driverXiangmu',
       method: 'GET',
       data: {
-        phone: userInfo.value.COL_1
+        phone: userInfo.value.COL_1,
       },
       success: (res) => {
         xiangmuList.value = res.data.data
-      }
+      },
     })
     DemoApi.projectList(userInfo.value).then((res) => {
       oldColumns.value = res.data
       // 排重
       columns.value = res.data.filter((item, index, arr) => {
         return arr.findIndex((item2) => item2.COL_1 === item.COL_1) === index
-      })
+      });
       oilList.value = res.data.filter((item, index, arr) => {
         return arr.findIndex((item2) => item2.COL_5 === item.COL_5) === index
-      })
+      });
       Object.values(formData.value).forEach((item2) => {
         item2.value = item[item2.field]
-      })
+      });
       fileList.value = item.COL_19.map((item) => {
         return {
           name: item.name,
-          url: 'https://miniapp.zhangmushiye.com/' + item.url
+          url: 'https://miniapp.zhangmushiye.com/' + item.url,
         }
-      })
+      });
       toast.close()
-    })
+    });
   } else {
-
     uni.request({
       url: 'https://miniapp.zhangmushiye.com/bi-api/report/dataapi/driverXiangmu',
       method: 'GET',
       data: {
-        phone: userInfo.value.COL_1
+        phone: userInfo.value.COL_1,
       },
       success: (res) => {
         xiangmuList.value = res.data.data
-      }
+      },
     })
 
     // DemoApi.projectList(userInfo.value).then((res) => {
@@ -322,30 +344,30 @@ onLoad((options) => {
 const formSubmit = () => {
   if (!formData.value.COL_9.value) {
     toast.show('请选择项目名称')
-    return
+    return;
   }
   if (!formData.value.COL_8.value) {
     toast.show('请选择客户名称')
-    return
+    return;
   }
   if (!formData.value.COL_3.value) {
     toast.show('请输入加油数量')
-    return
+    return;
   }
   // 单位
   if (!formData.value.unit_type.value) {
     toast.show('请选择单位')
-    return
+    return;
   }
   if (!formData.value.COL_19.value) {
     toast.show('请上传加油票据')
-    return
+    return;
   }
   let params = {}
   Object.values(formData.value).forEach((item) => {
-    let value = item.value
+    const value = item.value
     params[item.fieldId] = value
-  })
+  });
   params[615] = dayjs(params[615]).valueOf()
   console.log(id)
   if (id) {
@@ -357,58 +379,59 @@ const formSubmit = () => {
       item.url.msg = item.url.msg.replace('https://miniapp.zhangmushiye.com/', '')
     }
     return {
-      url: item.url.msg
+      url: item.url.msg,
     }
-  })
+  });
   console.log(params)
   // return;
   params = JSON.stringify(params)
   messageBox
-      .confirm({
-        title: '提示',
-        msg: '确认提交吗?'
-      })
-      .then(() => {
-        toast.loading({loadingType: 'ring', msg: '提交中'})
-        let url = 'https://miniapp.zhangmushiye.com/visual-api/paas/visualdev/OnlineDev/7164c3e7895f49fd0c4e2742e81cb726'
-        if (id) {
-          url = url + '/' + id
-          // PUT 提交
-          uni.request({
-            url,
-            method: 'PUT',
-            data: {
-              data: params,
-              id
-            },
-            success: (res) => {
-              toast.success('提交成功')
-              uni.navigateBack()
-            },
-            fail: (err) => {
-              toast.error('提交失败')
-            }
-          })
-        } else {
-          uni.request({
-            url,
-            method: 'POST',
-            data: {
-              data: params,
-            },
-            success: (res) => {
-              toast.success('提交成功')
-              uni.navigateBack()
-            },
-            fail: (err) => {
-              toast.error('提交失败')
-            }
-          })
-        }
-      })
-      .catch((error) => {
-        console.log(error)
-      })
+    .confirm({
+      title: '提示',
+      msg: '确认提交吗?',
+    })
+    .then(() => {
+      toast.loading({ loadingType: 'ring', msg: '提交中' })
+      let url =
+        'https://miniapp.zhangmushiye.com/visual-api/paas/visualdev/OnlineDev/7164c3e7895f49fd0c4e2742e81cb726'
+      if (id) {
+        url = url + '/' + id
+        // PUT 提交
+        uni.request({
+          url,
+          method: 'PUT',
+          data: {
+            data: params,
+            id,
+          },
+          success: (res) => {
+            toast.success('提交成功')
+            uni.navigateBack()
+          },
+          fail: (err) => {
+            toast.error('提交失败')
+          },
+        })
+      } else {
+        uni.request({
+          url,
+          method: 'POST',
+          data: {
+            data: params,
+          },
+          success: (res) => {
+            toast.success('提交成功')
+            uni.navigateBack()
+          },
+          fail: (err) => {
+            toast.error('提交失败')
+          },
+        })
+      }
+    })
+    .catch((error) => {
+      console.log(error)
+    });
 }
 
 // 获取gps
@@ -418,14 +441,14 @@ uni.getFuzzyLocation({
     console.log(res)
     formData.value.COL_13.value = res.longitude
     formData.value.COL_14.value = res.latitude
-  }
+  },
 })
 import DemoApi from '@/api/DemoApi'
 
 const fileList = ref([])
 
 function handleChange(files) {
-  let file = []
+  const file = []
   files.fileList.forEach((item) => {
     const response = {}
     try {
@@ -435,14 +458,14 @@ function handleChange(files) {
     }
     if (!item.response) {
       response.msg = {
-        msg: item.url
+        msg: item.url,
       }
     }
     file.push({
       name: '收据图片',
-      url: response.msg
+      url: response.msg,
     })
-  })
+  });
   formData.value.COL_19.value = file
 }
 
@@ -456,29 +479,29 @@ const oilList = ref([])
 // 客户列表
 const kehuList = ref([])
 watch(
-    () => formData.value.COL_9.value,
-    (val) => {
-      uni.request({
-        url: 'https://miniapp.zhangmushiye.com/bi-api/report/dataapi/kehu',
-        method: 'GET',
-        data: {
-          xiangmu_id: val
-        },
-        success: (res) => {
-          kehuList.value = res.data.data
-        }
-      })
+  () => formData.value.COL_9.value,
+  (val) => {
+    uni.request({
+      url: 'https://miniapp.zhangmushiye.com/bi-api/report/dataapi/kehu',
+      method: 'GET',
+      data: {
+        xiangmu_id: val,
+      },
+      success: (res) => {
+        kehuList.value = res.data.data
+      },
+    })
 
-      DemoApi.projectList({COL_4: val}).then((res) => {
-        oldColumns.value = res.data
-        columns.value = res.data.filter((item, index, arr) => {
-          return arr.findIndex((item2) => item2.COL_1 === item.COL_1) === index
-        })
-        oilList.value = res.data.filter((item, index, arr) => {
-          return arr.findIndex((item2) => item2.COL_5 === item.COL_5) === index
-        })
-      })
-    }
+    DemoApi.projectList({ COL_4: val }).then((res) => {
+      oldColumns.value = res.data
+      columns.value = res.data.filter((item, index, arr) => {
+        return arr.findIndex((item2) => item2.COL_1 === item.COL_1) === index
+      });
+      oilList.value = res.data.filter((item, index, arr) => {
+        return arr.findIndex((item2) => item2.COL_5 === item.COL_5) === index
+      });
+    })
+  }
 )
 const kehuChange = (e) => {
   // formData.value.COL_9.value = e.selectedItems.COL_9
@@ -486,38 +509,43 @@ const kehuChange = (e) => {
 // 油品型号
 const oilModelList = ref([])
 watch(
-    () => formData.value.COL_1.value,
-    (val) => {
-      oilModelList.value = oilList.value.filter((item) => item.COL_4 === val)
-    }
+  () => formData.value.COL_1.value,
+  (val) => {
+    oilModelList.value = oilList.value.filter((item) => item.COL_4 === val)
+  }
 )
 
 watch(
-    formData.value,
-    (val) => {
-      const find = oldColumns.value.find(
-          (item) => item.COL_0 === formData.value.COL_9.value && item.COL_4 === formData.value.COL_1.value && item.COL_5 === formData.value.COL_2.value
-      )
-      if (!find) {
-        return 0
-      }
-      // 油品密度
-      formData.value.COL_4.value = find.COL_6
-      // 送油单价
-      formData.value.COL_6.value = find.COL_7
-      // 吨数
-      const ton = ((formData.value.COL_3.value * +find.COL_6) / 1000).toFixed(3)
-      formData.value.COL_5.value = ton
-      // 送油金额
-      const price = (ton * +find.COL_7).toFixed(3)
-      formData.value.COL_7.value = price
+  formData.value,
+  (val) => {
+    const find = oldColumns.value.find(
+      (item) =>
+        item.COL_0 === formData.value.COL_9.value &&
+        item.COL_4 === formData.value.COL_1.value &&
+        item.COL_5 === formData.value.COL_2.value
+    )
+    if (!find) {
+      return 0
+    }
+    // 油品密度
+    formData.value.COL_4.value = find.COL_6
+    // 送油单价
+    formData.value.COL_6.value = find.COL_7
+    // 吨数
+    const ton = ((formData.value.COL_3.value * +find.COL_6) / 1000).toFixed(3)
+    formData.value.COL_5.value = ton
+    // 送油金额
+    const price = (ton * +find.COL_7).toFixed(3)
+    formData.value.COL_7.value = price
 
-      // 项目编号
-      // formData.value.COL_9.value = find.COL_0
-      // 项目名称
-      formData.value.COL_10.value = xiangmuList.value.find((item) => item.COL_4 === formData.value.COL_9.value).COL_3
-    },
-    {deep: true}
+    // 项目编号
+    // formData.value.COL_9.value = find.COL_0
+    // 项目名称
+    formData.value.COL_10.value = xiangmuList.value.find(
+      (item) => item.COL_4 === formData.value.COL_9.value
+    ).COL_3
+  },
+  { deep: true }
 )
 </script>
 

+ 8 - 5
src/pages/routerDemo/RouterDemo.vue

@@ -1,6 +1,6 @@
 <template>
   <view class="router-demo">
-    <test></test>
+    <test />
     <wd-button block size="large" type="primary" @click="nav1">字符串路径</wd-button>
     <wd-button block size="large" type="primary" @click="nav2">带有路径的对象</wd-button>
     <wd-button block size="large" type="primary" @click="nav3">命名的路由</wd-button>
@@ -15,7 +15,7 @@ import Test from './cmp/Test.vue'
 
 onShow(() => {
   console.log(2323)
-})
+});
 
 const router = useRouter()
 
@@ -43,7 +43,7 @@ function nav4() {
 function nav5() {
   const user = {
     name: '小星星',
-    label: '小熊熊'
+    label: '小熊熊',
   }
   router.push({ name: 'routerDemo1', params: { user: encodeURIComponent(JSON.stringify(user)) } })
 }
@@ -52,9 +52,12 @@ function nav5() {
 function nav6() {
   const user = {
     name: '小星星',
-    label: '小熊熊'
+    label: '小熊熊',
   }
-  router.push({ path: '/pagesA/routerDemo/RouterDemo1', query: { user: encodeURIComponent(JSON.stringify(user)) } })
+  router.push({
+    path: '/pagesA/routerDemo/RouterDemo1',
+    query: { user: encodeURIComponent(JSON.stringify(user)) },
+  })
 }
 </script>
 

+ 2 - 2
src/pages/routerDemo/RouterDemo1.vue

@@ -1,6 +1,6 @@
 <template>
   <view>
-    <test></test>
+    <test />
     <wd-button block size="large" type="primary" @click="back">返回</wd-button>
   </view>
 </template>
@@ -9,7 +9,7 @@
 import Test from './cmp/Test.vue'
 onShow(() => {
   console.log(2323322232)
-})
+});
 
 const router = useRouter()
 function back() {

+ 1 - 1
src/pages/routerDemo/cmp/Test.vue

@@ -3,7 +3,7 @@
  * @Date: 2021-12-22 15:19:08
  * @LastEditTime: 2023-05-31 14:51:14
  * @LastEditors: weisheng
- * @Description: 
+ * @Description:
  * @FilePath: \uniapp-vue3-fant-ts\src\pages\routerDemo\cmp\Test.vue
  * 记得注释
 -->

+ 71 - 2
src/pages/settlement/form.vue

@@ -1,4 +1,73 @@
 <template>
-  <view class="settlement-form"></view>
+  <view class="settlement-form">
+    <form-list
+      :id="id"
+      :filed-list="formDataSet.fields"
+      :form-key="formKey"
+      :data-form="dataForm"
+      :uplod-key="544"
+      :old-form-data="JSON.stringify(dataForm)"
+    />
+  </view>
 </template>
-<script setup lang="ts"></script>
+<script setup lang="ts">
+import DemoApi from '@/api/DemoApi';
+import formList from '@/components/formList.vue';
+import config from '@/http/config';
+
+const formKey = ref<string>('');
+const id = ref<string>('');
+const filedsData = ref<Object>([]);
+onLoad((option) => {
+  formKey.value = option.formKey;
+  filedsData.value = JSON.parse(option.filedsData || '{}');
+  id.value = filedsData.value.id;
+  init();
+})
+const formDataSet = ref({});
+const dataForm = ref({});
+const rules = ref({});
+function init() {
+  DemoApi.getConfig(formKey.value).then((res) => {
+    formDataSet.value = JSON.parse(res.data.formData || '{}');
+    const obj = {};
+    const objAllSet = {};
+    formDataSet.value.fields.map((item) => {
+      obj[item.__vModel__] = item.defaultValue || null;
+      objAllSet[item.__vModel__] = item.__config__.jnpfKey;
+      if (item.__config__.required) {
+        rules.value[item.__vModel__] = [
+          { required: true, message: item.__config__.label + '未填写' },
+        ];
+      }
+    });
+
+    Object.keys(obj).map((key) => {
+      Object.values(filedsData.value).map((item) => {
+        if (parseInt(item.fieldId) === parseInt(key)) {
+          obj[key] = item.value;
+        }
+      });
+      if (objAllSet[key] === 'date') {
+        obj[key] = new Date(obj[key]).getTime();
+      }
+      if (objAllSet[key] === 'uploadImg') {
+        // 如果返回字符串长度大于3则转成数组
+        if (obj[key]) {
+          obj[key] = JSON.parse(obj[key]);
+          obj[key] = obj[key].map((item) => {
+            return {
+              url: config.baseURL + item.url,
+              name: item.name,
+              fileld: item.fileld,
+            };
+          })
+        } else {
+          obj[key] = [];
+        }
+      }
+    });
+    dataForm.value = obj;
+  })
+}
+</script>

+ 161 - 46
src/pages/settlement/list.vue

@@ -1,15 +1,23 @@
 <template>
   <view class="settlement-form">
-    <wd-search v-model="value" title="搜索" @change="searchChange" @focus="searchFocus">
-      <template #prefix>
-        <wd-popover v-model="show" mode="menu" :content="menu" @menuclick="changeSearchType">
-          <view class="search-type">
-            <text>{{ searchType }}</text>
-            <wd-icon custom-class="icon-arrow" name="fill-arrow-down"></wd-icon>
-          </view>
-        </wd-popover>
-      </template>
-    </wd-search>
+    <view class="search-view">
+      <wd-search
+        v-model="value"
+        cancel-txt="搜索"
+        @change="searchChange"
+        @cancel="cancelChange"
+        @focus="searchFocus"
+      >
+        <template #prefix>
+          <wd-popover v-model="show" mode="menu" :content="menu" @menuclick="changeSearchType">
+            <view class="search-type">
+              <text>{{ searchType }}</text>
+              <wd-icon custom-class="icon-arrow" name="fill-arrow-down" />
+            </view>
+          </wd-popover>
+        </template>
+      </wd-search>
+    </view>
     <wd-action-sheet
       v-model="showSheet"
       :title="searchType"
@@ -17,10 +25,35 @@
       @close="close"
       @select="select"
     />
+
+    <template v-for="(item, index) in settlementList" :key="index">
+      <wd-card :title="'开票日期:' + item.COL_0.value">
+        <view class="justify-between items-center flex">
+          <view>
+            <template v-for="(field, index) in showListField">
+              <view>{{ field.content }}: {{ item[field.field].value }}</view>
+            </template>
+          </view>
+          <view class="">
+            <wd-button size="small" type="warning" @click="goEdit(item)">编辑</wd-button>
+          </view>
+        </view>
+      </wd-card>
+    </template>
+  </view>
+  <view class="pagination">
+    <wd-pagination
+      v-model="pageQuery.current"
+      :page-size="pageQuery.size"
+      :total="pageQuery.total"
+      show-icon
+      @change="handleChangePagination"
+    />
   </view>
 </template>
 <script setup lang="ts">
 import DemoApi from '@/api/DemoApi';
+import router from '@/router';
 import { ref } from 'vue';
 import { useToast } from 'wot-design-uni';
 const show = ref<boolean>(false);
@@ -40,6 +73,25 @@ const menu = ref([
     filedName: 'customerName',
   },
 ]);
+const showListField = ref([
+  {
+    content: '项目名称',
+    field: 'COL_10',
+  },
+  {
+    content: '油品名称',
+    field: 'COL_1',
+  },
+  // 油品型号
+  {
+    content: '油品型号',
+    field: 'COL_2',
+  },
+  {
+    content: '客户名称',
+    field: 'COL_11',
+  },
+]);
 const showSheet = ref<boolean>(false);
 function changeSearchType({ item, index }) {
   searchType.value = item.content;
@@ -51,34 +103,39 @@ function changeSearchType({ item, index }) {
     actions.value = oilList.value;
   } else if (index === 2) {
     actions.value = userList.value;
-  }
+  }
 }
 function searchFocus() {
   showSheet.value = true;
-}
+}
 function searchChange(value) {
   // 如果输入框为空则清空 searchForm
-  if (!value) {
+  if (!value.value) {
     searchForm.value = {
       projectName: '',
       oilName: '',
       customerName: '',
     };
-  }
+    getSettlementList();
+  }
 }
+// cancelChange
+function cancelChange(value) {
+  getSettlementList();
+}
 const actions = ref([]);
-// 油品名称
+// 油品名称
 const oilList = ref([{ name: '柴油' }, { name: '汽油' }]);
-// 客户名称
+// 客户名称
 const userList = ref([]);
-// 获取客户列表
+// 获取客户列表
 const getUserList = () => {
   DemoApi.getCustomerList().then((res) => {
     userList.value = res.data.map((item) => {
       return { name: item.COL_ALIAS_1 };
-    });
+    })
   });
-};
+}
 getUserList();
 const projectList = ref([]);
 const getProjectList = () => {
@@ -86,22 +143,22 @@ const getProjectList = () => {
   DemoApi.getProjectNameList().then((res) => {
     projectList.value = res.data.map((item) => {
       return { name: item.项目名称 };
-    });
+    })
     actions.value = projectList.value;
-  });
-};
+  })
+};
 getProjectList();
-
+
 function close() {
   showSheet.value = false;
-}
+}
 const searchForm = ref({
   projectName: '',
   oilName: '',
   customerName: '',
 });
 const toast = useToast();
-
+
 function select({ item, index }) {
   showSheet.value = false;
   if (searchType.value === '项目名称') {
@@ -110,61 +167,100 @@ function select({ item, index }) {
     searchForm.value.oilName = item.name;
   } else if (searchType.value === '客户名称') {
     searchForm.value.customerName = item.name;
-  }
+  }
   value.value = item.name;
-}
+}
 // 分页数据
 const pageQuery = ref({
   current: 1,
   size: 20,
   descs: 536,
+  total: 0,
 });
-
-// 获取结算管理列表
+
+// 获取结算管理列表
+const formKey = ref<string>('4d62523c9ef74cdacb90146125929f37');
+const idKeyData = ref<string>('');
 const settlementList = ref([]);
 const tableData = ref([]);
 const getSettlementList = () => {
-  DemoApi.getConfig('4d62523c9ef74cdacb90146125929f37').then((res) => {
-    let { dbLinkId } = res.data;
-
+  DemoApi.getConfig(formKey.value).then((res) => {
+    const { dbLinkId, idKey } = res.data;
+    idKeyData.value = idKey;
     tableData.value = JSON.parse(res.data.tables || '[]');
-    // 匹配fieldName == menu name的值 并且再menu添加 fieldId
+    // 匹配fieldName == menu name的值 并且再menu添加 fieldId
     menu.value.map((item) => {
       tableData.value.map((table) => {
         if (table.fieldName === item.content) {
           item.fieldId = table.fieldId;
-        }
+        }
       });
-    });
+    })
     const params = {
       dbLinkId,
       pageQuery: pageQuery.value,
       paramList: [],
     };
     pageQuery.value.descs = JSON.parse(res.data.columnData || '{}')?.defaultSidx;
-
     menu.value.map((item) => {
-      let obj = {
+      const obj = {
         cubeColumnId: item.fieldId,
         function: 'in',
         values: [],
       };
       if (searchForm.value[item.filedName]) {
         obj.values.push(searchForm.value[item.filedName]);
-      }
+      }
       params.paramList.push(obj);
-    });
+    })
 
-    console.log(params, 'p');
-    DemoApi.getFormDataList(params).then((res) => {
-      console.log('🚀 ~ DemoApi.getFormDataList ~ res:', res);
-      settlementList.value = res.data;
-    });
+    DemoApi.getFormDataList(params).then((resp) => {
+      const { columnDict, pageData } = resp.data;
+      pageQuery.value.total = pageData.total;
+      pageQuery.value.current = pageData.current;
+      pageQuery.value.size = pageData.size;
+      // columnDict 是 pageData.records 和 tableData 的映射关系
+      // columnDict的key是tableData的fieldId,value是pageData.records的 key
+      // pageData.records 是后台返回的数据
+      // tableData 是前台配置的表头
+      const idKey = columnDict[idKeyData.value];
+      const arr = [];
+      pageData.records.map((val) => {
+        const obj = {};
+        obj.id = val[idKey];
+        for (const key in columnDict) {
+          tableData.value.map((item) => {
+            if (item.fieldId == key) {
+              // obj[item.field] = val[columnDict[key]];
+              obj[item.field] = {
+                value: val[columnDict[key]],
+                field: item.field,
+                fieldName: item.fieldName,
+                fieldId: item.fieldId,
+                pageDataRecordKey: columnDict[key],
+              };
+            }
+          });
+        }
+        arr.push(obj);
+      })
+      // 回到顶部
+      settlementList.value = arr;
+    })
   });
-};
+}
 getSettlementList();
+function handleChangePagination() {
+  getSettlementList();
+}
+function goEdit(item) {
+  router.push({
+    path: 'pages/settlement/form',
+    query: { filedsData: JSON.stringify(item || '[]'), formKey: formKey.value },
+  });
+}
 </script>
-
+
 <style lang="scss" scoped>
 .search-type {
   position: relative;
@@ -188,4 +284,23 @@ getSettlementList();
     vertical-align: middle;
   }
 }
+// 固定底部
+.pagination {
+  position: fixed;
+  bottom: 0;
+  left: 0;
+  width: 100%;
+  z-index: 1;
+}
+.settlement-form {
+  padding: 75rpx 0;
+}
+// 固定到顶部
+.search-view {
+  position: fixed;
+  top: 0;
+  left: 0;
+  width: 100%;
+  z-index: 1;
+}
 </style>

+ 8 - 5
src/pagesA/routerDemo/RouterDemo.vue

@@ -1,6 +1,6 @@
 <template>
   <view class="router-demo">
-    <test></test>
+    <test />
     <wd-button block size="large" type="primary" @click="nav1">字符串路径</wd-button>
     <wd-button block size="large" type="primary" @click="nav2">带有路径的对象</wd-button>
     <wd-button block size="large" type="primary" @click="nav3">命名的路由</wd-button>
@@ -15,7 +15,7 @@ import Test from './cmp/Test.vue'
 
 onShow(() => {
   console.log(2323)
-})
+});
 
 const router = useRouter()
 
@@ -43,7 +43,7 @@ function nav4() {
 function nav5() {
   const user = {
     name: '小星星',
-    label: '小熊熊'
+    label: '小熊熊',
   }
   router.push({ name: 'routerDemo1', params: { user: encodeURIComponent(JSON.stringify(user)) } })
 }
@@ -52,9 +52,12 @@ function nav5() {
 function nav6() {
   const user = {
     name: '小星星',
-    label: '小熊熊'
+    label: '小熊熊',
   }
-  router.push({ path: '/pagesA/routerDemo/RouterDemo1', query: { user: encodeURIComponent(JSON.stringify(user)) } })
+  router.push({
+    path: '/pagesA/routerDemo/RouterDemo1',
+    query: { user: encodeURIComponent(JSON.stringify(user)) },
+  })
 }
 </script>
 

+ 2 - 2
src/pagesA/routerDemo/RouterDemo1.vue

@@ -1,6 +1,6 @@
 <template>
   <view>
-    <test></test>
+    <test />
     <wd-button block size="large" type="primary" @click="back">返回</wd-button>
   </view>
 </template>
@@ -9,7 +9,7 @@
 import Test from './cmp/Test.vue'
 onShow(() => {
   console.log(2323322232)
-})
+});
 
 const router = useRouter()
 function back() {

+ 1 - 1
src/pagesA/routerDemo/cmp/Test.vue

@@ -3,7 +3,7 @@
  * @Date: 2021-12-22 15:19:08
  * @LastEditTime: 2023-05-31 14:51:14
  * @LastEditors: weisheng
- * @Description: 
+ * @Description:
  * @FilePath: \uniapp-vue3-fant-ts\src\pages\routerDemo\cmp\Test.vue
  * 记得注释
 -->

+ 1 - 1
src/router/index.ts

@@ -11,7 +11,7 @@
 import pagesJson from '../pages.json'
 import pagesJsonToRoutes from 'uni-parse-pages'
 const router = createRouter({
-  routes: [...pagesJsonToRoutes(pagesJson)]
+  routes: [...pagesJsonToRoutes(pagesJson)],
 })
 router.beforeEach((to, from, next) => {
   const authStore = useAuthStore()

+ 1 - 1
src/shime-uni.d.ts

@@ -10,6 +10,6 @@
  */
 export {}
 declare module 'vue' {
-  type Hooks = App.AppInstance & Page.PageInstance
+  type Hooks = App.AppInstance & Page.PageInstance;
   interface ComponentCustomOptions extends Hooks {}
 }

BIN
src/static/bg.jpg


+ 9 - 7
src/store/index.ts

@@ -7,22 +7,24 @@
  * @FilePath: \wot-starter\src\store\index.ts
  * 记得注释
  */
-import { defineStore } from 'pinia'
+import { defineStore } from 'pinia';
 
 interface AuthStore {
   // 鉴权令牌
-  userInfo: {}
+  userInfo: {};
 }
 // defineStore 调用后返回一个函数,调用该函数获得 Store 实体
 export const useAuthStore = defineStore('authState', {
   // state: 返回对象的函数
   state: (): AuthStore => ({
-    userInfo: {}
+    userInfo: {},
   }),
   getters: {},
   actions: {
     logout() {
-      this.userInfo = {}
-    }
-  }
-})
+      this.userInfo = {};
+      // 清空token
+      uni.removeStorageSync('token');
+    },
+  },
+});

+ 1 - 1
src/store/persist.ts

@@ -22,5 +22,5 @@ export function persist({ store }: PiniaPluginContext) {
   store.$subscribe(() => {
     // 在存储变化的时候将store缓存
     uni.setStorageSync(store.$id, deepClone(store.$state))
-  })
+  });
 }

+ 20 - 0
src/utils/getTime.ts

@@ -0,0 +1,20 @@
+import moment from 'moment';
+let themonth = moment().format('YYYYMM');
+let year = moment().year();
+if (moment().startOf('month').format('D') == moment().format('D')) {
+  themonth = moment().subtract(1, 'months').format('YYYYMM');
+}
+year = moment().subtract(1, 'months').format('YYYY');
+export default {
+  date: moment().add(-1, 'days').format('YYYYMM'),
+  month: moment().add(-1, 'months').format('YYYYMM'),
+  themonth: themonth,
+  quarter: String(moment().year()) + moment().quarter() - 1,
+  year: year,
+  theyear: String(moment().year()),
+  today: moment().format('YYYYMMDD'),
+  yesterday: moment().add(-1, 'days').format('YYYYMMDD'),
+  lart30: moment().subtract('days', 30).format('YYYYMMDD'),
+  startTime: moment().add(-12, 'months').format('YYYYMM'),
+  endTime: moment().add(-1, 'months').format('YYYYMM'),
+}

+ 14 - 261
yarn.lock

@@ -4532,14 +4532,6 @@ agentkeepalive@^3.4.1:
   dependencies:
     humanize-ms "^1.2.1"
 
-aggregate-error@^3.0.0:
-  version "3.1.0"
-  resolved "https://registry.npmmirror.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a"
-  integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==
-  dependencies:
-    clean-stack "^2.0.0"
-    indent-string "^4.0.0"
-
 ajv-formats@^1.5.1:
   version "1.6.1"
   resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-1.6.1.tgz#35c7cdcd2a12d509171c37bac32f2e8eb010a536"
@@ -4612,7 +4604,7 @@ ansi-256-colors@^1.1.0:
   resolved "https://registry.yarnpkg.com/ansi-256-colors/-/ansi-256-colors-1.1.0.tgz#910de50efcc7c09e3d82f2f87abd6b700c18818a"
   integrity sha512-roJI/AVBdJIhcohHDNXUoFYsCZG4MZIs5HtKNgVKY5QzqQoQJe+o0ouiqZDaSC+ggKdBVcuSwlSdJckrrlm3/A==
 
-ansi-escapes@^4.2.1, ansi-escapes@^4.3.0:
+ansi-escapes@^4.2.1:
   version "4.3.2"
   resolved "https://registry.npmmirror.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e"
   integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==
@@ -4629,11 +4621,6 @@ ansi-regex@^5.0.1:
   resolved "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304"
   integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==
 
-ansi-regex@^6.0.1:
-  version "6.0.1"
-  resolved "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a"
-  integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==
-
 ansi-styles@^2.2.1:
   version "2.2.1"
   resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
@@ -4653,11 +4640,6 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0:
   dependencies:
     color-convert "^2.0.1"
 
-ansi-styles@^6.0.0:
-  version "6.2.1"
-  resolved "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5"
-  integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==
-
 any-base@^1.1.0:
   version "1.1.0"
   resolved "https://registry.npmmirror.com/any-base/-/any-base-1.1.0.tgz#ae101a62bc08a597b4c9ab5b7089d456630549fe"
@@ -4774,11 +4756,6 @@ ast-types@^0.13.2:
   dependencies:
     tslib "^2.0.1"
 
-astral-regex@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.npmmirror.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31"
-  integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==
-
 async@^3.2.3:
   version "3.2.4"
   resolved "https://registry.yarnpkg.com/async/-/async-3.2.4.tgz#2d22e00f8cddeb5fde5dd33522b56d1cf569a81c"
@@ -5879,11 +5856,6 @@ caseless@~0.12.0:
   resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
   integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==
 
-chalk@5.2.0:
-  version "5.2.0"
-  resolved "https://registry.npmmirror.com/chalk/-/chalk-5.2.0.tgz#249623b7d66869c673699fb66d65723e54dfcfb3"
-  integrity sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==
-
 chalk@^1.1.3:
   version "1.1.3"
   resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
@@ -5944,11 +5916,6 @@ clean-css@^4.2.1:
   dependencies:
     source-map "~0.6.0"
 
-clean-stack@^2.0.0:
-  version "2.2.0"
-  resolved "https://registry.npmmirror.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b"
-  integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==
-
 cli-cursor@^3.1.0:
   version "3.1.0"
   resolved "https://registry.npmmirror.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307"
@@ -5956,22 +5923,6 @@ cli-cursor@^3.1.0:
   dependencies:
     restore-cursor "^3.1.0"
 
-cli-truncate@^2.1.0:
-  version "2.1.0"
-  resolved "https://registry.npmmirror.com/cli-truncate/-/cli-truncate-2.1.0.tgz#c39e28bf05edcde5be3b98992a22deed5a2b93c7"
-  integrity sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==
-  dependencies:
-    slice-ansi "^3.0.0"
-    string-width "^4.2.0"
-
-cli-truncate@^3.1.0:
-  version "3.1.0"
-  resolved "https://registry.npmmirror.com/cli-truncate/-/cli-truncate-3.1.0.tgz#3f23ab12535e3d73e839bb43e73c9de487db1389"
-  integrity sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==
-  dependencies:
-    slice-ansi "^5.0.0"
-    string-width "^5.0.0"
-
 cli-width@^3.0.0:
   version "3.0.0"
   resolved "https://registry.npmmirror.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6"
@@ -6063,11 +6014,6 @@ colord@^2.9.1:
   resolved "https://registry.yarnpkg.com/colord/-/colord-2.9.3.tgz#4f8ce919de456f1d5c1c368c307fe20f3e59fb43"
   integrity sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==
 
-colorette@^2.0.19:
-  version "2.0.19"
-  resolved "https://registry.npmmirror.com/colorette/-/colorette-2.0.19.tgz#cdf044f47ad41a0f4b56b3a0d5b4e6e1a2d5a798"
-  integrity sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==
-
 colorette@^2.0.20:
   version "2.0.20"
   resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a"
@@ -6088,11 +6034,6 @@ combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6:
   dependencies:
     delayed-stream "~1.0.0"
 
-commander@^10.0.0:
-  version "10.0.0"
-  resolved "https://registry.npmmirror.com/commander/-/commander-10.0.0.tgz#71797971162cd3cf65f0b9d24eb28f8d303acdf1"
-  integrity sha512-zS5PnTI22FIRM6ylNW8G4Ap0IEOyk62fhLSD0+uHRT9McRCLGpkVNvao4bjimpK/GShynyQkFFxHhwMcETmduA==
-
 commander@^2.19.0, commander@^2.20.0, commander@^2.8.1:
   version "2.20.3"
   resolved "https://registry.npmmirror.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
@@ -7055,11 +6996,6 @@ duplexer@^0.1.2:
   resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6"
   integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==
 
-eastasianwidth@^0.2.0:
-  version "0.2.0"
-  resolved "https://registry.npmmirror.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb"
-  integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==
-
 ecc-jsbn@~0.1.1:
   version "0.1.2"
   resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9"
@@ -7088,11 +7024,6 @@ emoji-regex@^8.0.0:
   resolved "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
   integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
 
-emoji-regex@^9.2.2:
-  version "9.2.2"
-  resolved "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72"
-  integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==
-
 enabled@2.0.x:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/enabled/-/enabled-2.0.0.tgz#f9dd92ec2d6f4bbc0d5d1e64e21d61cd4665e7c2"
@@ -7465,21 +7396,6 @@ execa@^5.0.0, execa@^5.1.1:
     signal-exit "^3.0.3"
     strip-final-newline "^2.0.0"
 
-execa@^7.0.0:
-  version "7.1.1"
-  resolved "https://registry.npmmirror.com/execa/-/execa-7.1.1.tgz#3eb3c83d239488e7b409d48e8813b76bb55c9c43"
-  integrity sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==
-  dependencies:
-    cross-spawn "^7.0.3"
-    get-stream "^6.0.1"
-    human-signals "^4.3.0"
-    is-stream "^3.0.0"
-    merge-stream "^2.0.0"
-    npm-run-path "^5.1.0"
-    onetime "^6.0.0"
-    signal-exit "^3.0.7"
-    strip-final-newline "^3.0.0"
-
 exif-parser@^0.1.12:
   version "0.1.12"
   resolved "https://registry.npmmirror.com/exif-parser/-/exif-parser-0.1.12.tgz#58a9d2d72c02c1f6f02a0ef4a9166272b7760922"
@@ -8032,7 +7948,7 @@ get-stream@^5.1.0:
   dependencies:
     pump "^3.0.0"
 
-get-stream@^6.0.0, get-stream@^6.0.1:
+get-stream@^6.0.0:
   version "6.0.1"
   resolved "https://registry.npmmirror.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7"
   integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==
@@ -8474,11 +8390,6 @@ human-signals@^2.1.0:
   resolved "https://registry.npmmirror.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0"
   integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==
 
-human-signals@^4.3.0:
-  version "4.3.1"
-  resolved "https://registry.npmmirror.com/human-signals/-/human-signals-4.3.1.tgz#ab7f811e851fca97ffbd2c1fe9a958964de321b2"
-  integrity sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==
-
 humanize-ms@^1.2.0, humanize-ms@^1.2.1:
   version "1.2.1"
   resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed"
@@ -8743,11 +8654,6 @@ is-fullwidth-code-point@^3.0.0:
   resolved "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d"
   integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
 
-is-fullwidth-code-point@^4.0.0:
-  version "4.0.0"
-  resolved "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz#fae3167c729e7463f8461ce512b080a49268aa88"
-  integrity sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==
-
 is-function@^1.0.1:
   version "1.0.2"
   resolved "https://registry.npmmirror.com/is-function/-/is-function-1.0.2.tgz#4f097f30abf6efadac9833b17ca5dc03f8144e08"
@@ -8832,11 +8738,6 @@ is-stream@^2.0.0:
   resolved "https://registry.npmmirror.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077"
   integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==
 
-is-stream@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.npmmirror.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac"
-  integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==
-
 is-string@^1.0.5, is-string@^1.0.7:
   version "1.0.7"
   resolved "https://registry.npmmirror.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd"
@@ -9237,7 +9138,7 @@ lie@~3.3.0:
   dependencies:
     immediate "~3.0.5"
 
-lilconfig@2.1.0, lilconfig@^2.0.3, lilconfig@^2.0.5:
+lilconfig@^2.0.3, lilconfig@^2.0.5:
   version "2.1.0"
   resolved "https://registry.npmmirror.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52"
   integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==
@@ -9247,39 +9148,6 @@ lines-and-columns@^1.1.6:
   resolved "https://registry.npmmirror.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632"
   integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==
 
-lint-staged@^13.2.0:
-  version "13.2.1"
-  resolved "https://registry.npmmirror.com/lint-staged/-/lint-staged-13.2.1.tgz#9d30a14e3e42897ef417bc98556fb757f75cae87"
-  integrity sha512-8gfzinVXoPfga5Dz/ZOn8I2GOhf81Wvs+KwbEXQn/oWZAvCVS2PivrXfVbFJc93zD16uC0neS47RXHIjXKYZQw==
-  dependencies:
-    chalk "5.2.0"
-    cli-truncate "^3.1.0"
-    commander "^10.0.0"
-    debug "^4.3.4"
-    execa "^7.0.0"
-    lilconfig "2.1.0"
-    listr2 "^5.0.7"
-    micromatch "^4.0.5"
-    normalize-path "^3.0.0"
-    object-inspect "^1.12.3"
-    pidtree "^0.6.0"
-    string-argv "^0.3.1"
-    yaml "^2.2.1"
-
-listr2@^5.0.7:
-  version "5.0.8"
-  resolved "https://registry.npmmirror.com/listr2/-/listr2-5.0.8.tgz#a9379ffeb4bd83a68931a65fb223a11510d6ba23"
-  integrity sha512-mC73LitKHj9w6v30nLNGPetZIlfpUniNSsxxrbaPcWOjDb92SHPzJPi/t+v1YC/lxKz/AJ9egOjww0qUuFxBpA==
-  dependencies:
-    cli-truncate "^2.1.0"
-    colorette "^2.0.19"
-    log-update "^4.0.0"
-    p-map "^4.0.0"
-    rfdc "^1.3.0"
-    rxjs "^7.8.0"
-    through "^2.3.8"
-    wrap-ansi "^7.0.0"
-
 load-bmfont@^1.3.1, load-bmfont@^1.4.0:
   version "1.4.1"
   resolved "https://registry.npmmirror.com/load-bmfont/-/load-bmfont-1.4.1.tgz#c0f5f4711a1e2ccff725a7b6078087ccfcddd3e9"
@@ -9439,16 +9307,6 @@ lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.21, lodash@^4.17.4:
   resolved "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
   integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
 
-log-update@^4.0.0:
-  version "4.0.0"
-  resolved "https://registry.npmmirror.com/log-update/-/log-update-4.0.0.tgz#589ecd352471f2a1c0c570287543a64dfd20e0a1"
-  integrity sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==
-  dependencies:
-    ansi-escapes "^4.3.0"
-    cli-cursor "^3.1.0"
-    slice-ansi "^4.0.0"
-    wrap-ansi "^6.2.0"
-
 logform@^2.3.2, logform@^2.4.0:
   version "2.5.1"
   resolved "https://registry.yarnpkg.com/logform/-/logform-2.5.1.tgz#44c77c34becd71b3a42a3970c77929e52c6ed48b"
@@ -9647,7 +9505,7 @@ methods@^1.1.2, methods@~1.1.2:
   resolved "https://registry.npmmirror.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
   integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==
 
-micromatch@^4.0.4, micromatch@^4.0.5:
+micromatch@^4.0.4:
   version "4.0.5"
   resolved "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6"
   integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==
@@ -9692,11 +9550,6 @@ mimic-fn@^3.0.0:
   resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-3.1.0.tgz#65755145bbf3e36954b949c16450427451d5ca74"
   integrity sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==
 
-mimic-fn@^4.0.0:
-  version "4.0.0"
-  resolved "https://registry.npmmirror.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc"
-  integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==
-
 mimic-response@^1.0.0:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b"
@@ -9961,6 +9814,11 @@ moment@^2.29.4:
   resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.4.tgz#3dbe052889fe7c1b2ed966fcb3a77328964ef108"
   integrity sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==
 
+moment@^2.30.1:
+  version "2.30.1"
+  resolved "https://registry.npmmirror.com/moment/-/moment-2.30.1.tgz#f8c91c07b7a786e30c59926df530b4eac96974ae"
+  integrity sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==
+
 mrmime@^1.0.0:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/mrmime/-/mrmime-1.0.1.tgz#5f90c825fad4bdd41dc914eff5d1a8cfdaf24f27"
@@ -10161,13 +10019,6 @@ npm-run-path@^4.0.1:
   dependencies:
     path-key "^3.0.0"
 
-npm-run-path@^5.1.0:
-  version "5.1.0"
-  resolved "https://registry.npmmirror.com/npm-run-path/-/npm-run-path-5.1.0.tgz#bc62f7f3f6952d9894bd08944ba011a6ee7b7e00"
-  integrity sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==
-  dependencies:
-    path-key "^4.0.0"
-
 nth-check@^2.0.1:
   version "2.1.1"
   resolved "https://registry.npmmirror.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d"
@@ -10247,13 +10098,6 @@ onetime@^5.1.0, onetime@^5.1.2:
   dependencies:
     mimic-fn "^2.1.0"
 
-onetime@^6.0.0:
-  version "6.0.0"
-  resolved "https://registry.npmmirror.com/onetime/-/onetime-6.0.0.tgz#7c24c18ed1fd2e9bca4bd26806a33613c77d34b4"
-  integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==
-  dependencies:
-    mimic-fn "^4.0.0"
-
 open@^8.2.1:
   version "8.4.2"
   resolved "https://registry.yarnpkg.com/open/-/open-8.4.2.tgz#5b5ffe2a8f793dcd2aad73e550cb87b59cb084f9"
@@ -10395,13 +10239,6 @@ p-locate@^5.0.0:
   dependencies:
     p-limit "^3.0.2"
 
-p-map@^4.0.0:
-  version "4.0.0"
-  resolved "https://registry.npmmirror.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b"
-  integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==
-  dependencies:
-    aggregate-error "^3.0.0"
-
 p-timeout@^2.0.1:
   version "2.0.1"
   resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-2.0.1.tgz#d8dd1979595d2dc0139e1fe46b8b646cb3cdf038"
@@ -10551,11 +10388,6 @@ path-key@^3.0.0, path-key@^3.1.0:
   resolved "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375"
   integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
 
-path-key@^4.0.0:
-  version "4.0.0"
-  resolved "https://registry.npmmirror.com/path-key/-/path-key-4.0.0.tgz#295588dc3aee64154f877adb9d780b81c554bf18"
-  integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==
-
 path-parse@^1.0.7:
   version "1.0.7"
   resolved "https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
@@ -10638,11 +10470,6 @@ pidtree@^0.3.0:
   resolved "https://registry.npmmirror.com/pidtree/-/pidtree-0.3.1.tgz#ef09ac2cc0533df1f3250ccf2c4d366b0d12114a"
   integrity sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==
 
-pidtree@^0.6.0:
-  version "0.6.0"
-  resolved "https://registry.npmmirror.com/pidtree/-/pidtree-0.6.0.tgz#90ad7b6d42d5841e69e0a2419ef38f8883aa057c"
-  integrity sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==
-
 pify@^2.3.0:
   version "2.3.0"
   resolved "https://registry.npmmirror.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
@@ -11597,11 +11424,6 @@ reusify@^1.0.4:
   resolved "https://registry.npmmirror.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76"
   integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==
 
-rfdc@^1.3.0:
-  version "1.3.0"
-  resolved "https://registry.npmmirror.com/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b"
-  integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==
-
 rimraf@^2.6.1:
   version "2.7.1"
   resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec"
@@ -11649,13 +11471,6 @@ rxjs@^6.6.6:
   dependencies:
     tslib "^1.9.0"
 
-rxjs@^7.8.0:
-  version "7.8.0"
-  resolved "https://registry.npmmirror.com/rxjs/-/rxjs-7.8.0.tgz#90a938862a82888ff4c7359811a595e14e1e09a4"
-  integrity sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==
-  dependencies:
-    tslib "^2.1.0"
-
 safe-area-insets@^1.4.1:
   version "1.4.1"
   resolved "https://registry.npmmirror.com/safe-area-insets/-/safe-area-insets-1.4.1.tgz#89309e01a516dcd7d2fe012a9c4115182957bd8b"
@@ -11850,7 +11665,7 @@ side-channel@^1.0.4:
     get-intrinsic "^1.0.2"
     object-inspect "^1.9.0"
 
-signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7:
+signal-exit@^3.0.2, signal-exit@^3.0.3:
   version "3.0.7"
   resolved "https://registry.npmmirror.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9"
   integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==
@@ -11881,32 +11696,6 @@ slash@^3.0.0:
   resolved "https://registry.npmmirror.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634"
   integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==
 
-slice-ansi@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.npmmirror.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787"
-  integrity sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==
-  dependencies:
-    ansi-styles "^4.0.0"
-    astral-regex "^2.0.0"
-    is-fullwidth-code-point "^3.0.0"
-
-slice-ansi@^4.0.0:
-  version "4.0.0"
-  resolved "https://registry.npmmirror.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b"
-  integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==
-  dependencies:
-    ansi-styles "^4.0.0"
-    astral-regex "^2.0.0"
-    is-fullwidth-code-point "^3.0.0"
-
-slice-ansi@^5.0.0:
-  version "5.0.0"
-  resolved "https://registry.npmmirror.com/slice-ansi/-/slice-ansi-5.0.0.tgz#b73063c57aa96f9cd881654b15294d95d285c42a"
-  integrity sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==
-  dependencies:
-    ansi-styles "^6.0.0"
-    is-fullwidth-code-point "^4.0.0"
-
 smart-buffer@^4.2.0:
   version "4.2.0"
   resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae"
@@ -12111,11 +11900,6 @@ strict-uri-encode@^1.0.0:
   resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713"
   integrity sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==
 
-string-argv@^0.3.1:
-  version "0.3.1"
-  resolved "https://registry.npmmirror.com/string-argv/-/string-argv-0.3.1.tgz#95e2fbec0427ae19184935f816d74aaa4c5c19da"
-  integrity sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==
-
 string-hash-64@1.0.3:
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/string-hash-64/-/string-hash-64-1.0.3.tgz#0deb56df58678640db5c479ccbbb597aaa0de322"
@@ -12135,15 +11919,6 @@ string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3:
     is-fullwidth-code-point "^3.0.0"
     strip-ansi "^6.0.1"
 
-string-width@^5.0.0:
-  version "5.1.2"
-  resolved "https://registry.npmmirror.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794"
-  integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==
-  dependencies:
-    eastasianwidth "^0.2.0"
-    emoji-regex "^9.2.2"
-    strip-ansi "^7.0.1"
-
 string.prototype.padend@^3.0.0:
   version "3.1.4"
   resolved "https://registry.npmmirror.com/string.prototype.padend/-/string.prototype.padend-3.1.4.tgz#2c43bb3a89eb54b6750de5942c123d6c98dd65b6"
@@ -12218,13 +11993,6 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1:
   dependencies:
     ansi-regex "^5.0.1"
 
-strip-ansi@^7.0.1:
-  version "7.0.1"
-  resolved "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-7.0.1.tgz#61740a08ce36b61e50e65653f07060d000975fb2"
-  integrity sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==
-  dependencies:
-    ansi-regex "^6.0.1"
-
 strip-bom@^3.0.0:
   version "3.0.0"
   resolved "https://registry.npmmirror.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"
@@ -12242,11 +12010,6 @@ strip-final-newline@^2.0.0:
   resolved "https://registry.npmmirror.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad"
   integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==
 
-strip-final-newline@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.npmmirror.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd"
-  integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==
-
 strip-indent@^3.0.0:
   version "3.0.0"
   resolved "https://registry.npmmirror.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001"
@@ -12590,11 +12353,6 @@ tslib@^2.0.1, tslib@^2.3.0:
   resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.2.tgz#1b6f07185c881557b0ffa84b111a0106989e8338"
   integrity sha512-5svOrSA2w3iGFDs1HibEVBGbDrAY82bFQ3HZ3ixB+88nsbsWQoKqDRb5UBYAUPEzbBn6dAp5gRNXglySbx1MlA==
 
-tslib@^2.1.0:
-  version "2.5.0"
-  resolved "https://registry.npmmirror.com/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf"
-  integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==
-
 tsutils@^3.21.0:
   version "3.21.0"
   resolved "https://registry.npmmirror.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623"
@@ -13228,10 +12986,10 @@ wordwrap@^1.0.0:
   resolved "https://registry.npmmirror.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb"
   integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==
 
-wot-design-uni@^0.1.57:
-  version "0.1.57"
-  resolved "https://registry.npmmirror.com/wot-design-uni/-/wot-design-uni-0.1.57.tgz#ddf10b0e0ea9ba5386953300ee24684a21a06421"
-  integrity sha512-me8HuP3348kBMjpW6BPS1BrBNO5USHszcjiOcuMU5PfsSZ9EpL/JDHk8qRj74LBXfzra1DPHLw+0loV6dmG3ow==
+wot-design-uni@0.2.22:
+  version "0.2.22"
+  resolved "https://registry.npmmirror.com/wot-design-uni/-/wot-design-uni-0.2.22.tgz#1b5114365970247e2ee41bcf625cbd3ba9b0ac63"
+  integrity sha512-Wpe0TV5CJUrQ5Hsr1L9wqBa4z1MAl0SBT0PqeBv9kUO8Q3EPpRYJutpklSpfxgEXwQ3caXUf8bB0MCVqhu9uag==
 
 wrap-ansi@^6.2.0:
   version "6.2.0"
@@ -13346,11 +13104,6 @@ yaml@^1.10.2:
   resolved "https://registry.npmmirror.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b"
   integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==
 
-yaml@^2.2.1:
-  version "2.2.1"
-  resolved "https://registry.npmmirror.com/yaml/-/yaml-2.2.1.tgz#3014bf0482dcd15147aa8e56109ce8632cd60ce4"
-  integrity sha512-e0WHiYql7+9wr4cWMx3TVQrNwejKaEe7/rHNmQmqRjazfOP5W8PB6Jpebb5o6fIapbz9o9+2ipcaTM2ZwDI6lw==
-
 yargs-parser@^18.1.2:
   version "18.1.3"
   resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0"