Browse Source

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

gez 3 months ago
parent
commit
4385c47000
88 changed files with 2712 additions and 21 deletions
  1. 84 0
      src/api/oa/approval/index.js
  2. 101 0
      src/api/oa/todo/index.js
  3. 10 1
      src/api/system/user.js
  4. 1 0
      src/components/oa-scroll/index.vue
  5. 1 0
      src/components/oa-tabbar/index.vue
  6. 2 2
      src/manifest.json
  7. 55 0
      src/pages.json
  8. 68 9
      src/pages/business/common/projectMange/record/details.vue
  9. 493 0
      src/pages/business/oa/approval/components/jbd.vue
  10. 491 0
      src/pages/business/oa/approval/components/qjd.vue
  11. 211 0
      src/pages/business/oa/approval/formType.vue
  12. 298 0
      src/pages/business/oa/approval/index.vue
  13. 462 0
      src/pages/business/oa/toDo/detail.vue
  14. 303 0
      src/pages/business/oa/toDo/index.vue
  15. 7 8
      src/pages/login.vue
  16. 9 0
      src/plugins/common.plugins.js
  17. 22 1
      src/plugins/constData.plugins.js
  18. 18 0
      src/plugins/modal.plugins.js
  19. BIN
      src/static/font/Alibaba_PuHuiTi_2.0_55_Regular_55_Regular.ttf
  20. BIN
      src/static/images/common/filter.png
  21. BIN
      src/static/images/oa/Ccto.png
  22. BIN
      src/static/images/oa/approval.png
  23. BIN
      src/static/images/oa/fuKuan.png
  24. BIN
      src/static/images/oa/loading.png
  25. BIN
      src/static/images/oa/pass.png
  26. BIN
      src/static/images/oa/pass2.png
  27. BIN
      src/static/images/oa/qingJia.png
  28. BIN
      src/static/images/oa/refuse.png
  29. BIN
      src/static/images/oa/user.png
  30. BIN
      src/static/images/oa/wait.png
  31. BIN
      src/static/images/oa/yongYin.png
  32. BIN
      src/static/images/tabBar/tab-approval-blue.png
  33. BIN
      src/static/images/tabBar/tab-approval-gray.png
  34. BIN
      src/static/images/tabBar/tab-toDo-blue.png
  35. BIN
      src/static/images/tabBar/tab-toDo-gray.png
  36. 39 0
      src/static/scss/font.scss
  37. 1 0
      src/static/scss/index.scss
  38. 36 0
      src/store/modules/setting.js
  39. BIN
      unpackage/res/icons-xunJian/1024x1024.png
  40. BIN
      unpackage/res/icons-xunJian/120x120.png
  41. BIN
      unpackage/res/icons-xunJian/144x144.png
  42. BIN
      unpackage/res/icons-xunJian/152x152.png
  43. BIN
      unpackage/res/icons-xunJian/167x167.png
  44. BIN
      unpackage/res/icons-xunJian/180x180.png
  45. BIN
      unpackage/res/icons-xunJian/192x192.png
  46. BIN
      unpackage/res/icons-xunJian/20x20.png
  47. BIN
      unpackage/res/icons-xunJian/29x29.png
  48. BIN
      unpackage/res/icons-xunJian/40x40.png
  49. BIN
      unpackage/res/icons-xunJian/58x58.png
  50. BIN
      unpackage/res/icons-xunJian/60x60.png
  51. BIN
      unpackage/res/icons-xunJian/72x72.png
  52. BIN
      unpackage/res/icons-xunJian/76x76.png
  53. BIN
      unpackage/res/icons-xunJian/80x80.png
  54. BIN
      unpackage/res/icons-xunJian/87x87.png
  55. BIN
      unpackage/res/icons-xunJian/96x96.png
  56. BIN
      unpackage/res/icons/120x120.png
  57. BIN
      unpackage/res/icons/144x144.png
  58. BIN
      unpackage/res/icons/152x152.png
  59. BIN
      unpackage/res/icons/167x167.png
  60. BIN
      unpackage/res/icons/180x180.png
  61. BIN
      unpackage/res/icons/192x192.png
  62. BIN
      unpackage/res/icons/20x20.png
  63. BIN
      unpackage/res/icons/29x29.png
  64. BIN
      unpackage/res/icons/40x40.png
  65. BIN
      unpackage/res/icons/58x58.png
  66. BIN
      unpackage/res/icons/60x60.png
  67. BIN
      unpackage/res/icons/72x72.png
  68. BIN
      unpackage/res/icons/76x76.png
  69. BIN
      unpackage/res/icons/80x80.png
  70. BIN
      unpackage/res/icons/87x87.png
  71. BIN
      unpackage/res/icons/96x96.png
  72. BIN
      unpackage/res/push-xunJian/1024x1024.png
  73. BIN
      unpackage/res/push-xunJian/120x120.png
  74. BIN
      unpackage/res/push-xunJian/144x144.png
  75. BIN
      unpackage/res/push-xunJian/152x152.png
  76. BIN
      unpackage/res/push-xunJian/167x167.png
  77. BIN
      unpackage/res/push-xunJian/180x180.png
  78. BIN
      unpackage/res/push-xunJian/192x192.png
  79. BIN
      unpackage/res/push-xunJian/20x20.png
  80. BIN
      unpackage/res/push-xunJian/29x29.png
  81. BIN
      unpackage/res/push-xunJian/40x40.png
  82. BIN
      unpackage/res/push-xunJian/58x58.png
  83. BIN
      unpackage/res/push-xunJian/60x60.png
  84. BIN
      unpackage/res/push-xunJian/72x72.png
  85. BIN
      unpackage/res/push-xunJian/76x76.png
  86. BIN
      unpackage/res/push-xunJian/80x80.png
  87. BIN
      unpackage/res/push-xunJian/87x87.png
  88. BIN
      unpackage/res/push-xunJian/96x96.png

+ 84 - 0
src/api/oa/approval/index.js

@@ -0,0 +1,84 @@
+import { request } from "@/utils/request";
+
+// 表单权限列表
+export function getOaFormDefinition(params) {
+    return request({
+        url: '/service-oa/oaFormDefinition/myForm',
+        method: 'get',
+        params
+    })
+}
+// 表单分页
+export function myApplication(params) {
+    return request({
+        url: '/service-oa/oaDocument/myApplication',
+        method: 'get',
+        params
+    })
+}
+// 表单名列表
+export function getFormName(params) {
+    return request({
+        url: '/service-oa/oaFormDefinition/getFormName',
+        method: 'get',
+        params
+    })
+}
+// 表单记录详情
+export function getDocumentDetails(params) {
+    return request({
+        url: '/service-oa/oaDocument/documentDetails',
+        method: 'get',
+        params
+    })
+}
+// 表单记录删除
+export function delDoc(id) {
+    return request({
+        url: '/service-oa/oaDocument/delDoc/' + id,
+        method: 'delete'
+    })
+}
+// 表单记录提交
+export function statueSubmit(params) {
+    return request({
+        url: '/service-oa/oaDocument/submit',
+        method: 'put',
+        params
+    })
+}
+// 表单统计
+export function getFormCount() {
+    return request({
+        url: '/service-oa/oaApproval/count',
+        method: 'get'
+    })
+}
+// 表单记录新增
+export function addOaDocument(data) {
+    return request({
+        url: '/service-oa/oaDocument/add',
+        method: 'post',
+        data
+    })
+}
+// 表单记录修改
+export function updateDocument(data) {
+    return request({
+        url: '/service-oa/oaDocument/update',
+        method: 'post',
+        data
+    })
+}
+
+
+
+
+
+
+
+
+
+
+
+

+ 101 - 0
src/api/oa/todo/index.js

@@ -0,0 +1,101 @@
+import { request } from "@/utils/request";
+
+// 表单权限列表
+export function getOaFormDefinition(params) {
+    return request({
+        url: '/service-oa/oaFormDefinition/myForm',
+        method: 'get',
+        params
+    })
+}
+// 表单(请假)新增
+export function addQjDocument(data) {
+    return request({
+        url: '/service-oa/oaQjDocument/addQjDocument',
+        method: 'post',
+        data
+    })
+}
+// 表单(请假)修改
+export function updateQjDocument(data) {
+    return request({
+        url: '/service-oa/oaQjDocument/updateQjDocument',
+        method: 'post',
+        data
+    })
+}
+// 表单分页
+export function myApplication(params) {
+    return request({
+        url: '/service-oa/oaDocument/myApplication',
+        method: 'get',
+        params
+    })
+}
+// 表单(加班)新增
+export function addJBDocument(data) {
+    return request({
+        url: '/service-oa/oaJbDocument/add',
+        method: 'post',
+        data
+    })
+}
+// 表单名列表
+export function getFormName(params) {
+    return request({
+        url: '/service-oa/oaFormDefinition/getFormName',
+        method: 'get',
+        params
+    })
+}
+// 表单记录详情
+export function getDocumentDetails(params) {
+    return request({
+        url: '/service-oa/oaDocument/documentDetails',
+        method: 'get',
+        params
+    })
+}
+// 表单记录删除
+export function delDoc(id) {
+    return request({
+        url: '/service-oa/oaDocument/delDoc/' + id,
+        method: 'delete'
+    })
+}
+// 表单记录提交
+export function statueSubmit(params) {
+    return request({
+        url: '/service-oa/oaDocument/submit',
+        method: 'put',
+        params
+    })
+}
+// 分页
+export function getToDoPageList(params) {
+    return request({
+        url: '/service-oa/oaApproval/pageList',
+        method: 'get',
+        params
+    })
+}
+// 表单审批
+export function approve(params) {
+    return request({
+        url: '/service-oa/oaApproval/approve',
+        method: 'put',
+        params
+    })
+}
+
+
+
+
+
+
+
+
+
+
+
+

+ 10 - 1
src/api/system/user.js

@@ -90,4 +90,13 @@ export function getPageAuthorization(data) {
     method: 'GET',
     data: data,
   })
-}
+}
+
+// 查询部门列表
+export function listDept(query) {
+  return request({
+      url: '/system/dept/list',
+      method: 'get',
+      params: query
+  })
+}

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

