Parcourir la source

Merge remote-tracking branch 'origin/master'

yusm il y a 1 mois
Parent
commit
ccfc8bac37
100 fichiers modifiés avec 32949 ajouts et 18009 suppressions
  1. 15 0
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/analysis/api.ts
  2. 132 23
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/analysis/components/AIChat.vue
  3. 3 3
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/analysis/index.vue
  4. 17 5
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/biReport/cusTotalAnalysis/api.ts
  5. 1 1
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/biReport/cusTotalAnalysis/index.vue
  6. 1 1
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/business/component/kanbanView.vue
  7. 4 2
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/business/index.vue
  8. 7 2
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/team/index.vue
  9. BIN
      fhKeeper/formulahousekeeper/management-crm/opencv/opencv-420.jar
  10. BIN
      fhKeeper/formulahousekeeper/management-crm/opencv/x64/opencv_java420.dll
  11. BIN
      fhKeeper/formulahousekeeper/management-crm/opencv/x86/opencv_java420.dll
  12. 15 20
      fhKeeper/formulahousekeeper/management-crm/pom.xml
  13. 0 42
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/config/LdapConfig.java
  14. 6 1
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/BusinessOpportunityController.java
  15. 0 7
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/CustomController.java
  16. 2509 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/ReportController.java
  17. 0 106
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/UserController.java
  18. 433 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/Report.java
  19. 106 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/ReportBatch.java
  20. 66 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/ReportExtraDegree.java
  21. 75 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/ReportImportLog.java
  22. 90 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/ReportLog.java
  23. 72 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/ReportLogDetail.java
  24. 58 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/ReportProfessionProgress.java
  25. 1 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/bo/QuestionBO.java
  26. 3 1
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/vo/DepartmentVO.java
  27. 2 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/mapper/DepartmentMapper.java
  28. 16 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/mapper/ReportBatchMapper.java
  29. 19 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/mapper/ReportExtraDegreeMapper.java
  30. 16 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/mapper/ReportImportLogMapper.java
  31. 16 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/mapper/ReportLogDetailMapper.java
  32. 16 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/mapper/ReportLogMapper.java
  33. 209 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/mapper/ReportMapper.java
  34. 16 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/mapper/ReportProfessionProgressMapper.java
  35. 16 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/mapper/ReportPushLogMapper.java
  36. 2 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/BusinessOpportunityService.java
  37. 2 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/ClueService.java
  38. 40 40
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/CompanyDingdingService.java
  39. 3 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/ContactsService.java
  40. 2 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/ContractService.java
  41. 2 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/CustomService.java
  42. 55 56
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/DingDingService.java
  43. 42 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/LeaveSheetService.java
  44. 2 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/ProductService.java
  45. 294 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/ProjectService.java
  46. 23 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/ReportExtraDegreeService.java
  47. 16 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/ReportLogDetailService.java
  48. 16 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/ReportLogService.java
  49. 16 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/ReportProfessionProgressService.java
  50. 16 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/ReportPushLogService.java
  51. 155 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/ReportService.java
  52. 2 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/SalesOrderService.java
  53. 2 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/TaskService.java
  54. 0 9
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/UserService.java
  55. 234 58
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/AIQuestionServiceImpl.java
  56. 141 5
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/BusinessOpportunityServiceImpl.java
  57. 110 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/ClueServiceImpl.java
  58. 589 589
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/CompanyDingdingServiceImpl.java
  59. 81 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/ContactsServiceImpl.java
  60. 83 2
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/ContractServiceImpl.java
  61. 90 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/CustomServiceImpl.java
  62. 2515 2516
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/DingDingServiceImpl.java
  63. 19 2
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/ExcelExportServiceImpl.java
  64. 820 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/LeaveSheetServiceImpl.java
  65. 97 1
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/ProductServiceImpl.java
  66. 13517 13519
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java
  67. 184 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/ReportExtraDegreeServiceImpl.java
  68. 20 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/ReportLogDetailServiceImpl.java
  69. 20 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/ReportLogServiceImpl.java
  70. 20 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/ReportProfessionProgressServiceImpl.java
  71. 20 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/ReportPushLogServiceImpl.java
  72. 8906 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java
  73. 125 1
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/SalesOrderServiceImpl.java
  74. 208 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/TaskServiceImpl.java
  75. 1 514
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/UserServiceImpl.java
  76. 1 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/util/ExcelUtil.java
  77. 0 297
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/util/ImageCompare.java
  78. 0 129
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/util/ImageReconizeUtil.java
  79. 6 17
      fhKeeper/formulahousekeeper/management-crm/src/main/resources/application.yml
  80. 9 3
      fhKeeper/formulahousekeeper/management-crm/src/main/resources/mapper/ClueMapper.xml
  81. 18 1
      fhKeeper/formulahousekeeper/management-crm/src/main/resources/mapper/DepartmentMapper.xml
  82. 23 0
      fhKeeper/formulahousekeeper/management-crm/src/main/resources/mapper/ReportExtraDegreeMapper.xml
  83. 1 1
      fhKeeper/formulahousekeeper/management-crm/src/main/resources/mapper/UserMapper.xml
  84. 8 6
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/TaskFilesController.java
  85. 37 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/ErpOrderInfo.java
  86. 6 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/UserFvTime.java
  87. 1 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/vo/OtherTaskFileInfoVO.java
  88. 5 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/BusinessTripMapper.java
  89. 15 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ErpOrderInfoMapper.java
  90. 4 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/LeaveSheetMapper.java
  91. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/TaskFilesMapper.java
  92. 4 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/UserFvTimeMapper.java
  93. 0 24
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/TaskServiceImpl.java
  94. 327 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/task/DataCollectTask.java
  95. 15 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/BusinessTripMapper.xml
  96. 18 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ErpOrderInfoMapper.xml
  97. 14 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/LeaveSheetMapper.xml
  98. 5 3
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/TaskFilesMapper.xml
  99. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/TaskMapper.xml
  100. 0 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/UserFvTimeMapper.xml

+ 15 - 0
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/analysis/api.ts

