Преглед изворни кода

Merge remote-tracking branch 'origin/master'

yusm пре 3 недеља
родитељ
комит
c234435c3d
48 измењених фајлова са 418 додато и 272 уклоњено
  1. 1 1
      fhKeeper/formulahousekeeper/collectdata/src/main/java/com/management/collectdata/controller/DataCollectController.java
  2. BIN
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/assets/image/dqbb.png
  3. BIN
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/assets/image/dqzh.png
  4. BIN
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/assets/image/grzxbjs.png
  5. BIN
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/assets/image/gsmc.png
  6. BIN
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/assets/image/sysm.png
  7. BIN
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/assets/image/whiteNew/frw.png
  8. BIN
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/assets/image/whiteNew/frwz.png
  9. BIN
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/assets/image/whiteNew/jcp.png
  10. BIN
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/assets/image/whiteNew/jcpz.png
  11. BIN
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/assets/image/whiteNew/jdd.png
  12. BIN
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/assets/image/whiteNew/jddz.png
  13. BIN
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/assets/image/whiteNew/jht.png
  14. BIN
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/assets/image/whiteNew/jhtz.png
  15. BIN
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/assets/image/whiteNew/jjh.png
  16. BIN
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/assets/image/whiteNew/jjhz.png
  17. BIN
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/assets/image/whiteNew/jjkh.png
  18. BIN
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/assets/image/whiteNew/jjkhz.png
  19. BIN
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/assets/image/whiteNew/jlxr.png
  20. BIN
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/assets/image/whiteNew/jlxrz.png
  21. BIN
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/assets/image/whiteNew/jsj.png
  22. BIN
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/assets/image/whiteNew/jsjz.png
  23. BIN
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/assets/image/whiteNew/jxs.png
  24. BIN
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/assets/image/whiteNew/jxsz.png
  25. BIN
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/assets/image/yxrq.png
  26. BIN
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/assets/image/yysc.png
  27. 1 1
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/assets/scss/iframe.scss
  28. 6 0
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/components/layout/Page.vue
  29. 1 1
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/hooks/useTheme.js
  30. 1 1
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/pageComponents/business/addEditor.vue
  31. 1 1
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/pageComponents/business/businessOpportunityStage.vue
  32. 1 1
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/pageComponents/order/addEditor.vue
  33. 2 1
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/pdfPreview/pdf.vue
  34. 1 1
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/tabbar/home/component/dataAnalysis.vue
  35. 2 2
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/tabbar/home/component/quickEntrance.vue
  36. 7 7
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/tabbar/home/component/salesBriefings.vue
  37. 5 5
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/tabbar/home/component/workbench.vue
  38. 29 14
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/tabbar/home/index.vue
  39. 75 19
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/tabbar/my/index copy.vue
  40. 158 129
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/tabbar/my/index.vue
  41. 5 5
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/visitor/workbench.vue
  42. 1 1
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/visitorProgram/visitorDetails.vue
  43. 1 1
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/utility/defaultData.js
  44. 19 1
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/utility/generalVariables.js
  45. 12 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/FinanceMonthlyWorktimeController.java
  46. 2 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/FinanceMonthlyWorktimeService.java
  47. 0 22
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/DingDingServiceImpl.java
  48. 87 58
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/FinanceMonthlyWorktimeServiceImpl.java

+ 1 - 1
fhKeeper/formulahousekeeper/collectdata/src/main/java/com/management/collectdata/controller/DataCollectController.java