@@ -194,6 +194,7 @@ function onRefresh() {
  * @scrollView触底事件
  */
 function scrolltolower(e) {
+  console.log("触底事件", e);
   if (!refresherLoad.value || pageSize.value >= total.value) {
     return;
   } else {

+ 1 - 0
src/components/oa-tabbar/index.vue

@@ -45,6 +45,7 @@ const { tabbarValue, tabbarList, isSwitchTab } = toRefs(props);
 
 function tabbarChange(e) {
   if (isSwitchTab.value) {
+    console.log(tabbarList.value[e].pagePath)
     proxy.$tab.switchTab(tabbarList.value[e].pagePath);
   } else {
     proxy.$tab.redirectTo(tabbarList.value[e].pagePath);

+ 2 - 2
src/manifest.json

@@ -2,8 +2,8 @@
     "name" : "智能巡更",
     "appid" : "__UNI__BF1A1F0",
     "description" : "智能巡更app,是一款用于监督和记录巡逻人员按照预定路线和时间进行巡逻的系统。",
-    "versionName" : "2.2.9",
-    "versionCode" : 29,
+    "versionName" : "2.3.4",
+    "versionCode" : 34,
     "transformPx" : false,
     "app-plus" : {
         "compatible" : {

+ 55 - 0
src/pages.json

@@ -980,6 +980,61 @@
                 }
             ]
         },
+        {
+            "name": "oa",
+            "root": "pages/business/oa/",
+            "pages": [
+                {
+                    "path": "approval/index",
+                    "style": {
+                        "navigationBarTitleText": "我的申请",
+                        "enablePullDownRefresh": false,
+                        "navigationStyle": "custom",
+                        "app-plus": {
+                            "bounce": "none",
+                            "titleNView": false
+                        }
+                    }
+                },
+                {
+                    "path": "approval/formType",
+                    "style": {
+                        "navigationBarTitleText": "...",
+                        "enablePullDownRefresh": false,
+                        "navigationStyle": "custom",
+                        "app-plus": {
+                            "bounce": "none",
+                            "titleNView": false
+                        }
+                    }
+                },
+                {
+                    "path": "toDo/index",
+                    "style": {
+                        "navigationBarTitleText": "我的待办",
+                        "enablePullDownRefresh": false,
+                        "navigationStyle": "custom",
+                        "app-plus": {
+                            "bounce": "none",
+                            "titleNView": false
+                        }
+                    }
+                },
+                {
+                    "path": "toDo/detail",
+                    "style": {
+                        "navigationBarTitleText": "详情",
+                        "enablePullDownRefresh": false,
+                        "navigationStyle": "custom",
+                        "app-plus": {
+                            "bounce": "none",
+                            "titleNView": false
+                        }
+                    }
+                }
+                
+            ]
+        },
         {
             "name": "门禁管理系统",
             "root": "pages/business/doorManage/",

+ 68 - 9
src/pages/business/common/projectMange/record/details.vue

@@ -1,5 +1,5 @@
 <template>
-  <u-navbar :titleStyle="{ color: '#000' }" :autoBack="true" :title="dataList[0]?.createBy + '的日报'" :placeholder="true" :safeAreaInsetTop="true" bgColor="#fff">
+  <u-navbar v-if="dataList[0]?.createBy" :titleStyle="{ color: '#000' }" :autoBack="true" :title="dataList[0]?.createBy + '的日报'" :placeholder="true" :safeAreaInsetTop="true" bgColor="#fff">
     <template #left>
       <view class="u-navbar__content__left__item">
         <u-icon name="arrow-left" size="20" color="#000"></u-icon>
@@ -8,22 +8,30 @@
   </u-navbar>
 
   <oa-scroll
-    customClass="record-details-container scroll-height"
-    :style="{
+    customClass="record-container scroll-height"
+    :pageSize="pageSize"
+    :total="total"
+    :isSticky="true"
+    :customStyle="{
       //#ifdef APP-PLUS || MP-WEIXIN
-      height: `calc(100vh - (44px + ${proxy.$settingStore.StatusBarHeight}))`,
+      height: `calc(100vh - (138px + ${proxy.$settingStore.StatusBarHeight}))`,
+      //#endif
+      //#ifdef H5
+      height: `calc(100vh - (138px))`,
       //#endif
     }"
-    :refresherLoad="false"
-    :refresherEnabled="false"
-    :refresherEnabledTitle="false"
+    :refresherLoad="true"
+    :refresherEnabled="true"
     :refresherDefaultStyle="'none'"
     :refresherThreshold="44"
+    :lowerThreshold="44"
     :refresherBackground="'#f5f6f7'"
+    @load="load"
+    @refresh="refresh"
     :data-theme="'theme-' + proxy.$settingStore.themeColor.name"
   >
     <template #default>
-      <view class="content-area radius bg-white" v-for="(item, index) in dataList" :key="index">
+      <view class="content-area radius bg-white" v-for="(item, index) in dataList" :key="index" style="margin-top: 6px">
         <view class="content-area-header flex mb10">
           <img :src="item.avatar" class="content-area-header-avatarImg mr10" v-if="item.avatar" />
           <u-avatar
@@ -139,9 +147,12 @@ const state = reactive({
     { name: "未读", value: 1 },
   ],
   tabsCurrent: 0,
+  pageSize:1,
+  total:10,
+  submitDate:undefined,
 });
 
-const { dataList, userData, tabsList, tabsCurrent } = toRefs(state);
+const { dataList, userData, tabsList, tabsCurrent, pageSize, total } = toRefs(state);
 
 /**
  * @tabs点击事件
@@ -174,6 +185,7 @@ function init() {
       })
       .then((requset) => {
         dataList.value = requset.data.records;
+        state.submitDate = requset.data.records[0].submitDate;
         state.loading = false;
         pmReportReaders.value = requset.data.records[0].pmReportReaders;
         state.tabsList[0].name = state.tabsList[0].name + "(" + pmReportReaders.value.read + ")";
@@ -187,6 +199,7 @@ function init() {
         files.forEach(function (item) {
           state.files.push(item.url);
         });
+        load()
       })
       .catch((err) => {
         state.loading = false;
@@ -200,6 +213,47 @@ function init() {
 function toProjectMange(id) {
   proxy.$tab.navigateTo(`/pages/business/common/projectMange/overview/index?id=${id}`);
 }
+/**
+ * @scrollView加载数据
+ */
+ function load() {
+  projectApi().ReportRecord(
+    {
+      upOrDown:0,
+      slideSum:1,
+      submitDate:state.submitDate,
+      projectAscription:2
+    }
+  ).then((requset) => {
+    dataList.value.push(requset.data.records[0]);
+    if(dataList.value.length>2){
+      delete dataList.value[0]
+    }
+  })
+}
+/**
+ * @scrollView刷新数据
+ */
+ function refresh() {
+  projectApi().ReportRecord(
+    {
+      upOrDown:1,
+      slideSum:1,
+      submitDate:state.submitDate,
+      projectAscription:2
+    }
+  ).then((requset) => {
+    dataList.value.unshift(requset.data.records[0]);
+    state.submitDate = requset.data.records[0].submitDate;
+    if(dataList.value.length>2){
+      delete dataList.value[2]
+    }
+  })
+  // console.log(dataList.value)
+  
+  // state.pageSize = 20;
+  // init();
+}
 onReady(() => {});
 
 onShow(() => {
@@ -255,4 +309,9 @@ onUnload(() => {
     }
   }
 }
+.uni-scroll-view-content .content-area:nth-child(3){
+  height:96px;
+  overflow: hidden;
+  background-image: linear-gradient(to top, #f3f2f2 30%, #fff 100%);
+}
 </style>

+ 493 - 0
src/pages/business/oa/approval/components/jbd.vue

@@ -0,0 +1,493 @@
+<template>
+  <oa-scroll
+    customClass="unitInfoCollection-container scroll-height"
+    :refresherLoad="false"
+    :refresherEnabled="false"
+    :refresherEnabledTitle="false"
+    :refresherDefaultStyle="'none'"
+    :refresherThreshold="44"
+    :refresherBackground="'#f5f6f7'"
+    :data-theme="'theme-' + proxy.$settingStore.themeColor.name"
+    style="height:calc(100vh - 110px)"
+  >
+    <template #default>
+      <view class="centerOne">
+        <u--form ref="uForm" :model="form" :rules="rules" labelWidth="180">
+          <view style="padding: 0px 10px 0px 10px; background: #ffffff">
+            <view style="padding-left: 9px">
+              <u-form-item
+                label="核算方式:"
+                prop="accountingMethod"
+                required
+                :borderBottom="false"
+                label-position="top"
+                @click="handleAction('核算方式')"
+                style="margin-top:10px"
+              >
+                <u-input
+                  v-model="form.accountingMethodName"
+                  placeholder="请选择核算方式"
+                  suffixIcon="arrow-right"
+                  suffixIconStyle="color: #909399"
+                  border="none"
+                  disabledColor="transparent"
+                  disabled
+                />
+              </u-form-item>
+            </view>
+          </view>
+          <view style="margin-top:10px;padding: 0px 10px 0px 10px; background: #ffffff">
+            <view style="padding-left: 9px">
+              <u-form-item
+                label="开始时间:"
+                prop="startTime"
+                required
+                label-position="top"
+                @click="handleDateTime('开始时间', 0, form.startTime)"
+              >
+                <u-input
+                  v-model="form.startTime1"
+                  placeholder="请选择开始时间"
+                  border="none"
+                  suffixIcon="arrow-right"
+                  suffixIconStyle="color: #909399;"
+                />
+              </u-form-item>
+            </view>
+          </view>
+          <view style="margin-top:10px;padding: 0px 10px 0px 10px; background: #ffffff">
+            <view style="padding-left: 9px">
+              <u-form-item
+                label="结束时间:"
+                prop="endTime"
+                required
+                label-position="top"
+                @click="handleDateTime('结束时间', 1, form.endTime)"
+              >
+                <u-input
+                  v-model="form.endTime1"
+                  placeholder="请选择结束时间"
+                  border="none"
+                  suffixIcon="arrow-right"
+                  suffixIconStyle="color: #909399;"
+                />
+              </u-form-item>
+            </view>
+          </view>
+          <view style="margin-top:10px;padding: 0px 10px 0px 10px; background: #ffffff">
+            <view style="padding-left: 9px">
+              <u-form-item
+                label="加班时长(小时):"
+                prop="duration"
+                required
+                label-position="top"
+              >
+                <u-input
+                  v-model="form.duration"
+                  placeholder="请输入加班时长"
+                  border="none"
+                  maxlength="4"
+                />
+              </u-form-item>
+            </view>
+          </view>
+          <view style="margin-top:10px;padding: 0px 10px 0px 10px; background: #ffffff">
+            <view style="padding-left: 9px">
+              <u-form-item
+                label="加班事由:"
+                prop="reason"
+                required
+                label-position="top"
+              >
+                <u-input
+                  v-model="form.reason"
+                  placeholder="请输入加班事由"
+                  border="none"
+                  maxlength="18"
+                />
+              </u-form-item>
+            </view>
+          </view>
+          <view style="margin-top:10px;padding: 0px 10px 0px 10px; background: #ffffff">
+            <view style="padding-left: 9px">
+              <u-form-item label="日报及打卡记录图片:" prop="image" label-position="top" required>
+                <div style="margin-top: 10px">
+                  <oa-upload :uploadCount="1" :uploadImage="form.image" @uploadSuccessChange="uploadSuccessChange" @uploadDeleteChange="uploadDeleteChange"></oa-upload>
+                </div>
+                <!-- <view style="color: #666666">图片支持png、jpg</view> -->
+              </u-form-item>
+            </view>
+          </view>
+        </u--form>
+      </view>
+      <u-picker
+        :show="actionShow"
+        :columns="actionsList"
+        :title="actionTitle"
+        keyName="label"
+        visibleItemCount="6"
+        :defaultIndex="[actionDefaultIndex]"
+        :closeOnClickOverlay="true"
+        @close="actionShow = false"
+        @cancel="actionShow = false"
+        @confirm="selectAction"
+      ></u-picker>
+      <u-datetime-picker
+        :show="showTime"
+        v-model="timeValue"
+        mode="datetime"
+        @close="showTime = false"
+        @cancel="showTime = false"
+        @confirm="timeSubmit"
+        :closeOnClickOverlay="true"
+        :minDate="Number(new Date())"
+        :maxDate="Number(new Date('2027'))"
+      ></u-datetime-picker>
+      <view class="list-cell" style="color: #666666; line-height: 25px; width: auto;">
+        <view class="content-area-top">
+          <view style="width:100%;font-weight:bold;color:#333333;font-size:16px;margin-bottom:20px">流程</view>
+          <view class="stepBar">
+            <view class="item" v-for="(item, index) in nodeList" :key="index">
+              <view class="left">
+                <view class="yuan"></view>
+                <div>
+                  <view class="title">
+                    {{ item.nodeName }}
+                  </view>
+                  <view class="name">
+                    {{ item.appointApprover.split(',').length }}人{{ item.nodeType == "1" ? "审批" : item.nodeType == "2" ? "抄送" : "" }}
+                  </view>
+                </div>
+              </view>
+              <view class="right">
+                <view class="content-area-header  mb10 text-center" style="display: inline-block"  v-for="(item2, index2) in ccTo[index]" :key="index2">
+                  <img v-if='item2.avatar' class="content-area-header-avatarImg mlr5" :src='item2.avatar' style="display: block; width: 40px; height: 40px;border-radius: 6px;" />
+                  <u-avatar
+                  v-else
+                    class="content-area-header-avatar mlr5"
+                    :text='item2.nickName.length > 2 ? item2.nickName.slice(1, 3) : item2.nickName'
+                    shape="square"
+                    size="40"
+                    fontSize="12"
+                    color="#ffffff"
+                    :bgColor="proxy.$settingStore.themeColor.color"
+                  ></u-avatar>
+                  <u-text :text='item2.nickName' color="#000000" size="14" align="center" class="userName"></u-text>
+                </view>
+              </view>
+              <view class="line gray" v-if="index < nodeList.length -1">
+              </view>
+            </view>
+          </view>
+        </view>
+      </view>
+      <view class="app-button">
+        <u-button  type="primary" @click="handleSubmit('提交')" shape="circle"> 提交 </u-button>
+      </view>
+    </template>
+  </oa-scroll>
+</template>
+
+<script setup>
+/*----------------------------------依赖引入-----------------------------------*/
+import { onLoad, onShow, onHide, onLaunch, onReady } from "@dcloudio/uni-app";
+import {
+  ref,
+  onMounted,
+  inject,
+  shallowRef,
+  reactive,
+  toRefs,
+  getCurrentInstance,
+} from "vue";
+/*----------------------------------接口引入-----------------------------------*/
+import {
+  companyByNameSelect,
+  addBaseCompany,
+  delBaseBuild,
+  delBaseBuildExtinguish,
+} from "@/api/business/mhxf/unitInfoCollection";
+/*----------------------------------组件引入-----------------------------------*/
+/*----------------------------------store引入-----------------------------------*/
+/*----------------------------------公共方法引入-----------------------------------*/
+import {
+  getOaFormDefinition,
+  addOaDocument,
+} from "@/api/oa/approval/index.js";
+/*----------------------------------公共变量-----------------------------------*/
+const { proxy } = getCurrentInstance();
+/*----------------------------------变量声明-----------------------------------*/
+const props = defineProps({
+  data: {
+    type: Object,
+    default: Object,
+  },
+})
+const actionTitle = ref(null);
+const actionsList = ref([]);
+const actionDefaultIndex = ref(0);
+const actionShow = ref(false);
+const uForm = ref(null);
+const showTime = ref(false) //时间选择显示隐藏
+const timeValue = ref(Number(new Date())) //时间选择值
+const timeTitle = ref("") //时间选择标题
+const state = reactive({
+  form: {
+    reason: "",
+    accountingMethod: undefined,
+    accountingMethodName: undefined,
+    formName: undefined,
+    duration: "",
+    image: "",
+    startTime: "",
+    startTime1: "",
+    endTime: "",
+    endTime1: "",
+    formSign: undefined,
+    formId: undefined,
+  },
+  rules: {
+    accountingMethod: [{ required: true, message: "请选择核算方式", trigger: "change" }],
+    startTime: [
+      { required: true, message: "加班开始时间不能为空", trigger: "change" },
+    ],
+    endTime: [
+      { required: true, message: "加班结束时间不能为空", trigger: "change" },
+    ],
+    duration: [
+      { required: true, message: "加班时长不能为空", trigger: "blur" },
+    ],
+    reason: [{ required: true, message: "加班事由不能为空", trigger: "blur" }],
+    image: [{ required: true, message: "日报及打卡记录图片不能为空", trigger: "blur" }],
+  },
+  userData:[],
+  ccTo:[]
+});
+
+const { form, rules, userData, ccTo} = toRefs(state);
+const nodeList = ref([]);
+state.userData = props.data.userData
+
+nodeList.value = props.data.nodeList
+state.ccTo = props.data.ccTo
+
+
+form.value.formSign = props.data.form.formSign
+form.value.formId = props.data.form.id
+
+//编辑状态
+if(JSON.stringify(props.data.docNoDetail)!= "{}"){
+  form.value.accountingMethod = props.data.docNoDetail.accountingMethod.toString()
+  form.value.accountingMethodName = "申请调休"
+}
+
+/**
+ * @图片上传成功回调
+ */
+ function uploadSuccessChange(e) {
+  form.value.image = e.url;
+}
+
+/**
+ * @图片删除回调
+ */
+function uploadDeleteChange(e) {
+  form.value.image = e;
+}
+
+/**
+ * @api提交
+ */
+function handleSubmit(value) {
+  uForm.value
+    .validate()
+      .then((res) => {
+        if(form.value.docNo){
+          updateDocument({
+            docNo: form.value.docNo,
+            id: form.value.id,
+            formId: form.value.formId,
+            formSign: form.value.formSign,
+            type: form.value.type,
+            startTime: form.value.startTime,
+            endTime: form.value.endTime,
+            duration: Number(form.value.duration),
+            reason: form.value.reason,
+            docStatus: 1,
+            image: form.value.image
+          }).then((res) => {
+            proxy.$modal.msgSuccess("表单修改成功");
+            if(getCurrentPages().length > 1){
+              uni.navigateBack()
+            }else{
+              uni.switchTab({
+                url: `/pages/business/oa/approval/index`
+              })
+            }
+          });
+        }else{
+          addOaDocument({
+            formId: form.value.formId,
+            formSign: form.value.formSign,
+            type: form.value.type,
+            startTime: form.value.startTime,
+            endTime: form.value.endTime,
+            duration: Number(form.value.duration),
+            reason: form.value.reason,
+            docStatus: 1,
+            image: form.value.image
+          }).then((res) => {
+            proxy.$modal.msgSuccess("表单提交成功");
+            if(getCurrentPages().length > 1){
+              uni.navigateBack()
+            }else{
+              uni.redirectTo({
+                url: `/pages/business/oa/approval/index`
+              })
+            }
+          });
+        }
+      })
+      .catch((errors) => {
+        proxy.$modal.msg("校验失败");
+      });
+}
+
+/**
+ * @action弹出框点击事件
+ */
+function handleAction(value, index, ind) {
+  if (value == "核算方式") {
+    actionTitle.value = value;
+    actionsList.value = [[{label:"申请调休",value:"0"}]];
+    actionDefaultIndex.value = 0;
+  }
+  actionShow.value = true;
+}
+
+/**
+ * @action弹出框选择事件
+ */
+function selectAction(e) {
+  if(actionTitle.value == "核算方式"){
+    form.value.accountingMethod = e.value[0].value;
+    form.value.accountingMethodName = e.value[0].label;
+  }
+  actionShow.value = false;
+}
+/**
+ * @时间弹出框点击事件
+ */
+function handleDateTime(value, index, time) {
+  showTime.value = true;
+  timeTitle.value = value;
+}
+
+/**
+ * @时间选择器
+ * @确定按钮事件
+ */
+function timeSubmit(data) {
+  let time = proxy.$time.getFormatterDate(data.value);
+  let timeData = time.split(" ")[0] + " " + time.split(" ")[1]
+  if (timeTitle.value == "开始时间") {
+    form.value.startTime1 = timeData;
+    form.value.startTime = timeData;
+  } else if (timeTitle.value == "结束时间") {
+    form.value.endTime1 = timeData;
+    form.value.endTime = timeData;
+  }
+  showTime.value = false;
+}
+
+onLoad((options) => {
+
+});
+
+onShow(() => {
+  //调用系统主题颜色
+  proxy.$settingStore.systemThemeColor([1]);
+});
+</script>
+
+<style lang="scss">
+.unitInfoCollection-container {
+  .centerOne,
+  .centerTwo {
+    .title {
+      color: #333333;
+      text-align: center;
+      margin-top: 10px;
+    }
+  }
+  :deep(.u-picker__view__column__item) {
+    font-size: 13px;
+  }
+}
+.app-button{
+  position: fixed;
+  bottom:10px;
+  left:10px;
+  width:calc(100% - 20px);
+  button{
+    border-radius: 10px !important;
+  }
+}
+.stepBar{
+    margin-top:-20px;
+    font-weight: 400;
+    width:100%;
+    .item{
+    position: relative;
+      .left{
+        width:100%;
+        position: relative;
+        .yuan{
+          width:10px;
+          height:10px;
+          margin-top:10px;
+          vertical-align: middle;
+          float: left;
+          border-radius: 50%;
+          background: #999;
+        }
+        >div{
+          width:80%;
+          margin-left:20px;
+          vertical-align: top;
+          line-height: 20px;
+          .title{
+            font-size: 14px;
+          }
+          .name{
+            font-size: 12px;
+            color: #999;
+          }
+        }
+      }
+      .line{
+        height:84%;
+        width:1px;
+        position: absolute;
+        top:24px;
+        left:5px;
+        background: #999;
+      }
+      .right{
+        width:calc(100% - 100px);
+        margin-left:100px;
+        text-align: right;
+      }
+    }
+    .item:nth-child(1){
+      margin-top:10%;
+    }
+  }
+.userName{
+  white-space: nowrap;      /* 确保文本在一行内显示 */
+  overflow: hidden;         /* 超出容器部分隐藏 */
+  text-overflow: ellipsis;  /* 超出部分显示省略号 */
+  width: 50px !important;             /* 定义容器宽度 */
+  text-align: center;
+}
+</style>

+ 491 - 0
src/pages/business/oa/approval/components/qjd.vue

@@ -0,0 +1,491 @@
+<template>
+  <oa-scroll
+    customClass="unitInfoCollection-container scroll-height"
+    :refresherLoad="false"
+    :refresherEnabled="false"
+    :refresherEnabledTitle="false"
+    :refresherDefaultStyle="'none'"
+    :refresherThreshold="44"
+    :refresherBackground="'#f5f6f7'"
+    :data-theme="'theme-' + proxy.$settingStore.themeColor.name"
+    style="height:calc(100vh - 110px)"
+  >
+    <template #default>
+      <view class="centerOne">
+        <u--form ref="uForm" :model="form" :rules="rules" labelWidth="150">
+          <view style="padding: 0px 10px 0px 10px; background: #ffffff">
+            <view style="padding-left: 9px">
+              <u-form-item
+                label="请假类型:"
+                prop="type"
+                required
+                :borderBottom="false"
+                label-position="top"
+                @click="handleAction('请假类型')"
+                style="margin-top:10px"
+              >
+                <u-input
+                  v-model="form.typeName"
+                  placeholder="请选择请假类型"
+                  suffixIcon="arrow-right"
+                  suffixIconStyle="color: #909399"
+                  border="none"
+                  disabledColor="transparent"
+                  disabled
+                />
+              </u-form-item>
+            </view>
+          </view>
+          <view style="margin-top:10px;padding: 0px 10px 0px 10px; background: #ffffff">
+            <view style="padding-left: 9px">
+              <u-form-item
+                label="开始时间:"
+                prop="startTime"
+                required
+                label-position="top"
+                @click="handleDateTime('开始时间', 0, form.startTime)"
+              >
+                <u-input
+                  v-model="form.startTime1"
+                  placeholder="请选择开始时间"
+                  border="none"
+                  suffixIcon="arrow-right"
+                  suffixIconStyle="color: #909399;"
+                />
+              </u-form-item>
+            </view>
+          </view>
+          <view style="margin-top:10px;padding: 0px 10px 0px 10px; background: #ffffff">
+            <view style="padding-left: 9px">
+              <u-form-item
+                label="结束时间:"
+                prop="endTime"
+                required
+                label-position="top"
+                @click="handleDateTime('结束时间', 1, form.endTime)"
+              >
+                <u-input
+                  v-model="form.endTime1"
+                  placeholder="请选择结束时间"
+                  border="none"
+                  suffixIcon="arrow-right"
+                  suffixIconStyle="color: #909399;"
+                />
+              </u-form-item>
+            </view>
+          </view>
+          <view style="margin-top:10px;padding: 0px 10px 0px 10px; background: #ffffff">
+            <view style="padding-left: 9px">
+              <u-form-item
+                label="请假时长(小时):"
+                prop="duration"
+                required
+                label-position="top"
+              >
+                <u-input
+                  v-model="form.duration"
+                  placeholder="请输入请假时长"
+                  border="none"
+                  maxlength="4"
+                />
+              </u-form-item>
+            </view>
+          </view>
+          <view style="margin-top:10px;padding: 0px 10px 0px 10px; background: #ffffff">
+            <view style="padding-left: 9px">
+              <u-form-item
+                label="请假事由:"
+                prop="reason"
+                required
+                label-position="top"
+              >
+                <u-input
+                  v-model="form.reason"
+                  placeholder="请输入请假事由"
+                  border="none"
+                  maxlength="18"
+                />
+              </u-form-item>
+            </view>
+          </view>
+          <view style="margin-top:10px;padding: 0px 10px 0px 10px; background: #ffffff">
+            <view style="padding-left: 9px">
+              <u-form-item label="图片:" prop="imgUrl" label-position="top" >
+                <div style="margin-top: 10px">
+                  <oa-upload :uploadCount="1" :uploadImage="form.imgUrl" @uploadSuccessChange="uploadSuccessChange" @uploadDeleteChange="uploadDeleteChange"></oa-upload>
+                </div>
+                <!-- <view style="color: #666666">图片支持png、jpg</view> -->
+              </u-form-item>
+            </view>
+          </view>
+        </u--form>
+      </view>
+      <u-picker
+        :show="actionShow"
+        :columns="actionsList"
+        :title="actionTitle"
+        keyName="label"
+        visibleItemCount="6"
+        :defaultIndex="[actionDefaultIndex]"
+        :closeOnClickOverlay="true"
+        @close="actionShow = false"
+        @cancel="actionShow = false"
+        @confirm="selectAction"
+      ></u-picker>
+      <u-datetime-picker
+        :show="showTime"
+        v-model="timeValue"
+        mode="datetime"
+        @close="showTime = false"
+        @cancel="showTime = false"
+        @confirm="timeSubmit"
+        :closeOnClickOverlay="true"
+        :minDate="Number(new Date())"
+        :maxDate="Number(new Date('2027'))"
+      ></u-datetime-picker>
+      <view class="list-cell" style="color: #666666; line-height: 25px; width: auto;">
+        <view class="content-area-top">
+          <view style="width:100%;font-weight:bold;color:#333333;font-size:16px;margin-bottom:20px">流程</view>
+          <view class="stepBar">
+            <view class="item" v-for="(item, index) in nodeList" :key="index">
+              <view class="left">
+                <view class="yuan"></view>
+                <div>
+                  <view class="title">
+                    {{ item.nodeName }}
+                  </view>
+                  <view class="name">
+                    {{ item.appointApprover.split(',').length }}人{{ item.nodeType == "1" ? "审批" : item.nodeType == "2" ? "抄送" : "" }}
+                  </view>
+                </div>
+              </view>
+              <view class="right">
+                <view class="content-area-header  mb10 text-center" style="display: inline-block"  v-for="(item2, index2) in ccTo[index]" :key="index2">
+                  <img v-if='item2.avatar' class="content-area-header-avatarImg mlr5" :src='item2.avatar' style="display: block; width: 40px; height: 40px;border-radius: 6px;" />
+                  <u-avatar
+                  v-else
+                    class="content-area-header-avatar mlr5"
+                    :text='item2.nickName.length > 2 ? item2.nickName.slice(1, 3) : item2.nickName'
+                    shape="square"
+                    size="40"
+                    fontSize="12"
+                    color="#ffffff"
+                    :bgColor="proxy.$settingStore.themeColor.color"
+                  ></u-avatar>
+                  <u-text :text='item2.nickName' color="#000000" size="14" align="center" class="userName"></u-text>
+                </view>
+              </view>
+              <view class="line gray" v-if="index < nodeList.length -1">
+              </view>
+            </view>
+          </view>
+        </view>
+      </view>
+      <view class="app-button">
+        <u-button  type="primary" @click="handleSubmit('提交')" shape="circle"> 提交 </u-button>
+      </view>
+    </template>
+  </oa-scroll>
+</template>
+
+<script setup>
+/*----------------------------------依赖引入-----------------------------------*/
+import { onLoad, onShow, onHide, onLaunch, onReady } from "@dcloudio/uni-app";
+import {
+  ref,
+  onMounted,
+  inject,
+  shallowRef,
+  reactive,
+  toRefs,
+  getCurrentInstance,
+} from "vue";
+/*----------------------------------接口引入-----------------------------------*/
+import {
+  companyByNameSelect,
+  addBaseCompany,
+  delBaseBuild,
+  delBaseBuildExtinguish,
+} from "@/api/business/mhxf/unitInfoCollection";
+/*----------------------------------组件引入-----------------------------------*/
+/*----------------------------------store引入-----------------------------------*/
+/*----------------------------------公共方法引入-----------------------------------*/
+import {
+  getOaFormDefinition,
+  addOaDocument,
+} from "@/api/oa/approval/index.js";
+/*----------------------------------公共变量-----------------------------------*/
+const { proxy } = getCurrentInstance();
+const { leaveType } = proxy.useDict("leaveType");
+/*----------------------------------变量声明-----------------------------------*/
+const props = defineProps({
+  data: {
+    type: Object,
+    default: Object,
+  },
+})
+const actionTitle = ref(null);
+const actionsList = ref([]);
+const actionDefaultIndex = ref(0);
+const actionShow = ref(false);
+const uForm = ref(null);
+const showTime = ref(false) //时间选择显示隐藏
+const timeValue = ref(Number(new Date())) //时间选择值
+const timeTitle = ref("") //时间选择标题
+const state = reactive({
+  form: {
+    reason: "",
+    type: undefined,
+    typeName: undefined,
+    formName: undefined,
+    duration: "",
+    imgUrl: "",
+    startTime: "",
+    startTime1: "",
+    endTime: "",
+    endTime1: "",
+    formSign: undefined,
+    formId: undefined,
+  },
+  rules: {
+    type: [{ required: true, message: "请选择请假类型", trigger: "change" }],
+    startTime: [
+      { required: true, message: "请假开始时间不能为空", trigger: "change" },
+    ],
+    endTime: [
+      { required: true, message: "请假结束时间不能为空", trigger: "change" },
+    ],
+    duration: [
+      { required: true, message: "请假时长不能为空", trigger: "blur" },
+    ],
+    reason: [{ required: true, message: "请假事由不能为空", trigger: "blur" }],
+  },
+  userData:[],
+  ccTo:[]
+});
+
+const { form, rules, userData, ccTo} = toRefs(state);
+const nodeList = ref([]);
+state.userData = props.data.userData
+
+nodeList.value = props.data.nodeList
+state.ccTo = props.data.ccTo
+
+form.value.formSign = props.data.form.formSign
+form.value.formId = props.data.form.id
+
+//编辑状态
+if(JSON.stringify(props.data.docNoDetail)!= "{}"){
+  form.value.type = props.data.docNoDetail.type.toString()
+  form.value.typeName = "申请调休"
+}
+/**
+ * @图片上传成功回调
+ */
+ function uploadSuccessChange(e) {
+  form.value.imgUrl = e.url;
+}
+
+/**
+ * @图片删除回调
+ */
+function uploadDeleteChange(e) {
+  form.value.imgUrl = e;
+}
+
+/**
+ * @api提交
+ */
+function handleSubmit(value) {
+  uForm.value
+    .validate()
+      .then((res) => {
+        if(form.value.docNo){
+          updateDocument({
+            docNo: form.value.docNo,
+            id: form.value.id,
+            formId: form.value.formId,
+            formSign: form.value.formSign,
+            type: form.value.type,
+            startTime: form.value.startTime,
+            endTime: form.value.endTime,
+            duration: Number(form.value.duration),
+            reason: form.value.reason,
+            docStatus: 1,
+            image: form.value.image
+          }).then((res) => {
+            proxy.$modal.msgSuccess("表单修改成功");
+            if(getCurrentPages().length > 1){
+              uni.navigateBack()
+            }else{
+              uni.switchTab({
+                url: `/pages/business/oa/approval/index`
+              })
+            }
+          });
+        }else{
+          addOaDocument({
+            formId: form.value.formId,
+            formSign: form.value.formSign,
+            type: form.value.type,
+            startTime: form.value.startTime,
+            endTime: form.value.endTime,
+            duration: Number(form.value.duration),
+            reason: form.value.reason,
+            docStatus: 1,
+            image: form.value.image
+          }).then((res) => {
+            proxy.$modal.msgSuccess("表单提交成功");
+            if(getCurrentPages().length > 1){
+              uni.navigateBack()
+            }else{
+              uni.redirectTo({
+                url: `/pages/business/oa/approval/index`
+              })
+            }
+          });
+        }
+      })
+      .catch((errors) => {
+        proxy.$modal.msg("校验失败");
+      });
+}
+
+/**
+ * @action弹出框点击事件
+ */
+function handleAction(value, index, ind) {
+  if (value == "请假类型") {
+    actionTitle.value = value;
+    actionsList.value = [leaveType.value];
+    actionDefaultIndex.value = 0;
+  }
+  actionShow.value = true;
+}
+
+/**
+ * @action弹出框选择事件
+ */
+function selectAction(e) {
+  if(actionTitle.value == "请假类型"){
+    form.value.type = e.value[0].value;
+    form.value.typeName = e.value[0].label;
+  }
+  actionShow.value = false;
+}
+/**
+ * @时间弹出框点击事件
+ */
+function handleDateTime(value, index, time) {
+  showTime.value = true;
+  timeTitle.value = value;
+}
+
+/**
+ * @时间选择器
+ * @确定按钮事件
+ */
+function timeSubmit(data) {
+  let time = proxy.$time.getFormatterDate(data.value);
+  let timeData = time.split(" ")[0] + " " + time.split(" ")[1]
+  if (timeTitle.value == "开始时间") {
+    form.value.startTime1 = timeData;
+    form.value.startTime = timeData;
+  } else if (timeTitle.value == "结束时间") {
+    form.value.endTime1 = timeData;
+    form.value.endTime = timeData;
+  }
+  showTime.value = false;
+}
+
+onLoad((options) => {
+
+});
+
+onShow(() => {
+  //调用系统主题颜色
+  proxy.$settingStore.systemThemeColor([1]);
+});
+</script>
+
+<style lang="scss">
+.unitInfoCollection-container {
+  .centerOne,
+  .centerTwo {
+    .title {
+      color: #333333;
+      text-align: center;
+      margin-top: 10px;
+    }
+  }
+  :deep(.u-picker__view__column__item) {
+    font-size: 13px;
+  }
+}
+.app-button{
+  position: fixed;
+  bottom:10px;
+  left:10px;
+  width:calc(100% - 20px);
+  button{
+    border-radius: 10px !important;
+  }
+}
+.stepBar{
+    margin-top:-20px;
+    font-weight: 400;
+    width:100%;
+    .item{
+    position: relative;
+      .left{
+        width:100%;
+        position: relative;
+        .yuan{
+          width:10px;
+          height:10px;
+          margin-top:10px;
+          vertical-align: middle;
+          float: left;
+          border-radius: 50%;
+          background: #999;
+        }
+        >div{
+          width:80%;
+          margin-left:20px;
+          vertical-align: top;
+          line-height: 20px;
+          .title{
+            font-size: 14px;
+          }
+          .name{
+            font-size: 12px;
+            color: #999;
+          }
+        }
+      }
+      .line{
+        height:84%;
+        width:1px;
+        position: absolute;
+        top:24px;
+        left:5px;
+        background: #999;
+      }
+      .right{
+        width:calc(100% - 100px);
+        margin-left:100px;
+        text-align: right;
+      }
+    }
+    .item:nth-child(1){
+      margin-top:10%;
+    }
+  }
+.userName{
+  white-space: nowrap;      /* 确保文本在一行内显示 */
+  overflow: hidden;         /* 超出容器部分隐藏 */
+  text-overflow: ellipsis;  /* 超出部分显示省略号 */
+  width: 50px !important;             /* 定义容器宽度 */
+  text-align: center;
+}
+</style>

+ 211 - 0
src/pages/business/oa/approval/formType.vue

@@ -0,0 +1,211 @@
+<template>
+    <u-navbar
+      :autoBack="false"
+      :placeholder="true"
+      :safeAreaInsetTop="true"
+      :bgColor="proxy.$settingStore.themeColor.color"
+    >
+      <template #left>
+        <u-icon
+          name="arrow-left"
+          size="20"
+          color="#fff"
+          @click="returnTo('index')"
+        ></u-icon>
+      </template>
+      <template #center>
+        <text class="grid-area_center_item_title" style="color: #fff"
+          >{{ datail?.formName }}</text
+        >
+      </template>
+    </u-navbar>
+    <qjd v-if="datail?.fieldInfo == 'QJD' && pageStatus " :data="{form:datail,ccTo:ccTo,nodeList:nodeList,type:formType,docNoDetail:docNoDetail}" />
+    <jbd v-if="datail?.fieldInfo == 'JBD' && pageStatus " :data="{form:datail,ccTo:ccTo,nodeList:nodeList,type:formType,docNoDetail:docNoDetail}" />
+    <!-- :data="{form:form,nodeList:nodeList,ccTo:ccTo}" -->
+</template>
+  
+  <script setup>
+  /*----------------------------------依赖引入-----------------------------------*/
+  import { onLoad, onShow, onHide, onLaunch, onReady } from "@dcloudio/uni-app";
+  import {
+    ref,
+    onMounted,
+    inject,
+    shallowRef,
+    reactive,
+    toRefs,
+    getCurrentInstance,
+  } from "vue";
+  /*----------------------------------接口引入-----------------------------------*/
+  import {
+    companyByNameSelect,
+    addBaseCompany,
+    delBaseBuild,
+    delBaseBuildExtinguish,
+  } from "@/api/business/mhxf/unitInfoCollection";
+  /*----------------------------------组件引入-----------------------------------*/
+  import qjd from "./components/qjd.vue";//请假单
+  import jbd from "./components/jbd.vue";//加班单
+  /*----------------------------------store引入-----------------------------------*/
+  import { useStores, commonStores } from "@/store/modules/index";
+  /*----------------------------------公共方法引入-----------------------------------*/
+  import {
+    getOaFormDefinition, getDocumentDetails
+  } from "@/api/oa/approval/index.js";
+  import {
+    UserList
+  } from "@/api/system/user.js";
+  /*----------------------------------公共变量-----------------------------------*/
+  const { proxy } = getCurrentInstance();
+  /*----------------------------------变量声明-----------------------------------*/
+  const formType = ref(""); //表单类型
+  const datail = ref({}); //表单详情
+  const userData = ref([]); //用户列表
+  const ccTo = ref([]); //抄送人列表
+  const nodeList = ref([]); //节点列表
+  const pageStatus = ref(false); //页面状态
+  const docNoDetail = ref({}); //文档号详情
+  /**
+   *
+   * @param {*事件类型} type
+   * @param {*} row
+   */
+   function handle(type,formSign,docNo) {
+    if(type == "getMore"){
+      getOaFormDefinition( {formSign:formSign ? formSign : docNo.split("-")[0]}).then((res)=>{
+        datail.value = res.data[0]
+        if(formType.value == 1){
+          if(res.data.length){
+            var data = res.data[0]
+            /** 查询用户列表 */
+            UserList({ pageNum: "1", pageSize: "10000" }).then((res2) => {
+              userData.value = res2.data.rows;
+              var flowInfo = JSON.parse(data.flowInfo)
+              if(flowInfo.node){
+                nodeList.value = flowInfo.node
+                for(let i = 0; i < nodeList.value.length; i++){
+                  ccTo.value.push([])
+                  var nodeUsers = []
+                  if(nodeList.value[i].appointApprover){
+                    if(nodeList.value[i].appointApprover.indexOf(",")>-1){
+                        nodeUsers = nodeList.value[i].appointApprover.split(",")
+                    }else{
+                        nodeUsers.push(nodeList.value[i].appointApprover)  
+                    }
+                  }
+                  for (let j = 0; j < nodeUsers.length; j++) {
+                    for (let k = 0; k < userData.value.length; k++) {
+                        if (nodeUsers[j] == userData.value[k].userId) {
+                            ccTo.value[i].push(userData.value[k]);
+                        }
+                    }
+                  }
+                }
+              }
+              pageStatus.value = true;
+            })
+          }else{
+            proxy.$modal.msgError("表单模版不存在")
+            returnTo('index')
+          }
+        }else if(formType.value == 2){
+          getDocumentDetails( {docNo:docNo}).then((res2)=>{
+            if(res2.data){
+              docNoDetail.value = res2.data
+              /** 查询用户列表 */
+              UserList({ pageNum: "1", pageSize: "10000" }).then((res3) => {
+                userData.value = res3.data.rows;
+                var data = res.data[0]
+                var flowInfo = JSON.parse(data.flowInfo)
+                if(flowInfo.node){
+                  nodeList.value = flowInfo.node
+                  for(let i = 0; i < nodeList.value.length; i++){
+                      ccTo.value.push([])
+                      var nodeUsers = []
+                      if(nodeList.value[i].appointApprover){
+                          if(nodeList.value[i].appointApprover.indexOf(",")>-1){
+                              nodeUsers = nodeList.value[i].appointApprover.split(",")
+                          }else{
+                              nodeUsers.push(nodeList.value[i].appointApprover)  
+                          }
+                      }
+                      for (let j = 0; j < nodeUsers.length; j++) {
+                          for (let k = 0; k < userData.value.length; k++) {
+                              if (nodeUsers[j] == userData.value[k].userId) {
+                                  ccTo.value[i].push(userData.value[k]);
+                              }
+                          }
+                      }
+                  }
+                }
+                pageStatus.value = true;
+              })
+            }else{
+              proxy.$modal.msgError("表单模版不存在")
+              setTimeout(() => {
+                handle("return")
+              })
+            }
+          })
+        }
+      })
+    }
+  }
+  /**
+   * 返回上级页面
+   * @param defaultPage 默认页面
+   */
+  function returnTo(defaultPage) {
+    if(getCurrentPages().length > 1){
+      uni.navigateBack()
+    }else{
+      uni.switchTab({
+        url: `/pages/${defaultPage}`
+      })
+    }
+  }
+  onLoad((options) => {
+     //新增
+    if(options.formSign){
+      formType.value = 1
+      handle("getMore",options.formSign) 
+    }
+    //编辑
+    if(options.docNo){
+      formType.value = 2 
+      handle("getMore",null,options.docNo) 
+    }
+  });
+  
+  onShow(() => {
+    
+    //调用系统主题颜色
+    proxy.$settingStore.systemThemeColor([1]);
+  });
+  </script>
+  
+  <style lang="scss">
+  .unitInfoCollection-container {
+    .centerOne,
+    .centerTwo {
+      .title {
+        color: #333333;
+        text-align: center;
+        margin-top: 10px;
+      }
+    }
+    :deep(.u-picker__view__column__item) {
+      font-size: 13px;
+    }
+  }
+  .app-button{
+    position: fixed;
+    bottom:10px;
+    left:10px;
+    width:calc(100% - 20px);
+    button{
+      border-radius: 10px !important;
+    }
+  }
+  </style>
+  

+ 298 - 0
src/pages/business/oa/approval/index.vue

@@ -0,0 +1,298 @@
+<template>
+    <u-navbar :autoBack="false" :placeholder="true" :safeAreaInsetTop="true" :bgColor="proxy.$settingStore.themeColor.color">
+      <template #left>
+        <u-icon name="arrow-left" size="20" color="#fff" @click="returnTo('index')"></u-icon>
+      </template>
+      <template #center>
+        <text class="grid-area_center_item_title" style="color: #fff;">我的申请</text>
+      </template>
+    </u-navbar>
+    <oa-scroll
+      customClass="scroll-height"
+      :customStyle="{ height: `calc(100vh - (104px + ${proxy.$settingStore.StatusBarHeight} + ${proxy.$settingStore.tabBarHeight}))` }"
+      :refresherLoad="false"
+      :refresherEnabled="true"
+      :refresherEnabledTitle="false"
+      :refresherDefaultStyle="'none'"
+      :refresherThreshold="44"
+      :refresherBackground="'#f5f6f7'"
+      @refresh="refresh"
+    >
+      <template #default>
+        <view class="home-container">
+            <!-- 我的宫格 -->
+          <view class="grid-area bg-white">
+            <view class="grid-area_center cu-list grid col-4 no-border">
+              <view class="grid-area_center_item cu-item justify-center align-center" @click="navItemClick(1)">
+                <text class="grid-area_center_item_num">{{ state.statistics.pendingSum }}</text>
+                <text class="grid-area_center_item_title">待处理</text>
+              </view>
+              <view class="grid-area_center_item cu-item justify-center align-center" @click="navItemClick(2)">
+                <text class="grid-area_center_item_num">{{ state.statistics.alreadySum }}</text>
+                <text class="grid-area_center_item_title">已处理</text>
+              </view>
+              <view class="grid-area_center_item cu-item justify-center align-center" style="cursor: not-allowed;">
+                <text class="grid-area_center_item_num">{{ state.statistics.myInitiated }}</text>
+                <text class="grid-area_center_item_title">已发起</text>
+              </view>
+              <view class="grid-area_center_item cu-item justify-center align-center" @click="navItemClick(3)">
+                <text class="grid-area_center_item_num">{{ state.statistics.myReceived }}</text>
+                <text class="grid-area_center_item_title">我收到的</text>
+              </view>
+            </view>
+          </view>
+          <!-- 我的宫格 -->
+          <view class="grid-area bg-white" v-if="state.formList.length > 0">
+            <view class="grid-area_title">我的</view>
+            <u-icon class="grid-area_icon"  name="arrow-down" color="#000" size="18"  @click="splitNum(0,5)" v-if="state.appContent[0].direction == '0' && state.formList.length>5"></u-icon>
+            <u-icon class="grid-area_icon"  name="arrow-up" color="#000" size="18"  @click="splitNum(0,5)" v-if="state.appContent[0].direction == '1' && state.formList.length>5"></u-icon>
+            <view class="grid-area_center cu-list grid col-5 no-border" >
+              <view class="grid-area_center_item cu-item align-center" v-for="(item, index) in state.appContent[0].array" :key="index" @click="toForm(item.formSign)">
+                <!-- <image class="grid-area_center_item_image" :src="item.icon"></image> -->
+                <img :src="item.icon" alt="" style="width: 40px;height: 40px;">
+                <text class="grid-area_center_item_title" >{{ item.formName }}</text>
+              </view>
+            </view>
+          </view>
+  
+          <!-- 常用功能宫格 -->
+          <!-- <view class="grid-area bg-white">
+            <view class="grid-area_title">人事功能</view>
+            <view class="grid-area_center cu-list grid col-5 no-border">
+              <view class="grid-area_center_item cu-item justify-center align-center" @tap="navItemClick(item)" v-for="(item, index) in state.cuIconList" :key="index">
+                <image class="grid-area_center_item_image" :src="item.meta.icon"></image>
+                <text class="grid-area_center_item_title">{{ item.meta.aliasTitle ? item.meta.aliasTitle : item.meta.title }}</text>
+              </view>
+            </view>
+          </view> -->
+        </view>
+      </template>
+    </oa-scroll>
+  
+    <oa-tabbar :tabbarValue="0" :tabbarList="proxy.$constData.oaApprovalTabbar" :isSwitchTab="false"></oa-tabbar>
+</template>
+  
+  <script setup>
+  /*----------------------------------依赖引入-----------------------------------*/
+  import { onReady, onLoad, onShow, onNavigationBarButtonTap, onPullDownRefresh, onReachBottom } from "@dcloudio/uni-app";
+  import { ref, onMounted, inject, shallowRef, reactive, getCurrentInstance, toRefs, nextTick } from "vue";
+  /*----------------------------------接口引入-----------------------------------*/
+  import { scan_push, getHomePageData, getFunctionalModuleStatistics, getAppRouters, qrCodeSend, getMobileBanner } from "@/api/index";
+  import { getOaFormDefinition, getFormCount } from "@/api/oa/approval/index";
+  /*----------------------------------组件引入-----------------------------------*/
+  /*----------------------------------store引入-----------------------------------*/
+  import { useStores } from "@/store/modules/index";
+  /*----------------------------------公共方法引入-----------------------------------*/
+  import * as jwx from "@/utils/jssdk.js"; //引入js sdk的封装
+  import { getToken, setToken, removeToken } from "@/utils/auth";
+  import { storage, storageSystem } from "@/utils/storage"; // 公共方法引用
+  /*----------------------------------公共变量-----------------------------------*/
+  const { proxy } = getCurrentInstance();
+  const useStore = useStores();
+  /*----------------------------------变量声明-----------------------------------*/
+  const state = reactive({
+    dialogFlag: false,
+  
+    swiperBool: false,
+    swiperIndex: 0,
+    swiperTime: 5000,
+    swiperList: [],
+  
+    cuIconList: [],
+    recentlyUsed: [],
+    formList:[],
+    appContent:[
+      {name:"my",array:[],direction:"0"},//我的app
+    ],
+    statistics:{
+      "pendingSum": 0, 
+      "alreadySum": 0, 
+      "myInitiated": 0, 
+      "myReceived": 0
+    },//头部统计
+  });
+  
+  const { dialogFlag, formList, statistics,appContent } = toRefs(state);
+
+  function init(){
+    getFormList(); //获取表单列表数据
+    getStatistics();//获取头部统计
+  }
+  
+  /**
+   * @scrollView刷新数据
+   */
+  function refresh() {
+    getAppRoutersData(); //调用路由信息接口
+  }
+  /**
+   * 表单权限列表
+   */
+  function getFormList(){
+    getOaFormDefinition().then((res) => {
+      state.formList = res.data;
+      for(let i=0;i<state.formList.length;i++){
+        state.formList[i].icon = proxy.$common.getAssetsFile(`images/oa/${state.formList[i].formImage}.png`);
+      }
+      state.appContent[0].array = state.formList
+    })
+  }
+  function getStatistics(){
+    getFormCount().then((res)=>{
+      state.statistics = res.data
+    })
+  }
+  /**
+   * 返回上级页面
+   * @param defaultPage 默认页面
+   */
+  function returnTo(defaultPage) {
+    if(getCurrentPages().length > 1){
+      uni.navigateBack()
+    }else{
+      uni.switchTab({
+        url: `/pages/${defaultPage}`
+      })
+    }
+  }
+  /**
+   * 跳转表单模版
+   */
+  function toForm(formSign){
+    if(formSign == "QJD" || formSign == "JBD"){
+      uni.navigateTo({
+        url: `/pages/business/oa/approval/formType?formSign=${formSign}`
+      })
+    }
+  }
+  function navItemClick(index){
+    uni.navigateTo({
+        url: `/pages/business/oa/toDo/index?queryType=${index}`
+      })
+  }
+  /**
+   * 
+   * @param sub 数组下标
+   * @param num 显示数量
+   */
+  function splitNum(sub,num) {
+    state.appContent[sub].array = state.appContent[sub].direction == "0" ? state.formList.slice(0, num) : state.formList
+    state.appContent[sub].direction = state.appContent[sub].direction == "0" ? 1 : "0"
+  }
+  /**
+   * @获取路由信息
+   * @api接口请求
+   */
+  function getAppRoutersData() {
+    getAppRouters().then((res) => {
+      state.cuIconList = res.data;
+      storageSystem.set("homeList", state);
+    });
+  }
+  onShow(() => {
+    init()
+  });
+  </script>
+  
+  <style lang="scss" scoped>
+  .home-container {
+    font-family: "Alibaba_PuHuiTi_Regular";
+    .transition {
+      position: fixed;
+      top: 0;
+      left: 0;
+      right: 0;
+      bottom: 0;
+      z-index: 1100;
+  
+      &-section {
+        position: absolute;
+        top: 10px;
+        right: 15px;
+        background-color: #fff;
+        border-radius: 10px;
+        box-shadow: 0px 0px 15px 0 rgba(0, 0, 0, 0.2);
+  
+        &-divider {
+          border-bottom: 0.5px rgba(0, 0, 0, 0.1) solid;
+          margin: 0 20px;
+        }
+  
+        &-content {
+          display: flex;
+          padding: 15px 20px;
+  
+          &-icon {
+            font-size: 18px;
+            color: #000;
+          }
+  
+          &-text {
+            margin: 0 20px;
+          }
+        }
+  
+        &-content:first-child {
+          padding-top: 15px;
+          border-radius: 10px 10px 0 0;
+        }
+  
+        &-content:last-child {
+          padding-bottom: 15px;
+          border-radius: 0 0 10px 10px;
+        }
+  
+        &-content:hover {
+          // transform: 3s;
+          // transition: all 600ms cubic-bezier(0.3, 1, 0.2, 1);
+          transition: all 3s cubic-bezier(0.7, -0.5, 0.2, 2);
+          background-color: rgba(0, 0, 0, 0.1);
+        }
+      }
+    }
+  
+    .grid-area {
+      margin-top: 10px;
+      width:calc(100% - 20px);
+      margin-left:10px;
+      border-radius: 6px;
+      position: relative;
+      &_title {
+        padding: 10px 10px 5px 10px;
+        color: #000000;
+        font-size: $uni-font-size-base;
+      }
+      &_icon {
+        position: absolute;
+        right: 10px;
+        top:10px;
+      }
+      &_center {
+        border-radius: 6px;
+        color:#000;
+        &_item {
+          &_image {
+            width: 40px;
+            height: 40px;
+          }
+          &_title {
+            font-size: $uni-font-size-sm;
+            word-wrap: break-word;
+            max-width: 60px;
+            text-align: center;
+          }
+          &_num {
+            font-size: 16px;
+            
+          }
+        }
+      }
+    }
+  }
+  .topReturn{
+    width:100%;
+    height:44px;
+    line-height: 44px;
+  }
+  </style>
+  

+ 462 - 0
src/pages/business/oa/toDo/detail.vue

@@ -0,0 +1,462 @@
+<template>
+  <u-navbar :autoBack="false" :placeholder="true" :safeAreaInsetTop="true" :bgColor="proxy.$settingStore.themeColor.color">
+    <template #left>
+      <u-icon name="arrow-left" size="20" color="#fff" @click="returnTo('business/oa/toDo/index')"></u-icon>
+    </template>
+    <template #center>
+      <text class="grid-area_center_item_title" style="color: #fff;">详情</text>
+    </template>
+  </u-navbar>
+  <view class="menu-list m0" style="overflow-y:scroll">
+    <view class="list-cell" style="color: #666666; line-height: 25px; width: auto; ">
+      <view class="content-area-top menu-item">
+        <view class="content-area-top-name" >{{ state?.detail?.createBy + '提交的' + state?.detail?.formName }} </view>
+      </view>
+      <view class="content-area-row_wrap menu-item">
+        <img class="typeIcon" src="@/static/images/oa/approval.png" v-if="state.approvalStatus === '1' "/>
+        <img class="typeIcon" src="@/static/images/oa/pass.png" v-if="state.approvalStatus === '2' "/>
+        <img class="typeIcon" src="@/static/images/oa/refuse.png" v-if="state.approvalStatus === '3' "/>
+        <view class="content-area-row_wrap-view gray"> 上海永天科技股份有限公司 </view>
+        <view class="content-area-row_wrap-view gray"> 单据编号:{{ state.detail.docNo }} </view>
+        <view class="content-area-row_wrap-view" style="display: block">
+          <span :style="{ color: proxy.$common.mapping('elTagClass', 'value', state.approvalStatus, form_status) }" >{{ proxy.$common.mapping("label", "value", state.approvalStatus, form_status) }} </span>
+        </view>
+        <view class="content-area-row_wrap-view gray label">所在部门</view>
+        <view class="content-area-row_wrap-view gray black">{{ state.detail.deptName }}</view>
+        <view class="content-area-row_wrap-view gray label" v-if="state.detail.duration">{{ state.detail.docNo.split("-")[0] ==  "JBD" ? "加班" : state.detail.docNo.split("-")[0] == "QJD" ? "请假" : ""  }}时长</view>
+        <view class="content-area-row_wrap-view gray black" v-if="state.detail.duration">{{ state.detail.duration }}</view>
+        <view class="content-area-row_wrap-view gray label" v-if="state.detail.reason">{{ state.detail.docNo.split("-")[0] ==  "JBD" ? "加班" : state.detail.docNo.split("-")[0] == "QJD" ? "请假" : ""    }}原因</view>
+        <view class="content-area-row_wrap-view gray black" v-if="state.detail.reason">{{ state.detail.reason }}</view>
+      </view>
+    </view>
+    <view class="list-cell" style="color: #666666; line-height: 25px; width: auto;margin:10px 0 60px 0;">
+      <view class="content-area-top">
+        <view style="width:100%;">流程</view>
+        <view class="stepBar">
+          <view class="item">
+            <view class="left">
+              <image class="icon" src="@/static/images/oa/user.png"></image>
+              <image class="status" src="@/static/images/oa/pass2.png"></image>
+              <div>
+                <view class="title">
+                  发起申请
+                </view>
+                <view class="name">
+                  {{ state.detail.createBy }}
+                </view>
+              </div>
+            </view>
+            <view class="right">
+              {{ state.detail.createTime }}
+            </view>
+            <view class="line sucess">
+            </view>
+          </view>
+          <view class="item" v-for="(item, index) in nodeList" :key="index">
+            <view class="left">
+              <image class="icon" src="@/static/images/oa/user.png" v-if="item.nodeType == 1"></image>
+              <image class="icon" src="@/static/images/oa/Ccto.png" v-if="item.nodeType == 2"></image>
+              <div>
+                <view class="title">
+                  {{ item.nodeType == 1 ? item.nodeName : item.nodeType == 2 ? `抄送${item.appointApprover.indexOf(",") && item.appointApprover.split(",").length>1 ? `(${item.appointApprover.split(",").length}人)` : "人"}` : "" }}
+                </view>
+                <view class="name" v-if="item.nodeType == 1">
+                  {{  proxy.$common.mapping("nickName", "userId", item.appointApprover, state.userData) }}
+                </view>
+                <view class="name" v-if="item.nodeType == 2 && item.appointApprover.indexOf(',') && item.appointApprover.split(',').length == 1">
+                  {{  proxy.$common.mapping("nickName", "userId", item.appointApprover, state.userData) }}
+                </view>
+                <view class="name" v-if="item.nodeType == 2 && item.appointApprover.indexOf(',') && item.appointApprover.split(',').length > 1">
+                  抄送人
+                </view>
+              </div>
+            </view>
+            <view class="right">
+              <!-- 2021-08-01 10:30:00 -->
+            </view>
+            <view class="center" v-if="item.nodeType == 2 && item.appointApprover.indexOf(',') && item.appointApprover.split(',').length > 1">
+              <view class="content-area-header  mb10 text-center" style="display: inline-block"  v-for="(approver, index2) in item.appointApprover.split(',')" :key="index2">
+                <img v-if='proxy.$common.mapping("avatar", "userId", approver, state.userData)' class="content-area-header-avatarImg mlr5" :src='proxy.$common.mapping("avatar", "userId", approver, state.userData)' style="display: block; width: 40px; height: 40px" />
+                <u-avatar
+                  v-else
+                  class="content-area-header-avatar mlr5"
+                  :text='proxy.$common.mapping("nickName", "userId", approver, state.userData).length > 2 ? proxy.$common.mapping("nickName", "userId", approver, state.userData).slice(1, 3) : proxy.$common.mapping("nickName", "userId", approver, state.userData)'
+                  shape="square"
+                  size="40"
+                  fontSize="12"
+                  color="#ffffff"
+                  :bgColor="proxy.$settingStore.themeColor.color"
+                ></u-avatar>
+                <u-text :text='proxy.$common.mapping("nickName", "userId", approver, state.userData)' color="#000000" size="14" align="center"></u-text>
+              </view>
+            </view>
+            <view class="line gray" v-if="item.nodeType == 1">
+            </view>
+          </view>
+        </view>
+      </view>
+    </view>
+    <view class="fixedBottom" v-if="(state.approvalStatus == 2 || state.approvalStatus == 3)  && state.detail.proposer == useStore.userId  && state.detail.docNo.split('-')[0] == 'JBD'" @click="handle('again')">
+      <img src="@/static/images/oa/loading.png" alt="">
+      <span>再次提交</span>
+    </view>
+    <view class="approval" v-if="state.approvalStatus == 1">
+      <button class="refuse" @click="handle('refuse',2)">拒绝</button>
+      <button class="pass" @click="handle('pass',2)">同意</button>
+    </view>
+  </view>
+</template>
+<script setup>
+/*----------------------------------依赖引入-----------------------------------*/
+import { onLoad, onShow, onReady, onHide, onLaunch, onNavigationBarButtonTap, onPageScroll } from "@dcloudio/uni-app";
+import { ref, reactive, computed, getCurrentInstance, toRefs, inject, watchEffect } from "vue";
+/*----------------------------------接口引入-----------------------------------*/
+import { getToDoPageList, approve } from "@/api/oa/todo/index.js";
+import { getFormName, getDocumentDetails,getOaFormDefinition } from "@/api/oa/approval/index.js";
+import { listDept, UserList } from "@/api/system/user";
+/*----------------------------------组件引入-----------------------------------*/
+/*----------------------------------store引入-----------------------------------*/
+/*----------------------------------公共方法引入-----------------------------------*/
+/*----------------------------------公共变量-----------------------------------*/
+const { proxy } = getCurrentInstance();
+const { form_status, workflow_form_subset } = proxy.useDict("form_status","workflow_form_subset");
+import { useStores } from "@/store/modules/index";
+/*----------------------------------变量声明-----------------------------------*/
+const useStore = useStores();
+const state = reactive({
+  loading: false,
+  queryParams:{
+    docNo: undefined,
+    pageNum:1,
+    pageSize:5,
+  },
+  detail:{},//详情数据
+  userData:[],//用户列表
+  nodeList:[],//节点列表
+  approvalStatus:"",
+  id:undefined,
+});
+
+const {  queryParams,  detail,formList, userData, nodeList, approvalStatus, id } = toRefs(state);
+/**
+ * @页面初始化
+ */
+function init() {
+  getDetail();
+}
+/**
+ * 表单审核
+ * @param type 
+ * @param status 
+ */
+function handle(type) {
+  //通过、拒绝
+  if(type == "pass" || type == "refuse"){
+    approve({id:state.detail.id,approvalStatus:type == "pass"? 2:3}).then(() => {
+      proxy.$modal.msgSuccess("操作成功");
+      uni.redirectTo({
+        url: `/pages/business/oa/toDo/index`
+      })
+    })
+  }
+  //再次提交
+  if(type == "again"){
+    
+    uni.redirectTo({
+      url: `/pages/business/oa/approval/formType?docNo=${state.detail.docNo}`
+    })
+  }
+}
+
+/**
+ * @列表查询
+ * @api接口查询
+ */
+function getDetail(type) {
+  state.loading = true;
+  // getFormName().then((res1) => {
+  //   state.formList = res1.data;
+    getDocumentDetails(state.queryParams)
+    .then((requset) => {
+        state.detail = requset.data;
+        state.detail.id = state.id;
+        listDept({id:state.detail.deptId}).then((res2) => {
+          state.detail.deptName = res2.data[0].deptName
+        })
+        UserList({ pageNum: "1", pageSize: "10000" }).then((res3) => {
+          state.userData = res3.data.rows;
+          getOaFormDefinition( {formSign:state.queryParams?.docNo?.split("-")[0]}).then((res4)=>{
+            if(res4.data.length){
+              var info = res4.data[0]
+              state.nodeList = JSON.parse(info.flowInfo).node
+              state.detail.formName = info.formName
+            }
+          })
+        })
+        state.loading = false;
+    })
+    .catch((err) => {
+      state.loading = false;
+    });
+  // })
+}
+
+
+/**
+ * 返回上级页面
+ * @param defaultPage 默认页面
+ */
+function returnTo(defaultPage) {
+  if(getCurrentPages().length > 1){
+    uni.navigateBack()
+  }else{
+    uni.redirectTo({
+      url: `/pages/${defaultPage}`
+    })
+  }
+}
+onShow((options) => {
+  
+});
+onLoad((options) => {
+  if(options?.docNo){
+    state.queryParams.docNo = options.docNo;
+  }
+  if(options?.approvalStatus){
+    state.approvalStatus = options.approvalStatus;
+  }
+  if(options?.id){
+    state.id = options.id;
+  }
+  init();
+  //调用系统主题颜色
+  proxy.$settingStore.systemThemeColor([1]);
+});
+</script>
+<style lang="scss" scoped>
+:deep(.u-modal__content) {
+  font-size: 14px;
+  justify-content: left;
+}
+:deep(.list-container .content-area-top-name) {
+  font-size: 16px !important;
+}
+</style>
+<style lang="scss" scoped>
+  .content-area {
+    &-top {
+      font-size: 16px;
+      font-weight: 600;
+      color: #000000;
+      width: 100%;
+      &-name {
+        font-size: 13px;
+        width: 65%;
+        text-align: left;
+        color: #000;
+        white-space: nowrap; /* 确保文本在一行内显示 */
+        overflow: hidden; /* 隐藏超出容器的内容 */
+        text-overflow: ellipsis; /* 使用省略号表示被截断的文本 */
+      }
+      &-time {
+        font-size: 12px;
+        text-align: right;
+        color: #999;
+        float:right;
+        width:35%;
+      }
+
+      &-status {
+        max-width: 30%;
+        margin: auto 0 auto auto;
+        font-size: 12px;
+        color: #ffffff;
+        padding: 0 5px;
+        border-radius: 20px;
+        line-height: 20px;
+      }
+
+      &-icon {
+        max-width: 30%;
+        margin: auto 0 auto auto;
+      }
+    }
+
+    &-row_wrap {
+      font-size: 13px;
+      flex-flow: row wrap;
+
+      &-view {
+        display: flex;
+        min-width: 100%;
+        > .iconfont {
+          font-size: 14px;
+          color: #909399;
+          margin-left: 5px;
+        }
+
+        &-status {
+          margin: auto 0 auto 0;
+          font-size: 12px;
+          font-weight: 600;
+          color: #ffffff;
+          padding: 0 5px;
+          border-radius: 20px;
+          line-height: 20px;
+        }
+      }
+    }
+  }
+
+  .gray{
+    color:#999;
+  }
+  .label{
+    margin-top:10px;
+  }
+  .black{
+    color:#000;
+    margin-top:0px;
+  }
+  .typeIcon{
+    width:55px;
+    position: absolute;
+    top:25px;
+    right:10px;
+  }
+  .fixedBottom{
+    width:100%;
+    height:36px;
+    line-height: 36px;
+    position: fixed;
+    bottom: 0;
+    left:0;
+    background-color: #fff;
+    text-align: center;
+    color:#000;
+    img{
+      vertical-align: middle;
+      margin-right:10px;
+      margin-top:-2px;
+    }
+    span{
+      vertical-align: middle;
+    }
+  }
+  .stepBar{
+    margin-top:-20px;
+    font-weight: 400;
+    .item{
+      position: relative;
+      margin-top:10%;
+      .left,.right{
+        display: inline-block;
+        width:50%;
+      }
+      .left{
+        position: relative;
+        .icon{
+          width:40px;
+          height:40px;
+          vertical-align: middle;
+          float: left;
+        }
+        .status{
+          width:16px;
+          height:16px;
+          position: absolute;
+          left:28px;
+          bottom:-2px;
+        }
+        >div{
+          width:80%;
+          margin-left:50px;
+          vertical-align: middle;
+          line-height: 20px;
+          .title{
+            font-size: 14px;
+          }
+          .name{
+            font-size: 12px;
+            color: #999;
+          }
+        }
+      }
+      .right{
+        vertical-align: top;
+        font-size: 12px;
+        text-align: right;
+        color:#909399;
+      }
+      .line{
+        height:40px;
+        width:1px;
+        position: absolute;
+        top:40px;
+        left:18px;
+      }
+      .line.sucess{
+        background: #67c23a;
+      }
+      .line.gray{
+        background: #999;
+      }
+      .center{
+        width:100%;
+        margin:10px 0 0 40px;
+        padding-right:10px;
+      }
+    }
+  }
+  .content-area {
+    margin: 0;
+    padding: 15px 20px;
+    overflow: hidden;
+
+    &-header {
+      &-avatar {
+        margin: auto 0;
+      }
+      &-avatarImg {
+        width: 35px;
+        height: 35px;
+        border-radius: 4px;
+      }
+
+      &-title {
+        margin: 0 0 15px 0;
+        font-weight: 600;
+        color: #000000;
+      }
+    }
+
+    &-center {
+      line-height: 25px;
+      &-top {
+        color: #000000;
+        font-weight: 600;
+      }
+    }
+  }
+  .approval{
+    position: fixed;
+    width:100%;
+    bottom: 10px;
+    left:0;
+    button{
+      width:calc(50% - 15px);
+      height:50px;
+      margin-left:10px;
+      display: inline-block;
+      border-radius: 16px !important;
+      
+    }
+    button.pass{
+      background: #2A98FF;
+      color:#fff;
+    }
+    button.refuse{
+      border:1px solid #CFCFCF;
+    }
+  }
+</style>

+ 303 - 0
src/pages/business/oa/toDo/index.vue

@@ -0,0 +1,303 @@
+<template>
+  <u-navbar :autoBack="false" :placeholder="true" :safeAreaInsetTop="true" :bgColor="proxy.$settingStore.themeColor.color">
+    <template #left>
+      <u-icon name="arrow-left" size="20" color="#fff" @click="returnTo('business/oa/approval/index')"></u-icon>
+    </template>
+    <template #center>
+      <text class="grid-area_center_item_title" style="color: #fff;">我的待办</text>
+    </template>
+  </u-navbar>
+  <u-sticky class="shadow-default" bgColor="#fff" style="top: 0">
+    <u-tabs
+      :list="tabsList"
+      :current="tabsCurrent"
+      @click="tabsClick"
+      lineColor="#333"
+      :activeStyle="{ color: '#333', fontSize: '14px' }"
+      :inactiveStyle="{ color: '#909399', fontSize: '14px' }"
+      :scrollable="false"
+    ></u-tabs>
+  </u-sticky>
+  <oa-scroll
+    customClass="list-container scroll-height"
+    :pageSize="state.queryParams.pageSize"
+    :total="state.total"
+    :isSticky="true"
+    :customStyle="{
+      //#ifdef APP-PLUS || MP-WEIXIN
+      height: `calc(100vh - (138px + ${proxy.$settingStore.StatusBarHeight}))`,
+      //#endif
+      //#ifdef H5
+      height: `calc(100vh - (138px))`,
+      //#endif
+    }"
+    :refresherLoad="true"
+    :refresherEnabled="true"
+    :refresherDefaultStyle="'none'"
+    :refresherThreshold="44"
+    :lowerThreshold="44"
+    :refresherBackground="'#f5f6f7'"
+    @load="load"
+    @refresh="refresh"
+    :data-theme="'theme-' + proxy.$settingStore.themeColor.name"
+  >
+    <template #default>
+      <view class="projectSearchBox">
+        <u-input v-model.trim="state.queryParams.docNo" placeholder="搜索单据编号" clearable  size="small" style="width: 100%" @change="search"/>
+        <image class="filter" src="@/static/images/common/filter.png"></image>
+      </view>
+      <view class="menu-list m0">
+        <view class="list-cell" style="color: #666666; line-height: 25px; margin: 10px 0; width: auto; " v-for="(base, index) in state.dataList" :key="index" @click="toDetail(base)">
+          <view class="content-area-top menu-item">
+            <view class="content-area-top-name" @click="toProjectMange(base.id)">{{ base.createBy + '提交的' + proxy.$common.mapping("formName", "formSign", base.docNo.split("-")[0], state.formList) }} </view>
+            <view class="content-area-top-time" >{{ base.submitDate}} </view>
+          </view>
+          <view class="content-area-row_wrap menu-item">
+            <view class="content-area-row_wrap-view">单据编号:{{ base.docNo }} </view>
+            <view class="content-area-row_wrap-view">类型:{{ proxy.$common.mapping("formName", "formSign", base.docNo.split("-")[0], state.formList) }}</view>
+            <view class="content-area-row_wrap-view" style="display: block">
+              <span :style="{ color: proxy.$common.mapping('elTagClass', 'value', base.approvalStatus, form_status) }" >{{ proxy.$common.mapping("label", "value", base.approvalStatus, form_status) }} </span>
+            </view>
+          </view>
+        </view>
+      </view>
+    </template>
+  </oa-scroll>
+  <oa-tabbar :tabbarValue="1" :tabbarList="proxy.$constData.oaApprovalTabbar" :isSwitchTab="false"></oa-tabbar>
+</template>
+
+<script setup>
+/*----------------------------------依赖引入-----------------------------------*/
+import { onLoad, onShow, onReady, onHide, onLaunch, onNavigationBarButtonTap, onPageScroll } from "@dcloudio/uni-app";
+import { ref, reactive, computed, getCurrentInstance, toRefs, inject, watchEffect } from "vue";
+/*----------------------------------接口引入-----------------------------------*/
+import { getToDoPageList } from "@/api/oa/todo/index.js";
+import { getFormName } from "@/api/oa/approval/index.js";
+/*----------------------------------组件引入-----------------------------------*/
+/*----------------------------------store引入-----------------------------------*/
+/*----------------------------------公共方法引入-----------------------------------*/
+/*----------------------------------公共变量-----------------------------------*/
+const { proxy } = getCurrentInstance();
+const { form_status, workflow_form_subset } = proxy.useDict("form_status","workflow_form_subset");
+/*----------------------------------变量声明-----------------------------------*/
+const state = reactive({
+  loading: false,
+  tabsCurrent:0,
+  tabsList: [
+    { name: "待处理", value: 1 },
+    { name: "已处理", value: 2 },
+    { name: "我收到的", value: 3 },
+  ],
+  queryParams:{
+    docNo: undefined,
+    startTime: undefined,
+    endTime: undefined,
+    pageNum:1,
+    pageSize:5,
+    queryType:1,
+    formSign:""
+  },
+  total:0,
+  input: "",//搜索内容
+  formList:[],//表单列表
+});
+
+const { tabsList, total, queryParams, input, formList, tabsCurrent } = toRefs(state);
+function tabsClick(value) {
+  state.tabsCurrent = value.value - 1
+  state.queryParams.queryType = value.value;
+  state.queryParams.pageNum = 1;
+  selectListApi();
+}
+/**
+ * @页面初始化
+ */
+function init() {
+  selectListApi();
+}
+/**
+ * 搜索
+ */
+function search(){
+  selectListApi();
+}
+/**
+ * @列表查询
+ * @api接口查询
+ */
+function selectListApi(type) {
+  state.loading = true;
+  getFormName().then((res) => {
+    state.formList = res.data;
+    getToDoPageList(state.queryParams)
+    .then((requset) => {
+      if(type){
+        if(requset.data.records.length>0){
+          state.dataList.push(...requset.data.records);
+          state.total += requset.data.total;
+        }else{
+          state.queryParams.pageNum--
+        }
+      }else{
+        state.dataList = requset.data.records;
+        state.total = requset.data.total;
+      }
+      state.loading = false;
+    })
+    .catch((err) => {
+      state.loading = false;
+    });
+  })
+}
+
+/**
+ * @scrollView加载数据
+ */
+function load() {
+  state.queryParams.pageNum ++;
+  selectListApi("add")
+}
+
+/**
+ * @scrollView刷新数据
+ */
+function refresh() {
+  selectListApi()
+}
+/**
+ * 跳转到详情页
+ * @param row 
+ */
+function toDetail(row){
+  proxy.$tab.navigateTo(`/pages/business/oa/toDo/detail?docNo=${row.docNo}&approvalStatus=${row.approvalStatus}&id=${row.id}`);
+}
+/**
+ * 返回上级页面
+ * @param defaultPage 默认页面
+ */
+function returnTo(defaultPage) {
+  if(getCurrentPages().length > 1){
+    uni.navigateBack()
+  }else{
+    uni.redirectTo({
+      url: `/pages/${defaultPage}`
+    })
+  }
+}
+onShow(() => {
+  init();
+  //调用系统主题颜色
+  proxy.$settingStore.systemThemeColor([1]);
+});
+onLoad((options) => {
+  if(options?.queryType){
+    tabsClick({value:options.queryType});
+  }else{
+    // init();
+  }
+  //调用系统主题颜色
+  proxy.$settingStore.systemThemeColor([1]);
+});
+</script>
+<style lang="scss" scoped>
+:deep(.u-modal__content) {
+  font-size: 14px;
+  justify-content: left;
+}
+:deep(.list-container .content-area-top-name) {
+  font-size: 16px !important;
+}
+</style>
+<style lang="scss" scoped>
+.projectSearchBox {
+  margin: 10px 4%;
+  width: 92%;
+  vertical-align: middle;
+  position: relative;
+  display: flex;
+  .filter{
+    width:17px;
+    height:16px;
+    margin:8px 0 0 4px;
+  }
+  .u-input {
+    display: inline-block;
+    background: #fff;
+    height: 34px;
+    line-height: 34px;
+    padding: 0 5px;
+    border-radius: 20px;
+    .uni-input-input {
+      font-size: 12px !important;
+    }
+    :deep(.u-input__content__prefix-icon) {
+      position: absolute;
+      right: 8px;
+      .uicon-search {
+        font-size: 16px;
+      }
+    }
+  }
+}
+.list-container {
+  .content-area {
+    &-top {
+      font-size: 16px;
+      color: #000000;
+      width: 100%;
+      &-name {
+        font-size: 13px;
+        font-weight: 600;
+        width: 65%;
+        text-align: left;
+        color: #000;
+        white-space: nowrap; /* 确保文本在一行内显示 */
+        overflow: hidden; /* 隐藏超出容器的内容 */
+        text-overflow: ellipsis; /* 使用省略号表示被截断的文本 */
+      }
+      &-time {
+        font-size: 12px;
+        text-align: right;
+        color: #999;
+        float:right;
+        width:35%;
+      }
+
+      &-status {
+        max-width: 30%;
+        margin: auto 0 auto auto;
+        font-size: 12px;
+        color: #ffffff;
+        padding: 0 5px;
+        border-radius: 20px;
+        line-height: 20px;
+      }
+    }
+
+    &-row_wrap {
+      font-size: 13px;
+      flex-flow: row wrap;
+
+      &-view {
+        display: flex;
+        min-width: 100%;
+        > .iconfont {
+          font-size: 14px;
+          color: #909399;
+          margin-left: 5px;
+        }
+
+        &-status {
+          margin: auto 0 auto 0;
+          font-size: 12px;
+          font-weight: 600;
+          color: #ffffff;
+          padding: 0 5px;
+          border-radius: 20px;
+          line-height: 20px;
+        }
+      }
+    }
+  }
+}
+</style>

+ 7 - 8
src/pages/login.vue

@@ -183,8 +183,8 @@ function init() {
     linkUrl.value = window.location.host;
     // linkUrl.value = "192.168.10.165:13200";
     // linkUrl.value = "localhost:81";
-    // linkUrl.value = "xf.usky.cn:13212";
-    
+    // linkUrl.value = "120.26.164.249:13212";
+    // linkUrl.value = "manager.usky.cn";
     useStore.GetMobileTenantConfig({ url: linkUrl.value });
   }
   //#endif
@@ -192,17 +192,16 @@ function init() {
   //#ifdef APP-PLUS || MP-WEIXIN
   if (uni.getStorageSync("serveUrl")) {
     linkUrl.value = uni.getStorageSync("serveUrl");
-    // linkUrl.value = "localhost:81";
     useStore.GetMobileTenantConfig({ url: linkUrl.value });
   } else {
     if(config.appInfo.appid == '__UNI__BF1A1F0'){
-      uni.setStorageSync("serveUrl", "xf.usky.cn:13212");
+      uni.setStorageSync("serveUrl", "120.26.164.249:13212");
+      commonStore.setServeList("120.26.164.249:13212", "");
     }else{
       uni.setStorageSync("serveUrl", "manager.usky.cn");
+      commonStore.setServeList("manager.usky.cn", "");
     }
-    commonStore.setServeList("manager.usky.cn", "");
     linkUrl.value = uni.getStorageSync("serveUrl");
-    // linkUrl.value = "localhost:81";
     useStore.GetMobileTenantConfig({ url: linkUrl.value });
   }
   //#endif
@@ -299,9 +298,9 @@ function handlePrivacy() {
 }
 
 onShow(() => {
-  nextTick(() => {
+  // nextTick(() => {
     init();
-  });
+  // });
 });
 
 onLoad((options) => {

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

@@ -303,4 +303,13 @@ export default {
       uni.previewImage(param)
     }
   },
+  /**
+   * 获取本地图片
+   * @param {图片路径} url
+   * @returns
+   */
+  getAssetsFile(url) {
+    var img = `/static/${url}`
+    return new URL(img, import.meta.url).href;
+  },
 };

+ 22 - 1
src/plugins/constData.plugins.js

@@ -141,6 +141,26 @@ let projectTabbar = [
 	// },
 ]
 
+// OA-我的申请导航栏
+let oaApprovalTabbar = [
+	{
+		pagePath: "/pages/business/oa/approval/index",
+		iconClass: "oaIcon-tab-reportRecord",
+		iconPath: "/static/images/tabBar/tab-approval-gray.png",
+		selectedIconPath: "/static/images/tabBar/tab-approval-blue.png",
+		text: "我的申请",
+		dot: false,
+	},
+	{
+		pagePath: "/pages/business/oa/toDo/index",
+		iconClass: "oaIcon-tab-reportInsert",
+		iconPath: "/static/images/tabBar/tab-toDo-gray.png",
+		selectedIconPath: "/static/images/tabBar/tab-toDo-blue.png",
+		text: "我的待办",
+		dot: false,
+	}
+]
+
 
 // 门禁管理底部导航栏
 let doorTabbar = [
@@ -312,5 +332,6 @@ export default {
 	xunJianList: xunJianList,
 	homeTabbar: homeTabbar,
 	projectTabbar: projectTabbar,
-	doorTabbar: doorTabbar
+	oaApprovalTabbar:oaApprovalTabbar,
+	doorTabbar:doorTabbar
 };

+ 18 - 0
src/plugins/modal.plugins.js

@@ -49,6 +49,24 @@ export default {
       });
     });
   },
+  // 确认窗体带输入框
+  confirmInput(content,placeholderText) {
+    return new Promise((resolve, reject) => {
+      uni.showModal({
+        title: content,
+        editable: true,
+        inputType: "text",
+        placeholderText: placeholderText,
+        cancelText: "取消",
+        confirmText: "确定",
+        success: function (res) {
+          if (res.confirm) {
+            resolve(res);
+          }
+        },
+      });
+    });
+  },
   // 提示信息
   showToast(option) {
     if (typeof option === "object") {

BIN
src/static/font/Alibaba_PuHuiTi_2.0_55_Regular_55_Regular.ttf


BIN
src/static/images/common/filter.png


BIN
src/static/images/oa/Ccto.png


BIN
src/static/images/oa/approval.png


BIN
src/static/images/oa/fuKuan.png


BIN
src/static/images/oa/loading.png


BIN
src/static/images/oa/pass.png


BIN
src/static/images/oa/pass2.png


BIN
src/static/images/oa/qingJia.png


BIN
src/static/images/oa/refuse.png


BIN
src/static/images/oa/user.png


BIN
src/static/images/oa/wait.png


BIN
src/static/images/oa/yongYin.png


BIN
src/static/images/tabBar/tab-approval-blue.png


BIN
src/static/images/tabBar/tab-approval-gray.png


BIN
src/static/images/tabBar/tab-toDo-blue.png


BIN
src/static/images/tabBar/tab-toDo-gray.png


+ 39 - 0
src/static/scss/font.scss

@@ -0,0 +1,39 @@
+// /* 数字特殊字体 */
+// @font-face {
+//     /*给字体命名*/
+//     font-family: 'DINCondBold';
+//     /*引入字体文件*/
+//     src: url('@/assets/font/DINCond-Bold.otf');
+//     font-weight: normal;
+//     font-style: normal;
+// }
+ 
+// /* 时间特殊字体 */
+// @font-face {
+//     /*给字体命名*/
+//     font-family: 'DigitalBold';
+//     /*引入字体文件*/
+//     src: url('@/assets/font/DS-Digital-Bold.ttf');
+//     font-weight: normal;
+//     font-style: normal;
+// }
+
+// /* 标题特殊字体 */
+// @font-face {
+//     /*给字体命名*/
+//     font-family: 'SourceHanSansCN-Heavy';
+//     /*引入字体文件*/
+//     src: url('@/assets/font/SourceHanSansCN-Heavy.otf');
+//     font-weight: normal;
+//     font-style: normal;
+// }
+/* 内容特殊字体 */
+@font-face {
+    /*给字体命名*/
+    font-family: 'Alibaba_PuHuiTi_Regular';
+    /*引入字体文件*/
+    src: url('@/static/font/Alibaba_PuHuiTi_2.0_55_Regular_55_Regular.ttf');
+    font-weight: normal;
+    font-style: normal;
+}
+

+ 1 - 0
src/static/scss/index.scss

@@ -8,6 +8,7 @@
 @import "@/static/iconfont/iconfont.css";
 // sidebar
 @import "./sidebar.scss";
+@import "./font.scss";
 
 
 .weight {

+ 36 - 0
src/store/modules/setting.js

@@ -361,6 +361,40 @@ const settingStores = defineStore("storage-setting", {
          */
         handleLogout() {
             const useStore = useStores();
+            //#ifdef APP-PLUS
+            if(config.appInfo.appid == '__UNI__BF1A1F0'){
+                modal.confirmInput("确定注销并退出系统吗?","请输入密码").then((res) => {
+                    if(res.confirm){
+                        if(!res.content){
+                            modal.msg("请输入密码")
+                        }else if(res.content == "sh628628"){
+                            useStore.LogOut().then(() => {
+                                modal.msgSuccess("退出成功")
+                                tab.reLaunch("/pages/index");
+                            });
+                        }else{
+                            modal.msg("密码错误")
+                        }
+                    }
+                });
+            }else{
+                modal.confirmInput("确定注销并退出系统吗?","请输入密码").then((res) => {
+                    if(res.confirm){
+                        if(!res.content){
+                            modal.msg("请输入密码")
+                        }else if(res.content == "sh628628"){
+                            useStore.LogOut().then(() => {
+                                modal.msgSuccess("退出成功")
+                                tab.reLaunch("/pages/index");
+                            });
+                        }else{
+                            modal.msg("密码错误")
+                        }
+                    }
+                });
+            }
+            //#endif
+            //#ifndef APP-PLUS
             modal.confirm("确定注销并退出系统吗?").then(() => {
                 useStore.LogOut().then(() => {
                     if (localStorage.getItem("type")) {
@@ -374,6 +408,8 @@ const settingStores = defineStore("storage-setting", {
                     }
                 });
             });
+            //#endif
+            
         },
         /**
          * @初始化默认主题

BIN
unpackage/res/icons-xunJian/1024x1024.png


BIN
unpackage/res/icons-xunJian/120x120.png


BIN
unpackage/res/icons-xunJian/144x144.png


BIN
unpackage/res/icons-xunJian/152x152.png


BIN
unpackage/res/icons-xunJian/167x167.png


BIN
unpackage/res/icons-xunJian/180x180.png


BIN
unpackage/res/icons-xunJian/192x192.png


BIN
unpackage/res/icons-xunJian/20x20.png


BIN
unpackage/res/icons-xunJian/29x29.png


BIN
unpackage/res/icons-xunJian/40x40.png


BIN
unpackage/res/icons-xunJian/58x58.png


BIN
unpackage/res/icons-xunJian/60x60.png


BIN
unpackage/res/icons-xunJian/72x72.png


BIN
unpackage/res/icons-xunJian/76x76.png


BIN
unpackage/res/icons-xunJian/80x80.png


BIN
unpackage/res/icons-xunJian/87x87.png


BIN
unpackage/res/icons-xunJian/96x96.png


BIN
unpackage/res/icons/120x120.png


BIN
unpackage/res/icons/144x144.png


BIN
unpackage/res/icons/152x152.png


BIN
unpackage/res/icons/167x167.png


BIN
unpackage/res/icons/180x180.png


BIN
unpackage/res/icons/192x192.png


BIN
unpackage/res/icons/20x20.png


BIN
unpackage/res/icons/29x29.png


BIN
unpackage/res/icons/40x40.png


BIN
unpackage/res/icons/58x58.png


BIN
unpackage/res/icons/60x60.png


BIN
unpackage/res/icons/72x72.png


BIN
unpackage/res/icons/76x76.png


BIN
unpackage/res/icons/80x80.png


BIN
unpackage/res/icons/87x87.png


BIN
unpackage/res/icons/96x96.png


BIN
unpackage/res/push-xunJian/1024x1024.png


BIN
unpackage/res/push-xunJian/120x120.png


BIN
unpackage/res/push-xunJian/144x144.png


BIN
unpackage/res/push-xunJian/152x152.png


BIN
unpackage/res/push-xunJian/167x167.png


BIN
unpackage/res/push-xunJian/180x180.png


BIN
unpackage/res/push-xunJian/192x192.png


BIN
unpackage/res/push-xunJian/20x20.png


BIN
unpackage/res/push-xunJian/29x29.png


BIN
unpackage/res/push-xunJian/40x40.png


BIN
unpackage/res/push-xunJian/58x58.png


BIN
unpackage/res/push-xunJian/60x60.png


BIN
unpackage/res/push-xunJian/72x72.png


BIN
unpackage/res/push-xunJian/76x76.png


BIN
unpackage/res/push-xunJian/80x80.png


BIN
unpackage/res/push-xunJian/87x87.png


BIN
unpackage/res/push-xunJian/96x96.png