@@ -151,3 +151,18 @@ export interface ChatContent {
 export async function getLatestQuestionList(): Promise<LatestQuestionResponse> {
   return await post('/aiQuestion/getLatestQuestionList');
 }
+
+export interface CustomReport {
+  id: string;
+  storeName: string;
+  relateFormId: string;
+}
+
+export interface CustomReportResponse {
+  code: string;
+  data: CustomReport[];
+}
+
+export async function getCustomReports(): Promise<CustomReportResponse> {
+  return await post('/aiQuestion/getCusReportForm');
+}

+ 132 - 23
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/analysis/components/AIChat.vue

@@ -1,6 +1,9 @@
 <template>
-  <div class="border-gray-200 border rounded p-3 h-full flex flex-col" style="min-height: 750px; max-height: 750px;">
-    <div class="text-sm font-medium mb-3">DeepSeek大模型CRM数据分析</div>
+  <div class="border-gray-200 p-3 h-full flex flex-col" style="min-height: 750px; max-height: 750px;">
+    <div class="text-sm font-medium mb-3 flex justify-between">
+      <span style="color: #075985">DeepSeek大模型CRM数据分析</span>
+      <span class="text-gray-500 text-right">开会做PPT利器!</span>
+    </div>
     
     <!-- Chat messages container with fixed height and scrolling -->
     <div class="mb-3 border-gray-200 border rounded overflow-y-auto flex-grow" style="min-height: 0;">
@@ -11,6 +14,9 @@
               <el-icon><ChatLineRound /></el-icon>
             </el-avatar>
             <div class="border-gray-200 border rounded p-2 text-sm max-w-[80%] bg-gray-50 relative">
+              <div class="text-xs text-gray-500 mb-1" v-if="message.dataSource">
+                [{{ message.dataSource }}{{ message.dataName ? '-' + message.dataName : '' }}]
+              </div>
               <div class="markdown-body" v-html="renderMarkdown(message.content)"></div>
               <div v-if="message.loading" class="loading-dots">
                 <span></span>
@@ -18,7 +24,7 @@
                 <span></span>
               </div>
               <el-button 
-                v-if="!message.loading && message.role === 'assistant' && index > 0"
+                v-if="!message.loading && message.role === 'assistant' && index > 0 && '抱歉,请求处理失败,请稍后再试' != message.content && '无数据' != message.content"
                 @click="exportToWord(message.content)"
                 size="small" 
                 type="text" 
@@ -28,7 +34,11 @@
             </div>
           </div>
           <div v-if="message.role === 'user'" class="flex items-start gap-2 justify-end">
-            <div class="border-gray-200 border rounded p-2 text-sm max-w-[80%] bg-blue-50 markdown-body" v-html="renderMarkdown(message.content)">
+            <div class="border-gray-200 border rounded p-2 text-sm max-w-[80%] bg-blue-50">
+              <div class="text-xs text-gray-500 mb-1" v-if="message.dataSource">
+                [{{ message.dataSource }}{{ message.dataName ? '-' + message.dataName : '' }}]
+              </div>
+              <div class="markdown-body" v-html="renderMarkdown(message.content)"></div>
             </div>
             <el-avatar :size="24" class="bg-gray-200 flex items-center justify-center">
               <el-icon><User /></el-icon>
@@ -61,6 +71,23 @@
           <el-option label="产品" value="product" />
         </el-select>
       </div>
+
+      <div v-if="dataSource === 'custom'">
+        <el-select 
+          v-model="selectedReportId" 
+          size="small" 
+          style="width: 200px"
+          placeholder="选择报表"
+          @focus="loadCustomReports"
+        >
+          <el-option 
+            v-for="report in customReports"
+            :key="report.relateFormId"
+            :label="report.storeName"
+            :value="report.relateFormId"
+          />
+        </el-select>
+      </div>
       
       <div v-if="dataSource === 'upload'">
         <el-upload
@@ -73,7 +100,7 @@
         </el-upload>
       </div>
       
-      <div class="ml-auto">
+      <div v-if="dataSource === 'system'" class="ml-auto">
         <span class="text-sm mr-2">时间段</span>
         <el-date-picker
           v-model="dateRange"
@@ -83,6 +110,7 @@
           start-placeholder="开始日期"
           end-placeholder="结束日期"
           format="YYYY-MM-DD"
+          value-format="YYYY-MM-DD"
         />
       </div>
     </div>
@@ -96,6 +124,7 @@
         placeholder="请进行数据分析,给一个总结报告,不超过300字"
         class="flex-1"
         resize="none"
+        @keyup.enter="inputMessage.trim() && !loading ? sendMessage() : null"
       />
       <el-button
         type="primary"
@@ -119,11 +148,13 @@ import {
   askAIQuestion,
   uploadFileApi, 
   getLatestQuestionList,
+  getCustomReports,
   type AIQuestionParams,
   type UploadFileResponse,
   type ChatContent,
   type LatestQuestionResponse,
-  type AIQuestionResponse
+  type AIQuestionResponse,
+  type CustomReport
 } from '../api';
 import { ElMessage } from 'element-plus/es'
 import * as internal from 'stream';
@@ -271,11 +302,22 @@ interface ChatMessage {
   role: 'user' | 'assistant';
   content: string;
   loading?: boolean;
+  dataSource?: string;
+  dataName?: string;
 }
 
 // Data source selection
 const dataSource = ref<DataSourceType>('system');
 const systemTable = ref<SystemTableType>('clue');
+const customReports = ref<CustomReport[]>([]);
+const selectedReportId = ref<string>('');
+const formatDate = (date: Date) => {
+  const year = date.getFullYear();
+  const month = String(date.getMonth() + 1).padStart(2, '0');
+  const day = String(date.getDate()).padStart(2, '0');
+  return `${year}-${month}-${day}`;
+};
+
 const getFirstDayOfMonth = () => {
   const date = new Date();
   return new Date(date.getFullYear(), date.getMonth(), 1);
@@ -305,7 +347,7 @@ const handleUpload = async (options: any) => {
   }
 };
 
-const dateRange = ref([getFirstDayOfMonth(), new Date()]);
+const dateRange = ref([formatDate(getFirstDayOfMonth()), formatDate(new Date())]);
 
 // Chat functionality
 const inputMessage = ref('请进行数据分析,给一个总结报告,不超过300字');
@@ -313,6 +355,20 @@ const loading = ref(false);
 const messages = reactive<ChatMessage[]>([]);
 const questionId = ref<number | null>(null);
 
+const loadCustomReports = async () => {
+  if (customReports.value.length === 0) {
+    try {
+      const result = await getCustomReports();
+      if (result.code === 'ok') {
+        customReports.value = result.data;
+      }
+    } catch (error) {
+      console.error('Failed to load custom reports:', error);
+      ElMessage.error('加载自定义报表失败');
+    }
+  }
+};
+
 const isSameDay = (dateString: string, compareDate: Date) => {
   // Parse yyyy-MM-dd hh:mm:ss format
   const [datePart] = dateString.split(' ');
@@ -348,32 +404,78 @@ onMounted(async () => {
     console.error('Failed to load chat history:', error);
     messages.push({ role: 'assistant', content: '你好,需要分析查询哪些数据,请交给我' });
   }
+
+  // 触发滚动到底部
+  nextTick(() => {
+    const container = document.querySelector('.overflow-y-auto');
+    if (container) {
+      container.scrollTop = container.scrollHeight;
+    }
+  });
 });
 
 const sendMessage = async () => {
   if (!inputMessage.value.trim() || loading.value) return;
-
+  type DataSourceType = 'system' | 'custom' | 'upload' | 'free';
+  const dataSourceNameMap: Record<DataSourceType, string> = {
+    'system': '系统表',
+    'custom': '自定义报表',
+    'upload': '本地上传', 
+    'free': '自由交流'
+  };
+  const dataSourceMap: Record<DataSourceType, number> = {
+    'system': 1,
+    'custom': 2,
+    'upload': 3, 
+    'free': 4
+  };
+  const sourceName = dataSourceNameMap[dataSource.value]
+  const dataName = dataSource.value === 'system' ? 
+              systemTable.value === 'clue' ? '线索' :
+              systemTable.value === 'business_opportunity' ? '商机' :
+              systemTable.value === 'custom' ? '客户' :
+              systemTable.value === 'contacts' ? '联系人' :
+              systemTable.value === 'contract' ? '合同' :
+              systemTable.value === 'sales_order' ? '销售订单' : '产品' :
+            dataSource.value === 'custom' ? 
+              customReports.value.find(r => r.relateFormId === selectedReportId.value)?.storeName || '' :
+            dataSource.value === 'upload' ? 
+              uploadFile.value?.name || '' : ''
+  const finalContent = '['+sourceName+(dataName?('-'+dataName):'')+']'+'<br>' + inputMessage.value;
+  if (!dataName) {
+    if (dataSource.value == 'custom') {
+        //提示:请选择报表
+        ElMessage.error({
+          message: "请选择报表",
+          type: "error",
+          duration: 2000,
+        })
+        return
+    } else if (dataSource.value == 'upload') {
+        ElMessage.error({
+            message: "请上传数据文件(仅支持excel格式)",
+            type: "error",
+            duration: 2000,
+          })
+          return
+    }
+  }
   loading.value = true;
-  const userMessage: ChatMessage = { role: 'user', content: inputMessage.value };
+  const userMessage: ChatMessage = { role: 'user', content: finalContent };
   messages.push(userMessage);
   const thinkingIndex = messages.length;
   messages.push({ role: 'assistant', content: 'AI正在思考', loading: true });
   
   try {
-    type DataSourceType = 'system' | 'custom' | 'upload' | 'free';
-    const dataSourceMap: Record<DataSourceType, number> = {
-      'system': 1,
-      'custom': 2,
-      'upload': 3, 
-      'free': 4
-    };
-
+    console.log('发送日期=='+dateRange);
+    console.log(dateRange.value[0]);
     const params: AIQuestionParams & { questionId?: number } = {
       questionDataSource: dataSourceMap[dataSource.value],
-      sourceContent: dataSource.value === 'system' ? systemTable.value : '',
-      content: inputMessage.value,
-      startDate: dateRange.value[0]?.toISOString().split('T')[0],
-      endDate: dateRange.value[1]?.toISOString().split('T')[0],
+      sourceContent: dataSource.value === 'system' ? systemTable.value : 
+                   dataSource.value === 'custom' ? selectedReportId.value : '',
+      content: finalContent,
+      startDate: dateRange.value[0],
+      endDate: dateRange.value[1],
       url: dataSource.value === 'upload' ? uploadedFilePath.value : ''
     };
 
@@ -381,7 +483,15 @@ const sendMessage = async () => {
     if (questionId.value) {
       params.questionId = questionId.value;
     }
-
+    // reset message input
+    inputMessage.value = '';
+    //上方聊天记录页面自动滚动到最下面
+    nextTick(() => {
+      const container = document.querySelector('.overflow-y-auto');
+      if (container) {
+        container.scrollTop = container.scrollHeight;
+      }
+    });
     const result = await askAIQuestion(params);
     messages[thinkingIndex] = {
       role: 'assistant',
@@ -398,7 +508,6 @@ const sendMessage = async () => {
     };
   }
 
-  inputMessage.value = '';
   loading.value = false;
   // 触发滚动到底部
   nextTick(() => {

+ 3 - 3
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/analysis/index.vue

@@ -185,10 +185,10 @@ watchEffect(() => {
 </script>
 
 <template>
-  <div class="m-5 bg-white min-h-full p-4 rounded">
+  <div class="m-5">
     <section class="flex gap-4">
       <!-- Left side - Original functionality -->
-      <div class="w-1/2 min-w-[650px] flex-shrink-0">
+      <div class="w-1/2 min-w-[650px] flex-shrink-0 bg-white p-4 rounded">
         <div class="flex gap-3 mb-4">
           <div class="w-40">
             <el-select
@@ -465,7 +465,7 @@ watchEffect(() => {
       </div>
       
       <!-- Right side - AI Chat -->
-      <div class="w-1/2">
+      <div class="w-1/2 bg-white p-4 rounded">
         <AIChat />
       </div>
     </section>

+ 17 - 5
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/biReport/cusTotalAnalysis/api.ts

@@ -64,13 +64,25 @@ export const dateCollections = [
     end_time: dayjs().add(-1, 'month').endOf('month').format('YYYY-MM-DD HH:mm:ss')
   },
   {
-    name: '本季度',
-    start_time: dayjs().month(0).format('YYYY-MM-DD HH:mm:ss'),
-    end_time: dayjs().month(2).endOf('month').format('YYYY-MM-DD HH:mm:ss')
+    name: "本季度",
+    start_time: dayjs()
+      .month(Math.floor(dayjs().month() / 3) * 3) // 当前季度的起始月份
+      .startOf("month")
+      .format("YYYY-MM-DD HH:mm:ss"),
+    end_time: dayjs()
+      .month(Math.floor(dayjs().month() / 3) * 3 + 2) // 当前季度的结束月份
+      .endOf("month")
+      .format("YYYY-MM-DD HH:mm:ss"),
   },
   {
     name: '上季度',
-    start_time: dayjs().add(-1, 'year').month(9).format('YYYY-MM-DD HH:mm:ss'),
-    end_time: dayjs().add(-1, 'year').month(11).endOf('month').format('YYYY-MM-DD HH:mm:ss')
+    start_time: dayjs()
+      .month(Math.floor(dayjs().month() / 3) * 3 - 3) // 上季度的起始月份
+      .startOf('month')
+      .format('YYYY-MM-DD HH:mm:ss'),
+    end_time: dayjs()
+      .month(Math.floor(dayjs().month() / 3) * 3 - 1) // 上季度的结束月份
+      .endOf('month')
+      .format('YYYY-MM-DD HH:mm:ss')
   }
 ];

+ 1 - 1
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/biReport/cusTotalAnalysis/index.vue

@@ -88,7 +88,7 @@ const queryOverall = async (payload?: RequestProps) => {
   seachLoading.value = false
 
   const sourceData = data.map((d: any) => {
-    const base = {
+    const base: any = {
       name: form.type === 1 ? d.name : d.departmentName,
       ['成交客户数']: d.customerDeal,
       ['新增客户数']: d.customertotal

+ 1 - 1
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/business/component/kanbanView.vue

@@ -22,7 +22,7 @@ const allLoading = reactive({
 })
 
 onMounted(() => {
-  getKanbanViewData();
+  // getKanbanViewData();
 })
 
 function promotionStage() {

+ 4 - 2
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/business/index.vue

@@ -533,9 +533,11 @@ function getBusinessTableList() {
 }
 
 function resetForm() {
+  const formValue = getFromValue(businessOpportunityForm)
   let reset = {
-    startTime: getFirstDayOfMonth(new Date()),
-    endTime: formatDate(new Date()),
+    // startTime: getFirstDayOfMonth(new Date()),
+    // endTime: formatDate(new Date()),
+    ...formValue,
     pageIndex: 1,
     pageFrom: 10
   }

+ 7 - 2
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/team/index.vue

@@ -6,7 +6,12 @@
         <el-link type="primary" class="text-nowrap mr-20" :icon="CirclePlusFilled"
           @click="dialogFromCli('addDeptDialogVisible')">创建部门</el-link>
         <el-link class="text-nowrap textFont textFont mr-10" type="primary" :icon="Edit"
-          @click="updateDepartment('addDeptDialogVisible')">{{ deptListItem.label || '全部人员' }}</el-link>
+          @click="updateDepartment('addDeptDialogVisible')">
+          <template v-if="!deptListItem.labe">全部人员</template>
+          <template v-if="deptListItem.labe">
+            <TextTranslation translationTypes="departmentName" :translationValue="deptListItem.labe"></TextTranslation>
+          </template>
+        </el-link>
         <span class="textSpan textFont">共 0 人</span>
       </div>
       <div class="teamForm flex items-center">
@@ -154,7 +159,7 @@
         <el-form ref="deptRuleFormRef" style="max-width: 500px" :model="deptForm" :rules="deptRules" label-width="140px"
           size="large" status-icon>
           <el-form-item label="部门名称" prop="name">
-            <el-input v-model="deptForm.name" placeholder="请输入部门名称" clearable />
+            <el-input v-model="deptForm.name" placeholder="请输入部门名称" clearable :disabled="userInfo.userNameNeedTranslate == 1" />
           </el-form-item>
           <el-form-item label="主要负责人">
             <!-- <el-select v-model="deptForm.managerId" placeholder="请选择" style="width: 100%" clearable>

BIN
fhKeeper/formulahousekeeper/management-crm/opencv/opencv-420.jar


BIN
fhKeeper/formulahousekeeper/management-crm/opencv/x64/opencv_java420.dll


BIN
fhKeeper/formulahousekeeper/management-crm/opencv/x86/opencv_java420.dll


+ 15 - 20
fhKeeper/formulahousekeeper/management-crm/pom.xml

@@ -14,6 +14,13 @@
     <version>3.4.0</version>
 
     <dependencies>
+        <dependency>
+            <groupId>com.dingtalk</groupId>
+            <artifactId>taobao-sdk-java-auto_1479188381469-20210623.jar</artifactId>
+            <version>1.0</version>
+            <scope>system</scope>
+            <systemPath>${basedir}/src/main/resources/lib/taobao-sdk-java-auto_1479188381469-20210623.jar</systemPath>
+        </dependency>
         <dependency>
             <groupId>com.fasterxml.jackson.core</groupId>
             <artifactId>jackson-databind</artifactId>
@@ -64,10 +71,9 @@
             <groupId>com.baomidou</groupId>
             <artifactId>mybatis-plus-generator</artifactId>
         </dependency>
-        <dependency>
-            <groupId>org.projectlombok</groupId>
-            <artifactId>lombok</artifactId>
-        </dependency>
+
+
+
 
         <!-- fastjson -->
         <dependency>
@@ -116,6 +122,11 @@
             <artifactId>aspectjweaver</artifactId>
         </dependency>
 
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+        </dependency>
+
         <!-- logback -->
         <!--<dependency>
             <groupId>net.logstash.logback</groupId>
@@ -141,15 +152,6 @@
             <artifactId>tess4j</artifactId>
         </dependency>
 
-        <!--手动引入opencv 否则无法maven打包-->
-        <dependency>
-            <groupId>org.opencv</groupId>
-            <artifactId>opencv</artifactId>
-            <version>4.2.0</version>
-            <scope>system</scope>
-            <systemPath>${basedir}/opencv/opencv-420.jar</systemPath>
-        </dependency>
-
         <!--微信模版消息推送三方sdk-->
         <dependency>
             <groupId>com.github.binarywang</groupId>
@@ -163,13 +165,6 @@
             <version>0.1.55</version>
         </dependency>
 
-        <!--ladp集成 AD域认证-->
-        <dependency>
-        <groupId>org.springframework.boot</groupId>
-        <artifactId>spring-boot-starter-data-ldap</artifactId>
-        <version>2.3.12.RELEASE</version>
-        </dependency>
-
         <dependency>
             <groupId>com.aliyun</groupId>
             <artifactId>dysmsapi20170525</artifactId>

+ 0 - 42
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/config/LdapConfig.java

@@ -1,42 +0,0 @@
-package com.management.platform.config;
-
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.ldap.core.LdapTemplate;
-import org.springframework.ldap.core.support.LdapContextSource;
-
-@Configuration
-public class LdapConfig {
-    @Value("${spring.ldap.urls}")
-    private String ldapUrl;
-    @Value("${spring.ldap.username}")
-    private String userName;
-    @Value("${spring.ldap.password}")
-    private String passWord;
-    @Value("${spring.ldap.base.dcFirst}")
-    private String dcFirst;
-    @Value("${spring.ldap.base.dcSecond}")
-    private String dcSecond;
-
-
-
-    @Bean
-    public LdapContextSource ldapContextSource(){
-        LdapContextSource source = new LdapContextSource();
-        source.setBase("DC="+dcFirst+",DC="+dcSecond);
-        source.setUrl(ldapUrl);
-        source.setPassword(passWord);
-        source.setUserDn(userName);
-        source.setReferral("follow");
-        return source;
-    }
-
-    @Bean
-    public LdapTemplate ldapTemplate(){
-        return new LdapTemplate(ldapContextSource());
-    }
-
-
-}
-

+ 6 - 1
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/BusinessOpportunityController.java

@@ -102,6 +102,7 @@ public class BusinessOpportunityController {
 
     @RequestMapping("/exportData")
     public HttpRespMsg exportData(BusinessOpportunity bo ,HttpServletRequest request) throws Exception {
+        bo.setPageIndex(null).setPageFrom(null);
         User user = userMapper.selectById(request.getHeader("token"));
         SysForm sysForm = sysFormMapper.selectOne(new LambdaQueryWrapper<SysForm>().eq(SysForm::getCompanyId, user.getCompanyId()).eq(SysForm::getCode, "business").eq(SysForm::getIsCurrent, 1));
         WxCorpInfo wxCorpInfo = wxCorpInfoService.getOne(new LambdaQueryWrapper<WxCorpInfo>().eq(WxCorpInfo::getCompanyId, user.getCompanyId()));
@@ -146,6 +147,7 @@ public class BusinessOpportunityController {
         HttpRespMsg respMsg = list(bo,request);
         Map<String, Object> msgData = (Map<String, Object>) respMsg.getData();
         List<BusinessOpportunity> list = (List<BusinessOpportunity>) msgData.get("data");
+        System.out.println("商机数据量==="+list.size());
 
         for (BusinessOpportunity data : list) {
             List<String> item=new ArrayList<>();
@@ -207,6 +209,7 @@ public class BusinessOpportunityController {
             dataList.add(item);
         }
         String fileName=str+"表导出_"+ System.currentTimeMillis();
+        System.out.println("fileName===="+fileName);
         return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,fileName,dataList,path);
     }
 
@@ -454,7 +457,9 @@ public class BusinessOpportunityController {
         bo.setCompanyId(user.getCompanyId());
         bo.setUserId(user.getId());
         bo.setEndTime(bo.getEndTime() + " 23:59:59");
-        bo.setPageIndex((bo.getPageIndex()-1) * bo.getPageFrom());
+        if (bo.getPageIndex() != null) {
+            bo.setPageIndex((bo.getPageIndex()-1) * bo.getPageFrom());
+        }
         List<BusinessOpportunity> list = new ArrayList<>();
         boolean isAll = sysFunctionService.hasPriviledge(user.getRoleId(), "查看全部商机");
         boolean isNotAll = sysFunctionService.hasPriviledge(user.getRoleId(), "查看负责部门商机");

+ 0 - 7
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/CustomController.java

@@ -37,18 +37,11 @@ import java.util.Map;
 @RestController
 @RequestMapping("/custom")
 public class CustomController {
-    @Value(value = "${upload.file}")
-    private String file;
     @Autowired
     private CustomService customService;
     @Autowired
-    private CustomMapper customMapper;
-    @Autowired
     private UserMapper userMapper;
 
-    @Autowired
-    private SysDictMapper sysDictMapper;
-
     @Resource
     private ExcelExportServiceImpl excelExportService;
     @Resource

Fichier diff supprimé car celui-ci est trop grand
+ 2509 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/ReportController.java


+ 0 - 106
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/UserController.java

@@ -8,23 +8,13 @@ import com.management.platform.mapper.*;
 import com.management.platform.service.*;
 import com.management.platform.util.HttpRespMsg;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.ldap.core.LdapTemplate;
 import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.multipart.MultipartFile;
 
 import javax.annotation.Resource;
-import javax.naming.Context;
-import javax.naming.NamingException;
-import javax.naming.ldap.Control;
-import javax.naming.ldap.InitialLdapContext;
-import javax.naming.ldap.LdapContext;
-import javax.naming.ldap.SortControl;
 import javax.servlet.http.HttpServletRequest;
-import java.io.IOException;
 import java.util.*;
 
 /**
@@ -46,41 +36,13 @@ public class UserController {
 
     @Resource
     private HttpServletRequest request;
-
-    @Resource
-    private LdapTemplate ldapTemplate;
-
     @Resource
     private FeishuInfoService feishuInfoService;
-
     @Resource
     private UserCustomMapper userCustomMapper;
-
-    @Resource
-    private CompanyMapper companyMapper;
-    @Resource
-    private TimeTypeMapper timeTypeMapper;
-    @Resource
-    private SysRoleService sysRoleService;
-    @Resource
-    private ProjectBasecostSettingMapper projectBasecostSettingMapper;
-    @Resource
-    private CompanyReportMapper companyReportMapper;
     @Resource
     private DepartmentMapper departmentMapper;
     @Resource
-    private SysRoleMapper sysRoleMapper;
-    @Resource
-    private ExpenseMainTypeService expenseMainTypeService;
-    @Resource
-    private ExpenseTypeService expenseTypeService;
-    @Value("${spring.ldap.urls}")
-    private String ldapUrl;
-    @Value("${spring.ldap.base.dcFirst}")
-    private String dcFirst;
-    @Value("${spring.ldap.base.dcSecond}")
-    private String dcSecond;
-    @Resource
     private UserWithBeisenMapper userWithBeisenMapper;
 
     /**
@@ -362,74 +324,6 @@ public class UserController {
     }
 
 
-    @RequestMapping(value = "/loginForAd", method = RequestMethod.POST)
-    public HttpRespMsg loginForAd(@RequestParam String username, @RequestParam String password) {
-        HttpRespMsg httpRespMsg=new HttpRespMsg();
-        if(username.equals("sysadmin")){
-             return loginAdmin(username,password);
-        }
-        User user = userService.getOne(new QueryWrapper<User>().eq("phone", username+"@"+dcFirst+"."+dcSecond));
-        LdapContext ldapContext = null;
-        Hashtable<String, Object> env = new Hashtable<String, Object>();
-        env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
-        //验证类型
-        env.put(Context.SECURITY_AUTHENTICATION, "simple");
-        //用户名称,cn,ou,dc 分别:用户,组,域
-        env.put(Context.SECURITY_PRINCIPAL, username+"@"+dcFirst+"."+dcSecond);
-        //用户密码 cn 的密码
-        env.put(Context.SECURITY_CREDENTIALS, password);
-        //url 格式:协议://ip:端口/组,域   ,直接连接到域或者组上面
-        env.put(Context.PROVIDER_URL,ldapUrl);
-//        //协议
-//        env.put(Context.SECURITY_PROTOCOL, "ssl");
-//        env.put("java.naming.ldap.factory.socket", "DummySSLSocketFactory类全路径");
-//        //objectGUID 转换,很关键
-        env.put("java.naming.ldap.attributes.binary","objectGUID");
-        try {
-            Control[] sortConnCtls = new SortControl[1];
-            sortConnCtls[0] = new SortControl("sAMAccountName", Control.CRITICAL);
-            ldapContext = new InitialLdapContext(env, sortConnCtls);
-            if(ldapContext!=null){
-                if(user!=null){
-                    return loginByUserId(user.getId());
-                }else {
-                    httpRespMsg.setError("账号不存在");
-                    return httpRespMsg;
-                }
-            }
-        } catch (IOException | NamingException e) {
-            e.printStackTrace();
-            httpRespMsg.setError("AD域控用户账号或者密码错误,验证失败");
-            return httpRespMsg;
-        }
-        return httpRespMsg;
-    }
-
-    @RequestMapping("/getOU")
-    public HttpRespMsg getOU() throws NamingException {
-        HttpRespMsg httpRespMsg=new HttpRespMsg();
-        httpRespMsg.setData(userService.ldapGetOU());
-        return httpRespMsg;
-    }
-
-    @RequestMapping("/getUser")
-    public HttpRespMsg getUser() throws Exception {
-        HttpRespMsg httpRespMsg=new HttpRespMsg();
-        httpRespMsg.setData(userService.getUser());
-        return httpRespMsg;
-    }
-
-    @RequestMapping("/initSystemForAd")
-    public HttpRespMsg initSystemForAd(String companyName) throws Exception {
-        return userService.initSystemForAd(companyName);
-    }
-
-
-    @RequestMapping("/syncDeptWithAD")
-    public HttpRespMsg syncDeptWithAD(HttpServletRequest request) throws Exception{
-        return userService.syncDeptWithAD(request);
-    }
-
     @RequestMapping("/updateUserDeptHierarchy")
     public HttpRespMsg updateUserDeptHierarchy(Integer companyId) throws Exception {
         HttpRespMsg httpRespMsg=new HttpRespMsg();

+ 433 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/Report.java

@@ -0,0 +1,433 @@
+package com.management.platform.entity;
+
+import java.math.BigDecimal;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import java.time.LocalDate;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.time.LocalDateTime;
+import com.baomidou.mybatisplus.annotation.TableField;
+import java.io.Serializable;
+import java.util.HashMap;
+import java.util.List;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.management.platform.entity.vo.WorktimeItem;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import org.springframework.format.annotation.DateTimeFormat;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author Seyason
+ * @since 2024-01-26
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class Report extends Model<Report> {
+
+    private static final long serialVersionUID=1L;
+
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * user表外键 报告的作者
+     */
+    @TableField("creator_id")
+    private String creatorId;
+
+    /**
+     * project表外键 相关项目
+     */
+    @TableField("project_id")
+    private Integer projectId;
+
+    /**
+     * 工作日期
+     */
+    @TableField("create_date")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private LocalDate createDate;
+
+    /**
+     * 工作时间
+     */
+    @TableField("working_time")
+    private Double workingTime;
+
+    /**
+     * 报告内容; 根据multi_worktime的取值,形式有差别
+     */
+    @TableField("content")
+    private String content;
+
+    /**
+     * 审查状态 0-未审核 1-已通过 2-未通过, -1-导入待审核, 3草稿
+     */
+    @TableField("state")
+    private Integer state;
+
+    /**
+     * 创建时间
+     */
+    @TableField("create_time")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm")
+    private LocalDateTime createTime;
+
+    /**
+     * 0-全天, 1-上午,2-下午
+     */
+    @TableField("time_type")
+    private Integer timeType;
+
+    /**
+     * 成本
+     */
+    @TableField("cost")
+    private BigDecimal cost;
+
+    /**
+     * 开始时间
+     */
+    @TableField("start_time")
+    private String startTime;
+
+    /**
+     * 结束时间
+     */
+    @TableField("end_time")
+    private String endTime;
+
+    /**
+     * 员工填写时长类型
+     */
+    @TableField("report_time_type")
+    private Integer reportTimeType;
+
+    /**
+     * 子项目id
+     */
+    @TableField("sub_project_id")
+    private Integer subProjectId;
+
+    /**
+     * 任务id
+     */
+    @TableField("task_id")
+    private Integer taskId;
+
+    /**
+     * 是否是加班
+     */
+    @TableField("is_overtime")
+    private Integer isOvertime;
+
+    /**
+     * 用时占比
+     */
+    @TableField("progress")
+    private Integer progress;
+
+
+    @TableField(exist = false)
+    private List<SubProject> subProjectList;
+    @TableField(exist = false)
+    private List<UserRecentTask> taskList;
+    @TableField(exist = false)
+    private List<ReportProfessionProgress> professionProgressList;
+    @TableField(exist = false)
+    private List<Stages> stages;
+
+    /**
+     * 部门审核状态: -1 专业未审核,0-部门未审核,1-已通过,2-未通过
+     */
+    @TableField("department_audit_state")
+    private Integer departmentAuditState;
+
+
+    /**
+     * 阶段/岗位/工序
+     */
+    @TableField("stage")
+    private String stage;
+
+
+    /**
+     * 图片的数组字符串
+     */
+    @TableField("pic_str")
+    private String picStr;
+
+
+    @TableField(exist = false)
+    private String picAdd;
+
+    /**
+     * 传给客户端的图片数组
+     */
+    @TableField(exist = false)
+    private List<String> pics;
+    /**
+     * 是否是多个时间工作事项
+     */
+    @TableField("multi_worktime")
+    private Integer multiWorktime;
+
+
+    @TableField(exist = false)
+    private List<WorktimeItem> worktimeList;
+    /**
+     * 驳回原因
+     */
+    @TableField("reject_reason")
+    private String rejectReason;
+
+    /**
+     * 驳回人姓名
+     */
+    @TableField("reject_username")
+    private String rejectUsername;
+
+    /**
+     * 驳回人id
+     */
+    @TableField("reject_userid")
+    private String rejectUserid;
+
+
+    /**
+     * 选择的自定义维度
+     */
+    @TableField("degree_id")
+    private Integer degreeId;
+
+
+    @TableField(exist = false)
+    private List<HashMap> degreeList;
+    /**
+     * 公司id
+     */
+    @TableField("company_id")
+    private Integer companyId;
+
+    /**
+     * 代填或者导入的用户id
+     */
+    @TableField("fill_userid")
+    private String fillUserid;
+
+    /**
+     * 审核流程:当前审核的部门id
+     */
+    @TableField("audit_deptid")
+    private Integer auditDeptid;
+
+    /**
+     * 审核流程: 是否是部门审核
+     */
+    @TableField("is_dept_audit")
+    private Integer isDeptAudit;
+
+    /**
+     * 审核流程:当前审核的部门负责人id
+     */
+    @TableField("audit_dept_managerid")
+    private String auditDeptManagerid;
+
+    /**
+     * 是否是最后一步审核
+     */
+    @TableField("is_final_audit")
+    private Integer isFinalAudit;
+
+    /**
+     * 审核流程:审核过程中,项目的审核状态; 0-待审核,1-审核通过
+     */
+    @TableField("project_audit_state")
+    private Integer projectAuditState;
+
+
+    /**
+     * 任务分组id
+     */
+    @TableField("group_id")
+    private Integer groupId;
+
+    @TableField(exist = false)
+    private String groupName;
+
+    @TableField(exist = false)
+    private List<TaskGroup> taskGroups;
+    /**
+     * 自定义的数值
+     */
+    @TableField("custom_data")
+    private Double customData;
+
+    /**
+     * 项目审核人id
+     */
+    @TableField("project_auditor_id")
+    private String projectAuditorId;
+
+    @TableField(exist = false)
+    private List<ProjectAuditor> auditUserList;
+
+    @TableField(exist = false)
+    private String projectAuditorName;
+
+
+    /**
+     * 工时日报所属部门id
+     */
+    @TableField("dept_id")
+    private Integer deptId;
+
+    /**
+     * 加班时长
+     */
+    @TableField("overtime_hours")
+    private Double overtimeHours;
+
+
+    /**
+     * 加班薪资
+     */
+    @TableField("overtime_cost")
+    private BigDecimal overtimeCost;
+
+
+    @TableField(exist = false)
+    private Integer taskFinish;
+
+    /**
+     * 自定义文本信息内容
+     */
+    @TableField("custom_text")
+    private String customText;
+
+    /**
+     * 对应成本项的id
+     */
+    @TableField("basecost_id")
+    private Integer basecostId;
+
+
+    /**
+     * 项目日报审核时间
+     */
+    @TableField("project_audit_time")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm")
+    private LocalDateTime projectAuditTime;
+
+
+    /**
+     * 任务分组负责人审核状态: 0-待审核,1-审核通过
+     */
+    @TableField("group_audit_state")
+    private Integer groupAuditState;
+
+    /**
+     * 评价
+     */
+    @TableField("evaluate")
+    private String evaluate;
+
+    /**
+     * 是否属于自动审核通过  0-不属于 1-属于
+     */
+    @TableField("report_auto_approve")
+    private Integer reportAutoApprove;
+
+
+    @TableField(exist = false)
+    private ReportAuditorSetting auditorSetting;
+
+    @TableField(exist = false)
+    private User auditorFirst;
+    @TableField(exist = false)
+    private User auditorSec;
+    @TableField(exist = false)
+    private User auditorThird;
+    @TableField(exist = false)
+    private User ccUserid;
+    /**
+     * 批量填报时的report_batch表id
+     */
+    @TableField("batch_id")
+    private Integer batchId;
+
+
+    /**
+     * 昱众-角色类型:0-PM,1-CRC
+     */
+    @TableField("extra_field1")
+    private Integer extraField1;
+
+    /**
+     * 昱众-工作职责
+     */
+    @TableField("extra_field2")
+    private Integer extraField2;
+
+    /**
+     * 昱众-工作内容
+     */
+    @TableField("extra_field3")
+    private Integer extraField3;
+
+    @TableField(exist = false)
+    private List<ProFunWorkContext> workContentList;
+
+    @TableField(exist = false)
+    private Integer extraField2Name;
+
+    @TableField(exist = false)
+    private Integer extraField3Name;
+
+
+    /**
+     * SAP项目服务ID
+     */
+    @TableField("sap_service_id")
+    private Integer sapServiceId;
+
+    @TableField(exist = false)
+    private String sapServiceName;
+
+    @TableField(exist = false)
+    private List<SapProjectService> serviceList;
+
+    @TableField(exist = false)
+    private String projectName;
+    @TableField(exist = false)
+    private String taskName;
+
+    /**
+     * 多选自定义维度id
+     */
+    @TableField("multi_degr_id")
+    private String multiDegrId;
+
+    //用于后端传递给前端的数组
+    @TableField(exist = false)
+    private List<Integer> multiDegrIdList;
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+}

+ 106 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/ReportBatch.java

@@ -0,0 +1,106 @@
+package com.management.platform.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author Seyason
+ * @since 2023-11-27
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class ReportBatch extends Model<ReportBatch> {
+
+    private static final long serialVersionUID=1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @TableField("creator_id")
+    private String creatorId;
+
+    /**
+     * 开始日期
+     */
+    @TableField("start_date")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private LocalDate startDate;
+
+    /**
+     * 结束日期
+     */
+    @TableField("end_date")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private LocalDate endDate;
+
+    /**
+     * 总工作时长
+     */
+    @TableField("total_work_time")
+    private Double totalWorkTime;
+    @TableField(exist = false)
+    private Double reportTime;
+
+    /**
+     * 0-待审核,1-已通过,2-已驳回
+     */
+    @TableField("state")
+    private Integer state;
+
+    @TableField("create_time")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime createTime;
+
+    @TableField("company_id")
+    private Integer companyId;
+
+    @TableField(exist = false)
+    private String name;
+
+    @TableField(exist = false)
+    private String departmentName;
+
+    @TableField(exist = false)
+    private List<Map> data;
+
+    @TableField(exist = false)
+    private String dateStr;
+
+
+    @TableField(exist = false)
+    private String reportIds;
+
+    /**
+     * 周总结
+     */
+    @TableField("summary")
+    private String summary;
+
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+}

+ 66 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/ReportExtraDegree.java

@@ -0,0 +1,66 @@
+package com.management.platform.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author Seyason
+ * @since 2023-11-16
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class ReportExtraDegree extends Model<ReportExtraDegree> {
+
+    private static final long serialVersionUID=1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 公司id
+     */
+    @TableField("company_id")
+    private Integer companyId;
+
+    /**
+     * 自定义数据内容
+     */
+    @TableField("name")
+    private String name;
+
+    /**
+     * 编号
+     */
+    @TableField("code")
+    private String code;
+
+    /**
+     * 备注
+     */
+    @TableField("rmark")
+    private String rmark;
+
+    @TableField(exist = false)
+    private String projects;
+
+    @TableField(exist = false)
+    private Integer projectNum;
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+}

+ 75 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/ReportImportLog.java

@@ -0,0 +1,75 @@
+package com.management.platform.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.time.LocalDateTime;
+import com.baomidou.mybatisplus.annotation.TableField;
+import java.io.Serializable;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import org.springframework.format.annotation.DateTimeFormat;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-03-20
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class ReportImportLog extends Model<ReportImportLog> {
+
+    private static final long serialVersionUID=1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 导入人id
+     */
+    @TableField("user_id")
+    private String userId;
+
+    /**
+     * 导入人姓名
+     */
+    @TableField("user_name")
+    private String userName;
+
+    /**
+     * 原文件名称
+     */
+    @TableField("file_name")
+    private String fileName;
+
+    /**
+     * 服务器上的文件名称
+     */
+    @TableField("server_name")
+    private String serverName;
+
+    /**
+     * 导入时间
+     */
+    @TableField("indate")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm")
+    private LocalDateTime indate;
+
+    @TableField("company_id")
+    private Integer companyId;
+
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+}

+ 90 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/ReportLog.java

@@ -0,0 +1,90 @@
+package com.management.platform.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-06-24
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class ReportLog extends Model<ReportLog> {
+
+    private static final long serialVersionUID=1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 日报创建人
+     */
+    @TableField("creator_id")
+    private String creatorId;
+
+    /**
+     * 日报所属日期
+     */
+    @TableField("create_date")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private LocalDate createDate;
+
+    /**
+     * 相关项目日报id
+     */
+    @TableField("report_ids")
+    private String reportIds;
+
+    /**
+     * 日志内容
+     */
+    @TableField("msg")
+    private String msg;
+
+    /**
+     * 操作人
+     */
+    @TableField("operator_id")
+    private String operatorId;
+
+    /**
+     * 所属公司id
+     */
+    @TableField("company_id")
+    private Integer companyId;
+
+    @TableField("operate_date")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm")
+    private LocalDateTime operateDate;
+
+    @TableField(exist = false)
+    private String creatorName;
+
+    @TableField(exist = false)
+    private String operateName;
+
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+}

+ 72 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/ReportLogDetail.java

@@ -0,0 +1,72 @@
+package com.management.platform.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-09-19
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class ReportLogDetail extends Model<ReportLogDetail> {
+
+    private static final long serialVersionUID=1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 日报的id
+     */
+    @TableField("report_id")
+    private Integer reportId;
+
+    /**
+     * 审核内容
+     */
+    @TableField("msg")
+    private String msg;
+
+    /**
+     * 操作人id
+     */
+    @TableField("operator_id")
+    private String operatorId;
+
+    /**
+     * 操作日期
+     */
+    @TableField("operate_date")
+    private LocalDateTime operateDate;
+
+    @TableField("company_id")
+    private Integer companyId;
+
+    /**
+     * 日报所属工作日期
+     */
+    @TableField("work_date")
+    private LocalDate workDate;
+
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+}

+ 58 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/ReportProfessionProgress.java

@@ -0,0 +1,58 @@
+package com.management.platform.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author Seyason
+ * @since 2021-08-31
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class ReportProfessionProgress extends Model<ReportProfessionProgress> {
+
+    private static final long serialVersionUID=1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @TableField("project_id")
+    private Integer projectId;
+
+    @TableField("report_id")
+    private Integer reportId;
+
+    @TableField("profession_id")
+    private Integer professionId;
+
+    @TableField("progress")
+    private Integer progress;
+
+    /**
+     * 0-待审核,1-审核通过,2-驳回
+     */
+    @TableField("audit_state")
+    private Integer auditState;
+
+
+    @TableField(exist = false)
+    private String professionName;
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+}

+ 1 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/bo/QuestionBO.java

@@ -18,6 +18,7 @@ public class QuestionBO {
 
     /**来源内容 系统表存表名 报表存formId 文件存文件名*/
     private String sourceContent;
+
 //    private String tblName;
 //
 //    private Integer formId;

+ 3 - 1
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/vo/DepartmentVO.java

@@ -24,10 +24,12 @@ public class DepartmentVO {
     private Integer ddDeptid;
     private Integer pushToSap;
 
-    private Integer customertotal;//客户总量
+    private Integer customertotal;//客户总量 新增客户数
     private Integer customerDeal;//客户成交量
     private Double dealRate;//客户成交量率
     private Integer num;//客户数量
     private Integer saleNum;//交易客户数量
     private String departmentName;
+
+    private Integer earlierCusTotal;//客户总量
 }

+ 2 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/mapper/DepartmentMapper.java

@@ -36,4 +36,6 @@ public interface DepartmentMapper extends BaseMapper<Department> {
     List<DepartmentVO> getCustomerTotalCount(String startDate, String endDate, Integer departmentId, Integer companyId);
 
     List<DepartmentVO> getCustomerTransferRate(String startDate, String endDate, Integer departmentId, Integer companyId);
+
+    List<DepartmentVO> getEarlierCusCount(String endDate, Integer departmentId, Integer companyId);
 }

+ 16 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/mapper/ReportBatchMapper.java

@@ -0,0 +1,16 @@
+package com.management.platform.mapper;
+
+import com.management.platform.entity.ReportBatch;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author Seyason
+ * @since 2023-08-10
+ */
+public interface ReportBatchMapper extends BaseMapper<ReportBatch> {
+
+}

+ 19 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/mapper/ReportExtraDegreeMapper.java

@@ -0,0 +1,19 @@
+package com.management.platform.mapper;
+
+import com.management.platform.entity.ReportExtraDegree;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+import java.util.List;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author Seyason
+ * @since 2021-12-16
+ */
+public interface ReportExtraDegreeMapper extends BaseMapper<ReportExtraDegree> {
+
+    public List<ReportExtraDegree> getAll(Integer companyId);
+}

+ 16 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/mapper/ReportImportLogMapper.java

@@ -0,0 +1,16 @@
+package com.management.platform.mapper;
+
+import com.management.platform.entity.ReportImportLog;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-03-20
+ */
+public interface ReportImportLogMapper extends BaseMapper<ReportImportLog> {
+
+}

+ 16 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/mapper/ReportLogDetailMapper.java

@@ -0,0 +1,16 @@
+package com.management.platform.mapper;
+
+import com.management.platform.entity.ReportLogDetail;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-09-19
+ */
+public interface ReportLogDetailMapper extends BaseMapper<ReportLogDetail> {
+
+}

+ 16 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/mapper/ReportLogMapper.java

@@ -0,0 +1,16 @@
+package com.management.platform.mapper;
+
+import com.management.platform.entity.ReportLog;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-06-24
+ */
+public interface ReportLogMapper extends BaseMapper<ReportLog> {
+
+}

+ 209 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/mapper/ReportMapper.java

@@ -0,0 +1,209 @@
+package com.management.platform.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.management.platform.entity.Report;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+import org.apache.ibatis.annotations.Update;
+
+import java.time.LocalDate;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * Mapper 接口
+ * </p>
+ *
+ * @author 吴涛涛
+ * @since 2019-12-31
+ */
+public interface ReportMapper extends BaseMapper<Report> {
+    List<HashMap<String, Object>> getAllReportByDate(@Param("startDate") String startDate,
+                                                     @Param("companyId") Integer companyId,
+                                                     @Param("userId") String userId,
+                                                     @Param("endDate") String endDate,
+                                                     @Param("projectId") Integer projectId,
+                                                     @Param("stateKey") Integer stateKey,
+                                                     @Param("branchDepartment")List<Integer> branchDepartment
+    );
+    List<HashMap<String, Object>> getAllReportByDateWithReportLog(@Param("startDate") String startDate,
+                                                                  @Param("companyId") Integer companyId,
+                                                                  @Param("userId") String userId,
+                                                                  @Param("endDate") String endDate,
+                                                                  @Param("projectId") Integer projectId,
+                                                                  @Param("stateKey") Integer stateKey,
+                                                                  @Param("branchDepartment")List<Integer> branchDepartment
+    );
+    List<HashMap<String, Object>> getProjectMembReportByDate(@Param("startDate") String startDate,
+                                                             @Param("companyId") Integer companyId,
+                                                             @Param("leaderId") String leaderId,
+                                                             @Param("endDate") String endDate,
+                                                             @Param("projectId") Integer projectId,
+                                                             @Param("stateKey") Integer stateKey,
+                                                             @Param("branchDepartment")List<Integer> branchDepartment,
+                                                             @Param("ccProjectIds")List<Integer> ccProjectIds);
+    List<HashMap<String, Object>> getProjectMembReportByDateWithReportLog(@Param("startDate") String startDate,
+                                                                          @Param("companyId") Integer companyId,
+                                                                          @Param("leaderId") String leaderId,
+                                                                          @Param("endDate") String endDate,
+                                                                          @Param("projectId") Integer projectId,
+                                                                          @Param("stateKey") Integer stateKey,
+                                                                          @Param("branchDepartment")List<Integer> branchDepartment,
+                                                                          @Param("ccProjectIds")List<Integer> ccProjectIds);
+    //获取部门下的人员的日报
+    List<HashMap<String, Object>> getDeptMembReportByDate(@Param("startDate") String startDate,
+                                                          @Param("companyId") Integer companyId,
+                                                          @Param("deptIds") List<Integer> deptIds,
+                                                          @Param("endDate") String endDate, @Param("projectId") Integer projectId,@Param("stateKey")Integer stateKey,@Param("branchDepartment")List<Integer> branchDepartment);
+
+    //按当前人员获取本人报告
+    List<Map<String, Object>> getReportByDate(@Param("date") String date, @Param("id") String id);
+    //获取项目经理所管理的人员的报告
+    List<Map<String, Object>> getInchargeReportByDate(@Param("date") String date, @Param("id") String id, @Param("state") Integer state);
+
+    //获取待日报审核的列表
+    List<Map<String, Object>> getAuditReportList(@Param("date") String date, @Param("companyId") Integer companyId,
+                                                 @Param("departmentId") Integer departmentId,
+                                                 @Param("projectId") Integer projectId,
+                                                 @Param("auditorId") String auditorId,
+                                                 @Param("isEngeering") Integer isEngeering,
+                                                 @Param("startDate") String startDate,
+                                                 @Param("endDate") String endDate,
+                                                 @Param("targetUserId") List<String> targetUserId,
+                                                 @Param("auditUserId")String auditUserId
+    );
+
+    //获取本人负责的专业的相关的日报
+    List<Map<String, Object>> getProfessionInchargeReportByDate(@Param("date") String date,
+                                                                @Param("id") String id,
+                                                                @Param("state") Integer state
+    );
+
+    List<Map<String, Object>> getUserReportByDate(@Param("date") String date, @Param("userIds") List<String> userIds);
+
+    List<Map<String, Object>> getReportByTask(@Param("taskId") Integer taskId);
+
+    List<Map<String, Object>> getReportNameByDate(@Param("date") String date, @Param("companyId") Integer companyId, @Param("leaderId") String leaderId);
+
+    List<Map<String, Object>> getReportNameByDateAndDept(@Param("date") String date,
+                                                         @Param("deptIds") List<Integer> deptIds,
+                                                         @Param("userId") String userId,
+                                                         @Param("companyId") Integer company);
+    List<Map<String, Object>> getDetailByStateInMyProfession(@Param("state") Integer state,
+                                                             @Param("companyId") Integer companyId,
+                                                             @Param("leaderId") String leaderId);
+
+    List<Map<String, Object>> getRealProjectTime(@Param("startDate") LocalDate startDate, @Param("endDate") LocalDate endDate, Integer companyId);
+
+    List<Map<String, Object>> getReportFillStatus(String startDate, String endDate, String userId);
+
+    List<Map<String, Object>> getDepartmentDetailByState(@Param("departmentIds") List<Integer> departmentIds,
+                                                         @Param("companyId") Integer companyId);
+
+    List<Map<String, Object>> getUserDailyWorkTime(Integer companyId, String startDate, String endDate, List<Integer> deptIds, String leaderId);
+
+    List<Map<String, Object>> getUserWorkingTimeByRange(Integer companyId, String startDate, String endDate);
+
+    List<Report> selectSimpleTime(Integer companyId, String startDate, String endDate);
+
+    List<Map<String, Object>> getDeptImportAuditList(@Param("companyId") Integer companyId,
+                                                     @Param("leaderId") String leaderId,
+                                                     @Param("startDate") String startDate,
+                                                     @Param("endDate") String endDate,
+                                                     @Param("departmentIdList") List<Integer> departmentIdList,
+                                                     @Param("projectId") Integer projectId,
+                                                     @Param("startIndex") Integer startIndex,
+                                                     @Param("pageSize") Integer pageSize
+    );
+    void approveAllDeptImportList(@Param("companyId") Integer companyId,
+                                  @Param("leaderId") String leaderId);
+    Long getDeptImportAuditListCount(@Param("companyId") Integer companyId,
+                                     @Param("leaderId") String leaderId,
+                                     @Param("startDate") String startDate,
+                                     @Param("endDate") String endDate,
+                                     @Param("departmentIdList") List<Integer> departmentIdList,
+                                     @Param("projectId") Integer projectId);
+    List<Map<String, Object>> selectFillReportUserList(Integer companyId, String startDate, String endDate);
+
+    List<Map<String, Object>> getMonthReportProjectList(Integer companyId, String startDate, String endDate);
+
+    void deleteUserSameDayReport(Integer companyId, @Param("dateReportList") List<Report> dateReportList, Integer needDeptAudit);
+
+    List<Map<String, Object>> getDuplicate(Integer companyId);
+
+    List<Map> getSameDayPassReport(Integer companyId, @Param("dateReportList") List<Report> dateReportList);
+
+    double getMyOvertime(String userId, String startDate);
+
+    List<Map<String, Object>> getProWaitingApproveCnt(Integer companyId);
+
+    List<Map<String, Object>> getDeptWaitingApproveCnt(Integer companyId);
+
+    List<Map<String, Object>> getProjectCost(Integer companyId, List<Integer> projectIds);
+
+    //获取项目填报的成本,包括已审核和待审核的
+    List<Map<String, Object>> getProjectFillCost(Integer companyId, List<Integer> projectIds);
+
+    List<Map<String, Object>> getOneProjectBaseCost(Integer projectId);
+
+    @Update("update report set task_id = null where task_id=#{taskId}")
+    void deleteReportTask(Integer taskId);
+
+    List<Map<String, Object>> getUserReportTimelinessRate(Integer companyId,String startDate, String endDate,String userId,List<Integer> deptIds);
+    @Select("SELECT report.id, report.creator_id,  DATE_FORMAT(report.`create_date`, '%Y-%m-%d') AS create_date FROM report WHERE report.state = 1  AND report.`project_audit_state`=0 \n" +
+            "AND EXISTS(SELECT 1 FROM audit_workflow_time_setting s, `user` u WHERE s.dept_id = u.department_id AND u.id = report.`creator_id` AND s.audit_dept_id IS NOT NULL)\n" +
+            "AND EXISTS(SELECT 1 FROM report r WHERE report.`creator_id` = r.creator_id AND report.`create_date` = r.create_date AND report.id <> r.id AND r.state = 0)\n" +
+            "AND report.audit_dept_managerid IS NULL AND report.`company_id` = #{companyId}\n")
+    List<Map<String, Object>> getErrorData(Integer companyId);
+    //获取审批流程中卡住的数据,项目审核过了,但是没有进入到部门审核,也没最终审核
+    @Select("SELECT report.id, user.name, create_date, creator_id, state, report.create_time, project_audit_time,u.name AS auditorName FROM report\n" +
+            "LEFT JOIN `user` ON user.id = report.`creator_id` \n" +
+            "LEFT JOIN `user` u ON u.id = report.`project_auditor_id`\n" +
+            "WHERE state = 0 AND project_audit_state = 1 AND is_dept_audit=0 AND is_final_audit=0 \n" +
+            "AND NOT EXISTS(SELECT 1 FROM report r WHERE r.id <> report.id AND r.`creator_id` = report.`creator_id` AND r.`create_date` = report.`create_date` AND r.project_audit_state = 0)\n" +
+            "AND EXISTS (SELECT 1 FROM report r WHERE r.id <> report.id AND r.`creator_id` = report.`creator_id` AND r.`create_date` = report.`create_date`)\n")
+    List<Map<String, Object>> getProcessErrorData();
+
+    List<Map<String, Object>> getUploadThirdReportData(Integer companyId,@Param("startDate") LocalDate startDate, @Param("endDate") LocalDate endDate);
+
+    List<HashMap<String, Object>> geReportByProject(String startDate, Integer companyId, String endDate);
+
+    Map<String, Object> getDefaultDegree(Integer companyId, String userId, Integer projectId);
+
+    Map<String, Object> selectCostTimeByProject(String startDate, String endDate, Integer projectId);
+
+    List<HashMap<String, Object>> selectFill(String userId,LocalDate startDate, LocalDate endDate);
+
+    List<Map<String, Object>> getCcReportNameByDate(String date, Integer companyId, String leaderId);
+
+    List<Map<String, Object>> getCcReportByDate(@Param("date") String date, @Param("id") String id, @Param("state") Integer state);
+
+    List<Map<String, Object>> getPushProjectReportToSap(Integer companyId, String startDate, String endDate,String userId,Integer reportId);
+
+    List<Report> getSumWorkingTime(ArrayList<Integer> deptIds, String startDate, String endDate);
+
+    Double getReallWorkingTimeByProjectId(Integer id);
+
+    Double getReallWorkingTimeByProjectAndGroup(Integer projectId, Integer taskGroupId);
+
+    List<Map<String, Object>> getProjectPlanData(Integer companyId,@Param("list") List<Integer> taskIds, String startDate, String endDate);
+
+    List<String> getUserIds(ArrayList<Integer> deptIds, String startDate, String endDate);
+
+    List<Map<String, Object>> getProjectTimeCost(Integer companyId,Integer projectId);
+
+    List<Map<String, Object>> getProjectMainTimeCost(Integer companyId,String requestProjectMainCode);
+
+    List<Map<String, Object>> getTaskGroupPlanTime(@Param("list") List<Integer> projectIds);
+
+    List<Map<String, Object>> getUserWorkTimeByCategory(Integer categoryId, String userId,Integer companyId,@Param("list")List<Integer> deptIds, Integer deptId, String startDate, String endDate);
+
+    List<Map<String, Object>> selectReallyTimeWithMap(Integer companyId,Integer projectId);
+    List<Map<String, Object>> getCustomDataWithDate(String startDate, String endDate, Integer companyId);
+
+    @Select("SELECT report.id,report.creator_id,  report.`create_date`, report.`create_time`, group_id, task_group.`name`,report.project_id, task_group.`project_id` AS error_pid FROM report LEFT JOIN task_group ON task_group.id = report.`group_id` WHERE report.`company_id`=#{companyId} AND report.project_id <> task_group.`project_id`  AND create_date BETWEEN #{startDate} AND #{endDate} ORDER BY report.id DESC")
+    List<Map<String, Object>> selectErrorGroupData(Integer companyId, String startDate, String endDate);
+}

+ 16 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/mapper/ReportProfessionProgressMapper.java

@@ -0,0 +1,16 @@
+package com.management.platform.mapper;
+
+import com.management.platform.entity.ReportProfessionProgress;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author Seyason
+ * @since 2021-08-29
+ */
+public interface ReportProfessionProgressMapper extends BaseMapper<ReportProfessionProgress> {
+
+}

+ 16 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/mapper/ReportPushLogMapper.java

@@ -0,0 +1,16 @@
+package com.management.platform.mapper;
+
+import com.management.platform.entity.ReportPushLog;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author Seyason
+ * @since 2023-11-17
+ */
+public interface ReportPushLogMapper extends BaseMapper<ReportPushLog> {
+
+}

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

@@ -74,4 +74,6 @@ public interface BusinessOpportunityService extends IService<BusinessOpportunity
     HttpRespMsg pinBusinessOpportunity(BusinessOpportunity bo, HttpServletRequest request);
 
     HttpRespMsg undoPin(BusinessOpportunity bo, HttpServletRequest request);
+
+    HttpRespMsg exportDataAI(BusinessOpportunity bo, HttpServletRequest request)  throws Exception ;
 }

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

@@ -21,6 +21,8 @@ import java.util.List;
  */
 public interface ClueService extends IService<Clue> {
 
+    HttpRespMsg exportDataAI(Clue clue,HttpServletRequest request) throws Exception;
+
     void insert(Clue clue);
     void update(Clue clue);
 

+ 40 - 40
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/CompanyDingdingService.java

@@ -1,40 +1,40 @@
-//package com.management.platform.service;
-//
-//import com.baomidou.mybatisplus.extension.service.IService;
-//import com.dingtalk.api.request.OapiMessageCorpconversationAsyncsendV2Request;
-//import com.management.platform.entity.CompanyDingding;
-//
-//import java.time.LocalDate;
-//import java.util.List;
-//
-///**
-// * <p>
-// *  服务类
-// * </p>
-// *
-// * @author Seyason
-// * @since 2021-06-27
-// */
-//public interface CompanyDingdingService extends IService<CompanyDingding> {
-//
-//    public void sendFillReportAlertMsg(Integer companyId, Long agentId, String msg, String useridList);
-//
-//    public void sendRejectReportMsg(Integer companyId, String date, String projectNames, String reason, String auditorName, String useridList);
-//
-//    public void sendLeaveApplyAlertMsg(Integer companyId, Long agentId, String msg, String useridList);
-//
-//    public void sendReportWaitingApplyMsg(Integer companyId, Long agentId, Long auditNum, String useridList);
-//
-//    public void sendReportApproveMsg(Integer companyId, Long agentId, String auditorName, String evaluate, LocalDate date, String useridList);
-//
-//    public void sendBusinessTripSettingMsg(Integer companyId, Long agentId, String useridList);
-//
-//    public void sendNewTaskMsg(CompanyDingding dingding, String userId, String title, String endDate);
-//
-//
-//    public void sendFinishMileStoneMsg(CompanyDingding dingding, String useridList, String taskName, Integer projectId, String project, String finishDate);
-//
-//    public void sendOAMsg(CompanyDingding dingding, String useridList,String titleText,String content, List<OapiMessageCorpconversationAsyncsendV2Request.Form> form,Integer projectId);
-//
-//    public void sendInnerLinkMsg(CompanyDingding dingding, String useridList, String title, String alertMsg);
-//}
+package com.management.platform.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.dingtalk.api.request.OapiMessageCorpconversationAsyncsendV2Request;
+import com.management.platform.entity.CompanyDingding;
+
+import java.time.LocalDate;
+import java.util.List;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2021-06-27
+ */
+public interface CompanyDingdingService extends IService<CompanyDingding> {
+
+    public void sendFillReportAlertMsg(Integer companyId, Long agentId, String msg, String useridList);
+
+    public void sendRejectReportMsg(Integer companyId, String date, String projectNames, String reason, String auditorName, String useridList);
+
+    public void sendLeaveApplyAlertMsg(Integer companyId, Long agentId, String msg, String useridList);
+
+    public void sendReportWaitingApplyMsg(Integer companyId, Long agentId, Long auditNum, String useridList);
+
+    public void sendReportApproveMsg(Integer companyId, Long agentId, String auditorName, String evaluate, LocalDate date, String useridList);
+
+    public void sendBusinessTripSettingMsg(Integer companyId, Long agentId, String useridList);
+
+    public void sendNewTaskMsg(CompanyDingding dingding, String userId, String title, String endDate);
+
+
+    public void sendFinishMileStoneMsg(CompanyDingding dingding, String useridList, String taskName, Integer projectId, String project, String finishDate);
+
+    public void sendOAMsg(CompanyDingding dingding, String useridList,String titleText,String content, List<OapiMessageCorpconversationAsyncsendV2Request.Form> form,Integer projectId);
+
+    public void sendInnerLinkMsg(CompanyDingding dingding, String useridList, String title, String alertMsg);
+}

+ 3 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/ContactsService.java

@@ -9,6 +9,7 @@ import org.springframework.web.multipart.MultipartFile;
 
 import javax.servlet.http.HttpServletRequest;
 import java.util.List;
+import java.util.Map;
 
 /**
  * <p>
@@ -57,4 +58,6 @@ public interface ContactsService extends IService<Contacts> {
     HttpRespMsg pageContactsByPin(Integer pageIndex, Integer pageSize, Integer customId, String name, String email, String creatorId, String phone, String ownerId, HttpServletRequest request);
 
     HttpRespMsg undoPin(Contacts contacts, HttpServletRequest request);
+
+    HttpRespMsg exportDataAI(Map<String, Object> map, HttpServletRequest request) throws Exception;
 }

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

@@ -48,4 +48,6 @@ public interface ContractService extends IService<Contract> {
     HttpRespMsg getContractDetail(HttpServletRequest request, Integer id);
 
     HttpRespMsg importContractNew(HttpServletRequest request, MultipartFile file);
+
+    HttpRespMsg exportDataAI(String startDate, String endDate, HttpServletRequest request) throws Exception;
 }

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

@@ -70,4 +70,6 @@ public interface CustomService extends IService<Custom> {
     HttpRespMsg getPrivilegedCustom(HttpServletRequest request);
 
     HttpRespMsg delete(Custom custom);
+
+    HttpRespMsg exportDataAI(Custom custom, HttpServletRequest request) throws Exception;
 }

+ 55 - 56
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/DingDingService.java

@@ -1,56 +1,55 @@
-//package com.management.platform.service;
-//
-//import com.alibaba.fastjson.JSONArray;
-//import com.management.platform.entity.CompanyDingding;
-//import com.management.platform.entity.UserDingdingTime;
-//import com.management.platform.util.HttpRespMsg;
-//import com.taobao.api.ApiException;
-//
-//import java.time.LocalDate;
-//
-//public interface DingDingService {
-//    public HttpRespMsg initSystem(String corpid) throws ApiException;
-//
-//    public void corpAuth(String corpid, String corpName, String authUserId, Long agentId) throws ApiException;
-//
-//    public String syncCorpMembs(String corpid) throws ApiException;
-//
-//    public void updateSuiteTicket(String suiteTicket);
-//
-//    HttpRespMsg getUserByCode(String code, String corpid);
-//
-//    public void asyncHandleMsg(String decryptMsg);
-//
-//    HttpRespMsg syncCorpInfo(String corpid);
-//
-//    HttpRespMsg syncCorpAgent(String corpid);
-//
-//    HttpRespMsg getUnActiveCorp();
-//
-//    HttpRespMsg reAuthCorp(String corpid);
-//
-//
-//    public void syncCardTime(Integer companyId, String userId, String startDate, String endDate);
-//
-//    void syncLeaveTime(Integer companyId, String userId, String startDate, String endDate);
-//
-//    void syncUserWorkData(CompanyDingding dingding,String userId, String startDate, String endDate, boolean showLog, boolean onlySyncAttendance);
-//
-//    void getCorpSelfDefSmartReport(CompanyDingding dingding);
-//
-////    public HttpRespMsg getLeaveTypeList(String leaveCode, Integer companyId, Integer departmentId, String userId, Integer pageIndex);
-//
-//    public HttpRespMsg syncLeaveQuotaData(Integer companyId);
-//
-//    HttpRespMsg removeCompInfo(String corpid);
-//
-//    HttpRespMsg initSuperManager(String corpid, String name);
-//
-//    void userLeaveOrg(String corpId, JSONArray userIdArray, LocalDate leaveDate);
-//
-//    void userAddOrg(String corpId, JSONArray userIdArray);
-//
-//    String inactiveUserNotInAuthRange(String corpid);
-//
-//    HttpRespMsg fixAttendance(Integer companyId);
-//}
+package com.management.platform.service;
+
+import com.alibaba.fastjson.JSONArray;
+import com.management.platform.entity.CompanyDingding;
+import com.management.platform.util.HttpRespMsg;
+import com.taobao.api.ApiException;
+
+import java.time.LocalDate;
+
+public interface DingDingService {
+    public HttpRespMsg initSystem(String corpid) throws ApiException;
+
+    public void corpAuth(String corpid, String corpName, String authUserId, Long agentId) throws ApiException;
+
+    public String syncCorpMembs(String corpid) throws ApiException;
+
+    public void updateSuiteTicket(String suiteTicket);
+
+    HttpRespMsg getUserByCode(String code, String corpid);
+
+    public void asyncHandleMsg(String decryptMsg);
+
+    HttpRespMsg syncCorpInfo(String corpid);
+
+    HttpRespMsg syncCorpAgent(String corpid);
+
+    HttpRespMsg getUnActiveCorp();
+
+    HttpRespMsg reAuthCorp(String corpid);
+
+
+    public void syncCardTime(Integer companyId, String userId, String startDate, String endDate);
+
+    void syncLeaveTime(Integer companyId, String userId, String startDate, String endDate);
+
+    void syncUserWorkData(CompanyDingding dingding,String userId, String startDate, String endDate, boolean showLog, boolean onlySyncAttendance);
+
+    void getCorpSelfDefSmartReport(CompanyDingding dingding);
+
+//    public HttpRespMsg getLeaveTypeList(String leaveCode, Integer companyId, Integer departmentId, String userId, Integer pageIndex);
+
+    public HttpRespMsg syncLeaveQuotaData(Integer companyId);
+
+    HttpRespMsg removeCompInfo(String corpid);
+
+    HttpRespMsg initSuperManager(String corpid, String name);
+
+    void userLeaveOrg(String corpId, JSONArray userIdArray, LocalDate leaveDate);
+
+    void userAddOrg(String corpId, JSONArray userIdArray);
+
+    String inactiveUserNotInAuthRange(String corpid);
+
+    HttpRespMsg fixAttendance(Integer companyId);
+}

+ 42 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/LeaveSheetService.java

@@ -0,0 +1,42 @@
+package com.management.platform.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.management.platform.entity.LeaveSheet;
+import com.management.platform.util.HttpRespMsg;
+
+import java.util.List;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2021-12-09
+ */
+public interface LeaveSheetService extends IService<LeaveSheet> {
+
+    HttpRespMsg add(LeaveSheet sheet, String userId);
+
+    HttpRespMsg delete(Integer id);
+
+    HttpRespMsg queryList(LeaveSheet sheet,  Integer pageIndex,  Integer pageSize);
+
+    HttpRespMsg approve(Integer id);
+
+    HttpRespMsg deny(Integer id, String reason);
+
+    HttpRespMsg summaryData(String keyword, String startDate, String endDate, String userId);
+
+    HttpRespMsg getOTAvaiDays(String userId);
+
+    HttpRespMsg exportLeaveData(String userId,Integer status, Integer leaveType, String startTime,String endTime);
+
+    HttpRespMsg cancel(Integer id, String userId);
+
+    HttpRespMsg auditList(LeaveSheet sheet, Integer pageIndex, Integer pageSize);
+
+    float leaveTimeSum(Integer companyId, String startDate, String endDate, float standardHours, float allDay, List<LeaveSheet> leaveSheets);
+
+    HttpRespMsg leaveDays(String startDate, String endDate);
+}

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

@@ -38,4 +38,6 @@ public interface ProductService extends IService<Product> {
     HttpRespMsg orderWithProduct(Integer id);
 
     HttpRespMsg businessListWithProduct(Integer id);
+
+    HttpRespMsg exportDataAI(String startDate, String endDate, HttpServletRequest request) throws Exception;
 }

+ 294 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/ProjectService.java

@@ -0,0 +1,294 @@
+package com.management.platform.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.management.platform.entity.Project;
+import com.management.platform.entity.ProjectSeparate;
+import com.management.platform.entity.vo.OvertimeListVO;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletRequest;
+import java.time.LocalDate;
+
+/**
+ * <p>
+ * 服务类
+ * </p>
+ *
+ * @author 吴涛涛
+ * @since 2020-01-03
+ */
+public interface ProjectService extends IService<Project> {
+    HttpRespMsg getProjectList(Integer forReport, HttpServletRequest request);
+
+    HttpRespMsg getProjectPage(Integer pageIndex, Integer pageSize, String keyword, Integer searchField,
+                               Integer status, Integer category, Integer projectId,Integer projectMainId,Integer deptId, String sortProp, Integer sortOrder,String inchagerId,String participation,String startDate,String endDate, HttpServletRequest request);
+
+    HttpRespMsg editProject(Integer id, String name, String code, String[] userIds, String inchargerId,
+                            Integer isPublic,
+                            String planStartDate,
+                            String planEndDate,
+                            Integer level,
+                            Double contractAmount,
+                            String changeContractReason,
+                            String projectBaseCostData,
+                            String projectKeyNodesData,
+                            Double budget,
+                            Integer customerId,
+                            String chosenLeaders,
+                            String associateDegrees,
+                            String associateDegreeNames,
+                            Integer taskGpIncharge,
+                            String auditUserIds,
+                            String ccUserIds,
+                            Integer category,
+                            String projectDesc,
+                            Integer projectMainId,
+                            String providerIds,
+                            String providerNames,
+                            HttpServletRequest request,
+                            ProjectSeparate projectSeparate,Double outputValue,Integer deptId,boolean onlyChangeParticipate,String buId,Integer manDay,String manDayStartDate,String plate1,
+                            String plate2,
+                            String plate3,
+                            String plate4,
+                            String plate5,
+                            String plate6,
+                            String plate7,
+                            String plate8,
+                            String plate9,
+                            String plate10);
+
+    HttpRespMsg deleteProject(Integer id, Integer force);
+
+    HttpRespMsg getTimeCost(String startDate, String endDate, String userIds,Integer projectId, Integer type,HttpServletRequest request);
+
+    HttpRespMsg getProjectCost(String startDate, String endDate, Integer projectId,Integer stateKey, HttpServletRequest request);
+
+    HttpRespMsg getCostInStage(String startDate, String endDate, Integer projectId, HttpServletRequest request);
+
+    HttpRespMsg getAllMembCost(String startDate, String endDate, Integer projectId, HttpServletRequest request);
+
+    HttpRespMsg exportTimeCost(Integer withMainProject, String exportContent,String startDate, String endDate, Integer projectId,String userIds, Boolean projectSum,Integer type,Integer deptId,Integer stateKey, Integer withPercent,Integer projectCategoryId, HttpServletRequest request);
+
+    HttpRespMsg updateProgress(Integer id, Integer progress, HttpServletRequest request);
+
+    HttpRespMsg updateStatus(Integer id, Integer status, LocalDate finishDate, HttpServletRequest request);
+
+    HttpRespMsg detail(Integer id, HttpServletRequest request);
+
+    HttpRespMsg detailTwo(Integer id, HttpServletRequest request);
+
+    HttpRespMsg taskSum(Integer id, HttpServletRequest request);
+
+    HttpRespMsg restartProject(Integer id);
+
+    HttpRespMsg addMemb(Integer id, String[] userId);
+
+    HttpRespMsg adjustBase(String baseCostData, Project project, String remark, HttpServletRequest request);
+
+    HttpRespMsg exportProfit(HttpServletRequest request);
+
+    HttpRespMsg exportProject(HttpServletRequest request);
+
+    HttpRespMsg getProjectTask(Integer pageIndex, Integer pageSize, Integer projectId,Integer groupId, HttpServletRequest request,Integer taskType);
+
+    HttpRespMsg exportProjectTask(HttpServletRequest request,Integer taskType);
+
+    HttpRespMsg getAllProjectCost(Integer pageIndex, Integer pageSize, Integer projectId,HttpServletRequest request);
+
+    HttpRespMsg exportAllProjectCost(HttpServletRequest request);
+
+    HttpRespMsg exportProjectEstimatedWorkTime(HttpServletRequest request,Integer projectId);
+
+    HttpRespMsg getProjectInAndOut(Integer pageIndex, Integer pageSize, Integer projectId, HttpServletRequest request);
+
+    HttpRespMsg exportProjectInAndOut(HttpServletRequest request);
+
+    HttpRespMsg importData(String userId, MultipartFile file,Integer key,@RequestParam(defaultValue = "0") Integer changeParticipation, HttpServletRequest request);
+
+    HttpRespMsg getCustomerProjectInAndOut(Integer pageIndex, Integer pageSize, HttpServletRequest request,Integer customerId,Integer projectId);
+
+    HttpRespMsg exportCustomerProjectInAndOut(HttpServletRequest request);
+
+    HttpRespMsg getGanttData(Integer type, String startDate, String endDate, String userId, Integer projectId, String groupName,Integer taskType, HttpServletRequest request);
+
+    HttpRespMsg getProjectStagesCost(Integer pageIndex, Integer pageSize, Integer projectId, HttpServletRequest request,String stageNames,String startDate,String endDate);
+
+    HttpRespMsg exportProjectStagesCost( HttpServletRequest request,String stageNames,String startDate,String endDate, Integer projectId);
+
+    HttpRespMsg getOvertimeList(OvertimeListVO overtimeListVO);
+
+    HttpRespMsg exportOvertimeList(OvertimeListVO overtimeListVO, HttpServletRequest request);
+
+    HttpRespMsg getDegreeCost(String startDate, String endDate, Integer projectId, String userId,HttpServletRequest request);
+
+    HttpRespMsg exportData(String keyword,
+                           @RequestParam(required = false, defaultValue = "1") Integer searchField,
+                           Integer projectId, //可以直接传projectId来进行匹配
+                           Integer status, Integer category,Integer projectMainId,Integer deptId,String inchagerId,String participation,HttpServletRequest request);
+
+    HttpRespMsg exportGroupData(Integer projectCategorySubId,HttpServletRequest request);
+
+    HttpRespMsg getCustomDataSum(String startDate, String endDate, String userId, HttpServletRequest request);
+
+    HttpRespMsg exportCustomDataSum(String startDate, String endDate, Integer projectId, String userId, HttpServletRequest request);
+
+    HttpRespMsg getMyUsers(HttpServletRequest request);
+
+    HttpRespMsg getMyParticiPMList(HttpServletRequest request);
+
+    HttpRespMsg getOvertimeDetail(String userId, Integer projectId, String startDate, String endDate, HttpServletRequest request);
+
+    HttpRespMsg saveBatchAccoDegrees(String ids, String associateDegrees, String associateDegreeNames, HttpServletRequest request);
+
+    HttpRespMsg getProjectCostAlarm(Integer pageIndex, Integer pageSize, Integer projectId, HttpServletRequest request);
+
+    HttpRespMsg addBatchAccoDegrees(String ids, String associateDegrees, String associateDegreeNames, HttpServletRequest request);
+
+    HttpRespMsg getBaseCostAndRealCost(Integer pageIndex, Integer pageSize, Integer projectId, HttpServletRequest request);
+
+    HttpRespMsg exportBaseCostAndRealCost(HttpServletRequest request);
+
+    HttpRespMsg getProjectsGroups(String projectIdArray);
+
+    HttpRespMsg batchAddMembToGroup(String membIdArray, String groupIds);
+
+    HttpRespMsg getProjectByCustomer(Integer customerId, HttpServletRequest request);
+
+    HttpRespMsg getTimeCostByCategory(String startDate, String endDate, String userIds, HttpServletRequest request);
+
+    HttpRespMsg exportTimeCostByCategory(String exportContent,String startDate, String endDate, Integer projectCategoryId, String userIds, Boolean projectSum, Integer type, HttpServletRequest request);
+
+    HttpRespMsg getUserWorkingTimeList(String userId, Integer projectId, String startDate, String endDate, Integer pageIndex, Integer pageSize,HttpServletRequest request,Integer departmentId);
+
+    HttpRespMsg exportUserWorkingTimeList(String userId, Integer projectId, String startDate, String endDate,HttpServletRequest request,Integer departmentId);
+
+    HttpRespMsg getUserReportTimelinessRate(HttpServletRequest request, String startDate, String endDate, Integer departmentId, String userId,Integer pageIndex,Integer pageSize);
+
+    HttpRespMsg exportReportTimelinessRate(HttpServletRequest request, String startDate, String endDate);
+
+    HttpRespMsg getWaitingReviewList(HttpServletRequest request, Integer stateKey, String userId,Integer pageIndex,Integer pageSize,String startDate,String endDate,Integer departmentId);
+
+    HttpRespMsg exportWaitingReviewList(HttpServletRequest request, Integer stateKey, String userId,String startDate,String endDate);
+
+    HttpRespMsg batchSetParticipation(HttpServletRequest request,String projectIdArray , String userIds);
+
+    HttpRespMsg suspendProject(Integer id);
+
+    HttpRespMsg getUserWorkingTimeStatic(String startDate, String endDate, Integer pageIndex, Integer pageSize, HttpServletRequest request,String userId,Integer departmentId);
+
+    HttpRespMsg exportUserWorkingTimeStatic(String startDate, String endDate, HttpServletRequest request, String userId, Integer departmentId);
+
+    HttpRespMsg batchDeleteProject(String projectIdArray, HttpServletRequest request);
+
+    HttpRespMsg modifyContract(Integer projectId, Double oldContractAmount, Double newContractAmount,String reason,HttpServletRequest request);
+
+    HttpRespMsg getTimeCostByMainProject(String startDate, String endDate, String userId, HttpServletRequest request);
+
+    HttpRespMsg getCostByGroup(String startDate, String endDate, Integer id, HttpServletRequest request);
+
+    HttpRespMsg getTimeCostByGroup(String startDate, String endDate, Integer pageIndex, Integer pageSize, Integer groupId, Integer projectId,HttpServletRequest request);
+
+    HttpRespMsg getTimeCostByGroupProject(String startDate, String endDate, Integer pageIndex, Integer pageSize, Integer groupId, Integer projectId,Integer projectCategorySubId, HttpServletRequest request);
+
+    HttpRespMsg exportGroupWithProjectTimeCost(String startDate, String endDate, Integer pageIndex, Integer pageSize, Integer groupId, Integer projectId,Integer projectCategorySubId, HttpServletRequest request);
+
+    HttpRespMsg getProjectBaseCost(Integer projectId, HttpServletRequest request, Integer pageIndex, Integer pageSize);
+
+    HttpRespMsg exportProjectBaseCost(HttpServletRequest request);
+
+    HttpRespMsg getTimeCostByUserCustom(String startDate, String endDate, String subCustomName, Integer customId,HttpServletRequest request,String fieldName);
+
+    HttpRespMsg exportTimeCostByUserCustom(String startDate, String endDate, String subCustomName, Integer customId, HttpServletRequest request, String fieldName);
+
+    HttpRespMsg importPersonnelWithGroup(MultipartFile file, HttpServletRequest request);
+
+    HttpRespMsg batchExchangeIncharger(String projectIds, String inchargerId, HttpServletRequest request);
+
+    HttpRespMsg fixParticipators(Integer companyId, HttpServletRequest request);
+
+    HttpRespMsg removeDuplicateParticipators(Integer companyId, HttpServletRequest request);
+
+    HttpRespMsg synchronizationProject(String dataJson);
+
+    HttpRespMsg testRead(String jobId);
+
+    HttpRespMsg testAdd(String jobId);
+
+    HttpRespMsg getEmpMonthHours(Integer pageIndex, Integer pageSize, String month,Integer departmentId,String userId,Integer whether,HttpServletRequest request);
+
+    HttpRespMsg exportEmpMonthHours(String month, HttpServletRequest request, String userId, Integer departmentId,Integer whether);
+
+    HttpRespMsg deptPartInProjects(Integer pageIndex, Integer pageSize, String month, Integer departmentId, HttpServletRequest request);
+
+    HttpRespMsg exportDeptPartInProjects(String month, Integer departmentId, HttpServletRequest request);
+
+    HttpRespMsg exportReportTimelinessRateByQuarter(HttpServletRequest request, String year, Integer quarter);
+
+    HttpRespMsg getGanttDataNew(Integer type, String startDate, String endDate, String userId, Integer projectId, String groupName, Integer taskType, HttpServletRequest request);
+
+    HttpRespMsg projectGroupAndCategoryWorkTime(HttpServletRequest request, String startDate, String endDate, Integer projectId, String groupNames, Integer pageIndex,Integer pageSize);
+
+    HttpRespMsg exportProjectGroupAndCategoryWorkTime(HttpServletRequest request, String startDate, String endDate, Integer projectId, String groupNames);
+
+    HttpRespMsg getSubProjectTimeCost(HttpServletRequest request, String startDate, String endDate, Integer projectId,Integer pageIndex,Integer pageSize);
+
+    HttpRespMsg exportSubProjectTimeCost(HttpServletRequest request,String startDate,String endDate, Integer projectId);
+
+    HttpRespMsg exportDegreeCost(String startDate, String endDate, Integer projectId,Integer deptId, HttpServletRequest request);
+
+    HttpRespMsg timeCostAndExpenseByProject(HttpServletRequest request, String startDate, String endDate, Integer projectId);
+
+    HttpRespMsg nearProject(HttpServletRequest request);
+
+    HttpRespMsg getFTEData(Integer pageIndex, Integer pageSize,String monthStart,String monthEnd, String area,String sortProp, Integer sortOrder, HttpServletRequest request);
+
+    HttpRespMsg exportFTEData(String monthStart,String monthEnd, String area, HttpServletRequest request);
+
+    HttpRespMsg getProjectListByToken(String json);
+
+    HttpRespMsg getTimeCostByToken(String json);
+
+    HttpRespMsg editFunctionalDivision(String json);
+
+    HttpRespMsg deleteFunctionalDivision(Integer id);
+
+    HttpRespMsg getFunctionalDivisionList();
+
+    HttpRespMsg editFunWorkContext(String json);
+
+    HttpRespMsg deleteFunWorkContext(Integer id);
+
+    HttpRespMsg getFunWorkContextList(Integer id);
+
+    HttpRespMsg syncProjectWithSap(String startDate,String endDate,String projectCodes);
+
+    HttpRespMsg getEffectiveLaborHourRate(String startDate, String endDate);
+
+    HttpRespMsg getProjectEstimatedWork(Integer pageIndex, Integer pageSize, Integer projectId, HttpServletRequest request);
+
+    HttpRespMsg getProjectFillTime(HttpServletRequest request, Integer projectId);
+
+    HttpRespMsg getMembProjectCateRatio(String startDate, String endDate,Integer departmentId,String subUserCustomName, Integer onlyShowWarning);
+
+    HttpRespMsg exportMembProjectCateRatio(String startDate, String endDate,Integer departmentId,String subUserCustomName, Integer onlyShowWarning);
+
+    HttpRespMsg userProjectProcessList(Integer deptId, String userId, Integer projectId, Integer pageIndex, Integer pageSize);
+
+    HttpRespMsg exportUserProjectProcessList(Integer deptId, String userId, Integer projectId);
+
+    HttpRespMsg groupExpendProcessList(String startDate, String endDate,Integer pageIndex,Integer pageSize);
+
+    HttpRespMsg exportGroupExpendProcessList(String startDate, String endDate);
+
+    HttpRespMsg projectExpendProcessList(String startDate,String endDate,Integer projectId, Integer categoryId, String userId, Integer pageIndex, Integer pageSize);
+
+    HttpRespMsg exportProjectExpendProcessList(String startDate,String endDate,Integer projectId, Integer categoryId, String userId);
+
+    HttpRespMsg userTaskProcessList(Integer deptId, String userId, Integer projectId,String startDate,String endDate, Integer pageIndex, Integer pageSize);
+
+    HttpRespMsg exportUserTaskProcessList(Integer deptId, String userId, Integer projectId,String startDate,String endDate);
+
+    HttpRespMsg exportEffectiveLaborHourRate(String startDate, String endDate);
+}

+ 23 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/ReportExtraDegreeService.java

@@ -0,0 +1,23 @@
+package com.management.platform.service;
+
+import com.management.platform.entity.ReportExtraDegree;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2021-12-16
+ */
+public interface ReportExtraDegreeService extends IService<ReportExtraDegree> {
+
+    HttpRespMsg importData(HttpServletRequest request, MultipartFile file);
+
+    HttpRespMsg exportData(HttpServletRequest request);
+}

+ 16 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/ReportLogDetailService.java

@@ -0,0 +1,16 @@
+package com.management.platform.service;
+
+import com.management.platform.entity.ReportLogDetail;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-09-19
+ */
+public interface ReportLogDetailService extends IService<ReportLogDetail> {
+
+}

+ 16 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/ReportLogService.java

@@ -0,0 +1,16 @@
+package com.management.platform.service;
+
+import com.management.platform.entity.ReportLog;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-06-24
+ */
+public interface ReportLogService extends IService<ReportLog> {
+
+}

+ 16 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/ReportProfessionProgressService.java

@@ -0,0 +1,16 @@
+package com.management.platform.service;
+
+import com.management.platform.entity.ReportProfessionProgress;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2021-08-29
+ */
+public interface ReportProfessionProgressService extends IService<ReportProfessionProgress> {
+
+}

+ 16 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/ReportPushLogService.java

@@ -0,0 +1,16 @@
+package com.management.platform.service;
+
+import com.management.platform.entity.ReportPushLog;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2023-11-17
+ */
+public interface ReportPushLogService extends IService<ReportPushLog> {
+
+}

+ 155 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/ReportService.java

@@ -0,0 +1,155 @@
+package com.management.platform.service;
+
+import com.alibaba.fastjson.JSONArray;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.management.platform.entity.Report;
+import com.management.platform.entity.User;
+import com.management.platform.entity.vo.MonthWorkingTimeVO;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletRequest;
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 服务类
+ * </p>
+ *
+ * @author 吴涛涛
+ * @since 2019-12-31
+ */
+public interface ReportService extends IService<Report> {
+    HttpRespMsg getReportList(String date, Integer deptId, String userId, HttpServletRequest request);
+
+    HttpRespMsg exportReport(@RequestParam String startDate, @RequestParam String endDate,Integer exportType, Integer projectId,Integer stateKey,Integer departmentId, HttpServletRequest request);
+
+    HttpRespMsg getReport(String date, HttpServletRequest request);
+
+    HttpRespMsg getCardTime(String date, HttpServletRequest request);
+
+    HttpRespMsg editReport(List<Report> reportList, String date, List<User> userList, BigDecimal hourCost, Integer companyId, String summary);
+
+    HttpRespMsg deleteReport(String userId, String date);
+
+    HttpRespMsg getListByState(Integer state, Integer departmentId,
+                               Integer projectId,
+                               String date,
+                               String startDate,
+                               String endDate,
+                               String userId,String auditUserId,
+                               HttpServletRequest request);
+
+    HttpRespMsg approveReport(String reportIds, Integer isDepartment, HttpServletRequest request,String evaluate);
+
+    HttpRespMsg denyReport(String date, String reportIds, String reason, Integer isDepartment, HttpServletRequest request);
+
+    HttpRespMsg getMembList(String date, HttpServletRequest request);
+
+    HttpRespMsg batchApproveReport(String ids, Integer isDepartment, HttpServletRequest request,String evaluate);
+    HttpRespMsg batchDenyReport(String ids, Integer isDepartment, String reason, HttpServletRequest request);
+
+    HttpRespMsg cancelReport(String userId, String reportIds, HttpServletRequest request);
+
+    HttpRespMsg getReportFillStatus(String startDate, String endDate, String userId, HttpServletRequest request);
+
+    HttpRespMsg listByStateProfession(Integer state, Integer departmentId, Integer projectId, String date, HttpServletRequest request);
+
+    HttpRespMsg listByStateDepartment(Integer state, Integer projectId, String date, HttpServletRequest request);
+
+    HttpRespMsg getUserDailyWorkTime(HttpServletRequest request, String startDate, String endDate);
+
+    HttpRespMsg exportUserDailyWorkTime(HttpServletRequest request, String startDate, String endDate);
+
+    HttpRespMsg importData(Integer companyId, Integer withCheckIn, MultipartFile file, HttpServletRequest request);
+
+    //新版导入日报,采用项目在行上的模式
+    HttpRespMsg importNewData(Integer companyId, MultipartFile file, HttpServletRequest request);
+
+    HttpRespMsg saveProjectTime(Integer companyId, List<Report> reportList, JSONArray userReportArray);
+
+    HttpRespMsg listDeptImportByState(String leaderId,
+                                      Integer projectId,
+                                      Integer dateType,
+                                      String date,
+                                      Integer pageIndex, Integer pageSize,
+                                      Integer deprarmtentId, HttpServletRequest request);
+
+    HttpRespMsg getlastWeekFillTime(String userId);
+
+    HttpRespMsg getNoReportUserList(HttpServletRequest request, String startDate, String endDate,Integer noReportDeptId);
+
+    List<Map<String, Object>> getNotFullReportUserList(Integer companyId, LocalDate startDate, LocalDate endDate);
+
+    HttpRespMsg exportNoReportUserList(HttpServletRequest request, String startDate, String endDate,Integer noReportDeptId);
+
+    HttpRespMsg approveAllImport(HttpServletRequest request);
+
+    HttpRespMsg denyHisReport(Integer hisId, String reason, HttpServletRequest request);
+
+    HttpRespMsg getReportListByToken(String json);
+
+    HttpRespMsg fixIssue(Integer companyId, String startDate, String endDate);
+
+    HttpRespMsg getWeeklyCardTime(String dateStr, HttpServletRequest request);
+
+    HttpRespMsg getWeeklyWorkTime(String dateStr, HttpServletRequest request);
+
+    HttpRespMsg getProcessErrorData();
+
+    HttpRespMsg uploadThirdReportData(String yearMonth,HttpServletRequest request);
+
+    HttpRespMsg pushReportDataToThird(String yearMonth,HttpServletRequest request);
+
+    List<Map<String, Object>> getTaskReportList(Integer taskId);
+
+    HttpRespMsg correctWorkingTime(String userIds, String startDate, String endDate);
+
+    HttpRespMsg defaultDegree(Integer projectId, HttpServletRequest request);
+
+    HttpRespMsg approveDeptAuditReport(User user, String auditDeptId);
+
+    void moveReport(User sourceUser,User targetUser);
+
+    HttpRespMsg fillWorkingHours(String yearMonth, MonthWorkingTimeVO monthVO, HttpServletRequest request);
+
+    HttpRespMsg fillAll(String month, String userId, Integer departmentId, Integer whether,HttpServletRequest request);
+
+    HttpRespMsg getAIReport(HttpServletRequest request);
+
+    HttpRespMsg getWeeklyReportData(String targetDate, HttpServletRequest request);
+
+    HttpRespMsg batchDelete(String userIds, Integer deptId, String startDate, String endDate, HttpServletRequest request);
+
+    HttpRespMsg batchApproveByDate(String startDate, String endDate, Integer departmentId, HttpServletRequest request);
+
+    List getAuditWorkflowList(Integer reportId);
+
+    HttpRespMsg getWeeklyFillReportData(String targetDate, HttpServletRequest request);
+
+    HttpRespMsg pushProjectReportToSap(String pushDate,Integer reportId);
+
+    HttpRespMsg getReportById(Integer reportId, HttpServletRequest request);
+
+    HttpRespMsg geProjectTimeCostByThird(String json);
+
+    HttpRespMsg getUserTimeCostByThird(String json);
+
+    HttpRespMsg getUserWorkTimeByCategory(Integer categoryId, Integer deptId, String userId, String startDate, String endDate, Integer pageIndex, Integer pageSize);
+
+    HttpRespMsg exportUserWorkTimeByCategory(Integer categoryId, Integer deptId, String userId, String startDate, String endDate);
+
+    HttpRespMsg cannelAllReport();
+
+    HttpRespMsg getHasPushForSap(String startDate, String endDate, String employeeID);
+
+    HttpRespMsg getCustomDataWithDate(String startDate, String endDate, HttpServletRequest request);
+
+    HttpRespMsg exportCustomerTotalCount(String startDate, String endDate, String userId, Integer departmentId, Integer exportType, HttpServletRequest request) throws Exception;
+
+    HttpRespMsg exportCustomerTransferRate(String startDate, String endDate, String userId, Integer departmentId, Integer exportType, HttpServletRequest request) throws Exception;
+}

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

@@ -43,4 +43,6 @@ public interface SalesOrderService extends IService<SalesOrder> {
     HttpRespMsg undoPin(SalesOrder order, HttpServletRequest request);
 
     HttpRespMsg paymentCollectionList(Integer orderId, User user);
+
+    HttpRespMsg exportDataAI(String startTime, String endTime, HttpServletRequest request) throws Exception;
 }

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

@@ -44,4 +44,6 @@ public interface TaskService extends IService<Task> {
     HttpRespMsg getTaskDetail(Integer id, HttpServletRequest request);
 
     HttpRespMsg getTaskListByStartAndEnd(String startDate, String endDate, HttpServletRequest request);
+
+    HttpRespMsg exportDataAI(TaskDto task, HttpServletRequest request) throws Exception;
 }

+ 0 - 9
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/UserService.java

@@ -94,15 +94,6 @@ public interface UserService extends IService<User> {
 
     HttpRespMsg areaData(String token);
 
-    boolean ldapAuth(String username, String passWord);
-
-    List<JSONObject> ldapGetOU() throws NamingException;
-
-    List<JSONObject> getUser() throws Exception;
-
-    HttpRespMsg initSystemForAd(String companyName) throws Exception;
-
-    HttpRespMsg syncDeptWithAD(HttpServletRequest request) throws Exception;
 
     HttpRespMsg setActiveByIds(String ids, int isActive);
 

+ 234 - 58
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/AIQuestionServiceImpl.java

@@ -6,10 +6,9 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.management.platform.entity.*;
 import com.management.platform.entity.bo.FormStorePageBO;
 import com.management.platform.entity.bo.QuestionBO;
+import com.management.platform.entity.dto.TaskDto;
 import com.management.platform.mapper.*;
-import com.management.platform.service.AIQuestionService;
-import com.management.platform.service.CusTableColumnService;
-import com.management.platform.service.ExcelExportService;
+import com.management.platform.service.*;
 import com.management.platform.util.ExcelConverter;
 import com.management.platform.util.HttpRespMsg;
 import org.apache.commons.collections.CollectionUtils;
@@ -38,14 +37,17 @@ import java.io.IOException;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
-import java.sql.*;
+import java.sql.ResultSet;
+import java.sql.ResultSetMetaData;
+import java.sql.SQLException;
 import java.text.SimpleDateFormat;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.regex.Matcher;
-import java.util.stream.Collectors;
 
 @Service
 public class AIQuestionServiceImpl extends ServiceImpl<AIQuestionMapper, AIQuestion>  implements AIQuestionService {
@@ -71,6 +73,30 @@ public class AIQuestionServiceImpl extends ServiceImpl<AIQuestionMapper, AIQuest
     @Resource
     private CusTableColumnMapper cusTableColumnMapper;
 
+    @Resource
+    private ClueService clueService;
+
+    @Resource
+    private BusinessOpportunityService businessOpportunityService;
+
+    @Resource
+    private TaskService taskService;
+
+    @Resource
+    private CustomService customService;
+
+    @Resource
+    private ContactsService contactsService;
+
+    @Resource
+    private ProductService productService;
+
+    @Resource
+    private SalesOrderService salesOrderService;
+
+    @Resource
+    private ContractService contractService;
+
     @Resource
     private ExcelExportService excelExportService;
 
@@ -196,7 +222,8 @@ public class AIQuestionServiceImpl extends ServiceImpl<AIQuestionMapper, AIQuest
     public HttpRespMsg ask(QuestionBO questionBO, HttpServletRequest request) {
         HttpRespMsg httpRespMsg = new HttpRespMsg();
         User user = userMapper.selectById(request.getHeader("token"));
-
+//        String[] typeList = {"系统表", "自定义报表", "本地上传", "自由交流"};
+//        String typeName = typeList[questionBO.getQuestionDataSource() - 1];
         String queryRes = "";
         if(1 == questionBO.getQuestionDataSource()){
             /**
@@ -208,56 +235,201 @@ public class AIQuestionServiceImpl extends ServiceImpl<AIQuestionMapper, AIQuest
 
             String tableName = questionBO.getSourceContent();
 
-            //排除relation表中的关联字段
-            List<BusObjRelation> busObjRelations = busObjRelationMapper.selectList(new LambdaQueryWrapper<BusObjRelation>()
-                    .eq(BusObjRelation::getFromTbl, tableName)
-            );
-            List<CusTableColumn> checkColumns = cusTableColumnMapper.getStructByTableName(tableName,busObjRelations);
-            //映射字段和comment
-            Map<String, String> columnCommentMap = checkColumns.stream().collect(Collectors.toMap(CusTableColumn::getColumnName, CusTableColumn::getColumnComment));
-
-            StringBuilder stringBuilder = new StringBuilder();
-            stringBuilder.append(" select ");
-            for (String key : columnCommentMap.keySet()) {
-                stringBuilder.append(" ").append(key).append(",");
-            }
-            stringBuilder.delete(stringBuilder.length() - 1, stringBuilder.length());
-            stringBuilder.append(" from ")
-                    .append(tableName)
-                    .append(" where company_id =")
-                    .append(user.getCompanyId());
-            if(null != questionBO.getStartDate() && null != questionBO.getEndDate()){
-                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
-                stringBuilder.append(" and date_format(create_time,'%Y-%m-%d') between ")
-                        .append("'").append(sdf.format(questionBO.getStartDate())).append("'")
-                        .append(" and ")
-                        .append("'").append(sdf.format(questionBO.getEndDate())).append("'");
+            HttpRespMsg dataMsg = new HttpRespMsg();
+            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+            switch (tableName){
+                case "business_opportunity" :
+                    BusinessOpportunity bo = new BusinessOpportunity();
+                    if(null != questionBO.getStartDate() && null != questionBO.getEndDate()){
+                        bo.setStartTime(sdf.format(questionBO.getStartDate())) ;
+                        bo.setEndTime(sdf.format(questionBO.getEndDate())) ;
+                    }
+                    try {
+                        dataMsg = businessOpportunityService.exportDataAI(bo,request);
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                        dataMsg.setError("系统表生成数据有误,请联系管理员");
+                    }
+                    break;
+                case "clue" :
+                    Clue clue = new Clue();
+                    if(null != questionBO.getStartDate() && null != questionBO.getEndDate()){
+                        clue.setStartTime(sdf.format(questionBO.getStartDate())) ;
+                        clue.setEndTime(sdf.format(questionBO.getEndDate())) ;
+                    }
+                    try {
+                        dataMsg = clueService.exportDataAI(clue,request);
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                        dataMsg.setError("系统表生成数据有误,请联系管理员");
+                    }
+                    break;
+                case "custom" :
+                    Custom custom = new Custom();
+                    if(null != questionBO.getStartDate() && null != questionBO.getEndDate()){
+                        custom.setStartTime(sdf.format(questionBO.getStartDate())) ;
+                        custom.setEndTime(sdf.format(questionBO.getEndDate())) ;
+                    }
+                    try {
+                        dataMsg = customService.exportDataAI(custom,request);
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                        dataMsg.setError("系统表生成数据有误,请联系管理员");
+                    }
+                    break;
+                case "contacts" :
+                    Map<String,Object> map = new HashMap<>();
+                    map.put("isDelete", 0);
+                    map.put("companyId",user.getCompanyId());
+//                    if(null != questionBO.getStartDate() && null != questionBO.getEndDate()){
+//                        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+//
+//                    }
+                    try {
+                        dataMsg = contactsService.exportDataAI(map,request);
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                        dataMsg.setError("系统表生成数据有误,请联系管理员");
+                    }
+                    break;
+                case "task" :
+                    TaskDto task = new TaskDto();
+                    if(null != questionBO.getStartDate() && null != questionBO.getEndDate()){
+                        task.setStartDate(LocalDateTime.parse(sdf.format(questionBO.getStartDate()), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); ;
+                        task.setEndDate(LocalDateTime.parse(sdf.format(questionBO.getEndDate()), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))) ;
+                    }
+                    try {
+                        dataMsg = taskService.exportDataAI(task,request);
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                        dataMsg.setError("系统表生成数据有误,请联系管理员");
+                    }
+                    break;
+                case "product" :
+                    try {
+                        dataMsg = productService.exportDataAI(sdf.format(questionBO.getStartDate()),sdf.format(questionBO.getEndDate()),request);
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                        dataMsg.setError("系统表生成数据有误,请联系管理员");
+                    }
+                    break;
+                case "sales_order" :
+                    try {
+                        dataMsg = salesOrderService.exportDataAI(sdf.format(questionBO.getStartDate()),sdf.format(questionBO.getEndDate()),request);
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                        dataMsg.setError("系统表生成数据有误,请联系管理员");
+                    }
+                    break;
+                case "contract" :
+                    try {
+                        dataMsg = contractService.exportDataAI(sdf.format(questionBO.getStartDate()),sdf.format(questionBO.getEndDate()),request);
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                        dataMsg.setError("系统表生成数据有误,请联系管理员");
+                    }
+                    break;
             }
-
-            List<Map<String,Object>> columnList = new ArrayList<>();
-            try (Connection connection = dataSource.getConnection()) {
-                PreparedStatement preparedStatement = connection.prepareStatement(stringBuilder.toString());
-                ResultSet resultSet = preparedStatement.executeQuery();
-                columnList = this.convertListWithComment(resultSet,columnCommentMap);
-            }catch (SQLException e) {
-                e.printStackTrace();
-                httpRespMsg.setError("查询系统表有误,请联系管理员");
-                return httpRespMsg;
+            System.out.println("dataMsg=="+dataMsg.toJSONStr());
+            if(dataMsg.getCode().equals("error")){
+                return dataMsg;
             }
 
-            if(CollectionUtils.isNotEmpty(columnList)){
-                ResponseEntity<String> responseEntity = getResponseEntityWithFileAI(columnList, questionBO.getContent());
-                if(responseEntity.getStatusCode().is2xxSuccessful()){
-                    JSONObject jsonObject = JSONObject.parseObject(responseEntity.getBody());
+            String filePath = (String)dataMsg.getData();
+            //处理地址,获取最后一个斜杠后面的文件名
+            String fileName = filePath.substring(filePath.lastIndexOf("/") + 1);
+            System.out.println("文件名称:" + fileName);
+            RestTemplate restTemplate = new RestTemplate();
+            //转换为MultipartFile 准备表单数据
+            MultiValueMap<String, Object> body = new LinkedMultiValueMap<>();
+            body.add("question", questionBO.getContent());
+            ByteArrayResource byteArrayResource = null;
+            File f = new File(path,fileName);
+            try {
+                MultipartFile multipartFileFromPath = getMultipartFileFromPath(f.getAbsolutePath());
+                byteArrayResource = new ByteArrayResource(multipartFileFromPath.getBytes()) {
+                    @Override
+                    public String getFilename() {
+                        return multipartFileFromPath.getOriginalFilename();
+                    }
+                };
+                body.add("file",byteArrayResource);
+                HttpHeaders headers = new HttpHeaders();
+                headers.setContentType(MediaType.MULTIPART_FORM_DATA);
+
+                HttpEntity<MultiValueMap<String, Object>> requestEntity =
+                        new HttpEntity<>(body, headers);
+                ResponseEntity<String> response = restTemplate.exchange(
+                        aiFileAskUrl,
+                        HttpMethod.POST,
+                        requestEntity,
+                        String.class);
+                if(response.getStatusCode().is2xxSuccessful()){
+                    JSONObject jsonObject = JSONObject.parseObject(response.getBody());
                     System.out.println("jsonObject=== "+jsonObject);
                     queryRes = jsonObject.getString("data");
                 }else{
                     queryRes = "AI分析有误,稍后再试";
                 }
-            }else{
-                queryRes = "无数据";
+            }catch (IOException e){
+                e.printStackTrace();
+                queryRes = "数据处理有误,稍后再试";
             }
 
+            //排除relation表中的关联字段
+//            List<BusObjRelation> busObjRelations = busObjRelationMapper.selectList(new LambdaQueryWrapper<BusObjRelation>()
+//                    .eq(BusObjRelation::getFromTbl, tableName)
+//            );
+//            List<CusTableColumn> checkColumns = cusTableColumnMapper.getStructByTableName(tableName,busObjRelations);
+//            //映射字段和comment
+//            Map<String, String> columnCommentMap = checkColumns.stream().collect(Collectors.toMap(CusTableColumn::getColumnName, CusTableColumn::getColumnComment));
+//
+//            StringBuilder stringBuilder = new StringBuilder();
+//            stringBuilder.append(" select ");
+//            for (String key : columnCommentMap.keySet()) {
+//                stringBuilder.append(" ").append(key).append(",");
+//            }
+//            stringBuilder.delete(stringBuilder.length() - 1, stringBuilder.length());
+//            stringBuilder.append(" from ")
+//                    .append(tableName)
+//                    .append(" where company_id =")
+//                    .append(user.getCompanyId());
+//            if(null != questionBO.getStartDate() && null != questionBO.getEndDate()){
+//                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+//                stringBuilder.append(" and date_format(create_time,'%Y-%m-%d') between ")
+//                        .append("'").append(sdf.format(questionBO.getStartDate())).append("'")
+//                        .append(" and ")
+//                        .append("'").append(sdf.format(questionBO.getEndDate())).append("'");
+//            }
+//
+//            List<Map<String,Object>> columnList = new ArrayList<>();
+//            try (Connection connection = dataSource.getConnection()) {
+//                PreparedStatement preparedStatement = connection.prepareStatement(stringBuilder.toString());
+//                ResultSet resultSet = preparedStatement.executeQuery();
+//                columnList = this.convertListWithComment(resultSet,columnCommentMap);
+//            }catch (SQLException e) {
+//                e.printStackTrace();
+//                httpRespMsg.setError("查询系统表有误,请联系管理员");
+//                return httpRespMsg;
+//            }
+//
+//            if(CollectionUtils.isNotEmpty(columnList)){
+//                ResponseEntity<String> responseEntity = getResponseEntityWithFileAI(columnList, questionBO.getContent());
+//                if(responseEntity.getStatusCode().is2xxSuccessful()){
+//                    JSONObject jsonObject = JSONObject.parseObject(responseEntity.getBody());
+//                    System.out.println("jsonObject=== "+jsonObject);
+//                    if (jsonObject.getString("code").equals("ok")) {
+//                        queryRes = jsonObject.getString("data");
+//                    } else {
+//                        queryRes = jsonObject.getString("msg");
+//                    }
+//                }else{
+//                    queryRes = "AI分析有误,稍后再试";
+//                }
+//            }else{
+//                queryRes = "无数据";
+//            }
+
         } else if (2 == questionBO.getQuestionDataSource()) {
             /**
              * 自定义报表
@@ -403,6 +575,8 @@ public class AIQuestionServiceImpl extends ServiceImpl<AIQuestionMapper, AIQuest
             cusAsk.setSeq(startSeq+1);
             cusAsk.setQuestionId(questionId);
             cusAsk.setType(1);
+            //拼接问话内容:[typeName]- [questionBO.getDataName()]+ [content]
+//            String content = "[" + typeName + (questionBO.getDataName() == null?"":("-"+questionBO.getDataName()) + "]") + "<br>"+ questionBO.getContent();
             cusAsk.setContent(questionBO.getContent());
             cusAsk.setQuestionDataSource(questionBO.getQuestionDataSource());
             cusAsk.setSourceContent(questionBO.getSourceContent());
@@ -410,18 +584,20 @@ public class AIQuestionServiceImpl extends ServiceImpl<AIQuestionMapper, AIQuest
             cusAsk.setEndDate(questionBO.getEndDate());
             aiQuestionDetailMapper.insert(cusAsk);
 
-            AIQuestionDetail aiAnswer = new AIQuestionDetail();
-            aiAnswer.setCreatorId(user.getId());
-            aiAnswer.setCompanyId(user.getCompanyId());
-            aiAnswer.setSeq(startSeq+2);
-            aiAnswer.setQuestionId(questionId);
-            aiAnswer.setType(0);
-            aiAnswer.setContent(queryRes);
-            aiAnswer.setQuestionDataSource(questionBO.getQuestionDataSource());
-            aiAnswer.setSourceContent(questionBO.getSourceContent());
-            aiAnswer.setStartDate(questionBO.getStartDate());
-            aiAnswer.setEndDate(questionBO.getEndDate());
-            aiQuestionDetailMapper.insert(aiAnswer);
+            if (queryRes != null) {
+                AIQuestionDetail aiAnswer = new AIQuestionDetail();
+                aiAnswer.setCreatorId(user.getId());
+                aiAnswer.setCompanyId(user.getCompanyId());
+                aiAnswer.setSeq(startSeq+2);
+                aiAnswer.setQuestionId(questionId);
+                aiAnswer.setType(0);
+                aiAnswer.setContent(queryRes);
+                aiAnswer.setQuestionDataSource(questionBO.getQuestionDataSource());
+                aiAnswer.setSourceContent(questionBO.getSourceContent());
+                aiAnswer.setStartDate(questionBO.getStartDate());
+                aiAnswer.setEndDate(questionBO.getEndDate());
+                aiQuestionDetailMapper.insert(aiAnswer);
+            }
 
             resMap.put("questionId",questionId);
         }

+ 141 - 5
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/BusinessOpportunityServiceImpl.java

@@ -39,6 +39,7 @@ import java.lang.reflect.Method;
 import java.math.BigDecimal;
 import java.net.URLEncoder;
 import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
 import java.util.*;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.stream.Collectors;
@@ -280,10 +281,6 @@ public class BusinessOpportunityServiceImpl extends ServiceImpl<BusinessOpportun
         bOMapper.update(null, updateWrapper);
     }
 
-    @Value(value = "${upload.file}")
-    private String path;
-
-
     @Override
     @Transactional(rollbackFor = Exception.class)
     public HttpRespMsg saveProduct(BusinessOpportunity bo, User user) {
@@ -407,7 +404,7 @@ public class BusinessOpportunityServiceImpl extends ServiceImpl<BusinessOpportun
             UploadFile uploadFile = uploadFileMapper.selectById(file.getId());
             uploadFileMapper.deleteById(uploadFile.getId());
             String realName = uploadFile.getRealName();
-            File file1 = new File(path + realName);
+            File file1 = new File(filePath + realName);
             file1.delete();
             msg.setMsg("删除成功");
         } catch (Exception e) {
@@ -821,6 +818,145 @@ public class BusinessOpportunityServiceImpl extends ServiceImpl<BusinessOpportun
         return respMsg;
     }
 
+    @Override
+    public HttpRespMsg exportDataAI(BusinessOpportunity bo, HttpServletRequest request)  throws Exception {
+        User user = userMapper.selectById(request.getHeader("token"));
+        SysForm sysForm = sysFormMapper.selectOne(new LambdaQueryWrapper<SysForm>().eq(SysForm::getCompanyId, user.getCompanyId()).eq(SysForm::getCode, "business").eq(SysForm::getIsCurrent, 1));
+        WxCorpInfo wxCorpInfo = wxCorpInfoService.getOne(new LambdaQueryWrapper<WxCorpInfo>().eq(WxCorpInfo::getCompanyId, user.getCompanyId()));
+        String config = sysForm.getConfig();
+        Company company = companyMapper.selectById(user.getCompanyId());
+        String str = company.getIsExistBusiness() == 1 ? "商机" : "项目";
+
+        JSONObject configOb = JSON.parseObject(config);
+        JSONArray configObJSONArray = configOb.getJSONArray("list");
+        List<List<String>> dataList=new ArrayList<>();
+        List<String> titleList=new ArrayList<>();
+        List<String> modelList=new ArrayList<>();
+        for (int i = 0; i < configObJSONArray.size(); i++) {
+            JSONObject item = configObJSONArray.getJSONObject(i);
+            String type = item.getString("type");
+            if (type.equals("grid")){
+                JSONArray columns = item.getJSONArray("columns");
+                for (int j = 0; j < columns.size(); j++) {
+                    JSONObject columnsJSONObject = columns.getJSONObject(j);
+                    JSONArray listJsonArray = columnsJSONObject.getJSONArray("list");
+                    for (int k = 0; k < listJsonArray.size(); k++) {
+                        JSONObject listJsonArrayJSONObject = listJsonArray.getJSONObject(k);
+                        titleList.add(listJsonArrayJSONObject.getString("label"));
+                        modelList.add(listJsonArrayJSONObject.getString("model"));
+                    }
+                }
+            }
+            else {
+                titleList.add(item.getString("label"));
+                modelList.add(item.getString("model"));
+            }
+        }
+        dataList.add(titleList);
+        for (int i = 0; i < titleList.size(); i++) {
+            String s = titleList.get(i);
+            if (s.contains("商机")) {
+                s = s.replaceAll("商机", str);
+                titleList.set(i, s);
+            }
+        }
+
+        HttpRespMsg respMsg = listAI(bo,request);
+        Map<String, Object> msgData = (Map<String, Object>) respMsg.getData();
+        List<BusinessOpportunity> list = (List<BusinessOpportunity>) msgData.get("data");
+
+        for (BusinessOpportunity data : list) {
+            List<String> item=new ArrayList<>();
+            for (int i = 0; i < modelList.size(); i++) {
+
+                String model = modelList.get(i);
+                String targetName = model.substring(0, 1).toUpperCase() + model.substring(1);
+                Class<? extends BusinessOpportunity> aClass = data.getClass();
+                String value = "";
+
+                if(model.equals("inchargerId")){
+                    if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                        if(null == aClass.getMethod("getInchargerName").invoke(data)){
+                            value = "";
+                        }else{
+                            value = "$userName="+String.valueOf(aClass.getMethod("getInchargerName").invoke(data))+"$";
+                        }
+//                        value = "$userName="+String.valueOf(aClass.getMethod("getInchargerName").invoke(data))+"$";
+                    }else {
+                        value = String.valueOf(aClass.getMethod("getInchargerName").invoke(data)).equals("null") ? "" :String.valueOf(aClass.getMethod("getInchargerName").invoke(data));
+                    }
+                }else {
+                    value= String.valueOf(aClass.getMethod("get" + targetName).invoke(data)==null?"":aClass.getMethod("get" + targetName).invoke(data));
+                }
+
+                if(model.equals("contactsId")){
+                    value = String.valueOf(aClass.getMethod("getContactsName").invoke(data)).equals("null")?"":String.valueOf(aClass.getMethod("getContactsName").invoke(data));
+                }
+                if(model.equals("customerId")){
+                    value = String.valueOf(null == aClass.getMethod("getCustomerName").invoke(data)?"":aClass.getMethod("getCustomerName").invoke(data));
+                }
+                if(model.equals("expectedTransactionDate")){
+                    LocalDate date = (LocalDate) aClass.getMethod("getExpectedTransactionDate").invoke(data);
+                    // 如果日期不为空,格式化日期
+                    if (date != null) {
+                        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd");
+                        value = date.format(formatter);
+                    } else {
+                        value = "";
+                    }                }
+                if(model.equals("stageId")){
+                    value = String.valueOf(null == aClass.getMethod("getStageValue").invoke(data)?"":aClass.getMethod("getStageValue").invoke(data));
+                }
+                if(model.equals("creatorId")){
+                    if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                        if(null == aClass.getMethod("getCreatorName").invoke(data)){
+                            value = "";
+                        }else{
+                            value = "$userName="+String.valueOf(aClass.getMethod("getCreatorName").invoke(data))+"$";
+                        }
+                    }else {
+                        value = String.valueOf(aClass.getMethod("getCreatorName").invoke(data)).equals("null") ? "" :String.valueOf(aClass.getMethod("getCreatorName").invoke(data));
+                    }
+//                    value = String.valueOf(null == aClass.getMethod("getCreatorName").invoke(data)?"":aClass.getMethod("getCreatorName").invoke(data));
+                }
+
+                item.add(value);
+            }
+            dataList.add(item);
+        }
+        String fileName=str+"表AI_"+ System.currentTimeMillis();
+        return excelExportService.exportGeneralExcelByTitleAndListAI(fileName,dataList,filePath);
+    }
+
+    private HttpRespMsg listAI(BusinessOpportunity bo, HttpServletRequest request) {
+        HashMap<Object, Object> r = new HashMap<>();
+        User user = userMapper.selectById(request.getHeader("Token"));
+        bo.setIsDelete(0);
+        bo.setCompanyId(user.getCompanyId());
+        bo.setUserId(user.getId());
+        bo.setEndTime(bo.getEndTime() + " 23:59:59");
+//        bo.setPageIndex((bo.getPageIndex()-1) * bo.getPageFrom());
+        List<BusinessOpportunity> list = new ArrayList<>();
+        boolean isAll = sysFunctionService.hasPriviledge(user.getRoleId(), "查看全部商机");
+        boolean isNotAll = sysFunctionService.hasPriviledge(user.getRoleId(), "查看负责部门商机");
+        int i = 0;
+        if (isAll) {
+            list = getAll(bo);
+            i = getTotal(bo);
+        } else if (isNotAll) {
+            list = getAll1(bo, user);
+            i = getTotal1(bo, user);
+        } else {
+            list = getAll2(bo, user);
+            i = getTotal2(bo, user);
+        }
+        r.put("data", list);
+        r.put("total",i);
+        HttpRespMsg msg = new HttpRespMsg();
+        msg.setData(r);
+        return msg;
+    }
+
 
     private BusinessOpportunity setNull(BusinessOpportunity bo) {
         if (bo.getPlate1() == "") {

+ 110 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/ClueServiceImpl.java

@@ -82,6 +82,116 @@ public class ClueServiceImpl extends ServiceImpl<ClueMapper, Clue> implements Cl
     @Autowired
     private ApplicationContext applicationContext;
 
+    private HttpRespMsg listAI(Clue clue,HttpServletRequest request){
+        User user = userMapper.selectById(request.getHeader("Token"));
+        clue.setCompanyId(user.getCompanyId());
+        clue.setIsDelete(0);
+        clue.setEndTime(clue.getEndTime() + " 23:59:59");
+        //导出时不需要页码过滤
+//        clue.setPageIndex((clue.getPageIndex() - 1) * clue.getPageFrom());
+        boolean isAll = sysFunctionService.hasPriviledge(user.getRoleId(), "查看全部线索");
+        boolean isNotAll = sysFunctionService.hasPriviledge(user.getRoleId(), "查看负责部门线索");
+        List<Clue> list = new ArrayList<>();
+        int i = 0;
+        if (isAll) {
+            //查看全部线索
+            list = getList(clue);
+            i = getTotal(clue);
+        } else if (isNotAll) {
+            //查看负责部门线索 找出所处部门下所有的负责人
+            list = getList1(clue, user);
+            i = getTotal1(clue, user);
+        } else {
+            // 查看负责人为 自己 和 null的数据
+            list = getList2(clue, user);
+            i = getTotal2(clue, user);
+        }
+        HashMap<Object, Object> map = new HashMap<>();
+        map.put("data", list);
+        map.put("total", i);
+        HttpRespMsg msg = new HttpRespMsg();
+        msg.setData(map);
+        return msg;
+    }
+
+
+    @Override
+    public HttpRespMsg exportDataAI(Clue clue,HttpServletRequest request) throws Exception {
+        User user = userMapper.selectById(request.getHeader("token"));
+        SysForm sysForm = sysFormMapper.selectOne(new LambdaQueryWrapper<SysForm>().eq(SysForm::getCompanyId, user.getCompanyId()).eq(SysForm::getCode, "Thread").eq(SysForm::getIsCurrent, 1));
+        WxCorpInfo wxCorpInfo = wxCorpInfoService.getOne(new LambdaQueryWrapper<WxCorpInfo>().eq(WxCorpInfo::getCompanyId, user.getCompanyId()));
+        String config = sysForm.getConfig();
+        JSONObject configOb = JSON.parseObject(config);
+        JSONArray configObJSONArray = configOb.getJSONArray("list");
+        List<List<String>> dataList=new ArrayList<>();
+        List<String> titleList=new ArrayList<>();
+        List<String> modelList=new ArrayList<>();
+        for (int i = 0; i < configObJSONArray.size(); i++) {
+            JSONObject item = configObJSONArray.getJSONObject(i);
+            String type = item.getString("type");
+            if (type.equals("grid")){
+                JSONArray columns = item.getJSONArray("columns");
+                for (int j = 0; j < columns.size(); j++) {
+                    JSONObject columnsJSONObject = columns.getJSONObject(j);
+                    JSONArray listJsonArray = columnsJSONObject.getJSONArray("list");
+                    for (int k = 0; k < listJsonArray.size(); k++) {
+                        JSONObject listJsonArrayJSONObject = listJsonArray.getJSONObject(k);
+                        titleList.add(listJsonArrayJSONObject.getString("label"));
+                        modelList.add(listJsonArrayJSONObject.getString("model"));
+                    }
+                }
+            }
+            else {
+                titleList.add(item.getString("label"));
+                modelList.add(item.getString("model"));
+            }
+        }
+        dataList.add(titleList);
+
+        HttpRespMsg respMsg = this.listAI(clue,request);
+
+        Map<String, Object> msgData = (Map<String, Object>) respMsg.getData();
+        List<Clue> list = (List<Clue>) msgData.get("data");
+
+        for (Clue data : list) {
+            List<String> item=new ArrayList<>();
+            for (int i = 0; i < modelList.size(); i++) {
+
+                String model = modelList.get(i);
+                String targetName = model.substring(0, 1).toUpperCase() + model.substring(1);
+                Class<? extends Clue> aClass = data.getClass();
+                String value = "";
+
+                if(model.equals("inchargerId")){
+                    if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                        if(null == aClass.getMethod("getInchargerName").invoke(data)){
+                            value = "";
+                        }else{
+                            value = "$userName="+String.valueOf(aClass.getMethod("getInchargerName").invoke(data))+"$";
+                        }
+                    }else {
+                        value = String.valueOf(aClass.getMethod("getInchargerName").invoke(data)).equals("null") ? "" :String.valueOf(aClass.getMethod("getInchargerName").invoke(data));
+                    }
+                }else {
+                    value= String.valueOf(aClass.getMethod("get" + targetName).invoke(data)==null?"":aClass.getMethod("get" + targetName).invoke(data));
+                }
+
+                if(model.equals("clueSourceId")){
+                    value = String.valueOf(null == aClass.getMethod("getClueSourceValue").invoke(data)?"":aClass.getMethod("getClueSourceValue").invoke(data));
+                }
+                if(model.equals("customerLevelId")){
+                    value = String.valueOf(null == aClass.getMethod("getCustomerLevelValue").invoke(data)?"":aClass.getMethod("getCustomerLevelValue").invoke(data));
+                }
+                if(model.equals("customerIndustryId")){
+                    value = String.valueOf(null == aClass.getMethod("getCustomerIndustryValue").invoke(data)?"":aClass.getMethod("getCustomerIndustryValue").invoke(data));
+                }
+                item.add(value);
+            }
+            dataList.add(item);
+        }
+        String fileName="线索表AI_"+ System.currentTimeMillis();
+        return excelExportService.exportGeneralExcelByTitleAndListAI(fileName,dataList,path);
+    }
 
     @Override
     @Transactional(rollbackFor = Exception.class)

Fichier diff supprimé car celui-ci est trop grand
+ 589 - 589
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/CompanyDingdingServiceImpl.java


+ 81 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/ContactsServiceImpl.java

@@ -975,5 +975,86 @@ public class ContactsServiceImpl extends ServiceImpl<ContactsMapper, Contacts> i
         return msg;
     }
 
+    @Override
+    public HttpRespMsg exportDataAI(Map<String, Object> map, HttpServletRequest request) throws Exception {
+        User user = userMapper.selectById(request.getHeader("token"));
+        SysForm sysForm = sysFormMapper.selectOne(new LambdaQueryWrapper<SysForm>().eq(SysForm::getCompanyId, user.getCompanyId()).eq(SysForm::getCode, "Contacts").eq(SysForm::getIsCurrent, 1));
+        WxCorpInfo wxCorpInfo = wxCorpInfoService.getOne(new LambdaQueryWrapper<WxCorpInfo>().eq(WxCorpInfo::getCompanyId, user.getCompanyId()));
+        String config = sysForm.getConfig();
+        JSONObject configOb = JSON.parseObject(config);
+        JSONArray configObJSONArray = configOb.getJSONArray("list");
+        List<List<String>> dataList=new ArrayList<>();
+        List<String> titleList=new ArrayList<>();
+        List<String> modelList=new ArrayList<>();
+        for (int i = 0; i < configObJSONArray.size(); i++) {
+            JSONObject item = configObJSONArray.getJSONObject(i);
+            String type = item.getString("type");
+            if (type.equals("grid")){
+                JSONArray columns = item.getJSONArray("columns");
+                for (int j = 0; j < columns.size(); j++) {
+                    JSONObject columnsJSONObject = columns.getJSONObject(j);
+                    JSONArray listJsonArray = columnsJSONObject.getJSONArray("list");
+                    for (int k = 0; k < listJsonArray.size(); k++) {
+                        JSONObject listJsonArrayJSONObject = listJsonArray.getJSONObject(k);
+                        titleList.add(listJsonArrayJSONObject.getString("label"));
+                        modelList.add(listJsonArrayJSONObject.getString("model"));
+                    }
+                }
+            }
+            else {
+                titleList.add(item.getString("label"));
+                modelList.add(item.getString("model"));
+            }
+        }
+        dataList.add(titleList);
+
+        Page<ContactsVo> pageContacts = contactsMapper.pageContacts(new Page<>(-1,-1), map);
+        List<ContactsVo> records = pageContacts.getRecords();
+
+        for (ContactsVo contactsVo : records) {
+            List<String> item=new ArrayList<>();
+            for (int i = 0; i < modelList.size(); i++) {
+
+                String model = modelList.get(i);
+                String targetName = model.substring(0, 1).toUpperCase() + model.substring(1);
+                Class<? extends ContactsVo> aClass = contactsVo.getClass();
+                String value = "";
+
+                if(model.equals("customId")){
+                    value = String.valueOf(aClass.getMethod("getCustomName").invoke(contactsVo)).equals("null") ?"" :String.valueOf(aClass.getMethod("getCustomName").invoke(contactsVo));
+                }
+                else if(model.equals("sex")){
+                    value = String.valueOf(aClass.getMethod("getSex").invoke(contactsVo)).equals("null") ?"":String.valueOf(aClass.getMethod("getSex").invoke(contactsVo));
+                    if (StringUtils.isNotEmpty(value)){
+                        if (value.equals("0")){
+                            value="女";
+                        }else {
+                            value="男";
+                        }
+                    }
+
+                }
+                else if(model.equals("ownerId")){
+                    if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                        if(null == aClass.getMethod("getOwnerName").invoke(contactsVo)){
+                            value = "";
+                        }else{
+                            value = "$userName="+String.valueOf(aClass.getMethod("getOwnerName").invoke(contactsVo))+"$";
+                        }
+//                        value = "$userName="+String.valueOf(aClass.getMethod("getOwnerName").invoke(contactsVo))+"$";
+                    }else {
+                        value = String.valueOf(aClass.getMethod("getOwnerName").invoke(contactsVo)).equals("null") ? "" :String.valueOf(aClass.getMethod("getOwnerName").invoke(contactsVo));
+                    }
+                }else
+                    value= String.valueOf(aClass.getMethod("get" + targetName).invoke(contactsVo)==null?"":aClass.getMethod("get" + targetName).invoke(contactsVo));
+
+                item.add(value);
+            }
+            dataList.add(item);
+        }
+        String fileName="联系人表AI_"+ System.currentTimeMillis();
+        return excelExportService.exportGeneralExcelByTitleAndListAI(fileName,dataList,path);
+    }
+
 
 }

+ 83 - 2
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/ContractServiceImpl.java

@@ -6,7 +6,6 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.management.platform.constant.Constant;
 import com.management.platform.entity.*;
 import com.management.platform.entity.vo.ContractPageVO;
 import com.management.platform.entity.vo.ContractVo;
@@ -65,7 +64,7 @@ public class ContractServiceImpl extends ServiceImpl<ContractMapper, Contract> i
     @Resource
     private LocaleInformationMapper localeInformationMapper;
     @Resource
-    private ExcelExportService excelExportService;
+    private ExcelExportServiceImpl excelExportService;
     @Resource
     private WxCorpInfoMapper wxCorpInfoMapper;
     @Resource
@@ -2182,4 +2181,86 @@ public class ContractServiceImpl extends ServiceImpl<ContractMapper, Contract> i
         }
         return msg;
     }
+
+    @Override
+    public HttpRespMsg exportDataAI(String startDate, String endDate, HttpServletRequest request) throws Exception {
+        HttpRespMsg httpRespMsg = new HttpRespMsg();
+        User user = userMapper.selectById(request.getHeader("token"));
+        List<SysRichFunction> functionContractList = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "导出合同");
+        if(functionContractList.size() <= 0){
+            httpRespMsg.setError(MessageUtils.message("access.operationError"));
+            return httpRespMsg;
+        }
+        WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", user.getCompanyId()));
+        HttpRespMsg contractPage = getContractPage(request, null, null, null, null, null, null, startDate, endDate, null, null, null,null,null);
+        HashMap<String, Object> resultDate = (HashMap<String, Object>) contractPage.data;
+        List<ContractPageVO> data = (List<ContractPageVO>)resultDate.get("data");
+        List<String> headList = new ArrayList<String>();
+//        headList.add("合同编号");
+//        headList.add("合同名称");
+//        headList.add("合同开始时间");
+//        headList.add("合同结束时间");
+//        headList.add("合同创建者");
+//        headList.add("合同金额(¥)");
+//        headList.add("合同类型");
+//        headList.add("状态");
+//        headList.add("创建时间");
+//        headList.add("备注");
+        headList.add(MessageUtils.message("entry.contractNo"));
+        headList.add("部门");
+        headList.add(MessageUtils.message("contract.name"));
+        headList.add(MessageUtils.message("Contract.startDate"));
+        headList.add(MessageUtils.message("Contract.endDate"));
+        headList.add(MessageUtils.message("Contract.creatorName"));
+        headList.add(MessageUtils.message("entry.contract"));
+        headList.add(MessageUtils.message("contract.type"));
+        headList.add(MessageUtils.message("leave.status"));
+        headList.add(MessageUtils.message("excel.creatTime"));
+        headList.add(MessageUtils.message("leave.task"));
+        ArrayList<List<String>> allList = new ArrayList<>();
+        allList.add(headList);
+        for (ContractPageVO contract : data) {
+            ArrayList<String> item = new ArrayList<>();
+            item.add(contract.getNumber()==null?"":contract.getNumber());
+            item.add(StringUtils.isEmpty(contract.getDepartmentName())?"":contract.getDepartmentName());
+            item.add(null == contract.getName()?"":contract.getName());
+            item.add(contract.getStartDate()==null?"":contract.getStartDate()+"");
+            item.add(contract.getEndDate()==null?"":contract.getEndDate()+"");
+            if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                contract.setCreatorName("$userName=" + contract.getCreatorWxCorpId() + "$");
+            }else {
+                contract.setCreatorName(contract.getCreatorName());
+            }
+            item.add(contract.getCreatorName());
+            BigDecimal bigDecimal = null;
+            if (contract.getAmounts() != null){
+                bigDecimal = new BigDecimal(contract.getAmounts().toString()).setScale(2, BigDecimal.ROUND_HALF_UP);
+            }
+            item.add(contract.getAmounts()==null?"":bigDecimal + "");
+            item.add(null == contract.getTypeName()?"":contract.getTypeName());
+            switch (contract.getStatus()){
+                case 0 :
+                    item.add("审核通过");
+                    break;
+                case 1 :
+                    item.add("待审核");
+                    break;
+                case 2 :
+                    item.add("驳回");
+                    break;
+                default:
+                    item.add("_");
+            }
+            item.add(null == contract.getIndate()?"":contract.getIndate().toString());
+            item.add(contract.getRemarks()==null?"":contract.getRemarks());
+            allList.add(item);
+        }
+        String fileName = "合同AI_"+System.currentTimeMillis();
+        try {
+            return excelExportService.exportGeneralExcelByTitleAndListAI(fileName,allList, path);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return httpRespMsg;
+    }
 }

+ 90 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/CustomServiceImpl.java

@@ -19,6 +19,7 @@ import com.management.platform.util.ExcelUtil;
 import com.management.platform.util.FileUtil;
 import com.management.platform.util.HttpRespMsg;
 import com.management.platform.util.MessageUtils;
+import org.apache.commons.collections.CollectionUtils;
 import org.apache.poi.ss.usermodel.CellType;
 import org.apache.poi.xssf.usermodel.XSSFCell;
 import org.apache.poi.xssf.usermodel.XSSFRow;
@@ -631,8 +632,17 @@ public class CustomServiceImpl extends ServiceImpl<CustomMapper, Custom> impleme
             msg.setData(userVoList);
         } else {
             List<DepartmentVO> departmentVoList = departmentMapper.getCustomerTotalCount(startDate, endDate, departmentId, companyId);
+            //部门总数
+            List<DepartmentVO> earlierCusCountList = departmentMapper.getEarlierCusCount(endDate,departmentId, companyId);
+            Map<Integer, Integer> earlierMap = new HashMap<>();
+            if(CollectionUtils.isNotEmpty(earlierCusCountList)){
+                earlierMap = earlierCusCountList.stream()
+                        .collect(Collectors.toMap(DepartmentVO::getId, DepartmentVO::getEarlierCusTotal));
+            }
             if (departmentVoList != null && !departmentVoList.isEmpty()) {
                 for (DepartmentVO departmentVO : departmentVoList) {
+                    Integer earlierNum = earlierMap.getOrDefault(departmentVO.getId(),null);
+                    departmentVO.setEarlierCusTotal(earlierNum);
                     if (departmentVO.getCustomertotal() == 0) {
                         departmentVO.setDealRate((double) 0);
                     } else {
@@ -1063,6 +1073,86 @@ public class CustomServiceImpl extends ServiceImpl<CustomMapper, Custom> impleme
         return msg;
     }
 
+    @Override
+    public HttpRespMsg exportDataAI(Custom custom, HttpServletRequest request) throws Exception {
+        System.out.println("========导出客户信息==========");
+        long startTimeSec = System.currentTimeMillis();
+        User user = userMapper.selectById(request.getHeader("token"));
+        SysForm sysForm = sysFormMapper.selectOne(new LambdaQueryWrapper<SysForm>().eq(SysForm::getCompanyId, user.getCompanyId()).eq(SysForm::getCode, "Customer").eq(SysForm::getIsCurrent, 1));
+        WxCorpInfo wxCorpInfo = wxCorpInfoService.getOne(new LambdaQueryWrapper<WxCorpInfo>().eq(WxCorpInfo::getCompanyId, user.getCompanyId()));
+        String config = sysForm.getConfig();
+        JSONObject configOb = JSON.parseObject(config);
+        JSONArray configObJSONArray = configOb.getJSONArray("list");
+        List<List<String>> dataList=new ArrayList<>();
+        List<String> titleList=new ArrayList<>();
+        List<String> modelList=new ArrayList<>();
+        for (int i = 0; i < configObJSONArray.size(); i++) {
+            JSONObject item = configObJSONArray.getJSONObject(i);
+            String type = item.getString("type");
+            if (type.equals("grid")){
+                JSONArray columns = item.getJSONArray("columns");
+                for (int j = 0; j < columns.size(); j++) {
+                    JSONObject columnsJSONObject = columns.getJSONObject(j);
+                    JSONArray listJsonArray = columnsJSONObject.getJSONArray("list");
+                    for (int k = 0; k < listJsonArray.size(); k++) {
+                        JSONObject listJsonArrayJSONObject = listJsonArray.getJSONObject(k);
+                        titleList.add(listJsonArrayJSONObject.getString("label"));
+                        modelList.add(listJsonArrayJSONObject.getString("model"));
+                    }
+                }
+            }
+            else {
+                titleList.add(item.getString("label"));
+                modelList.add(item.getString("model"));
+            }
+        }
+        dataList.add(titleList);
+
+        HttpRespMsg respMsg = getList(custom,request);
+        Map<String, Object> msgData = (Map<String, Object>) respMsg.getData();
+        List<Custom> list = (List<Custom>) msgData.get("data");
+
+        for (Custom data : list) {
+            List<String> item=new ArrayList<>();
+            for (int i = 0; i < modelList.size(); i++) {
+
+                String model = modelList.get(i);
+                String targetName = model.substring(0, 1).toUpperCase() + model.substring(1);
+                Class<? extends Custom> aClass = data.getClass();
+                String value = "";
+
+                if(model.equals("inchargerId")){
+                    if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                        value = "$userName="+String.valueOf(aClass.getMethod("getInchargerName").invoke(data))+"$";
+                    }else {
+                        value = String.valueOf(aClass.getMethod("getInchargerName").invoke(data)).equals("null") ? "" :String.valueOf(aClass.getMethod("getInchargerName").invoke(data));
+                    }
+                }else {
+                    value= String.valueOf(aClass.getMethod("get" + targetName).invoke(data)==null?"":aClass.getMethod("get" + targetName).invoke(data));
+                }
+
+                if(model.equals("clueSourceId")){
+                    value = String.valueOf(null == aClass.getMethod("getClueSourceValue").invoke(data)?"":aClass.getMethod("getClueSourceValue").invoke(data));
+                }
+                if(model.equals("customerLevelId")){
+                    value = String.valueOf(null == aClass.getMethod("getCustomerLevelValue").invoke(data)?"":aClass.getMethod("getCustomerLevelValue").invoke(data));
+                }
+                if(model.equals("customerIndustryId")){
+                    value = String.valueOf(null == aClass.getMethod("getCustomerIndustryValue").invoke(data)?"":aClass.getMethod("getCustomerIndustryValue").invoke(data));
+                }
+                item.add(value);
+            }
+            dataList.add(item);
+        }
+        String fileName="客户表AI_"+ System.currentTimeMillis();
+        long endTimeSec = System.currentTimeMillis();
+        System.out.println("========客户信息导出数据准备结束==========耗时"+(endTimeSec-startTimeSec)+"毫秒");
+        return excelExportService.exportGeneralExcelByTitleAndListAI(fileName,dataList,path);
+    }
+
+    @Value(value = "${upload.path}")
+    private String path;
+
 
     private Custom setNull(Custom clue) {
         if (clue.getPlate1() == "") {

Fichier diff supprimé car celui-ci est trop grand
+ 2515 - 2516
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/DingDingServiceImpl.java


+ 19 - 2
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/ExcelExportServiceImpl.java

@@ -1,7 +1,5 @@
 package com.management.platform.service.impl;
 
-import com.management.platform.controller.TaskController;
-import com.management.platform.controller.UserController;
 import com.management.platform.entity.CorpwxJobResult;
 import com.management.platform.entity.WxCorpInfo;
 import com.management.platform.mapper.CorpwxJobResultMapper;
@@ -72,6 +70,25 @@ public class ExcelExportServiceImpl implements ExcelExportService {
         }
     }
 
+    public HttpRespMsg exportGeneralExcelByTitleAndListAI(String title, List<List<String>> list, String downloadPath) throws Exception {
+        long startTimeSec = System.currentTimeMillis();
+        System.out.println("excel导出数据开始");
+        HttpRespMsg httpRespMsg = new HttpRespMsg();
+        if (title.contains("/")) {
+            //文件名不能含有路径,得替换掉
+            title = title.replace("/", "@");
+        }
+        if (title.contains("\\")) {
+            //文件名不能含有路径,得替换掉
+            title = title.replace("\\", "@");
+        }
+        String resp = ExcelUtil.exportGeneralExcelByTitleAndList(title, list, downloadPath);
+        httpRespMsg.data = resp;
+        long endTimeSec = System.currentTimeMillis();
+        System.out.println("========excel导出数据结束==========耗时"+(endTimeSec-startTimeSec)+"毫秒");
+        return httpRespMsg;
+    }
+
     public HttpRespMsg exportGeneralExcelByTitleAndList(WxCorpInfo wxCorpInfo, String title, List<List<String>> list, String downloadPath) throws Exception {
         long startTimeSec = System.currentTimeMillis();
         System.out.println("excel导出数据开始");

+ 820 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/LeaveSheetServiceImpl.java

@@ -0,0 +1,820 @@
+package com.management.platform.service.impl;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.management.platform.controller.AuditWorkflowSettingController;
+import com.management.platform.entity.*;
+import com.management.platform.entity.vo.SysRichFunction;
+import com.management.platform.mapper.*;
+import com.management.platform.service.*;
+import com.management.platform.util.HttpRespMsg;
+import com.management.platform.util.MessageUtils;
+import com.management.platform.util.WorkDayCalculateUtils;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.StringUtils;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2021-12-09
+ */
+@Service
+@Transactional
+public class LeaveSheetServiceImpl extends ServiceImpl<LeaveSheetMapper, LeaveSheet> implements LeaveSheetService {
+    public static final Integer exLeaveDay = 6;
+    public static final String[] LEAVE_TYPES = new String[]{"事假","病假","年假","产假","婚假","丧假","调休假","陪产假","其他"};
+    @Resource
+    private UserMapper userMapper;
+    @Resource
+    private LeaveSheetMapper leaveSheetMapper;
+    @Resource
+    private TimeTypeMapper timeTypeMapper;
+    @Resource
+    private ReportMapper reportMapper;
+    @Resource
+    private AuditWorkflowSettingService auditWorkflowSettingService;
+    @Resource
+    private AuditWorkflowSettingMapper auditWorkflowSettingMapper;
+    @Resource
+    private DepartmentMapper departmentMapper;
+    @Resource
+    private HttpServletRequest request;
+    @Resource
+    SysFunctionMapper sysFunctionMapper;
+    @Resource
+    DepartmentService departmentService;
+    @Resource
+    WxCorpInfoMapper wxCorpInfoMapper;
+    @Resource
+    ExcelExportService excelExportService;
+    @Resource
+    LeaveAuditLogMapper leaveAuditLogMapper;
+    @Resource
+    WxCorpInfoService wxCorpInfoService;
+    @Resource
+    InformationMapper informationMapper;
+
+    @Value(value = "${upload.path}")
+    private String path;
+
+    @Override
+    public HttpRespMsg add(LeaveSheet sheet, String userId) {
+        HttpRespMsg msg = new HttpRespMsg();
+        boolean isNew = false;
+        if (sheet.getId() == null) {
+            isNew = true;
+        }
+        sheet.setOperatorId(userId);//设置操作人id
+        User user = userMapper.selectById(userId);
+        sheet.setOwnerName(userMapper.selectById(sheet.getOwnerId()).getName());
+        sheet.setCompanyId(user.getCompanyId());
+        sheet.setStatus(1);//待审核状态
+        TimeType timeType = timeTypeMapper.selectById(user.getCompanyId());
+        if (sheet.getTimeType() == 0) {
+            //按天请假时,计算小时数
+            float v = timeType.getAllday() * sheet.getTimeDays();
+            sheet.setTimeHours(v);
+        }
+        if (isNew) {
+            //检查该时间段是否已经有按天请假
+            QueryWrapper<LeaveSheet> queryWrapper = new QueryWrapper<>();
+            queryWrapper.eq("owner_id", sheet.getOwnerId());
+            queryWrapper.le("start_date", sheet.getEndDate()).ge("end_date", sheet.getStartDate());
+
+            int count = leaveSheetMapper.selectCount(queryWrapper);
+            if (count > 0) {
+                //msg.setError("该时间段已有请假申请,不能重复请假");
+                msg.setError(MessageUtils.message("leave.repeatedLeave"));
+                return msg;
+            }
+        }
+
+        //获取第一个审批人
+        User owner = userMapper.selectById(sheet.getOwnerId());
+        if (owner.getDepartmentId() == 0) {
+            //没有部门,不能提交请假申请
+            msg.setError("请联系管理员设置您所在部门");
+            return msg;
+        } else {
+            List<AuditWorkflowSetting> auditList = auditWorkflowSettingService.get(owner.getDepartmentId(), AuditWorkflowSettingController.TYPE_LEAVE);
+            if (auditList.size() > 0) {
+                AuditWorkflowSetting workflowNode = auditList.get(0);
+                if (workflowNode.getAuditorType() == 1) {
+                    //部门负责人
+                    Department dept = departmentMapper.selectById(workflowNode.getAuditDeptId());
+                    if (dept.getManagerId() == null) {
+                        msg.setError("请联系管理员设置您所在部门的主要负责人");
+                        return msg;
+                    }
+                    sheet.setAuditorId(dept.getManagerId());
+                    sheet.setAuditorName(userMapper.selectById(dept.getManagerId()).getName());
+                } else if (workflowNode.getAuditorType() == 2) {
+                    //指定一个人审批
+                    sheet.setAuditorId(workflowNode.getUserId());
+                    sheet.setAuditorName(workflowNode.getUserName());
+                }
+                sheet.setCurAuditSettingId(workflowNode.getId());
+            }
+        }
+
+        if (isNew) {
+            leaveSheetMapper.insert(sheet);
+        } else {
+            //编辑修改
+            leaveSheetMapper.updateById(sheet);
+            //之前的审批流程要删除
+            leaveAuditLogMapper.delete(new QueryWrapper<LeaveAuditLog>().eq("sheet_id", sheet.getId()));
+        }
+        sheet = leaveSheetMapper.selectById(sheet.getId());
+        saveNotifyToAuditor(sheet);
+        WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", user.getCompanyId()));
+        if (wxCorpInfo != null) {
+            sendAuditNotifyMsg(wxCorpInfo, user, sheet);
+        }
+        return msg;
+    }
+
+    //发送审核结果消息提醒
+    private void sendAuditResult(WxCorpInfo wxCorpInfo, User auditor, LeaveSheet sheet, String denyReason) {
+        //推送到企业微信
+        JSONObject json=new JSONObject();
+        JSONArray dataJson=new JSONArray();
+        JSONObject jsonObj=new JSONObject();
+        jsonObj.put("key", "审核结果");
+        jsonObj.put("value",sheet.getStatus() == 0?"通过":"驳回");
+//        jsonObj.put("value",("$userName="+applier.getCorpwxUserid()+"$"));
+        JSONObject jsonObj1=new JSONObject();
+        jsonObj1.put("key", "审核人");
+        jsonObj1.put("value",("$userName="+auditor.getCorpwxUserid()+"$"));
+        String applyTimeDesc = "";
+        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("M月d日");
+        if (sheet.getStartDate().isEqual(sheet.getEndDate())) {
+            applyTimeDesc = dateTimeFormatter.format(sheet.getStartDate()) + ", "+sheet.getTimeHours()+"小时";
+        } else {
+            applyTimeDesc = dateTimeFormatter.format(sheet.getStartDate()) +"至" + dateTimeFormatter.format(sheet.getEndDate()) + ", "+sheet.getTimeHours()+"小时";
+        }
+
+        JSONObject jsonObj2=new JSONObject();
+        jsonObj2.put("key", "请假时间");
+        jsonObj2.put("value",applyTimeDesc);
+        JSONObject jsonObj4=new JSONObject();
+        jsonObj4.put("key", "备注");
+        jsonObj4.put("value",sheet.getStatus()==2?("原因:"+denyReason):"请假申请通过了");
+        dataJson.add(jsonObj);
+        dataJson.add(jsonObj1);
+        dataJson.add(jsonObj2);
+        dataJson.add(jsonObj4);
+        json.put("template_id","tty9TkCAAARfwRKiqfj47qNE70KvGhqg");
+        json.put("url","https://open.weixin.qq.com/connect/oauth2/authorize?appid=wwdd1137a65ce0fc87&redirect_uri=http://crm.ttkuaiban.com/api/corpWXAuth&response_type=code&scope=snsapi_base&state=leave#wechat_redirect");
+        json.put("content_item",dataJson);
+        String ownerId = sheet.getOwnerId();
+        User owner = userMapper.selectById(ownerId);
+        wxCorpInfoService.sendWXCorpTemplateMsg(wxCorpInfo,owner.getCorpwxUserid(), json);
+    }
+
+    private void saveNotifyToApplier(LeaveSheet sheet) {
+        //推送到企业微信
+        String applyTimeDesc = "";
+        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("M月d日");
+        if (sheet.getStartDate().isEqual(sheet.getEndDate())) {
+            applyTimeDesc = dateTimeFormatter.format(sheet.getStartDate()) + ", "+sheet.getTimeHours()+"小时";
+        } else {
+            applyTimeDesc = dateTimeFormatter.format(sheet.getStartDate()) +"至" + dateTimeFormatter.format(sheet.getEndDate()) + ", "+sheet.getTimeHours()+"小时";
+        }
+        String ownerId = sheet.getOwnerId();
+        User owner = userMapper.selectById(ownerId);
+        User auditor = userMapper.selectById(sheet.getAuditorId());
+        //系统内消息
+        Information information=new Information();
+        information.setUserId(owner.getId());
+        information.setTime(new Date());
+        information.setMsg("您"+applyTimeDesc + "请假申请审核"+(sheet.getStatus() == 0?"已通过":"已驳回")+", 审核人:"
+                +(auditor.getCorpwxUserid() != null ? ("$userName="+auditor.getCorpwxUserid()+"$"):auditor.getName()));
+        information.setType(4);
+        information.setContent(sheet.getId()+"");
+        information.setPath("/leave-sheet");
+        informationMapper.insert(information);
+    }
+
+    private void saveNotifyToAuditor(LeaveSheet sheet) {
+        //系统内消息
+        Information information=new Information();
+        information.setUserId(sheet.getAuditorId());
+        information.setTime(new Date());
+        User owner = userMapper.selectById(sheet.getOwnerId());
+        information.setMsg("请假待审核, 请假人:" + (owner.getCorpwxUserid() != null?("$userName="+owner.getCorpwxUserid()+"$"):owner.getName()));
+        information.setType(4);
+        information.setContent(sheet.getId()+"");
+        information.setPath("/leave-sheet");
+        informationMapper.insert(information);
+    }
+
+    //发送待审核提醒
+    private void sendAuditNotifyMsg(WxCorpInfo wxCorpInfo, User applier, LeaveSheet sheet) {
+        //推送到企业微信
+        JSONObject json=new JSONObject();
+        JSONArray dataJson=new JSONArray();
+        JSONObject jsonObj=new JSONObject();
+        jsonObj.put("key", "请假人");
+        jsonObj.put("value",("$userName="+applier.getCorpwxUserid()+"$"));
+        JSONObject jsonObj1=new JSONObject();
+        jsonObj1.put("key", "请假类型");
+        jsonObj1.put("value",LEAVE_TYPES[sheet.getLeaveType()]);
+        String applyTimeDesc = "";
+        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("M月d日");
+        if (sheet.getStartDate().isEqual(sheet.getEndDate())) {
+            applyTimeDesc = dateTimeFormatter.format(sheet.getStartDate()) + ", "+sheet.getTimeHours()+"小时";
+        } else {
+            applyTimeDesc = dateTimeFormatter.format(sheet.getStartDate()) +"至" + dateTimeFormatter.format(sheet.getEndDate()) + ", "+sheet.getTimeHours()+"小时";
+        }
+
+        JSONObject jsonObj2=new JSONObject();
+        jsonObj2.put("key", "请假时间");
+        jsonObj2.put("value",applyTimeDesc);
+        JSONObject jsonObj4=new JSONObject();
+        jsonObj4.put("key", "备注");
+        jsonObj4.put("value",sheet.getRemark()==null?"":sheet.getRemark());
+        dataJson.add(jsonObj);
+        dataJson.add(jsonObj1);
+        dataJson.add(jsonObj2);
+        dataJson.add(jsonObj4);
+        json.put("template_id","tty9TkCAAA4WvYmTnsAVoUmdYxHdSG9A");
+        json.put("url","https://open.weixin.qq.com/connect/oauth2/authorize?appid=wwdd1137a65ce0fc87&redirect_uri=http://crm.ttkuaiban.com/api/corpWXAuth&response_type=code&scope=snsapi_base&state=leave#wechat_redirect");
+        json.put("content_item",dataJson);
+        String auditorId = sheet.getAuditorId();
+        User auditor = userMapper.selectById(auditorId);
+        wxCorpInfoService.sendWXCorpTemplateMsg(wxCorpInfo,auditor.getCorpwxUserid(), json);
+    }
+
+    @Override
+    public HttpRespMsg delete(Integer id) {
+        leaveSheetMapper.deleteById(id);
+        return new HttpRespMsg();
+    }
+
+    @Override
+    public HttpRespMsg queryList(LeaveSheet sheet, Integer pageIndex, Integer pageSize) {
+        QueryWrapper<LeaveSheet> queryWrapper = new QueryWrapper<LeaveSheet>();
+        String token = request.getHeader("TOKEN");
+        User user = userMapper.selectById(token);
+
+        List<SysRichFunction> functionList = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "查看全部请假单");
+        if (functionList.size() == 0) {
+            //部门负责人可以看这个部门的
+            List<Integer> mdids = departmentService.getAllManagedDeptIdList(user, null);
+//            List<Department> departmentList = departmentMapper.selectList(new QueryWrapper<Department>().eq("manager_id", user.getId()));
+            if (mdids.size() > 0) {
+                //负责的部门的人员
+                //先是自己的
+                List<String> userIds = new ArrayList<>();
+                userIds.add(user.getId());
+                List<User> userList = userMapper.selectList(new QueryWrapper<User>().select("id").in("department_id", mdids));
+                List<String> collect = userList.stream().map(User::getId).collect(Collectors.toList());
+                userIds.addAll(collect);
+                queryWrapper.in("owner_id", userIds);
+            } else {
+                //普通员工只能看自己的
+                sheet.setOwnerId(user.getId());
+            }
+        }
+        sheet.setCompanyId(user.getCompanyId());
+
+        HttpRespMsg httpRespMsg = new HttpRespMsg();
+        queryWrapper.eq("company_id", sheet.getCompanyId()).orderByDesc("id");
+
+        //增加状态
+        if (sheet.getStatus() != null) {
+            queryWrapper.eq("status", sheet.getStatus());
+        }
+        if (!StringUtils.isEmpty(sheet.getOwnerId())) {
+            queryWrapper.eq("owner_id", sheet.getOwnerId());
+        }
+        if (sheet.getLeaveType() != null) {
+            queryWrapper.eq("leave_type", sheet.getLeaveType());
+        }
+        if (sheet.getStartDate() != null && sheet.getEndDate() != null) {
+            queryWrapper.le("start_date", sheet.getEndDate()).ge("end_date", sheet.getStartDate());
+        }
+        IPage<LeaveSheet> listIPager = leaveSheetMapper.selectPage(new Page<>(pageIndex, pageSize),
+                queryWrapper);
+        List<LeaveSheet> records = listIPager.getRecords();
+        List<String> userIds = records.stream().map(LeaveSheet::getOwnerId).collect(Collectors.toList());
+        if (userIds.size() > 0) {
+            List<User> userList = userMapper.getUserWithDept(new QueryWrapper<User>().in("id", userIds));
+            records.stream().forEach(r->{
+                Optional<User> find = userList.stream().filter(u->u.getId().equals(r.getOwnerId())).findFirst();
+                if (find.isPresent()) {
+                    r.setDept(find.get().getDepartmentName());
+                }
+            });
+        }
+
+        Long total = listIPager.getTotal();
+
+        Map<String, Object> map = new HashMap<>();
+        map.put("records", records);
+        map.put("total", total);
+        httpRespMsg.data = map;
+        return httpRespMsg;
+    }
+
+    @Override
+    public HttpRespMsg approve(Integer id) {
+        String token = request.getHeader("TOKEN");
+        //检查操作人权限
+        User user = userMapper.selectById(token);
+        HttpRespMsg httpRespMsg = new HttpRespMsg();
+        LeaveSheet originSheet = leaveSheetMapper.selectById(id);
+        if (user.getId().equals(originSheet.getAuditorId())) {
+            //是当前的审核人,获取下个审核节点
+            AuditWorkflowSetting auditWorkflowSetting = auditWorkflowSettingMapper.selectById(originSheet.getCurAuditSettingId());
+            LeaveSheet sheet = new LeaveSheet();
+            sheet.setId(id);
+            if (auditWorkflowSetting == null) {
+                //当前审核节点已不存在,直接审核通过
+                sheet.setStatus(0);
+            } else {
+                Integer seq = auditWorkflowSetting.getSeq();
+                AuditWorkflowSetting nextAuditNode = auditWorkflowSettingMapper.selectOne(new QueryWrapper<AuditWorkflowSetting>().eq("type", 1).eq("seq", (seq + 1)).eq("dept_id", auditWorkflowSetting.getDeptId()));
+                if (nextAuditNode == null) {
+                    sheet.setStatus(0);
+                } else {
+                    //进入下个审核节点
+                    if (nextAuditNode.getAuditorType() == 1) {
+                        //部门负责人审核
+                        Department department = departmentMapper.selectById(nextAuditNode.getAuditDeptId());
+                        if (department == null) {
+                            //部门已被删除,直接审核通过
+                            sheet.setStatus(0);
+                        } else {
+                            if (department.getManagerId() == null) {
+                                httpRespMsg.setError("尚未设置下个节点的部门负责人,请联系管理员");
+                                return httpRespMsg;
+                            } else {
+                                sheet.setCurAuditSettingId(nextAuditNode.getId());
+                                sheet.setAuditorId(department.getManagerId());
+                                sheet.setAuditorName(userMapper.selectById(department.getManagerId()).getName());
+                                sheet.setAuditorType(nextAuditNode.getAuditorType());
+                            }
+                        }
+                    } else if (nextAuditNode.getAuditorType() == 2){
+                        //指定人员审核
+                        sheet.setCurAuditSettingId(nextAuditNode.getId());
+                        sheet.setAuditorId(nextAuditNode.getUserId());
+                        sheet.setAuditorName(nextAuditNode.getUserName());
+                        sheet.setAuditorType(nextAuditNode.getAuditorType());
+                    }
+                }
+            }
+            leaveSheetMapper.updateById(sheet);
+            //保存审核记录
+            saveAgreeLog(id, auditWorkflowSetting, user);
+            //最终审核通过,发送通过消息
+            sheet = leaveSheetMapper.selectById(id);
+            WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", user.getCompanyId()));
+            if (wxCorpInfo != null) {
+                if (sheet.getStatus() == 0) {
+                    //最终通过
+                    sendAuditResult(wxCorpInfo, user, sheet, null);
+                } else {
+                    //通知下个节点的审核人去审核
+                    sendAuditNotifyMsg(wxCorpInfo, user, sheet);
+                }
+            }
+            if (sheet.getStatus() == 0) {
+                //最终通过
+                saveNotifyToApplier(sheet);
+            } else {
+                //通知下个节点的审核人去审核
+                saveNotifyToAuditor(sheet);
+            }
+        }
+        return httpRespMsg;
+    }
+
+    private void saveAgreeLog(int sheetId, AuditWorkflowSetting curAuditNode, User operator) {
+        LeaveAuditLog log = new LeaveAuditLog();
+        log.setSheetId(sheetId);
+        if (curAuditNode != null) {
+            log.setAuditNodeId(curAuditNode.getId());
+        }
+        log.setAuditorId(operator.getId());
+        log.setAuditorName(operator.getName());
+        log.setIsPass(1);
+        leaveAuditLogMapper.insert(log);
+    }
+    private void saveDenyLog(int sheetId, AuditWorkflowSetting curAuditNode, User operator, String reason) {
+        LeaveAuditLog log = new LeaveAuditLog();
+        log.setSheetId(sheetId);
+        if (curAuditNode != null) {
+            log.setAuditNodeId(curAuditNode.getId());
+        }
+        log.setAuditorId(operator.getId());
+        log.setAuditorName(operator.getName());
+        log.setIsPass(0);
+        log.setDenyReason(reason);
+        leaveAuditLogMapper.insert(log);
+    }
+
+
+    @Override
+    public HttpRespMsg deny(Integer id, String reason) {
+        String token = request.getHeader("TOKEN");
+        //检查操作人权限
+        User user = userMapper.selectById(token);
+        HttpRespMsg httpRespMsg = new HttpRespMsg();
+        LeaveSheet originSheet = leaveSheetMapper.selectById(id);
+        if (user.getId().equals(originSheet.getAuditorId())) {
+            //是当前的审核人,获取当前审核节点
+            AuditWorkflowSetting auditWorkflowSetting = auditWorkflowSettingMapper.selectById(originSheet.getCurAuditSettingId());
+            LeaveSheet sheet = new LeaveSheet();
+            sheet.setId(id);
+            sheet.setStatus(2);
+            leaveSheetMapper.updateById(sheet);
+            saveDenyLog(id, auditWorkflowSetting, user, reason);
+            sheet = leaveSheetMapper.selectById(id);
+            WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", user.getCompanyId()));
+            if (wxCorpInfo != null) {
+                sendAuditResult(wxCorpInfo, user, sheet, reason);
+            }
+            saveNotifyToApplier(sheet);
+        }
+
+        return httpRespMsg;
+    }
+
+    @Override
+    public HttpRespMsg summaryData(String keyword, String startDate, String endDate, String userId) {
+        Integer companyId = userMapper.selectById(userId).getCompanyId();
+        HttpRespMsg msg = new HttpRespMsg();
+        msg.data = leaveSheetMapper.summaryData(keyword, startDate, endDate, companyId);
+        return msg;
+    }
+
+    @Override
+    public HttpRespMsg getOTAvaiDays(String userId) {
+        HttpRespMsg msg = new HttpRespMsg();
+        String startDate = null;
+        User user = userMapper.selectById(userId);
+
+        if (user.getCompanyId() == 7) {
+            //火石闪信,从2023年8月1日开始计算加班工时
+            startDate = "2023-08-01";
+            //获取startDate之前的,2023年的全部非工作日加班
+            String firstDay = "2023-01-01";
+            String endDate = startDate;
+            List<String> allHolidays = WorkDayCalculateUtils.getAllHolidays(firstDay, endDate);
+            double beforeHours = 0;
+            if (allHolidays.size() > 0) {
+                List<Report> reportList = reportMapper.selectList(new QueryWrapper<Report>().select("IFNULL(sum(overtime_hours),0) as working_time").in("create_date", allHolidays).eq("creator_id", userId));
+                double sum = reportList.stream().mapToDouble(Report::getWorkingTime).sum();
+                beforeHours = sum;
+            }
+
+            //只统计2023年1月1日之后的调休假
+            List<LeaveSheet> list = leaveSheetMapper.selectList(new QueryWrapper<LeaveSheet>()
+                    .eq("owner_id", userId).eq("leave_type", exLeaveDay).ne("status", 2).ne("status", 3).ge("start_date", firstDay));
+            double alreadyHours = list.stream().mapToDouble(LeaveSheet::getTimeHours).sum();
+            double overtime = reportMapper.getMyOvertime(userId, startDate);
+            double leftHours = beforeHours + overtime - alreadyHours;
+            if (leftHours < 0) {
+                leftHours = 0;
+            }
+            float allDayHours = timeTypeMapper.selectById(userMapper.selectById(userId).getCompanyId()).getAllday();
+            double d = leftHours/allDayHours;
+            msg.data = d;
+        } else {
+            //非驳回和撤回状态的都要统计进去
+            List<LeaveSheet> list = leaveSheetMapper.selectList(new QueryWrapper<LeaveSheet>().eq("owner_id", userId).eq("leave_type", exLeaveDay).ne("status", 2).ne("status", 3));
+            double alreadyHours = list.stream().mapToDouble(LeaveSheet::getTimeHours).sum();
+            double overtime = reportMapper.getMyOvertime(userId, startDate);
+            double leftHours = overtime - alreadyHours;
+            if (leftHours < 0) {
+                leftHours = 0;
+            }
+            float allDayHours = timeTypeMapper.selectById(userMapper.selectById(userId).getCompanyId()).getAllday();
+            double d = leftHours/allDayHours;
+            msg.data = d;
+        }
+
+        return msg;
+    }
+
+
+    @Override
+    public HttpRespMsg exportLeaveData(String userId,Integer status,Integer leaveType,String startTime,String endTime) {
+        HttpRespMsg httpRespMsg = new HttpRespMsg();
+        Integer companyId = userMapper.selectById(userId).getCompanyId();
+        WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", companyId));
+        List<User> userList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", companyId).select("id","name","corpwx_userid"));
+        String token = request.getHeader("TOKEN");
+        User user = userMapper.selectById(token);
+        QueryWrapper<LeaveSheet> queryWrapper = new QueryWrapper<>();
+        LeaveSheet sheet = new LeaveSheet();
+        List<SysRichFunction> functionList = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "查看全部请假单");
+        if (functionList.size() == 0) {
+            //部门负责人可以看这个部门的
+            List<Integer> mdids = departmentService.getAllManagedDeptIdList(user, null);
+//            List<Department> departmentList = departmentMapper.selectList(new QueryWrapper<Department>().eq("manager_id", user.getId()));
+            if (mdids.size() > 0) {
+                //负责的部门的人员
+                //先是自己的
+                List<String> userIds = new ArrayList<>();
+                userIds.add(user.getId());
+                List<User> deptUserList = userMapper.selectList(new QueryWrapper<User>().select("id").in("department_id", mdids));
+                List<String> collect = deptUserList.stream().map(User::getId).collect(Collectors.toList());
+                userIds.addAll(collect);
+                queryWrapper.in("owner_id", userIds);
+            } else {
+                //普通员工只能看自己的
+                sheet.setOwnerId(user.getId());
+            }
+        }
+        sheet.setCompanyId(user.getCompanyId());
+
+        queryWrapper.eq("company_id", sheet.getCompanyId()).orderByDesc("id");
+        //增加状态
+        if (sheet.getStatus() != null) {
+            queryWrapper.eq("status", sheet.getStatus());
+        }
+        if (!StringUtils.isEmpty(sheet.getOwnerId())) {
+            queryWrapper.eq("owner_id", sheet.getOwnerId());
+        }
+        if (sheet.getLeaveType() != null) {
+            queryWrapper.eq("leave_type", leaveType);
+        }
+        if (sheet.getStartDate() != null && sheet.getEndDate() != null) {
+            queryWrapper.le("start_date", startTime).ge("end_date", endTime);
+        }
+
+        List<LeaveSheet> leaveSheets = leaveSheetMapper.selectList(queryWrapper);
+        if (leaveSheets.size()==0){
+            return httpRespMsg;
+        };
+        List<List<String>> allList = new ArrayList<>();
+        List<String> headList = new ArrayList<String>();
+//        headList.add("请假人");
+//        headList.add("电话");
+//        headList.add("请假类型");
+//        headList.add("请假开始时间");
+//        headList.add("请假结束时间");
+//        headList.add("请假天数");
+//        headList.add("请假时长");
+//        headList.add("状态");
+//        headList.add("备注");
+        headList.add(MessageUtils.message("leave.perForLeave"));
+        headList.add(MessageUtils.message("leave.telephone"));
+        headList.add(MessageUtils.message("leave.leaveType"));
+        headList.add(MessageUtils.message("leave.LStartTime"));
+        headList.add(MessageUtils.message("leave.LEndTime"));
+        headList.add(MessageUtils.message("leave.LDays"));
+        headList.add(MessageUtils.message("leave.duration"));
+        headList.add(MessageUtils.message("leave.state"));
+        headList.add(MessageUtils.message("leave.remark"));
+        allList.add(headList);
+        for (LeaveSheet leaveSheet : leaveSheets) {
+            List<String> item = new ArrayList<>();
+            Boolean present = userList.stream().filter(ul -> ul.getId().equals(leaveSheet.getOwnerId())).findFirst().isPresent();
+            if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                if (present){
+                    User us = userList.stream().filter(ul -> ul.getId().equals(leaveSheet.getOwnerId())).findFirst().get();
+                    item.add("$userName="+(us.getCorpwxUserid()==null?"":us.getCorpwxUserid())+"$");
+                }else {
+                    item.add("");
+                }
+            }else {
+                item.add(leaveSheet.getOwnerName()==null?"":leaveSheet.getOwnerName());
+            }
+            item.add(leaveSheet.getTel()==null?"":leaveSheet.getTel());
+            String lts = "";
+            switch (leaveSheet.getLeaveType()){
+                case 0:
+                    lts = MessageUtils.message("leave.thing");
+                    break;
+                case 1:
+                    lts = MessageUtils.message("leave.illness");
+                    break;
+                case 2:
+                    lts = MessageUtils.message("leave.year");
+                    break;
+                case 3:
+                    lts = MessageUtils.message("leave.maternity");
+                    break;
+                case 4:
+                    lts = MessageUtils.message("leave.marry");
+                    break;
+                case 5:
+                    lts = MessageUtils.message("leave.die");
+                    break;
+                case 6:
+                    lts = MessageUtils.message("leave.compensatory");
+                    break;
+                case 7:
+                    lts = MessageUtils.message("leave.paternity");
+                    break;
+                case 8:
+                    lts = MessageUtils.message("leave.other");
+                    break;
+            }
+            item.add(lts);
+            DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+            String sds = leaveSheet.getStartDate().format(df);
+            String eds = leaveSheet.getEndDate().format(df);
+            item.add(sds);
+            item.add(eds);
+            item.add(leaveSheet.getTimeDays()==null?"":leaveSheet.getTimeDays().toString());
+            item.add(leaveSheet.getTimeHours()==null?"":leaveSheet.getTimeHours().toString());
+            Optional<User> first = userList.stream().filter(u -> u.getId().equals(leaveSheet.getAuditorId())).findFirst();
+            String auditorName = first.isPresent()?first.get().getName():"";
+            //转译处理
+            if (wxCorpInfo != null && wxCorpInfo.getSaasSyncContact() == 1) {
+                auditorName = "$userName="+auditorName+"$";
+            }
+            String statusS = "";
+            switch (leaveSheet.getStatus()){
+                case 0:
+                    //statusS = "审核通过";
+                    statusS = MessageUtils.message("stages.approved");
+                    break;
+                case 1:
+                    //statusS = "待审核";
+                    statusS = MessageUtils.message("stages.reviewed")
+                            + "-" + auditorName;
+                    break;
+                case 2:
+                    //statusS = "驳回";
+                    statusS = MessageUtils.message("stages.reject");
+                    break;
+                case 3:
+                    //statusS = "已撤销";
+                    statusS = MessageUtils.message("stages.withdrawn");
+                    break;
+            }
+            item.add(statusS);
+            item.add(leaveSheet.getRemark());
+            allList.add(item);
+        }
+        //String fileName = "请假信息_"+System.currentTimeMillis();
+        String fileName = MessageUtils.message("fileName.leaveInfo")+System.currentTimeMillis();
+        try {
+            return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,fileName , allList, path);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return httpRespMsg;
+    }
+
+    @Override
+    public HttpRespMsg cancel(Integer id, String userId) {
+        HttpRespMsg msg = new HttpRespMsg();
+        LeaveSheet oldSheet = leaveSheetMapper.selectById(id);
+        if (oldSheet.getStatus() == 0) {
+            msg.setError("当前请假申请已通过,无法撤销");
+        } else if (oldSheet.getStatus() == 2) {
+            msg.setError("当前请假申请已驳回,无法撤销");
+        } else {
+            LeaveSheet sheet = new LeaveSheet();
+            sheet.setId(id);
+            sheet.setStatus(3);//撤销状态
+            leaveSheetMapper.updateById(sheet);
+            //删除相关的审批记录
+            leaveAuditLogMapper.delete(new QueryWrapper<LeaveAuditLog>().eq("sheet_id", id));
+        }
+        return msg;
+    }
+
+    @Override
+    public HttpRespMsg auditList(LeaveSheet sheet, Integer pageIndex, Integer pageSize) {
+        QueryWrapper<LeaveSheet> queryWrapper = new QueryWrapper<LeaveSheet>();
+        String token = request.getHeader("TOKEN");
+        User user = userMapper.selectById(token);
+
+        sheet.setCompanyId(user.getCompanyId());
+
+        HttpRespMsg httpRespMsg = new HttpRespMsg();
+        queryWrapper.eq("company_id", sheet.getCompanyId()).orderByDesc("id");
+        queryWrapper.eq("status", 1);
+        queryWrapper.eq("auditor_id", user.getId());
+
+        if (!StringUtils.isEmpty(sheet.getOwnerId())) {
+            queryWrapper.eq("owner_id", sheet.getOwnerId());
+        }
+        if (sheet.getLeaveType() != null) {
+            queryWrapper.eq("leave_type", sheet.getLeaveType());
+        }
+        if (sheet.getStartDate() != null && sheet.getEndDate() != null) {
+            queryWrapper.le("start_date", sheet.getEndDate()).ge("end_date", sheet.getStartDate());
+        }
+        IPage<LeaveSheet> listIPager = leaveSheetMapper.selectPage(new Page<>(pageIndex, pageSize),
+                queryWrapper);
+        List<LeaveSheet> records = listIPager.getRecords();
+        List<String> userIds = records.stream().map(LeaveSheet::getOwnerId).collect(Collectors.toList());
+        if (userIds.size() > 0) {
+            List<User> userList = userMapper.getUserWithDept(new QueryWrapper<User>().in("id", userIds));
+            records.stream().forEach(r->{
+                Optional<User> find = userList.stream().filter(u->u.getId().equals(r.getOwnerId())).findFirst();
+                if (find.isPresent()) {
+                    r.setDept(find.get().getDepartmentName());
+                }
+            });
+        }
+
+        Long total = listIPager.getTotal();
+
+        Map<String, Object> map = new HashMap<>();
+        map.put("records", records);
+        map.put("total", total);
+        httpRespMsg.data = map;
+        return httpRespMsg;
+    }
+
+    /**
+     * 返回某段时间内请假时间总和
+     * @param companyId
+     * @param startDate
+     * @param endDate
+     * @param standardHours 该月总工时
+     * @param allDay 该公司每天工时
+     * @param leaveSheets
+     * @return
+     */
+    @Override
+    public float leaveTimeSum(Integer companyId, String startDate, String endDate, float standardHours, float allDay, List<LeaveSheet> leaveSheets) {
+        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        LocalDate localStartDate = LocalDate.parse(startDate, dateTimeFormatter);
+        LocalDate localEndDate = LocalDate.parse(endDate, dateTimeFormatter);
+        float leaveTime = 0;
+        for (LeaveSheet leaveSheet : leaveSheets) {
+            //请假期间的工作日
+            int leaveDays = WorkDayCalculateUtils.getWorkDaysListInRange(leaveSheet.getStartDate().toString(), leaveSheet.getEndDate().toString(), 0).size();
+            //当请假时间在筛选时间段内
+            if ((leaveSheet.getStartDate().isEqual(localStartDate) || leaveSheet.getStartDate().isAfter(localStartDate)) && (leaveSheet.getEndDate().isEqual(localEndDate) || leaveSheet.getEndDate().isBefore(localEndDate))){
+                //请假期间的非工作日
+                int nonWorkDays = WorkDayCalculateUtils.getNonWorkDaysListInRange(leaveSheet.getStartDate().toString(), leaveSheet.getEndDate().toString()).size();
+                if (leaveSheet.getStartDate().isEqual(leaveSheet.getEndDate()) || nonWorkDays == 0){
+                    leaveTime+=leaveSheet.getTimeHours();
+                }else {
+                    leaveTime+= leaveDays * allDay;
+                }
+            }else{
+                //请假时间首尾超出
+                if(leaveSheet.getStartDate().isBefore(localStartDate) && leaveSheet.getEndDate().isAfter(localEndDate)){
+                    leaveTime+= standardHours;
+                }else {
+                    //当请假时间开始时间超出
+                    if (leaveSheet.getStartDate().isBefore(localStartDate)){
+                        //超出的天数
+                        int startDay = WorkDayCalculateUtils.getWorkDaysListInRange(leaveSheet.getStartDate().toString(), localStartDate.minusDays(1).toString(), 0).size();
+                        float DifDay = leaveDays - startDay;
+                        leaveTime+= allDay*DifDay;
+                    }else {
+                        //当请假时间结束时间超出
+                        //超出的天数
+                        int endDay = WorkDayCalculateUtils.getWorkDaysListInRange(localEndDate.plusDays(1).toString(),leaveSheet.getEndDate().toString(),  0).size();
+                        float DifDay = leaveDays - endDay;
+                        leaveTime+= allDay*DifDay;
+                    }
+                }
+            }
+        }
+        leaveTime = new BigDecimal(leaveTime).setScale(1,BigDecimal.ROUND_HALF_UP).floatValue();
+        return leaveTime;
+    }
+
+    /**
+     * 计算两个日期之间的工作日
+     * @param startDate
+     * @param endDate
+     * @return
+     */
+    @Override
+    public HttpRespMsg leaveDays(String startDate, String endDate) {
+        HttpRespMsg httpRespMsg = new HttpRespMsg();
+        Integer leaveDays = 0;
+        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        LocalDate localStartDate = LocalDate.parse(startDate, dateTimeFormatter);
+        LocalDate localEndDate = LocalDate.parse(endDate, dateTimeFormatter);
+        if (localStartDate.isBefore(localEndDate) || localStartDate.isEqual(localEndDate)){
+            leaveDays = WorkDayCalculateUtils.getWorkDaysListInRange(startDate, endDate, 0).size();
+        }
+        httpRespMsg.data = leaveDays;
+        return httpRespMsg;
+    }
+}

+ 97 - 1
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/ProductServiceImpl.java

@@ -98,6 +98,7 @@ public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> impl
 
     @Override
     public HttpRespMsg getList(Integer companyId,String userId, String productName, String productCode,Integer productType,Integer status,String startDate,String endDate, Integer pageIndex, Integer pageSize) {
+        System.out.println("endDate=="+endDate);
         HttpRespMsg msg=new HttpRespMsg();
         User targetUsr = userMapper.selectById(request.getHeader("token"));
         List<Department> departments = departmentMapper.selectList(new LambdaQueryWrapper<Department>().eq(Department::getCompanyId, companyId));
@@ -161,7 +162,7 @@ public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> impl
             queryWrapper.eq(Product::getStatus,status);
         }
         if(startDate!=null && endDate!=null){
-            DateTimeFormatter df=DateTimeFormatter.ofPattern("yyyy-MM-dd");
+            DateTimeFormatter df = startDate.length() > 10? DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"):DateTimeFormatter.ofPattern("yyyy-MM-dd");
             LocalDateTime start = LocalDate.parse(startDate, df).atTime(LocalTime.MIN);
             LocalDateTime end = LocalDate.parse(endDate, df).atTime(LocalTime.MAX);
             queryWrapper.between(Product::getCreateTime,start,end);
@@ -912,4 +913,99 @@ public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> impl
         msg.setData(opportunityList);
         return msg;
     }
+
+    @Override
+    public HttpRespMsg exportDataAI(String startDate, String endDate, HttpServletRequest request) throws Exception {
+        System.out.println("exportDataAI, 接收到参数startDate==="+startDate);
+        User user = userMapper.selectById(request.getHeader("token"));
+        SysForm sysForm = sysFormMapper.selectOne(new LambdaQueryWrapper<SysForm>().eq(SysForm::getCompanyId, user.getCompanyId()).eq(SysForm::getCode, "Product").eq(SysForm::getIsCurrent, 1));
+        WxCorpInfo wxCorpInfo = wxCorpInfoService.getOne(new LambdaQueryWrapper<WxCorpInfo>().eq(WxCorpInfo::getCompanyId, user.getCompanyId()));
+        String config = sysForm.getConfig();
+        JSONObject configOb = JSON.parseObject(config);
+        JSONArray configObJSONArray = configOb.getJSONArray("list");
+        List<List<String>> dataList=new ArrayList<>();
+        List<String> titleList=new ArrayList<>();
+        for (int i = 0; i < configObJSONArray.size(); i++) {
+            JSONObject item = configObJSONArray.getJSONObject(i);
+            titleList.add(item.getString("label"));
+        }
+        dataList.add(titleList);
+        HttpRespMsg respMsg = getList(user.getCompanyId(), null, null, null,null,null,startDate,endDate, null, null);
+        Map<String, Object> msgData = (Map<String, Object>) respMsg.getData();
+        List<Product> productList = (List<Product>) msgData.get("record");
+        for (Product product : productList) {
+            List<String> item=new ArrayList<>();
+            for (int i = 0; i < configObJSONArray.size(); i++) {
+                JSONObject target = configObJSONArray.getJSONObject(i);
+                if(target.getString("type").equals("grid")){
+                    JSONArray columns = target.getJSONArray("columns");
+                    for (int i1 = 0; i1 < columns.size(); i1++) {
+                        JSONObject columnsJSONObject = columns.getJSONObject(i1);
+                        JSONArray list = columnsJSONObject.getJSONArray("list");
+                        for (int i2 = 0; i2 < list.size(); i2++) {
+                            JSONObject object = list.getJSONObject(i2);
+                            String model = object.getString("model");
+                            String targetName = model.substring(0, 1).toUpperCase() + model.substring(1);
+                            Class<? extends Product> aClass = product.getClass();
+                            String value = String.valueOf(aClass.getMethod("get" + targetName).invoke(product)==null?"":aClass.getMethod("get" + targetName).invoke(product));
+                            if(model.equals("inchargerId")){
+                                if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                                    if(null != aClass.getMethod("getInchargerName").invoke(product)){
+                                        value = "$userName="+String.valueOf(aClass.getMethod("getInchargerName").invoke(product))+"$";
+                                    }
+//                                    value = "$userName="+String.valueOf(aClass.getMethod("getInchargerName").invoke(product))+"$";
+                                }else {
+                                    value = String.valueOf(null == aClass.getMethod("getInchargerName").invoke(product)?"":aClass.getMethod("getInchargerName").invoke(product));
+                                }
+                            }
+                            if(model.equals("unit")){
+                                value = String.valueOf(null == aClass.getMethod("getUnitName").invoke(product)?"":aClass.getMethod("getUnitName").invoke(product));
+                            }
+                            if(model.equals("type")){
+                                value = String.valueOf(null == aClass.getMethod("getTypeName").invoke(product)?"":aClass.getMethod("getTypeName").invoke(product));
+                            }
+                            if(model.equals("status")){
+                                if(null != aClass.getMethod("getStatus").invoke(product)){
+                                    value = Integer.valueOf(String.valueOf(aClass.getMethod("getStatus").invoke(product)))==0?"下架":"上架";
+                                }
+//                                value = Integer.valueOf(String.valueOf(aClass.getMethod("getStatus").invoke(product)))==0?"下架":"上架";
+                            }
+                            item.add(value);
+                        }
+                    }
+                }else {
+                    String model = target.getString("model");
+                    String targetName = model.substring(0, 1).toUpperCase() + model.substring(1);
+                    Class<? extends Product> aClass = product.getClass();
+                    String value = String.valueOf(aClass.getMethod("get" + targetName).invoke(product)==null?"":aClass.getMethod("get" + targetName).invoke(product));
+                    if(model.equals("inchargerId")){
+                        if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                            if(null != aClass.getMethod("getInchargerName").invoke(product)){
+                                value = "$userName="+String.valueOf(aClass.getMethod("getInchargerName").invoke(product))+"$";
+                            }
+//                            value = "$userName="+String.valueOf(aClass.getMethod("getInchargerName").invoke(product))+"$";
+                        }else {
+                            value = String.valueOf(null == aClass.getMethod("getInchargerName").invoke(product)?"":aClass.getMethod("getInchargerName").invoke(product));
+                        }
+                    }
+                    if(model.equals("unit")){
+                        value = String.valueOf(null == aClass.getMethod("getUnitName").invoke(product)?"":aClass.getMethod("getUnitName").invoke(product));
+                    }
+                    if(model.equals("type")){
+                        value = String.valueOf(null == aClass.getMethod("getTypeName").invoke(product)?"":aClass.getMethod("getTypeName").invoke(product));
+                    }
+                    if(model.equals("status")){
+                        if(null != aClass.getMethod("getStatus").invoke(product)){
+                            value = Integer.valueOf(String.valueOf(aClass.getMethod("getStatus").invoke(product)))==0?"下架":"上架";
+                        }
+//                        value = Integer.valueOf(String.valueOf(aClass.getMethod("getStatus").invoke(product)))==0?"下架":"上架";
+                    }
+                    item.add(value);
+                }
+            }
+            dataList.add(item);
+        }
+        String fileName="产品表AI_"+ System.currentTimeMillis();
+        return excelExportService.exportGeneralExcelByTitleAndListAI(fileName,dataList,path);
+    }
 }

Fichier diff supprimé car celui-ci est trop grand
+ 13517 - 13519
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java


+ 184 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/ReportExtraDegreeServiceImpl.java

@@ -0,0 +1,184 @@
+package com.management.platform.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.management.platform.entity.ReportExtraDegree;
+import com.management.platform.entity.TimeType;
+import com.management.platform.entity.User;
+import com.management.platform.entity.WxCorpInfo;
+import com.management.platform.mapper.ReportExtraDegreeMapper;
+import com.management.platform.mapper.TimeTypeMapper;
+import com.management.platform.mapper.UserMapper;
+import com.management.platform.mapper.WxCorpInfoMapper;
+import com.management.platform.service.ExcelExportService;
+import com.management.platform.service.ReportExtraDegreeService;
+import com.management.platform.util.ExcelUtil;
+import com.management.platform.util.HttpRespMsg;
+import com.management.platform.util.MessageUtils;
+import com.qq.weixin.mp.aes.WXBizMsgCrypt;
+import org.apache.poi.EncryptedDocumentException;
+import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
+import org.apache.poi.ss.usermodel.Row;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.usermodel.Workbook;
+import org.apache.poi.ss.usermodel.WorkbookFactory;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.io.*;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2021-12-16
+ */
+@Service
+public class ReportExtraDegreeServiceImpl extends ServiceImpl<ReportExtraDegreeMapper, ReportExtraDegree> implements ReportExtraDegreeService {
+    @Value(value = "${upload.path}")
+    String path;
+    @Resource
+    ReportExtraDegreeMapper reportExtraDegreeMapper;
+    @Resource
+    UserMapper userMapper;
+    @Resource
+    TimeTypeMapper timeTypeMapper;
+    @Resource
+    WxCorpInfoMapper wxCorpInfoMapper;
+    @Resource
+    ExcelExportService excelExportService;
+    @Override
+    public HttpRespMsg importData(HttpServletRequest request, MultipartFile multipartFile) {
+        HttpRespMsg msg=new HttpRespMsg();
+        String fileName=multipartFile.getOriginalFilename();
+        File file=new File(fileName == null?"file":fileName);
+        InputStream inputStream=null;
+        OutputStream outputStream=null;
+        Integer companyId=userMapper.selectById(request.getHeader("token")).getCompanyId();
+        try {
+            inputStream= multipartFile.getInputStream();
+            outputStream=new FileOutputStream(file);
+            byte[] buffer = new byte[4096];
+            int temp = 0;
+            while ((temp = inputStream.read(buffer, 0, 4096)) != -1) {
+                outputStream.write(buffer, 0, temp);
+            }
+            inputStream.close();
+            outputStream.close();
+
+            //然后解析表格
+            Workbook workbook = WorkbookFactory.create(new FileInputStream(file));
+            DateFormat df = new SimpleDateFormat("yyyy-MM");
+            //获取公司所有客户
+            List<ReportExtraDegree> allReportExtraDegree = reportExtraDegreeMapper.selectList(new QueryWrapper<ReportExtraDegree>().eq("company_id", companyId));
+            Sheet sheet = workbook.getSheetAt(0);
+            //由于第一行需要指明列对应的标题
+            int rowNum = sheet.getLastRowNum();
+            if (rowNum == 0) {
+                //msg.setError("请填写研究中心数据");
+                msg.setError(MessageUtils.message("research.addData"));
+                return msg;
+            }
+            List<String> nameList=new ArrayList<>();
+            int dataCount = 0;
+            for (int rowIndex = 1; rowIndex <= rowNum; rowIndex++) {
+                Row row = sheet.getRow(rowIndex);
+                dataCount++;
+                if (row == null) {
+                    continue;
+                }
+                if (ExcelUtil.isRowEmpty(row)) {
+                    continue;
+                }
+                if (row.getCell(0) == null) {
+                    //msg.setError("第"+dataCount+"行缺少中心名称");
+                    msg.setError(MessageUtils.message("research.nameNull",dataCount));
+                    return msg;
+                }
+                if(nameList.contains(row.getCell(0).toString())){
+                    //msg.setError("当前导入数据存在重复中心名称["+row.getCell(0).toString()+"]");
+                    msg.setError(MessageUtils.message("research.nameRepeat",row.getCell(0).toString()));
+                    return msg;
+                }
+                nameList.add(row.getCell(0).toString());
+                ReportExtraDegree reportExtraDegree=new ReportExtraDegree();
+                List<ReportExtraDegree> collect = allReportExtraDegree.stream().filter(ap -> ap.getName().equals(row.getCell(0).toString())).collect(Collectors.toList());
+                reportExtraDegree.setName(row.getCell(0).toString());
+                reportExtraDegree.setCompanyId(companyId);
+                if(collect.size()>0){
+                    Integer id=collect.get(0).getId();
+                    reportExtraDegree.setId(id);
+                    reportExtraDegreeMapper.updateById(reportExtraDegree);
+                }else{
+                    reportExtraDegreeMapper.insert(reportExtraDegree);
+                }
+            }
+            msg.data=dataCount;
+            return msg;
+        } catch (IOException e){
+            e.printStackTrace();
+            //msg.setError("文件处理出错");
+            msg.setError(MessageUtils.message("file.error"));
+            return msg;
+        } catch (InvalidFormatException e) {
+            e.printStackTrace();
+            //msg.setError("文件格式错误,如果安装了加密软件需要先解密再上传");
+            msg.setError(MessageUtils.message("file.FormatErrorAndDecrypt"));
+            return msg;
+        }catch (EncryptedDocumentException e) {
+            e.printStackTrace();
+            //msg.setError("文件加密状态,需要先解除加密状态再上传");
+            msg.setError(MessageUtils.message("file.encryption"));
+            return msg;
+        }finally {
+            //关闭流
+            try {
+                if (outputStream != null && inputStream != null) {
+                    outputStream.close();
+                    inputStream.close();
+                    System.out.println("流已关闭");
+                }
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+//            file.deleteOnExit();//程序退出时删除临时文件
+            System.out.println(file.delete());
+        }
+    }
+
+    @Override
+    public HttpRespMsg exportData(HttpServletRequest request) {
+        HttpRespMsg httpRespMsg=new HttpRespMsg();
+        User user = userMapper.selectById(request.getHeader("token"));
+        WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", user.getCompanyId()));
+        List<ReportExtraDegree> reportExtraDegreeList = reportExtraDegreeMapper.selectList(new QueryWrapper<ReportExtraDegree>().eq("company_id", user.getCompanyId()));
+        TimeType timeType = timeTypeMapper.selectById(user.getCompanyId());
+        List<String> titleList=new ArrayList<>();
+        titleList.add(timeType.getCustomDegreeName()+MessageUtils.message("excel.name"));
+        List<List<String>> dataList=new ArrayList<>();
+        dataList.add(titleList);
+        for (ReportExtraDegree reportExtraDegree : reportExtraDegreeList) {
+            List<String> itemList=new ArrayList<>();
+            itemList.add(reportExtraDegree.getName());
+            dataList.add(itemList);
+        }
+        //生成excel文件导出
+        String fileName = timeType.getCustomDegreeName()+"_"+System.currentTimeMillis();
+        try {
+            return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,fileName , dataList, path);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return httpRespMsg;
+    }
+}

+ 20 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/ReportLogDetailServiceImpl.java

@@ -0,0 +1,20 @@
+package com.management.platform.service.impl;
+
+import com.management.platform.entity.ReportLogDetail;
+import com.management.platform.mapper.ReportLogDetailMapper;
+import com.management.platform.service.ReportLogDetailService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-09-19
+ */
+@Service
+public class ReportLogDetailServiceImpl extends ServiceImpl<ReportLogDetailMapper, ReportLogDetail> implements ReportLogDetailService {
+
+}

+ 20 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/ReportLogServiceImpl.java

@@ -0,0 +1,20 @@
+package com.management.platform.service.impl;
+
+import com.management.platform.entity.ReportLog;
+import com.management.platform.mapper.ReportLogMapper;
+import com.management.platform.service.ReportLogService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-06-24
+ */
+@Service
+public class ReportLogServiceImpl extends ServiceImpl<ReportLogMapper, ReportLog> implements ReportLogService {
+
+}

+ 20 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/ReportProfessionProgressServiceImpl.java

@@ -0,0 +1,20 @@
+package com.management.platform.service.impl;
+
+import com.management.platform.entity.ReportProfessionProgress;
+import com.management.platform.mapper.ReportProfessionProgressMapper;
+import com.management.platform.service.ReportProfessionProgressService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2021-08-29
+ */
+@Service
+public class ReportProfessionProgressServiceImpl extends ServiceImpl<ReportProfessionProgressMapper, ReportProfessionProgress> implements ReportProfessionProgressService {
+
+}

+ 20 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/ReportPushLogServiceImpl.java

@@ -0,0 +1,20 @@
+package com.management.platform.service.impl;
+
+import com.management.platform.entity.ReportPushLog;
+import com.management.platform.mapper.ReportPushLogMapper;
+import com.management.platform.service.ReportPushLogService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2023-11-17
+ */
+@Service
+public class ReportPushLogServiceImpl extends ServiceImpl<ReportPushLogMapper, ReportPushLog> implements ReportPushLogService {
+
+}

Fichier diff supprimé car celui-ci est trop grand
+ 8906 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java


+ 125 - 1
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/SalesOrderServiceImpl.java

@@ -68,7 +68,7 @@ public class SalesOrderServiceImpl extends ServiceImpl<SalesOrderMapper, SalesOr
     @Resource
     private SysDictMapper sysDictMapper;
     @Resource
-    private ExcelExportService excelExportService;
+    private ExcelExportServiceImpl excelExportService;
     @Resource
     private SysFormMapper sysFormMapper;
     @Resource
@@ -568,6 +568,130 @@ public class SalesOrderServiceImpl extends ServiceImpl<SalesOrderMapper, SalesOr
         return msg;
     }
 
+    @Override
+    public HttpRespMsg exportDataAI(String startTime, String endTime, HttpServletRequest request) throws Exception {
+        User user = userMapper.selectById(request.getHeader("token"));
+        SysForm sysForm = sysFormMapper.selectOne(new LambdaQueryWrapper<SysForm>().eq(SysForm::getCompanyId, user.getCompanyId()).eq(SysForm::getCode, "Order").eq(SysForm::getIsCurrent, 1));
+        WxCorpInfo wxCorpInfo = wxCorpInfoService.getOne(new LambdaQueryWrapper<WxCorpInfo>().eq(WxCorpInfo::getCompanyId, user.getCompanyId()));
+        String config = sysForm.getConfig();
+        JSONObject configOb = JSON.parseObject(config);
+        JSONArray configObJSONArray = configOb.getJSONArray("list");
+        List<List<String>> dataList=new ArrayList<>();
+        List<String> titleList=new ArrayList<>();
+        for (int i = 0; i < configObJSONArray.size(); i++) {
+            JSONObject item = configObJSONArray.getJSONObject(i);
+            if(item.getString("type").equals("grid")){
+                JSONArray columns = item.getJSONArray("columns");
+                for (int i1 = 0; i1 < columns.size(); i1++) {
+                    JSONObject columnsJSONObject = columns.getJSONObject(i1);
+                    JSONArray list = columnsJSONObject.getJSONArray("list");
+                    for (int i2 = 0; i2 < list.size(); i2++) {
+                        JSONObject object = list.getJSONObject(i2);
+                        titleList.add(object.getString("label"));
+                    }
+                }
+            }else {
+                titleList.add(item.getString("label"));
+            }
+        }
+        dataList.add(titleList);
+        HttpRespMsg respMsg = getList( null,null, null,null,null,null,null,startTime,endTime,null, null,null,0);
+        Map<String, Object> msgData = (Map<String, Object>) respMsg.getData();
+        List<SalesOrder> salesOrderList = (List<SalesOrder>) msgData.get("record");
+        for (SalesOrder salesOrder : salesOrderList) {
+            List<String> item=new ArrayList<>();
+            for (int i = 0; i < configObJSONArray.size(); i++) {
+                JSONObject target = configObJSONArray.getJSONObject(i);
+                if(target.getString("type").equals("grid")){
+                    JSONArray columns = target.getJSONArray("columns");
+                    for (int i1 = 0; i1 < columns.size(); i1++) {
+                        JSONObject columnsJSONObject = columns.getJSONObject(i1);
+                        JSONArray list = columnsJSONObject.getJSONArray("list");
+                        for (int i2 = 0; i2 < list.size(); i2++) {
+                            JSONObject object = list.getJSONObject(i2);
+                            String model = object.getString("model");
+                            String targetName = model.substring(0, 1).toUpperCase() + model.substring(1);
+                            Class<? extends SalesOrder> aClass = salesOrder.getClass();
+                            String value = String.valueOf(aClass.getMethod("get" + targetName).invoke(salesOrder)==null?"":aClass.getMethod("get" + targetName).invoke(salesOrder));
+                            if(model.equals("inchargerId")){
+                                if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                                    if(null != aClass.getMethod("getInchargerName").invoke(salesOrder)){
+                                        value = "$userName="+String.valueOf(aClass.getMethod("getInchargerName").invoke(salesOrder))+"$";
+                                    }
+//                                    value = "$userName="+String.valueOf(aClass.getMethod("getInchargerName").invoke(salesOrder))+"$";
+                                }else {
+                                    value = String.valueOf(null == aClass.getMethod("getInchargerName").invoke(salesOrder)?"":aClass.getMethod("getInchargerName").invoke(salesOrder));
+                                }
+                            }
+                            if(model.equals("customId")){
+                                value = String.valueOf(null == aClass.getMethod("getCustomName").invoke(salesOrder)?"":aClass.getMethod("getCustomName").invoke(salesOrder));
+                            }
+                            if(model.equals("businessOpportunityId")){
+                                value = String.valueOf(null == aClass.getMethod("getBusinessOpportunityName").invoke(salesOrder)?"":aClass.getMethod("getBusinessOpportunityName").invoke(salesOrder));
+                            }
+                            if(model.equals("customSigner")){
+                                if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                                    String tmpStr = String.valueOf(aClass.getMethod("getCustomSignerName").invoke(salesOrder) == null ? "" : aClass.getMethod("getCustomSignerName").invoke(salesOrder));
+                                    value = org.apache.commons.lang3.StringUtils.isNotBlank(tmpStr)?"$userName="+tmpStr+"$":"";
+                                }else {
+                                    value = String.valueOf(aClass.getMethod("getCustomSignerName").invoke(salesOrder)==null?"":aClass.getMethod("getCustomSignerName").invoke(salesOrder));
+                                }
+//                                value = String.valueOf(aClass.getMethod("getCustomSignerName").invoke(salesOrder)==null?"":aClass.getMethod("getCustomSignerName").invoke(salesOrder));
+                            }
+                            if(model.equals("companySigner")){
+                                if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                                    String tmpStr = String.valueOf(aClass.getMethod("getCompanySignerName").invoke(salesOrder) == null ? "" : aClass.getMethod("getCompanySignerName").invoke(salesOrder));
+                                    value = org.apache.commons.lang3.StringUtils.isNotBlank(tmpStr)?"$userName="+tmpStr+"$":"";
+                                }else {
+                                    value = String.valueOf(aClass.getMethod("getCompanySignerName").invoke(salesOrder)==null?"":aClass.getMethod("getCompanySignerName").invoke(salesOrder));
+                                }
+//                                value = String.valueOf(aClass.getMethod("getCompanySignerName").invoke(salesOrder)==null?"":aClass.getMethod("getCompanySignerName").invoke(salesOrder));
+                            }
+                            if(model.equals("type")){
+                                value = String.valueOf(null == aClass.getMethod("getTypeName").invoke(salesOrder)?"":aClass.getMethod("getTypeName").invoke(salesOrder));
+                            }
+                            item.add(value);
+                        }
+                    }
+                }else {
+                    String model = target.getString("model");
+                    String targetName = model.substring(0, 1).toUpperCase() + model.substring(1);
+                    Class<? extends SalesOrder> aClass = salesOrder.getClass();
+                    String value = String.valueOf(aClass.getMethod("get" + targetName).invoke(salesOrder)==null?"":aClass.getMethod("get" + targetName).invoke(salesOrder));
+                    if(model.equals("inchargerId")){
+                        if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                            if(null != aClass.getMethod("getInchargerName").invoke(salesOrder)){
+                                value = "$userName="+String.valueOf(aClass.getMethod("getInchargerName").invoke(salesOrder))+"$";
+                            }
+//                            value = "$userName="+String.valueOf(aClass.getMethod("getInchargerName").invoke(salesOrder))+"$";
+                        }else {
+                            value = String.valueOf(null == aClass.getMethod("getInchargerName").invoke(salesOrder)?"":aClass.getMethod("getInchargerName").invoke(salesOrder));
+                        }
+                    }
+                    if(model.equals("customId")){
+                        value = String.valueOf(null == aClass.getMethod("getCustomName").invoke(salesOrder)?"":aClass.getMethod("getCustomName").invoke(salesOrder));
+                    }
+                    if(model.equals("businessOpportunityId")){
+                        value = String.valueOf(null == aClass.getMethod("getBusinessOpportunityName").invoke(salesOrder)?"":aClass.getMethod("getBusinessOpportunityName").invoke(salesOrder));
+                    }
+                    if(model.equals("customSigner")){
+                        value = String.valueOf(aClass.getMethod("getCustomSignerName").invoke(salesOrder)==null?"":aClass.getMethod("getCustomSignerName").invoke(salesOrder));
+                    }
+                    if(model.equals("companySigner")){
+                        value = String.valueOf(aClass.getMethod("getCompanySignerName").invoke(salesOrder)==null?"":aClass.getMethod("getCompanySignerName").invoke(salesOrder));
+                    }
+                    if(model.equals("type")){
+                        value = String.valueOf(null == aClass.getMethod("getTypeName").invoke(salesOrder)?"":aClass.getMethod("getTypeName").invoke(salesOrder));
+                    }
+                    item.add(value);
+                }
+            }
+            dataList.add(item);
+        }
+        String fileName="销售表AI_"+ System.currentTimeMillis();
+        return excelExportService.exportGeneralExcelByTitleAndListAI(fileName,dataList,path);
+    }
+
     @Override
     @Transactional
     public HttpRespMsg importData(MultipartFile multipartFile) {

+ 208 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/TaskServiceImpl.java

@@ -2683,6 +2683,214 @@ public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements Ta
 
     }
 
+    @Override
+    public HttpRespMsg exportDataAI(TaskDto taskDto, HttpServletRequest request) throws Exception {
+        User user = userMapper.selectById(request.getHeader("token"));
+//        SysForm sysForm = sysFormMapper.selectOne(new LambdaQueryWrapper<SysForm>().eq(SysForm::getCompanyId, user.getCompanyId()).eq(SysForm::getCode, "Task").eq(SysForm::getIsCurrent, 1));
+        WxCorpInfo wxCorpInfo = wxCorpInfoService.getOne(new LambdaQueryWrapper<WxCorpInfo>().eq(WxCorpInfo::getCompanyId, user.getCompanyId()));
+        List<TaskExecutor> taskExecutorList = taskExecutorMapper.selectList(new LambdaQueryWrapper<TaskExecutor>().eq(TaskExecutor::getCompanyId,user.getCompanyId()));
+        List<TaskLog> taskLogList = taskLogMapper.selectList(new LambdaQueryWrapper<TaskLog>().eq(TaskLog::getCompanyId,user.getCompanyId()));
+        Company company = companyMapper.selectById(user.getCompanyId());
+        String config = getTaskSysFromConfig();
+        JSONObject configOb = JSON.parseObject(config);
+        JSONArray configObJSONArray = configOb.getJSONArray("list");
+        List<List<String>> dataList=new ArrayList<>();
+        List<String> titleList=new ArrayList<>();
+        List<String> modelList=new ArrayList<>();
+        for (int i = 0; i < configObJSONArray.size(); i++) {
+            JSONObject item = configObJSONArray.getJSONObject(i);
+            String type = item.getString("type");
+            if (type.equals("grid")){
+                JSONArray columns = item.getJSONArray("columns");
+                for (int j = 0; j < columns.size(); j++) {
+                    JSONObject columnsJSONObject = columns.getJSONObject(j);
+                    JSONArray listJsonArray = columnsJSONObject.getJSONArray("list");
+                    for (int k = 0; k < listJsonArray.size(); k++) {
+                        JSONObject listJsonArrayJSONObject = listJsonArray.getJSONObject(k);
+                        titleList.add(listJsonArrayJSONObject.getString("label"));
+                        modelList.add(listJsonArrayJSONObject.getString("model"));
+                    }
+                }
+            }
+            else {
+                titleList.add(item.getString("label"));
+                modelList.add(item.getString("model"));
+            }
+        }
+        dataList.add(titleList);//设置表头
+
+        taskDto.setCompanyId(user.getCompanyId());
+        taskDto.setPageIndex(null).setPageSize(null);
+        List<TasKVo> taskVoList =taskMapper.getPageListTask(taskDto);
+        if (!taskVoList.isEmpty()){
+            for (TasKVo tasKVo : taskVoList) {
+                if (!taskExecutorList.isEmpty()){
+                    List<TaskExecutor> collect = taskExecutorList.stream().
+                            filter(taskExecutor -> taskExecutor.getTaskId().equals(tasKVo.getId())).
+                            filter(taskExecutor -> taskExecutor.getCompanyId().equals(user.getCompanyId()))
+                            .collect(Collectors.toList());
+                    if (!collect.isEmpty()){
+                        List<String> collect1 = collect.stream().map(TaskExecutor::getExecutorName).collect(Collectors.toList());
+                        tasKVo.setTaskExecutors(collect1);
+                    }
+                }
+            }
+        }
+
+        if(company.getIsSimple()==0) {
+            for (TasKVo tasKVo : taskVoList) {
+                List<String> item = new ArrayList<>();
+                for (int i = 0; i < modelList.size(); i++) {
+
+                    String model = modelList.get(i);
+                    String targetName = model.substring(0, 1).toUpperCase() + model.substring(1);
+                    Class<? extends TasKVo> aClass = tasKVo.getClass();
+                    String value = "";
+
+                    if (model.equals("taskName")) {
+                        value = String.valueOf(aClass.getMethod("getTaskName").invoke(tasKVo)).equals("null") ? "" : String.valueOf(aClass.getMethod("getTaskName").invoke(tasKVo));
+                    } else if (model.equals("priority")) {
+//                    0-低 1-中 2-高
+                        Integer priority = tasKVo.getPriority();
+                        switch (priority) {
+                            case 0:
+                                value = "低";
+                                break;
+                            case 1:
+                                value = "中";
+                                break;
+                            case 2:
+                                value = "高";
+                                break;
+                            default:
+                                value = "";
+
+                        }
+                    } else if (model.equals("executorId")) {
+                        List<String> taskExecutors = tasKVo.getTaskExecutors();
+                        if (taskExecutors != null && !taskExecutors.isEmpty()) {
+                            String executorString = taskExecutors.stream()
+                                    .map(
+                                            t -> {
+                                                if (wxCorpInfo != null && wxCorpInfo.getSaasSyncContact() == 1) {
+                                                    return "$userName=" + t + "$";
+                                                } else {
+                                                    return t;
+                                                }
+                                            }
+                                    ).collect(Collectors.joining(","));
+                            value = executorString.isEmpty() ? "" : executorString;
+                        } else {
+                            value = "";
+                        }
+                    } else if (model.equals("startDate")) {
+                        if (tasKVo.getStartDate() != null) {
+                            LocalDateTime startDate = tasKVo.getStartDate();
+                            // 定义日期时间格式
+                            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
+                            // 格式化为字符串
+                            value = startDate.format(formatter);
+                        }
+                    } else if (model.equals("endDate")) {
+                        if (tasKVo.getEndDate() != null) {
+                            LocalDateTime endDate = tasKVo.getEndDate();
+                            // 定义日期时间格式
+                            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
+                            // 格式化为字符串
+                            value = endDate.format(formatter);
+                        }
+                    } else if (model.equals("customId")) {
+                        value = String.valueOf(aClass.getMethod("getCustomName").invoke(tasKVo)).equals("null") ? "" : String.valueOf(aClass.getMethod("getCustomName").invoke(tasKVo));
+                    } else if (model.equals("businessOpportunityId")) {
+                        value = String.valueOf(aClass.getMethod("getBusinessName").invoke(tasKVo)).equals("null") ? "" : String.valueOf(aClass.getMethod("getBusinessName").invoke(tasKVo));
+                    } else if (model.equals("orderId")) {
+                        value = String.valueOf(aClass.getMethod("getOrderName").invoke(tasKVo)).equals("null") ? "" : String.valueOf(aClass.getMethod("getOrderName").invoke(tasKVo));
+                    } else if (model.equals("clueId")) {
+                        value = String.valueOf(aClass.getMethod("getClueName").invoke(tasKVo)).equals("null") ? "" : String.valueOf(aClass.getMethod("getClueName").invoke(tasKVo));
+                    } else if (model.equals("contactsId")) {
+                        value = String.valueOf(aClass.getMethod("getContactsName").invoke(tasKVo)).equals("null") ? "" : String.valueOf(aClass.getMethod("getContactsName").invoke(tasKVo));
+                    } else if (model.equals("phone")) {
+                        value = String.valueOf(aClass.getMethod("getContactsPhone").invoke(tasKVo)).equals("null") ? "" : String.valueOf(aClass.getMethod("getContactsPhone").invoke(tasKVo));
+                    } else
+                        value = String.valueOf(aClass.getMethod("get" + targetName).invoke(tasKVo) == null ? "" : aClass.getMethod("get" + targetName).invoke(tasKVo));
+                    item.add(value);
+                }
+                dataList.add(item);
+            }
+        }else {
+            dataList.clear();
+            List<String> heads = new ArrayList<>();
+            Collections.addAll(heads, "任务名称", "执行人", "开始时间", "截止时间", "客户名称","客户类型", "预约工作内容", "预约金额", "实际工作内容", "实际金额","付款状态","用户反馈");
+            dataList.add(heads);
+            for (TasKVo tasKVo : taskVoList){
+                List<String> item = new ArrayList<>();
+                item.add(tasKVo.getTaskName());
+                if (tasKVo.getTaskExecutors()!=null&&!tasKVo.getTaskExecutors().isEmpty()){
+                    List<String> taskExecutors = tasKVo.getTaskExecutors();
+                    StringJoiner stringJoiner = new StringJoiner(",");
+                    for (String taskExecutor : taskExecutors) {
+                        stringJoiner.add(taskExecutor);
+                    }
+                    item.add(stringJoiner.toString());
+                }else item.add("");
+
+                if (tasKVo.getStartDate() != null) {
+                    LocalDateTime startDate = tasKVo.getStartDate();
+                    // 定义日期时间格式
+                    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
+                    // 格式化为字符串
+                    item.add(startDate.format(formatter));
+                }else item.add("");
+
+                if (tasKVo.getEndDate() != null) {
+                    LocalDateTime endDate = tasKVo.getEndDate();
+                    // 定义日期时间格式
+                    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
+                    // 格式化为字符串
+                    item.add(endDate.format(formatter));
+                }else item.add("");
+
+                item.add(StringUtils.isEmpty(tasKVo.getCustomName()) ? "" : tasKVo.getCustomName());
+                if (tasKVo.getCustomType()!=null){
+                    Integer customType = tasKVo.getCustomType();
+                    switch (customType) {
+                        case 0:
+                            item.add(customTypeName0);
+                            break;
+                        case 1:
+                            item.add(customTypeName1);
+                            break;
+                        case 2:
+                            item.add(customTypeName2);
+                            break;
+                        default:
+                            item.add("");
+                            break;
+                    }
+                }else item.add("");
+                item.add(StringUtils.isEmpty(tasKVo.getAppointContent()) ? "" : tasKVo.getAppointContent());
+                item.add(tasKVo.getAppointMoney()==null ? BigDecimal.ZERO.toString() : tasKVo.getAppointMoney().toString());
+                item.add(StringUtils.isEmpty(tasKVo.getReallyContent()) ? "" : tasKVo.getReallyContent());
+                item.add(tasKVo.getReallyMoney()==null ? BigDecimal.ZERO.toString() : tasKVo.getReallyMoney().toString());
+                if (tasKVo.getPayType()!=null){
+                    Integer payType = tasKVo.getPayType();
+                    if (payType==0){
+                        item.add("未付款");
+                    }else if(payType==1) {
+                        item.add("已付款");
+                    }else {
+                        item.add("");
+                    }
+                }else item.add("");
+                item.add(StringUtils.isEmpty(tasKVo.getUserBack()) ? "" : tasKVo.getUserBack());
+
+                dataList.add(item);
+            }
+        }
+        String fileName="任务表AI_"+ System.currentTimeMillis();
+        return excelExportService.exportGeneralExcelByTitleAndListAI(fileName,dataList,path);
+    }
+
     public void updateTaskRepeatConfigure(Task task){
         task.setRepeatType(null).setRepeatEndNever(null).setRepeatEndCount(null)
                 .setRepeatEndDate(null).setRepeatDesignDay(null).setRepeatDesignSameday(null)

+ 1 - 514
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/UserServiceImpl.java

@@ -35,8 +35,6 @@ import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.http.*;
-import org.springframework.ldap.core.LdapTemplate;
-import org.springframework.ldap.filter.EqualsFilter;
 import org.springframework.stereotype.Service;
 import org.springframework.util.StringUtils;
 import org.springframework.web.client.RestTemplate;
@@ -45,17 +43,6 @@ import org.springframework.web.servlet.ModelAndView;
 import org.springframework.web.servlet.view.RedirectView;
 
 import javax.annotation.Resource;
-import javax.naming.Context;
-import javax.naming.NamingEnumeration;
-import javax.naming.NamingException;
-import javax.naming.directory.Attribute;
-import javax.naming.directory.Attributes;
-import javax.naming.directory.SearchControls;
-import javax.naming.directory.SearchResult;
-import javax.naming.ldap.Control;
-import javax.naming.ldap.InitialLdapContext;
-import javax.naming.ldap.LdapContext;
-import javax.naming.ldap.SortControl;
 import javax.servlet.http.HttpServletRequest;
 import java.io.*;
 import java.math.BigDecimal;
@@ -89,16 +76,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
     private String corpId;
     @Value("${providerSecret}")
     private String providerSecret;
-    @Value("${spring.ldap.urls}")
-    private String ldapUrl;
-    @Value("${spring.ldap.username}")
-    private String userName;
-    @Value("${spring.ldap.password}")
-    private String passWord;
-    @Value("${spring.ldap.base.dcFirst}")
-    private String dcFirst;
-    @Value("${spring.ldap.base.dcSecond}")
-    private String dcSecond;
+
     @Value("${configEnv.isPrivateDeploy}")
     private boolean isPrivateDeploy;
 
@@ -107,8 +85,6 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
     public SFTPAsyncUploader sftpAsyncUploader;
 
     public static final String GET_TOKEN_URL = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";
-    public static final String GET_USERINFO_URL = "https://api.weixin.qq.com/sns/userinfo?access_token=accessToken&openid=openId&lang=zh_CN";
-    public static final String[] MATCHING_FILED = {"corpwx_userid","phone","job_number"};
 
     //用于控制线程锁
     public static HashMap<String, CorpwxJobResult> corpwxJobCenter = new HashMap();
@@ -179,8 +155,6 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
     private TaskGroupMapper taskGroupMapper;
     @Resource
     private WxCorpInfoMapper wxCorpInfoMapper;
-//    @Resource
-//    private CompanyDingdingService companyDingdingService;
     @Resource
     private WxCorpInfoService wxCorpInfoService;
     @Resource
@@ -196,14 +170,10 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
     @Resource
     private ThirdPartyInterfaceMapper thirdPartyInterfaceMapper;
     @Resource
-    SysConfigMapper sysConfigMapper;
-    @Resource
     private ReportFormMapper reportFormMapper;
     @Resource
     private ProjectAuditorService projectAuditorService;
     @Resource
-    private TaskService taskService;
-    @Resource
     private TaskCommentMapper taskCommentMapper;
     @Resource
     private TaskCommentService taskCommentService;
@@ -219,21 +189,8 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
     private SysFormService sysFormService;
     @Resource
     private StageService stageService;
-
-    @Resource
-    private CompanyDingdingMapper companyDingdingMapper;
-
-    @Resource
-    private LdapTemplate ldapTemplate;
-
-    public static String provider_access_token = null;
-    public static long providerTokenExpireTime = 0L;
-    @Resource
-    private SysDictMapper sysDictMapper;
-
     @Resource
     private SysDictService sysDictService;
-
     @Resource
     private SuperSonicConfig  superSonicConfig;
 
@@ -3323,474 +3280,4 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
         return httpRespMsg;
     }
 
-    @Override
-    public boolean ldapAuth(String username, String passWord) {
-        EqualsFilter filter = new EqualsFilter("sAMAccountName",username);
-        return ldapTemplate.authenticate("",filter.toString(),passWord);
-    }
-
-    @Override
-    public List<JSONObject> ldapGetOU() throws NamingException {
-        LdapContext ldapContext = adLogin();
-        HttpRespMsg httpRespMsg=new HttpRespMsg();
-        //域部门节点
-        String searchBase = "OU=my,DC="+dcFirst+",DC="+dcSecond;
-        //String searchBase = "OU=my(组织架构名称),DC=test,DC=com";
-        //搜索条件
-        String searchFilter = "objectclass=organizationalUnit";
-        //String searchFilter = "(&(objectclass=organizationalUnit)(|(name=名称1)(name=名称2)))"; //查询部门,并且部门名称等于名称1或者名称2
-        // 创建搜索控制器
-        SearchControls searchCtls = new SearchControls();
-        String[]  returnedAttrs={"ou", "name","canonicalName","distinguishedName","objectGUID", "objectCategory"};
-        searchCtls.setReturningAttributes(returnedAttrs); //设置指定返回的字段,不设置则返回全部
-        //  设置搜索范围 深度
-        searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE);
-        //查询结果
-        NamingEnumeration answer = ldapContext.search(searchBase, searchFilter,searchCtls);
-
-        List<JSONObject> jsonObjectList = new ArrayList<>();
-
-        while (answer.hasMoreElements()){
-            SearchResult searchResult = (SearchResult) answer.next();
-            Attributes attributes = searchResult.getAttributes();
-            if(attributes != null){
-                JSONObject jsonObject = new JSONObject();
-                for(NamingEnumeration ne = attributes.getAll(); ne.hasMore();){
-                    Attribute attribute = (Attribute) ne.next();
-                    for (NamingEnumeration e = attribute.getAll(); e.hasMore();) {
-                        if("objectGUID".equals(attribute.getID())){
-                            String guid =this.getObjectGUID((byte[]) e.next());
-                            jsonObject.put(attribute.getID(), guid);
-                        }else {
-                            jsonObject.put(attribute.getID(), e.next().toString());
-                        }
-                        if(!jsonObjectList.stream().anyMatch(jl->jl.getString("objectGUID").equals(jsonObject.getString("objectGUID")))){
-                            jsonObjectList.add(jsonObject);
-                        }
-//                        jsonObjectList.add(jsonObject);
-                    }
-                }
-            }
-
-        }
-        return jsonObjectList;
-    }
-
-    @Override
-    public List<JSONObject> getUser() throws Exception{
-        HttpRespMsg httpRespMsg=new HttpRespMsg();
-        LdapContext ldapContext = this.adLogin();
-        String searchFilter = "objectclass=User";
-        String searchBase = "DC="+dcFirst+",DC="+dcSecond;
-        // 创建搜索控制器
-        SearchControls searchCtls = new SearchControls();
-        String[]  returnedAttrs={"givenName","name","distinguishedName","userAccountControl","objectGUID", "objectCategory", "logonCount","sAMAccountName","userPrincipalName"};
-        searchCtls.setReturningAttributes(returnedAttrs); //设置指定返回的字段,不设置则返回全部
-        //  设置搜索范围 深度
-        searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE);
-        //查询结果
-        NamingEnumeration answer = ldapContext.search(searchBase, searchFilter,searchCtls);
-
-        List<JSONObject> jsonObjectList = new ArrayList<>();
-
-        while (answer.hasMoreElements()){
-            SearchResult searchResult = (SearchResult) answer.next();
-            Attributes attributes = searchResult.getAttributes();
-
-            if(attributes != null){
-                JSONObject jsonObject = new JSONObject();
-                for(NamingEnumeration ne = attributes.getAll(); ne.hasMore();){
-                    Attribute attribute = (Attribute) ne.next();
-                    for (NamingEnumeration e = attribute.getAll(); e.hasMore();) {
-                        if("objectGUID".equals(attribute.getID())){
-                            String guid =this.getObjectGUID((byte[]) e.next());
-                            jsonObject.put(attribute.getID(), guid);
-                        }else {
-                            jsonObject.put(attribute.getID(), e.next().toString());
-                        }
-                    }
-                }
-                if(!jsonObjectList.stream().anyMatch(jl->jl.getString("objectGUID").equals(jsonObject.getString("objectGUID")))){
-                    jsonObjectList.add(jsonObject);
-                }
-//                        jsonObjectList.add(jsonObject);
-            }
-
-        }
-        return jsonObjectList;
-    }
-
-    @Override
-    public HttpRespMsg initSystemForAd(String companyName) throws Exception {
-        HttpRespMsg msg = new HttpRespMsg();
-        Integer count = companyMapper.selectCount(new QueryWrapper<Company>().eq("company_name", companyName));
-        if (count>0){
-            msg.setError("当前公司名称已存在");
-            return msg;
-        }
-        Company company = new Company().setCompanyName(companyName)
-                .setExpirationDate(LocalDateTime.now().plusDays(36500));
-        company.setPackageProject(0);
-        companyMapper.insert(company);
-        //生成工作时长
-        TimeType timeType = new TimeType();
-        timeType.setCompanyId(company.getId());
-        timeType.setFinanceJobnumEnabled(1);//启用工号来导入财务匹配
-        timeType.setProjectManDay(1);
-        timeTypeMapper.insert(timeType);
-        SysRole smanager = sysRoleService.generateDefaultRoles(company.getId());
-        //创建企业负责人账号
-        Long id = SnowFlake.nextId();
-        User manager = new User()
-                .setId(id.toString())
-                .setRoleId(smanager.getId())
-                .setRoleName(smanager.getRolename())
-                .setName("sysadmin")
-                .setPhone("sysadmin@"+dcFirst+"."+dcSecond)
-                .setPassword(MD5Util.getPassword("000000"))
-                .setColor(ColorUtil.randomColor())
-                .setCompanyId(company.getId());
-        userMapper.insert(manager);
-        System.out.println("生成超级管理员:sysadmin");
-        //生成项目的成本基线默认条目
-        String[] array = Constant.DEFAULT_BASE_COST_ITEMS;
-        for (String baseItem : array) {
-            ProjectBasecostSetting setting = new ProjectBasecostSetting();
-            setting.setName(baseItem);
-            setting.setCompanyId(company.getId());
-            projectBasecostSettingMapper.insert(setting);
-        }
-        //生成费用报销默认条目
-        String[] expenseTypes = Constant.EXPENSE_TYPES;
-        List<String> commonly = new ArrayList<>();
-        commonly.add("材料费");
-        //commonly.add(MessageUtils.message("entry.materialCost"));
-        commonly.add("办公用品");
-        //commonly.add(MessageUtils.message("entry.workCost"));
-        commonly.add("培训费");
-        //commonly.add(MessageUtils.message("entry.trainCost"));
-        commonly.add("打印费");
-        //commonly.add(MessageUtils.message("entry.printCost"));
-        commonly.add("快递费");
-        //commonly.add(MessageUtils.message("entry.expressCost"));
-        commonly.add("制作费");
-        //commonly.add(MessageUtils.message("entry.makeCost"));
-        commonly.add("律师费");
-        //commonly.add(MessageUtils.message("entry.lawyerCost"));
-        commonly.add("水费");
-        //commonly.add(MessageUtils.message("entry.waterCost"));
-        commonly.add("电费");
-        //commonly.add(MessageUtils.message("entry.electricCost"));
-        commonly.add("团建费");
-        //commonly.add(MessageUtils.message("entry.leagueCost"));
-        commonly.add("其他");
-        //commonly.add(MessageUtils.message("entry.other"));
-        List<String> travel  = new ArrayList<>();
-        travel.add("城市间交通费");
-        //travel.add(MessageUtils.message("entry.cityTrafficCost"));
-        travel.add("住宿费");
-        //travel.add(MessageUtils.message("entry.liveCost"));
-        travel.add("伙食补助费");
-        //travel.add(MessageUtils.message("entry.eatCost"));
-        travel.add("市内交通费");
-        //travel.add(MessageUtils.message("entry.insideCityCost"));
-        travel.add("其他差旅费");
-        //travel.add(MessageUtils.message("entry.otherLiveTraCost"));
-        List<String> outsource = new ArrayList<>();
-        outsource.add("项目外包费");
-        //outsource.add(MessageUtils.message("entry.projectCost"));
-        outsource.add("劳务外包费");
-        //outsource.add(MessageUtils.message("entry.labourCost"));
-        outsource.add("其他外包费");
-        //outsource.add(MessageUtils.message("entry.OtherOutsourceCost"));
-        List<ExpenseType> expenseTypeList=new ArrayList<>();
-        List<ExpenseMainType> expenseMainTypes=new ArrayList<>();
-        ExpenseMainType expenseMainType=new ExpenseMainType();
-        expenseMainType.setName("一般费用");
-        expenseMainType.setCompanyId(company.getId());
-        ExpenseMainType expenseMainType1=new ExpenseMainType();
-        expenseMainType1.setName("差旅费用");
-        expenseMainType1.setCompanyId(company.getId());
-        ExpenseMainType expenseMainType2=new ExpenseMainType();
-        expenseMainType2.setName("外包费用");
-        expenseMainType2.setCompanyId(company.getId());
-        expenseMainTypes.add(expenseMainType);
-        expenseMainTypes.add(expenseMainType1);
-        expenseMainTypes.add(expenseMainType2);
-        expenseMainTypeService.saveBatch(expenseMainTypes);
-        for (String expenseType : expenseTypes) {
-            ExpenseType item=new ExpenseType();
-            item.setCompanyId(company.getId());
-            item.setTypeName(expenseType);
-            if(commonly.contains(expenseType)){
-                item.setMainType(expenseMainType.getId());
-            }
-            if(travel.contains(expenseType)){
-                item.setMainType(expenseMainType1.getId());
-            }
-            if(outsource.contains(expenseType)){
-                item.setMainType(expenseMainType2.getId());
-            }
-            expenseTypeList.add(item);
-        }
-        expenseTypeService.saveBatch(expenseTypeList);
-        //todo: 生成初始测试项目及任务
-        Project project=new Project();
-        project.setCompanyId(company.getId());
-        project.setInchargerId(manager.getId());
-        project.setInchargerName(manager.getName());
-        project.setCreatorId(manager.getId());
-        project.setCreatorName(manager.getName());
-        project.setCreateDate(LocalDate.now());
-        project.setProjectCode("example");
-        project.setProjectName("示例项目");
-        //设置为公共项目,这样测试的用户都能填报
-        project.setIsPublic(1);
-        projectMapper.insert(project);
-        //todo: 生成初始项目相关日报审核人
-        ProjectAuditor projectAuditor=new ProjectAuditor();
-        projectAuditor.setAuditorId(manager.getId());
-        projectAuditor.setAuditorName(manager.getName());
-        projectAuditor.setProjectId(project.getId());
-        projectAuditorMapper.insert(projectAuditor);
-        //todo: 生成项目报表服务默认条目
-        Integer[] arrayInteger = new Integer[]{1, 2, 3, 4, 7};
-        for (Integer integerItem : arrayInteger) {
-            CompanyReport companyReport = new CompanyReport();
-            companyReport.setCompanyId(company.getId());
-            companyReport.setReportFormId(integerItem);
-            companyReportMapper.insert(companyReport);
-        }
-        //todo: 生成初始项目相关示例任务分组/任务阶段以及示例任务
-        TaskGroup taskGroup = new TaskGroup();
-        taskGroup.setProjectId(project.getId())
-                .setInchargerId(manager.getId())
-                .setName("项目阶段");
-        taskGroupMapper.insert(taskGroup);
-        Stages stage = new Stages();
-        stage.setGroupId(taskGroup.getId());
-        stage.setSequence(1);
-        stage.setProjectId(project.getId());
-        stage.setStagesName("工作开展");
-        stagesMapper.insert(stage);
-        Task task=new Task();
-//        Integer oneDayHours = 8;
-//        task.setCreateDate(LocalDate.now());
-//        task.setProjectId(project.getId());
-//        task.setCompanyId(company.getId());
-//        task.setCreaterId(manager.getId());
-//        task.setCreaterName(manager.getName());
-//        task.setCreatorColor(manager.getColor());
-//        task.setExecutorId(manager.getId());
-//        task.setExecutorColor(manager.getColor());
-//        task.setExecutorName(manager.getName());
-//        task.setPlanHours(oneDayHours);
-//        task.setStagesId(stage.getId());
-//        task.setGroupId(taskGroup.getId());
-//        task.setSeq(0);
-//        task.setName("示例任务");
-        taskMapper.insert(task);
-        //任务执行人表也要插入,不然会导致编辑任务的时候执行人为空
-        TaskExecutor executor = new TaskExecutor();
-        executor.setTaskId(task.getId());
-//        executor.setPlanHours(oneDayHours);
-        executor.setProjectId(project.getId());
-        executor.setExecutorId(manager.getId());
-        executor.setExecutorColor(manager.getColor());
-        executor.setExecutorName(manager.getName());
-        taskExecutorMapper.insert(executor);
-        SysRole role = sysRoleMapper.selectOne(new QueryWrapper<SysRole>().eq("company_id", company.getId()).eq("rolename","普通员工"));
-        List<JSONObject> deptArrays = ldapGetOU();
-        for (JSONObject dept : deptArrays) {
-            Department department=new Department();
-            department.setDepartmentName(dept.getString("name"))
-                    .setCompanyId(company.getId());
-            departmentMapper.insert(department);
-        }
-        List<Department> departmentList = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id", company.getId()));
-        for (JSONObject deptArray : deptArrays) {
-            String canonicalName = deptArray.getString("canonicalName");
-            Optional<Department> first = departmentList.stream().filter(dl -> dl.getDepartmentName().equals(deptArray.getString("name"))).findFirst();
-            if(first.isPresent()){
-                String[] split = canonicalName.split("/");
-                if(split.length>2){
-                    String s = split[split.length - 2];
-                    Department one = departmentMapper.selectOne(new QueryWrapper<Department>().eq("department_name", s).eq("company_id", company.getId()));
-                    if(one!=null&&Optional.of(one).isPresent()){
-                        first.get().setSuperiorId(one.getDepartmentId());
-                    }
-                }
-                departmentMapper.updateById(first.get());
-            }
-        }
-        List<JSONObject> userArrays = getUser();
-        Integer[] ints = {514, 546, 66050, 66080, 66082};
-        List<Integer> disable = Arrays.asList(ints);
-        for (JSONObject user : userArrays) {
-            if(disable.contains(user.getIntValue("userAccountControl"))){
-                continue;
-            }
-            User u=new User();
-            u.setId(SnowFlake.nextId()+"")
-                    .setName(user.getString("name"))
-                    .setPhone(user.getString("userPrincipalName"))
-                    .setId(SnowFlake.nextId()+"")
-                    .setRoleId(role.getId())//默认普通员工
-                    .setRoleName(role.getRolename())
-                    .setCompanyId(company.getId())
-                    .setColor(ColorUtil.randomColor())
-                    .setPassword(MD5Util.getPassword("000000"));
-            String distinguishedName = user.getString("distinguishedName");
-            String[] split = distinguishedName.split(",");
-            List<String> list = Arrays.asList(split);
-            List<String> collect = list.stream().filter(l -> l.contains("OU=")).collect(Collectors.toList());
-            if(collect.size()>0){
-                String s = collect.get(0).replaceAll("OU=", "");
-                Department one = departmentMapper.selectOne(new QueryWrapper<Department>().eq("department_name", s).eq("company_id", company.getId()));
-                if(one!=null){
-                    u.setDepartmentId(one.getDepartmentId()).setDepartmentName(one.getDepartmentName()).setDepartmentCascade(convertDepartmentIdToCascade(one.getDepartmentId(),departmentList));
-                }
-            }
-            userMapper.insert(u);
-        }
-        return msg;
-    }
-
-    @Override
-    public HttpRespMsg syncDeptWithAD(HttpServletRequest request) throws Exception {
-        Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
-        SysRole role = sysRoleMapper.selectOne(new QueryWrapper<SysRole>().eq("company_id",companyId).eq("rolename","普通员工"));
-        List<Department> departmentList = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id",companyId));
-        List<User> userList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", companyId));
-        List<JSONObject> deptArrays = ldapGetOU();
-        for (JSONObject dept : deptArrays) {
-            if(departmentList.stream().anyMatch(dl->dl.getDepartmentName().equals(dept.getString("name")))){
-                continue;
-            }
-            Department department=new Department();
-            department.setDepartmentName(dept.getString("name"))
-                    .setCompanyId(companyId);
-            departmentMapper.insert(department);
-        }
-        departmentList = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id",companyId));
-        for (JSONObject deptArray : deptArrays) {
-            String canonicalName = deptArray.getString("canonicalName");
-            Optional<Department> first = departmentList.stream().filter(dl -> dl.getDepartmentName().equals(deptArray.getString("name"))).findFirst();
-            if(first.isPresent()){
-                String[] split = canonicalName.split("/");
-                if(split.length>2){
-                    String s = split[split.length - 2];
-                    Department one = departmentMapper.selectOne(new QueryWrapper<Department>().eq("department_name", s).eq("company_id",companyId));
-                    if(one!=null&&Optional.of(one).isPresent()){
-                        first.get().setSuperiorId(one.getDepartmentId());
-                    }
-                }
-                departmentMapper.updateById(first.get());
-            }
-        }
-        List<JSONObject> userArrays = getUser();
-        Integer[] ints = {514, 546, 66050, 66080, 66082};
-        List<Integer> disable = Arrays.asList(ints);
-        for (JSONObject user : userArrays) {
-            if(disable.contains(user.getIntValue("userAccountControl"))){
-                List<User> users = userList.stream().filter(ul -> ul.getPhone() != null).collect(Collectors.toList());
-                Optional<User> optional = users.stream().filter(ul -> ul.getPhone() != null && ul.getPhone().equals(user.getString("userPrincipalName"))).findFirst();
-                if(optional.isPresent()){
-                    optional.get().setIsActive(0);
-                    userMapper.updateById(optional.get());
-                }
-                continue;
-            }
-            if(!user.containsKey("userPrincipalName")){
-                continue;
-            }
-            User u=new User();
-            u.setId(SnowFlake.nextId()+"")
-                    .setName(user.getString("name"))
-                    .setPhone(user.getString("userPrincipalName"))
-                    .setId(SnowFlake.nextId()+"")
-                    .setRoleId(role.getId())//默认普通员工
-                    .setRoleName(role.getRolename())
-                    .setCompanyId(companyId)
-                    .setColor(ColorUtil.randomColor())
-                    .setPassword(MD5Util.getPassword("000000"));
-            String distinguishedName = user.getString("distinguishedName");
-            String[] split = distinguishedName.split(",");
-            List<String> list = Arrays.asList(split);
-            List<String> collect = list.stream().filter(l -> l.contains("OU=")).collect(Collectors.toList());
-            if(collect.size()>0){
-                String s = collect.get(0).replaceAll("OU=", "");
-                Department one = departmentMapper.selectOne(new QueryWrapper<Department>().eq("department_name", s).eq("company_id",companyId));
-                if(one!=null){
-                    u.setDepartmentId(one.getDepartmentId()).setDepartmentName(one.getDepartmentName()).setDepartmentCascade(convertDepartmentIdToCascade(one.getDepartmentId(),departmentList));
-                }
-            }
-            List<User> users = userList.stream().filter(ul -> ul.getPhone() != null).collect(Collectors.toList());
-            if(!users.stream().anyMatch(ul->ul.getPhone()!=null&&ul.getPhone().equals(u.getPhone()))){
-                userMapper.insert(u);
-            }
-        }
-        return new HttpRespMsg();
-    }
-    public LdapContext adLogin() {
-
-        LdapContext ldapContext = null;
-        Hashtable<String, Object> env = new Hashtable<String, Object>();
-        env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
-        //验证类型
-        env.put(Context.SECURITY_AUTHENTICATION, "simple");
-        //用户名称,cn,ou,dc 分别:用户,组,域
-        env.put(Context.SECURITY_PRINCIPAL,userName);
-        //用户密码 cn 的密码
-        env.put(Context.SECURITY_CREDENTIALS,passWord);
-        //url 格式:协议://ip:端口/组,域   ,直接连接到域或者组上面
-        env.put(Context.PROVIDER_URL,ldapUrl);
-//        //协议
-//        env.put(Context.SECURITY_PROTOCOL, "ssl");
-//        env.put("java.naming.ldap.factory.socket", "org.utils.ad.DummySSLSocketFactory");
-        //objectGUID 转换,很关键
-        env.put("java.naming.ldap.attributes.binary","objectGUID");
-        try {
-            Control[] sortConnCtls = new SortControl[1];
-            sortConnCtls[0] = new SortControl("sAMAccountName", Control.CRITICAL);
-            ldapContext = new InitialLdapContext(env, sortConnCtls);
-        } catch (IOException | NamingException e) {
-            e.printStackTrace();
-        }
-        return ldapContext;
-    }
-
-    private String getObjectGUID(byte[] GUID){
-        String strGUID = "";
-        String byteGUID = "";
-        for (int c=0;c<GUID.length;c++) {
-            byteGUID = byteGUID + "\\" + AddLeadingZero((int)GUID[c] & 0xFF);
-        }
-        strGUID = strGUID + AddLeadingZero((int)GUID[3] & 0xFF);
-        strGUID = strGUID + AddLeadingZero((int)GUID[2] & 0xFF);
-        strGUID = strGUID + AddLeadingZero((int)GUID[1] & 0xFF);
-        strGUID = strGUID + AddLeadingZero((int)GUID[0] & 0xFF);
-        strGUID = strGUID + "-";
-        strGUID = strGUID + AddLeadingZero((int)GUID[5] & 0xFF);
-        strGUID = strGUID + AddLeadingZero((int)GUID[4] & 0xFF);
-        strGUID = strGUID + "-";
-        strGUID = strGUID + AddLeadingZero((int)GUID[7] & 0xFF);
-        strGUID = strGUID + AddLeadingZero((int)GUID[6] & 0xFF);
-        strGUID = strGUID + "-";
-        strGUID = strGUID + AddLeadingZero((int)GUID[8] & 0xFF);
-        strGUID = strGUID + AddLeadingZero((int)GUID[9] & 0xFF);
-        strGUID = strGUID + "-";
-        strGUID = strGUID + AddLeadingZero((int)GUID[10] & 0xFF);
-        strGUID = strGUID + AddLeadingZero((int)GUID[11] & 0xFF);
-        strGUID = strGUID + AddLeadingZero((int)GUID[12] & 0xFF);
-        strGUID = strGUID + AddLeadingZero((int)GUID[13] & 0xFF);
-        strGUID = strGUID + AddLeadingZero((int)GUID[14] & 0xFF);
-        strGUID = strGUID + AddLeadingZero((int)GUID[15] & 0xFF);
-        return strGUID;
-    }
-
-    private static String AddLeadingZero(int k) {
-        return (k <= 0xF) ? "0" + Integer.toHexString(k) : Integer
-                .toHexString(k);
-    }
 }

+ 1 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/util/ExcelUtil.java

@@ -169,6 +169,7 @@ public class ExcelUtil {
             workBook.write(os);
             os.flush();
             os.close();
+            System.out.println("写入文件路径=="+downloadPath+fileName);
         }catch(Exception e) {
             System.out.println(result);
             e.printStackTrace();

+ 0 - 297
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/util/ImageCompare.java

@@ -1,297 +0,0 @@
-package com.management.platform.util;
-
-import java.awt.HeadlessException;
-import java.awt.image.BufferedImage;
-import java.io.ByteArrayInputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.UnsupportedEncodingException;
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.imageio.ImageIO;
-
-import org.opencv.core.*;
-import org.opencv.imgcodecs.Imgcodecs;
-import org.opencv.imgproc.Imgproc;
-import org.opencv.utils.Converters;
-
-public class ImageCompare {
-    static {
-        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
-        //注意程序运行的时候需要在VM option添加该行 指明opencv的dll文件所在路径
-        //-Djava.library.path=$PROJECT_DIR$\opencv\x64
-    }
-    private boolean compareResult = false;
-    private String mark = "_compareResult";
-    /**
-     * 通过两张图对比,判断是否是游戏电影类型
-     * @param imagePath1 图片1的路径
-     * @param imagePath2 图片2的路径
-     */
-    public boolean isMoviePlay(String imagePath1, String imagePath2)
-    {
-        Mat mat1 = readMat(imagePath1);
-        Mat mat2 = readMat(imagePath2);
-        mat1 = Imgcodecs.imdecode(mat1, Imgcodecs.IMREAD_UNCHANGED);
-        mat2 = Imgcodecs.imdecode(mat2, Imgcodecs.IMREAD_UNCHANGED);
-        if(mat1.cols() == 0 || mat2.cols() == 0 || mat1.rows() == 0 || mat2.rows() == 0)
-        {
-            System.out.println("图片文件路径异常,获取的图片大小为0,无法读取");
-            return false;
-        }
-        if(mat1.cols() != mat2.cols() || mat1.rows() != mat2.rows())
-        {
-            System.out.println("两张图片大小不同,无法比较");
-            return false;
-        }
-        mat1.convertTo(mat1, CvType.CV_8UC1);
-        mat2.convertTo(mat2, CvType.CV_8UC1);
-        Mat mat1_gray = new Mat();
-        Imgproc.cvtColor(mat1, mat1_gray, Imgproc.COLOR_BGR2GRAY);
-        Mat mat2_gray = new Mat();
-        Imgproc.cvtColor(mat2, mat2_gray, Imgproc.COLOR_BGR2GRAY);
-        mat1_gray.convertTo(mat1_gray, CvType.CV_32F);
-        mat2_gray.convertTo(mat2_gray, CvType.CV_32F);
-        double result = Imgproc.compareHist(mat1_gray, mat2_gray, Imgproc.CV_COMP_CORREL);
-        if(result == 1)
-        {
-            return false;
-        }
-//        System.out.println("相似度数值为:"+result);
-        Mat mat_result = new Mat();
-        //计算两个灰度图的绝对差值,并输出到一个Mat对象中
-        Core.absdiff(mat1_gray, mat2_gray, mat_result);
-        //将灰度图按照阈值进行绝对值化
-        mat_result.convertTo(mat_result, CvType.CV_8UC1);
-        List<MatOfPoint> mat2_list = new ArrayList<MatOfPoint>();
-        Mat mat2_hi = new Mat();
-        //寻找轮廓图
-        Imgproc.findContours(mat_result, mat2_list, mat2_hi, Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE);
-        Mat mat_result1 = mat1;
-        Mat mat_result2 = mat2;
-        //使用红色标记不同点
-        System.out.println(mat2_list.size());
-        List<Point> allPoints = new ArrayList<Point>();
-        //按照目标区域的面积大小, 长宽不低于480*480
-        Point leftTop = null;
-        Point rightTop = null;
-        Point leftBottom = null;
-        Point rightBottom = null;
-        for (MatOfPoint matOfPoint : mat2_list)
-        {
-            Rect rect = Imgproc.boundingRect(matOfPoint);
-            if ((rect.width >= 640 && rect.height >= 480) || (rect.width >= 480 && rect.height >= 640)) {
-//                System.out.println("位置==["+rect.x +","+ rect.y+"], 大小=" +rect.width+"x"+rect.height+", 包含点=" + matOfPoint.toList().size());
-                Imgproc.rectangle(mat_result1, rect.tl(), rect.br(), new Scalar(0, 0, 255),2);
-                Imgproc.rectangle(mat_result2, rect.tl(), rect.br(), new Scalar(0, 0, 255),2);
-                allPoints = matOfPoint.toList();
-                leftTop = new Point(rect.x, rect.y);
-                rightTop = new Point(rect.x + rect.width -1, rect.y);
-                leftBottom = new Point(rect.x, rect.y + rect.height -1);
-                rightBottom = new Point(rect.x + rect.width -1, rect.y + rect.height -1);
-                break;
-            }
-        }
-        for (Point p : allPoints) {
-            Imgproc.drawMarker(mat_result1, p, new Scalar(0, 255, 0),2);
-        }
-        //找到四个顶点
-        System.out.println("allPoints size=="+allPoints.size());
-        if (allPoints.size() == 0) {
-            return false;
-        }
-        System.out.println(leftTop);
-        System.out.println(rightTop);
-        System.out.println(leftBottom);
-        System.out.println(rightBottom);
-        //统计在矩形边上的点数量
-        int hitCount = 0;
-        for (Point p : allPoints) {
-            if ((Math.abs(p.x - leftTop.x) <= 6 || Math.abs(p.y - leftTop.y) <= 6)
-                    || (Math.abs(p.x - rightBottom.x) <= 6 || Math.abs(p.y - rightBottom.y) <= 6)) {
-                hitCount++;
-            }
-        }
-        System.out.println("hitCount="+hitCount+", percent="+(100*hitCount/allPoints.size())+"%");
-        int percent = (100*hitCount/allPoints.size());
-        //分析占比
-        if (percent > 80) {
-            return true;//
-        } else {
-            return false;
-        }
-    }
-
-    private void writeImage(Mat mat, String outPutFile)
-    {
-        MatOfByte matOfByte = new MatOfByte();
-        Imgcodecs.imencode(".png", mat, matOfByte);
-        byte[] byteArray = matOfByte.toArray();
-        BufferedImage bufImage = null;
-        try {
-            InputStream in = new ByteArrayInputStream(byteArray);
-            bufImage = ImageIO.read(in);
-            ImageIO.write(bufImage, "png", new File(outPutFile));
-        } catch (IOException | HeadlessException e)
-        {
-            e.printStackTrace();
-        }
-    }
-
-    private String getFileName(String filePath)
-    {
-        File f = new File(filePath);
-        return f.getName();
-    }
-
-    private String getParentDir(String filePath)
-    {
-        File f = new File(filePath);
-        return f.getParent();
-    }
-
-    private Mat readMat(String filePath)
-    {
-        try {
-            File file = new File(filePath);
-            FileInputStream inputStream = new FileInputStream(filePath);
-            byte[] byt = new byte[(int) file.length()];
-            int read = inputStream.read(byt);
-            List<Byte> bs = convert(byt);
-            Mat mat1 = Converters.vector_char_to_Mat(bs);
-            return mat1;
-        } catch (UnsupportedEncodingException e) {
-            e.printStackTrace();
-        } catch (IOException e) {
-            e.printStackTrace();
-        }
-        return new Mat();
-    }
-
-    private List<Byte> convert(byte[] byt)
-    {
-        List<Byte> bs = new ArrayList<Byte>();
-        for (int i = 0; i < byt.length; i++)
-        {
-            bs.add(i, byt[i]);
-        }
-        return bs;
-    }
-
-    public boolean test(String imagePath1, String imagePath2)
-    {
-        Mat mat1 = readMat(imagePath1);
-        Mat mat2 = readMat(imagePath2);
-        mat1 = Imgcodecs.imdecode(mat1, Imgcodecs.IMREAD_UNCHANGED);
-        mat2 = Imgcodecs.imdecode(mat2, Imgcodecs.IMREAD_UNCHANGED);
-        /*Mat mat1 = Imgcodecs.imread(imagePath1, Imgcodecs.IMREAD_UNCHANGED);
-        Mat mat2 = Imgcodecs.imread(imagePath2, Imgcodecs.IMREAD_UNCHANGED);*/
-        if(mat1.cols() == 0 || mat2.cols() == 0 || mat1.rows() == 0 || mat2.rows() == 0)
-        {
-            System.out.println("图片文件路径异常,获取的图片大小为0,无法读取");
-            return false;
-        }
-        if(mat1.cols() != mat2.cols() || mat1.rows() != mat2.rows())
-        {
-            System.out.println("两张图片大小不同,无法比较");
-            return false;
-        }
-        mat1.convertTo(mat1, CvType.CV_8UC1);
-        mat2.convertTo(mat2, CvType.CV_8UC1);
-        Mat mat1_gray = new Mat();
-        Imgproc.cvtColor(mat1, mat1_gray, Imgproc.COLOR_BGR2GRAY);
-        Mat mat2_gray = new Mat();
-        Imgproc.cvtColor(mat2, mat2_gray, Imgproc.COLOR_BGR2GRAY);
-        mat1_gray.convertTo(mat1_gray, CvType.CV_32F);
-        mat2_gray.convertTo(mat2_gray, CvType.CV_32F);
-        double result = Imgproc.compareHist(mat1_gray, mat2_gray, Imgproc.CV_COMP_CORREL);
-        if(result == 1)
-        {
-            compareResult = true;//此处结果为1则为完全相同
-            return false;
-        }
-        System.out.println("相似度数值为:"+result);
-        Mat mat_result = new Mat();
-        //计算两个灰度图的绝对差值,并输出到一个Mat对象中
-        Core.absdiff(mat1_gray, mat2_gray, mat_result);
-        //将灰度图按照阈值进行绝对值化
-        mat_result.convertTo(mat_result, CvType.CV_8UC1);
-        List<MatOfPoint> mat2_list = new ArrayList<MatOfPoint>();
-        Mat mat2_hi = new Mat();
-        //寻找轮廓图
-        Imgproc.findContours(mat_result, mat2_list, mat2_hi, Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE);
-        Mat mat_result1 = mat1;
-        Mat mat_result2 = mat2;
-        //使用红色标记不同点
-        System.out.println(mat2_list.size());
-        List<Point> allPoints = new ArrayList<Point>();
-        //按照目标区域的面积大小, 长宽不低于480*480
-        Point leftTop = null;
-        Point rightTop = null;
-        Point leftBottom = null;
-        Point rightBottom = null;
-        for (MatOfPoint matOfPoint : mat2_list)
-        {
-            Rect rect = Imgproc.boundingRect(matOfPoint);
-            if (rect.width >= 280 && rect.height >= 280) {
-                System.out.println("位置==["+rect.x +","+ rect.y+"], 大小=" +rect.width+"x"+rect.height+", 包含点=" + matOfPoint.toList().size());
-                Imgproc.rectangle(mat_result1, rect.tl(), rect.br(), new Scalar(0, 0, 255),2);
-                Imgproc.rectangle(mat_result2, rect.tl(), rect.br(), new Scalar(0, 0, 255),2);
-                allPoints = matOfPoint.toList();
-                leftTop = new Point(rect.x, rect.y);
-                rightTop = new Point(rect.x + rect.width -1, rect.y);
-                leftBottom = new Point(rect.x, rect.y + rect.height -1);
-                rightBottom = new Point(rect.x + rect.width -1, rect.y + rect.height -1);
-                break;
-            }
-        }
-        for (Point p : allPoints) {
-            Imgproc.drawMarker(mat_result1, p, new Scalar(0, 255, 0),2);
-        }
-        String fileName1 = getFileName(imagePath1);
-        String targetPath1 = getParentDir(imagePath2)+File.separator+fileName1.replace(".", mark+".");
-        String fileName2 = getFileName(imagePath2);
-        String targetPath2 = getParentDir(imagePath2)+File.separator+fileName2.replace(".", mark+".");
-        System.out.println(targetPath1);
-        System.out.println(targetPath2);
-        writeImage(mat_result1, targetPath1);
-        writeImage(mat_result2, targetPath2);
-        //找到四个顶点
-        System.out.println("allPoints size=="+allPoints.size());
-        System.out.println(leftTop);
-        System.out.println(rightTop);
-        System.out.println(leftBottom);
-        System.out.println(rightBottom);
-        //检测其他点,是否都在矩形边上
-        int hitCount = 0;
-        for (Point p : allPoints) {
-            if ((Math.abs(p.x - leftTop.x) <= 6 || Math.abs(p.y - leftTop.y) <= 6)
-                    || (Math.abs(p.x - rightBottom.x) <= 6 || Math.abs(p.y - rightBottom.y) <= 6)) {
-                hitCount++;
-            } else {
-//                System.out.println("失效点:"+p.x + "," + p.y);
-            }
-        }
-        System.out.println("hitCount="+hitCount+", percent="+(100*hitCount/allPoints.size())+"%");
-        int percent = (100*hitCount/allPoints.size());
-
-        if (percent > 80) {
-            return true;//
-        } else {
-            return false;
-        }
-    }
-
-    public static void main(String[] args) {
-        String img1 = "C:\\Users\\seya\\Desktop\\e.jpg";
-        String img2 = "C:\\Users\\seya\\Desktop\\d.jpg";
-        ImageCompare ip = new ImageCompare();
-        System.out.println("是电影娱乐吗?"+ip.test(img1, img2));
-    }
-
-
-}
-

+ 0 - 129
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/util/ImageReconizeUtil.java

@@ -1,129 +0,0 @@
-package com.management.platform.util;
-
-import org.opencv.core.*;
-import org.opencv.features2d.ORB;
-import org.opencv.highgui.HighGui;
-import org.opencv.imgcodecs.Imgcodecs;
-import org.opencv.imgproc.Imgproc;
-
-import javax.imageio.ImageIO;
-import java.awt.image.BufferedImage;
-import java.io.File;
-import java.io.IOException;
-
-import static java.lang.Math.E;
-import static org.opencv.imgproc.Imgproc.*;
-
-public class ImageReconizeUtil {
-//    public static final double YUZHI_HIGH = 2*Math.pow(0.1, 11);
-//    public static final double YUZHI_NORMAL = 1*Math.pow(0.1, 10);
-    public static final double YUZHI = 0.89;
-    static {
-        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
-        //注意程序运行的时候需要在VM option添加该行 指明opencv的dll文件所在路径
-        //-Djava.library.path=$PROJECT_DIR$\opencv\x64
-    }
-    public static void main(String[] args) {
-        boolean match = isWholeTemplateMatch("C:\\Users\\seya\\Desktop\\wjw.jpg",
-                "C:\\picrecongnize\\im\\wechat.jpg");
-
-    }
-
-    public static boolean isTemplateMatch(String sourcePic, String targetPic) {
-        double matchVal = templete(TM_CCOEFF_NORMED, sourcePic, targetPic,true);
-        if (matchVal >= YUZHI) {
-            System.out.println("找到啦");
-            return true;
-        } else {
-            System.out.println("没匹配上");
-            return false;
-        }
-    }
-
-    public static boolean isWholeTemplateMatch(String sourcePic, String targetPic) {
-        double matchVal = templete(Imgproc.TM_CCOEFF_NORMED, sourcePic, targetPic, false);
-        if (matchVal >= YUZHI) {
-            System.out.println("找到啦"+targetPic);
-            return true;
-        } else {
-            System.out.println("没匹配上");
-            return false;
-        }
-    }
-
-    /**
-     * OpenCV-4.1.0 模板匹配
-     * <table border="1" cellpadding="8">
-     * <tr><th>输入参数</th><th>参数解释</th></tr>
-     * <tr><td align="left">TM_SQDIFF是平方差匹配、TM_SQDIFF_NORMED是标准平方差匹配</td><td>利用平方差来进行匹配,最好匹配为0.匹配越差,匹配值越大。</td></tr>
-     * <tr><td align="left">TM_CCORR是相关性匹配、TM_CCORR_NORMED是标准相关性匹配</td><td>采用模板和图像间的乘法操作,数越大表示匹配程度较高, 0表示最坏的匹配效果。</td></tr>
-     * <tr><td align="left">TM_CCOEFF是相关性系数匹配、TM_CCOEFF_NORMED是标准相关性系数匹配</td><td>将模版对其均值的相对值与图像对其均值的相关值进行匹配,1表示完美匹配,-1表示糟糕的匹配,0表示没有任何相关性(随机序列)。</td></tr>
-     * <tr><td colspan="2">随着从简单的测量(平方差)到更复杂的测量(相关系数),我们可获得越来越准确的匹配(同时也意味着越来越大的计算代价)。</td></tr>
-     * <tr><td colspan="2">相关性是越接近1越大越好,平方差是越小越好,所以TM_SQDIFF在使用时和其他的是有所区别的。</td></tr>
-     * <tr><td colspan="2">模板匹配结果Mat要是32位的。</td></tr>
-     * </table>
-     * @return: void
-     * @date: 2019年5月7日12:16:55
-     */
-    public static double templete(int method, String inFile, String templateFile, boolean cutMatch) {
-        // 1 获取待匹配图片
-//        System.out.println("sourcePic="+sourcePic+", targetPic="+targetPic);
-        Mat srcMat = Imgcodecs.imread(inFile);
-        if (cutMatch) {
-            //先裁减,左上角1/4的截图,提高比对速度。
-            Rect rect = new Rect(0,0,srcMat.width()/4, srcMat.height()/4);
-            Mat subMat = new Mat(srcMat, rect);
-            subMat.copyTo(srcMat);
-        }
-
-        //将rgb灰化处理
-//        Imgproc.cvtColor(templete, templete,Imgproc.COLOR_BGR2GRAY);
-//
-        // 2 获取匹配模板
-        Mat demo = Imgcodecs.imread(templateFile);
-//        Imgproc.cvtColor(demo, demo,Imgproc.COLOR_BGR2GRAY);
-
-        Core.MinMaxLocResult mmr = getLocResult(method, srcMat, demo);
-        // 7 绘制匹配到的结果
-        double x,y;
-        double matchVal = 0;
-        if (method==Imgproc.TM_SQDIFF_NORMED || method==Imgproc.TM_SQDIFF) {
-            x = mmr.minLoc.x;
-            y = mmr.minLoc.y;
-            matchVal = mmr.minVal;
-        } else {
-            x = mmr.maxLoc.x;
-            y = mmr.maxLoc.y;
-            matchVal = mmr.maxVal;
-        }
-
-        System.out.println("匹配度=="+matchVal+", target="+templateFile.substring(templateFile.lastIndexOf(File.separator)-10)+", inFile="+inFile.substring(inFile.lastIndexOf(File.separator)));
-        System.out.println("x="+x+", y=" + y);
-        //我们匹配的图像在左上角,考虑到用户可能拖动窗口,但是不应该偏差很大。 这里增加判断标准:坐标处在左上方。
-
-//        if (matchVal >= YUZHI) {
-//            Imgproc.rectangle(srcMat,new Point(x,y),new Point(x+demo.cols(),y+demo.rows()),new Scalar( 0, 0, 255),2,Imgproc.LINE_AA);
-//            Imgproc.putText(srcMat,"Match Success",new Point(x,y),Imgproc.FONT_HERSHEY_SCRIPT_COMPLEX, 1.0, new Scalar(0, 255, 0),1,Imgproc.LINE_AA);
-//            // 8 显示结果
-//            HighGui.imshow("模板匹配", srcMat);
-//            HighGui.waitKey(0);
-//        }
-
-        return matchVal;
-    }
-
-    private static Core.MinMaxLocResult getLocResult(int method, Mat templete, Mat demo) {
-        int width=templete.cols()-demo.cols()+1;
-        int height=templete.rows()-demo.rows()+1;
-        // 3 创建32位模板匹配结果Mat
-        Mat result=new Mat(width,height,CvType.CV_32FC1);
-        // 4 调用 模板匹配函数
-        Imgproc.matchTemplate(templete, demo, result, method);
-        // 5 归一化
-//        Core.normalize(result, result,0, 1, Core.NORM_MINMAX, -1, new Mat());
-        // 6 获取模板匹配结果
-        Core.MinMaxLocResult mmr = Core.minMaxLoc(result);
-        return mmr;
-    }
-
-}

+ 6 - 17
fhKeeper/formulahousekeeper/management-crm/src/main/resources/application.yml

@@ -51,19 +51,6 @@ spring:
   messages:
     basename: i18n.messages #配置国际化资源文件路径
     encoding: UTF-8
-
-  ##AD认证
-  ldap:
-    ##AD服务器IP,默认端口389
-    urls: ldap://192.168.2.44:389
-    ##登录账号
-    username: zhangsan@yurk.cn
-    ##密码
-    password: Zs123456
-    #distinguishedName的部分节点
-    base:
-      dcFirst: yurk
-      dcSecond: cn
 ##########日志配置
 logging:
   level:
@@ -100,7 +87,7 @@ mybatis:
 #####配置图片上传路径####
 upload:
   path: C:/upload/
-  file: C:/file/
+#  file: C:/file/
 picrecongnize:
   browser: C:/picrecongnize/browser/
   develop: C:/picrecongnize/develop/
@@ -112,7 +99,9 @@ wx:
   app_id: wx1c1d8fc81bc073a8
   app_secret: 17ad07f90ee845f99f4c1605647ef755
   template_report_pass: dbMuR2v7lxXLwRaorIWQ4T6ilvn0vzqmDDkD_3ZsaXc
-
+  template_project_deadline: kY2Qzec64uOANNXA0yn-PV09ZnNjCeGXwWjTaVmQiLU
+  template_report_reject: TICiRkvCpF4NCbkPOjefXTpz7jXgpt0SZGkNjCMIt3M
+  template_report_week: lhwkaW9BKwCvMtCuoAxLw4lZoGgMaucL0Ap0Vz-5KOY
 #钉钉参数配置
 dingding:
   appId: 71020
@@ -181,5 +170,5 @@ supersonic:
   password: e6+jQ26AESREiBBuKM1u1A==
 
 aiask:
-  fileaskurl: http://192.168.2.5:5000/analyze
-  askurl: http://192.168.2.5:5000/analyzeOnlyQuestion
+  fileaskurl: http://123.60.32.117:5000/analyze
+  askurl: http://123.60.32.117:5000/analyzeOnlyQuestion

+ 9 - 3
fhKeeper/formulahousekeeper/management-crm/src/main/resources/mapper/ClueMapper.xml

@@ -99,7 +99,9 @@
                 c.id DESC
             </otherwise>
         </choose>
-        limit #{pageIndex},#{pageFrom}
+        <if test="pageIndex != null and pageFrom !=null">
+            limit #{pageIndex},#{pageFrom}
+        </if>
     </select>
     <select id="list1" resultType="com.management.platform.entity.Clue">
         select c.id,
@@ -173,7 +175,9 @@
                 c.id DESC
             </otherwise>
         </choose>
-        limit #{clue.pageIndex},#{clue.pageFrom}
+        <if test="clue.pageIndex != null and clue.pageFrom !=null">
+            limit #{clue.pageIndex},#{clue.pageFrom}
+        </if>
     </select>
     <select id="list2" resultType="com.management.platform.entity.Clue">
         select c.id,
@@ -245,7 +249,9 @@
                 c.id DESC
             </otherwise>
         </choose>
-        limit #{clue.pageIndex},#{clue.pageFrom}
+        <if test="clue.pageIndex != null and clue.pageFrom !=null">
+            limit #{clue.pageIndex},#{clue.pageFrom}
+        </if>
     </select>
     <select id="getTotal" resultType="java.lang.Integer">
         select count(*)

+ 18 - 1
fhKeeper/formulahousekeeper/management-crm/src/main/resources/mapper/DepartmentMapper.xml

@@ -145,7 +145,7 @@
                  left join user u on b.incharger_id=u.id
                  left join department d on d.department_id=u.department_id
         <where>
-            1=1 AND u.department_id IS NOT NULL and b.company_id=#{companyId}
+            1=1 and b.is_delete = 0 AND u.department_id IS NOT NULL and b.company_id=#{companyId}
 
             <if test="startDate !=null and startDate !='' and endDate !=null and endDate !=''">
                 AND  b.create_time BETWEEN #{startDate} AND #{endDate}
@@ -174,4 +174,21 @@
         </where>
         group by  u.department_id
     </select>
+    <select id="getEarlierCusCount" resultType="com.management.platform.entity.vo.DepartmentVO">
+        select count(*) as earlierCusTotal,u.department_id as id,d.department_name as departmentName
+        from business_opportunity b
+        left join user u on b.incharger_id=u.id
+        left join department d on d.department_id=u.department_id
+        <where>
+            1=1 and b.is_delete = 0  AND u.department_id IS NOT NULL and b.company_id=#{companyId}
+
+            <if test="endDate !=null and endDate !=''">
+                AND  b.create_time &lt; #{endDate}
+            </if>
+            <if test="departmentId !=null ">
+                AND  u.department_id=#{departmentId}
+            </if>
+        </where>
+        group by u.department_id
+    </select>
 </mapper>

+ 23 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/resources/mapper/ReportExtraDegreeMapper.xml

@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.management.platform.mapper.ReportExtraDegreeMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.management.platform.entity.ReportExtraDegree">
+        <id column="id" property="id" />
+        <result column="company_id" property="companyId" />
+        <result column="name" property="name" />
+        <result column="code" property="code" />
+        <result column="rmark" property="rmark" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, company_id, name, code, rmark
+    </sql>
+
+    <select id="getAll" resultMap="BaseResultMap">
+        select id, name,rmark,code from report_extra_degree where company_id = #{companyId}
+        ORDER BY id DESC
+    </select>
+</mapper>

+ 1 - 1
fhKeeper/formulahousekeeper/management-crm/src/main/resources/mapper/UserMapper.xml

@@ -305,7 +305,7 @@
         from business_opportunity b
         left join user u on b.incharger_id=u.id
         <where>
-            1=1 and b.incharger_id is not null and b.company_id=#{companyId}
+            1=1 and b.is_delete = 0 and b.incharger_id is not null and b.company_id=#{companyId}
 
             <if test="startDate !=null and startDate !='' and endDate !=null and endDate !=''">
                 AND  b.create_time BETWEEN #{startDate} AND #{endDate}

+ 8 - 6
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/TaskFilesController.java

@@ -5,10 +5,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.management.platform.entity.*;
 import com.management.platform.mapper.*;
-import com.management.platform.service.CompanyDingdingService;
-import com.management.platform.service.ProjectDocumentService;
-import com.management.platform.service.TaskFilesService;
-import com.management.platform.service.WxCorpInfoService;
+import com.management.platform.service.*;
 import com.management.platform.task.SFTPAsyncUploader;
 import com.management.platform.util.DocumentTypeUtil;
 import com.management.platform.util.FileUtil;
@@ -86,6 +83,10 @@ public class TaskFilesController {
     private TaskFilesService taskFilesService;
     @Autowired
     private TaskExecutorMapper taskExecutorMapper;
+    @Autowired
+    private PermissionService permissionService;
+    @Autowired
+    private SysFunctionService sysFunctionService;
 
     @PostMapping("/reUploadFile")
     public HttpRespMsg reUploadFile(@RequestParam Integer projectId,
@@ -598,9 +599,10 @@ public class TaskFilesController {
         WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id",user.getCompanyId()));
         CompanyDingding dingding = companyDingdingService.getOne(new LambdaQueryWrapper<CompanyDingding>().eq(CompanyDingding::getCompanyId, user.getCompanyId()));
 
-        //审核通过的  或者是老文件 所有人都能看到
+        //审核通过的  或者是老文件 所有人都能看到;或是有查看待审核文件的权限的人
+        boolean canViewAuditFile = sysFunctionService.hasPriviledge(user.getRoleId(), "查看他人审核文件");
         //审核不通过的需要判断 登录人 是否是 文件上传人/审核人一、二中的一个 ,能则可以看到
-        List<TaskFiles> list = taskFilesMapper.getTaskFiles(taskId,user.getId());
+        List<TaskFiles> list = taskFilesMapper.getTaskFiles(taskId,user.getId(), canViewAuditFile);
 
         List<String> allIds = new ArrayList<>();
         List<String> chargeOneIds = list.stream().filter(t -> org.apache.commons.lang3.StringUtils.isNotBlank(t.getChargeOneId()))

+ 37 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/ErpOrderInfo.java

@@ -0,0 +1,37 @@
+package com.management.platform.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class ErpOrderInfo extends Model<ErpOrderInfo> {
+    private static final long serialVersionUID=1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @TableField("order_id")
+    private String orderId;
+
+    @TableField("project_id")
+    private String projectId;
+
+    @TableField("project_name")
+    private String projectName;
+
+    @TableField("line")
+    private Integer line;
+
+    @TableField("status")
+    private Integer status;
+
+    @TableField("moDId")
+    private String MoDId;
+}

+ 6 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/UserFvTime.java

@@ -54,6 +54,12 @@ public class UserFvTime extends Model<UserFvTime> {
 //    @TableField("overtime_hours")
 //    private Float overTimeHours;
 
+    @TableField("overtime_seconds")
+    private Long overTimeSeconds;
+
+    @TableField("procinst_id")
+    private String procinstId;
+
     /**
      * 是否被标记排除异常范围
      */

+ 1 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/vo/OtherTaskFileInfoVO.java

@@ -14,6 +14,7 @@ public class OtherTaskFileInfoVO {
     private String creatorName;
 
     private String documentName;
+    private String url;
     private String finalChargeId;
     private String finalChargeName;
 

+ 5 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/BusinessTripMapper.java

@@ -2,6 +2,7 @@ package com.management.platform.mapper;
 
 import com.management.platform.entity.BusinessTrip;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
 import java.util.Map;
@@ -19,4 +20,8 @@ public interface BusinessTripMapper extends BaseMapper<BusinessTrip> {
     public List<BusinessTrip> summaryData(String keyword, String startDate, String endDate, Integer companyId);
 
     List<Map<String,Object>> selectBusiness(String startDate, String endDate,String deptId);
+
+    void batchInsert(@Param("resList") List<BusinessTrip> resList);
+
+    List<String> getExistIds(@Param("procinstIds") List<String> procinstIds);
 }

+ 15 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ErpOrderInfoMapper.java

@@ -0,0 +1,15 @@
+package com.management.platform.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.management.platform.entity.ErpOrderInfo;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+@Mapper
+public interface ErpOrderInfoMapper extends BaseMapper<ErpOrderInfo> {
+    void batchInsert(@Param("resList") List<ErpOrderInfo> resList);
+
+    List<String> getExistIds(@Param("moIds") List<String> moIds);
+}

+ 4 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/LeaveSheetMapper.java

@@ -27,4 +27,8 @@ public interface LeaveSheetMapper extends BaseMapper<LeaveSheet> {
     List<Map<String,Object>> selectLeaveAll(Integer companyId, String startDate, String endDate,List<Integer> branchDepartment,List<Integer> deptIds);
 
     List<UserRestTimeVO> getCompanyUserRestTimeHours(@Param("companyId") Integer companyId,@Param("userId")String userId);
+
+    void batchInsert(@Param("resList") List<LeaveSheet> resList);
+
+    List<String> getExistIds(@Param("procinstIds") List<String> procinstIds);
 }

+ 1 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/TaskFilesMapper.java

@@ -18,7 +18,7 @@ public interface TaskFilesMapper extends BaseMapper<TaskFiles> {
 
     List<Integer> getAllNeedChargeTaskIds();
 
-    List<TaskFiles> getTaskFiles(@Param("taskId") Integer taskId, @Param("userId") String userId);
+    List<TaskFiles> getTaskFiles(@Param("taskId") Integer taskId, @Param("userId") String userId, @Param("canViewAuditFiles") Boolean canViewAuditFiles);
 
     List<TaskFiles> getAllNeedChargeTaskFiles();
 

+ 4 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/UserFvTimeMapper.java

@@ -17,4 +17,8 @@ import java.util.List;
 public interface UserFvTimeMapper extends BaseMapper<UserFvTime> {
 
     void batchInsert(@Param("toAddList") List<UserFvTime> toAddList);
+
+    void batchInsertCollect(@Param("resList") List<UserFvTime> resList);
+
+    List<String> getExistIds(@Param("procinstIds") List<String> procinstIds);
 }

+ 0 - 24
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/TaskServiceImpl.java

@@ -1012,35 +1012,11 @@ public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements Ta
                 .eq(User::getIsActive, 1)
         );
 
-//        WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id",user.getCompanyId()));
-//        CompanyDingding dingding = companyDingdingService.getOne(new LambdaQueryWrapper<CompanyDingding>().eq(CompanyDingding::getCompanyId, user.getCompanyId()));
-
         if(CollectionUtils.isNotEmpty(list)){
             Map<String, User> userMap = users.stream().collect(Collectors.toMap(User::getId, t -> t));
             for (OtherTaskFileInfoVO otherTaskFileInfoVO : list) {
                 User chargeUser = userMap.getOrDefault(otherTaskFileInfoVO.getFinalChargeId(), null);
                 otherTaskFileInfoVO.setFinalChargeName(null==chargeUser?"":chargeUser.getName());
-//                User createrUser = userMap.get(otherTaskFileInfoVO.getCreatorId());
-//                User finalChargeUser = userMap.get(otherTaskFileInfoVO.getFinalChargeId());
-//                String createrUserWxId = "";
-//                String chargeUserWxId = "";
-//                if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
-//                    createrUserWxId = createrUser.getCorpwxRealUserid();
-//                    chargeUserWxId = finalChargeUser.getCorpwxRealUserid();
-//                }else if(dingding!=null&&dingding.getContactNeedTranslate()==1){
-//                    createrUserWxId = createrUser.getDingdingUserid();
-//                    chargeUserWxId = finalChargeUser.getDingdingUserid();
-//                }
-//                if(StringUtils.isNotBlank(createrUserWxId)){
-//                    otherTaskFileInfoVO.setCreatorName("$userName=" + createrUserWxId + "$");
-//                }else{
-//                    otherTaskFileInfoVO.setCreatorName(createrUser.getName());
-//                }
-//                if(StringUtils.isNotBlank(chargeUserWxId)){
-//                    otherTaskFileInfoVO.setFinalChargeName("$userName=" + chargeUserWxId + "$");
-//                }else{
-//                    otherTaskFileInfoVO.setFinalChargeName(finalChargeUser.getName());
-//                }
             }
         }
 

+ 327 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/task/DataCollectTask.java

@@ -0,0 +1,327 @@
+package com.management.platform.task;
+
+import com.management.platform.entity.BusinessTrip;
+import com.management.platform.entity.ErpOrderInfo;
+import com.management.platform.entity.LeaveSheet;
+import com.management.platform.entity.UserFvTime;
+import com.management.platform.mapper.BusinessTripMapper;
+import com.management.platform.mapper.ErpOrderInfoMapper;
+import com.management.platform.mapper.LeaveSheetMapper;
+import com.management.platform.mapper.UserFvTimeMapper;
+import org.springframework.core.ParameterizedTypeReference;
+import org.springframework.http.*;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+import org.springframework.util.CollectionUtils;
+import org.springframework.web.client.RestTemplate;
+
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+@EnableScheduling
+@Component
+public class DataCollectTask {
+
+    @Resource
+    private UserFvTimeMapper userFvTimeMapper;
+    @Resource
+    private BusinessTripMapper businessTripMapper;
+    @Resource
+    private LeaveSheetMapper leaveSheetMapper;
+
+    @Resource
+    private ErpOrderInfoMapper erpOrderInfoMapper;
+
+    private static final String PREFIX_URL = "http://58.210.104.138:10020";
+
+
+
+    @Scheduled(cron = "0 0 1 * * ?")
+    public void sqlServerTask() {
+        System.out.println("开始测试任务定时=======================");
+        RestTemplate restTemplate = new RestTemplate();
+        String sumUrl = PREFIX_URL+"/dataCollect/getSqlServerDataSum";
+        String listUrl = PREFIX_URL+"/dataCollect/getSqlServerDataList";
+
+        try {
+            ResponseEntity<String> sumResponse = restTemplate.exchange(
+                    sumUrl,
+                    HttpMethod.GET,
+                    null,
+                    String.class
+            );
+            Integer totalNum = 0;
+            if (sumResponse.getStatusCode() == HttpStatus.OK) {
+                totalNum = Integer.parseInt(sumResponse.getBody());
+            } else {
+                System.out.println("请求失败,状态码: " + sumResponse.getStatusCode());
+            }
+            System.out.println("总数量为==== "+totalNum);
+            if(totalNum > 0){
+                int pageSize = 1000;
+                int offset = 0;
+                List<ErpOrderInfo> toAddList = new ArrayList<>();
+                List<ErpOrderInfo> toUpdateList = new ArrayList<>();
+                while (offset < totalNum) {
+                    HttpHeaders headers = new HttpHeaders();
+                    headers.setContentType(MediaType.APPLICATION_JSON);
+                    Map<String, Object> requestBody = new HashMap<>();
+                    requestBody.put("pageNo", offset);
+                    requestBody.put("pageSize", pageSize);
+                    HttpEntity<Object> requestEntity = new HttpEntity<>(requestBody, headers);
+                    ResponseEntity<List<ErpOrderInfo>> listResponse = restTemplate.exchange(
+                            listUrl,
+                            HttpMethod.POST,
+                            requestEntity,
+                            new  ParameterizedTypeReference<List<ErpOrderInfo>>(){}
+                    );
+                    if (listResponse.getStatusCode() == HttpStatus.OK) {
+                        List<ErpOrderInfo> dataList = listResponse.getBody();
+                        if(org.apache.commons.collections.CollectionUtils.isNotEmpty(dataList)){
+                            List<String> collect = dataList.stream().map(ErpOrderInfo::getMoDId).distinct().collect(Collectors.toList());
+                            List<String> existIds = erpOrderInfoMapper.getExistIds(collect);
+                            if(!CollectionUtils.isEmpty(existIds)){
+                                toUpdateList.addAll(dataList.stream().filter(t -> existIds.contains(t.getMoDId())).collect(Collectors.toList()));
+                                toAddList.addAll(dataList.stream().filter(t -> !existIds.contains(t.getMoDId())).collect(Collectors.toList()));
+                            }else{
+                                toAddList.addAll(dataList);
+                            }
+                            if(!CollectionUtils.isEmpty(toAddList)){
+                                erpOrderInfoMapper.batchInsert(toAddList);
+                            }
+                            if(!CollectionUtils.isEmpty(toUpdateList)){
+                                for (ErpOrderInfo orderInfo : toUpdateList) {
+                                    erpOrderInfoMapper.updateById(orderInfo);
+                                }
+                            }
+                            toUpdateList.clear();
+                            toAddList.clear();
+                        }
+                    }
+                    offset += pageSize;
+                }
+            }
+        } catch (Exception e) {
+            System.out.println("请求发生异常: " + e.getMessage());
+            e.printStackTrace();
+        }
+
+    }
+
+    @Scheduled(cron = "0 21 11 * * ?")
+    public void workDayTask(){
+        RestTemplate restTemplate = new RestTemplate();
+        String sumUrl = PREFIX_URL+"/dataCollect/getWorkDayDataSum";
+        String listUrl = PREFIX_URL+"/dataCollect/getWorkDayDataList";
+
+        try {
+            ResponseEntity<String> sumResponse = restTemplate.exchange(
+                    sumUrl,
+                    HttpMethod.GET,
+                    null,
+                    String.class
+            );
+            Integer totalNum = 0;
+            if (sumResponse.getStatusCode() == HttpStatus.OK) {
+                totalNum = Integer.parseInt(sumResponse.getBody());
+            } else {
+                System.out.println("请求失败,状态码: " + sumResponse.getStatusCode());
+            }
+            if(totalNum > 0){
+                int pageSize = 1000;
+                int offset = 0;
+                List<UserFvTime> toAddList = new ArrayList<>();
+                List<UserFvTime> toUpdateList = new ArrayList<>();
+                while (offset < totalNum) {
+                    HttpHeaders headers = new HttpHeaders();
+                    headers.setContentType(MediaType.APPLICATION_JSON);
+                    Map<String, Object> requestBody = new HashMap<>();
+                    requestBody.put("pageNo", offset);
+                    requestBody.put("pageSize", pageSize);
+                    HttpEntity<Object> requestEntity = new HttpEntity<>(requestBody, headers);
+                    ResponseEntity<List<UserFvTime>> listResponse = restTemplate.exchange(
+                            listUrl,
+                            HttpMethod.POST,
+                            requestEntity,
+                            new  ParameterizedTypeReference<List<UserFvTime>>(){}
+                    );
+                    if (listResponse.getStatusCode() == HttpStatus.OK) {
+                        List<UserFvTime> dataList = listResponse.getBody();
+                        if(org.apache.commons.collections.CollectionUtils.isNotEmpty(dataList)){
+                            List<String> collect = dataList.stream().map(UserFvTime::getProcinstId).distinct().collect(Collectors.toList());
+                            List<String> existIds = userFvTimeMapper.getExistIds(collect);
+                            if(!CollectionUtils.isEmpty(existIds)){
+                                toUpdateList.addAll(dataList.stream().filter(t -> existIds.contains(t.getProcinstId())).collect(Collectors.toList()));
+                                toAddList.addAll(dataList.stream().filter(t -> !existIds.contains(t.getProcinstId())).collect(Collectors.toList()));
+                            }else{
+                                toAddList.addAll(dataList);
+                            }
+                            if(!CollectionUtils.isEmpty(toAddList)){
+                                userFvTimeMapper.batchInsertCollect(toAddList);
+                            }
+                            if(!CollectionUtils.isEmpty(toUpdateList)){
+                                for (UserFvTime tmp : toUpdateList) {
+                                    userFvTimeMapper.updateById(tmp);
+                                }
+                            }
+                            toUpdateList.clear();
+                            toAddList.clear();
+                        }
+
+                    }
+                    offset += pageSize;
+                }
+            }
+        } catch (Exception e) {
+            System.out.println("请求发生异常: " + e.getMessage());
+            e.printStackTrace();
+        }
+
+    }
+
+    @Scheduled(cron = "0 0 2 * * ?")
+    public void leaveSheetTask(){
+        RestTemplate restTemplate = new RestTemplate();
+        String sumUrl = PREFIX_URL + "/dataCollect/getLeaveSheetDataSum";
+        String listUrl = PREFIX_URL + "/dataCollect/getLeaveSheetDataList";
+
+        try {
+            ResponseEntity<String> sumResponse = restTemplate.exchange(
+                    sumUrl,
+                    HttpMethod.GET,
+                    null,
+                    String.class
+            );
+            Integer totalNum = 0;
+            if (sumResponse.getStatusCode() == HttpStatus.OK) {
+                totalNum = Integer.parseInt(sumResponse.getBody());
+            } else {
+                System.out.println("请求失败,状态码: " + sumResponse.getStatusCode());
+            }
+            if(totalNum > 0){
+                int pageSize = 1000;
+                int offset = 0;
+                List<LeaveSheet> toAddList = new ArrayList<>();
+                List<LeaveSheet> toUpdateList = new ArrayList<>();
+                while (offset < totalNum) {
+                    HttpHeaders headers = new HttpHeaders();
+                    headers.setContentType(MediaType.APPLICATION_JSON);
+                    Map<String, Object> requestBody = new HashMap<>();
+                    requestBody.put("pageNo", offset);
+                    requestBody.put("pageSize", pageSize);
+                    HttpEntity<Object> requestEntity = new HttpEntity<>(requestBody, headers);
+                    ResponseEntity<List<LeaveSheet>> listResponse = restTemplate.exchange(
+                            listUrl,
+                            HttpMethod.POST,
+                            requestEntity,
+                            new  ParameterizedTypeReference<List<LeaveSheet>>(){}
+                    );
+                    if (listResponse.getStatusCode() == HttpStatus.OK) {
+                        List<LeaveSheet> dataList = listResponse.getBody();
+                        if(org.apache.commons.collections.CollectionUtils.isNotEmpty(dataList)){
+                            List<String> collect = dataList.stream().map(LeaveSheet::getProcinstId).distinct().collect(Collectors.toList());
+                            List<String> existIds = leaveSheetMapper.getExistIds(collect);
+                            if(!CollectionUtils.isEmpty(existIds)){
+                                toUpdateList.addAll(dataList.stream().filter(t -> existIds.contains(t.getProcinstId())).collect(Collectors.toList()));
+                                toAddList.addAll(dataList.stream().filter(t -> !existIds.contains(t.getProcinstId())).collect(Collectors.toList()));
+                            }else{
+                                toAddList.addAll(dataList);
+                            }
+                            if(!CollectionUtils.isEmpty(toAddList)){
+                                leaveSheetMapper.batchInsert(toAddList);
+                            }
+                            if(!CollectionUtils.isEmpty(toUpdateList)){
+                                for (LeaveSheet tmp : toUpdateList) {
+                                    leaveSheetMapper.updateById(tmp);
+                                }
+                            }
+                            toUpdateList.clear();
+                            toAddList.clear();
+                        }
+
+                    }
+                    offset += pageSize;
+                }
+            }
+        } catch (Exception e) {
+            System.out.println("请求发生异常: " + e.getMessage());
+            e.printStackTrace();
+        }
+    }
+
+    @Scheduled(cron = "0 30 2 * * ?")
+    public void businessTripTask(){
+        RestTemplate restTemplate = new RestTemplate();
+        String sumUrl = PREFIX_URL+"/dataCollect/getBusinessTripDataSum";
+        String listUrl = PREFIX_URL+"/dataCollect/getBusinessTripDataList";
+
+        try {
+            ResponseEntity<String> sumResponse = restTemplate.exchange(
+                    sumUrl,
+                    HttpMethod.GET,
+                    null,
+                    String.class
+            );
+            Integer totalNum = 0;
+            if (sumResponse.getStatusCode() == HttpStatus.OK) {
+                totalNum = Integer.parseInt(sumResponse.getBody());
+            } else {
+                System.out.println("请求失败,状态码: " + sumResponse.getStatusCode());
+            }
+            if(totalNum > 0){
+                int pageSize = 1000;
+                int offset = 0;
+                List<BusinessTrip> toAddList = new ArrayList<>();
+                List<BusinessTrip> toUpdateList = new ArrayList<>();
+                while (offset < totalNum) {
+                    HttpHeaders headers = new HttpHeaders();
+                    headers.setContentType(MediaType.APPLICATION_JSON);
+                    Map<String, Object> requestBody = new HashMap<>();
+                    requestBody.put("pageNo", offset);
+                    requestBody.put("pageSize", pageSize);
+                    HttpEntity<Object> requestEntity = new HttpEntity<>(requestBody, headers);
+                    ResponseEntity<List<BusinessTrip>> listResponse = restTemplate.exchange(
+                            listUrl,
+                            HttpMethod.POST,
+                            requestEntity,
+                            new  ParameterizedTypeReference<List<BusinessTrip>>(){}
+                    );
+                    if (listResponse.getStatusCode() == HttpStatus.OK) {
+                        List<BusinessTrip> dataList = listResponse.getBody();
+                        if(org.apache.commons.collections.CollectionUtils.isNotEmpty(dataList)){
+                            List<String> collect = dataList.stream().map(BusinessTrip::getProcinstId).distinct().collect(Collectors.toList());
+                            List<String> existIds = businessTripMapper.getExistIds(collect);
+                            if(!CollectionUtils.isEmpty(existIds)){
+                                toUpdateList.addAll(dataList.stream().filter(t -> existIds.contains(t.getProcinstId())).collect(Collectors.toList()));
+                                toAddList.addAll(dataList.stream().filter(t -> !existIds.contains(t.getProcinstId())).collect(Collectors.toList()));
+                            }else{
+                                toAddList.addAll(dataList);
+                            }
+                            if(!CollectionUtils.isEmpty(toAddList)){
+                                businessTripMapper.batchInsert(toAddList);
+                            }
+                            if(!CollectionUtils.isEmpty(toUpdateList)){
+                                for (BusinessTrip tmp : toUpdateList) {
+                                    businessTripMapper.updateById(tmp);
+                                }
+                            }
+                            toUpdateList.clear();
+                            toAddList.clear();
+                        }
+
+                    }
+                    offset += pageSize;
+                }
+            }
+        } catch (Exception e) {
+            System.out.println("请求发生异常: " + e.getMessage());
+            e.printStackTrace();
+        }
+    }
+
+}

+ 15 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/BusinessTripMapper.xml

@@ -38,6 +38,15 @@
     <sql id="Base_Column_List">
         id, company_id, owner_id, owner_name, reason, start_date, end_date, way, city_from, city_to, go_back, day_count, remark, status, deny_reason, indate, is_linked, procinst_id, gmt_finished, auditor_id, auditor_name, auditor_type, cur_audit_setting_id
     </sql>
+    <insert id="batchInsert">
+        insert into business_trip(company_id, owner_id, owner_name, reason, start_date, end_date
+        , way, city_from, city_to,day_count, status, indate,  procinst_id)
+        VALUES
+        <foreach collection="resList" separator="," item="res">
+            (#{res.companyId},#{res.ownerId},#{res.ownerName},#{res.reason},#{res.startDate},#{res.endDate}
+            ,#{res.way},#{res.cityFrom},#{res.cityTo},#{res.dayCount},#{res.status},#{res.indate},#{res.procinstId})
+        </foreach>
+    </insert>
 
     <select id="summaryData"  resultMap="BaseResultMap1">
         select owner_id, owner_name, sum(day_count) as day_count, department.department_name as department_name from business_trip
@@ -65,4 +74,10 @@
             and business_trip.start_date &lt;= #{endDate} and business_trip.end_date >= #{startDate}
         </if>
     </select>
+    <select id="getExistIds" resultType="java.lang.String">
+        select procinst_id
+        from business_trip
+        where procinst_id in
+        <foreach collection="procinstIds" item="procinstId" separator="," open="(" close=")">#{procinstId}</foreach>
+    </select>
 </mapper>

+ 18 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ErpOrderInfoMapper.xml

@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="com.management.platform.mapper.ErpOrderInfoMapper">
+
+    <insert id="batchInsert">
+        insert into erp_order_info(order_id, project_id, project_name, line, status)
+        VALUES
+            <foreach collection="resList" separator="," item="res">
+                (#{res.orderId},#{res.projectId},#{res.projectName},#{res.line},#{res.status})
+            </foreach>
+    </insert>
+    <select id="getExistIds" resultType="java.lang.String">
+        select moDId
+        from erp_order_info
+        where moDId in <foreach collection="moIds" item="moId" separator="," open="(" close=")">#{moId}</foreach>
+    </select>
+</mapper>

+ 14 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/LeaveSheetMapper.xml

@@ -31,6 +31,15 @@
     <sql id="Base_Column_List">
         id, company_id, owner_id, owner_name, start_date, end_date, leave_type, status, remark, operator_id, time_hours, time_days, indate, time_type, tel, auditor_id, auditor_name, auditor_type, procinst_id, gmt_finished, cur_audit_setting_id
     </sql>
+    <insert id="batchInsert">
+        insert into leave_sheet(company_id, owner_id, owner_name,start_date, end_date, leave_type, status, remark
+        , operator_id, time_hours, time_days, indate, time_type, tel, procinst_id) VALUES
+        <foreach collection="resList" separator="," item="res">
+            (#{res.companyId},#{res.ownerId},#{res.ownerName},#{res.startDate},#{res.endDate}
+            ,#{res.leaveType},#{res.status},#{res.remark},#{res.operatorId},#{res.timeHours},#{res.timeDays}
+            ,#{res.indate},#{res.timeType},#{res.tel},#{res.procinstId})
+        </foreach>
+    </insert>
     <select id="summaryData"  resultMap="BaseResultMap">
         select owner_id, owner_name, sum(time_hours) as time_hours, sum(time_days) as time_days from leave_sheet
         where start_date &gt;= #{startDate} and end_date &lt;= #{endDate}
@@ -99,4 +108,9 @@
                 group by owner_id
             ) tmp2 on tmp1.id = tmp2.userId
     </select>
+    <select id="getExistIds" resultType="java.lang.String">
+        select procinst_id
+        from leave_sheet
+        where procinst_id in <foreach collection="procinstIds" item="procinstId" separator="," open="(" close=")">#{procinstId}</foreach>
+    </select>
 </mapper>

+ 5 - 3
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/TaskFilesMapper.xml

@@ -32,11 +32,13 @@
         select *
         from task_files
         where task_id = #{taskId}
-          and (
+        <if test="!canViewAuditFiles">
+            and (
             charge_one_id = #{userId} or charge_two_id = #{userId} or creator_id = #{userId}
-                or need_file_charge = 0
-                or final_charge_status = 1
+            or need_file_charge = 0
+            or final_charge_status = 1
             )
+        </if>
         ORDER BY indate desc
     </select>
     <select id="getAllNeedChargeTaskFiles" resultType="com.management.platform.entity.TaskFiles">

+ 1 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/TaskMapper.xml

@@ -741,7 +741,7 @@
         group by project_id
     </select>
     <select id="getOtherTaskChargePage" resultType="com.management.platform.entity.vo.OtherTaskFileInfoVO">
-        select tf.task_id,task.name as taskName
+        select tf.task_id,task.name as taskName,tf.url
         ,p.id as projectId,p.project_name,task.group_id
         ,tf.creator_id,tf.creator_name,tf.document_name
         ,case tf.charge_stage

+ 0 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/UserFvTimeMapper.xml


Certains fichiers n'ont pas été affichés car il y a eu trop de fichiers modifiés dans ce diff