@@ -74,7 +74,7 @@ public class DataCollectController {
     public List<TisTimeVO> checkCisData(@RequestBody List<TisTimeVO> toSendList) {
         if(!CollectionUtils.isEmpty(toSendList)){
             for (TisTimeVO tisTimeVO : toSendList) {
-                String sqlQuery = "select top 1 iRealCOID from ca_batchmap where cMOCode = ? and iMOSubSN = ? ";
+                String sqlQuery = "select max(iRealCOID) from ca_batchmap where cMOCode = ? and iMOSubSN = ? ";
                 try (Connection connection = sqlServerDataSource.getConnection()) {
                     PreparedStatement queryStmt = connection.prepareStatement(sqlQuery);
                     queryStmt.setString(1, tisTimeVO.getOrderId());

BIN
fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/assets/image/dqbb.png


BIN
fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/assets/image/dqzh.png


BIN
fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/assets/image/grzxbjs.png


BIN
fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/assets/image/gsmc.png


BIN
fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/assets/image/sysm.png


BIN
fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/assets/image/whiteNew/frw.png


BIN
fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/assets/image/whiteNew/frwz.png


BIN
fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/assets/image/whiteNew/jcp.png


BIN
fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/assets/image/whiteNew/jcpz.png


BIN
fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/assets/image/whiteNew/jdd.png


BIN
fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/assets/image/whiteNew/jddz.png


BIN
fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/assets/image/whiteNew/jht.png


BIN
fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/assets/image/whiteNew/jhtz.png


BIN
fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/assets/image/whiteNew/jjh.png


BIN
fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/assets/image/whiteNew/jjhz.png


BIN
fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/assets/image/whiteNew/jjkh.png


BIN
fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/assets/image/whiteNew/jjkhz.png


BIN
fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/assets/image/whiteNew/jlxr.png


BIN
fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/assets/image/whiteNew/jlxrz.png


BIN
fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/assets/image/whiteNew/jsj.png


BIN
fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/assets/image/whiteNew/jsjz.png


BIN
fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/assets/image/whiteNew/jxs.png


BIN
fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/assets/image/whiteNew/jxsz.png


BIN
fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/assets/image/yxrq.png


BIN
fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/assets/image/yysc.png


+ 1 - 1
fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/assets/scss/iframe.scss

@@ -1,4 +1,4 @@
-$themeColor: #0859d6;
+$themeColor: #4F8DE0;
 
 .text-size-small {
   font-size: 12px;

+ 6 - 0
fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/components/layout/Page.vue

@@ -126,4 +126,10 @@ const goBack = ()=>{
     background: $themeColor;
   }
 }
+
+.headerNoBack {
+  :deep(.van-nav-bar) {
+    background: none !important;
+  }
+}
 </style>

+ 1 - 1
fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/hooks/useTheme.js

@@ -1,6 +1,6 @@
 /*主题颜色*/
 const color = {
-    primary: '#0859d6' //主体色
+    primary: '#4F8DE0' //主体色
 };
 
 /*获取vant主题变量配置*/

+ 1 - 1
fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/pageComponents/business/addEditor.vue

@@ -12,7 +12,7 @@
           <template #foldingRight>
             <div class="flex items-center">
               <van-button icon="plus" color="#FF8B32" size="mini" class="relatedAddButton" @click="addBusinessItemProductList()">添加</van-button>
-              <van-button icon="plus" color="#0859d6" size="mini" class="relatedAddButton" @click.stop="resetBusinessItemProductList(index)" v-if="businessItemProductList.length == 1">重置</van-button>
+              <van-button icon="plus" color="#4F8DE0" size="mini" class="relatedAddButton" @click.stop="resetBusinessItemProductList(index)" v-if="businessItemProductList.length == 1">重置</van-button>
               <van-button icon="plus" color="#EE0A24" size="mini" class="relatedAddButton" @click.stop="deleteBusinessItemProductList(index)" v-if="businessItemProductList.length > 1">删除</van-button>
             </div>
           </template>

+ 1 - 1
fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/pageComponents/business/businessOpportunityStage.vue

@@ -209,7 +209,7 @@ useLifecycle({
   color: #858585;
 }
 .haveInHand {
-  background: #0859d6;
+  background: #4F8DE0;
   color: #fff;
 }
 .notStartedYet {

+ 1 - 1
fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/pageComponents/order/addEditor.vue

@@ -13,7 +13,7 @@
             <div class="flex items-center">
               <van-button icon="plus" color="#FF8B32" size="mini" class="relatedAddButton"
                 @click="addBusinessItemProductList()">添加</van-button>
-              <van-button icon="plus" color="#0859d6" size="mini" class="relatedAddButton"
+              <van-button icon="plus" color="#4F8DE0" size="mini" class="relatedAddButton"
                 @click.stop="resetBusinessItemProductList(index)"
                 v-if="businessItemProductList.length == 1">重置</van-button>
               <van-button icon="plus" color="#EE0A24" size="mini" class="relatedAddButton"

+ 2 - 1
fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/pdfPreview/pdf.vue

@@ -8,7 +8,8 @@
 import { onMounted, ref } from 'vue';
 import * as pdfjsLib from 'pdfjs-dist';
 
-const pdfUrl = 'https://crm.ttkuaiban.com/upload/%E6%99%BA%E8%83%BD%E5%AE%A2%E6%88%B7%E7%AE%A1%E5%AE%B6CRM%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E%E4%B9%A6.pdf';
+// const pdfUrl = 'https://crm.ttkuaiban.com/upload/%E6%99%BA%E8%83%BD%E5%AE%A2%E6%88%B7%E7%AE%A1%E5%AE%B6CRM%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E%E4%B9%A6.pdf';
+const pdfUrl = 'https://crm.ttkuaiban.com/upload/mobileUserManual.pdf';
 const pdfContainer = ref(null); // PDF容器
 const canvasWrapper = ref(null); // canvas容器
 let currentPage = 1; // 当前显示的页码

+ 1 - 1
fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/tabbar/home/component/dataAnalysis.vue

@@ -106,7 +106,7 @@ useLifecycle({
           content: '';
           width: 2px;
           border-radius: 10px;
-          background: #0859d6;
+          background: #4F8DE0;
           height: 18px;
           position: absolute;
           left: 0;

+ 2 - 2
fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/tabbar/home/component/quickEntrance.vue

@@ -4,7 +4,7 @@
     <div class="smallFontTitle">快捷新建</div>
     <div class="module">
       <div class="module-item" v-for="(item, index) in selectList" :key="index">
-        <div class="module-img"><img :src="getRouterImg(item.path)" alt=""></div>
+        <div class="module-img"><img :src="getRouterImg(item.path, 'newzPng')" alt=""></div>
         <div class="module-text">建{{ item.name }}</div>
         <div class="absolute top-0 right-0" @click="operationEntrance(index, 'delete')">
           <van-icon name="clear" color="#aaaaaa" size="18" />
@@ -15,7 +15,7 @@
     <div class="flex-1 overflow-y-auto">
       <div class="module">
         <div class="module-item" v-for="(item, index) in allList">
-          <div class="module-img"><img :src="getRouterImg(item.path)" alt=""></div>
+          <div class="module-img"><img :src="getRouterImg(item.path, 'newzPng')" alt=""></div>
           <div class="module-text">建{{ item.name }}</div>
           <div class="absolute top-0 right-0" v-if="selectList.length < 4" @click="operationEntrance(index, 'add')">
             <van-icon name="add" color="#1a6afb" size="18" />

+ 7 - 7
fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/tabbar/home/component/salesBriefings.vue

@@ -9,7 +9,7 @@
     </div>
 
     <div class="content overflow-hidden transitionEffect"
-      :style="`height: ${expandAndCollapse ? usePxToVwView(user.company.isSimple == 1 ? 180 : 298) : '0'}`">
+      :style="`height: ${expandAndCollapse ? usePxToVwView(user?.company?.isSimple == 1 ? 180 : 298) : '0'}`">
       <div class="flex items-center w-full" >
         <div class="item">
           <img src="/src/assets/image/salesKitkehu.png" class="item-img" />
@@ -22,7 +22,7 @@
             </div>
           </div>
         </div>
-        <div class="item" v-if="user.company.isSimple != 1">
+        <div class="item" v-if="user?.company?.isSimple != 1">
           <img src="/src/assets/image/salesKitlianxir.png" class="item-img" />
           <div class="flex flex-col justify-center text=[#999999]">
             <div>新增联系人</div>
@@ -34,7 +34,7 @@
           </div>
         </div>
 
-        <div class="item" v-if="user.company.isSimple == 1">
+        <div class="item" v-if="user?.company?.isSimple == 1">
           <img src="/src/assets/image/salesKitlishi.png" class="item-img" />
           <div class="flex flex-col justify-center text=[#999999]">
             <div>新增{{ businessLabel }}</div>
@@ -47,7 +47,7 @@
         </div>
       </div>
 
-      <div class="flex items-center w-full" v-if="user.company.isSimple != 1">
+      <div class="flex items-center w-full" v-if="user?.company?.isSimple != 1">
         <div class="item">
           <img src="/src/assets/image/salesKitlishi.png" class="item-img" />
           <div class="flex flex-col justify-center text=[#999999]">
@@ -73,7 +73,7 @@
       </div>
 
       <div class="flex items-center w-full">
-        <div class="item" v-if="user.company.isSimple != 1">
+        <div class="item" v-if="user?.company?.isSimple != 1">
           <img src="/src/assets/image/salesKitjer.png" class="item-img" />
           <div class="flex flex-col justify-center text=[#999999]">
             <div>销售订单金额</div>
@@ -96,7 +96,7 @@
           </div>
         </div>
 
-        <div class="item" v-if="user.company.isSimple == 1">
+        <div class="item" v-if="user?.company?.isSimple == 1">
           <img src="/src/assets/image/salesKitxianshuo.png" class="item-img" />
           <div class="flex flex-col justify-center text=[#999999]">
             <div>新增线索</div>
@@ -109,7 +109,7 @@
         </div>
       </div>
 
-      <div class="flex items-center w-full" v-if="user.company.isSimple != 1">
+      <div class="flex items-center w-full" v-if="user?.company?.isSimple != 1">
         <div class="item">
           <img src="/src/assets/image/salesKitxianshuo.png" class="item-img" />
           <div class="flex flex-col justify-center text=[#999999]">

+ 5 - 5
fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/tabbar/home/component/workbench.vue

@@ -30,7 +30,7 @@
             <van-swipe-cell>
               <!-- 拜访计划 -->
               <template v-if="item.calendarType == 1">
-                <div class="bg-[#0859d6] ra6 p-4 mb-4 text-[#fff]" @click="jumpToVisitorDetails(item)">
+                <div class="bg-[#4F8DE0] ra6 p-4 mb-4 text-[#fff]" @click="jumpToVisitorDetails(item)">
                   <div class="w-full flex items-center justify-between">
                     <div class="text-size-in font-bold text-[#fff]">{{ item.planName }}</div>
                     <div :class="`labelTag ${item.finishState == 0 ? 'toBeCompleted' : 'completed'}`">{{ ['未完成',
@@ -127,7 +127,7 @@
             </div>
           </template>
 
-          <div class="w80 bg-[#0859d6] h-28 rounded-md flex flex-col items-center justify-center"
+          <div class="w80 bg-[#4F8DE0] h-28 rounded-md flex flex-col items-center justify-center"
             @click="showCommonForms = true">
             <div class="formImage">
               <img class="w-full h-full" src="/src/assets/image/more.png">
@@ -561,9 +561,9 @@ onActivated(() => {
 }
 
 .primarys {
-  background: rgba($color: #0859d6, $alpha: .1);
-  border-color: #0859d6;
-  color: #0859d6;
+  background: rgba($color: #4F8DE0, $alpha: .1);
+  border-color: #4F8DE0;
+  color: #4F8DE0;
 }
 
 .dangers {

+ 29 - 14
fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/tabbar/home/index.vue

@@ -1,5 +1,5 @@
 <template>
-  <Page styleReset="headerClass">
+  <Page styleReset="headerNoBack">
     <template v-slot:headerLeft>
       <div class="homeheaderleft">
         <img src="/src/assets/image/home_logo.png">
@@ -8,12 +8,13 @@
     </template>
 
     <template v-slot:body>
+      <div class="home-theBack"></div>
       <div class="home-theContent">
         <!-- 固定头部 -->
         <div class="home-theContent-title">
           <div class="item" v-for="(item, index) in addQuickList" :key="index">
             <div class="item-img" @click="jumpAdd(item)">
-              <img :src="getRouterImg(item.path)" alt="">
+              <img :src="getRouterImg(item.path, 'newPng')" alt="">
             </div>
             <div class="item-text">建{{ item.name }}</div>
           </div>
@@ -60,16 +61,16 @@
             </div>
           </div>
         </div>
-
+        
         <!-- 弹出层 -->
-        <van-popup v-model:show="showBottom" position="bottom">
-          <div class="bg-[#eceeef]">
-            <div class="w-full text-center bg-white leading-10" @click="quickListShow = true">快捷新建设置</div>
-            <div class="w-full text-center bg-white leading-10 biankuang" @click="modulesListShow = true">常用功能设置</div>
-            <div class="w-full text-center mt-2 text-[red] bg-white leading-10" @click="showBottom = false">取消</div>
+        <van-popup v-model:show="showBottom" position="bottom" :overlay-style="{ backgroundColor: 'rgba(0, 0, 0, 0.4)' }">
+          <div class="bg-[#f6f6fa]">
+            <div class="w-full text-center bg-white block-div" @click="quickListShow = true">快捷新建设置</div>
+            <div class="w-full text-center bg-white block-div biankuang" @click="modulesListShow = true">常用功能设置</div>
+            <div class="w-full text-center mt-4 text-[red] bg-white block-div" @click="showBottom = false">取消</div>
           </div>
         </van-popup>
-
+        
         <!-- 快捷入口设置 -->
         <van-popup v-model:show="quickListShow" position="bottom" :style="{ height: '100%' }" closeable>
           <QuickEntrance :allModulesList="allModulesList" :selectModule="addQuickList" @save-value="refreshData" />
@@ -107,13 +108,12 @@ import CommonFunctions from './component/commonFunctions.vue'
 const { toastText, toastSuccess, toastFail, toastLoading } = useToast()
 const router = useRouterStore()
 const useInfo = useInfoStore()
-const user = useInfo.userInfo
 
 const showBottom = ref(false)
 const quickListShow = ref(false)
 const modulesListShow = ref(false)
 const topContactsList = ref([])
-const allModulesList = [...useInfo.modularList.filter(item => item.path !== '/biReport'), { id: -1, path: '/visitor', name: '访客计划' }]
+const allModulesList = [...(useInfo?.modularList || []).filter(item => item.path !== '/biReport'), { id: -1, path: '/visitor', name: '访客计划' }]
 const addQuickList = ref([])
 const addCommonlyUsedList = ref([])
 
@@ -144,7 +144,7 @@ function getFrequentlyUsedContacts() {
 }
 
 function jumpAdd(rows) {
-  if(rows.path == '/addEditorVisitor') {
+  if(rows.path == '/visitor') {
     router.navigateTo({
       pathName: 'addEditorVisitor',
       success: () => {}
@@ -190,6 +190,7 @@ function refreshData() {
 }
 
 function obtainEnterpriseWeChatParameters(data = {}) {
+  console.log(data, '<=== data')
   const token = data.id
   // const curUrl = window.location.href.split('home')[0]
   const curUrl = window.location.href
@@ -250,7 +251,7 @@ useLifecycle({
     const currentEnvironment = navigator.userAgent.toLowerCase();
     const isCorpWX = currentEnvironment.indexOf("wxwork") > 0 ? true : false
     if (isCorpWX) {
-      obtainEnterpriseWeChatParameters(userInfo.userInfo)
+      obtainEnterpriseWeChatParameters(useInfo.userInfo)
     }
   }
 });
@@ -268,6 +269,14 @@ useLifecycle({
   background-color: $themeColor;
 }
 
+.home-theBack {
+  width: 100%;
+  height: 147px;
+  background: linear-gradient(to top right, rgba($color: $themeColor, $alpha: 0.8), $themeColor, rgba($color: $themeColor, $alpha: 0.8));
+  position: absolute;
+  top: 0;
+}
+
 .homeheaderleft {
   font-size: 20px;
   font-weight: bold;
@@ -288,9 +297,11 @@ useLifecycle({
   height: 100%;
   flex-direction: column;
 
+
   .home-theContent-title {
     padding: 25px;
-    background-color: $themeColor;
+    // background-color: $themeColor;
+    // background: linear-gradient(to top right, #4985e0, $themeColor, #1965db);
     display: flex;
 
     .item {
@@ -373,4 +384,8 @@ useLifecycle({
 .biankuang {
   border-top: 1px solid #eceeef;
 }
+
+.block-div {
+  padding: 14px 0;
+}
 </style>

+ 75 - 19
fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/tabbar/my/index copy.vue

@@ -1,36 +1,68 @@
 <template>
   <Page title="我的" styleReset="backNone">
     <template v-slot:body>
-      <div class="w-full h-full flex flex-col items-center">
-        <div class="headPortrait">
-          <img src="/src/assets/image/camera.png" class="w-full h-full">
-        </div>
-        <div class="flex-1">
-          <div class="xinming">
-            <TranslationComponent :openId="userInfo.userInfo.name" />
+      <div class="w-full h-full flex flex-col">
+        <div class="px-4 py-6 flex justify-between items-center">
+          <div class="flex items-center">
+            <div class="bg-[#065985] text-[#fff] flex items-center justify-center profilePicture">
+              <TranslationComponent :openId="userInfo.userInfo.name" />
+            </div>
+            <div class="ml-8 profilePicture-text">
+              <TranslationComponent :openId="userInfo.userInfo.name" />
+            </div>
           </div>
-          <div class="flex flex-col justify-center text-[#5D5D5D] leading-6">
-            <div class="text-center">公司: {{ userInfo.userInfo?.company?.companyName }}</div>
-            <div class="text-center">角色: {{ userInfo.userInfo?.roleName }}</div>
-
-            <div class="text-center text-[#0859d6] mt-2" @click="applicationMarket()">应用市场</div>
+        </div>
 
-            <div class="text-center text-[#0859d6] mt-8"
-              v-if="userInfo.userInfo.userNameNeedTranslate != '1' && (isCorpWX || isWX)" @click="bindWeiXin">
-              {{ `绑定${isCorpWX ? '企业' : ''}微信` }}
-              (
+        <!-- 列表 -->
+        <div class="bg-white flex justify-between px-6 py-2 mb-1">
+          <div>当前版本</div>
+          <div class="text-[#999]">{{ ['', '专业版本', '旗舰版本'][userInfo.userInfo?.company?.versionControl] }}</div>
+        </div>
+        <div class="bg-white flex justify-between px-6 py-2 mb-1">
+          <div>公司名称</div>
+          <div class="text-[#999]">{{ userInfo.userInfo?.company?.companyName }}</div>
+        </div>
+        <div class="bg-white flex justify-between px-6 py-2 mb-1">
+          <div>账号角色</div>
+          <div class="text-[#999]">{{ userInfo.userInfo?.roleName }}</div>
+        </div>
+        <div class="bg-white flex justify-between px-6 py-2 mb-1" v-if="userInfo.userInfo.userNameNeedTranslate != '1' && (isCorpWX || isWX)" @click="bindWeiXin">
+          <div>{{ `绑定${isCorpWX ? '企业' : ''}微信` }}</div>
+          <div class="text-[#999]">
+            (
               <span v-if="(isCorpWX && userInfo.userInfo.corpwxUserid == null) || (isWX && userInfo.userInfo.wxOpenid == null)">未绑定</span>
               <span v-if="(isCorpWX && userInfo.userInfo.corpwxUserid != null) || (isWX && userInfo.userInfo.wxOpenid != null)">已绑定</span>
               )
-            </div>
+          </div>
+        </div>
+        <div class="bg-white flex justify-between px-6 py-2 mb-1">
+          <div>有效日期</div>
+          <div class="text-[#999]">{{ userInfo.userInfo?.company?.expirationDate }}</div>
+        </div>
+        <div class="bg-white flex justify-between px-6 py-2 mb-1" @click="instructions()">
+          <div>使用说明</div>
+          <div class="list-imgs">
+            <img src="/src/assets/image/rightArrow.png">
+          </div>
+        </div>
+        <!-- <div class="bg-white flex justify-between px-6 py-2 mb-1">
+          <div>在线客服</div>
+          <div class="list-imgs">
+            <img src="/src/assets/image/rightArrow.png">
+          </div>
+        </div> -->
+        <div class="bg-white flex justify-between px-6 py-2 mb-1" @click="applicationMarket()">
+          <div>应用市场</div>
+          <div class="list-imgs">
+            <img src="/src/assets/image/rightArrow.png">
           </div>
         </div>
 
-        <div class="w-full mb-40 px-24" v-if="!isCorpWX">
+        <!-- 退出登录 -->
+        <div class="w-full mb-40 px-24 mt-20" v-if="!isCorpWX">
           <van-button type="primary" @click="signOut" class="w-full">退出登录</van-button>
         </div>
       </div>
-      <!-- <van-button type="primary" @click="signOut">退出</van-button> -->
     </template>
 
     <template v-slot:footer>
@@ -51,6 +83,12 @@ const userInfo = useInfoStore()
 const isCorpWX = ref(false)
 const isWX = ref(false)
 
+function instructions() {
+  router.navigateTo({
+    pathName: 'pdfPreview',
+  })
+}
+
 function bindWeiXin() {
   //企业微信
   if (isCorpWX.value && userInfo.userInfo.corpwxUserid != null) {
@@ -141,4 +179,22 @@ useLifecycle({
   margin-bottom: 6px;
   text-align: center;
 }
+
+.profilePicture {
+  width: 60px; 
+  height: 60px;
+  border-radius: 50%;
+  font-size: 16px;
+}
+.profilePicture-text {
+  font-size: 16px;
+  color: #065985;
+  font-weight: bold;
+}
+.profilePicture-img {
+  width: 24px;
+}
+.list-imgs {
+  width: 14px;
+}
 </style>

+ 158 - 129
fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/tabbar/my/index.vue

@@ -1,77 +1,78 @@
 <template>
-  <Page title="我的" styleReset="backNone">
-    <template v-slot:body>
-      <div class="w-full h-full flex flex-col">
-        <div class="px-4 py-6 flex justify-between items-center">
-          <div class="flex items-center">
-            <div class="bg-[#065985] text-[#fff] flex items-center justify-center profilePicture">
-              <TranslationComponent :openId="userInfo.userInfo.name" />
-            </div>
-            <div class="ml-8 profilePicture-text">
-              <TranslationComponent :openId="userInfo.userInfo.name" />
-            </div>
+  <div class="personalCenter">
+    <div class="personalCenter-top flex flex-col">
+      <div class="px-4 flex justify-between items-center avatarSection">
+        <div class="flex items-center">
+          <div
+            class="bg-[#fff] text-[#333] flex items-center justify-center profilePicture"
+          >
+            <TranslationComponent :openId="userInfo.userInfo.name" />
           </div>
-          <div class="profilePicture-img">
-            <!-- <img src="/src/assets/image/rightArrow.png"> -->
+          <div class="ml-8 profilePicture-text">
+            <TranslationComponent :openId="userInfo.userInfo.name" /> <br />
+            <div class="jobIdEtc">工号:{{ userInfo.userInfo.jobNumber }}</div>
           </div>
         </div>
-
-        <!-- 列表 -->
-        <div class="bg-white flex justify-between px-6 py-2 mb-1">
-          <div>当前版本</div>
-          <div class="text-[#999]">{{ ['', '专业版本', '旗舰版本'][userInfo.userInfo?.company?.versionControl] }}</div>
+      </div>
+    </div>
+    <div class="flex-1 overflow-y-auto personalCenter-content">
+      <div class="flex flex-row items-center justify-between">
+        <div class="list-tile flex">
+          <img src="../../../assets/image/dqbb.png" alt="" />
+          <div class="list-tile-text">当前版本</div>
         </div>
-        <div class="bg-white flex justify-between px-6 py-2 mb-1">
-          <div>公司名称</div>
-          <div class="text-[#999]">{{ userInfo.userInfo?.company?.companyName }}</div>
+        <div class="list-text">{{ ['', '专业版本', '旗舰版本'][userInfo.userInfo?.company?.versionControl] }}</div>
+      </div>
+      <div class="flex flex-row items-center justify-between" v-if="userInfo.userInfo.userNameNeedTranslate != '1' && (isCorpWX || isWX)" @click="bindWeiXin">
+        <div class="list-tile flex">
+          <img src="../../../assets/image/dqbb.png" alt="" />
+          <div class="list-tile-text">{{ `绑定${isCorpWX ? '企业' : ''}微信` }}</div>
         </div>
-        <div class="bg-white flex justify-between px-6 py-2 mb-1">
-          <div>账号角色</div>
-          <div class="text-[#999]">{{ userInfo.userInfo?.roleName }}</div>
+        <div class="list-text">
+          (
+            <span v-if="(isCorpWX && userInfo.userInfo.corpwxUserid == null) || (isWX && userInfo.userInfo.wxOpenid == null)">未绑定</span>
+            <span v-if="(isCorpWX && userInfo.userInfo.corpwxUserid != null) || (isWX && userInfo.userInfo.wxOpenid != null)">已绑定</span>
+          )
         </div>
-        <div class="bg-white flex justify-between px-6 py-2 mb-1" v-if="userInfo.userInfo.userNameNeedTranslate != '1' && (isCorpWX || isWX)" @click="bindWeiXin">
-          <div>{{ `绑定${isCorpWX ? '企业' : ''}微信` }}</div>
-          <div class="text-[#999]">
-            (
-              <span v-if="(isCorpWX && userInfo.userInfo.corpwxUserid == null) || (isWX && userInfo.userInfo.wxOpenid == null)">未绑定</span>
-              <span v-if="(isCorpWX && userInfo.userInfo.corpwxUserid != null) || (isWX && userInfo.userInfo.wxOpenid != null)">已绑定</span>
-              )
-          </div>
+      </div>
+      <div class="flex flex-row items-center justify-between mt-3">
+        <div class="list-tile flex">
+          <img src="../../../assets/image/gsmc.png" alt="" />
+          <div class="list-tile-text">公司名称</div>
         </div>
-        <div class="bg-white flex justify-between px-6 py-2 mb-1">
-          <div>有效日期</div>
-          <div class="text-[#999]">{{ userInfo.userInfo?.company?.expirationDate }}</div>
+        <div class="list-text">{{ userInfo.userInfo?.company?.companyName }}</div>
+      </div>
+      <div class="flex flex-row items-center justify-between mt-3">
+        <div class="list-tile flex">
+          <img src="../../../assets/image/dqzh.png" alt="" />
+          <div class="list-tile-text">账号角色</div>
         </div>
-        <div class="bg-white flex justify-between px-6 py-2 mb-1" @click="instructions()">
-          <div>使用说明</div>
-          <div class="list-imgs">
-            <img src="/src/assets/image/rightArrow.png">
-          </div>
+        <div class="list-text">{{ userInfo.userInfo?.roleName }}</div>
+      </div>
+      <div class="flex flex-row items-center justify-between mt-3">
+        <div class="list-tile flex">
+          <img src="../../../assets/image/yxrq.png" alt="" />
+          <div class="list-tile-text">有效日期</div>
         </div>
-        <!-- <div class="bg-white flex justify-between px-6 py-2 mb-1">
-          <div>在线客服</div>
-          <div class="list-imgs">
-            <img src="/src/assets/image/rightArrow.png">
-          </div>
-        </div> -->
-        <div class="bg-white flex justify-between px-6 py-2 mb-1" @click="applicationMarket()">
-          <div>应用市场</div>
-          <div class="list-imgs">
-            <img src="/src/assets/image/rightArrow.png">
-          </div>
+        <div class="list-text">{{ userInfo.userInfo?.company?.expirationDate }}</div>
+      </div>
+      <div class="flex flex-row items-center justify-between mt-3" @click="instructions()">
+        <div class="list-tile flex">
+          <img src="../../../assets/image/sysm.png" alt="" />
+          <div class="list-tile-text">使用说明</div>
         </div>
-
-        <!-- 退出登录 -->
-        <div class="w-full mb-40 px-24 mt-20" v-if="!isCorpWX">
-          <van-button type="primary" @click="signOut" class="w-full">退出登录</van-button>
+        <img src="../../../assets/image/rightArrow.png" class="list-text-img"></img>
+      </div>
+      <div class="flex flex-row items-center justify-between mt-3" @click="applicationMarket()">
+        <div class="list-tile flex">
+          <img src="../../../assets/image/yysc.png" alt="" />
+          <div class="list-tile-text">应用市场</div>
         </div>
+        <img src="../../../assets/image/rightArrow.png" class="list-text-img"></img>
       </div>
-    </template>
-
-    <template v-slot:footer>
-      <Footer />
-    </template>
-  </Page>
+    </div>
+    <div><Footer /></div>
+  </div>
 </template>
 
 <script setup>
@@ -81,15 +82,17 @@ import useRouterStore from "@store/useRouterStore.js";
 import useInfoStore from "@store/useInfoStore.js";
 import Footer from "@components/page/footer.vue";
 
-const router = useRouterStore()
-const userInfo = useInfoStore()
-const isCorpWX = ref(false)
-const isWX = ref(false)
+const router = useRouterStore();
+const userInfo = useInfoStore();
+const isCorpWX = ref(false);
+const isWX = ref(false);
 
 function instructions() {
-  router.navigateTo({
-    pathName: 'pdfPreview',
-  })
+  // router.navigateTo({
+  //   pathName: "pdfPreview",
+  // });
+  // 新窗口打开链接
+  window.open("https://crm.ttkuaiban.com/upload/mobileUserManual.pdf");
 }
 
 function bindWeiXin() {
@@ -102,97 +105,66 @@ function bindWeiXin() {
     return;
   }
 
-  var appId = "wx1c1d8fc81bc073a8";//智能客户管家公众号
-  var url = "https://mobcrm.ttkuaiban.com/api/wechat/bindWeiXin2?userId=" + userInfo.userInfo.id;//工时管家公众号授权回调页面
+  var appId = "wx1c1d8fc81bc073a8"; //智能客户管家公众号
+  var url =
+    "https://mobcrm.ttkuaiban.com/api/wechat/bindWeiXin2?userId=" +
+    userInfo.userInfo.id; //工时管家公众号授权回调页面
   if (isCorpWX.value) {
     appId = "ww4e237fd6abb635af"; //企业微信第三方的SUIT ID
-    url = "https://crm.ttkuaiban.com/api/wxcorp/bindCorpWeiXin?userId=" + userInfo.userInfo.id;//授权回调页面
+    url =
+      "https://crm.ttkuaiban.com/api/wxcorp/bindCorpWeiXin?userId=" +
+      userInfo.userInfo.id; //授权回调页面
   }
 
-  var weixinUrl = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + appId + "&redirect_uri=" + encodeURI(url) + "&response_type=code&scope=snsapi_base&state=0#wechat_redirect";
+  var weixinUrl =
+    "https://open.weixin.qq.com/connect/oauth2/authorize?appid=" +
+    appId +
+    "&redirect_uri=" +
+    encodeURI(url) +
+    "&response_type=code&scope=snsapi_base&state=0#wechat_redirect";
   window.location.href = weixinUrl;
 }
 
 function signOut() {
   router.redirectTo({
-    pathName: 'login',
+    pathName: "login",
     success: () => {
-      localStorage.clear()
-      sessionStorage.clear()
+      localStorage.clear();
+      sessionStorage.clear();
       window.location.reload();
-    }
-  })
+    },
+  });
 }
 
 function judgingTheEnvironment() {
   const currentEnvironment = navigator.userAgent.toLowerCase();
-  isCorpWX.value = currentEnvironment.indexOf("wxwork") > 0 ? true : false
-  isWX.value = currentEnvironment.indexOf("micromessenger") > 0 ? true : false
+  isCorpWX.value = currentEnvironment.indexOf("wxwork") > 0 ? true : false;
+  isWX.value = currentEnvironment.indexOf("micromessenger") > 0 ? true : false;
 }
 
 const applicationMarket = () => {
-  window.location.href = 'https://www.ttkuaiban.com/appMarket.html'
-  // window.open('https://www.ttkuaiban.com/appMarket.html', '_blank'); 
-}
+  window.location.href = "https://www.ttkuaiban.com/appMarket.html";
+  // window.open('https://www.ttkuaiban.com/appMarket.html', '_blank');
+};
 
 useLifecycle({
   load: () => {
-    judgingTheEnvironment()
-  }
+    judgingTheEnvironment();
+  },
 });
 </script>
 
 <style lang="scss" scoped>
-.backNone {
-  background: linear-gradient(to bottom, #E0EFFF, #F8F8F8 30%) !important;
-
-  :deep(.van-nav-bar) {
-    background: none;
-  }
-}
-
-.headPortrait {
-  width: 80px;
-  height: 80px;
-  border-radius: 50%;
-  position: relative;
-  margin-top: 20px;
-  margin-bottom: 10px;
-
-  &::after {
-    content: "";
-    width: 24px;
-    height: 24px;
-    background-image: url('@/assets/image/camera.png');
-    background-size: cover;
-    position: absolute;
-    bottom: 0;
-    right: 0;
-  }
-}
-
-.xinming {
-  color: #000000;
-  font-family: PingFang SC;
-  font-weight: semibold;
-  font-size: 18px;
-  line-height: normal;
-  letter-spacing: 0px;
-  text-align: left;
-  margin-bottom: 6px;
-  text-align: center;
-}
-
 .profilePicture {
-  width: 60px; 
-  height: 60px;
+  width: 70px;
+  height: 70px;
   border-radius: 50%;
   font-size: 16px;
+  font-weight: bold;
 }
 .profilePicture-text {
-  font-size: 16px;
-  color: #065985;
-  font-weight: bold;
+  font-size: 18px;
+  color: #fff;
 }
 .profilePicture-img {
   width: 24px;
@@ -200,4 +172,61 @@ useLifecycle({
 .list-imgs {
   width: 14px;
 }
+.personalCenter {
+  width: 100%;
+  height: 100vh;
+  display: flex;
+  flex-direction: column;
+  background-color: #fff;
+}
+.personalCenter-top {
+  width: 100%;
+  height: 180px;
+  background-image: url("../../../assets/image/grzxbjs.png");
+  background-size: cover;
+}
+.avatarSection {
+  padding: 52px 30px 0 30px;
+}
+.jobIdEtc {
+  font-size: 13px;
+  color: #92bdee;
+  margin-top: 4px;
+}
+.personalCenter-content {
+  width: 100%;
+  border-top-left-radius: 15px;
+  border-top-right-radius: 15px;
+  background-color: #fff;
+  position: relative;
+  padding: 20px 26px 0 26px;
+  top: -18px;
+}
+.list-text {
+  color: #A6A6A6;
+  font-weight: medium;
+  font-size: 12px;
+  line-height: normal;
+  position: relative;
+  top: -3px;
+}
+.list-tile {
+  color: #000000;
+  font-weight: medium;
+  font-size: 12px;
+  line-height: normal;
+}
+.list-tile img {
+  width: 28px;
+}
+.list-tile-text{
+  position: relative;
+  top: 2px;
+  margin-left: 10px;
+}
+.list-text-img {
+  width: 16px;
+  position: relative;
+  top: -3px;
+}
 </style>

+ 5 - 5
fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/visitor/workbench.vue

@@ -30,7 +30,7 @@
             <van-swipe-cell>
               <!-- 拜访计划 -->
               <template v-if="item.calendarType == 1">
-                <div class="bg-[#0859d6] ra6 p-4 mb-4 text-[#fff]" @click="jumpToVisitorDetails(item)">
+                <div class="bg-[#4F8DE0] ra6 p-4 mb-4 text-[#fff]" @click="jumpToVisitorDetails(item)">
                   <div class="w-full flex items-center justify-between">
                     <div class="text-size-in font-bold text-[#fff]">{{ item.planName }}</div>
                     <div :class="`labelTag ${item.finishState == 0 ? 'toBeCompleted' : 'completed'}`">{{ ['未完成',
@@ -128,7 +128,7 @@
             </div>
           </template>
 
-          <div class="w80 bg-[#0859d6] h-28 rounded-md flex flex-col items-center justify-center"
+          <div class="w80 bg-[#4F8DE0] h-28 rounded-md flex flex-col items-center justify-center"
             @click="showCommonForms = true">
             <div class="formImage">
               <img class="w-full h-full" src="/src/assets/image/more.png">
@@ -562,9 +562,9 @@ onActivated(() => {
 }
 
 .primarys {
-  background: rgba($color: #0859d6, $alpha: .1);
-  border-color: #0859d6;
-  color: #0859d6;
+  background: rgba($color: #4F8DE0, $alpha: .1);
+  border-color: #4F8DE0;
+  color: #4F8DE0;
 }
 
 .dangers {

+ 1 - 1
fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/visitorProgram/visitorDetails.vue

@@ -49,7 +49,7 @@
                 <div class="bg-[#F8F8FA] flex justify-between items-center px-6 py-4 mb-3 rounded">
                   <div class="w-3/12">{{ item.name }}</div>
                   <div class="flex-1">{{ item.phone }}</div>
-                  <van-icon name="phone" color="#0859d6" size="1.4rem" />
+                  <van-icon name="phone" color="#4F8DE0" size="1.4rem" />
                 </div>
               </a>
             </template>

+ 1 - 1
fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/utility/defaultData.js

@@ -33,7 +33,7 @@ export const fixedFieldTaskType = [
 //任务状态
 export const fixedFieldTaskStatus = [
   { label: "未开始", value: "0", type: "info", color: '#B9B9B9' },
-  { label: "进行中", value: "1", type: "primary", color: '#0859d6' },
+  { label: "进行中", value: "1", type: "primary", color: '#4F8DE0' },
   { label: "已完成", value: "2", type: "success", color: '#07C160' },
   { label: "已超时", value: "3", type: "danger", color: '#EE0A24' },
 ];

Разлика између датотеке није приказан због своје велике величине
+ 19 - 1
fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/utility/generalVariables.js


+ 12 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/FinanceMonthlyWorktimeController.java

@@ -43,6 +43,18 @@ public class FinanceMonthlyWorktimeController {
         }
     }
 
+    @RequestMapping("/getUnDistriibutedPublicTime")
+    public HttpRespMsg getUnDistriibutedPublicTime(Integer fmwId, HttpServletRequest request) {
+        try {
+            return financeMonthlyWorktimeService.getUnDistriibutedPublicTime(fmwId,request);
+        } catch (Exception e) {
+            e.printStackTrace();
+            HttpRespMsg msg = new HttpRespMsg();
+            msg.setError(e.getMessage());
+            return msg;
+        }
+    }
+
     @RequestMapping("/exportByMonth")
     public HttpRespMsg exportByMonth(Integer companyId, String ymonth, @RequestParam(required = false, defaultValue = "0" ) Integer reGenerate,Integer isItAWorkOrder,HttpServletRequest request) throws Exception {
        return financeMonthlyWorktimeService.exportByMonth(companyId, ymonth,reGenerate,isItAWorkOrder ,request);

+ 2 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/FinanceMonthlyWorktimeService.java

@@ -28,4 +28,6 @@ public interface FinanceMonthlyWorktimeService extends IService<FinanceMonthlyWo
     HttpRespMsg setStatusFinal(Integer id, HttpServletRequest request);
 
     HttpRespMsg exportByMonth(Integer companyId, String ymonth, Integer reGenerate, Integer isItAWorkOrder, HttpServletRequest request) throws Exception;
+
+    HttpRespMsg getUnDistriibutedPublicTime(Integer fmwId, HttpServletRequest request);
 }

+ 0 - 22
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/DingDingServiceImpl.java

@@ -1816,28 +1816,6 @@ public class DingDingServiceImpl implements DingDingService {
         }
     }
 
-    //通过unionid获取个人手机号
-    private void getUserMobile() throws Exception {
-        com.aliyun.dingtalkcontact_1_0.Client client = createClient();
-        GetUserHeaders getUserHeaders = new GetUserHeaders();
-        getUserHeaders.xAcsDingtalkAccessToken = "<your access token>";
-        try {
-            client.getUserWithOptions("z21HjQliSzpw0Yxxxx", getUserHeaders, new RuntimeOptions());
-        } catch (TeaException err) {
-            if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
-                // err 中含有 code 和 message 属性,可帮助开发定位问题
-                bizLogger.error(err.code+":"+err.message);
-            }
-        } catch (Exception _err) {
-            TeaException err = new TeaException(_err.getMessage(), _err);
-            if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
-                // err 中含有 code 和 message 属性,可帮助开发定位问题
-                bizLogger.error(err.code+":"+err.message);
-            }
-        }
-    }
-
-
     //将部门id转换为部门层级
     private String convertDepartmentIdToCascade(Integer id) {
         StringBuilder cascade = new StringBuilder();

+ 87 - 58
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/FinanceMonthlyWorktimeServiceImpl.java

@@ -341,64 +341,6 @@ public class FinanceMonthlyWorktimeServiceImpl extends ServiceImpl<FinanceMonthl
                                 }
                             }
                         }
-
-//                        List<FmwDetail> deptAllReportList = insertDataList.stream().filter(r -> r.getDeptId().equals(deptId)).collect(Collectors.toList());
-//                        final double totalDeptTime = threeCenterIds.contains(deptId)?deptAllReportList.stream().reduce(0.0, (a, b) -> a + b.getComposeTime() + b.getRepairTime() + b.getDebugTime() + b.getWaitingTime() + b.getAssistTime(), Double::sum)
-//                                : deptAllReportList.stream().reduce(0.0, (a, b) -> a + b.getComposeTime() + b.getRepairTime() + b.getDebugTime() + b.getWaitingTime(), Double::sum);
-//                        System.out.println("处理公共工时分摊,总工时=="+totalDeptTime);
-//                        if (totalDeptTime > 0) {
-//                            //计算总工时: 用维修组装工时,调试工时和等料工时相加
-//                            insertDataList.forEach(fmwDetail -> {
-//                                //计算每一个项目的部门内部工时占比,按比例分摊公共工时
-//                                if (fmwDetail.getDeptId().equals(deptId)) {
-//                                    double curProjectTime = fmwDetail.getComposeTime() + fmwDetail.getRepairTime() + fmwDetail.getDebugTime() + fmwDetail.getWaitingTime();
-//                                    double assignTime = curProjectTime / totalDeptTime * publicReportDeptItem.getWorkingTime();
-//                                    //理论上不会出现fmwDetail.getPublicTime()有值的情况,但是为了保险起见做个叠加计算吧
-//                                    fmwDetail.setPublicTime(fmwDetail.getPublicTime() == null ? assignTime : fmwDetail.getPublicTime() + assignTime);
-//                                }
-//                            });
-//                        } else {
-//                            //该部门没有部门内部工时,按照填报部门找协作工时
-//                            // 查找该部门的员工都协作了哪些部门
-//                            List<User> deptUserList = userList.stream().filter(u -> u.getDepartmentId().equals(deptId)).collect(Collectors.toList());
-//                            List<String> deptUserIds = deptUserList.stream().map(User::getId).collect(Collectors.toList());
-//                            List<Report> assistDeptListByUser = reportMapper.selectList(new QueryWrapper<Report>().select("dept_id, sum(working_time) working_time").eq("is_assist", 1)
-//                                    .in("creator_id", deptUserIds).between("create_date", firstDayOfMonth, lastDayOfMonth).groupBy("dept_id"));
-//                            //按协作的工时占比来分配
-//                            if (!assistDeptListByUser.isEmpty()) {
-//                                double totalAssistTime = assistDeptListByUser.stream().mapToDouble(Report::getWorkingTime).sum();
-//                                if (totalAssistTime > 0) {
-//                                    for (Report assistDeptItem : assistDeptListByUser) {
-//                                        //处理部门公共工时的分摊,先按协作的其他部门的占比,分到其他部门
-//                                        double curAssistTime = assistDeptItem.getWorkingTime();
-//                                        double assignToDeptTime = curAssistTime / totalAssistTime * publicReportDeptItem.getWorkingTime();
-//                                        //按目标部门的部门内部工时占比进行二次分配
-//                                        Integer assignToDeptId = assistDeptItem.getDeptId();
-//                                        List<FmwDetail> targetDeptReportList = insertDataList.stream().filter(r -> r.getDeptId().equals(assignToDeptId)).collect(Collectors.toList());
-//                                        double totalTargetDeptTime = targetDeptReportList.stream().reduce(0.0, (a, b) -> a + b.getComposeTime() + b.getRepairTime() + b.getDebugTime() + b.getWaitingTime(), Double::sum);
-//                                        if (totalTargetDeptTime > 0) {
-//                                            //计算总工时: 用维修组装工时,调试工时和等料工时相加
-//                                            insertDataList.forEach(fmwDetail -> {
-//                                                //计算每一个项目的部门内部工时占比,按比例分摊公共工时
-//                                                if (fmwDetail.getDeptId().equals(assignToDeptId)) {
-//                                                    double curProjectTime = fmwDetail.getComposeTime() + fmwDetail.getRepairTime() + fmwDetail.getDebugTime() + fmwDetail.getWaitingTime();
-//                                                    double assignTime = curProjectTime / totalTargetDeptTime * assignToDeptTime;
-//                                                    //可能之前已经有其他部门的分摊过来了,需要叠加
-//                                                    fmwDetail.setPublicTime(fmwDetail.getPublicTime() == null ? assignTime : fmwDetail.getPublicTime() +assignTime);
-//                                                }
-//                                            });
-//                                        } else {
-//                                            Department dept = departmentMapper.selectById(assignToDeptId);
-//                                            throw new Exception("存在目标部门没有内部工时,导致公共工时无法分摊:部门=="+dept.getDepartmentName()+",deptId=="+assignToDeptId);
-//                                        }
-//                                    }
-//                                }
-//                            } else {
-//                                //本部门也没有协作其他部门产生工单工时
-//                                Department dept = departmentMapper.selectById(deptId);
-//                                throw new Exception("公共工时无法分配,因为本部门没有协作其他部门产生工单工时,部门=="+dept.getDepartmentName()+",deptId=="+deptId);
-//                            }
-//                        }
                     }
                 }
             }
@@ -615,6 +557,93 @@ public class FinanceMonthlyWorktimeServiceImpl extends ServiceImpl<FinanceMonthl
         return httpRespMsg;
     }
 
+    @Override
+    public HttpRespMsg getUnDistriibutedPublicTime(Integer fmwId, HttpServletRequest request) {
+        FinanceMonthlyWorktime financeMonthlyWorktime = financeMonthlyWorktimeMapper.selectById(fmwId);
+        List<Project> publicProjectList = projectMapper.selectList(new LambdaQueryWrapper<Project>().eq(Project::getIsPublic, 1).eq(Project::getCompanyId, financeMonthlyWorktime.getCompanyId()));
+        List<User> userList = userMapper.selectList(new LambdaQueryWrapper<User>().select(User::getId, User::getName, User::getDepartmentId).eq(User::getCompanyId, financeMonthlyWorktime.getCompanyId()));
+// 处理公共项目工时分摊
+        List<Integer> publicProjectIds = publicProjectList.stream()
+                .map(Project::getId)
+                .collect(Collectors.toList());
+        HttpRespMsg msg = new HttpRespMsg();
+        List<Report> undistributedList = new ArrayList<>();
+        if (!publicProjectIds.isEmpty()) {
+            String ymonth = financeMonthlyWorktime.getYmonth();
+            //获取当月的第一天和最后一天
+            LocalDate firstDayOfMonth = LocalDate.parse(ymonth + "-01", DateTimeFormatter.ofPattern("yyyy-MM-dd"));
+            LocalDate lastDayOfMonth = firstDayOfMonth.withDayOfMonth(firstDayOfMonth.lengthOfMonth());
+            // 查询公共项目工时
+            //TODO: 需确认,员工填报公共项目工时的时候,会选择到工单吗?
+            //研发中心的公共工时不参与分摊; deptId=9508
+            int reserveDeptId = 9508;
+            List<Report> publicReportList = reportMapper.selectList(
+                    new LambdaQueryWrapper<Report>().select(Report::getCreatorId, Report::getDeptId, Report::getWorkingTime).eq(Report::getState, 1)
+                            .ne(Report::getDeptId, reserveDeptId)
+                            .in(Report::getProjectId, publicProjectIds).between(Report::getCreateDate, firstDayOfMonth, lastDayOfMonth));
+            //按照人员所在的部门进行分组,汇总,如果公共项目没有工单,此步骤可以省略
+            publicReportList.forEach(report -> {
+                User reportOwner = userList.stream().filter(u -> u.getId().equals(report.getCreatorId())).findFirst().orElse(null);
+                if (reportOwner != null) {
+                    report.setDeptId(reportOwner.getDepartmentId());
+                }
+            });
+
+            //分组,合计部门公共工时
+            Map<Integer, Double> map = publicReportList.stream().collect(Collectors.groupingBy(Report::getDeptId, Collectors.summingDouble(Report::getWorkingTime)));
+            //将map按照List形式重新组合
+            publicReportList = map.entrySet().stream()
+                    .map(e -> {
+                        Report report = new Report();
+                        report.setDeptId(e.getKey());
+                        report.setWorkingTime(e.getValue());
+                        return report;
+                    })
+                    .collect(Collectors.toList());
+            if (!publicReportList.isEmpty()) {
+                //处理每个部门的公共项目工时分摊
+
+                List<Department> departmentList = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id", financeMonthlyWorktime.getCompanyId()));
+                //三大中心:北京,上海,武汉需按照本部门人填报的全部工时(不区分是否是协作工时),按部门分组
+                List<Integer> threeCenterIds = new ArrayList<>(Arrays.asList(9508, 9509, 9510));
+                for (Report publicReportDeptItem : publicReportList) {
+                    Integer deptId = publicReportDeptItem.getDeptId();
+                    System.out.println("处理公共工时分摊,待分配部门=="+deptId);
+                    if (threeCenterIds.contains(deptId)) {
+                        //处理三大中心的公共工时分摊
+                        List<User> deptUserList = userList.stream().filter(u -> u.getDepartmentId().equals(deptId)).collect(Collectors.toList());
+                        List<String> deptUserIds = deptUserList.stream().map(User::getId).collect(Collectors.toList());
+                        List<Report> deptUserReportGroupList = reportMapper.selectList(new QueryWrapper<Report>().select("project_id,extra_field4,extra_field5,dept_id, sum(working_time) working_time")
+                                .in("creator_id", deptUserIds).between("create_date", firstDayOfMonth, lastDayOfMonth).isNotNull("extra_field4").ne("extra_field4", "")
+                                .groupBy("project_id,extra_field4,extra_field5"));
+                        double totalTime = deptUserReportGroupList.stream().mapToDouble(Report::getWorkingTime).sum();
+                        System.out.println("处理公共工时分摊,总工时=="+totalTime);
+                        if (totalTime == 0) {
+                            //当前部门没有工时
+                            departmentList.stream().filter(d->d.getDepartmentId().equals(deptId)).findFirst().ifPresent(department -> publicReportDeptItem.setUserReportDeptName(department.getDepartmentName()));
+                            undistributedList.add(publicReportDeptItem);
+                        }
+                    } else {
+                        //处理非三大中心的公共工时分摊,按本部门的工单工时来统计
+                        List<Report> deptUserReportGroupList = reportMapper.selectList(new QueryWrapper<Report>().select("project_id,extra_field4,extra_field5,dept_id, sum(working_time) working_time")
+                                .eq("dept_id", deptId).between("create_date", firstDayOfMonth, lastDayOfMonth).isNotNull("extra_field4").ne("extra_field4", "")
+                                .eq("is_assist", 0)
+                                .groupBy("project_id,extra_field4,extra_field5"));
+                        double totalTime = deptUserReportGroupList.stream().mapToDouble(Report::getWorkingTime).sum();
+                        System.out.println("处理非三大中心公共工时分摊,总工时=="+totalTime);
+                        if (totalTime == 0) {
+                            //当前部门没有工时
+                            departmentList.stream().filter(d->d.getDepartmentId().equals(deptId)).findFirst().ifPresent(department -> publicReportDeptItem.setUserReportDeptName(department.getDepartmentName()));
+                            undistributedList.add(publicReportDeptItem);
+                        }
+                    }
+                }
+                msg.setData(undistributedList);
+            }
+        }
+        return msg;
+    }
+
     private static CellStyle createHeaderStyle(Workbook workbook) {
         CellStyle style = workbook.createCellStyle();
         style.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());