Переглянути джерело

Merge remote-tracking branch 'origin/master'

yusm 1 рік тому
батько
коміт
031ac4404e
93 змінених файлів з 2645 додано та 2865 видалено
  1. 393 388
      fhKeeper/formulahousekeeper/customerBuler-crm/package-lock.json
  2. 2 1
      fhKeeper/formulahousekeeper/customerBuler-crm/package.json
  3. 12 1
      fhKeeper/formulahousekeeper/customerBuler-crm/src/App.vue
  4. 1 1
      fhKeeper/formulahousekeeper/customerBuler-crm/src/components/ReEcharts/index.vue
  5. 1 0
      fhKeeper/formulahousekeeper/customerBuler-crm/src/components/TaskModal/api.ts
  6. 14 8
      fhKeeper/formulahousekeeper/customerBuler-crm/src/components/TaskModal/index.vue
  7. 1 0
      fhKeeper/formulahousekeeper/customerBuler-crm/src/main.ts
  8. 0 5
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/business/detail/index.vue
  9. 0 5
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/customer/detail/index.vue
  10. 2 2
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/login.vue
  11. 0 5
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/product/detail/index.vue
  12. 2 2
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/register.vue
  13. 12 5
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/tasks/ExportModal.vue
  14. 7 2
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/tasks/ImportModal.vue
  15. 7 1
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/tasks/api.ts
  16. 28 19
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/tasks/index.vue
  17. 3 2
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/test/echarts.vue
  18. 11 2
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/thread/index.vue
  19. 4 56
      fhKeeper/formulahousekeeper/customerBuler-crm/src/router/index.ts
  20. 66 0
      fhKeeper/formulahousekeeper/customerBuler-crm/src/router/routerGuards.ts
  21. 9 0
      fhKeeper/formulahousekeeper/customerBuler-crm/src/styles/element-plus.scss
  22. 1 1
      fhKeeper/formulahousekeeper/customerBuler-crm/src/styles/global.scss
  23. 17 5
      fhKeeper/formulahousekeeper/customerBuler-crm/vite.config.ts
  24. 8 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/SalesOrderController.java
  25. 2 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/SalesOrderService.java
  26. 195 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/SalesOrderServiceImpl.java
  27. 0 1773
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/task/TimingTask.java
  28. 16 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/CompanyDingdingController.java
  29. 8 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ExpenseItemController.java
  30. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/GroupBudgetReviewController.java
  31. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectRequirementController.java
  32. 7 6
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportController.java
  33. 16 7
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportLogController.java
  34. 16 13
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/TaskCommentController.java
  35. 17 5
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/TaskController.java
  36. 39 5
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/UserController.java
  37. 31 4
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/UserCorpwxTimeController.java
  38. 21 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/UserReportDeptController.java
  39. 3 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/Report.java
  40. 6 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/TimeType.java
  41. 3 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/User.java
  42. 42 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/UserReportDept.java
  43. 1 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/vo/ExpenseItemVO.java
  44. 1 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/vo/TimelinessRateVO.java
  45. 16 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/UserReportDeptMapper.java
  46. 3 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/CompanyDingdingService.java
  47. 2 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/DepartmentService.java
  48. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ReportService.java
  49. 16 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/UserReportDeptService.java
  50. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/UserService.java
  51. 41 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/CompanyDingdingServiceImpl.java
  52. 6 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ContractServiceImpl.java
  53. 32 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/DepartmentServiceImpl.java
  54. 52 26
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/DingDingServiceImpl.java
  55. 5 5
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ExcelExportServiceImpl.java
  56. 43 20
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ExpenseSheetServiceImpl.java
  57. 21 7
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/FinanceServiceImpl.java
  58. 22 18
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/InformationServiceImpl.java
  59. 10 3
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/LeaveSheetServiceImpl.java
  60. 29 6
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectApprovalServiceImpl.java
  61. 28 7
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectPercentageServiceImpl.java
  62. 229 68
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java
  63. 157 30
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java
  64. 2 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/SysRoleServiceImpl.java
  65. 4 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/TaskRestartServiceImpl.java
  66. 27 4
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/TaskServiceImpl.java
  67. 20 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/UserReportDeptServiceImpl.java
  68. 59 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/UserServiceImpl.java
  69. 34 4
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/task/TimingTask.java
  70. 13 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/CompanyDingdingMapper.xml
  71. 2 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ExpenseItemMapper.xml
  72. 2 2
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectMapper.xml
  73. 8 6
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ReportMapper.xml
  74. 4 4
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/TaskMapper.xml
  75. 2 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/TimeTypeMapper.xml
  76. 7 3
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/UserMapper.xml
  77. 17 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/UserReportDeptMapper.xml
  78. BIN
      fhKeeper/formulahousekeeper/management-platform/费用报销导入模板.xlsx
  79. 9 8
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java
  80. 3 0
      fhKeeper/formulahousekeeper/octopus/src/views/customer/list.vue
  81. 6 0
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/entity/TimeType.java
  82. 3 1
      fhKeeper/formulahousekeeper/ops-platform/src/main/resources/mapper/TimeTypeMapper.xml
  83. 4 2
      fhKeeper/formulahousekeeper/timesheet/src/components/cascader.vue
  84. 6 2
      fhKeeper/formulahousekeeper/timesheet/src/components/translationOpenData.vue
  85. 9 5
      fhKeeper/formulahousekeeper/timesheet/src/components/translationOpenDataText.vue
  86. 2 2
      fhKeeper/formulahousekeeper/timesheet/src/views/project/cost.vue
  87. 163 6
      fhKeeper/formulahousekeeper/timesheet/src/views/team/index.vue
  88. 90 40
      fhKeeper/formulahousekeeper/timesheet/src/views/workReport/daily.vue
  89. 324 240
      fhKeeper/formulahousekeeper/timesheet/src/views/workReport/list.vue
  90. 2 0
      fhKeeper/formulahousekeeper/timesheet_h5/public/index.html
  91. 9 4
      fhKeeper/formulahousekeeper/timesheet_h5/src/components/translationOpenDataText.vue
  92. 68 2
      fhKeeper/formulahousekeeper/timesheet_h5/src/views/edit/index.vue
  93. 5 3
      fhKeeper/formulahousekeeper/timesheet_h5/src/views/login/index.vue

Різницю між файлами не показано, бо вона завелика
+ 393 - 388
fhKeeper/formulahousekeeper/customerBuler-crm/package-lock.json


+ 2 - 1
fhKeeper/formulahousekeeper/customerBuler-crm/package.json

@@ -19,7 +19,8 @@
     "pinia": "^2.1.7",
     "pinia-plugin-persistedstate": "^3.2.1",
     "vue": "^3.4.19",
-    "vue-router": "^4.3.0"
+    "vue-router": "^4.3.0",
+    "vuex": "^4.1.0"
   },
   "devDependencies": {
     "@types/node": "^20.11.24",

+ 12 - 1
fhKeeper/formulahousekeeper/customerBuler-crm/src/App.vue

@@ -8,7 +8,7 @@
 </template>
 
 <script setup lang="ts">
-import { provide } from 'vue'
+import { provide, onMounted } from 'vue'
 import { useStore } from '@/store/index'
 import { ElNotification, NotificationParamsTyped } from 'element-plus'
 const { setAsyncRoutesMark } = useStore()
@@ -49,6 +49,17 @@ provide<GlobalPopup>('globalPopup', {
 const notificationTiop = (options: NotificationParamsTyped) => {
   ElNotification(options)
 }
+ 
+onMounted(() => {
+  // 重置 primary 主题颜色
+  document.body.style.setProperty('--el-color-primary', '#075985')
+  document.body.style.setProperty('--el-color-primary-light-3', '#518baa')
+  document.body.style.setProperty('--el-color-primary-light-5', '#83acc2')
+  document.body.style.setProperty('--el-color-primary-light-7', '#b5cdda')
+  document.body.style.setProperty('--el-color-primary-light-8', '#cddee7')
+  document.body.style.setProperty('--el-color-primary-light-9', '#e6eef3')
+  document.body.style.setProperty('--el-color-primary-dark-2', '#06476a')
+})
 
 </script>
 

+ 1 - 1
fhKeeper/formulahousekeeper/customerBuler-crm/src/components/ReEcharts/index.vue

@@ -62,5 +62,5 @@ watch(
 </script>
 
 <template>
-	<div ref="myChartsRef" :style="{ height: height, width: width }" :option="option" />
+	<div ref="myChartsRef" :style="{ height: height, width: width }" :option="option"></div>
 </template>

+ 1 - 0
fhKeeper/formulahousekeeper/customerBuler-crm/src/components/TaskModal/api.ts

@@ -117,3 +117,4 @@ export const ALL_BUSINESS = "/business-opportunity/getAll"; //商机
 export const ALL_CONTACTS = "/contacts/allContacts"; //联系人
 
 export const ALL_USERS = "/user/getSimpleActiveUserList"; //获取所有人
+export const ALL_ORDERS = "/order/list"//销售订单

+ 14 - 8
fhKeeper/formulahousekeeper/customerBuler-crm/src/components/TaskModal/index.vue

@@ -128,9 +128,9 @@
 
 <script lang="ts" setup>
 import { ref, watch } from 'vue';
-import { PRIORITY, TASK_TYPE, TASK_TYPE_FIELD, defalutModalForm, REPEAT_TYPE, CUSTOMER_FORM_URL, defaultGenerateFormData, ALL_CUSTOM, ALL_CLUE, ALL_BUSINESS, ALL_CONTACTS, ALL_USERS, getTaskType } from "./api";
+import { PRIORITY, TASK_TYPE, TASK_TYPE_FIELD, defalutModalForm, REPEAT_TYPE, CUSTOMER_FORM_URL, defaultGenerateFormData, ALL_CUSTOM, ALL_CLUE, ALL_BUSINESS, ALL_CONTACTS, ALL_ORDERS, ALL_USERS, getTaskType } from "./api";
 import { GenerateForm } from "@zmjs/form-design"
-import { get } from '@/utils/request';
+import { get, post } from '@/utils/request';
 import { Delete, Plus } from "@element-plus/icons-vue"
 import { FormInstance, dayjs } from 'element-plus';
 import { getFromValue } from '@/utils/tools';
@@ -155,10 +155,10 @@ watch(() => props.visible, (val) => {
   }
 })
 const customeData = ref<any>([])
-const clueData = ref<any>([])
 const businessData = ref<any>([])
+const orderData = ref<any>([])
+const clueData = ref<any>([])
 watch(() => props.editForm, (val) => {
-
   let taskType = 0;
   if (val) {
     taskType = getTaskType(val);
@@ -175,6 +175,12 @@ watch(() => props.editForm, (val) => {
       taskTypeValueData.value = data;
     }
   })
+  post(ALL_ORDERS, { pageIndex: -1, pageSize: -1 }).then(({ data }) => {
+    orderData.value = data.record;//销售订单
+    if (taskType == 2) {
+      taskTypeValueData.value = data;
+    }
+  })
   get(ALL_CLUE, {}).then(({ data }) => {
     clueData.value = data;//线索
     if (taskType == 3) {
@@ -216,9 +222,9 @@ function closeVisible() {
 }
 function submitForm(formEl: FormInstance | undefined, isClose: boolean) {
   if (!formEl) return
-  formEl.validate((valid) => {
+  formEl.validate((valid: boolean) => {
     if (!valid) {
-      return false
+      return false as any
     }
     const repeatDesignDay = customeDate.value.join(",")
     generateFormRef.value?.getData().then((res: any) => {
@@ -270,7 +276,7 @@ function changeTaskType(value: TASK_VALUE_TYPE) {
     case 2:
       taskTypeValueData.value = [];
       setTimeout(() => {
-        taskTypeValueData.value = [{ label: "订单1", value: 1 }, { label: "订单2", value: 2 }]
+        taskTypeValueData.value = orderData.value
       }, 500)
       break;
     case 3:
@@ -318,7 +324,7 @@ function changeRepeatType(value: REPEAT_VALUE_TYPE) {
   customeDate.value = [];
 }
 
-function changeEndType(value: string | number | boolean) {
+function changeEndType(value: string | number | boolean | undefined) {
   form.value = {
     ...form.value,
     endType: value, //重复类型

+ 1 - 0
fhKeeper/formulahousekeeper/customerBuler-crm/src/main.ts

@@ -3,6 +3,7 @@ import { createPinia } from 'pinia'
 import ElementPlus from 'element-plus'
 import "./TailWindCss/index.css";
 import 'element-plus/dist/index.css'
+// import './styles/element-plus.scss'
 import 'animate.css/animate.min.css' //引入动画
 import * as ElementPlusIconsVue from '@element-plus/icons-vue'
 import piniaPluginPersistedstate from 'pinia-plugin-persistedstate'

+ 0 - 5
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/business/detail/index.vue

@@ -159,10 +159,5 @@ function handleScroll(event: any) { // 滚表横向滚动
     padding-top: 4px;
     padding-bottom: 4px;
   }
-
-  .selectClas >>> .el-select__wrapper {
-    background-color: none !important;
-    box-shadow: none !important;
-  }
 }
 </style>

+ 0 - 5
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/customer/detail/index.vue

@@ -158,10 +158,5 @@ function handleScroll(event: any) { // 滚表横向滚动
     padding-top: 4px;
     padding-bottom: 4px;
   }
-
-  .selectClas >>> .el-select__wrapper {
-    background-color: none !important;
-    box-shadow: none !important;
-  }
 }
 </style>

+ 2 - 2
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/login.vue

@@ -68,9 +68,9 @@ const login = (formEl: FormInstance | undefined) => {
   if (!formEl) {
     return
   }
-  formEl.validate((valid) => {
+  formEl.validate((valid: boolean) => {
     if (!valid) {
-      return false;
+      return false as any;
     }
     loginLoading.value = true;
     //console.log(ruleForm.value);

+ 0 - 5
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/product/detail/index.vue

@@ -182,10 +182,5 @@ onMounted(() => {
     padding-top: 4px;
     padding-bottom: 4px;
   }
-
-  .selectClas>>>.el-select__wrapper {
-    background-color: none !important;
-    box-shadow: none !important;
-  }
 }
 </style>

+ 2 - 2
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/register.vue

@@ -138,9 +138,9 @@ const register = (formEl: FormInstance | undefined) => {
     return
   }
 
-  formEl.validate((valid) => {
+  formEl.validate((valid: boolean) => {
     if (!valid) {
-      return false;
+      return false as any;
     }
     registerLoading.value = true;
     let params = {

+ 12 - 5
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/tasks/ExportModal.vue

@@ -37,11 +37,13 @@
 
 <script lang="ts" setup>
 import { ref, watch } from 'vue';
-import { defalutExportForm, PRIORITY,ALL_USERS } from './api';
+import { defalutExportForm, PRIORITY, ALL_USERS } from './api';
 import { post } from '@/utils/request';
 import { Emits, Props } from './type';
+import { dayjs } from 'element-plus';
 const props = defineProps<Props>();
 const emits = defineEmits<Emits>();
+
 watch(() => props.visible, (val) => {
   if (val) {
     form.value = { ...defalutExportForm }
@@ -50,21 +52,26 @@ watch(() => props.visible, (val) => {
     })
   }
 })
+
+const formRef = ref();
+const form = ref<any>({})
+const executorValueData = ref<any>([])
+
 function closeVisible() {
   emits("close")
 }
 function submit() {
-  const { executorId, ...rest } = form.value;
+  const { executorId, startDate, endDate, ...rest } = form.value;
   const data = {
     ...rest,
+    startDate: startDate && dayjs(startDate).format('YYYY-MM-DD 00:00:00'),
+    endDate: endDate && dayjs(endDate).format('YYYY-MM-DD 23:59:59'),
     executorId: executorId.join(','),
   }
   emits("submit", data)
 }
 
-const formRef = ref();
-const form = ref<any>({})
-const executorValueData = ref<any>([])
+
 </script>
 
 <style lang="scss">

+ 7 - 2
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/tasks/ImportModal.vue

@@ -14,9 +14,11 @@
       </div>
     </template>
     <div class="text-lg p-5">
-      <div class="pb-5">1. 点击下载 <a href="###" download class="text-[#79BBFF]">任务导入模板</a></div>
+      <div class="pb-5">1. 点击下载 <a @click="getTemplate()" class="text-[#79BBFF] cursor-pointer">任务导入模板</a></div>
       <div>2. 填写excel文件, 任务名称与优先级必填</div>
+
     </div>
+    <!--  -->
   </el-dialog>
 </template>
 <script lang="ts" setup>
@@ -25,7 +27,6 @@ import { Props, Emits } from "./type"
 
 const props = defineProps<Props>();
 const emits = defineEmits<Emits>();
-
 watch(() => props.saveLoading, (newValue) => {
   if (!fileInputRef.value) return
   fileInputRef.value.value = ""
@@ -37,6 +38,10 @@ watch(() => props.saveLoading, (newValue) => {
 
 const fileInputRef = ref<HTMLInputElement>();
 
+function getTemplate() {
+
+}
+
 function submit() {
   fileInputRef.value?.click()
 }

+ 7 - 1
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/tasks/api.ts

@@ -1,5 +1,4 @@
 import { EpPropMergeType } from "element-plus/es/utils";
-
 export const MOD = "/tasks";
 
 type StatusType = {
@@ -56,3 +55,10 @@ export const UPDATE_TASK_STATUS = `${MOD}/updateTaskStatus`; //更新任务状
 export const UPDATE_TASK = `${MOD}/updateTask`;//修改任务
 
 export const ALL_USERS = "/user/getSimpleActiveUserList"; //获取所有人
+
+export const GET_IMPORT_TEMPLATE = `${MOD}/getImportTemplate`;
+
+export const IMPORT_DATA = `${MOD}/importData`;//导入
+
+export const EXPORT_DATA = `${MOD}/exportData`;//按条件导出
+export const EXPORT_DATA_BY_TASK_ID = `${MOD}/exportDataByTaskIds`;//选中导出

+ 28 - 19
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/tasks/index.vue

@@ -53,7 +53,7 @@
       <div class="bg-white w-full h-full p-3 shadow-md rounded-md flex flex-col">
         <div class="ml-auto p-3">
           <el-button type="primary" @click="createTasks()">创建任务</el-Button>
-          <el-button type="primary" :loading="btnLoading" @click="deleteTasks()">批量删除</el-Button>
+          <el-button type="primary" :disabled="len == 0" :loading="btnLoading" @click="deleteTasks()">批量删除</el-Button>
           <el-button type="primary" @click="openImportModal()">导入</el-Button>
           <el-button type="primary" :loading="btnLoading" @click="exportTasks()">导出</el-Button>
         </div>
@@ -155,16 +155,16 @@
 </template>
 
 <script lang="ts" setup>
-import { inject, onBeforeMount, onMounted, ref } from 'vue';
+import { computed, inject, onBeforeMount, onMounted, ref, } from 'vue';
 import { useRouter } from 'vue-router';
 import { useStore } from '@/store';
-import { MOD, PRIORITY, STATUS, defaultSearchForm, PAGE_LIST, ADD_TASK, DELETE_TASKS, UPDATE_TASK, UPDATE_TASK_STATUS } from './api';
+import { MOD, PRIORITY, STATUS, defaultSearchForm, PAGE_LIST, ADD_TASK, DELETE_TASKS, UPDATE_TASK, UPDATE_TASK_STATUS, IMPORT_DATA, EXPORT_DATA, EXPORT_DATA_BY_TASK_ID } from './api';
 import { ElTable, dayjs } from 'element-plus';
 import TaskModal from '@/components/TaskModal/index.vue';
 import ImportModal from './ImportModal.vue';
 import ExportModal from './ExportModal.vue';
-import { get, post, uploadFile } from '@/utils/request';
-import { getFromValue, confirmAction } from '@/utils/tools';
+import { post, uploadFile } from '@/utils/request';
+import { getFromValue, confirmAction, downloadFile } from '@/utils/tools';
 import { pushMap } from './type';
 const router = useRouter()
 const { getFunctionList } = useStore()
@@ -173,7 +173,9 @@ const pagePermission = ref<any[]>();
 const taskModalVisible = ref(false);
 const taskForm = ref<any>();
 const isEdit = ref(false);
-
+const len = computed(() => {
+  return tableRef.value?.getSelectionRows().length
+})
 const taskLoading = ref<saveLoadingType>("1");
 function closeTaskModal() {
   taskModalVisible.value = false;
@@ -194,15 +196,12 @@ function submitForm(data: any, isClose: boolean) {
       taskLogs: []
     }
   }
-  // console.log("提交的数据", getFromValue(params));
-  // return;
   taskLoading.value = "2";
   let url = isEdit.value ? UPDATE_TASK : ADD_TASK
   let msg = isEdit.value ? "修改成功" : "新建成功"
   post(url, getFromValue(params)).then(() => {
     taskLoading.value = "3";
     taskModalVisible.value = isClose;
-
     globalPopup?.showSuccess(msg)
     search();
   }).catch(err => {
@@ -284,15 +283,13 @@ function closeImportModal() {
   importVisible.value = false;
 }
 function importExcel(data: any) {
-  console.log("需要提交的数据,importExcel", data);
-  return
   const formData = new FormData();
-  formData.append("file", data);
-  formData.append("projectId", "32277");
+  formData.append("multipartFile", data);
   importLoading.value = "2";
-  uploadFile("/document/uploadDocument", formData).then(_res => {
+  uploadFile(IMPORT_DATA, formData).then(_res => {
     globalPopup?.showSuccess("导入成功")
     importLoading.value = "3";
+    search();
   }).catch(err => {
     globalPopup?.showError(err)
     importLoading.value = "4";
@@ -303,26 +300,38 @@ const exportVisible = ref(false);
 const exportLoading = ref<saveLoadingType>("1");
 const btnLoading = ref(false);
 function exportTasks() {
-  const data = tableRef.value?.getSelectionRows()
+  const data: any[] = tableRef.value?.getSelectionRows()
   if (data.length === 0) {
     // TODO 
     exportVisible.value = true;
     return
   }
   btnLoading.value = true;
-  setTimeout(() => {
+  const taskIds = data.map((v: any) => v.id).join(",");
+  post(EXPORT_DATA_BY_TASK_ID, {
+    taskIds
+  }).then(({ data }) => {
+    downloadFile(data, "任务列表.xlsx");
     btnLoading.value = false;
-  }, 2000)
+  }).catch(err => {
+    btnLoading.value = false;
+    globalPopup?.showError(err)
+  })
 }
 function closeExportModal() {
   exportVisible.value = false;
 }
 function exportExcel(data: any) {
-  console.log("export", data);
   exportLoading.value = "2";
-  setTimeout(() => {
+  post(EXPORT_DATA, getFromValue(data)).then(({ data }) => {
+    downloadFile(data, "任务列表.xlsx");
     exportLoading.value = "3";
     exportVisible.value = false;
+  }).catch(err => {
+    globalPopup?.showError(err)
+  })
+  setTimeout(() => {
+
   }, 2000)
 }
 function editRow(row: any) {

+ 3 - 2
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/test/echarts.vue

@@ -1,6 +1,6 @@
 <template>
   <div :style="{ width: '1230px', height: '350px' }">
-    <Echarts :option="option" />
+    <Echarts :option="{}"></Echarts>
   </div>
 </template>
 
@@ -141,4 +141,5 @@ const option = reactive<Partial<EChartsOption>>({
 });
 </script>
 
-<style lang="scss" scoped></style>
+<style lang="scss" scoped>
+</style>

+ 11 - 2
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/thread/index.vue

@@ -81,8 +81,10 @@
             <el-table-column label="操作" fixed="right" width="200">
               <template #default="scope">
                 <el-button link type="primary" size="large" @click="editClue(scope.row)">编辑</el-button>
+                <!-- <el-button link type="primary" size="large"
+                  @click="dialogVisible.taskModalVisible = true">新建任务</el-button> -->
                 <el-button link type="primary" size="large"
-                  @click="dialogVisible.taskModalVisible = true">新建任务</el-button>
+                  @click="newTask(scope.row)">新建任务</el-button>
                 <el-button link type="danger" size="large" @click.prevent="deleteRow(scope.row)">删除</el-button>
               </template>
             </el-table-column>
@@ -138,7 +140,7 @@
 
     <DeteleTables :visibles="dialogVisible.deteleClueDialogVisible" @showDeteleClue="showDeteleClue" />
 
-    <TaskModal :visible="dialogVisible.taskModalVisible" :edit-form="createTaskFromType(3)" :save-loading="'1'"
+    <TaskModal :visible="dialogVisible.taskModalVisible" :edit-form="taskModalForm" :save-loading="'1'"
       @close="closeTaskModal" @submit="submitForm" :title="'新建任务'" :disabled-list="['taskType', 'clueId']" />
   </div>
 </template>
@@ -218,6 +220,7 @@ const clueTemplate = ref({
   config: {}
 }) // 线索模板
 const editForm = ref({}) // 编辑表单
+const taskModalForm = ref({}) // 任务弹窗表单
 
 // 批量变量
 const transferForm = reactive({
@@ -227,6 +230,12 @@ const transferForm = reactive({
 
 
 // 定义方法
+function newTask(item: any) {
+  const { id } = item
+  taskModalForm.value = { ...createTaskFromType(3), clueId: id, }
+  dialogVisible.taskModalVisible = true
+}
+
 function showDeteleClue(flag: boolean) {
   dialogVisible.deteleClueDialogVisible = flag
 }

+ 4 - 56
fhKeeper/formulahousekeeper/customerBuler-crm/src/router/index.ts

@@ -1,5 +1,6 @@
 import { RouteRecordRaw, createRouter, createWebHistory } from "vue-router";
 import { useStore } from "@/store/index";
+import { createRouterGuards } from "./routerGuards";
 export const routes: RouteRecordRaw[] = [
   {
     path: "/",
@@ -44,60 +45,7 @@ const router = createRouter({
   history: createWebHistory(),
   routes,
 });
-router.beforeEach((to, _from, next) => {
-  const routerList = useStore().routers;
-  const routers = router.getRoutes();
-  const { setAsyncRoutesMark, asyncRoutesMark, getToken } = useStore();
-  const token = getToken;
-  const skipPath = ["/login", "/register", "/test", "/testEcharts"];
-  if (skipPath.includes(to.path)) {
-    next();
-  } else {
-    if (token && routerList && routerList.length > 0) {
-      if (asyncRoutesMark) {
-        next();
-      } else {
-        setAsyncRoutesMark(true);
-        const newRouters: any = routers;
-        const addNewRouter = newRouters.find(
-          (item: any) => item.path == "/home"
-        );
-      
-        let modules = import.meta.glob("@/pages/**/*.vue");
-        console.log(modules);
-        routerList.forEach((item: any) => {
-          let filePath = item.path.replace("/", "")
-          if (item.children && item.children.length > 0) {
-            item.children.forEach((child: any) => {
-              let childFilePath = child.path.replace("/", "");
-              addNewRouter?.children.push({
-                path: child.path,
-                name: child.name,
-                meta: {},
-                component: modules[`/src/pages/${childFilePath}/index.vue`]
-              });
-            });
-          } else {
-            addNewRouter?.children.push({
-              path: item.path,
-              name: item.name,
-              meta: {},
-              component: modules[`/src/pages/${filePath}/index.vue`],
-            });
-          }
-        });
-        router.addRoute(addNewRouter);
-        router.addRoute({
-          path: '/:catchAll(.*)',
-          name: 'NotFound',
-          component: () => import("../pages/404.vue"),
-        })
-        next({ ...to, replace: true });
-      }
-    } else {
-      //console.log("无登录信息,跳转到登录页");
-      next(`/login`);
-    }
-  }
-});
+const { beforeEach } = createRouterGuards(router);
+
+router.beforeEach(beforeEach);
 export default router;

+ 66 - 0
fhKeeper/formulahousekeeper/customerBuler-crm/src/router/routerGuards.ts

@@ -0,0 +1,66 @@
+// src/router/routerGuards.ts
+import { RouteLocationNormalized, NavigationGuardNext, Router } from "vue-router";
+import { useStore } from "@/store/index";
+
+export function createRouterGuards(router: Router) {
+  const beforeEach = (to: RouteLocationNormalized, _from: RouteLocationNormalized, next: NavigationGuardNext) => {
+    const routerList = useStore().routers;
+    const routers = router.getRoutes();
+    const { setAsyncRoutesMark, asyncRoutesMark, getToken } = useStore();
+    const token = getToken;
+    const skipPath = ["/login", "/register", "/test", "/testEcharts"];
+    if (skipPath.includes(to.path)) {
+      next();
+    } else {
+      if (token && routerList && routerList.length > 0) {
+        if (asyncRoutesMark) {
+          next();
+        } else {
+          setAsyncRoutesMark(true);
+          const newRouters: any = routers;
+          const addNewRouter = newRouters.find(
+            (item: any) => item.path == "/home"
+          );
+
+          let modules = import.meta.glob("@/pages/**/*.vue");
+          console.log(modules);
+          routerList.forEach((item: any) => {
+            let filePath = item.path.replace("/", "")
+            if (item.children && item.children.length > 0) {
+              item.children.forEach((child: any) => {
+                let childFilePath = child.path.replace("/", "");
+                addNewRouter?.children.push({
+                  path: child.path,
+                  name: child.name,
+                  meta: {},
+                  component: modules[`/src/pages/${childFilePath}/index.vue`]
+                });
+              });
+            } else {
+              addNewRouter?.children.push({
+                path: item.path,
+                name: item.name,
+                meta: {},
+                component: modules[`/src/pages/${filePath}/index.vue`],
+              });
+            }
+          });
+          router.addRoute(addNewRouter);
+          router.addRoute({
+            path: '/:catchAll(.*)',
+            name: 'NotFound',
+            component: () => import("../pages/404.vue"),
+          })
+          next({ ...to, replace: true });
+        }
+      } else {
+        //console.log("无登录信息,跳转到登录页");
+        next(`/login`);
+      }
+    }
+  };
+
+  return {
+    beforeEach,
+  };
+}

+ 9 - 0
fhKeeper/formulahousekeeper/customerBuler-crm/src/styles/element-plus.scss

@@ -0,0 +1,9 @@
+@forward "element-plus/theme-chalk/src/common/var.scss" with (
+  $colors: (
+    "primary": (
+      "base": #075985,
+    ),
+  )
+);
+
+@use "element-plus/theme-chalk/src/index.scss" as *;

+ 1 - 1
fhKeeper/formulahousekeeper/customerBuler-crm/src/styles/global.scss

@@ -50,4 +50,4 @@ $modena: #6f4afe;
 .el-dialog__header, .el-dialog__body{
   margin: 0 !important;
   padding: 0 !important;
-}
+}

+ 17 - 5
fhKeeper/formulahousekeeper/customerBuler-crm/vite.config.ts

@@ -3,8 +3,8 @@ import vue from "@vitejs/plugin-vue";
 
 import { resolve } from "path";
 
-// const target = "http://192.168.2.8:10010";
-const target = "http://192.168.2.178:10010";
+const target = "http://192.168.2.8:10080";
+// const target = "http://192.168.2.178:10010";
 // const target = "http://47.101.180.183:10010";
 
 export default defineConfig({
@@ -26,16 +26,28 @@ export default defineConfig({
     alias: {
       "@": resolve(__dirname, "./src"),
     },
-    //extensions: [".ts", ".js", ".vue", ".json", ".mjs"],
     extensions: [".mjs", ".js", ".ts", ".jsx", ".tsx", ".json", ".vue"],
   },
-  // css相关配置
   css: {
     preprocessorOptions: {
       scss: {
         additionalData: '@import "@/styles/global.scss";'
-
       },
     },
   },
+
+  build: {
+    rollupOptions: {
+      output: {
+        entryFileNames: `assets/[name].${new Date().getTime()}.js`,
+        chunkFileNames: `assets/[name].${new Date().getTime()}.js`,
+        assetFileNames: `assets/[name].${new Date().getTime()}.[ext]`,
+        compact: true,
+        manualChunks: {
+          vue: ['vue', 'vue-router', 'vuex'],
+          echarts: ['echarts']
+        },
+      },
+    }
+  }
 });

+ 8 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/SalesOrderController.java

@@ -182,5 +182,13 @@ public class SalesOrderController {
         return msg;
     }
 
+    /**
+     * 销售简报数据
+     */
+    @RequestMapping("salesKit")
+    public HttpRespMsg salesKit(Integer queryType,Integer dateType,String startDate,String endDate){
+        return salesOrderService.salesKit(queryType,dateType,startDate,endDate);
+    }
+
 }
 

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

@@ -20,4 +20,6 @@ public interface SalesOrderService extends IService<SalesOrder> {
     HttpRespMsg importData(MultipartFile multipartFile);
 
     HttpRespMsg exportData(String userId, String orderName, String orderCode, String productCode) throws Exception;
+
+    HttpRespMsg salesKit(Integer queryType,Integer dateType, String startDate, String endDate);
 }

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

@@ -20,16 +20,28 @@ import org.apache.poi.ss.usermodel.CellType;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.multipart.MultipartFile;
 
 import javax.annotation.Resource;
+import javax.print.DocFlavor;
 import javax.servlet.http.HttpServletRequest;
 import java.io.*;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.text.NumberFormat;
+import java.text.SimpleDateFormat;
+import java.time.LocalDate;
+import java.time.Year;
+import java.time.format.DateTimeFormatter;
+import java.time.temporal.TemporalAdjusters;
 import java.util.*;
 import java.util.stream.Collectors;
 
+import static java.text.NumberFormat.getPercentInstance;
+
 /**
  * <p>
  *  服务实现类
@@ -61,6 +73,12 @@ public class SalesOrderServiceImpl extends ServiceImpl<SalesOrderMapper, SalesOr
     private SysFormMapper sysFormMapper;
     @Resource
     private WxCorpInfoService wxCorpInfoService;
+    @Resource
+    private CustomService customService;
+    @Resource
+    private BusinessOpportunityService businessOpportunityService;
+    @Resource
+    private ContactsService contactsService;
     @Value(value = "${upload.path}")
     private String path;
 
@@ -359,6 +377,183 @@ public class SalesOrderServiceImpl extends ServiceImpl<SalesOrderMapper, SalesOr
         return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,fileName,dataList,path);
     }
 
+    @Override
+    public HttpRespMsg salesKit(Integer queryType,Integer dateType,String startDate, String endDate) {
+        HttpRespMsg msg=new HttpRespMsg();
+        DateTimeFormatter df=DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        LambdaQueryWrapper<Custom> customLambdaQueryWrapper = new LambdaQueryWrapper<>();
+        LambdaQueryWrapper<Custom> customLambdaQueryWrapper1 = new LambdaQueryWrapper<>();
+        LambdaQueryWrapper<Contacts> contactsLambdaQueryWrapper = new LambdaQueryWrapper<>();
+        LambdaQueryWrapper<Contacts> contactsLambdaQueryWrapper1 = new LambdaQueryWrapper<>();
+        LambdaQueryWrapper<BusinessOpportunity> businessOpportunityLambdaQueryWrapper = new LambdaQueryWrapper<>();
+        LambdaQueryWrapper<BusinessOpportunity> businessOpportunityLambdaQueryWrapper1 = new LambdaQueryWrapper<>();
+        LambdaQueryWrapper<SalesOrder> salesOrderLambdaQueryWrapper = new LambdaQueryWrapper<>();
+        LambdaQueryWrapper<SalesOrder> salesOrderLambdaQueryWrapper1 = new LambdaQueryWrapper<>();
+        User user = userMapper.selectById(request.getHeader("token"));
+        List<Department> allDeptList = departmentMapper.selectList(new LambdaQueryWrapper<Department>().eq(Department::getCompanyId, user.getCompanyId()));
+        if(!StringUtils.isEmpty(startDate)&&!StringUtils.isEmpty(endDate)){
+            customLambdaQueryWrapper.between(Custom::getCreateTime,startDate,endDate);
+            contactsLambdaQueryWrapper.between(Contacts::getCreateTime,startDate,endDate);
+            businessOpportunityLambdaQueryWrapper.between(BusinessOpportunity::getCreateTime,startDate,endDate);
+            salesOrderLambdaQueryWrapper.between(SalesOrder::getCreateTime,startDate,endDate);
+        }
+        if(dateType!=null){
+            switch (dateType){
+                case 0:
+                    //本月
+                    LocalDate now = LocalDate.now();
+                    LocalDate dateStartOfMonth = now.with(TemporalAdjusters.firstDayOfMonth());
+                    LocalDate dateEndOfMonth = now.with(TemporalAdjusters.lastDayOfMonth());
+                    customLambdaQueryWrapper.between(Custom::getCreateTime,dateStartOfMonth,dateEndOfMonth);
+                    customLambdaQueryWrapper1.between(Custom::getCreateTime,dateStartOfMonth.minusMonths(1),dateEndOfMonth.minusMonths(1));
+                    contactsLambdaQueryWrapper.between(Contacts::getCreateTime,dateStartOfMonth,dateEndOfMonth);
+                    contactsLambdaQueryWrapper1.between(Contacts::getCreateTime,dateStartOfMonth.minusMonths(1),dateEndOfMonth.minusMonths(1));
+                    businessOpportunityLambdaQueryWrapper.between(BusinessOpportunity::getCreateTime,dateStartOfMonth,dateEndOfMonth);
+                    businessOpportunityLambdaQueryWrapper1.between(BusinessOpportunity::getCreateTime,dateStartOfMonth.minusMonths(1),dateEndOfMonth.minusMonths(1));
+                    salesOrderLambdaQueryWrapper.between(SalesOrder::getCreateTime,dateStartOfMonth,dateEndOfMonth);
+                    salesOrderLambdaQueryWrapper1.between(SalesOrder::getCreateTime,dateStartOfMonth.minusMonths(1),dateEndOfMonth.minusMonths(1));
+                    break;
+                case 1:
+                    //本周
+                    LocalDate now1 = LocalDate.now();
+                    LocalDate dateStartOfWeek = now1.with(TemporalAdjusters.previousOrSame(java.time.DayOfWeek.MONDAY));
+                    LocalDate dateEndOfWeek = now1.with(TemporalAdjusters.nextOrSame(java.time.DayOfWeek.SUNDAY));
+                    customLambdaQueryWrapper.between(Custom::getCreateTime,dateStartOfWeek,dateEndOfWeek);
+                    customLambdaQueryWrapper1.between(Custom::getCreateTime,dateStartOfWeek.minusWeeks(1),dateEndOfWeek.minusWeeks(1));
+                    contactsLambdaQueryWrapper.between(Contacts::getCreateTime,dateStartOfWeek,dateEndOfWeek);
+                    contactsLambdaQueryWrapper1.between(Contacts::getCreateTime,dateStartOfWeek.minusWeeks(1),dateEndOfWeek.minusWeeks(1));
+                    businessOpportunityLambdaQueryWrapper.between(BusinessOpportunity::getCreateTime,dateStartOfWeek,dateEndOfWeek);
+                    businessOpportunityLambdaQueryWrapper1.between(BusinessOpportunity::getCreateTime,dateStartOfWeek.minusWeeks(1),dateEndOfWeek.minusWeeks(1));
+                    salesOrderLambdaQueryWrapper.between(SalesOrder::getCreateTime,dateStartOfWeek,dateEndOfWeek);
+                    salesOrderLambdaQueryWrapper1.between(SalesOrder::getCreateTime,dateStartOfWeek.minusWeeks(1),dateEndOfWeek.minusWeeks(1));
+                    break;
+                case 2:
+                    //本年
+                    Year year = Year.now();
+                    LocalDate dateStartOfYear = year.atDay(1).atStartOfDay().toLocalDate();
+                    LocalDate dateEndOfYear = year.plusYears(1).atDay(1).atStartOfDay().minusSeconds(1).toLocalDate();
+                    customLambdaQueryWrapper.between(Custom::getCreateTime,dateStartOfYear,dateEndOfYear);
+                    customLambdaQueryWrapper1.between(Custom::getCreateTime,dateStartOfYear.minusYears(1),dateEndOfYear.minusYears(1));
+                    contactsLambdaQueryWrapper.between(Contacts::getCreateTime,dateStartOfYear,dateEndOfYear);
+                    contactsLambdaQueryWrapper1.between(Contacts::getCreateTime,dateStartOfYear.minusYears(1),dateEndOfYear.minusYears(1));
+                    businessOpportunityLambdaQueryWrapper.between(BusinessOpportunity::getCreateTime,dateStartOfYear,dateEndOfYear);
+                    businessOpportunityLambdaQueryWrapper1.between(BusinessOpportunity::getCreateTime,dateStartOfYear.minusYears(1),dateEndOfYear.minusYears(1));
+                    salesOrderLambdaQueryWrapper.between(SalesOrder::getCreateTime,dateStartOfYear,dateEndOfYear);
+                    salesOrderLambdaQueryWrapper1.between(SalesOrder::getCreateTime,dateStartOfYear.minusYears(1),dateEndOfYear.minusYears(1));
+                    break;
+            }
+        }
+        if(queryType!=null){
+            switch (queryType){
+                case 0:
+                    //仅本人
+                    customLambdaQueryWrapper.eq(Custom::getCreatorId,user.getId());
+                    contactsLambdaQueryWrapper.eq(Contacts::getCreatorId,user.getId());
+                    businessOpportunityLambdaQueryWrapper.eq(BusinessOpportunity::getCreatorId,user.getId());
+                    salesOrderLambdaQueryWrapper.eq(SalesOrder::getCreatorId,user.getId());
+
+                    customLambdaQueryWrapper1.eq(Custom::getCreatorId,user.getId());
+                    contactsLambdaQueryWrapper1.eq(Contacts::getCreatorId,user.getId());
+                    businessOpportunityLambdaQueryWrapper1.eq(BusinessOpportunity::getCreatorId,user.getId());
+                    salesOrderLambdaQueryWrapper1.eq(SalesOrder::getCreatorId,user.getId());
+                    break;
+                case 1:
+                    //本人及下属
+                    List<Department> departmentList = departmentMapper.selectList(new LambdaQueryWrapper<Department>().eq(Department::getManagerId, user.getId()));
+                    List<Integer> deptIds = departmentList.stream().map(Department::getDepartmentId).distinct().collect(Collectors.toList());
+                    deptIds.add(-1);
+                    List<User> userList = userMapper.selectList(new LambdaQueryWrapper<User>().in(User::getDepartmentId, deptIds));
+                    List<String> userIds = userList.stream().map(User::getId).distinct().collect(Collectors.toList());
+                    userIds.add("-1");
+                    customLambdaQueryWrapper.in(Custom::getCreatorId,userIds);
+                    contactsLambdaQueryWrapper.in(Contacts::getCreatorId,userIds);
+                    businessOpportunityLambdaQueryWrapper.in(BusinessOpportunity::getCreatorId,userIds);
+                    salesOrderLambdaQueryWrapper.in(SalesOrder::getCreatorId,userIds);
+
+                    customLambdaQueryWrapper1.in(Custom::getCreatorId,userIds);
+                    contactsLambdaQueryWrapper1.in(Contacts::getCreatorId,userIds);
+                    businessOpportunityLambdaQueryWrapper1.in(BusinessOpportunity::getCreatorId,userIds);
+                    salesOrderLambdaQueryWrapper1.in(SalesOrder::getCreatorId,userIds);
+                    break;
+                case 2:
+                    //仅本部门
+                    Integer targetDeptId = user.getDepartmentId();
+                    List<User> users = userMapper.selectList(new LambdaQueryWrapper<User>().eq(User::getDepartmentId, targetDeptId));
+                    List<String> targetUserIds = users.stream().map(User::getId).distinct().collect(Collectors.toList());
+                    targetUserIds.add("-1");
+                    customLambdaQueryWrapper.in(Custom::getCreatorId,targetUserIds);
+                    contactsLambdaQueryWrapper.in(Contacts::getCreatorId,targetUserIds);
+                    businessOpportunityLambdaQueryWrapper.in(BusinessOpportunity::getCreatorId,targetUserIds);
+                    salesOrderLambdaQueryWrapper.in(SalesOrder::getCreatorId,targetUserIds);
+
+                    customLambdaQueryWrapper1.in(Custom::getCreatorId,targetUserIds);
+                    contactsLambdaQueryWrapper1.in(Contacts::getCreatorId,targetUserIds);
+                    businessOpportunityLambdaQueryWrapper1.in(BusinessOpportunity::getCreatorId,targetUserIds);
+                    salesOrderLambdaQueryWrapper1.in(SalesOrder::getCreatorId,targetUserIds);
+                    break;
+                case 3:
+                    //本部门及下属部门
+                    //仅本部门
+                    Integer targetDeptId1 = user.getDepartmentId();
+                    List<Integer> branchDepartment = getBranchDepartment(targetDeptId1, allDeptList);
+                    List<User> users1 = userMapper.selectList(new LambdaQueryWrapper<User>().in(User::getDepartmentId, branchDepartment));
+                    List<String> targetUserIds1 = users1.stream().map(User::getId).distinct().collect(Collectors.toList());
+                    targetUserIds1.add("-1");
+                    customLambdaQueryWrapper.in(Custom::getCreatorId,targetUserIds1);
+                    contactsLambdaQueryWrapper.in(Contacts::getCreatorId,targetUserIds1);
+                    businessOpportunityLambdaQueryWrapper.in(BusinessOpportunity::getCreatorId,targetUserIds1);
+                    salesOrderLambdaQueryWrapper.in(SalesOrder::getCreatorId,targetUserIds1);
+
+                    customLambdaQueryWrapper1.in(Custom::getCreatorId,targetUserIds1);
+                    contactsLambdaQueryWrapper1.in(Contacts::getCreatorId,targetUserIds1);
+                    businessOpportunityLambdaQueryWrapper1.in(BusinessOpportunity::getCreatorId,targetUserIds1);
+                    salesOrderLambdaQueryWrapper1.in(SalesOrder::getCreatorId,targetUserIds1);
+                    break;
+            }
+        }
+        Map<String,Object> resultMap=new HashMap<>();
+
+        int customCount = customService.count(customLambdaQueryWrapper);
+        int contactsCount = contactsService.count(contactsLambdaQueryWrapper);
+        int businessOpportunityCount = businessOpportunityService.count(businessOpportunityLambdaQueryWrapper);
+        Integer salesOrderCount = salesOrderMapper.selectCount(salesOrderLambdaQueryWrapper);
+
+        int customCount1 = customService.count(customLambdaQueryWrapper1);
+        int contactsCount1 = contactsService.count(contactsLambdaQueryWrapper1);
+        int businessOpportunityCount1 = businessOpportunityService.count(businessOpportunityLambdaQueryWrapper1);
+        Integer salesOrderCount1 = salesOrderMapper.selectCount(salesOrderLambdaQueryWrapper1);
+        Map<String,Object> customMap=new HashMap<>();
+        customMap.put("customCount",customCount);
+        customMap.put("customPromote",getPromote(customCount,customCount1));
+        resultMap.put("custom",customMap);
+        Map<String,Object> contactsMap=new HashMap<>();
+        contactsMap.put("contactsCount",contactsCount);
+        contactsMap.put("contactsPromote",getPromote(contactsCount,contactsCount1));
+        resultMap.put("contacts",contactsMap);
+        Map<String,Object> businessOpportunityMap=new HashMap<>();
+        businessOpportunityMap.put("businessOpportunityCount",businessOpportunityCount);
+        businessOpportunityMap.put("businessOpportunityPromote",getPromote(businessOpportunityCount,businessOpportunityCount1));
+        resultMap.put("businessOpportunity",businessOpportunityMap);
+        Map<String,Object> salesOrderMap=new HashMap<>();
+        salesOrderMap.put("salesOrderCount",salesOrderCount);
+        salesOrderMap.put("salesOrderPromote",getPromote(salesOrderCount,salesOrderCount1));
+        resultMap.put("salesOrder",salesOrderMap);
+        msg.setData(resultMap);
+        return msg;
+    }
+
+    private String getPromote(int num, int oldNum) {
+        BigDecimal numBd = new BigDecimal(num);
+        BigDecimal oldNumBd = new BigDecimal(oldNum);
+        numBd=numBd.subtract(oldNumBd);
+        if(oldNum>0){
+            numBd=numBd.divide(oldNumBd,2,RoundingMode.HALF_UP);
+        }
+        NumberFormat percentInstance =NumberFormat.getPercentInstance();
+        percentInstance.setMaximumFractionDigits(2);
+        return percentInstance.format(numBd.doubleValue());
+    }
+
     //递归获取子部门
     public List<Integer> getBranchDepartment(Integer departmentId, List<Department> departmentList) {
         List<Integer> list = new ArrayList<>();

Різницю між файлами не показано, бо вона завелика
+ 0 - 1773
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/task/TimingTask.java


+ 16 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/CompanyDingdingController.java

@@ -1,6 +1,8 @@
 package com.management.platform.controller;
 
 
+import com.aliyun.dingtalkcontact_1_0.models.SearchUserResponse;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.dingtalk.api.request.OapiMessageCorpconversationAsyncsendV2Request;
 import com.management.platform.entity.CompanyDingding;
@@ -96,5 +98,19 @@ public class CompanyDingdingController {
         companyDingdingService.sendOAMsg(companyDingding, "040534176023851922", "OA提醒测试","这是一次测试",form,null);
         return new HttpRespMsg();
     }
+
+    @RequestMapping("/searchUserInfo")
+    public HttpRespMsg searchUserInfo(String userName) throws Exception {
+        HttpRespMsg msg=new HttpRespMsg();
+        String token = request.getHeader("TOKEN");
+        User user = userMapper.selectById(token);
+        CompanyDingding dd = companyDingdingMapper.selectOne(new QueryWrapper<CompanyDingding>().eq("company_id", user.getCompanyId()));
+        HttpRespMsg searchUserInfo = companyDingdingService.getSearchUserInfo(dd, userName, 0);
+        SearchUserResponse searchUserResponse = (SearchUserResponse) searchUserInfo.data;
+        List<String> list = searchUserResponse.body.list;
+        List<User> userList = userMapper.selectList(new LambdaQueryWrapper<User>().in(User::getDingdingUserid, list));
+        msg.setData(userList);
+        return msg;
+    }
 }
 

+ 8 - 2
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ExpenseItemController.java

@@ -88,8 +88,14 @@ public class ExpenseItemController {
                 item.add(userName);
                 item.add(deptName);
             }else {
-                item.add(itemVO.getUsername());
-                item.add(itemVO.getDepartmentName());
+                if(dingding!=null&&dingding.getContactNeedTranslate()==1){
+                    item.add("$userName="+itemVO.getUsername()+"$");
+                    item.add("$departmentName="+String.valueOf(itemVO.getCorpDdDeptId())+"$");
+                }else {
+                    item.add(itemVO.getUsername());
+                    item.add(itemVO.getDepartmentName());
+                }
+
             }
             item.add(itemVO.getHappenDate());
             item.add(itemVO.getExpenseType());

+ 1 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/GroupBudgetReviewController.java

@@ -251,7 +251,7 @@ public class GroupBudgetReviewController {
             List<String> item=new ArrayList<>();
             item.add(groupBudgetReview.getProjectName());
             item.add(groupBudgetReview.getGroupName());
-            if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+            if((wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1)||(dingding!=null&&dingding.getContactNeedTranslate()==1)){
                 Optional<User> first = userList.stream().filter(u -> u.getId().equals(groupBudgetReview.getCreatorId())).findFirst();
                 if(first.isPresent()){
                     item.add("$userName="+first.get().getName()+"$");

+ 1 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectRequirementController.java

@@ -169,7 +169,7 @@ public class ProjectRequirementController {
             String userString = corpwxUseridList.toString();
             resultData.add(pr.getProjectCode());
             resultData.add(pr.getProjectName());
-            if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+            if((wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1)||(dingding!=null&&dingding.getContactNeedTranslate()==1)){
                 resultData.add(userString.replaceAll("\\[","").replaceAll("]",""));
             }else {
                 resultData.add(pr.getActiveUsers());

+ 7 - 6
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportController.java

@@ -368,7 +368,8 @@ public class ReportController {
                                   Integer[] extraField3,
                                   Integer[] sapServiceId,//依斯贝的服务Id
                                   String summary,         //针对工作总结的字段
-                                  String[] multiDegrId
+                                  String[] multiDegrId,
+                                  Integer[] reportTargetDeptId
                                     ) {
         List<Report> reportList = new ArrayList<>();
         String token = request.getHeader("Token");
@@ -531,7 +532,7 @@ public class ReportController {
                 }
             }
             //任务分组和阶段必填
-            if (company.getPackageEngineering() == 0 && company.getId() == 3917) {
+            if (company.getPackageEngineering() == 0 && (company.getId() == 3917 || company.getId() == 3092)) {
                 if (stage == null) {
                     stage = new String[projectId.length];
                 }
@@ -889,7 +890,7 @@ public class ReportController {
                             report.setStage(stage[i]);
                             report.setCreateDate(localStartDate);
                             report.setCreatorId(token);
-                            report.setDeptId(user.getDepartmentId());
+                            report.setDeptId(comTimeType.getUserWithMultiDept()==1?(reportTargetDeptId[i]==-1?user.getDepartmentId():reportTargetDeptId[i]):user.getDepartmentId());
                             report.setProjectAuditState(0);
                             report.setProjectAuditorId(projectAuditorId[i]);
                             report.setTaskFinish(taskFinish[i]);
@@ -1002,7 +1003,7 @@ public class ReportController {
                         report.setPicStr(picStr!=null?picStr[i]:null);
                         report.setCreateDate(LocalDate.parse(createDate[i], DateTimeFormatter.ofPattern("yyyy-MM-dd")));
                         report.setCreatorId(token);
-                        report.setDeptId(user.getDepartmentId());
+                        report.setDeptId(comTimeType.getUserWithMultiDept()==1?(reportTargetDeptId[i]==-1?user.getDepartmentId():reportTargetDeptId[i]):user.getDepartmentId());
                         report.setProjectAuditState(0);
                         report.setProjectAuditorId(projectAuditorId[i]);
                         report.setTaskFinish(taskFinish[i]);
@@ -2634,8 +2635,8 @@ public class ReportController {
     }
 
     @RequestMapping("/changeReminder")
-    public HttpRespMsg changeReminder(String createDate,String userId) throws Exception {
-        return reportService.changeReminder(request,createDate,userId);
+    public HttpRespMsg changeReminder(String createDate,String userId,String startDate,String endDate) throws Exception {
+        return reportService.changeReminder(request,createDate,userId,startDate,endDate);
     }
 }
 

+ 16 - 7
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportLogController.java

@@ -1,10 +1,13 @@
 package com.management.platform.controller;
 
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.management.platform.entity.CompanyDingding;
 import com.management.platform.entity.ReportLog;
 import com.management.platform.entity.User;
 import com.management.platform.entity.WxCorpInfo;
+import com.management.platform.mapper.CompanyDingdingMapper;
 import com.management.platform.mapper.UserMapper;
 import com.management.platform.mapper.WxCorpInfoMapper;
 import com.management.platform.service.ReportLogService;
@@ -35,6 +38,8 @@ public class ReportLogController {
     private UserMapper userMapper;
     @Resource
     WxCorpInfoMapper wxCorpInfoMapper;
+    @Resource
+    private CompanyDingdingMapper companyDingdingMapper;
 
     @RequestMapping("/get")
     public HttpRespMsg get(String creatorId, String createDate) {
@@ -42,15 +47,19 @@ public class ReportLogController {
         User user = userMapper.selectById(creatorId);
         List<ReportLog> list = reportLogService.list(new QueryWrapper<ReportLog>().eq("creator_id", creatorId).eq("create_date", createDate));
         WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id",user.getCompanyId()));
-        if (wxCorpInfo!=null && wxCorpInfo.getSaasSyncContact() == 1){
-            List<User> users = userMapper.selectList(new QueryWrapper<User>().eq("company_id",user.getCompanyId()));
-            for (ReportLog reportLog : list) {
-                String operatorId = reportLog.getOperatorId();
-                for (User item : users) {
-                    if (item.getId().equals(operatorId)){
-                        String name = item.getName();
+        CompanyDingding dingding = companyDingdingMapper.selectOne(new LambdaQueryWrapper<CompanyDingding>().eq(CompanyDingding::getCompanyId, user.getCompanyId()));
+        List<User> users = userMapper.selectList(new QueryWrapper<User>().eq("company_id",user.getCompanyId()));
+        for (ReportLog reportLog : list) {
+            String operatorId = reportLog.getOperatorId();
+            for (User item : users) {
+                if (item.getId().equals(operatorId)){
+                    String name = item.getName();
+                    if (wxCorpInfo!=null && wxCorpInfo.getSaasSyncContact() == 1){
                         reportLog.setMsg(reportLog.getMsg().replace(name,"$userName=" + item.getCorpwxUserid() + "$"));
+                    }else if(dingding!=null&&dingding.getContactNeedTranslate()==1){
+                        reportLog.setMsg(reportLog.getMsg().replace(name,"$userName=" + item.getDingdingUserid() + "$"));
                     }
+
                 }
             }
         }

+ 16 - 13
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/TaskCommentController.java

@@ -1,12 +1,10 @@
 package com.management.platform.controller;
 
 
+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.TaskPersonLiableMapper;
-import com.management.platform.mapper.TaskRestartMapper;
-import com.management.platform.mapper.UserMapper;
-import com.management.platform.mapper.WxCorpInfoMapper;
+import com.management.platform.mapper.*;
 import com.management.platform.service.TaskCommentService;
 import com.management.platform.service.UserService;
 import com.management.platform.util.HttpRespMsg;
@@ -46,6 +44,8 @@ public class TaskCommentController {
     private TaskRestartMapper taskRestartMapper;
     @Resource
     private TaskPersonLiableMapper taskPersonLiableMapper;
+    @Resource
+    private CompanyDingdingMapper companyDingdingMapper;
     /**
      * 添加任务留言
      * @return
@@ -76,23 +76,26 @@ public class TaskCommentController {
         String token = request.getHeader("token");
         User user = userMapper.selectById(token);
         WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id",user.getCompanyId()));
+        CompanyDingding dingding = companyDingdingMapper.selectOne(new LambdaQueryWrapper<CompanyDingding>().eq(CompanyDingding::getCompanyId, user.getCompanyId()));
         List<User> users = userMapper.selectList(new QueryWrapper<User>().eq("company_id",user.getCompanyId()));
         for (TaskComment taskComment : taskComments) {
             List<TaskRestart> taskRestartList = taskRestarts.stream().filter(tr -> tr.getTaskCommentId().equals(taskComment.getId())).collect(Collectors.toList());
             List<TaskPersonLiable> taskPersonLiableList = taskPersonLiables.stream().filter(tp -> tp.getTaskCommentId().equals(taskComment.getId())).collect(Collectors.toList());
-            if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
-                String userWxId = "";
-                String userName = taskComment.getUserName();
-                for (User item : users) {
-                    if (item.getId().equals(taskComment.getUserId())){
+            String userWxId = "";
+            String userName = taskComment.getUserName();
+            for (User item : users) {
+                if (item.getId().equals(taskComment.getUserId())){
+                    if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                         userWxId = item.getCorpwxRealUserid();
-                        break;
+                    }else if(dingding!=null&&dingding.getContactNeedTranslate()==1){
+                        userWxId = item.getDingdingUserid();
                     }
+                    break;
                 }
-                String content = taskComment.getContent();
-                String newContent = content.replace(userName, "$userName=" + userWxId + "$");
-                taskComment.setContent(newContent);
             }
+            String content = taskComment.getContent();
+            String newContent = content.replace(userName, "$userName=" + userWxId + "$");
+            taskComment.setContent(newContent);
             for (TaskPersonLiable taskPersonLiable : taskPersonLiableList) {
                 Optional<User> first = users.stream().filter(us -> us.getId().equals(taskPersonLiable.getPersonLiableId())).findFirst();
                 if(first.isPresent()){

+ 17 - 5
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/TaskController.java

@@ -270,12 +270,13 @@ public class TaskController {
                 taskService.update(sample, new QueryWrapper<Task>().eq("parent_tid", task.getId()));
             }
             List<TaskExecutor> oldExeList = taskExecutorMapper.selectList(new QueryWrapper<TaskExecutor>().eq("task_id", task.getId()));
+            CompanyDingding dingding = companyDingdingService.getOne(new LambdaQueryWrapper<CompanyDingding>().eq(CompanyDingding::getCompanyId, user.getCompanyId()));
             //计算需要移除的执行人
             List<Integer> ids = oldExeList.stream().filter(old->!task.getExecutorList().stream().anyMatch(newT->newT.getId()!=null&&newT.getId().equals(old.getId())))
                         .map(TaskExecutor::getId).collect(Collectors.toList());
             List<TaskExecutor> hasRemoveExecutor = oldExeList.stream().filter(old -> !task.getExecutorList().stream().anyMatch(newT -> newT.getId() != null && newT.getId().equals(old.getId()))).collect(Collectors.toList());
             if(hasRemoveExecutor.size()>0){
-                if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                if((wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1)||(dingding!=null&&dingding.getContactNeedTranslate()==1)){
                     taskCommentString.append(",移除了执行人"+hasRemoveExecutor.stream().map(h->{
                         if(!h.getExecutorId().equals(user.getId())){
                             return "$userName="+h.getExecutorName()+"$";
@@ -301,7 +302,7 @@ public class TaskController {
                         .map(TaskExecutor::getExecutorId).collect(Collectors.toList());
                 List<TaskExecutor> newAddExecutor = task.getExecutorList().stream().filter(newT -> !StringUtils.isEmpty(newT.getExecutorId()) && !oldExeList.stream().anyMatch(old -> newT.getExecutorId().equals(old.getExecutorId()))).collect(Collectors.toList());
                 if(newAddExecutor.size()>0){
-                    if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                    if((wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1)||(dingding!=null&&dingding.getContactNeedTranslate()==1)){
                         taskCommentString.append(",新增了执行人"+newAddExecutor.stream().map(h->{
                             if(!h.getExecutorId().equals(user.getId())){
                                 return "$userName="+h.getExecutorName()+"$";
@@ -317,7 +318,7 @@ public class TaskController {
                     Optional<TaskExecutor> first = oldExeList.stream().filter(o -> o.getId().equals(oldHa.getId())).findFirst();
                     if(first.isPresent()){
                         if(!oldHa.getPlanHours().equals(first.get().getPlanHours())){
-                            if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                            if((wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1)||(dingding!=null&&dingding.getContactNeedTranslate()==1)){
                                 if(oldHa.getExecutorId().equals(user.getId())){
                                     taskCommentString.append(",修改了执行人"+oldHa.getExecutorName()+"计划工时为"+oldHa.getPlanHours()+"小时");
                                 }else {
@@ -1069,6 +1070,13 @@ public class TaskController {
                     }else {
                         row.createCell(2).setCellValue("");
                     }
+                }else if(dingding!=null&&dingding.getContactNeedTranslate()==1){
+                    Optional<User> first = userList.stream().filter(ul -> ul.getId().equals(task.getExecutorId())).findFirst();
+                    if(first.isPresent()){
+                        row.createCell(2).setCellValue("$userName="+(first.get().getDingdingUserid()==null?"":first.get().getDingdingUserid())+"$");
+                    }else {
+                        row.createCell(2).setCellValue("");
+                    }
                 }else {
                     row.createCell(2).setCellValue(task.getExecutorName());
                 }
@@ -1122,7 +1130,7 @@ public class TaskController {
                     //httpRespMsg.setError("处理超时...");
                     httpRespMsg.setError(MessageUtils.message("request.outTime"));
                 }
-            }else if(dingding!=null&&dingding.getSyncContact()==1){
+            }else if(dingding!=null&&dingding.getContactNeedTranslate()==1){
                 String mediaId = dingDingService.getTranslationMediaId(fileUrlSuffix,dingding);
                 String jobId = dingDingService.syncTranslation(mediaId,fileUrlSuffix,user.getDingdingUnionid(),dingding);
                 int i = 0;
@@ -1424,6 +1432,8 @@ public class TaskController {
             String executorString = executorList.stream().map(t->{
                 if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                     return "$userName="+t.getExecutorName()+"$";
+                }else if(dingding!=null&&dingding.getContactNeedTranslate()==1){
+                    return "$userName="+t.getExecutorName()+"$";
                 }else {
                     return t.getExecutorName();
                 }
@@ -1438,7 +1448,9 @@ public class TaskController {
                     if(department.isPresent()){
                         if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                             item.add("$departmentName="+department.get().getCorpwxDeptid()+"$");
-                        }else {
+                        }else if(dingding!=null&&dingding.getContactNeedTranslate()==1){
+                            item.add("$departmentName="+department.get().getDdDeptid()+"$");
+                        } else {
                             item.add(department.get().getDepartmentName());
                         }
                     }else {

+ 39 - 5
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/UserController.java

@@ -235,9 +235,9 @@ public class UserController {
                                   @RequestParam Integer roleId, Double monthCost, Double cost,
                                   Integer departmentId, Integer salaryType, String costApplyDate,
                                     String position, String certJson,String inductionDate,String superiorId,
-                                    String plate1,String plate2,String plate3,String plate4,String plate5, String jobNumber, String inactiveDate) {
+                                    String plate1,String plate2,String plate3,String plate4,String plate5, String jobNumber, String inactiveDate,String reportDeptIds) {
         return userService.insertUser(id, name, phone, onlyAuditOnce, roleId, monthCost, cost, departmentId, salaryType, costApplyDate,
-                    position, certJson, request,inductionDate,superiorId,plate1, plate2, plate3,plate4,plate5, jobNumber, inactiveDate);
+                    position, certJson, request,inductionDate,superiorId,plate1, plate2, plate3,plate4,plate5, jobNumber, inactiveDate,reportDeptIds);
     }
 
     /**
@@ -403,6 +403,8 @@ public class UserController {
                     row.createCell(0).setCellValue(rowNum);
                     if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                         row.createCell(1).setCellValue("$userName="+(item.getCorpwxUserid()==null?" ":item.getCorpwxUserid())+"$");
+                    }else if(dingding!=null&&dingding.getContactNeedTranslate()==1){
+                        row.createCell(1).setCellValue("$userName="+(item.getDingdingUserid()==null?" ":item.getDingdingUserid())+"$");
                     }else {
                         row.createCell(1).setCellValue(item.getName());
                     }
@@ -410,6 +412,16 @@ public class UserController {
                     row.createCell(3).setCellValue(item.getPhone());
                     if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                         row.createCell(4).setCellValue("$departmentName="+(item.getCorpwxDeptid()==null?" ":item.getCorpwxDeptid())+"$");
+                    }else if(dingding!=null&&dingding.getContactNeedTranslate()==1){
+                        if (item.getDepartmentId() != 0) {
+                            Optional<Department> first = deptList.stream().filter(d -> d.getDepartmentId().equals(item.getDepartmentId())).findFirst();
+                            if(first.isPresent()){
+                                Department department =first.get();
+                                row.createCell(4).setCellValue("$departmentName="+(department.getDdDeptid()==null?" ":department.getDdDeptid())+"$");
+                            }else {
+                                row.createCell(4).setCellValue(item.getDepartmentName());
+                            }
+                        }
                     }else {
                         row.createCell(4).setCellValue(item.getDepartmentName());
                     }
@@ -419,6 +431,8 @@ public class UserController {
                             if(first.isPresent()){
                                 if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                                     row.createCell(5).setCellValue("$userName="+(first.get().getCorpwxUserid()==null?" ":first.get().getCorpwxUserid())+"$");
+                                }else if(dingding!=null&&dingding.getContactNeedTranslate()==1){
+                                    row.createCell(5).setCellValue("$userName="+(first.get().getDingdingUserid()==null?" ":first.get().getDingdingUserid())+"$");
                                 }else {
                                     row.createCell(5).setCellValue(first.get().getName());
                                 }
@@ -510,7 +524,7 @@ public class UserController {
                         //httpRespMsg.setError("处理超时...");
                         httpRespMsg.setError(MessageUtils.message("request.outTime"));
                     }
-                }else if(dingding!=null&&dingding.getSyncContact()==1){
+                }else if(dingding!=null&&dingding.getContactNeedTranslate()==1){
                     String mediaId = dingDingService.getTranslationMediaId(fileUrlSuffix,dingding);
                     String jobId = dingDingService.syncTranslation(mediaId,fileUrlSuffix,user.getDingdingUnionid(), dingding);
                     int i = 0;
@@ -522,6 +536,7 @@ public class UserController {
                     while (i < 10) {
                         Thread.sleep(300);
                         Integer status = corpddJobCenter.get(jobId);
+                        System.out.println("打印corpddJobCenter"+corpddJobCenter);
                         if (status != null) {
                             if (status == 1) {
                                 syncTranslationResult = dingDingService.getSyncTranslationResult(jobId,dingding);
@@ -614,6 +629,14 @@ public class UserController {
                 if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                     row.createCell(1).setCellValue("$userName="+(item.getCorpwxUserid()==null?"":item.getCorpwxUserid())+"$");
                     row.createCell(2).setCellValue("$departmentName="+(item.getCorpwxDeptid()==null?"":item.getCorpwxDeptid())+"$");
+                }else if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                    row.createCell(1).setCellValue("$userName="+(item.getDingdingUserid()==null?"":item.getDingdingUserid())+"$");
+                    Optional<Department> first = deptList.stream().filter(d -> d.getDepartmentId().equals(item.getDepartmentId())).findFirst();
+                    if(first.isPresent()){
+                        row.createCell(2).setCellValue("$departmentName="+(first.get().getDdDeptid()==null?"":first.get().getDdDeptid())+"$");
+                    }else {
+                        row.createCell(2).setCellValue("");
+                    }
                 }else {
                     row.createCell(1).setCellValue(item.getName());
                     row.createCell(2).setCellValue(item.getDepartmentName());
@@ -663,7 +686,7 @@ public class UserController {
                     //httpRespMsg.setError("处理超时...");
                     httpRespMsg.setError(MessageUtils.message("request.outTime"));
                 }
-            }else if(dingding!=null&&dingding.getSyncContact()==1){
+            }else if(dingding!=null&&dingding.getContactNeedTranslate()==1){
                 String mediaId = dingDingService.getTranslationMediaId(fileUrlSuffix,dingding);
                 String jobId = dingDingService.syncTranslation(mediaId,fileUrlSuffix, user.getDingdingUnionid(),dingding);
                 int i = 0;
@@ -932,7 +955,7 @@ public class UserController {
         HttpRespMsg msg=new HttpRespMsg();
         User user = userService.getById(userId);
         if(user!=null){
-            UserWithBeisen userWithBeisen = userWithBeisenMapper.selectOne(new LambdaQueryWrapper<UserWithBeisen>().eq(UserWithBeisen::getJobNumber, jobNumber));
+            UserWithBeisen userWithBeisen = userWithBeisenMapper.selectOne(new LambdaQueryWrapper<UserWithBeisen>().eq(UserWithBeisen::getJobNumber, jobNumber).eq(UserWithBeisen::getCompanyId,user.getCompanyId()));
             if(userWithBeisen==null){
                 msg.setError("工号["+jobNumber+"]在HR系统中不存在,请重新输入");
                 return msg;
@@ -948,5 +971,16 @@ public class UserController {
         return msg;
     }
 
+    @RequestMapping("/userRename")
+    public HttpRespMsg userRename(String newName){
+        HttpRespMsg msg=new HttpRespMsg();
+        User user = userMapper.selectById(request.getHeader("token"));
+        user.setName(newName);
+        if(userMapper.updateById(user)<=0){
+            msg.setError("更新失败");
+        };
+        return msg;
+    }
+
 }
 

+ 31 - 4
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/UserCorpwxTimeController.java

@@ -3,6 +3,7 @@ package com.management.platform.controller;
 
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
+import com.aliyun.dingtalkcontact_1_0.models.SearchUserResponse;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.management.platform.entity.*;
@@ -82,6 +83,8 @@ public class UserCorpwxTimeController {
     UserCorpwxTimeService userCorpwxTimeService;
     @Resource
     private CompanyDingdingMapper companyDingdingMapper;
+    @Resource
+    private CompanyDingdingService companyDingdingService;
 
     @RequestMapping("/getMyDeptMembsData")
     public HttpRespMsg getMyDeptMembsData(String startDate, String endDate) {
@@ -300,6 +303,8 @@ public class UserCorpwxTimeController {
             dataList.add((String)dataItem.get("weekDayTxt"));
             if(wxCorpInfo.getSaasSyncContact()==1){
                 dataList.add("$userName="+(String)dataItem.get("corpwxUserid")+"$");
+            }else if(dingding!=null&&dingding.getContactNeedTranslate()==1){
+                dataList.add("$userName="+(String)dataItem.get("username")+"$");
             }else{
                 dataList.add((String)dataItem.get("username"));
             }
@@ -380,6 +385,8 @@ public class UserCorpwxTimeController {
             dataList.add(ymonth);
             if(wxCorpInfo.getSaasSyncContact()==1){
                 dataList.add("$userName="+(String)dataItem.get("corpwxUserid")+"$");
+            }else if(dingding!=null&&dingding.getContactNeedTranslate()==1){
+                dataList.add("$userName="+(String)dataItem.get("username")+"$");
             }else{
                 dataList.add((String)dataItem.get("username"));
             }
@@ -473,6 +480,7 @@ public class UserCorpwxTimeController {
         String token = request.getHeader("TOKEN");
         User user = userMapper.selectById(token);
         WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", user.getCompanyId()));
+        CompanyDingding dingding = companyDingdingMapper.selectOne(new LambdaQueryWrapper<CompanyDingding>().eq(CompanyDingding::getCompanyId, user.getCompanyId()));
         //然后处理文件
         String fileName = multipartFile.getOriginalFilename();
         File file = new File(fileName == null ? "file" : fileName);
@@ -530,16 +538,35 @@ public class UserCorpwxTimeController {
                     userNameList.add(username);
                 }
             }
+            List<User> targetUserList=new ArrayList<>();
             HttpRespMsg respMsg=new HttpRespMsg();
             if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1&&userNameList.size()>0){
-                System.out.println("参与搜素的人员列表"+userNameList);
+                System.out.println("参与搜素的人员列表"+userNameList + userNameList.size());
                 respMsg = wxCorpInfoService.getBatchSearchUserInfo(wxCorpInfo, userNameList,null);
                 if(respMsg.code.equals("0")){
                     msg.setError("姓名为["+String.valueOf(respMsg.data)+"]的人员存在重复,请使用工号!");
                     return msg;
                 }
+                targetUserList= (List<User>) respMsg.data;
+            }
+            if(dingding!=null&&dingding.getContactNeedTranslate()==1&&userNameList.size()>0){
+                System.out.println("参与搜素的人员列表"+userNameList + userNameList.size());
+                for (String name : userNameList) {
+                    respMsg= companyDingdingService.getSearchUserInfo(dingding,name,1);
+                    SearchUserResponse searchUserResponse = (SearchUserResponse) respMsg.data;
+                    if(searchUserResponse.body.totalCount>1){
+                        msg.setError("姓名为["+name+"]的人员存在重复,请使用工号!");
+                        return msg;
+                    }
+                    if(searchUserResponse.body.list.size()>0){
+                        User item=new User();
+                        //为了修改代码 此处用企业微信同一个字段 setCorpwxUserid
+                        item.setName(name);
+                        item.setCorpwxUserid(searchUserResponse.body.list.get(0));
+                        targetUserList.add(item);
+                    }
+                }
             }
-            List<User> targetUserList= (List<User>) respMsg.data;
             List<UserCorpwxTime> userCorpwxTimeList = new ArrayList<>();
             int dataCount = 0;
             for (int rowIndex = 0; rowIndex <= rowNum; rowIndex++) {
@@ -578,9 +605,9 @@ public class UserCorpwxTimeController {
                     String username =row.getCell(2).getStringCellValue().trim();
                     //检查人员是否存在
                     Optional<User> any;
-                    if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                    if((wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1)||(dingding!=null&&dingding.getContactNeedTranslate()==1)){
                         Optional<User> optional = targetUserList.stream().filter(tl -> tl.getName().equals(username)).findFirst();
-                        any = allUserList.stream().filter(u -> u.getName().equals(username)||(u.getJobNumber()!=null&&u.getJobNumber().equals(username))||(optional.isPresent()&&u.getCorpwxUserid()!=null&&u.getCorpwxUserid().equals(optional.get().getCorpwxUserid()))).findAny();
+                        any = allUserList.stream().filter(u -> u.getName().equals(username)||(u.getJobNumber()!=null&&u.getJobNumber().equals(username))||(optional.isPresent()&&(u.getCorpwxUserid()!=null&&u.getCorpwxUserid().equals(optional.get().getCorpwxUserid()))||(u.getDingdingUserid()!=null&&u.getDingdingUserid().equals(optional.get().getCorpwxUserid())))).findAny();
                     }else {
                         any = allUserList.stream().filter(u -> u.getName().equals(username)||(u.getJobNumber()!=null&&u.getJobNumber().equals(username))).findAny();
                     }

+ 21 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/UserReportDeptController.java

@@ -0,0 +1,21 @@
+package com.management.platform.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2024-04-29
+ */
+@RestController
+@RequestMapping("/user-report-dept")
+public class UserReportDeptController {
+
+}
+

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

@@ -425,6 +425,9 @@ public class Report extends Model<Report> {
     @TableField(exist = false)
     private List<Integer> multiDegrIdList;
 
+    @TableField(exist = false)
+    private String userReportDeptName;
+
     @Override
     protected Serializable pkVal() {
         return this.id;

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

@@ -560,6 +560,12 @@ public class TimeType extends Model<TimeType> {
     @TableField("hide_subproject")
     private Integer hideSubproject;
 
+    /**
+     * 是否开启设置可填报部门 0-否 1-是
+     */
+    @TableField("user_with_multi_dept")
+    private Integer userWithMultiDept;
+
     /**
      * 开启日报审批流的本部门负责人由上级部门负责人审核
      */

+ 3 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/User.java

@@ -296,6 +296,9 @@ public class User extends Model<User> {
     @TableField("only_audit_once")
     private Integer onlyAuditOnce;
 
+    @TableField(exist = false)
+    private List<Department> userReportDeptList;
+
 
     @Override
     protected Serializable pkVal() {

+ 42 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/UserReportDept.java

@@ -0,0 +1,42 @@
+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 com.baomidou.mybatisplus.annotation.TableField;
+import java.io.Serializable;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author Seyason
+ * @since 2024-04-29
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class UserReportDept extends Model<UserReportDept> {
+
+    private static final long serialVersionUID=1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @TableField("user_id")
+    private String userId;
+
+    @TableField("dept_id")
+    private Integer deptId;
+
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+}

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

@@ -13,4 +13,5 @@ public class ExpenseItemVO extends ExpenseItem {
     public String departmentName;
     public String corpwxUserId;
     public String corpwxDeptId;
+    public String corpDdDeptId;
 }

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

@@ -14,6 +14,7 @@ public class TimelinessRateVO {
     private String userName;
     private String corpwxUserId;
     private Integer corpwxDeptId;
+    private Integer corpDdDeptId;
     private String departmentName;
     private String timelinessRate;
     private String timelinessRateWithLeave;

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

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

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

@@ -3,6 +3,7 @@ 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 com.management.platform.util.HttpRespMsg;
 
 import java.time.LocalDate;
 import java.util.List;
@@ -37,4 +38,6 @@ public interface CompanyDingdingService extends IService<CompanyDingding> {
     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);
+
+    HttpRespMsg getSearchUserInfo(CompanyDingding dingding, String name, Integer searchType) throws Exception;
 }

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

@@ -61,4 +61,6 @@ public interface DepartmentService extends IService<Department> {
     String exportWxDepartment(Department department,List<Department> departmentList);
 
     HttpRespMsg sortList(HttpServletRequest request,List<DepartmentVO> list);
+
+    String exportDdDepartment(Department department, List<Department> departmentList);
 }

+ 1 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ReportService.java

@@ -152,7 +152,7 @@ public interface ReportService extends IService<Report> {
 
     HttpRespMsg getDetailReportById(Integer reportId, HttpServletRequest request);
 
-    HttpRespMsg changeReminder(HttpServletRequest request,String createDate,String userId) throws Exception;
+    HttpRespMsg changeReminder(HttpServletRequest request,String createDate,String userId,String startDate,String endDate) throws Exception;
 
     HttpRespMsg getUserDailyWorkTimeReminder(HttpServletRequest request, String startDate, String endDate) throws Exception;
 

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

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

+ 1 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/UserService.java

@@ -38,7 +38,7 @@ public interface UserService extends IService<User> {
     HttpRespMsg insertUser(String id, String name, String phone,Integer onlyAuditOnce, Integer roleId, Double monthCost, Double cost, Integer departmentId,
                            Integer salaryType, String costApplyDate, String position, String certJson,
                            HttpServletRequest request,String inductionDate, String superiorId,String plate1,
-                           String plate2,String plate3,String plate4,String plate5, String jobNumber, String inactiveDate);
+                           String plate2,String plate3,String plate4,String plate5, String jobNumber, String inactiveDate,String reportDeptIds);
 
     HttpRespMsg importUser(MultipartFile multipartFile, HttpServletRequest request);
 

+ 41 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/CompanyDingdingServiceImpl.java

@@ -1,10 +1,12 @@
 package com.management.platform.service.impl;
 
 import com.alibaba.fastjson.JSONObject;
+import com.aliyun.dingtalkcontact_1_0.models.SearchUserResponse;
 import com.aliyun.dingtalkoauth2_1_0.models.GetCorpAccessTokenRequest;
 import com.aliyun.dingtalkoauth2_1_0.models.GetCorpAccessTokenResponse;
 import com.aliyun.tea.TeaException;
 import com.aliyun.teaopenapi.models.Config;
+import com.aliyun.teautil.models.RuntimeOptions;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.dingtalk.api.DefaultDingTalkClient;
@@ -20,10 +22,12 @@ import com.dingtalk.api.response.OapiServiceGetSuiteTokenResponse;
 import com.management.platform.entity.CompanyDingding;
 import com.management.platform.entity.SysConfig;
 import com.management.platform.entity.TimeType;
+import com.management.platform.entity.User;
 import com.management.platform.mapper.CompanyDingdingMapper;
 import com.management.platform.mapper.SysConfigMapper;
 import com.management.platform.mapper.TimeTypeMapper;
 import com.management.platform.service.CompanyDingdingService;
+import com.management.platform.util.HttpRespMsg;
 import com.taobao.api.ApiException;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
@@ -594,4 +598,41 @@ public class CompanyDingdingServiceImpl extends ServiceImpl<CompanyDingdingMappe
         accessToken = dingding.getAccessToken();
         return accessToken;
     }
+
+    @Override
+    public HttpRespMsg getSearchUserInfo(CompanyDingding dingding, String name, Integer searchType) throws Exception {
+        HttpRespMsg msg=new HttpRespMsg();
+        com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config();
+        config.protocol = "https";
+        config.regionId = "central";
+        com.aliyun.dingtalkcontact_1_0.Client client = new com.aliyun.dingtalkcontact_1_0.Client(config);
+        com.aliyun.dingtalkcontact_1_0.models.SearchUserHeaders searchUserHeaders = new com.aliyun.dingtalkcontact_1_0.models.SearchUserHeaders();
+        searchUserHeaders.xAcsDingtalkAccessToken = getCorpAccessToken(dingding);
+        com.aliyun.dingtalkcontact_1_0.models.SearchUserRequest searchUserRequest = new com.aliyun.dingtalkcontact_1_0.models.SearchUserRequest()
+                .setQueryWord(name)
+                .setOffset(0)
+                .setSize(10)
+                .setFullMatchField(searchType);
+        try {
+            SearchUserResponse searchUserResponse = client.searchUserWithOptions(searchUserRequest, searchUserHeaders, new RuntimeOptions());
+            System.out.println("获取到的搜索人员结果:==============>"+searchUserResponse.body);
+            msg.data=searchUserResponse;
+            return msg;
+        } catch (TeaException err) {
+            if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
+                // err 中含有 code 和 message 属性,可帮助开发定位问题
+                System.err.println(err.code+": " +err.message);
+            }
+
+        } catch (Exception _err) {
+            TeaException err = new TeaException(_err.getMessage(), _err);
+            if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
+                // err 中含有 code 和 message 属性,可帮助开发定位问题
+                System.err.println(err.code+": " +err.message);
+            }
+        }
+        msg.data=new SearchUserResponse();
+        return msg;
+    }
+
 }

+ 6 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ContractServiceImpl.java

@@ -2,6 +2,7 @@ package com.management.platform.service.impl;
 
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.management.platform.entity.*;
@@ -96,6 +97,7 @@ public class ContractServiceImpl extends ServiceImpl<ContractMapper, Contract> i
             String token = request.getHeader("token");
             User user = userMapper.selectById(token);
             WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", user.getCompanyId()));
+            CompanyDingding dingding = companyDingdingMapper.selectOne(new LambdaQueryWrapper<CompanyDingding>().eq(CompanyDingding::getCompanyId, user.getCompanyId()));
             List<SysRichFunction> functionContractList = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "查看全部合同");
             if(functionContractList.size() <= 0){
                 httpRespMsg.setError(MessageUtils.message("access.viewError"));
@@ -179,6 +181,8 @@ public class ContractServiceImpl extends ServiceImpl<ContractMapper, Contract> i
                             String msg = "";
                             if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                                 msg = "$userName=" + contractLog.get("operateCorpWxId") + "$" + contractLog.get("msg");
+                            }if(dingding!=null&&dingding.getContactNeedTranslate()==1){
+                                msg = "$userName=" + contractLog.get("operateName") + "$" + contractLog.get("msg");
                             }else {
                                 msg = contractLog.get("operateName") + "" + contractLog.get("msg");
                             }
@@ -263,6 +267,8 @@ public class ContractServiceImpl extends ServiceImpl<ContractMapper, Contract> i
             item.add(contract.getEndDate()==null?"":contract.getEndDate()+"");
             if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                 contract.setCreatorName("$userName=" + contract.getCreatorWxCorpId() + "$");
+            }if(dingding!=null&&dingding.getContactNeedTranslate()==1){
+                contract.setCreatorName("$userName=" + contract.getCreatorName() + "$");
             }else {
                 contract.setCreatorName(contract.getCreatorName());
             }

+ 32 - 2
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/DepartmentServiceImpl.java

@@ -815,6 +815,9 @@ public class DepartmentServiceImpl extends ServiceImpl<DepartmentMapper, Departm
                 if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                     String corpwxUserId = userList.stream().filter(ul -> ul.getId().equals(uid)).findFirst().get().getCorpwxUserid();
                     name ="$userName="+ (corpwxUserId==null?"":corpwxUserId) +"$";
+                }else if(dingding!=null&&dingding.getContactNeedTranslate()==1){
+                    String targetName = userList.stream().filter(ul -> ul.getId().equals(uid)).findFirst().get().getName();
+                    name ="$userName="+ (targetName==null?"":targetName) +"$";
                 }else {
                      name = userList.stream().filter(ul -> ul.getId().equals(uid)).findFirst().get().getName();
                 }
@@ -1198,10 +1201,14 @@ public class DepartmentServiceImpl extends ServiceImpl<DepartmentMapper, Departm
             for (Map<String, Object> membMap : itemList) {
                 List<String> membRowData = new ArrayList<String>();
                 membRowData.add(String.valueOf(seq));
-                if(wxCorpInfo.getSaasSyncContact()==1){
+                if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                     membRowData.add("$userName="+(String)membMap.get("name")+"$");
                 }else {
-                    membRowData.add((String)membMap.get("name"));
+                    if(dingding!=null&&dingding.getContactNeedTranslate()==1){
+                        membRowData.add("$userName="+(String)membMap.get("name")+"$");
+                    }else {
+                        membRowData.add((String)membMap.get("name"));
+                    }
                 }
                 membRowData.add(((Double)membMap.get("cost")).toString());
                 allList.add(membRowData);
@@ -1386,6 +1393,8 @@ public class DepartmentServiceImpl extends ServiceImpl<DepartmentMapper, Departm
                 List<String> item=new ArrayList<>();
                 if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                     item.add("$departmentName="+(departmentMasterVO.getCorpwxDeptid()==null?"":departmentMasterVO.getCorpwxDeptid())+"$");
+                }else if(dingding!=null&&dingding.getContactNeedTranslate()==1){
+                    item.add("$departmentName="+(departmentMasterVO.getDdDeptid()==null?"":departmentMasterVO.getDdDeptid())+"$");
                 }else {
                     item.add(departmentMasterVO.getDepartmentName());
                 }
@@ -1626,6 +1635,27 @@ public class DepartmentServiceImpl extends ServiceImpl<DepartmentMapper, Departm
         }
     }
 
+    @Override
+    public String exportDdDepartment(Department department, List<Department> departmentList) {
+        if(department == null || department.getDdDeptid() == null){
+            return "";
+        }
+        String depHierarchy = "$departmentName="+department.getDdDeptid()+"$";
+        //搜到父部门进行添加
+        if (department.getSuperiorId()==null || department.getSuperiorId()==0) {
+            return depHierarchy;
+        }else{
+            Department supDept = null;
+            for (Department dept : departmentList) {
+                if (department.getSuperiorId().equals(dept.getDepartmentId())){
+                    supDept = dept;
+                    break;
+                }
+            }
+            return exportDdDepartment(supDept,departmentList) + "/" + depHierarchy;
+        }
+    }
+
     /**
      * 对部门进行排序
      * @param request

+ 52 - 26
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/DingDingServiceImpl.java

@@ -497,10 +497,10 @@ public class DingDingServiceImpl implements DingDingService {
         dingding.setCorpName(corpName);
         dingding.setAgentId(agentId);
         dingding.setAuthUserId(authUserId);
-        dingding.setSyncContact(1);
-        dingding.setContactNeedTranslate(1);//上架到钉钉应用市场,通讯录为加密模式,需要转译
-
         if (oldD == null) {
+            //新开通的情况,给字段默认值
+            dingding.setSyncContact(1);
+            dingding.setContactNeedTranslate(1);//上架到钉钉应用市场,通讯录为加密模式,需要转译
             //第一次,查询对方企业的accessToken
             SysConfig config = sysConfigMapper.selectOne(new QueryWrapper<SysConfig>().eq("param_key", "dingding_suite_ticket"));
             String suiteTicket = config.getParamValue();
@@ -521,6 +521,7 @@ public class DingDingServiceImpl implements DingDingService {
                     .setRoleId(smanager.getId())
                     .setRoleName(smanager.getRolename())
                     .setDingdingUserid(authUserId)
+                    .setName(authUserId)//新版,钉钉应用市场的用userId作name
                     .setColor(ColorUtil.randomColor())
                     .setCompanyId(company.getId());
 
@@ -813,11 +814,11 @@ public class DingDingServiceImpl implements DingDingService {
                 JSONArray deptArray = json.getJSONObject("auth_org_scopes").getJSONArray("authed_dept");
                 //如果授权的是全部公司部门,则递归获取子部门和人员
                 if (deptArray.size() == 1 && deptArray.getLong(0) == 1L) {
-                    getDepartmentList(roleId, roleName, dingding.getCompanyId(), dingding.getCorpid(), accessToken, 1L, addTempUserList);
+                    getDepartmentList(roleId, roleName, dingding.getCompanyId(), dingding.getCorpid(), accessToken, 1L, addTempUserList, dingding);
                 } else {
                     for (int i=0;i<deptArray.size(); i++) {
                         long deptId = deptArray.getLongValue(i);
-                        getDepartmentDetailAndUserList(roleId, roleName, dingding.getCompanyId(), dingding.getCorpid(), accessToken, deptId, addTempUserList);
+                        getDepartmentDetailAndUserList(roleId, roleName, dingding.getCompanyId(), dingding.getCorpid(), accessToken, deptId, addTempUserList, dingding);
                     }
                 }
 
@@ -877,7 +878,6 @@ public class DingDingServiceImpl implements DingDingService {
             if (dept.getDdDeptid() != null) {
                 Optional<DepartmentDingding> first = dingdingDeptList.stream().filter(ddpt -> ddpt.getDdDeptid().equals(dept.getDdDeptid())).findFirst();
                 if (first.isPresent()) {
-
                     boolean changed = false;
                     DepartmentDingding departmentDingding = first.get();
                     if (departmentDingding.getDdParentid() == 1) {
@@ -898,7 +898,8 @@ public class DingDingServiceImpl implements DingDingService {
                         }
                     }
 
-                    if (!departmentDingding.getName().equals(dept.getDepartmentName())) {
+                    //只有明文的才需要处理名称变化
+                    if (dingding.getContactNeedTranslate() == 0 && !departmentDingding.getName().equals(dept.getDepartmentName())) {
                         dept.setDepartmentName(departmentDingding.getName());
                         changed = true;
                     }
@@ -957,11 +958,13 @@ public class DingDingServiceImpl implements DingDingService {
                 User upUser = new User();
                 upUser.setId(oldUser.getId());
                 boolean changed = false;
-                if (oldUser.getName() == null || !oldUser.getName().equals(duser.getName())) {
-                    upUser.setName(duser.getName());
-                    System.out.println("更新用户姓名==" + oldUser.getName());
-                    changed = true;
-                }
+                //暂时不更新姓名,避免出现老钉钉用户姓名被冲掉的情况
+                //仅针对老用户,不需要转译的情况下,才可能出现姓名变更的情况
+//                if (dingding.getContactNeedTranslate() == 0 && duser.getName() != null && (oldUser.getName() == null || !oldUser.getName().equals(duser.getName()))) {
+//                    upUser.setName(duser.getName());
+//                    System.out.println("更新用户姓名==userId==" + oldUser.getId() + ", oldName="+ oldUser.getName()+", newName="+duser.getName());
+//                    changed = true;
+//                }
                 //可能需要更新工号
                 if (!StringUtils.isEmpty(duser.getJobNumber()) && (oldUser.getJobNumber() == null || !oldUser.getJobNumber().equals(duser.getJobNumber()))) {
                     upUser.setJobNumber(duser.getJobNumber());
@@ -1503,7 +1506,7 @@ public class DingDingServiceImpl implements DingDingService {
     }
 
     //获取部门详情和部门下的人员
-    public void getDepartmentDetailAndUserList(int roleId, String roleName, Integer companyId, String corpid, String accessToken, long deptId, List<TempDuser> addTempUserList) {
+    public void getDepartmentDetailAndUserList(int roleId, String roleName, Integer companyId, String corpid, String accessToken, long deptId, List<TempDuser> addTempUserList, CompanyDingding companyDingding) {
         try {
             DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/department/get");
             OapiV2DepartmentGetRequest req = new OapiV2DepartmentGetRequest();
@@ -1516,12 +1519,13 @@ public class DingDingServiceImpl implements DingDingService {
                 DepartmentDingding departmentDingding = new DepartmentDingding();
                 departmentDingding.setCorpid(corpid);
                 departmentDingding.setDdDeptid(dept.getInteger("dept_id"));
-                departmentDingding.setName(dept.getString("name"));
+                if (companyDingding.getContactNeedTranslate() == 1) {
+                    departmentDingding.setName(dept.getString("dept_id"));
+                } else {
+                    departmentDingding.setName(dept.getString("name"));
+                }
                 departmentDingding.setDdParentid(dept.getInteger("parent_id"));
                 Department department = new Department();
-                if (departmentDingding.getDdDeptid() == 661842181) {
-                    System.out.println("=========zfind 661842181"+departmentDingding.getName());
-                }
                 department.setCompanyId(companyId);
                 //检查,根部门是公司名称,不需要创建部门
                 if (departmentDingding.getDdDeptid() != 1) {
@@ -1536,7 +1540,7 @@ public class DingDingServiceImpl implements DingDingService {
                             departmentDingding.setId(old.getId());
                             //检查名称是否发生变化
                             System.out.println(departmentDingding.getName()+" -- 已存在:"+departmentDingding.getDdDeptid());
-                            if (!old.getName().equals(departmentDingding.getName()) || !old.getDdParentid().equals(departmentDingding.getDdParentid())) {
+                            if (companyDingding.getContactNeedTranslate() == 0 && (!old.getName().equals(departmentDingding.getName()) || !old.getDdParentid().equals(departmentDingding.getDdParentid()))) {
                                 departmentDingdingMapper.updateById(departmentDingding);
                                 System.out.println("更新该部门");
                             }
@@ -1549,7 +1553,7 @@ public class DingDingServiceImpl implements DingDingService {
                 //获取该部门下的人员, 如果是根部门,不会创建,人员的部门id会使用数据库默认的0
                 getDeptUserIdList(corpid, deptId, accessToken, addTempUserList);
                 //获取子部门
-                getDepartmentList(roleId, roleName, companyId, corpid, accessToken, departmentDingding.getDdDeptid(), addTempUserList);
+                getDepartmentList(roleId, roleName, companyId, corpid, accessToken, departmentDingding.getDdDeptid(), addTempUserList, companyDingding);
             }
         } catch (ApiException e) {
             e.printStackTrace();
@@ -1557,7 +1561,7 @@ public class DingDingServiceImpl implements DingDingService {
     }
 
     //获取该部门下的子部门列表,递归下一级子部门
-    public  String getDepartmentList(int roleId, String roleName, Integer companyId, String corpid, String access_token, long parentDeptId, List<TempDuser> addTempUserList) throws ApiException {
+    public  String getDepartmentList(int roleId, String roleName, Integer companyId, String corpid, String access_token, long parentDeptId, List<TempDuser> addTempUserList, CompanyDingding companyDingding) throws ApiException {
         DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/department/listsub");
         OapiV2DepartmentListsubRequest req = new OapiV2DepartmentListsubRequest();
         req.setDeptId(parentDeptId);
@@ -1573,7 +1577,12 @@ public class DingDingServiceImpl implements DingDingService {
                 DepartmentDingding departmentDingding = new DepartmentDingding();
                 departmentDingding.setCorpid(corpid);
                 departmentDingding.setDdDeptid(dept.getInteger("dept_id"));
-                departmentDingding.setName(dept.getString("name"));
+                //TODO:对于钉钉市场的用户,需要通讯录加密的,没有返回部门名称,用部门id替代
+                if (companyDingding.getContactNeedTranslate() == 1) {
+                    departmentDingding.setName(dept.getString("dept_id"));
+                } else {
+                    departmentDingding.setName(dept.getString("name"));
+                }
                 departmentDingding.setDdParentid(dept.getInteger("parent_id"));
                 if (departmentDingding.getDdDeptid() == 661842181) {
                     System.out.println("=========zfind 661842181"+departmentDingding.getName());
@@ -1588,7 +1597,8 @@ public class DingDingServiceImpl implements DingDingService {
                         departmentDingding.setId(old.getId());
                         //检查名称是否发生变化
                         System.out.println(departmentDingding.getName()+" -- 已存在:"+departmentDingding.getDdDeptid());
-                        if (!old.getName().equals(departmentDingding.getName()) || !old.getDdParentid().equals(departmentDingding.getDdParentid())) {
+                        //只有老用户,不需要转译的情况下才可能更新部门名称
+                        if (companyDingding.getContactNeedTranslate() == 0 && (!old.getName().equals(departmentDingding.getName()) || !old.getDdParentid().equals(departmentDingding.getDdParentid()))) {
                             departmentDingdingMapper.updateById(departmentDingding);
                             System.out.println("更新该部门");
                         }
@@ -1597,7 +1607,7 @@ public class DingDingServiceImpl implements DingDingService {
                     }
                 }
                 //获取子部门的数据
-                getDepartmentList(roleId, roleName, companyId, corpid, access_token, departmentDingding.getDdDeptid(), addTempUserList);
+                getDepartmentList(roleId, roleName, companyId, corpid, access_token, departmentDingding.getDdDeptid(), addTempUserList, companyDingding);
             }
             //获取部门下的人员列表
             getDeptUserIdList(corpid, parentDeptId, access_token, addTempUserList);
@@ -1642,7 +1652,7 @@ public class DingDingServiceImpl implements DingDingService {
                     .setRoleId(defaultRole.getId())
                     .setRoleName(defaultRole.getRolename())
                     .setCompanyId(dingding.getCompanyId())
-                    .setName(userJson.getString("name"))
+                    .setName(dingding.getContactNeedTranslate() == 0?userJson.getString("name"):dingdingUserid)
                     .setDingdingUserid(dingdingUserid)
                     .setDingdingUnionid(userJson.getString("unionid"))
                     .setColor(ColorUtil.randomColor());
@@ -1698,9 +1708,12 @@ public class DingDingServiceImpl implements DingDingService {
         DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/user/get");
         OapiV2UserGetRequest req = new OapiV2UserGetRequest();
         req.setUserid(dingdingUserid);
+        if ("0515450852840252".equals(dingdingUserid)) {
+            System.out.println("这是张杰====================");
+        }
         req.setLanguage("zh_CN");
         OapiV2UserGetResponse rsp = client.execute(req, access_token);
-        System.out.println(rsp.getBody());
+        System.out.println("用户详情:"+rsp.getBody());
         JSONObject resp = JSONObject.parseObject(rsp.getBody());
         if (resp.getInteger("errcode") == 0) {
             JSONObject userJson = resp.getJSONObject("result");
@@ -1710,7 +1723,12 @@ public class DingDingServiceImpl implements DingDingService {
             if (!addTempUserList.stream().anyMatch(add->add.getDingdingUserid().equals(dingdingUserid))) {
                 TempDuser duser = new TempDuser();
                 duser.setDingdingUserid(dingdingUserid);
-                duser.setName(userJson.getString("name"));
+                //用userId作为name,方便系统内部处理
+                if (userJson.getString("name") == null) {
+                    duser.setName(dingdingUserid);
+                } else {
+                    duser.setName(userJson.getString("name"));
+                }
                 duser.setDdDeptid(ddDeptId);
                 duser.setCorpid(corpid);
                 duser.setJobNumber(userJson.getString("job_number"));
@@ -2574,6 +2592,7 @@ public class DingDingServiceImpl implements DingDingService {
         JSONObject obj = JSONObject.parseObject(response.getBody());
         if (obj.getIntValue("errcode") == 0) {
             media_id = obj.getString("media_id");
+            System.out.println("钉钉转译media_id=========="+media_id);
             return media_id;
         }
         return null;
@@ -2595,15 +2614,19 @@ public class DingDingServiceImpl implements DingDingService {
             try {
                 TranslateFileResponse translateFileResponse = client.translateFileWithOptions(translateFileRequest, translateFileHeaders, new RuntimeOptions());
                 TranslateFileResponseBody body = translateFileResponse.body;
+                System.out.println("钉钉转译jobId=========="+body.jobId);
+                System.out.println("钉钉转译body=========="+body);
                 return body.jobId;
             } catch (TeaException err) {
                 if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
                     // err 中含有 code 和 message 属性,可帮助开发定位问题
+                    System.err.println(err.code+": " +err.message);
                 }
             } catch (Exception _err) {
                 TeaException err = new TeaException(_err.getMessage(), _err);
                 if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
                     // err 中含有 code 和 message 属性,可帮助开发定位问题
+                    System.err.println(err.code+": " +err.message);
                 }
 
             }
@@ -2622,15 +2645,18 @@ public class DingDingServiceImpl implements DingDingService {
             try {
                 GetTranslateFileJobResultResponse translateFileJobResultWithOptions = client.getTranslateFileJobResultWithOptions(getTranslateFileJobResultRequest, getTranslateFileJobResultHeaders, new RuntimeOptions());
                 GetTranslateFileJobResultResponseBody body = translateFileJobResultWithOptions.body;
+                System.out.println("钉钉转译url=========="+body.url);
                 return body.url;
             } catch (TeaException err) {
                 if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
                     // err 中含有 code 和 message 属性,可帮助开发定位问题
+                    System.err.println(err.code+": " +err.message);
                 }
             } catch (Exception _err) {
                 TeaException err = new TeaException(_err.getMessage(), _err);
                 if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
                     // err 中含有 code 和 message 属性,可帮助开发定位问题
+                    System.err.println(err.code+": " +err.message);
                 }
             }
         }

+ 5 - 5
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ExcelExportServiceImpl.java

@@ -131,7 +131,7 @@ public class ExcelExportServiceImpl implements ExcelExportService {
                 //httpRespMsg.setError("处理超时...");
                 httpRespMsg.setError(MessageUtils.message("request.outTime"));
             }
-        }else if(dingding != null && dingding.getSyncContact() == 1){
+        }else if(dingding != null && dingding.getContactNeedTranslate() == 1){
             User user = userMapper.selectById(request.getHeader("token"));
             String mediaId = dingDingService.getTranslationMediaId(fileUrlSuffix,dingding);
             String jobId = dingDingService.syncTranslation(mediaId,fileUrlSuffix, user.getDingdingUnionid(),dingding);
@@ -218,7 +218,7 @@ public class ExcelExportServiceImpl implements ExcelExportService {
                 //httpRespMsg.setError("处理超时...");
                 httpRespMsg.setError(MessageUtils.message("request.outTime"));
             }
-        }else if(dingding != null && dingding.getSyncContact() == 1){
+        }else if(dingding != null && dingding.getContactNeedTranslate() == 1){
             User user = userMapper.selectById(request.getHeader("token"));
             String mediaId = dingDingService.getTranslationMediaId(fileUrlSuffix,dingding);
             String jobId = dingDingService.syncTranslation(mediaId,fileUrlSuffix, user.getDingdingUnionid(),dingding);
@@ -294,7 +294,7 @@ public class ExcelExportServiceImpl implements ExcelExportService {
                 //httpRespMsg.setError("处理超时...");
                 httpRespMsg.setError(MessageUtils.message("request.outTime"));
             }
-        }else if(dingding != null && dingding.getSyncContact() == 1){
+        }else if(dingding != null && dingding.getContactNeedTranslate() == 1){
             User user = userMapper.selectById(request.getHeader("token"));
             String mediaId = dingDingService.getTranslationMediaId(fileUrlSuffix,dingding);
             String jobId = dingDingService.syncTranslation(mediaId,fileUrlSuffix, user.getDingdingUnionid(),dingding);
@@ -371,7 +371,7 @@ public class ExcelExportServiceImpl implements ExcelExportService {
                 //httpRespMsg.setError("处理超时...");
                 httpRespMsg.setError(MessageUtils.message("request.outTime"));
             }
-        }else if(dingding != null && dingding.getSyncContact() == 1){
+        }else if(dingding != null && dingding.getContactNeedTranslate() == 1){
             User user = userMapper.selectById(request.getHeader("token"));
             String mediaId = dingDingService.getTranslationMediaId(fileUrlSuffix,dingding);
             String jobId = dingDingService.syncTranslation(mediaId,fileUrlSuffix,user.getDingdingUnionid(), dingding);
@@ -446,7 +446,7 @@ public class ExcelExportServiceImpl implements ExcelExportService {
                 //httpRespMsg.setError("处理超时...");
                 httpRespMsg.setError(MessageUtils.message("request.outTime"));
             }
-        }else if(dingding != null && dingding.getSyncContact() == 1){
+        }else if(dingding != null && dingding.getContactNeedTranslate() == 1){
             User user = userMapper.selectById(request.getHeader("token"));
             String mediaId = dingDingService.getTranslationMediaId(fileUrlSuffix,dingding);
             String jobId = dingDingService.syncTranslation(mediaId,fileUrlSuffix,user.getDingdingUnionid(), dingding);

+ 43 - 20
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ExpenseSheetServiceImpl.java

@@ -2,6 +2,7 @@ package com.management.platform.service.impl;
 
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
+import com.aliyun.dingtalkcontact_1_0.models.SearchUserResponse;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -97,6 +98,8 @@ public class ExpenseSheetServiceImpl extends ServiceImpl<ExpenseSheetMapper, Exp
     private ExpenseAuditSettingMapper expenseAuditSettingMapper;
     @Resource
     private CompanyDingdingMapper companyDingdingMapper;
+    @Resource
+    private CompanyDingdingService companyDingdingService;
 
 
     @Override
@@ -791,7 +794,7 @@ public class ExpenseSheetServiceImpl extends ServiceImpl<ExpenseSheetMapper, Exp
         information.setUserId(owner.getId());
         information.setTime(LocalDateTime.now());
         information.setMsg("您"+(sheet.getCreateDate() == null?"":dateTimeFormatter.format(sheet.getCreateDate())) + "费用报销申请审核"+(sheet.getStatus() == 0?"已通过":"已驳回")+", 审核人:"
-                +(auditor.getCorpwxUserid() != null ? ("$userName="+auditor.getCorpwxUserid()+"$"):auditor.getName()));
+                +(auditor.getCorpwxUserid() != null ? ("$userName="+auditor.getCorpwxUserid()+"$"):auditor.getDingdingUserid()!=null?("$userName="+auditor.getDingdingUserid()+"$"):auditor.getName()));
         information.setType(3);//费用报销模块
         information.setContent(sheet.getId()+"");
         informationMapper.insert(information);
@@ -802,6 +805,7 @@ public class ExpenseSheetServiceImpl extends ServiceImpl<ExpenseSheetMapper, Exp
         HttpRespMsg msg = new HttpRespMsg();
         User user = userMapper.selectById(request.getHeader("token"));
         WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", user.getCompanyId()));
+        CompanyDingding dingding = companyDingdingService.getOne(new LambdaQueryWrapper<CompanyDingding>().eq(CompanyDingding::getCompanyId, user.getCompanyId()));
         //然后处理文件
         for (MultipartFile multipartFile : files) {
             String fileName = multipartFile.getOriginalFilename();
@@ -857,20 +861,37 @@ public class ExpenseSheetServiceImpl extends ServiceImpl<ExpenseSheetMapper, Exp
                 //做完非空校验后,进行姓名处理
 
                 String reimburserName = reimburserCell.getStringCellValue();
-
+                List<String> userNameList=new ArrayList<>();
+                userNameList.add(reimburserName);
                 HttpRespMsg respMsg= null;
                 List<User> targetUserList= new ArrayList<>();
-                if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
-                    List<String> userNameList=new ArrayList<>();
-                    userNameList.add(reimburserName);
-                    System.out.println("参与搜素的人员列表"+userNameList);
+                if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1&&userNameList.size()>0){
+                    System.out.println("参与搜素的人员列表"+userNameList + userNameList.size());
                     respMsg = wxCorpInfoService.getBatchSearchUserInfo(wxCorpInfo, userNameList,null);
                     if(respMsg.code.equals("0")){
                         msg.setError("姓名为["+String.valueOf(respMsg.data)+"]的人员存在重复,请使用工号!");
                         return msg;
                     }
-                    targetUserList = (List<User>) respMsg.data;
+                    targetUserList= (List<User>) respMsg.data;
                 }
+//                if(dingding!=null&&dingding.getContactNeedTranslate()==1&&userNameList.size()>0){
+//                    System.out.println("参与搜素的人员列表"+userNameList + userNameList.size());
+//                    for (String name : userNameList) {
+//                        respMsg= companyDingdingService.getSearchUserInfo(dingding,name,1);
+//                        SearchUserResponse searchUserResponse = (SearchUserResponse) respMsg.data;
+//                        if(searchUserResponse.body.totalCount>1){
+//                            msg.setError("姓名为["+name+"]的人员存在重复,请使用工号!");
+//                            return msg;
+//                        }
+//                        if(searchUserResponse.body.list.size()>0){
+//                            User item=new User();
+//                            //为了修改代码 此处用企业微信同一个字段 setCorpwxUserid
+//                            item.setName(name);
+//                            item.setCorpwxUserid(searchUserResponse.body.list.get(0));
+//                            targetUserList.add(item);
+//                        }
+//                    }
+//                }
                 ExpenseSheet expenseSheet = new ExpenseSheet();
                 if(functionList.size()>0){
                     expenseSheet.setStatus(0);
@@ -898,18 +919,18 @@ public class ExpenseSheetServiceImpl extends ServiceImpl<ExpenseSheetMapper, Exp
                         .atZone(ZoneId.systemDefault()).toLocalDate();
                 expenseSheet.setCreateDate(localDate);
                 Optional<User> first;
-                if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
-                    Optional<User> optional = targetUserList.stream().filter(tl -> tl.getName().equals(reimburserName)).findFirst();
-                    first = userList.stream().filter(us -> us.getName().equals(reimburserName)||(us.getJobNumber()!=null&&us.getJobNumber().equals(reimburserName))||(optional.isPresent()&&us.getCorpwxUserid()!=null&&us.getCorpwxUserid().equals(optional.get().getCorpwxUserid()))).findFirst();
-                }else {
-                    first = userList.stream().filter(us -> us.getName().equals(reimburserName)||(us.getJobNumber()!=null&&us.getJobNumber().equals(reimburserName))).findFirst();
-                }
-                if (first != null && first.isPresent()) {
-                    expenseSheet.setOwnerId(first.get().getId());
-                    expenseSheet.setOwnerName(first.get().getName());
-                } else {
-                    throw new Exception("报销人[" +reimburserCell+"]不存在");
-                }
+//                if((wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1)||(dingding!=null&&dingding.getContactNeedTranslate()==1)){
+//                    Optional<User> optional = targetUserList.stream().filter(tl -> tl.getName().equals(reimburserName)).findFirst();
+//                    first = userList.stream().filter(us -> us.getName().equals(reimburserName)||(us.getJobNumber()!=null&&us.getJobNumber().equals(reimburserName))||(optional.isPresent()&&(us.getCorpwxUserid()!=null&&us.getCorpwxUserid().equals(optional.get().getCorpwxUserid()))||(us.getDingdingUserid()!=null&&us.getDingdingUserid().equals(optional.get().getCorpwxUserid())))).findFirst();
+//                }else {
+//                    first = userList.stream().filter(us -> us.getName().equals(reimburserName)||(us.getJobNumber()!=null&&us.getJobNumber().equals(reimburserName))).findFirst();
+//                }
+//                if (first != null && first.isPresent()) {
+//                    expenseSheet.setOwnerId(first.get().getId());
+//                    expenseSheet.setOwnerName(first.get().getName());
+//                } else {
+//                    throw new Exception("报销人[" +reimburserCell+"]不存在");
+//                }
                 expenseSheet.setOperatorId(user.getId());
                 expenseSheet.setRemark(remarksCell.getStringCellValue());
                 if(StringUtils.isEmpty(expenseTypeCell.getStringCellValue())){
@@ -1010,7 +1031,7 @@ public class ExpenseSheetServiceImpl extends ServiceImpl<ExpenseSheetMapper, Exp
                         }
                     }
                     if(subExpenseTypeCell!=null){
-                        List<String> stringList = expenseTypeList.stream().filter(et -> et.getMainType().equals(expenseSheet.getType())).map(et -> et.getTypeName()).collect(Collectors.toList());
+                        List<String> stringList = expenseTypeList.stream().filter(et ->et.getMainType()!=null&&et.getMainType().equals(expenseSheet.getType())).map(et -> et.getTypeName()).collect(Collectors.toList());
                         if(stringList!=null&&!stringList.contains(subExpenseTypeCell.getStringCellValue())){
                             //msg.setError("当前费用类型["+expenseTypeCell.getStringCellValue()+"]中不存在["+subExpenseTypeCell.getStringCellValue()+"]类型");
                             msg.setError(MessageUtils.message("Reimbursement.TypeError",expenseTypeCell.getStringCellValue(),subExpenseTypeCell.getStringCellValue()));
@@ -1170,6 +1191,8 @@ public class ExpenseSheetServiceImpl extends ServiceImpl<ExpenseSheetMapper, Exp
                 List<String> item=new ArrayList<>();
                 if (wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                     item.add("$userName=" + record.getOwnerName() +"$");
+                }else if (dingding!=null&&dingding.getContactNeedTranslate()==1){
+                    item.add("$userName=" + record.getOwnerName() +"$");
                 }else {
                     item.add(record.getOwnerName());
                 }

+ 21 - 7
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/FinanceServiceImpl.java

@@ -1198,17 +1198,29 @@ public class FinanceServiceImpl extends ServiceImpl<FinanceMapper, Finance> impl
                             BigDecimal field5 = userFinance.getCustomField5() == null? new BigDecimal(0):userFinance.getCustomField5().multiply(new BigDecimal(workingTime)).divide(userTime.get(creatorId).workingTime, 6, BigDecimal.ROUND_HALF_UP);
                             BigDecimal field6 = userFinance.getCustomField6() == null? new BigDecimal(0):userFinance.getCustomField6().multiply(new BigDecimal(workingTime)).divide(userTime.get(creatorId).workingTime, 6, BigDecimal.ROUND_HALF_UP);
                             BigDecimal field7 = userFinance.getCustomField7() == null? new BigDecimal(0):userFinance.getCustomField6().multiply(new BigDecimal(workingTime)).divide(userTime.get(creatorId).workingTime, 6, BigDecimal.ROUND_HALF_UP);
+                            //增加部门
+                            Optional<Department> findDept = allDepartments.stream().filter(dp -> dp.getDepartmentId().equals(us.getDepartmentId())).findFirst();
                             if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                                 membRowData.add("$userName="+(us.getCorpwxUserid()==null?"":us.getCorpwxUserid())+"$");
+                                if (findDept.isPresent()) {
+                                    membRowData.add("$departmentName="+findDept.get().getDepartmentName()+"$");
+                                } else {
+                                    membRowData.add("");
+                                }
+                            }if(dingding!=null&&dingding.getContactNeedTranslate()==1){
+                                membRowData.add("$userName="+us.getName()+"$");
+                                if (findDept.isPresent()) {
+                                    membRowData.add("$departmentName="+findDept.get().getDepartmentName()+"$");
+                                } else {
+                                    membRowData.add("");
+                                }
                             }else {
                                 membRowData.add(us.getName());
-                            }
-                            //增加部门
-                            Optional<Department> findDept = allDepartments.stream().filter(dp -> dp.getDepartmentId().equals(us.getDepartmentId())).findFirst();
-                            if (findDept.isPresent()) {
-                                membRowData.add(findDept.get().getDepartmentName());
-                            } else {
-                                membRowData.add("");
+                                if (findDept.isPresent()) {
+                                    membRowData.add(findDept.get().getDepartmentName());
+                                } else {
+                                    membRowData.add("");
+                                }
                             }
                             for (int i = 0; i < userCustoms.size(); i++) {
                                 switch (i){
@@ -1300,6 +1312,8 @@ public class FinanceServiceImpl extends ServiceImpl<FinanceMapper, Finance> impl
                                     User us = userList.stream().filter(u->u.getId().equals(npu.getUserId())).findFirst().get();
                                     if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                                         membRowData.add("$userName="+(us.getCorpwxUserid()==null?"":us.getCorpwxUserid())+"$");
+                                    }else if(dingding!=null&&dingding.getContactNeedTranslate()==1){
+                                        membRowData.add("$userName="+npu.getName()+"$");
                                     }else {
                                         membRowData.add(npu.getName());
                                     }

+ 22 - 18
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/InformationServiceImpl.java

@@ -1,14 +1,13 @@
 package com.management.platform.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.management.platform.entity.Information;
-import com.management.platform.entity.TaskComment;
-import com.management.platform.entity.User;
-import com.management.platform.entity.WxCorpInfo;
+import com.management.platform.entity.*;
 import com.management.platform.mapper.InformationMapper;
 import com.management.platform.mapper.UserMapper;
 import com.management.platform.mapper.WxCorpInfoMapper;
+import com.management.platform.service.CompanyDingdingService;
 import com.management.platform.service.InformationService;
 import com.management.platform.util.HttpRespMsg;
 import com.management.platform.util.MessageUtils;
@@ -40,6 +39,8 @@ public class InformationServiceImpl extends ServiceImpl<InformationMapper, Infor
 
     @Resource
     private InformationService informationService;
+    @Resource
+    private CompanyDingdingService companyDingdingService;
 
     @Override
     public HttpRespMsg getInformationList(HttpServletRequest request) {
@@ -49,24 +50,27 @@ public class InformationServiceImpl extends ServiceImpl<InformationMapper, Infor
             List<Information> information = informationMapper.selectList(new QueryWrapper<Information>()
                     .eq("user_id", user.getId()).orderByDesc("time").last("LIMIT 20"));
             WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id",user.getCompanyId()));
-            if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
-                List<User> users = userMapper.selectList(new QueryWrapper<User>().eq("company_id",user.getCompanyId()));
-                for (Information info : information) {
-                    if (info.getMsg() == null){
-                        continue;
-                    } else if (info.getMsg().contains("更新任务进展为")){
-                        String name = info.getMsg().substring(0, info.getMsg().indexOf("更新任务进展为"));
-                        String userWxId = "";
-                        for (User item : users) {
-                            if (name.equals(item.getName())){
+            CompanyDingding dingding = companyDingdingService.getOne(new LambdaQueryWrapper<CompanyDingding>().eq(CompanyDingding::getCompanyId, user.getCompanyId()));
+            List<User> users = userMapper.selectList(new QueryWrapper<User>().eq("company_id",user.getCompanyId()));
+            for (Information info : information) {
+                if (info.getMsg() == null){
+                    continue;
+                } else if (info.getMsg().contains("更新任务进展为")){
+                    String name = info.getMsg().substring(0, info.getMsg().indexOf("更新任务进展为"));
+                    String userWxId = "";
+                    for (User item : users) {
+                        if (name.equals(item.getName())){
+                            if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                                 userWxId = item.getCorpwxRealUserid();
-                                break;
+                            }else if(dingding!=null&&dingding.getContactNeedTranslate()==1){
+                                userWxId = item.getDingdingUserid();
                             }
+                            break;
                         }
-                        String msg = info.getMsg();
-                        String newMsg = msg.replace(name, "$userName=" + userWxId + "$");
-                        info.setMsg(newMsg);
                     }
+                    String msg = info.getMsg();
+                    String newMsg = msg.replace(name, "$userName=" + userWxId + "$");
+                    info.setMsg(newMsg);
                 }
             }
             httpRespMsg.data = information;

+ 10 - 3
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/LeaveSheetServiceImpl.java

@@ -214,7 +214,7 @@ public class LeaveSheetServiceImpl extends ServiceImpl<LeaveSheetMapper, LeaveSh
         information.setUserId(owner.getId());
         information.setTime(LocalDateTime.now());
         information.setMsg("您"+applyTimeDesc + "请假申请审核"+(sheet.getStatus() == 0?"已通过":"已驳回")+", 审核人:"
-                +(auditor.getCorpwxUserid() != null ? ("$userName="+auditor.getCorpwxUserid()+"$"):auditor.getName()));
+                +(auditor.getCorpwxUserid() != null ? ("$userName="+auditor.getCorpwxUserid()+"$"):auditor.getDingdingUserid() != null ? ("$userName="+auditor.getDingdingUserid()+"$"):auditor.getName()));
         information.setType(4);
         information.setContent(sheet.getId()+"");
         informationMapper.insert(information);
@@ -226,7 +226,7 @@ public class LeaveSheetServiceImpl extends ServiceImpl<LeaveSheetMapper, LeaveSh
         information.setUserId(sheet.getAuditorId());
         information.setTime(LocalDateTime.now());
         User owner = userMapper.selectById(sheet.getOwnerId());
-        information.setMsg("请假待审核, 请假人:" + (owner.getCorpwxUserid() != null?("$userName="+owner.getCorpwxUserid()+"$"):owner.getName()));
+        information.setMsg("请假待审核, 请假人:" + (owner.getCorpwxUserid() != null?("$userName="+owner.getCorpwxUserid()+"$"):owner.getDingdingUserid() != null?("$userName="+owner.getDingdingUserid()+"$"):owner.getName()));
         information.setType(4);
         information.setContent(sheet.getId()+"");
         informationMapper.insert(information);
@@ -606,6 +606,13 @@ public class LeaveSheetServiceImpl extends ServiceImpl<LeaveSheetMapper, LeaveSh
                 }else {
                     item.add("");
                 }
+            }else if(dingding!=null&&dingding.getContactNeedTranslate()==1){
+                if (present){
+                    User us = userList.stream().filter(ul -> ul.getId().equals(leaveSheet.getOwnerId())).findFirst().get();
+                    item.add("$userName="+(us.getDingdingUserid()==null?"":us.getDingdingUserid())+"$");
+                }else {
+                    item.add("");
+                }
             }else {
                 item.add(leaveSheet.getOwnerName()==null?"":leaveSheet.getOwnerName());
             }
@@ -651,7 +658,7 @@ public class LeaveSheetServiceImpl extends ServiceImpl<LeaveSheetMapper, LeaveSh
             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) {
+            if ((wxCorpInfo != null && wxCorpInfo.getSaasSyncContact() == 1)||(dingding != null && dingding.getContactNeedTranslate() == 1)) {
                 auditorName = "$userName="+auditorName+"$";
             }
             String statusS = "";

+ 29 - 6
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectApprovalServiceImpl.java

@@ -2,6 +2,7 @@ package com.management.platform.service.impl;
 
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
+import com.aliyun.dingtalkcontact_1_0.models.SearchUserResponse;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -55,6 +56,8 @@ public class ProjectApprovalServiceImpl extends ServiceImpl<ProjectApprovalMappe
     @Resource
     private SysFunctionService sysFunctionService;
     @Resource
+    private CompanyDingdingService companyDingdingService;
+    @Resource
     private ProjectApprovalCheckService projectApprovalCheckService;
     @Resource
     private WxCorpInfoService wxCorpInfoService;
@@ -173,6 +176,7 @@ public class ProjectApprovalServiceImpl extends ServiceImpl<ProjectApprovalMappe
         User user = userMapper.selectById(request.getHeader("token"));
         String[] arr=new String[]{"正常","紧急","重要","重要且紧急","低风险","中风险","高风险"};
         WxCorpInfo wxCorpInfo = wxCorpInfoService.getOne(new LambdaQueryWrapper<WxCorpInfo>().eq(WxCorpInfo::getCompanyId, user.getCompanyId()));
+        CompanyDingding dingding = companyDingdingMapper.selectOne(new LambdaQueryWrapper<CompanyDingding>().eq(CompanyDingding::getCompanyId, user.getCompanyId()));
         TimeType timeType = timeTypeMapper.selectById(user.getCompanyId());
         String fileName = multipartFile.getOriginalFilename();
         File file = new File(fileName == null ? "file" : fileName);
@@ -245,6 +249,7 @@ public class ProjectApprovalServiceImpl extends ServiceImpl<ProjectApprovalMappe
                     userNameList.add(inchargerName);
                 }
             }
+            List<User> targetUserList=new ArrayList<>();
             HttpRespMsg respMsg=new HttpRespMsg();
             if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1&&userNameList.size()>0){
                 System.out.println("参与搜素的人员列表"+userNameList + userNameList.size());
@@ -253,8 +258,26 @@ public class ProjectApprovalServiceImpl extends ServiceImpl<ProjectApprovalMappe
                     msg.setError("姓名为["+String.valueOf(respMsg.data)+"]的人员存在重复,请使用工号!");
                     return msg;
                 }
+                targetUserList= (List<User>) respMsg.data;
+            }
+            if(dingding!=null&&dingding.getContactNeedTranslate()==1&&userNameList.size()>0){
+                System.out.println("参与搜素的人员列表"+userNameList + userNameList.size());
+                for (String name : userNameList) {
+                    respMsg= companyDingdingService.getSearchUserInfo(dingding,name,1);
+                    SearchUserResponse searchUserResponse = (SearchUserResponse) respMsg.data;
+                    if(searchUserResponse.body.totalCount>1){
+                        msg.setError("姓名为["+name+"]的人员存在重复,请使用工号!");
+                        return msg;
+                    }
+                    if(searchUserResponse.body.list.size()>0){
+                        User item=new User();
+                        //为了修改代码 此处用企业微信同一个字段 setCorpwxUserid
+                        item.setName(name);
+                        item.setCorpwxUserid(searchUserResponse.body.list.get(0));
+                        targetUserList.add(item);
+                    }
+                }
             }
-            List<User> targetUserList= (List<User>) respMsg.data;
             int importCount = 0;
             for (int rowIndex = 0; rowIndex <= rowNum; rowIndex++) {
                 XSSFRow row = sheet.getRow(rowIndex);
@@ -372,17 +395,17 @@ public class ProjectApprovalServiceImpl extends ServiceImpl<ProjectApprovalMappe
                         Optional<User> first;
                         Integer exception=null;
                         if(split.length==1){
-                            if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                            if((wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1)||(dingding!=null&&dingding.getContactNeedTranslate()==1)){
                                 Optional<User> optional = targetUserList.stream().filter(tl -> tl.getName().equals(split[0])).findFirst();
-                                first= userList.stream().filter(u ->(u.getJobNumber()!=null&&u.getJobNumber().equals(split[0]))||(optional.isPresent()&&u.getCorpwxUserid()!=null&&u.getCorpwxUserid().equals(optional.get().getCorpwxUserid()))).findFirst();
+                                first= userList.stream().filter(u ->(u.getJobNumber()!=null&&u.getJobNumber().equals(split[0]))||(optional.isPresent()&&(u.getCorpwxUserid()!=null&&u.getCorpwxUserid().equals(optional.get().getCorpwxUserid()))||(u.getDingdingUserid()!=null&&u.getDingdingUserid().equals(optional.get().getCorpwxUserid())))).findFirst();
                             }else {
                                 first= userList.stream().filter(u -> u.getName().equals(split[0])||(u.getJobNumber()!=null&&u.getJobNumber().equals(split[0]))).findFirst();
                             }
                             exception=0;
                         }else {
-                            if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                            if((wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1)||(dingding!=null&&dingding.getContactNeedTranslate()==1)){
                                 Optional<User> optional = targetUserList.stream().filter(tl -> tl.getName().equals(split[1])).findFirst();
-                                first= userList.stream().filter(u ->(u.getJobNumber()!=null&&u.getJobNumber().equals(split[1]))||(optional.isPresent()&&u.getCorpwxUserid()!=null&&u.getCorpwxUserid().equals(optional.get().getCorpwxUserid()))).findFirst();
+                                first= userList.stream().filter(u ->(u.getJobNumber()!=null&&u.getJobNumber().equals(split[1]))||(optional.isPresent()&&(u.getCorpwxUserid()!=null&&u.getCorpwxUserid().equals(optional.get().getCorpwxUserid()))||(u.getDingdingUserid()!=null&&u.getDingdingUserid().equals(optional.get().getCorpwxUserid())))).findFirst();
                                 exception=1;
                             }else {
                                 first= userList.stream().filter(u -> u.getName().equals(split[1])&&(u.getJobNumber()!=null&&u.getJobNumber().equals(split[1]))).findFirst();
@@ -746,7 +769,7 @@ public class ProjectApprovalServiceImpl extends ServiceImpl<ProjectApprovalMappe
             item.add(record.getProjectName());
             item.add(record.getCategoryName());
             item.add(record.getIsPublic()==0?"正式项目":"非项目");
-            if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+            if((wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1)||(dingding!=null&&dingding.getContactNeedTranslate()==1)){
                 item.add("$userName="+(record.getInchargerName()==null?"":record.getInchargerName())+"$");
             }else {
                 item.add(record.getInchargerName()==null?"":record.getInchargerName());

+ 28 - 7
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectPercentageServiceImpl.java

@@ -2,14 +2,13 @@ package com.management.platform.service.impl;
 
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
+import com.aliyun.dingtalkcontact_1_0.models.SearchUserResponse;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.management.platform.entity.*;
 import com.management.platform.mapper.*;
-import com.management.platform.service.ExcelExportService;
-import com.management.platform.service.FinanceProjectsService;
-import com.management.platform.service.ProjectPercentageService;
-import com.management.platform.service.WxCorpInfoService;
+import com.management.platform.service.*;
 import com.management.platform.util.ExcelUtil;
 import com.management.platform.util.HttpRespMsg;
 import com.management.platform.util.MessageUtils;
@@ -61,6 +60,8 @@ public class ProjectPercentageServiceImpl extends ServiceImpl<ProjectPercentageM
     private ExcelExportService excelExportService;
     @Resource
     private ProjectPercentageService projectPercentageService;
+    @Resource
+    private CompanyDingdingService companyDingdingService;
     @Value(value = "${upload.path}")
     private String path;
     @Override
@@ -170,6 +171,7 @@ public class ProjectPercentageServiceImpl extends ServiceImpl<ProjectPercentageM
             //获取公司全部成员
             List<User> allUserList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", companyId));
             WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id",companyId));
+            CompanyDingding dingding = companyDingdingService.getOne(new LambdaQueryWrapper<CompanyDingding>().eq(CompanyDingding::getCompanyId, companyId));
             Sheet sheet = workbook.getSheetAt(0);
             //由于第一行需要指明列对应的标题
             int rowNum = sheet.getLastRowNum();
@@ -207,6 +209,7 @@ public class ProjectPercentageServiceImpl extends ServiceImpl<ProjectPercentageM
                     userNameList.add(username);
                 }
             }
+            List<User> targetUserList=new ArrayList<>();
             HttpRespMsg respMsg=new HttpRespMsg();
             if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1&&userNameList.size()>0){
                 System.out.println("参与搜素的人员列表"+userNameList + userNameList.size());
@@ -215,8 +218,26 @@ public class ProjectPercentageServiceImpl extends ServiceImpl<ProjectPercentageM
                     msg.setError("姓名为["+String.valueOf(respMsg.data)+"]的人员存在重复,请使用工号!");
                     return msg;
                 }
+                targetUserList= (List<User>) respMsg.data;
+            }
+            if(dingding!=null&&dingding.getContactNeedTranslate()==1&&userNameList.size()>0){
+                System.out.println("参与搜素的人员列表"+userNameList + userNameList.size());
+                for (String name : userNameList) {
+                    respMsg= companyDingdingService.getSearchUserInfo(dingding,name,1);
+                    SearchUserResponse searchUserResponse = (SearchUserResponse) respMsg.data;
+                    if(searchUserResponse.body.totalCount>1){
+                        msg.setError("姓名为["+name+"]的人员存在重复,请使用工号!");
+                        return msg;
+                    }
+                    if(searchUserResponse.body.list.size()>0){
+                        User item=new User();
+                        //为了修改代码 此处用企业微信同一个字段 setCorpwxUserid
+                        item.setName(name);
+                        item.setCorpwxUserid(searchUserResponse.body.list.get(0));
+                        targetUserList.add(item);
+                    }
+                }
             }
-            List<User> targetUserList= (List<User>) respMsg.data;
             for (int rowIndex = 0; rowIndex <= rowNum; rowIndex++) {
                 Row row = sheet.getRow(rowIndex);
                 if (row == null) {
@@ -269,9 +290,9 @@ public class ProjectPercentageServiceImpl extends ServiceImpl<ProjectPercentageM
                     String username = userNameCell.getStringCellValue().trim();
                     //检查人员是否存在
                     Optional<User> userOp;
-                    if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                    if((wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1)||(dingding!=null&&dingding.getContactNeedTranslate()==1)){
                         Optional<User> optional = targetUserList.stream().filter(tl -> tl.getName().equals(username)).findFirst();
-                        userOp= allUserList.stream().filter(u ->((u.getJobNumber()!=null&&u.getJobNumber().equals(username))||(optional.isPresent()&&u.getCorpwxUserid()!=null&&u.getCorpwxUserid().equals(optional.get().getCorpwxUserid())))).findFirst();
+                        userOp= allUserList.stream().filter(u ->((u.getJobNumber()!=null&&u.getJobNumber().equals(username))||(optional.isPresent()&&((u.getCorpwxUserid()!=null&&u.getCorpwxUserid().equals(optional.get().getCorpwxUserid()))||(u.getCorpwxUserid()!=null&&u.getDingdingUserid().equals(optional.get().getDingdingUserid())))))).findFirst();
                     }else {
                         userOp= allUserList.stream().filter(u -> u.getName().equals(username)||(u.getJobNumber()!=null&&u.getJobNumber().equals(username))).findFirst();
                     }

+ 229 - 68
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java

@@ -3,6 +3,7 @@ package com.management.platform.service.impl;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
+import com.aliyun.dingtalkcontact_1_0.models.SearchUserResponse;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -242,6 +243,8 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
     private HolidaySettingService holidaySettingService;
     @Resource
     private CompanyDingdingMapper companyDingdingMapper;
+    @Resource
+    private CompanyDingdingService companyDingdingService;
 
     @Value(value = "${upload.path}")
     private String path;
@@ -1577,6 +1580,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                 finalDeptIds = deptIds;
             }
             List<Map<String, Object>> membList = projectMapper.getProjectCost(companyId,startDate, endDate, curProjectId,stateKey, userIdList,finalDeptIds,filterDeptIds, true);
+            CompanyDingding dingding = companyDingdingMapper.selectOne(new LambdaQueryWrapper<CompanyDingding>().eq(CompanyDingding::getCompanyId, companyId));
             map.put("membList", membList);
             for (Map<String, Object> membMap : membList) {
                 double pTotalTime = 0;
@@ -1602,6 +1606,13 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                     }else {
                         membRowData.add((String)("$departmentName="+membMap.get("corpwxDeptId")+"$"));
                     }
+                }else if(dingding!=null&&dingding.getContactNeedTranslate()==1){
+                    membRowData.add((String)("$userName="+membMap.get("name")+"$"));
+                    if(membMap.get("departmentName").equals("未分配")){
+                        membRowData.add("未分配");
+                    }else {
+                        membRowData.add((String)("$departmentName="+membMap.get("corpDdDeptId")+"$"));
+                    }
                 }else {
                     membRowData.add((String)membMap.get("name"));
                     membRowData.add((String)membMap.get("departmentName"));
@@ -1904,12 +1915,17 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                                     membRowData.add("未分配");
                                 }else {
                                     membRowData.add(departmentService.exportWxDepartment(dept,allDepartmentList));
-//                                    membRowData.add((String)("$departmentName="+membMap.get("corpwxDeptId")+"$"));
+                                }
+                            }else if(dingding!=null&&dingding.getContactNeedTranslate()==1){
+                                membRowData.add((String)("$userName="+membMap.get("name")+"$"));
+                                if(membMap.get("departmentName").equals("未分配")){
+                                    membRowData.add("未分配");
+                                }else {
+                                    membRowData.add(departmentService.exportDdDepartment(dept,allDepartmentList));
                                 }
                             }else {
                                 membRowData.add((String)membMap.get("name"));
                                 membRowData.add(departmentService.getSupDepartment(dept,allDepartmentList));
-//                                membRowData.add((String)membMap.get("departmentName"));
                             }
                             String creatorId = (String)membMap.get("creatorId");
                             User us = userList.stream().filter(u->u.getId().equals(creatorId)).findFirst().get();
@@ -2064,6 +2080,13 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                         }else {
                             membRowData.add("");
                         }
+                    }else if(dingding!=null&&dingding.getContactNeedTranslate()==1){
+                        membRowData.add((String)("$userName="+user.getName()+"$"));
+                        if(first.isPresent()){
+                            membRowData.add((String)("$departmentName="+first.get().getDdDeptid()+"$"));
+                        }else {
+                            membRowData.add("");
+                        }
                     }else {
                         membRowData.add(user.getName());
                         if(first.isPresent()){
@@ -2772,6 +2795,8 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                 User incharger = first.get();
                 if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                     data.add("$userName="+incharger.getCorpwxUserid()+"$");
+                }if(dingding!=null&&dingding.getContactNeedTranslate()==1){
+                    data.add("$userName="+incharger.getDingdingUserid()+"$");
                 }else {
                     data.add(incharger.getName());
                 }
@@ -2921,7 +2946,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                 data.add(task.get("group_real_hours") == null?"":task.get("group_real_hours").toString());
             }
             data.add(task.get("name") != null?task.get("name").toString():"");
-            if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+            if((wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1)||(dingding!=null&&dingding.getContactNeedTranslate()==1)){
                 String userName = "";
                 if(task.get("executor_id") != null){
                     String[] executorIds = task.get("executor_id").toString().split(",");
@@ -2929,7 +2954,11 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                         String executorId = executorIds[i];
                         Optional<User> first = userList.stream().filter(ul -> ul.getId().equals(executorId)).findFirst();
                         if(first.isPresent()){
-                            userName += "$userName="+(first.get().getCorpwxUserid() == null?"":first.get().getCorpwxUserid())+"$";
+                            if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                                userName += "$userName="+(first.get().getCorpwxUserid() == null?"":first.get().getCorpwxUserid())+"$";
+                            }else if(dingding!=null&&dingding.getContactNeedTranslate()==1){
+                                userName += "$userName="+(first.get().getDingdingUserid() == null?"":first.get().getDingdingUserid())+"$";
+                            }
                             if (i < executorIds.length - 1){
                                 userName += ",";
                             }
@@ -4179,6 +4208,10 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                     rowData.add("$userName="+(map.get("corpwxUserId")==null?"":map.get("corpwxUserId"))+"$");
                     rowData.add(String.valueOf(StringUtils.isEmpty(map.get("jobNumber"))?"":map.get("jobNumber")));
                     rowData.add("$departmentName="+(map.get("corpwxDeptId")==null?"":map.get("corpwxDeptId"))+"$");
+                }else if(dingding!=null&&dingding.getContactNeedTranslate()==1){
+                    rowData.add("$userName="+(String)map.get("username")+"$");
+                    rowData.add(String.valueOf(StringUtils.isEmpty(map.get("jobNumber"))?"":map.get("jobNumber")));
+                    rowData.add("$departmentName="+rowData.add((String)map.get("departmentName"))+"$");
                 }else {
                     rowData.add((String)map.get("username"));
                     rowData.add(String.valueOf(StringUtils.isEmpty(map.get("jobNumber"))?"":map.get("jobNumber")));
@@ -4321,6 +4354,8 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                 rowData.add(""+seq);
                 if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                     rowData.add("$userName="+(map.get("corpwxUserId")==null?"":map.get("corpwxUserId"))+"$");
+                }else if(dingding!=null&&dingding.getContactNeedTranslate()==1){
+                    rowData.add("$userName="+(String)map.get("username")+"$");
                 }else {
                     rowData.add((String)map.get("username"));
                 }
@@ -4376,6 +4411,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         User user = userMapper.selectById(userId);
         TimeType timeType = timeTypeMapper.selectById(user.getCompanyId());
         WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id",user.getCompanyId()));
+        CompanyDingding dingding = companyDingdingService.getOne(new LambdaQueryWrapper<CompanyDingding>().eq(CompanyDingding::getCompanyId, user.getCompanyId()));
         List<Department> allDeptList = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id", user.getCompanyId()));
         //然后处理文件
         String fileName = multipartFile.getOriginalFilename();
@@ -4476,16 +4512,35 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                         userNameList.add(inchargerName);
                     }
                 }
+                List<User> targetUserList=new ArrayList<>();
                 HttpRespMsg respMsg=new HttpRespMsg();
                 if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1&&userNameList.size()>0){
-                    System.out.println("参与搜素的人员列表"+userNameList + userNameList.size());
+                    System.out.println("企业微信参与搜素的人员列表"+userNameList + userNameList.size());
                     respMsg = wxCorpInfoService.getBatchSearchUserInfo(wxCorpInfo, userNameList,null);
                     if(respMsg.code.equals("0")){
                         msg.setError("姓名为["+String.valueOf(respMsg.data)+"]的人员存在重复,请使用工号!");
                         return msg;
                     }
+                    targetUserList= (List<User>) respMsg.data;
+                }
+                if(dingding!=null&&dingding.getContactNeedTranslate()==1&&userNameList.size()>0){
+                    System.out.println("钉钉参与搜素的人员列表"+userNameList + userNameList.size());
+                    for (String name : userNameList) {
+                        respMsg= companyDingdingService.getSearchUserInfo(dingding,name,1);
+                        SearchUserResponse searchUserResponse = (SearchUserResponse) respMsg.data;
+                        if(searchUserResponse.body.totalCount>1){
+                            msg.setError("姓名为["+name+"]的人员存在重复,请使用工号!");
+                            return msg;
+                        }
+                        if(searchUserResponse.body.list.size()>0){
+                            User item=new User();
+                            //为了修改代码 此处用企业微信同一个字段 setCorpwxUserid
+                            item.setName(name);
+                            item.setCorpwxUserid(searchUserResponse.body.list.get(0));
+                            targetUserList.add(item);
+                        }
+                    }
                 }
-                List<User> targetUserList= (List<User>) respMsg.data;
                 int importCount = 0;
                 for (int rowIndex = 0; rowIndex <= rowNum; rowIndex++) {
                     XSSFRow row = sheet.getRow(rowIndex);
@@ -4629,17 +4684,17 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                             Optional<User> first;
                             Integer exception=null;
                             if(split.length==1){
-                                if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                                if((wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1)||(dingding!=null&&dingding.getContactNeedTranslate()==1)){
                                     Optional<User> optional = targetUserList.stream().filter(tl -> tl.getName().equals(split[0])).findFirst();
-                                    first= userList.stream().filter(u ->(u.getJobNumber()!=null&&u.getJobNumber().equals(split[0]))||(optional.isPresent()&&u.getCorpwxUserid()!=null&&u.getCorpwxUserid().equals(optional.get().getCorpwxUserid()))).findFirst();
+                                    first= userList.stream().filter(u ->(u.getJobNumber()!=null&&u.getJobNumber().equals(split[0]))||(optional.isPresent()&&((u.getCorpwxUserid()!=null&&u.getCorpwxUserid().equals(optional.get().getCorpwxUserid()))||(u.getDingdingUserid()!=null&&u.getDingdingUserid().equals(optional.get().getCorpwxUserid()))))).findFirst();
                                 }else {
                                     first= userList.stream().filter(u -> u.getName().equals(split[0])||(u.getJobNumber()!=null&&u.getJobNumber().equals(split[0]))).findFirst();
                                 }
                                 exception=0;
                             }else {
-                                if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                                if((wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1)||(dingding!=null&&dingding.getContactNeedTranslate()==1)){
                                     Optional<User> optional = targetUserList.stream().filter(tl -> tl.getName().equals(split[1])).findFirst();
-                                    first= userList.stream().filter(u ->(u.getJobNumber()!=null&&u.getJobNumber().equals(split[1]))||(optional.isPresent()&&u.getCorpwxUserid()!=null&&u.getCorpwxUserid().equals(optional.get().getCorpwxUserid()))).findFirst();
+                                    first= userList.stream().filter(u ->(u.getJobNumber()!=null&&u.getJobNumber().equals(split[1]))||(optional.isPresent()&&((u.getCorpwxUserid()!=null&&u.getCorpwxUserid().equals(optional.get().getCorpwxUserid()))||(u.getDingdingUserid()!=null&&u.getDingdingUserid().equals(optional.get().getCorpwxUserid()))))).findFirst();
                                     exception=1;
                                 }else {
                                     first= userList.stream().filter(u -> u.getName().equals(split[1])&&(u.getJobNumber()!=null&&u.getJobNumber().equals(split[1]))).findFirst();
@@ -4779,17 +4834,17 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                             Optional<User> first;
                             Integer exception=null;
                             if(split.length==1){
-                                if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                                if((wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1)||(dingding!=null&&dingding.getContactNeedTranslate()==1)){
                                     Optional<User> optional = targetUserList.stream().filter(tl -> tl.getName().equals(split[0])).findFirst();
-                                    first= userList.stream().filter(u ->(u.getJobNumber()!=null&&u.getJobNumber().equals(split[0]))||(optional.isPresent()&&u.getCorpwxUserid()!=null&&u.getCorpwxUserid().equals(optional.get().getCorpwxUserid()))).findFirst();
+                                    first= userList.stream().filter(u ->(u.getJobNumber()!=null&&u.getJobNumber().equals(split[0]))||(optional.isPresent()&&((u.getCorpwxUserid()!=null&&u.getCorpwxUserid().equals(optional.get().getCorpwxUserid()))||(u.getDingdingUserid()!=null&&u.getDingdingUserid().equals(optional.get().getCorpwxUserid()))))).findFirst();
                                 }else {
                                     first= userList.stream().filter(u -> u.getName().equals(split[0])||(u.getJobNumber()!=null&&u.getJobNumber().equals(split[0]))).findFirst();
                                 }
                                 exception=0;
                             }else {
-                                if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                                if((wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1)||(dingding!=null&&dingding.getContactNeedTranslate()==1)){
                                     Optional<User> optional = targetUserList.stream().filter(tl -> tl.getName().equals(split[1])).findFirst();
-                                    first= userList.stream().filter(u ->(u.getJobNumber()!=null&&u.getJobNumber().equals(split[1]))||(optional.isPresent()&&u.getCorpwxUserid()!=null&&u.getCorpwxUserid().equals(optional.get().getCorpwxUserid()))).findFirst();
+                                    first= userList.stream().filter(u ->(u.getJobNumber()!=null&&u.getJobNumber().equals(split[1]))||(optional.isPresent()&&((u.getCorpwxUserid()!=null&&u.getCorpwxUserid().equals(optional.get().getCorpwxUserid()))||(u.getDingdingUserid()!=null&&u.getDingdingUserid().equals(optional.get().getCorpwxUserid()))))).findFirst();
                                     exception=1;
                                 }else {
                                     first= userList.stream().filter(u -> u.getName().equals(split[1])&&(u.getJobNumber()!=null&&u.getJobNumber().equals(split[1]))).findFirst();
@@ -4826,17 +4881,17 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                                 Optional<User> first;
                                 Integer exception=null;
                                 if(split.length==1){
-                                    if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                                    if((wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1)||(dingding!=null&&dingding.getContactNeedTranslate()==1)){
                                         Optional<User> optional = targetUserList.stream().filter(tl -> tl.getName().equals(split[0])).findFirst();
-                                        first= userList.stream().filter(u ->(u.getJobNumber()!=null&&u.getJobNumber().equals(split[0]))||(optional.isPresent()&&u.getCorpwxUserid()!=null&&u.getCorpwxUserid().equals(optional.get().getCorpwxUserid()))).findFirst();
+                                        first= userList.stream().filter(u ->(u.getJobNumber()!=null&&u.getJobNumber().equals(split[0]))||(optional.isPresent()&&((u.getCorpwxUserid()!=null&&u.getCorpwxUserid().equals(optional.get().getCorpwxUserid()))||(u.getDingdingUserid()!=null&&u.getDingdingUserid().equals(optional.get().getCorpwxUserid()))))).findFirst();
                                     }else {
                                         first= userList.stream().filter(u -> u.getName().equals(split[0])||(u.getJobNumber()!=null&&u.getJobNumber().equals(split[0]))).findFirst();
                                     }
                                     exception=0;
                                 }else {
-                                    if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                                    if((wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1)||(dingding!=null&&dingding.getContactNeedTranslate()==1)){
                                         Optional<User> optional = targetUserList.stream().filter(tl -> tl.getName().equals(split[1])).findFirst();
-                                        first= userList.stream().filter(u ->(u.getJobNumber()!=null&&u.getJobNumber().equals(split[1]))||(optional.isPresent()&&u.getCorpwxUserid()!=null&&u.getCorpwxUserid().equals(optional.get().getCorpwxUserid()))).findFirst();
+                                        first= userList.stream().filter(u ->(u.getJobNumber()!=null&&u.getJobNumber().equals(split[1]))||(optional.isPresent()&&((u.getCorpwxUserid()!=null&&u.getCorpwxUserid().equals(optional.get().getCorpwxUserid()))||(u.getDingdingUserid()!=null&&u.getDingdingUserid().equals(optional.get().getCorpwxUserid()))))).findFirst();
                                         exception=1;
                                     }else {
                                         first= userList.stream().filter(u -> u.getName().equals(split[1])&&(u.getJobNumber()!=null&&u.getJobNumber().equals(split[1]))).findFirst();
@@ -4893,17 +4948,17 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                                 Optional<User> first;
                                 Integer exception=null;
                                 if(split.length==1){
-                                    if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                                    if((wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1)||(dingding!=null&&dingding.getContactNeedTranslate()==1)){
                                         Optional<User> optional = targetUserList.stream().filter(tl -> tl.getName().equals(split[0])).findFirst();
-                                        first= userList.stream().filter(u ->(u.getJobNumber()!=null&&u.getJobNumber().equals(split[0]))||(optional.isPresent()&&u.getCorpwxUserid()!=null&&u.getCorpwxUserid().equals(optional.get().getCorpwxUserid()))).findFirst();
+                                        first= userList.stream().filter(u ->(u.getJobNumber()!=null&&u.getJobNumber().equals(split[0]))||(optional.isPresent()&&((u.getCorpwxUserid()!=null&&u.getCorpwxUserid().equals(optional.get().getCorpwxUserid()))||(u.getDingdingUserid()!=null&&u.getDingdingUserid().equals(optional.get().getCorpwxUserid()))))).findFirst();
                                     }else {
                                         first= userList.stream().filter(u -> u.getName().equals(split[0])||(u.getJobNumber()!=null&&u.getJobNumber().equals(split[0]))).findFirst();
                                     }
                                     exception=0;
                                 }else {
-                                    if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                                    if((wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1)||(dingding!=null&&dingding.getContactNeedTranslate()==1)){
                                         Optional<User> optional = targetUserList.stream().filter(tl -> tl.getName().equals(split[1])).findFirst();
-                                        first= userList.stream().filter(u ->(u.getJobNumber()!=null&&u.getJobNumber().equals(split[1]))||(optional.isPresent()&&u.getCorpwxUserid()!=null&&u.getCorpwxUserid().equals(optional.get().getCorpwxUserid()))).findFirst();
+                                        first= userList.stream().filter(u ->(u.getJobNumber()!=null&&u.getJobNumber().equals(split[1]))||(optional.isPresent()&&((u.getCorpwxUserid()!=null&&u.getCorpwxUserid().equals(optional.get().getCorpwxUserid()))||(u.getDingdingUserid()!=null&&u.getDingdingUserid().equals(optional.get().getCorpwxUserid()))))).findFirst();
                                         exception=1;
                                     }else {
                                         first= userList.stream().filter(u -> u.getName().equals(split[1])&&(u.getJobNumber()!=null&&u.getJobNumber().equals(split[1]))).findFirst();
@@ -4960,17 +5015,17 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                                 Optional<User> first;
                                 Integer exception=null;
                                 if(split.length==1){
-                                    if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                                    if((wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1)||(dingding!=null&&dingding.getContactNeedTranslate()==1)){
                                         Optional<User> optional = targetUserList.stream().filter(tl -> tl.getName().equals(split[0])).findFirst();
-                                        first= userList.stream().filter(u ->(u.getJobNumber()!=null&&u.getJobNumber().equals(split[0]))||(optional.isPresent()&&u.getCorpwxUserid()!=null&&u.getCorpwxUserid().equals(optional.get().getCorpwxUserid()))).findFirst();
+                                        first= userList.stream().filter(u ->(u.getJobNumber()!=null&&u.getJobNumber().equals(split[0]))||(optional.isPresent()&&((u.getCorpwxUserid()!=null&&u.getCorpwxUserid().equals(optional.get().getCorpwxUserid()))||(u.getDingdingUserid()!=null&&u.getDingdingUserid().equals(optional.get().getCorpwxUserid()))))).findFirst();
                                     }else {
                                         first= userList.stream().filter(u -> u.getName().equals(split[0])||(u.getJobNumber()!=null&&u.getJobNumber().equals(split[0]))).findFirst();
                                     }
                                     exception=0;
                                 }else {
-                                    if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                                    if((wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1)||(dingding!=null&&dingding.getContactNeedTranslate()==1)){
                                         Optional<User> optional = targetUserList.stream().filter(tl -> tl.getName().equals(split[1])).findFirst();
-                                        first= userList.stream().filter(u ->(u.getJobNumber()!=null&&u.getJobNumber().equals(split[1]))||(optional.isPresent()&&u.getCorpwxUserid()!=null&&u.getCorpwxUserid().equals(optional.get().getCorpwxUserid()))).findFirst();
+                                        first= userList.stream().filter(u ->(u.getJobNumber()!=null&&u.getJobNumber().equals(split[1]))||(optional.isPresent()&&((u.getCorpwxUserid()!=null&&u.getCorpwxUserid().equals(optional.get().getCorpwxUserid()))||(u.getDingdingUserid()!=null&&u.getDingdingUserid().equals(optional.get().getCorpwxUserid()))))).findFirst();
                                         exception=1;
                                     }else {
                                         first= userList.stream().filter(u -> u.getName().equals(split[1])&&(u.getJobNumber()!=null&&u.getJobNumber().equals(split[1]))).findFirst();
@@ -5110,17 +5165,35 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                         userNameList.add(inchargerName);
                     }
                 }
-                System.out.println("参与搜素的人员列表"+userNameList + userNameList.size());
+                List<User> targetUserList=new ArrayList<>();
                 HttpRespMsg respMsg=new HttpRespMsg();
                 if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1&&userNameList.size()>0){
+                    System.out.println("参与搜素的人员列表"+userNameList + userNameList.size());
                     respMsg = wxCorpInfoService.getBatchSearchUserInfo(wxCorpInfo, userNameList,null);
                     if(respMsg.code.equals("0")){
                         msg.setError("姓名为["+String.valueOf(respMsg.data)+"]的人员存在重复,请使用工号!");
                         return msg;
                     }
+                    targetUserList= (List<User>) respMsg.data;
+                }
+                if(dingding!=null&&dingding.getContactNeedTranslate()==1&&userNameList.size()>0){
+                    System.out.println("参与搜素的人员列表"+userNameList + userNameList.size());
+                    for (String name : userNameList) {
+                        respMsg= companyDingdingService.getSearchUserInfo(dingding,name,1);
+                        SearchUserResponse searchUserResponse = (SearchUserResponse) respMsg.data;
+                        if(searchUserResponse.body.totalCount>1){
+                            msg.setError("姓名为["+name+"]的人员存在重复,请使用工号!");
+                            return msg;
+                        }
+                        if(searchUserResponse.body.list.size()>0){
+                            User item=new User();
+                            //为了修改代码 此处用企业微信同一个字段 setCorpwxUserid
+                            item.setName(name);
+                            item.setCorpwxUserid(searchUserResponse.body.list.get(0));
+                            targetUserList.add(item);
+                        }
+                    }
                 }
-                List<User> targetUserList= (List<User>) respMsg.data;
-                System.out.println(targetUserList);
                 List<String> existCodeList = new ArrayList<>();
                 int importCount = 0;
                 for (int rowIndex = 0; rowIndex <= rowNum; rowIndex++) {
@@ -5416,17 +5489,17 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                             Optional<User> first;
                             Integer exception=null;
                             if(split.length==1){
-                                if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                                if((wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1)||(dingding!=null&&dingding.getContactNeedTranslate()==1)){
                                     Optional<User> optional = targetUserList.stream().filter(tl -> tl.getName().equals(split[0])).findFirst();
-                                    first= userList.stream().filter(u ->(u.getJobNumber()!=null&&u.getJobNumber().equals(split[0]))||(optional.isPresent()&&u.getCorpwxUserid()!=null&&u.getCorpwxUserid().equals(optional.get().getCorpwxUserid()))).findFirst();
+                                    first= userList.stream().filter(u ->(u.getJobNumber()!=null&&u.getJobNumber().equals(split[0]))||(optional.isPresent()&&((u.getCorpwxUserid()!=null&&u.getCorpwxUserid().equals(optional.get().getCorpwxUserid()))||(u.getDingdingUserid()!=null&&u.getDingdingUserid().equals(optional.get().getCorpwxUserid()))))).findFirst();
                                 }else {
                                     first= userList.stream().filter(u -> u.getName().equals(split[0])||(u.getJobNumber()!=null&&u.getJobNumber().equals(split[0]))).findFirst();
                                 }
                                 exception=0;
                             }else {
-                                if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                                if((wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1)||(dingding!=null&&dingding.getContactNeedTranslate()==1)){
                                     Optional<User> optional = targetUserList.stream().filter(tl -> tl.getName().equals(split[1])).findFirst();
-                                    first= userList.stream().filter(u ->(u.getJobNumber()!=null&&u.getJobNumber().equals(split[1]))||(optional.isPresent()&&u.getCorpwxUserid()!=null&&u.getCorpwxUserid().equals(optional.get().getCorpwxUserid()))).findFirst();
+                                    first= userList.stream().filter(u ->(u.getJobNumber()!=null&&u.getJobNumber().equals(split[1]))||(optional.isPresent()&&((u.getCorpwxUserid()!=null&&u.getCorpwxUserid().equals(optional.get().getCorpwxUserid()))||(u.getDingdingUserid()!=null&&u.getDingdingUserid().equals(optional.get().getCorpwxUserid()))))).findFirst();
                                     exception=1;
                                 }else {
                                     first= userList.stream().filter(u -> u.getName().equals(split[0])&&(u.getJobNumber()!=null&&u.getJobNumber().equals(split[1]))).findFirst();
@@ -6018,17 +6091,17 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                         Optional<User> first;
                         Integer exception=null;
                         if(split.length==1){
-                            if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                            if((wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1)||(dingding!=null&&dingding.getContactNeedTranslate()==1)){
                                 Optional<User> optional = targetUserList.stream().filter(tl -> tl.getName().equals(split[0])).findFirst();
-                                first= userList.stream().filter(u ->(u.getJobNumber()!=null&&u.getJobNumber().equals(split[0]))||(optional.isPresent()&&u.getCorpwxUserid()!=null&&u.getCorpwxUserid().equals(optional.get().getCorpwxUserid()))).findFirst();
+                                first= userList.stream().filter(u ->(u.getJobNumber()!=null&&u.getJobNumber().equals(split[0]))||(optional.isPresent()&&((u.getCorpwxUserid()!=null&&u.getCorpwxUserid().equals(optional.get().getCorpwxUserid()))||(u.getDingdingUserid()!=null&&u.getDingdingUserid().equals(optional.get().getCorpwxUserid()))))).findFirst();
                             }else {
                                 first= userList.stream().filter(u -> u.getName().equals(split[0])||(u.getJobNumber()!=null&&u.getJobNumber().equals(split[0]))).findFirst();
                             }
                             exception=0;
                         }else {
-                            if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                            if((wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1)||(dingding!=null&&dingding.getContactNeedTranslate()==1)){
                                 Optional<User> optional = targetUserList.stream().filter(tl -> tl.getName().equals(split[1])).findFirst();
-                                first= userList.stream().filter(u ->(u.getJobNumber()!=null&&u.getJobNumber().equals(split[1]))||(optional.isPresent()&&u.getCorpwxUserid()!=null&&u.getCorpwxUserid().equals(optional.get().getCorpwxUserid()))).findFirst();
+                                first= userList.stream().filter(u ->(u.getJobNumber()!=null&&u.getJobNumber().equals(split[1]))||(optional.isPresent()&&((u.getCorpwxUserid()!=null&&u.getCorpwxUserid().equals(optional.get().getCorpwxUserid()))||(u.getDingdingUserid()!=null&&u.getDingdingUserid().equals(optional.get().getCorpwxUserid()))))).findFirst();
                                 exception=1;
                             }else {
                                 first= userList.stream().filter(u -> u.getName().equals(split[1])&&(u.getJobNumber()!=null&&u.getJobNumber().equals(split[1]))).findFirst();
@@ -6063,17 +6136,17 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                                 Optional<User> first;
                                 Integer exception=null;
                                 if(split.length==1){
-                                    if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                                    if((wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1)||(dingding!=null&&dingding.getContactNeedTranslate()==1)){
                                         Optional<User> optional = targetUserList.stream().filter(tl -> tl.getName().equals(split[0])).findFirst();
-                                        first= userList.stream().filter(u ->(u.getJobNumber()!=null&&u.getJobNumber().equals(split[0]))||(optional.isPresent()&&u.getCorpwxUserid()!=null&&u.getCorpwxUserid().equals(optional.get().getCorpwxUserid()))).findFirst();
+                                        first= userList.stream().filter(u ->(u.getJobNumber()!=null&&u.getJobNumber().equals(split[0]))||(optional.isPresent()&&((u.getCorpwxUserid()!=null&&u.getCorpwxUserid().equals(optional.get().getCorpwxUserid()))||(u.getDingdingUserid()!=null&&u.getDingdingUserid().equals(optional.get().getCorpwxUserid()))))).findFirst();
                                     }else {
                                         first= userList.stream().filter(u -> u.getName().equals(split[0])||(u.getJobNumber()!=null&&u.getJobNumber().equals(split[0]))).findFirst();
                                     }
                                     exception=0;
                                 }else {
-                                    if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                                    if((wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1)||(dingding!=null&&dingding.getContactNeedTranslate()==1)){
                                         Optional<User> optional = targetUserList.stream().filter(tl -> tl.getName().equals(split[1])).findFirst();
-                                        first= userList.stream().filter(u ->(u.getJobNumber()!=null&&u.getJobNumber().equals(split[1]))||(optional.isPresent()&&u.getCorpwxUserid()!=null&&u.getCorpwxUserid().equals(optional.get().getCorpwxUserid()))).findFirst();
+                                        first= userList.stream().filter(u ->(u.getJobNumber()!=null&&u.getJobNumber().equals(split[1]))||(optional.isPresent()&&((u.getCorpwxUserid()!=null&&u.getCorpwxUserid().equals(optional.get().getCorpwxUserid()))||(u.getDingdingUserid()!=null&&u.getDingdingUserid().equals(optional.get().getCorpwxUserid()))))).findFirst();
                                         exception=1;
                                     }else {
                                         first= userList.stream().filter(u -> u.getName().equals(split[1])&&(u.getJobNumber()!=null&&u.getJobNumber().equals(split[1]))).findFirst();
@@ -6130,17 +6203,17 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                                 Optional<User> first;
                                 Integer exception=null;
                                 if(split.length==1){
-                                    if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                                    if((wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1)||(dingding!=null&&dingding.getContactNeedTranslate()==1)){
                                         Optional<User> optional = targetUserList.stream().filter(tl -> tl.getName().equals(split[0])).findFirst();
-                                        first= userList.stream().filter(u ->(u.getJobNumber()!=null&&u.getJobNumber().equals(split[0]))||(optional.isPresent()&&u.getCorpwxUserid()!=null&&u.getCorpwxUserid().equals(optional.get().getCorpwxUserid()))).findFirst();
+                                        first= userList.stream().filter(u ->(u.getJobNumber()!=null&&u.getJobNumber().equals(split[0]))||(optional.isPresent()&&((u.getCorpwxUserid()!=null&&u.getCorpwxUserid().equals(optional.get().getCorpwxUserid()))||(u.getDingdingUserid()!=null&&u.getDingdingUserid().equals(optional.get().getCorpwxUserid()))))).findFirst();
                                     }else {
                                         first= userList.stream().filter(u -> u.getName().equals(split[0])||(u.getJobNumber()!=null&&u.getJobNumber().equals(split[0]))).findFirst();
                                     }
                                     exception=0;
                                 }else {
-                                    if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                                    if((wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1)||(dingding!=null&&dingding.getContactNeedTranslate()==1)){
                                         Optional<User> optional = targetUserList.stream().filter(tl -> tl.getName().equals(split[1])).findFirst();
-                                        first= userList.stream().filter(u ->(u.getJobNumber()!=null&&u.getJobNumber().equals(split[1]))||(optional.isPresent()&&u.getCorpwxUserid()!=null&&u.getCorpwxUserid().equals(optional.get().getCorpwxUserid()))).findFirst();
+                                        first= userList.stream().filter(u ->(u.getJobNumber()!=null&&u.getJobNumber().equals(split[1]))||(optional.isPresent()&&((u.getCorpwxUserid()!=null&&u.getCorpwxUserid().equals(optional.get().getCorpwxUserid()))||(u.getDingdingUserid()!=null&&u.getDingdingUserid().equals(optional.get().getCorpwxUserid()))))).findFirst();
                                         exception=1;
                                     }else {
                                         first= userList.stream().filter(u -> u.getName().equals(split[1])&&(u.getJobNumber()!=null&&u.getJobNumber().equals(split[1]))).findFirst();
@@ -6198,17 +6271,17 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                                 Optional<User> first;
                                 Integer exception=null;
                                 if(split.length==1){
-                                    if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                                    if((wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1)||(dingding!=null&&dingding.getContactNeedTranslate()==1)){
                                         Optional<User> optional = targetUserList.stream().filter(tl -> tl.getName().equals(split[0])).findFirst();
-                                        first= userList.stream().filter(u ->(u.getJobNumber()!=null&&u.getJobNumber().equals(split[0]))||(optional.isPresent()&&u.getCorpwxUserid()!=null&&u.getCorpwxUserid().equals(optional.get().getCorpwxUserid()))).findFirst();
+                                        first= userList.stream().filter(u ->(u.getJobNumber()!=null&&u.getJobNumber().equals(split[0]))||(optional.isPresent()&&((u.getCorpwxUserid()!=null&&u.getCorpwxUserid().equals(optional.get().getCorpwxUserid()))||(u.getDingdingUserid()!=null&&u.getDingdingUserid().equals(optional.get().getCorpwxUserid()))))).findFirst();
                                     }else {
                                         first= userList.stream().filter(u -> u.getName().equals(split[0])||(u.getJobNumber()!=null&&u.getJobNumber().equals(split[0]))).findFirst();
                                     }
                                     exception=0;
                                 }else {
-                                    if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                                    if((wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1)||(dingding!=null&&dingding.getContactNeedTranslate()==1)){
                                         Optional<User> optional = targetUserList.stream().filter(tl -> tl.getName().equals(split[1])).findFirst();
-                                        first= userList.stream().filter(u ->(u.getJobNumber()!=null&&u.getJobNumber().equals(split[1]))||(optional.isPresent()&&u.getCorpwxUserid()!=null&&u.getCorpwxUserid().equals(optional.get().getCorpwxUserid()))).findFirst();
+                                        first= userList.stream().filter(u ->(u.getJobNumber()!=null&&u.getJobNumber().equals(split[1]))||(optional.isPresent()&&((u.getCorpwxUserid()!=null&&u.getCorpwxUserid().equals(optional.get().getCorpwxUserid()))||(u.getDingdingUserid()!=null&&u.getDingdingUserid().equals(optional.get().getCorpwxUserid()))))).findFirst();
                                         exception=1;
                                     }else {
                                         first= userList.stream().filter(u -> u.getName().equals(split[1])&&(u.getJobNumber()!=null&&u.getJobNumber().equals(split[1]))).findFirst();
@@ -6408,7 +6481,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         List<ProjectCustom> projectCustomList = projectCustomMapper.selectList(new QueryWrapper<ProjectCustom>().eq("company_id", company.getId()));
         List<ProjectCustom> customList = projectCustomList.stream().filter(pl -> pl.getCustomType() != 1).collect(Collectors.toList());
         TimeType timeType = timeTypeMapper.selectById(user.getCompanyId());
-        List<User> userList = userMapper.selectList(new QueryWrapper<User>().select("id, name, corpwx_userid").eq("company_id", company.getId()));
+        List<User> userList = userMapper.selectList(new QueryWrapper<User>().select("id, name, corpwx_userid,dingding_userid").eq("company_id", company.getId()));
         List<String> headList = new ArrayList<String>();
 //        headList.add("项目编号");
 //        headList.add("项目分类");
@@ -6528,10 +6601,14 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
             //rowData.add(("1".equals(projectVO.getIsPublic())?"是":"否"));
             rowData.add(("1".equals(projectVO.getIsPublic())?MessageUtils.message("excel.yes"):MessageUtils.message("excel.no")));
             rowData.add(projectVO.getProjectName());
-            if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+            if((wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1)||(dingding!=null&&dingding.getContactNeedTranslate()==1)){
                 if(projectVO.getInchargerId()!=null){
                     User us = userList.stream().filter(ul -> ul.getId().equals(projectVO.getInchargerId())).findFirst().get();
-                    rowData.add("$userName="+us.getCorpwxUserid()+"$");
+                    if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                        rowData.add("$userName="+us.getCorpwxUserid()+"$");
+                    }else if(dingding!=null&&dingding.getContactNeedTranslate()==1){
+                        rowData.add("$userName="+us.getDingdingUserid()+"$");
+                    }
                 }else {
                     rowData.add("");
                 }
@@ -6547,6 +6624,12 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                     }else {
                         names+="$userName="+(participator.get(i).getCorpwxUserId())+"$"+",";
                     }
+                }else if(dingding!=null&&dingding.getContactNeedTranslate()==1){
+                    if(i==participator.size()-1){
+                        names+="$userName="+(participator.get(i).getName())+"$";
+                    }else {
+                        names+="$userName="+(participator.get(i).getName())+"$"+",";
+                    }
                 }else {
                     if(i==participator.size()-1){
                         names+=participator.get(i).getName();
@@ -6560,10 +6643,14 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
             rowData.add(start==null?"":sdf.format(start));
             LocalDate end = projectVO.getPlanEndDate();
             rowData.add(end==null?"":sdf.format(end));
-            if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+            if((wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1)||(dingding!=null&&dingding.getContactNeedTranslate()==1)){
                 Optional<User> first = userList.stream().filter(ul -> ul.getId().equals(projectVO.getCreatorId())).findFirst();
                 if(first.isPresent()){
-                    rowData.add("$userName="+(first.get().getCorpwxUserid()==null?"":first.get().getCorpwxUserid())+"$");
+                    if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                        rowData.add("$userName="+(first.get().getCorpwxUserid()==null?"":first.get().getCorpwxUserid())+"$");
+                    }else if(dingding!=null&&dingding.getContactNeedTranslate()==1){
+                        rowData.add(first.get().getDingdingUserid()==null?"":"$userName="+(first.get().getDingdingUserid())+"$");
+                    }
                 }else {
                     rowData.add("");
                 }
@@ -6720,7 +6807,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", user.getCompanyId()));
         CompanyDingding dingding = companyDingdingMapper.selectOne(new QueryWrapper<CompanyDingding>().eq("company_id", user.getCompanyId()));
         //获取全部用户
-        List<User> userList = userMapper.selectList(new QueryWrapper<User>().select("id, name, corpwx_userid").eq("company_id", user.getCompanyId()));
+        List<User> userList = userMapper.selectList(new QueryWrapper<User>().select("id, name, corpwx_userid,dingding_userid").eq("company_id", user.getCompanyId()));
         String  projectCategorySub=null;
         if(projectCategorySubId!=null){
             switch (projectCategorySubId){
@@ -6753,12 +6840,16 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
             item.add((String) map.get("projectCode")==null?"":(String)map.get("projectCode"));
             item.add((String) map.get("projectName")==null?"":(String)map.get("projectName"));
             item.add((String) map.get("groupName")==null?"":(String)map.get("groupName"));
-            if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
-                String inchargerId = (String)map.get("inchargerId");
+            String inchargerId = (String)map.get("inchargerId");
+            if((wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1)||(dingding!=null&&dingding.getContactNeedTranslate()==1)){
                 if (inchargerId!=null&&!inchargerId.equals("")) {
                     Optional<User> incharger = userList.stream().filter(u -> u.getId().equals(inchargerId)).findFirst();
                     if(incharger.isPresent()){
-                        item.add("$userName="+incharger.get().getCorpwxUserid()+"$");
+                       if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                           item.add("$userName="+incharger.get().getCorpwxUserid()+"$");
+                       }else if(dingding!=null&&dingding.getContactNeedTranslate()==1) {
+                           item.add("$userName="+incharger.get().getDingdingUserid()+"$");
+                       }
                     }else {
                         item.add("");
                     }
@@ -6770,7 +6861,11 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                     asList.forEach(al->{
                         Optional<User> participator = userList.stream().filter(u -> u.getId().equals(al)).findFirst();
                         if(participator.isPresent()){
-                            thisList.add("$userName="+participator.get().getCorpwxUserid()+"$");
+                            if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                                thisList.add("$userName="+participator.get().getCorpwxUserid()+"$");
+                            }else if(dingding!=null&&dingding.getContactNeedTranslate()==1) {
+                                thisList.add("$userName="+participator.get().getDingdingUserid()+"$");
+                            }
                         }
                     });
                     item.add(thisList.toString().replaceAll("\\[","").replaceAll("]",""));
@@ -6778,7 +6873,6 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                     item.add("");
                 }
             }else {
-                String inchargerId = (String)map.get("inchargerId");
                 if (inchargerId!=null&&!inchargerId.equals("")) {
                     Optional<User> incharger = userList.stream().filter(u -> u.getId().equals(inchargerId)).findFirst();
                     if (incharger.isPresent()) {
@@ -6906,6 +7000,14 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                     }
                     String s = String.valueOf(membMap.get("corpwxDeptId") == null ? "" : membMap.get("corpwxDeptId"));
                     membRowData.add("$departmentName=" + s + "$");
+                }else if(dingding!=null&&dingding.getContactNeedTranslate()==1){
+                    Optional<User> first = userList.stream().filter(ul -> ul.getId().equals(membMap.get("creatorId"))).findFirst();
+                    if(first.isPresent()){
+                        membRowData.add("$userName="+first.get().getDingdingUserid()+"$");
+                    }else {
+                        membRowData.add("");
+                    }
+                    membRowData.add("$departmentName=" + (String)membMap.get("departmentName") + "$");
                 }else {
                     membRowData.add((String)membMap.get("name"));
                     membRowData.add((String)membMap.get("departmentName"));
@@ -7741,6 +7843,8 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                     List<String> membRowData=new ArrayList<>();
                     if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                         membRowData.add("$userName"+(user.getCorpwxUserid()==null?"":user.getCorpwxUserid())+"$");
+                    }else if(dingding!=null&&dingding.getContactNeedTranslate()==1){
+                        membRowData.add("$userName"+(user.getName()==null?"":user.getName())+"$");
                     }else {
                         membRowData.add(user.getName());
                     }
@@ -8089,6 +8193,8 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
             List<String> subList=new ArrayList<>();
             if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                 subList.add("$userName="+(item.get("corpwxUserId")==null?"":item.get("corpwxUserId"))+"$");
+            }if(dingding!=null&&dingding.getContactNeedTranslate()==1){
+                subList.add("$userName="+(item.get("corpDdUserId")==null?"":item.get("corpDdUserId"))+"$");
             }else {
                 subList.add(String.valueOf(item.get("username")));
             }
@@ -8479,12 +8585,16 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
             List<String> item=new ArrayList<>();
             if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                 item.add("$userName="+(timelinessRateVO.getCorpwxUserId()==null?"":timelinessRateVO.getCorpwxUserId())+"$");
+            }else if(dingding!=null&&dingding.getContactNeedTranslate()==1){
+                item.add("$userName="+timelinessRateVO.getUserName()+"$");
             }else {
                 item.add(timelinessRateVO.getUserName());
             }
             item.add(timelinessRateVO.getJobNumber());
             if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                 item.add("$departmentName=" + (timelinessRateVO.getCorpwxDeptId()==null?"":timelinessRateVO.getCorpwxDeptId()) + "$");
+            }else if(dingding!=null&&dingding.getContactNeedTranslate()==1){
+                item.add("$departmentName=" + (timelinessRateVO.getCorpDdDeptId()==null?"":timelinessRateVO.getCorpDdDeptId()) + "$");
             }else {
                 item.add(timelinessRateVO.getDepartmentName());
             }
@@ -8747,6 +8857,10 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                 item.add("$userName="+(map.get("corpwxUserId")==null?"":map.get("corpwxUserId"))+"$");
                 item.add(String.valueOf(StringUtils.isEmpty(map.get("jobNumber"))?"":map.get("jobNumber")));
                 item.add("$departmentName="+(map.get("corpwxDeptId")==null?"":map.get("corpwxDeptId"))+"$");
+            }else if(dingding!=null&&dingding.getContactNeedTranslate()==1){
+                item.add("$userName="+((String) map.get("name"))+"$");
+                item.add(String.valueOf(StringUtils.isEmpty(map.get("jobNumber"))?"":map.get("jobNumber")));
+                item.add("$departmentName="+((String) map.get("departmentName")==null?"":(String) map.get("departmentName"))+"$");
             }else {
                 item.add((String) map.get("name"));
                 item.add(String.valueOf(StringUtils.isEmpty(map.get("jobNumber"))?"":map.get("jobNumber")));
@@ -10227,6 +10341,9 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
             if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                 item.add("$userName=" + map.get("name") +"$");
                 item.add("$departmentName="+(map.get("corpwxDeptId")==null?"":map.get("corpwxDeptId"))+"$");
+            }else if(dingding!=null&&dingding.getContactNeedTranslate()==1){
+                item.add("$userName=" + map.get("name") +"$");
+                item.add("$departmentName="+((String) map.get("departmentName")==null?"":(String) map.get("departmentName"))+"$");
             }else {
                 item.add((String) map.get("name"));
                 item.add((String) map.get("departmentName")==null?"":(String) map.get("departmentName"));
@@ -10525,12 +10642,16 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
             List<String> item=new ArrayList<>();
             if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                 item.add("$userName="+(timelinessRateVO.getCorpwxUserId()==null?"":timelinessRateVO.getCorpwxUserId())+"$");
+            }else if(dingding!=null&&dingding.getContactNeedTranslate()==1){
+                item.add("$userName="+(timelinessRateVO.getUserName())+"$");
             }else {
                 item.add(timelinessRateVO.getUserName());
             }
             item.add(timelinessRateVO.getJobNumber());
             if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                 item.add("$departmentName="+(String.valueOf(timelinessRateVO.getCorpwxDeptId()==null?"":timelinessRateVO.getCorpwxDeptId()))+"$");
+            }else if(dingding!=null&&dingding.getContactNeedTranslate()==1){
+                item.add("$departmentName="+(timelinessRateVO.getDepartmentName())+"$");
             }else {
                 item.add(timelinessRateVO.getDepartmentName());
             }
@@ -11313,6 +11434,8 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
 //                        }else {
 //                            membRowData.add((String)("$departmentName="+membMap.get("corpwxDeptId")+"$"));
 //                        }
+                    }else if(dingding!=null&&dingding.getContactNeedTranslate()==1){
+                        membRowData.add(("$userName="+(String)membMap.get("name")+"$"));
                     }else {
                         membRowData.add((String)membMap.get("name"));
 //                        membRowData.add((String)membMap.get("departmentName"));
@@ -11569,6 +11692,9 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                     if (wxCorpInfo != null && wxCorpInfo.getSaasSyncContact().equals(1)){
                         item.add("$userName="+map.get("wxUserId") + "$");
                         item.add("$departmentName="+map.get("wxdeptId") + "$");
+                    }else if (dingding != null && dingding.getContactNeedTranslate().equals(1)){
+                        item.add("$userName="+map.get("userName") + "$");
+                        item.add("$departmentName="+map.get("departmentName") + "$");
                     }else {
                         item.add(map.get("userName") + "");
                         item.add(map.get("departmentName") + "");
@@ -11593,6 +11719,9 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                 if (wxCorpInfo != null && wxCorpInfo.getSaasSyncContact().equals(1)){
                     item.add("$userName="+maps.get(0).get("wxUserId") + "$");
                     item.add("$departmentName="+maps.get(0).get("wxdeptId") + "$");
+                }else if (dingding != null && dingding.getContactNeedTranslate().equals(1)){
+                    item.add("$userName="+maps.get(0).get("userName") + "$");
+                    item.add("$departmentName="+maps.get(0).get("departmentName") + "$");
                 }else {
                     item.add(maps.get(0).get("userName") + "");
                     item.add(maps.get(0).get("departmentName") + "");
@@ -12333,6 +12462,8 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         for (LaborHourRateVo laborHourRateVo : resultList) {
             if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                 list.add("$departmentName="+laborHourRateVo.getDepartment_name()+"$");
+            }else if(dingding!=null&&dingding.getContactNeedTranslate()==1){
+                list.add("$departmentName="+laborHourRateVo.getDepartment_name()+"$");
             }else {
                 list.add(laborHourRateVo.getDepartment_name());
             }
@@ -12793,8 +12924,16 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
             }
             deptIndex+=maps.size();
             for (int i = 0; i < maps.size(); i++) {
-                list.add("$departmentName="+String.valueOf(maps.get(i).get("corpwxDeptId"))+"$");
-                list.add("$userName="+maps.get(i).get("corpwxUserId")+"$");
+                if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                    list.add("$departmentName="+String.valueOf(maps.get(i).get("corpwxDeptId"))+"$");
+                    list.add("$userName="+maps.get(i).get("corpwxUserId")+"$");
+                }else if(dingding!=null&&dingding.getContactNeedTranslate()==1){
+                    list.add("$departmentName="+String.valueOf(maps.get(i).get("departmentName"))+"$");
+                    list.add("$userName="+String.valueOf(maps.get(i).get("userName"))+"$");
+                }else {
+                    list.add(String.valueOf(maps.get(i).get("departmentName")));
+                    list.add(String.valueOf(maps.get(i).get("userName")));
+                }
                 list.add(String.valueOf(maps.get(i).get("projectName")));
                 list.add(String.valueOf(maps.get(i).get("projectCode")));
                 list.add(String.valueOf(maps.get(i).get("residueTime")));
@@ -12952,6 +13091,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                             Map<String,Object> item=new HashMap<>();
                             item.put("projectId",project.getId());
                             item.put("projectName",project.getProjectName());
+                            item.put("projectCode",project.getProjectCode());
                             item.put("groupName",groupName);
                             item.put("corpwxDeptId",corpwxDeptid);
                             item.put("department_name",departmentName);
@@ -13006,6 +13146,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                             Map<String,Object> item=new HashMap<>();
                             item.put("projectId",project.getId());
                             item.put("projectName",project.getProjectName());
+                            item.put("projectCode",project.getProjectCode());
                             item.put("groupName",groupName);
                             item.put("corpwxDeptId",corpwxDeptid);
                             item.put("department_name",departmentName);
@@ -13064,6 +13205,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                             Map<String,Object> item=new HashMap<>();
                             item.put("projectId",project.getId());
                             item.put("projectName",project.getProjectName());
+                            item.put("projectCode",project.getProjectCode());
                             item.put("groupName",groupName);
                             item.put("corpwxDeptId",corpwxDeptid);
                             item.put("department_name",departmentName);
@@ -13209,6 +13351,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         row0.setHeight((short)500);
         List<String> row_first =new ArrayList<>();
         row_first.add("项目名称");
+        row_first.add("项目编码");
         row_first.add("负责部门");
         row_first.add("任务分组");
         row_first.add("计划工时(财务)");
@@ -13223,12 +13366,13 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
             tempCell.setCellValue(row_first.get(i));
             tempCell.setCellStyle(headStyle);
         }
-        sheet.addMergedRegion(new CellRangeAddress(0,0,4,8));
+        sheet.addMergedRegion(new CellRangeAddress(0,0,5,9));
         sheet.addMergedRegion(new CellRangeAddress(0,1,0,0));
         sheet.addMergedRegion(new CellRangeAddress(0,1,1,1));
         sheet.addMergedRegion(new CellRangeAddress(0,1,2,2));
         sheet.addMergedRegion(new CellRangeAddress(0,1,3,3));
-        sheet.addMergedRegion(new CellRangeAddress(0,1,9,9));
+        sheet.addMergedRegion(new CellRangeAddress(0,1,4,4));
+        sheet.addMergedRegion(new CellRangeAddress(0,1,10,10));
         //第二行
         SXSSFRow row1 = sheet.createRow(rowNum++);
         row1.setHeight((short)500);
@@ -13237,6 +13381,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         row_second.add("");
         row_second.add("");
         row_second.add("");
+        row_second.add("");
         row_second.add("增补工时");
         row_second.add("正常工时");
         row_second.add("加班工时");
@@ -13257,6 +13402,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
             List<Map<String, Object>> maps = listMapGroupList.get(pid);
             if(maps.size()>1){
                 sheet.addMergedRegion(new CellRangeAddress(projectNum,projectNum+maps.size()-1,0,0));
+                sheet.addMergedRegion(new CellRangeAddress(projectNum,projectNum+maps.size()-1,1,1));
             }
             Map<String, List<Map<String, Object>>> listMapGroupDeptList = maps.stream().collect(Collectors.groupingBy(m -> String.valueOf(m.get("corpwxDeptId"))));
             List<String> deptIdList = maps.stream().map(m -> String.valueOf(m.get("corpwxDeptId"))).distinct().collect(Collectors.toList());
@@ -13264,7 +13410,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
             for (String deptId : deptIdList) {
                 List<Map<String, Object>> maps1 = listMapGroupDeptList.get(deptId);
                 if(maps1.size()>1){
-                    sheet.addMergedRegion(new CellRangeAddress(deptNum,deptNum+maps1.size()-1,1,1));
+                    sheet.addMergedRegion(new CellRangeAddress(deptNum,deptNum+maps1.size()-1,2,2));
                 }
                 deptNum+=maps1.size();
             }
@@ -13272,8 +13418,11 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         }
         for (Map<String, Object> map : mapList) {
             list.add(String.valueOf(map.get("projectName")));
+            list.add(String.valueOf(map.get("projectCode")));
             if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                 list.add("$departmentName="+map.get("corpwxDeptId")+"$");
+            }else if(dingding!=null&&dingding.getContactNeedTranslate()==1){
+                list.add("$departmentName="+String.valueOf(map.get("department_name"))+"$");
             }else {
                 list.add(String.valueOf(map.get("department_name")));
             }
@@ -13290,7 +13439,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         for(int i = 0;i<mapList.size();i++){
             SXSSFRow tempRow = sheet.createRow(rowNum++);
             tempRow.setHeight((short)500);
-            for(int j=0;j<10;j++){
+            for(int j=0;j<11;j++){
                 SXSSFCell tempCell = tempRow.createCell(j);
                 String cellValue = "";
                 tempCell.setCellStyle(cellStyle);
@@ -13482,6 +13631,8 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                 if(i==userProgress.size()-1){
                     if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                         sb.append("$userName="+String.valueOf(userProgress.get(i).get("userName"))+"$"+String.valueOf(userProgress.get(i).get("progress")));
+                    }else if(dingding!=null&&dingding.getContactNeedTranslate()==1){
+                        sb.append("$userName="+String.valueOf(userProgress.get(i).get("userName"))+"$"+String.valueOf(userProgress.get(i).get("progress")));
                     }else {
                         sb.append(String.valueOf(userProgress.get(i).get("userName"))+String.valueOf(userProgress.get(i).get("progress")));
                     }
@@ -13489,6 +13640,8 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                 }else {
                     if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                         sb.append("$userName="+String.valueOf(userProgress.get(i).get("userName"))+"$"+String.valueOf(userProgress.get(i).get("progress"))+",");
+                    }else if(dingding!=null&&dingding.getContactNeedTranslate()==1){
+                        sb.append("$userName="+String.valueOf(userProgress.get(i).get("userName"))+"$"+String.valueOf(userProgress.get(i).get("progress"))+",");
                     }else {
                         sb.append(String.valueOf(userProgress.get(i).get("userName"))+String.valueOf(userProgress.get(i).get("progress"))+",");
                     }
@@ -13719,8 +13872,16 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
             }
             deptIndex+=maps.size();
             for (int i = 0; i < maps.size(); i++) {
-                list.add("$departmentName="+String.valueOf(maps.get(i).get("corpwxDeptId"))+"$");
-                list.add("$userName="+maps.get(i).get("corpwxUserId")+"$");
+                if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                    list.add("$departmentName="+String.valueOf(maps.get(i).get("corpwxDeptId"))+"$");
+                    list.add("$userName="+maps.get(i).get("corpwxUserId")+"$");
+                }else if(dingding!=null&&dingding.getContactNeedTranslate()==1){
+                    list.add("$departmentName="+String.valueOf(maps.get(i).get("departmentName"))+"$");
+                    list.add("$userName="+String.valueOf(maps.get(i).get("userName"))+"$");
+                }else {
+                    list.add(String.valueOf(maps.get(i).get("departmentName")));
+                    list.add(String.valueOf(maps.get(i).get("userName")));
+                }
                 list.add(String.valueOf(maps.get(i).get("projectName")));
                 list.add(String.valueOf(maps.get(i).get("projectCode")));
                 list.add(String.valueOf(maps.get(i).get("taskName")));

+ 157 - 30
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java

@@ -3,6 +3,7 @@ package com.management.platform.service.impl;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
+import com.aliyun.dingtalkcontact_1_0.models.SearchUserResponse;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -101,6 +102,8 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
     @Resource
     private ReportLogDetailMapper reportLogDetailMapper;
     @Resource
+    private CompanyDingdingService companyDingdingService;
+    @Resource
     private ReportBatchMapper reportBatchMapper;
     @Resource
     private ReportLogDetailService reportLogDetailService;
@@ -159,8 +162,6 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
     @Resource
     private SapProjectServiceMapper sapProjectServiceMapper;
     @Resource
-    private CompanyDingdingService companyDingdingService;
-    @Resource
     private InformationMapper informationMapper;
     @Resource
     private TimeTypeMapper timeTypeMapper;
@@ -533,7 +534,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             List<ProjectAuditor> auditorList = integerList.size() > 0?projectAuditorMapper.selectList(new QueryWrapper<ProjectAuditor>().in("project_id", integerList)): new ArrayList<>();
 //            List<UserRecentTask> taskList = integerList.size() > 0?userRecentTaskMapper.selectList(new QueryWrapper<UserRecentTask>().in("project_id", integerList).orderByDesc("id")):new ArrayList<>();
             List<Profession> professions = professionMapper.selectList(new QueryWrapper<Profession>().eq("company_id", companyId));
-
+            List<Department> departmentList = departmentMapper.selectList(new LambdaQueryWrapper<Department>().eq(Department::getCompanyId, companyId));
             List<ReportExtraDegree> degreeList = reportExtraDegreeMapper.selectList(new QueryWrapper<ReportExtraDegree>().eq("company_id", companyId));
             List<TaskGroup> taskGroups = integerList.size() > 0?taskGroupMapper.selectList(new QueryWrapper<TaskGroup>().in("project_id", integerList)):new ArrayList<>();
             List<Stages> stagesList = integerList.size() > 0?stagesMapper.selectList(new QueryWrapper<Stages>().in("project_id", integerList)) : new ArrayList<>();
@@ -541,6 +542,9 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             //获取当前项目的子项目列表,任务分组,任务列表,项目相关维度列表
             reports.forEach(r->{
                 //设置项目名称
+                if(r.getDeptId()!=0){
+                    r.setUserReportDeptName(departmentList.stream().filter(f->f.getDepartmentId().equals(r.getDeptId())).findFirst().get().getDepartmentName());
+                }
                 r.setProjectName(allProjectList.stream().filter(p->p.getId().equals(r.getProjectId())).findFirst().get().getProjectName());
                 r.setSubProjectList(subProjectList.stream().filter(s->s.getProjectId().equals(r.getProjectId())).collect(Collectors.toList()));
                 r.setTaskList(taskMapper.recentSimpleList(r.getProjectId(), userId, r.getStage(), r.getGroupId()));
@@ -727,6 +731,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             });
             resultMap.put("report", reports);
             TimeType timeType = timeTypeMapper.selectById(companyId);
+            boolean showRefresh = false;
             if (timeType.getShowDdCardtime() == 1) {
                 List<UserDingdingTime> dingdingTimes = userDingdingTimeMapper.selectList(new QueryWrapper<UserDingdingTime>()
                         .eq("user_id", userId).eq("work_date", date));
@@ -734,6 +739,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                     UserDingdingTime time = dingdingTimes.get(0);
                     resultMap.put("time", time);
                 }
+                showRefresh = true;
             }else if(timeType.getSyncFanwei()==1){
                 List<UserFvTime> userFvTimeList = userFvTimeMapper.selectList(new QueryWrapper<UserFvTime>()
                         .eq("user_id", userId).eq("work_date", date));
@@ -741,6 +747,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                     UserFvTime time = userFvTimeList.get(0);
                     resultMap.put("time", time);
                 }
+                showRefresh = true;
             } else if (timeType.getShowCorpwxCardtime() == 1) {
                 User user = userMapper.selectById(userId);
                 List<UserCorpwxTime> corpwxTimes = userCorpwxTimeMapper.selectList(new QueryWrapper<UserCorpwxTime>()
@@ -749,7 +756,9 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                     UserCorpwxTime time = corpwxTimes.get(0);
                     resultMap.put("time", time);
                 }
+                showRefresh = true;
             }
+            resultMap.put("showRefresh", showRefresh);
 
             //顺便返回公司的工作时间设置
             resultMap.put("timeType",timeType);
@@ -1038,8 +1047,12 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
     public HttpRespMsg editReport(List<Report> reportList, String date, List<User> userList, BigDecimal hourCost, Integer companyId, String summary) {
         HttpRespMsg httpRespMsg = new HttpRespMsg();
         TimeType timeType = timeTypeMapper.selectById(companyId);
+        if ("null".equals(summary)) {
+            summary = null;
+        }
         //删除不在本次更新名单中的老记录
         List<Integer> idList = reportList.stream().filter(r->r.getId() != null).map(Report::getId).collect(Collectors.toList());
+        List<Report> allDateReportList = reportList;
         //只有填写日报的report才会有id, 前端会把全部状态的日报都传过来
         if (idList.size() > 0) {
             if (date != null && !date.contains("@")) {
@@ -1095,8 +1108,6 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             reportService.saveOrUpdateBatch(reportList);
             //成都明夷电子,需要生成批量记录
             Company company = companyMapper.selectById(companyId);
-            System.out.println(company.getCompanyName()+", date==="+date);
-
             if (company.getCompanyName().equals("成都明夷电子科技有限公司") || timeType.getEnableNewWeeklyfill() == 1) {//物奇需要填写周总结
                 if (date.contains("@")) {
                     //批量填报
@@ -1114,7 +1125,6 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                     batch.setEndDate(LocalDate.parse(endDate, dateTimeFormatter));
                     batch.setTotalWorkTime(reportList.stream().mapToDouble(Report::getWorkingTime).sum());
                     reportBatchMapper.insert(batch);
-                    System.out.println("生成了批记录batchId==="+batch.getId());
                     //更新batchId
                     reportList.forEach(r->r.setBatchId(batch.getId()));
                     List<Integer> collect = reportList.stream().map(Report::getId).collect(Collectors.toList());
@@ -1127,7 +1137,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                         //按周填报,需要保存周总结
                         //获取本周开始和结束的日期
                         DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd");
-                        HttpRespMsg retMsg = getWeeklyFillReportData(dtf.format(dateList.get(0)), request);
+                        HttpRespMsg retMsg = getWeeklyFillReportData(date, request);
                         HashMap mapItem = (HashMap)retMsg.data;
                         List<HashMap> dateRange = (List<HashMap>)mapItem.get("dateList");
                         LocalDate minDate = LocalDate.parse((String)dateRange.get(0).get("date"), dtf);
@@ -1142,11 +1152,10 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                         batch.setEndDate(maxDate);
                         //周总结
                         batch.setSummary(summary);
-                        batch.setTotalWorkTime(reportList.stream().filter(item->item.getCreatorId().equals(creatorId)).mapToDouble(Report::getWorkingTime).sum());
+                        batch.setTotalWorkTime(allDateReportList.stream().filter(item->item.getCreatorId().equals(creatorId)).mapToDouble(Report::getWorkingTime).sum());
                         reportBatchMapper.insert(batch);
                         //更新batchId
-                        List<Integer> curDateReportIds = reportList.stream().map(Report::getId).collect(Collectors.toList());
-                        System.out.println("curDateReportIds=="+curDateReportIds.size());
+                        List<Integer> curDateReportIds = allDateReportList.stream().map(Report::getId).collect(Collectors.toList());
                         reportMapper.update(new Report().setBatchId(batch.getId()), new QueryWrapper<Report>().in("id", curDateReportIds));
                     } else {
                         for (LocalDate curDate : dateList) {
@@ -2731,12 +2740,16 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
         String str = null;
         String fillUserId = null;
         WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", company.getId()));
+        CompanyDingding dingding = companyDingdingService.getOne(new LambdaQueryWrapper<CompanyDingding>().eq(CompanyDingding::getCompanyId, company.getId()));
         if (oneReport.getState() == -1) {//待部门直属领导审核
             //str = "您"+date+"导入的日报中"+pNames+"项目被["+user.getName()+"]驳回。原因:" + reason+",请重新导入。";
             String sendToUser = user.getName();
             if (wxCorpInfo != null && wxCorpInfo.getSaasSyncContact() == 1) {
                 //需要转译
                 sendToUser = "$userName="+user.getCorpwxUserid()+"$";
+            }else if (dingding != null && dingding.getContactNeedTranslate() == 1) {
+                //需要转译
+                sendToUser = "$userName="+user.getDingdingUserid()+"$";
             }
             str = MessageUtils.message("profession.impProReject",date,pNames,sendToUser,reason);
             fillUserId = oneReport.getFillUserid();
@@ -2746,6 +2759,9 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             if (wxCorpInfo != null && wxCorpInfo.getSaasSyncContact() == 1) {
                 //需要转译
                 sendToUser = "$userName="+user.getCorpwxUserid()+"$";
+            }else if (dingding != null && dingding.getContactNeedTranslate() == 1) {
+                //需要转译
+                sendToUser = "$userName="+user.getDingdingUserid()+"$";
             }
             str = MessageUtils.message("profession.fillProReject",date,pNames,sendToUser,reason);
             fillUserId = oneReport.getCreatorId();
@@ -4522,6 +4538,9 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                 dataItem.add("$userName="+(userMonthWork.corpwxUserId==null?"":userMonthWork.corpwxUserId)+"$"+(worktimeList.size()==0?"("+MessageUtils.message("entry.noFill")+")":""));
                 dataItem.add("$departmentName="+(userMonthWork.departmentName==null?"":userMonthWork.departmentName)+"$");
+            }else if(dingding!=null&&dingding.getContactNeedTranslate()==1){
+                dataItem.add("$userName="+(userMonthWork.name==null?"":userMonthWork.name)+"$"+(worktimeList.size()==0?"("+MessageUtils.message("entry.noFill")+")":""));
+                dataItem.add("$departmentName="+(userMonthWork.departmentName==null?"":userMonthWork.departmentName)+"$");
             }else {
                 dataItem.add(userMonthWork.name+(worktimeList.size()==0?"("+MessageUtils.message("entry.noFill")+")":""));
                 dataItem.add(userMonthWork.departmentName);
@@ -4570,6 +4589,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
         String token = request.getHeader("TOKEN");
         User user = userMapper.selectById(token);
         WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", user.getCompanyId()));
+        CompanyDingding dingding = companyDingdingService.getOne(new LambdaQueryWrapper<CompanyDingding>().eq(CompanyDingding::getCompanyId, companyId));
         TimeType timeType = timeTypeMapper.selectById(user.getCompanyId());
         //对于存在预算成本的公司,暂不支持导入工时
         Company company = companyMapper.selectById(companyId);
@@ -4647,15 +4667,35 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             int deptColumnExtra = (hasDept?1:0);
             //下标从0开始
             int projectNameStartIndex = (withCheckIn==null?2:(6 + deptColumnExtra));
+            List<User> targetUserList=new ArrayList<>();
             HttpRespMsg respMsg=new HttpRespMsg();
             if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1&&userNameList.size()>0){
+                System.out.println("参与搜素的人员列表"+userNameList + userNameList.size());
                 respMsg = wxCorpInfoService.getBatchSearchUserInfo(wxCorpInfo, userNameList,null);
                 if(respMsg.code.equals("0")){
                     msg.setError("姓名为["+String.valueOf(respMsg.data)+"]的人员存在重复,请使用工号!");
                     return msg;
                 }
+                targetUserList= (List<User>) respMsg.data;
+            }
+            if(dingding!=null&&dingding.getContactNeedTranslate()==1&&userNameList.size()>0){
+                System.out.println("参与搜素的人员列表"+userNameList + userNameList.size());
+                for (String name : userNameList) {
+                    respMsg= companyDingdingService.getSearchUserInfo(dingding,name,1);
+                    SearchUserResponse searchUserResponse = (SearchUserResponse) respMsg.data;
+                    if(searchUserResponse.body.totalCount>1){
+                        msg.setError("姓名为["+name+"]的人员存在重复,请使用工号!");
+                        return msg;
+                    }
+                    if(searchUserResponse.body.list.size()>0){
+                        User item=new User();
+                        //为了修改代码 此处用企业微信同一个字段 setCorpwxUserid
+                        item.setName(name);
+                        item.setCorpwxUserid(searchUserResponse.body.list.get(0));
+                        targetUserList.add(item);
+                    }
+                }
             }
-            List<User> targetUserList= (List<User>) respMsg.data;
             int dataCount = 0;
 
             for (int rowIndex = 0; rowIndex <= rowNum; rowIndex++) {
@@ -4730,9 +4770,9 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                     String username = withCheckIn==null?row.getCell(1).getStringCellValue().trim():row.getCell(2).getStringCellValue().trim();
                     //检查人员是否存在
                     Optional<User> any;
-                    if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                    if((wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1)||(dingding!=null&&dingding.getContactNeedTranslate()==1)){
                         Optional<User> optional = targetUserList.stream().filter(tl -> tl.getName().equals(username)).findFirst();
-                        any = allUserList.stream().filter(u -> u.getName().equals(username)||(u.getJobNumber()!=null&&u.getJobNumber().equals(username))||(optional.isPresent()&&u.getCorpwxUserid()!=null&&u.getCorpwxUserid().equals(optional.get().getCorpwxUserid()))).findAny();
+                        any = allUserList.stream().filter(u -> u.getName().equals(username)||(u.getJobNumber()!=null&&u.getJobNumber().equals(username))||(optional.isPresent()&&((u.getCorpwxUserid()!=null&&u.getCorpwxUserid().equals(optional.get().getCorpwxUserid()))||(u.getDingdingUserid()!=null&&u.getDingdingUserid().equals(optional.get().getCorpwxUserid()))))).findAny();
                     }else {
                         any = allUserList.stream().filter(u -> u.getName().equals(username)||(u.getJobNumber()!=null&&u.getJobNumber().equals(username))).findAny();
                     }
@@ -4901,6 +4941,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
         String token = request.getHeader("TOKEN");
         User user = userMapper.selectById(token);
         WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", user.getCompanyId()));
+        CompanyDingding dingding = companyDingdingService.getOne(new LambdaQueryWrapper<CompanyDingding>().eq(CompanyDingding::getCompanyId, companyId));
         TimeType timeType = timeTypeMapper.selectById(user.getCompanyId());
         //对于存在预算成本的公司,暂不支持导入工时
         Company company = companyMapper.selectById(companyId);
@@ -4974,14 +5015,34 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             }
             //下标从0开始
             HttpRespMsg respMsg=new HttpRespMsg();
+            List<User> targetUserList=new ArrayList<>();
             if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1&&userNameList.size()>0){
+                System.out.println("参与搜素的人员列表"+userNameList + userNameList.size());
                 respMsg = wxCorpInfoService.getBatchSearchUserInfo(wxCorpInfo, userNameList,null);
                 if(respMsg.code.equals("0")){
                     msg.setError("姓名为["+String.valueOf(respMsg.data)+"]的人员存在重复,请使用工号!");
                     return msg;
                 }
+                targetUserList= (List<User>) respMsg.data;
+            }
+            if(dingding!=null&&dingding.getContactNeedTranslate()==1&&userNameList.size()>0){
+                System.out.println("参与搜素的人员列表"+userNameList + userNameList.size());
+                for (String name : userNameList) {
+                    respMsg= companyDingdingService.getSearchUserInfo(dingding,name,1);
+                    SearchUserResponse searchUserResponse = (SearchUserResponse) respMsg.data;
+                    if(searchUserResponse.body.totalCount>1){
+                        msg.setError("姓名为["+name+"]的人员存在重复,请使用工号!");
+                        return msg;
+                    }
+                    if(searchUserResponse.body.list.size()>0){
+                        User item=new User();
+                        //为了修改代码 此处用企业微信同一个字段 setCorpwxUserid
+                        item.setName(name);
+                        item.setCorpwxUserid(searchUserResponse.body.list.get(0));
+                        targetUserList.add(item);
+                    }
+                }
             }
-            List<User> targetUserList= (List<User>) respMsg.data;
             int dataCount = 0;
 
             for (int rowIndex = 0; rowIndex <= rowNum; rowIndex++) {
@@ -5019,9 +5080,9 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                     }
                     //检查人员是否存在
                     Optional<User> any;
-                    if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                    if((wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1)||(dingding!=null&&dingding.getContactNeedTranslate()==1)){
                         Optional<User> optional = targetUserList.stream().filter(tl -> tl.getName().equals(username)).findFirst();
-                        any = allUserList.stream().filter(u -> u.getName().equals(username)||(u.getJobNumber()!=null&&u.getJobNumber().equals(username))||(optional.isPresent()&&u.getCorpwxUserid()!=null&&u.getCorpwxUserid().equals(optional.get().getCorpwxUserid()))).findAny();
+                        any = allUserList.stream().filter(u -> u.getName().equals(username)||(u.getJobNumber()!=null&&u.getJobNumber().equals(username))||(optional.isPresent()&&((u.getCorpwxUserid()!=null&&u.getCorpwxUserid().equals(optional.get().getCorpwxUserid()))||(u.getDingdingUserid()!=null&&u.getDingdingUserid().equals(optional.get().getCorpwxUserid()))))).findAny();
                     }else {
                         any = allUserList.stream().filter(u -> u.getName().equals(username)||(u.getJobNumber()!=null&&u.getJobNumber().equals(username))).findAny();
                     }
@@ -5546,7 +5607,10 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                 if(needCorpWxTranslate){
                     item.add("$userName="+(map.get("corpwxUserId")==null?"":map.get("corpwxUserId"))+"$");
                     item.add(departmentService.exportWxDepartment(dept,departments));
-                }else {
+                }else if(dingding!=null&&dingding.getContactNeedTranslate()==1){
+                    item.add("$userName="+(map.get("name")==null?"":map.get("name"))+"$");
+                    item.add(departmentService.exportDdDepartment(dept,departments));
+                }else  {
                     item.add((String) map.get("name"));
                     item.add(departmentService.getSupDepartment(dept,departments));
                 }
@@ -5654,6 +5718,9 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                         if(needCorpWxTranslate){
                             String projectAuditorName ="$userName="+String.valueOf(map.get("projectAuditorCorpwxUserId"))+"$";
                             item.add(projectAuditorName);
+                        }else if(dingding!=null&&dingding.getContactNeedTranslate()==1){
+                            String projectAuditorName ="$userName="+(String)map.get("projectAuditorName")+"$";
+                            item.add(projectAuditorName);
                         }else {
                             item.add((String)map.get("projectAuditorName"));
                         }
@@ -5661,6 +5728,9 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                     if(needCorpWxTranslate){
                         String projectManagerName ="$userName="+String.valueOf(map.get("projectManagerCorpwxUserId"))+"$";
                         item.add(projectManagerName);
+                    }else if(dingding!=null&&dingding.getContactNeedTranslate()==1){
+                        String projectAuditorName ="$userName="+(String)map.get("projectManagerName")+"$";
+                        item.add(projectAuditorName);
                     }else {
                         item.add((String)map.get("projectManagerName"));
                     }
@@ -5718,7 +5788,29 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
 											msg = time+" " + auditMsg;
 										}
 									}
-								}else {
+								}else if(dingding!=null&&dingding.getContactNeedTranslate()==1){
+                                    Optional<User> first = userList.stream().filter(ul -> ul.getId().equals(audit.getOperatorId())).findFirst();
+                                    if(first.isPresent()){
+                                        String dingdingUserid = first.get().getDingdingUserid();
+                                        if (!StringUtils.isEmpty(dingdingUserid) && auditMsg.contains(dingdingUserid)) {
+                                            if(auditMsg.contains("提交了")){
+                                                int i = auditMsg.indexOf("提");
+                                                String substring = auditMsg.substring(0, i);
+                                                msg = time+" " + auditMsg.replace(substring,"\\$userName="+dingdingUserid+"$\\");
+                                            }else if(auditMsg.contains("审核通过了")){
+                                                int i = auditMsg.indexOf("审");
+                                                String substring = auditMsg.substring(0, i);
+                                                msg = time+" " + auditMsg.replace(substring,"\\$userName="+dingdingUserid+"$\\");
+                                            }else if(auditMsg.contains("驳回了")) {
+                                                int i = auditMsg.indexOf("驳");
+                                                String substring = auditMsg.substring(0, i);
+                                                msg = time+" " + auditMsg.replace(substring,"\\$userName="+dingdingUserid+"$\\");
+                                            }
+                                        } else {
+                                            msg = time+" " + auditMsg;
+                                        }
+                                    }
+                                }else {
 									msg = time+" " + auditMsg;
 								}
 							} 
@@ -5788,6 +5880,16 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                                             } else {
                                                 item.add("待" + departmentName + "(" + deptAuditorName + ")审核");
                                             }
+                                        }else if (dingding!=null&&dingding.getContactNeedTranslate()==1) {
+                                            String deptAuditorName = "$userName=" + userItem.getDingdingUserid() + "$";
+                                            departmentName = "$departmentName=" + departmentName + "$";
+                                            if (timeType.getReportAuditType() == 4) {
+                                                departmentName = map.get("buDepartmentName") + "";
+                                                departmentName = "$departmentName=" + departmentName + "$";
+                                                item.add("待项目所属BU[" + departmentName + "](" + deptAuditorName + ")审核");
+                                            } else {
+                                                item.add("待" + departmentName + "(" + deptAuditorName + ")审核");
+                                            }
                                         } else {
                                             if (timeType.getReportAuditType() == 4) {
                                                 departmentName = map.get("buDepartmentName") + "";
@@ -5804,10 +5906,14 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                                 if (String.valueOf(map.get("projectAuditState")).equals("0") || String.valueOf(map.get("groupAuditState")).equals("0")) {
                                     String projectAuditorName = map.get("projectAuditorName") + "";
                                     String projectAuditorId = map.get("projectAuditorId") + "";
-                                    if (needCorpWxTranslate) {
+                                    if (needCorpWxTranslate||(dingding!=null&&dingding.getContactNeedTranslate()==1)) {
                                         for (User userItem : userList) {
                                             if (userItem.getId().equals(projectAuditorId)) {
-                                                projectAuditorName = "$userName=" + userItem.getCorpwxUserid() + "$";
+                                                if(needCorpWxTranslate){
+                                                    projectAuditorName = "$userName=" + userItem.getCorpwxUserid() + "$";
+                                                }else if(dingding!=null&&dingding.getContactNeedTranslate()==1){
+                                                    projectAuditorName = "$userName=" + userItem.getDingdingUserid() + "$";
+                                                }
                                                 item.add("待项目审核人" + "(" + projectAuditorName + ")审核");
                                                 break;
                                             }
@@ -6274,6 +6380,9 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                 line.add("$departmentName="+dataItem.corpwxDeptId+"$");
                 line.add("$userName="+dataItem.corpwxUserId+"$");
+            }else if(dingding!=null&&dingding.getContactNeedTranslate()==1){
+                line.add("$departmentName="+dataItem.department+"$");
+                line.add("$userName="+dataItem.name+"$");
             }else {
                 line.add(dataItem.department);
                 line.add(dataItem.name);
@@ -7077,29 +7186,41 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
         //转移日报
         List<Report> reportList = reportMapper.selectList(new QueryWrapper<Report>().eq("creator_id", sourceUser.getId()));
         if (reportList.size() != 0){
+            List<Report> upList = new ArrayList<>();
             for (Report report : reportList) {
-                report.setCreatorId(targetUser.getId());
-                report.setDeptId(targetUser.getDepartmentId());
+                Report upItem = new Report();
+                upItem.setId(report.getId());
+                upItem.setCreatorId(targetUser.getId());
+                upItem.setDeptId(targetUser.getDepartmentId());
+                upList.add(upItem);
             }
-            reportService.updateBatchById(reportList);
+            reportService.updateBatchById(upList);
         }
         //转移日报的log
         List<ReportLog> reportCreatorLogList = reportLogMapper.selectList(new QueryWrapper<ReportLog>().eq("creator_id", sourceUser.getId()));
         if (reportCreatorLogList.size() != 0){
+            List<ReportLog> upList = new ArrayList<>();
             for (ReportLog log : reportCreatorLogList) {
-                log.setCreatorId(targetUser.getId());
+                ReportLog upItem = new ReportLog();
+                upItem.setId(log.getId());
+                upItem.setCreatorId(targetUser.getId());
+                upList.add(upItem);
             }
-            reportLogService.updateBatchById(reportCreatorLogList);
+            reportLogService.updateBatchById(upList);
         }
 
         List<ReportLog> reportOperatorLogList = reportLogMapper.selectList(new QueryWrapper<ReportLog>().eq("operator_id", sourceUser.getId()));
         if (reportCreatorLogList.size() != 0){
+            List<ReportLog> upList = new ArrayList<>();
             for (ReportLog log : reportOperatorLogList) {
-                log.setOperatorId(targetUser.getId());
+                ReportLog upItem = new ReportLog();
+                upItem.setId(log.getId());
+                upItem.setOperatorId(targetUser.getId());
                 String msg = log.getMsg().replace(sourceUser.getName(), targetUser.getName());
-                log.setMsg(msg);
+                upItem.setMsg(msg);
+                upList.add(upItem);
             }
-            reportLogService.updateBatchById(reportOperatorLogList);
+            reportLogService.updateBatchById(upList);
         }
 
         List<ReportAlogMembdate> reportAlogMembdateList = reportAlogMembdateMapper.selectList(new QueryWrapper<ReportAlogMembdate>().eq("user_id", sourceUser.getId()));
@@ -8748,6 +8869,9 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                 item.add("$userName="+String.valueOf(record.get("corpWxUserId"))+"$");
                 item.add("$departmentName="+String.valueOf(record.get("corpWxDeptId"))+"$");
+            }else if(dingding!=null&&dingding.getContactNeedTranslate()==1){
+                item.add("$userName="+String.valueOf(record.get("userName"))+"$");
+                item.add("$departmentName="+String.valueOf(record.get("deptName"))+"$");
             }else {
                 item.add(String.valueOf(record.get("userName")));
                 item.add(String.valueOf(record.get("deptName")));
@@ -8921,13 +9045,13 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
     }
 
     @Override
-    public HttpRespMsg changeReminder(HttpServletRequest request,String createDate,String userId) throws Exception {
+    public HttpRespMsg changeReminder(HttpServletRequest request,String createDate,String userId,String startDate,String endDate) throws Exception {
         HttpRespMsg msg=new HttpRespMsg();
         DateTimeFormatter df=DateTimeFormatter.ofPattern("yyyy-MM-dd");
         Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
         WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new LambdaQueryWrapper<WxCorpInfo>().eq(WxCorpInfo::getCompanyId, companyId));
         LocalDate now=LocalDate.now();
-        HttpRespMsg userDailyWorkTime = getUserDailyWorkTime(request, now.with(TemporalAdjusters.firstDayOfMonth()).format(df), now.with(TemporalAdjusters.lastDayOfMonth()).format(df));
+        HttpRespMsg userDailyWorkTime = getUserDailyWorkTime(request,startDate,endDate);
         Map<String, Object> map = (Map<String, Object>) userDailyWorkTime.getData();
         List<UserMonthWork> userDailyWorkTimeData = (List<UserMonthWork>) map.get("list");
         if(!StringUtils.isEmpty(userId)){
@@ -9030,6 +9154,9 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                 item.add("$userName="+String.valueOf(map.get("corpwxUserId"))+"$");
                 item.add("$departmentName="+String.valueOf(map.get("corpwxDeptId"))+"$");
+            }else if(dingding!=null&&dingding.getContactNeedTranslate()==1){
+                item.add("$userName="+String.valueOf(map.get("name"))+"$");
+                item.add("$departmentName="+String.valueOf(map.get("departmentName"))+"$");
             }else {
                 item.add(String.valueOf(map.get("name")));
                 item.add(String.valueOf(map.get("departmentName")));

+ 2 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/SysRoleServiceImpl.java

@@ -133,6 +133,8 @@ public class SysRoleServiceImpl extends ServiceImpl<SysRoleMapper, SysRole> impl
             System.err.println("请先初始化sys_module和sys_function表");
             return null;
         }
+        //2024-04-30以后,剔除预估工时审批的模块
+        modules = modules.stream().filter(m->!m.getName().equals("预估工时审核")).collect(Collectors.toList());
         QueryWrapper<SysFunction> functionQueryWrapper = new QueryWrapper<SysFunction>().eq("package_time", 1);
         if (company.getPackageProject() == 1) {
             functionQueryWrapper.or().eq("package_project", 1);
@@ -190,7 +192,6 @@ public class SysRoleServiceImpl extends ServiceImpl<SysRoleMapper, SysRole> impl
                 List<SysFunction> filteredFunctions = functions.stream().filter(
                         m->Arrays.stream(functionMaps.get(str)).anyMatch(curModule->curModule.equals(m.getName()))
                 ).collect(Collectors.toList());
-
                 generateRole(str, company, filteredModules, filteredFunctions);
             }
         }

+ 4 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/TaskRestartServiceImpl.java

@@ -154,6 +154,10 @@ public class TaskRestartServiceImpl extends ServiceImpl<TaskRestartMapper, TaskR
                         if(first.get().getCorpwxRealUserid()!=null){
                             personLiableNames.append("$userName="+(first.get().getCorpwxUserid()==null?"":first.get().getCorpwxUserid())+"$"+",");
                         }
+                    }else if(dingding!=null&&dingding.getContactNeedTranslate()==1){
+                        if(first.get().getName()!=null){
+                            personLiableNames.append("$userName="+(first.get().getName())+"$"+",");
+                        }
                     }else {
                         personLiableNames.append(first.get().getName()+",");
                     }

+ 27 - 4
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/TaskServiceImpl.java

@@ -1,6 +1,7 @@
 package com.management.platform.service.impl;
 
 import com.alibaba.fastjson.JSONArray;
+import com.aliyun.dingtalkcontact_1_0.models.SearchUserResponse;
 import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@@ -229,6 +230,7 @@ public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements Ta
         User creator = userMapper.selectById(userId);
         Integer companyId = creator.getCompanyId();
         WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id",companyId));
+        CompanyDingding dingding = companyDingdingService.getOne(new LambdaQueryWrapper<CompanyDingding>().eq(CompanyDingding::getCompanyId, companyId));
         List<Project> allProjectList = null;
         List<TaskGroup> allGroupList = null;
         if (isMultiProject == 1) {
@@ -303,18 +305,39 @@ public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements Ta
                     System.out.println("===执行人为空===");
                 }
             }
+            List<User> targetUserList=new ArrayList<>();
             System.out.println("参与搜素的人员列表"+userNameList + userNameList.size());
             HttpRespMsg respMsg=new HttpRespMsg();
             boolean isCorpWxUser = false;
             if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1&&userNameList.size()>0){
                 isCorpWxUser = true;
+                System.out.println("参与搜素的人员列表"+userNameList + userNameList.size());
                 respMsg = wxCorpInfoService.getBatchSearchUserInfo(wxCorpInfo, userNameList,null);
                 if(respMsg.code.equals("0")){
                     httpRespMsg.setError("姓名为["+String.valueOf(respMsg.data)+"]的人员存在重复,请使用工号!");
                     return httpRespMsg;
                 }
+                targetUserList= (List<User>) respMsg.data;
+            }
+            if(dingding!=null&&dingding.getContactNeedTranslate()==1&&userNameList.size()>0){
+                isCorpWxUser = true;
+                System.out.println("参与搜素的人员列表"+userNameList + userNameList.size());
+                for (String name : userNameList) {
+                    respMsg= companyDingdingService.getSearchUserInfo(dingding,name,1);
+                    SearchUserResponse searchUserResponse = (SearchUserResponse) respMsg.data;
+                    if(searchUserResponse.body.totalCount>1){
+                        httpRespMsg.setError("姓名为["+name+"]的人员存在重复,请使用工号!");
+                        return httpRespMsg;
+                    }
+                    if(searchUserResponse.body.list.size()>0){
+                        User item=new User();
+                        //为了修改代码 此处用企业微信同一个字段 setCorpwxUserid
+                        item.setName(name);
+                        item.setCorpwxUserid(searchUserResponse.body.list.get(0));
+                        targetUserList.add(item);
+                    }
+                }
             }
-            List<User> targetUserList= (List<User>) respMsg.data;
             if (targetUserList == null) targetUserList = new ArrayList<>();
             //由于第一行需要指明列对应的标题
             for (int rowIndex = 0; rowIndex <= sheet.getLastRowNum(); rowIndex++) {
@@ -422,9 +445,9 @@ public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements Ta
                     for (int i=0;i<executorNameList.size();i++) {
                         String executorName = executorNameList.get(i);
                         Optional<User> first = null;
-                        if (isCorpWxUser) {
+                        if ((isCorpWxUser)||(dingding!=null&&dingding.getContactNeedTranslate()==1)) {
                             Optional<User> optional = targetUserList.stream().filter(tl -> tl.getName().equals(executorName)).findFirst();
-                            first = allUserList.stream().filter(u->(optional.isPresent()&&u.getCorpwxUserid().equals(optional.get().getCorpwxUserid()))).findFirst();
+                            first = allUserList.stream().filter(u->(optional.isPresent()&&((u.getCorpwxUserid()!=null&&u.getCorpwxUserid().equals(optional.get().getCorpwxUserid()))||(u.getDingdingUserid()!=null&&u.getDingdingUserid().equals(optional.get().getCorpwxUserid()))))).findFirst();
                         } else {
                             first = allUserList.stream().filter(u ->u.getName().equals(executorName)).findFirst();
                         }
@@ -698,7 +721,7 @@ public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements Ta
         dataList.add(titleList);
         for (Map<String, Object> map : mapList) {
             List<String> item=new ArrayList<>();
-            if((wxCorpInfo!=null && wxCorpInfo.getSaasSyncContact()==1)||(dingding!=null&&dingding.getSyncContact()==1)){
+            if((wxCorpInfo!=null && wxCorpInfo.getSaasSyncContact()==1)||(dingding!=null&&dingding.getContactNeedTranslate()==1)){
                 item.add("$userName="+String.valueOf(map.get("userName"))+"$");
                 item.add("$departmentName="+String.valueOf(map.get("deptName"))+"$");
             }else {

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

@@ -0,0 +1,20 @@
+package com.management.platform.service.impl;
+
+import com.management.platform.entity.UserReportDept;
+import com.management.platform.mapper.UserReportDeptMapper;
+import com.management.platform.service.UserReportDeptService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2024-04-29
+ */
+@Service
+public class UserReportDeptServiceImpl extends ServiceImpl<UserReportDeptMapper, UserReportDept> implements UserReportDeptService {
+
+}

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

@@ -2,6 +2,7 @@ package com.management.platform.service.impl;
 
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
+import com.aliyun.dingtalkcontact_1_0.models.SearchUserResponse;
 import com.aliyun.dysmsapi20170525.models.SendSmsResponse;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@@ -215,6 +216,8 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
     private TaskGroupService taskGroupService;
     @Resource
     private ParticipationService participationService;
+    @Resource
+    private UserReportDeptService userReportDeptService;
 
     @Resource
     private LdapTemplate ldapTemplate;
@@ -750,6 +753,14 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
             if (reportCount>0 || taskExecutorCount>0 || projectInchargerList>0){
                 reportCount = 1;
             }
+            List<UserReportDept> userReportDepts = userReportDeptService.list(new LambdaQueryWrapper<UserReportDept>().eq(UserReportDept::getUserId, id));
+            if(userReportDepts.size()>0){
+                List<Integer> deptIds = userReportDepts.stream().map(UserReportDept::getDeptId).distinct().collect(Collectors.toList());
+                List<Department> departmentList = departmentMapper.selectList(new LambdaQueryWrapper<Department>().in(Department::getDepartmentId, deptIds));
+                user.setUserReportDeptList(departmentList);
+            }else {
+                user.setUserReportDeptList(new ArrayList<>());
+            }
             user.setIsExistsReport(reportCount);
             httpRespMsg.data = user;
         }
@@ -856,6 +867,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
         }
         Integer companyId = userMapper.selectById(request.getHeader("Token")).getCompanyId();
         WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", companyId));
+        CompanyDingding dingding = companyDingdingService.getOne(new LambdaQueryWrapper<CompanyDingding>().eq(CompanyDingding::getCompanyId, companyId));
         HashMap<String, Object> data = new HashMap<>();
         httpRespMsg.data=data;
         //企业微信同步方式下,按姓名查找,需要去调用企微通讯录搜索接口
@@ -879,6 +891,24 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
                 data.put("total",total);
             }
             return httpRespMsg;
+        }else if (org.apache.commons.lang3.StringUtils.isNotBlank(keyword) && dingding!=null && dingding.getContactNeedTranslate()==1 && matchingType == 0){
+            System.out.println("====================开始查询通讯录名单======================");
+            HttpRespMsg searchUserInfo = companyDingdingService.getSearchUserInfo(dingding, keyword, 0);
+            SearchUserResponse searchUserResponse = (SearchUserResponse) searchUserInfo.data;
+            List users=searchUserResponse.body.list;
+            if (users.size() > 0){
+                List<User> realUser = userMapper.getUserByDepartment(null, companyId, null,null, null, null, null, users);
+                long total = realUser.size();
+                data.put("records",realUser);
+                data.put("nextCursor","");
+                data.put("total",total);
+            }else {
+                long total = 0;
+                data.put("records",new ArrayList<>());
+                data.put("nextCursor","");
+                data.put("total",total);
+            }
+            return httpRespMsg;
         }else {
             try {
                 TimeType timeType = timeTypeMapper.selectById(companyId);
@@ -1293,7 +1323,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
     @Override
     public HttpRespMsg insertUser(String targetId, String name, String phone, Integer onlyAuditOnce, Integer roleId, Double monthCost, Double cost,
                                   Integer departmentId, Integer salaryType, String costApplyDate, String position, String certJson, HttpServletRequest request,String inductionDate,
-                                  String superiorId,   String plate1,String plate2,String plate3,String plate4,String plate5, String jobNumber, String inactiveDate) {
+                                  String superiorId,   String plate1,String plate2,String plate3,String plate4,String plate5, String jobNumber, String inactiveDate,String reportDeptIds) {
         HttpRespMsg httpRespMsg = new HttpRespMsg();
         DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd");
         try {
@@ -1370,6 +1400,18 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
                                 userCertService.saveBatch(certList);
                             }
                         }
+                        if(!StringUtils.isEmpty(reportDeptIds)){
+                            List<UserReportDept> userReportDeptList=new ArrayList<>();
+                            String[] split = reportDeptIds.split(",");
+                            List<Integer> deptIds = Arrays.asList(split).stream().map(i -> Integer.valueOf(i)).collect(Collectors.toList());
+                            deptIds.forEach(d->{
+                                UserReportDept userReportDept=new UserReportDept();
+                                userReportDept.setUserId(user.getId());
+                                userReportDept.setDeptId(d);
+                                userReportDeptList.add(userReportDept);
+                            });
+                            userReportDeptService.saveBatch(userReportDeptList);
+                        }
                     }
                 }
             } else {
@@ -1437,6 +1479,22 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
                     userMapper.setSuperiorNull(oldUser.getId());
                 }
 
+                if(!StringUtils.isEmpty(reportDeptIds)){
+                    userReportDeptService.remove(new LambdaQueryWrapper<UserReportDept>().eq(UserReportDept::getUserId,targetId));
+                    List<UserReportDept> userReportDeptList=new ArrayList<>();
+                    String[] split = reportDeptIds.split(",");
+                    List<Integer> deptIds = Arrays.asList(split).stream().map(i -> Integer.valueOf(i)).collect(Collectors.toList());
+                    deptIds.forEach(d->{
+                        UserReportDept userReportDept=new UserReportDept();
+                        userReportDept.setUserId(targetId);
+                        userReportDept.setDeptId(d);
+                        userReportDeptList.add(userReportDept);
+                    });
+                    userReportDeptService.saveBatch(userReportDeptList);
+                }else {
+                    //清空数据
+                    userReportDeptService.remove(new LambdaQueryWrapper<UserReportDept>().eq(UserReportDept::getUserId,targetId));
+                }
                 if (salaryChange) {
                     UserSalary userSalary = UserSalary.copyFromUser(oldUser);
                     userSalaryMapper.insert(userSalary);

+ 34 - 4
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/task/TimingTask.java

@@ -1531,11 +1531,24 @@ public class TimingTask {
                 Long agentId = null;
                 String alertMsg = null;
                 List<String> dingUid = new ArrayList<>();
+
                 int count = 0;
+                HashMap<Integer, Boolean> compWorkDayMap = new HashMap<>();
                 for (int i=0;i<curUserList.size(); i++) {
                     count++;
                     Map<String, Object> item = curUserList.get(i);
                     Integer curCompanyId = (Integer)item.get("companyId");
+
+                    //节假日不提醒,判断当前是否是工作日
+                    if (compWorkDayMap.get(curCompanyId) == null) {
+                        Boolean workDay = timeTypeService.isWorkDay(curCompanyId, localDate);
+                        compWorkDayMap.put(curCompanyId, workDay);
+                    }
+                    Boolean workDay = compWorkDayMap.get(curCompanyId);
+                    if (!workDay){
+                        continue;
+                    }
+
                     dingUid.add((String)item.get("dingdingUserid"));
                     if (companyId == null) {
                         companyId = curCompanyId;
@@ -2000,8 +2013,9 @@ public class TimingTask {
         }
     }
 
-    //每天凌晨  2:30 获取前一天时间增量的人员数据  BeiSenHR---->工时管家  针对威派格
+    //每天凌晨  2:30 以及每天中午 12:30 获取前一天时间增量的人员数据  BeiSenHR---->工时管家  针对威派格
     @Scheduled(cron = "0 30 2 ? * *")
+    @Scheduled(cron = "0 30 12 ? * *")
     public void getByTimeWindow(){
         if(isDev){
             return;
@@ -2059,10 +2073,15 @@ public class TimingTask {
         }
     }
 
+    public static void main(String[] args) {
+        int dayOfMonth = LocalDate.now().getDayOfMonth();
+        System.out.println(dayOfMonth);
+    }
+
     /**
      * 每天凌晨2:50同步前一天的北森考勤数据 暂时固定公司id(5978)针对景昱
      * */
-    @Scheduled(cron ="0 38 16 ? * *")
+    @Scheduled(cron ="0 50 2 ? * *")
     public void syncAttendanceFromBeisen(){
         if(isDev){
             return;
@@ -2071,8 +2090,19 @@ public class TimingTask {
         DateTimeFormatter df1=DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
         DateTimeFormatter df2=DateTimeFormatter.ofPattern("HH:mm");
         DateTimeFormatter df3=DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
-        String startDate=LocalDate.now().minusDays(1).format(df);
-        String endDate=LocalDate.now().plusDays(1).format(df);
+        int dayOfMonth = LocalDate.now().getDayOfMonth();
+        String startDate;
+        String endDate;
+        if(dayOfMonth==8){
+            //每个月8号重新同步上个月数据以及当月至8号的数据
+            startDate=LocalDate.now().with(TemporalAdjusters.firstDayOfMonth()).minusMonths(1).format(df);
+            endDate=LocalDate.now().with(TemporalAdjusters.lastDayOfMonth()).minusMonths(1).plusDays(8).format(df);
+        }else {
+            startDate=LocalDate.now().minusDays(3).format(df);
+            endDate=LocalDate.now().plusDays(1).format(df);
+        }
+
+
         List<User> userList = userMapper.selectList(new LambdaQueryWrapper<User>().eq(User::getCompanyId, 5978));
         List<UserWithBeisen> userWithBeisenList = userWithBeisenService.list(new LambdaQueryWrapper<UserWithBeisen>().eq(UserWithBeisen::getCompanyId, 5978));
         BeisenConfig beisenConfig = beisenConfigMapper.selectById(5978);

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

@@ -27,5 +27,17 @@
     <sql id="Base_Column_List">
         corpid, corp_name, auth_user_id, indate, company_id, access_token, expire_time, agent_id, inner_appkey, inner_appsecret, inner_token, inner_expire_time, web_url, pc_web_url, oa_manager_dingid, sync_contact, contact_need_translate
     </sql>
-
+    <select id="getDingdingCompanyList" resultType="com.management.platform.entity.CompanyDingding">
+        select *
+        from company_dingding
+        left join company
+        ON company_dingding.company_id = company.id
+        where company.expiration_date >= now()
+        <if test="companyIds.size()>0">
+            and company.id in
+            <foreach collection="companyIds" item="item" separator="," open="(" close=")">
+                #{item}
+            </foreach>
+        </if>
+    </select>
 </mapper>

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

@@ -36,6 +36,7 @@
         <result column="department_name" property="departmentName" />
         <result column="corpwxUserId" property="corpwxUserId" />
         <result column="corpwxDeptId" property="corpwxDeptId" />
+        <result column="corpDdDeptId" property="corpDdDeptId" />
     </resultMap>
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
@@ -43,7 +44,7 @@
     </sql>
     <select id="getUserExpenseDetail" resultMap="UserBaseResultMap">
         select a.id, a.expense_id, a.project_id, a.happen_date, a.invoice_type, a.tax_percent, a.tax_value, a.amount, a.remark, a.expense_type, a.pic,a.status,
-        user.name as username,user.corpwx_userid as corpwxUserId, department.department_name,department.corpwx_deptid as corpwxDeptId
+        user.name as username,user.corpwx_userid as corpwxUserId, department.department_name,department.corpwx_deptid as corpwxDeptId,department.dd_deptid as corpDdDeptId
         from expense_item a
         left join expense_sheet b on a.expense_id = b.id
         left join user on user.id = b.owner_id

+ 2 - 2
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectMapper.xml

@@ -386,7 +386,7 @@
 
     <!--获取某个项目每个人分别需要的工时-->
     <select id="getProjectCost" resultType="java.util.Map">
-        SELECT b.id as creatorId,a.project_id as projectId, b.name,b.corpwx_userid as corpwxUserId,a.dept_id as deptId,department.corpwx_deptid as corpwxDeptId, IFNULL(department.department_name, '未分配') as departmentName, SUM(a.working_time) AS cost, SUM(a.cost) AS costMoney
+        SELECT b.id as creatorId,a.project_id as projectId, b.name,b.corpwx_userid as corpwxUserId,a.dept_id as deptId,department.corpwx_deptid as corpwxDeptId,department.dd_deptid as corpDdDeptId, IFNULL(department.department_name, '未分配') as departmentName, SUM(a.working_time) AS cost, SUM(a.cost) AS costMoney
         FROM report AS a
         JOIN user AS b ON a.creator_id = b.id
         left join department on department.department_id = a.dept_id
@@ -814,7 +814,7 @@
 
     <!--获取人员工时-->
     <select id="getUserWorkingTimeList" resultType="java.util.Map">
-        SELECT  report.`creator_id` AS userId, user.`name` AS username,user.corpwx_userid as corpwxUserId,user.job_number as jobNumber,
+        SELECT  report.`creator_id` AS userId, user.`name` AS username,user.corpwx_userid as corpwxUserId,user.dingding_userid as corpDdUserId,user.job_number as jobNumber,
         user.department_id As deptId,
         ifnull(SUM(if(project.is_public=0,report.working_time,null)),0) as unPublic,
         ifnull(SUM(if(project.is_public=1,report.working_time,null)),0) as isPublic,

+ 8 - 6
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ReportMapper.xml

@@ -82,7 +82,7 @@
         left join task_group on task_group.id = a.group_id
         left join user u on u.id = a.project_auditor_id
         left join user u2 on u2.id = b.incharger_id
-        left join department on department.department_id = c.department_id
+        left join department on department.department_id = a.dept_id
         left join department dp2 on dp2.department_id = b.bu_id
         left join project_main on b.project_main_id=project_main.id
         WHERE (<if test="stateKey == null or stateKey == 0">
@@ -139,7 +139,7 @@
         left join task_group on task_group.id = a.group_id
         left join user u on u.id = a.project_auditor_id
         left join user u2 on u2.id = b.incharger_id
-        left join department on department.department_id = c.department_id
+        left join department on department.department_id = a.dept_id
         left join department dp2 on dp2.department_id = b.bu_id
         left join project_main on b.project_main_id=project_main.id
         left join report_log_detail rlog on rlog.report_id = a.id
@@ -222,7 +222,7 @@
         left join task_group on task_group.id = a.group_id
         left join user u on u.id = a.project_auditor_id
         left join user u2 on u2.id = b.incharger_id
-        left join department on department.department_id = c.department_id
+        left join department on department.department_id = a.dept_id
         left join department dp2 on dp2.department_id = b.bu_id
         left join project_main on project_main.id=b.project_main_id
         WHERE
@@ -290,7 +290,7 @@
         left join task_group on task_group.id = a.group_id
         left join user u on u.id = a.project_auditor_id
         left join user u2 on u2.id = b.incharger_id
-        left join department on department.department_id = c.department_id
+        left join department on department.department_id = a.dept_id
         left join department dp2 on dp2.department_id = b.bu_id
         left join project_main on project_main.id=b.project_main_id
         left join report_log_detail rlog on rlog.report_id = a.id
@@ -353,7 +353,7 @@
         left join task_group on task_group.id = a.group_id
         left join user u on u.id = a.project_auditor_id
         left join user u2 on u2.id = b.incharger_id
-        left join department on department.department_id = c.department_id
+        left join department on department.department_id = a.dept_id
         left join department dp2 on dp2.department_id = b.bu_id
         left join project_main on project_main.id=b.project_main_id
         WHERE (
@@ -996,8 +996,10 @@
     </select>
 
     <select id="getUserReportTimelinessRate" resultType="java.util.Map">
-        select `user`.name as userName,`user`.corpwx_userid as corpwxUserId,`user`.corpwx_deptid as corpwxDeptId,rl.create_date as createDate,MIN(rl.operate_date )as createTime from report_log rl
+        select `user`.name as userName,`user`.corpwx_userid as corpwxUserId,d.dd_deptid as corpDdDeptId,`user`.corpwx_deptid as corpwxDeptId,rl.create_date as createDate,MIN(rl.operate_date )as createTime
+        from report_log rl
         left join `user` on `user`.id=rl.operator_id
+        left join department d on `user`.department_id=d.department_id
         where rl.company_id=#{companyId}
         and rl.create_date between  #{startDate} and #{endDate}
         and rl.msg like '%提交了%'

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

@@ -284,7 +284,7 @@
         CONCAT(FORMAT(COUNT(CASE WHEN t.task_status=0 THEN 1 END)/COUNT(t.name)*100, 2), '%') AS noCompletedPercent,CONCAT(FORMAT(COUNT(CASE WHEN t.finish_date &lt;= t.end_date AND t.task_status=1  THEN 1 END)/COUNT(t.name)*100, 2), '%') AS onTimePercent
         FROM
         task_executor te
-        LEFT JOIN user u ON te.executor_id=u.id
+        LEFT JOIN `user` u ON te.executor_id=u.id
         LEFT JOIN department d ON u.department_id=d.department_id
         LEFT JOIN task t ON te.task_id=t.`id`
         WHERE u.company_id=#{companyId}
@@ -314,7 +314,7 @@
         SELECT u.id as userId
         FROM
         task_executor te
-        LEFT JOIN user u ON te.executor_id=u.id
+        LEFT JOIN `user` u ON te.executor_id=u.id
         LEFT JOIN department d ON u.department_id=d.department_id
         LEFT JOIN task t ON te.task_id=t.`id`
         WHERE u.company_id=#{companyId}
@@ -343,7 +343,7 @@
         (CASE t.`task_status` WHEN 0 THEN '进行中' WHEN 1 THEN '已完成' ELSE '已撤销' END) AS stateValue
         FROM
         task_executor te
-        LEFT JOIN USER u ON te.executor_id=u.id
+        LEFT JOIN `user` u ON te.executor_id=u.id
         LEFT JOIN task t ON te.task_id=t.`id`
         WHERE t.start_date &lt; #{endDate} AND t.end_date &gt; #{startDate} AND FIND_IN_SET(#{userId},t.`executor_id`) GROUP BY t.`id`
         <if test="pageStart != null and pageSize != null">
@@ -355,7 +355,7 @@
         SELECT t.`name` AS taskName
         FROM
         task_executor te
-        LEFT JOIN USER u ON te.executor_id=u.id
+        LEFT JOIN `user` u ON te.executor_id=u.id
         LEFT JOIN task t ON te.task_id=t.`id`
         WHERE t.start_date &lt; #{endDate} AND t.end_date &gt; #{startDate} AND FIND_IN_SET(#{userId},t.`executor_id`) GROUP BY t.`id`
         )as total

Різницю між файлами не показано, бо вона завелика
+ 2 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/TimeTypeMapper.xml


+ 7 - 3
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/UserMapper.xml

@@ -68,9 +68,13 @@
         left join user c on c.id = a.superior_id and c.company_id = #{companyId}
         WHERE a.company_id = #{companyId}
           <if test="corpwxUserIds != null">
-              AND a.corpwx_userid in
-                <foreach collection="corpwxUserIds" item="corpwxUserid" open="(" close=")" separator=",">
-                    #{corpwxUserid}</foreach>
+              AND (
+              a.corpwx_userid in
+              <foreach collection="corpwxUserIds" item="corpwxUserid" open="(" close=")" separator=",">
+                  #{corpwxUserid}</foreach>
+              or a.dingding_userid in
+              <foreach collection="corpwxUserIds" item="corpwxUserid" open="(" close=")" separator=",">
+                  #{corpwxUserid}</foreach>)
           </if>
         <if test="departmentId != null and companyId != ''">
             AND a.department_id = #{departmentId}

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

@@ -0,0 +1,17 @@
+<?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.UserReportDeptMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.management.platform.entity.UserReportDept">
+        <id column="id" property="id" />
+        <result column="user_id" property="userId" />
+        <result column="dept_id" property="deptId" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, user_id, dept_id
+    </sql>
+
+</mapper>

BIN
fhKeeper/formulahousekeeper/management-platform/费用报销导入模板.xlsx


+ 9 - 8
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java

@@ -4761,16 +4761,17 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             ProdProcedureTeam prodProcedureTeam = prodProcedureTeamMapper.selectById(report.getUserProcedureTeamId());
             //总计划任务的工序中有总工时和总工价
             PlanProcedureTotal planProcedureTotal = planProcedureTotalMapper.selectOne(new QueryWrapper<PlanProcedureTotal>().eq("plan_id", report.getPlanId()).eq("prod_procedure_id", report.getProdProcedureId()));
-            //核算本次填报的件数是否合法
-            prodProcedureTeam.setStatus(1);//未完工
-            prodProcedureTeam.setUpdateTime(LocalDateTime.now());
-            //更新填写的钢印号
-            prodProcedureTeam.setSteelNumArray("[]");
             reportMapper.deleteById(id);
             reportSteelNumMapper.delete(new QueryWrapper<ReportSteelNum>().eq("report_id", id));
-
-            //更新自己执行的工序上的数据
-            prodProcedureTeamMapper.updateById(prodProcedureTeam);
+            if (prodProcedureTeam != null) {
+                //核算本次填报的件数是否合法
+                prodProcedureTeam.setStatus(1);//未完工
+                prodProcedureTeam.setUpdateTime(LocalDateTime.now());
+                //更新填写的钢印号
+                prodProcedureTeam.setSteelNumArray("[]");
+                //更新自己执行的工序上的数据
+                prodProcedureTeamMapper.updateById(prodProcedureTeam);
+            }
             //计算该计划工序的总完成工时和完成度
             Report curReportSumItem = reportMapper.selectOne(new QueryWrapper<Report>().select("sum(working_time) as working_time").eq("plan_id", planProcedureTotal.getPlanId()).eq("prod_procedure_id", planProcedureTotal.getProdProcedureId()));
             Double workingTime = 0.0;

+ 3 - 0
fhKeeper/formulahousekeeper/octopus/src/views/customer/list.vue

@@ -251,6 +251,7 @@
                     <el-form-item><el-checkbox v-model="dialogData.easyExpense">是否开启简易费用报销</el-checkbox></el-form-item>
                     <el-form-item><el-checkbox v-model="dialogData.enableNewWeeklyfill">是否启用新的按周填报模式</el-checkbox></el-form-item>
                     <el-form-item><el-checkbox v-model="dialogData.hideSubproject">是否去除子项目</el-checkbox></el-form-item>
+                    <el-form-item><el-checkbox v-model="dialogData.userWithMultiDept">是否开启人员设置可填报部门</el-checkbox></el-form-item>
                 </el-form>
             </div>
             <!-- 是否开启审批流设置,是否启用主项目模式,是否秘薪模式,是否显示日报审批流程,是否CRO企业,是否仅使用导入日报审核(不要项目审核) reportAuditType-->
@@ -475,6 +476,7 @@ import App from '../../App.vue';
                             this.$set(this.dialogData,'easyExpense',res.data.easyExpense ? true : false)
                             this.$set(this.dialogData,'enableNewWeeklyfill',res.data.enableNewWeeklyfill ? true : false)
                             this.$set(this.dialogData,'hideSubproject',res.data.hideSubproject ? true : false)
+                            this.$set(this.dialogData,'userWithMultiDept',res.data.userWithMultiDept ? true : false)
                         }else{
                             this.$message({
                                 message: res.msg,
@@ -797,6 +799,7 @@ import App from '../../App.vue';
                     easyExpense: this.dialogData.easyExpense ? 1 : 0,
                     enableNewWeeklyfill: this.dialogData.enableNewWeeklyfill ? 1 : 0,
                     hideSubproject:this.dialogData.hideSubproject ? 1: 0, 
+                    userWithMultiDept:this.dialogData.userWithMultiDept ? 1: 0, 
                 },res => {
                     if(res.code == 'ok'){
                         this.editDialogG = false

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

@@ -563,6 +563,12 @@ public class TimeType extends Model<TimeType> {
     @TableField("report_audit_flow_enable_super_dept_aduit")
     private Integer reportAuditFlowEnableSuperDeptAduit;
 
+    /**
+     * 是否开启设置可填报部门 0-否 1-是
+     */
+    @TableField("user_with_multi_dept")
+    private Integer userWithMultiDept;
+
 
     @Override
     protected Serializable pkVal() {

Різницю між файлами не показано, бо вона завелика
+ 3 - 1
fhKeeper/formulahousekeeper/ops-platform/src/main/resources/mapper/TimeTypeMapper.xml


+ 4 - 2
fhKeeper/formulahousekeeper/timesheet/src/components/cascader.vue

@@ -318,7 +318,8 @@ export default {
                     }
                     let obj = {
                         id: item.value,
-                        distinction: this.distinction
+                        distinction: this.distinction,
+                        other: this.other
                     }
                     this.$emit('vueCasader', obj)
                 }
@@ -330,7 +331,8 @@ export default {
                     let obj = {
                         id: item.value,
                         distinction: this.distinction,
-                        item: item
+                        item: item,
+                        other: this.other
                     }
                     this.$emit('vueCasader', obj)
                 } else {

+ 6 - 2
fhKeeper/formulahousekeeper/timesheet/src/components/translationOpenData.vue

@@ -6,7 +6,7 @@
                 <ww-open-data :type='configuration.openType' :openid='translationValue'></ww-open-data>
             </span>
             <span v-else-if="dingdingPlatform && !noRender.includes(translationValue)">
-                <dt-open-data :open-type='configuration.openType' :open-id='translationValue'></dt-open-data>
+                <dt-open-data :open-type='dingdingOpenType[configuration.openType]' :open-id='translationValue'></dt-open-data>
             </span>
             <span v-else>{{ translationValue }}</span>
         </template>
@@ -54,7 +54,11 @@ export default {
                 renderIndex: 0,
             }, // 配置对象
 
-            noRender: ['全部人员', '未分配']
+            noRender: ['全部人员', '未分配'],
+            dingdingOpenType: {
+                userName: 'userName',
+                departmentName: 'deptName',
+            }
         }
     },
     computed: {},

+ 9 - 5
fhKeeper/formulahousekeeper/timesheet/src/components/translationOpenDataText.vue

@@ -1,11 +1,11 @@
 <template>
     <div class="translation">
         <!-- 文本 -->
-        <span v-if="corporateWeChat">
+        <span v-if="corporateWeChat && openIdValue && !noRender.includes(openIdValue) ">
             <ww-open-data :type='type' :openid='openIdValue'></ww-open-data>
         </span>
-        <span v-else-if="dingdingPlatform">
-            <dt-open-data :open-type='type' :open-id='openIdValue'></dt-open-data>
+        <span v-else-if="dingdingPlatform && openIdValue && !noRender.includes(openIdValue)">
+            <dt-open-data :open-type='dingdingOpenType[type]' :open-id='openIdValue'></dt-open-data>
         </span>
         <span v-else>{{ openIdValue }}</span>
     </div>
@@ -32,7 +32,12 @@ export default {
             corporateWeChat: false, // 企业微信转译
             dingdingPlatform: false, // 钉钉转译
 
-            openIdValue: ''
+            openIdValue: '',
+            noRender: ['全部人员', '未分配'],
+            dingdingOpenType: {
+                userName: 'userName',
+                departmentName: 'deptName',
+            }
         }
     },
     computed: {},
@@ -49,7 +54,6 @@ export default {
     },
     methods: {
         dealWith() {
-            console.log(this.user)
             const { userNameNeedTranslate, dingdingUserid } = this.user
             if (userNameNeedTranslate) {
                 this.corporateWeChat = true

+ 2 - 2
fhKeeper/formulahousekeeper/timesheet/src/views/project/cost.vue

@@ -32,8 +32,8 @@
                 <el-radio-button :label="$t('other.project')"></el-radio-button>
                 <el-radio-button :label="$t('zhu-xiang-mu')" v-if="user.timeType.mainProjectState"></el-radio-button>
                 <el-radio-button :label="$t('projectclassification')" v-if="user.companyId != '1071'"></el-radio-button>
-                <el-radio-button :label="$t('lable.department')" v-if="permissions.viewAllSummary || permissions.viewMagDeptSummary"></el-radio-button>
-                <el-radio-button :label="$t('ren-yuan')" v-if="permissions.countPersonnel"></el-radio-button>
+                <el-radio-button :label="$t('lable.department')" v-if="(permissions.viewAllSummary || permissions.viewMagDeptSummary) && !user.dingdingUserid"></el-radio-button>
+                <el-radio-button :label="$t('ren-yuan')" v-if="permissions.countPersonnel && !user.dingdingUserid"></el-radio-button>
                 <el-radio-button :label="namess" v-if="jichu.customDegreeActive == 1 && !jichu.customDegreeMultiple"></el-radio-button>
                 <el-radio-button v-for="item in theCustomList" :key="item.id" :label="item.name"></el-radio-button>
             </el-radio-group>

+ 163 - 6
fhKeeper/formulahousekeeper/timesheet/src/views/team/index.vue

@@ -146,7 +146,7 @@
                     </el-form-item> -->
                     <el-form-item style="float:right;">
                         <span style="color: #666666">{{ $t('jiao-se') }}</span>
-                        <el-select v-model="roleId" :placeholder="$t('defaultText.pleaseChoose')" @change="getUser()" style="width: 120px" clearable size="small">
+                        <el-select v-model="roleId" :placeholder="$t('defaultText.pleaseChoose')" @change="page = 1;getUser()" style="width: 120px" clearable size="small">
                             <!-- <el-option
                             v-for="item in rolesa"
                             :key="item.value"
@@ -158,7 +158,7 @@
                     </el-form-item>
                     <el-form-item style="float:right;">
                         <span style="color: #666666">{{ $t('state.states') }}</span>
-                        <el-select v-model="status" :placeholder="$t('defaultText.pleaseChoose')" @change="getUser()" style="width: 120px" size="small">
+                        <el-select v-model="status" :placeholder="$t('defaultText.pleaseChoose')" @change="page = 1;getUser()" style="width: 120px" size="small">
                             <el-option
                             v-for="item in states"
                             :key="item.value"
@@ -180,7 +180,7 @@
                         </div>
                     </el-form-item>
                      <el-form-item style="float:right;" v-if="depData != null && depData.id != '-1'">
-                        <el-checkbox v-model="onlyDirect" @change="getUser()">{{ $t('directstaff') }}</el-checkbox>
+                        <el-checkbox v-model="onlyDirect" @change="page = 1;getUser()">{{ $t('directstaff') }}</el-checkbox>
                     </el-form-item>
                      
                 </el-form>
@@ -440,6 +440,15 @@
                       <vueCascader :size="'medium'" :widthStr="'430'" :clearable="true && user.userNameNeedTranslate != 1" :subject="option" :subjectId="insertForm.departmentId" :radios="true" :distinction="'2'" @vueCasader="vueCasader" v-if="user.userNameNeedTranslate == 1" ></vueCascader>
 
                   </el-form-item>
+                  <el-form-item label="可填报部门" prop="reportDeptIds" v-if="user.timeType.userWithMultiDept">
+                    <template v-if="insertForm.reportDeptIdsList && insertForm.reportDeptIdsList.length > 0"> 
+                      <el-tag v-for="(tag, tagIndex) in insertForm.reportDeptIdsList" :key="tag.id" closable :type="'success'" style="margin-right: 10px;" @close="handleDeptClose(tagIndex)">
+                        <TranslationOpenDataText type='departmentName' :openid='tag.label'></TranslationOpenDataText>
+                      </el-tag>
+                    </template>
+                    <el-link type="primary" :underline="false" @click="addFilldDepartment(insertForm.reportDeptIdsList)">添加</el-link>
+                  </el-form-item>
+
                   <el-form-item label="审核层级" v-if="user.timeType.reportAuditType == 6">
                       <el-radio-group v-model="insertForm.onlyAuditOnce" >
                       <el-radio  :label="0" >两层审核</el-radio>
@@ -809,6 +818,45 @@
           <el-button type="primary" @click="transferActiveMethod">确 定</el-button>
         </span>
       </el-dialog>
+
+      <!-- 多选部门 -->
+      <el-dialog :title="'请选择部门'" :top="'10vh'"  v-if="specialHolidaysDialog" :visible.sync="specialHolidaysDialog" :close-on-click-modal="false" customClass="customWidth" width="600px">
+            <div v-if="user.userNameNeedTranslate == '1'">
+                <el-input placeholder="请输入名字搜索" v-model.trim="wxFilterText" clearable @clear="getWhiteListAll()" class="input-with-select">
+                    <el-button slot="append" icon="el-icon-search" @click="echartDepartment()"></el-button>
+                </el-input>
+            </div>
+            <div class="tree" style="height:400px">
+                <el-scrollbar style="height:100%">
+                    <el-input v-if="user.userNameNeedTranslate != '1'"
+                    :placeholder="$t('keywordfiltering')"
+                    v-model="filterText">
+                    </el-input>
+                <el-tree :data="whiteListAll" show-checkbox :props="defaultProps" node-key="id"
+                    ref="specialHolidaysTree"
+                    highlight-current  :filter-node-method="filterNode">
+                        <span class="custom-tree-node" slot-scope="{ node, data }">
+                            <span v-if="user.userNameNeedTranslate == '1'">
+                                <span v-if="node.data.children">
+                                    <TranslationOpenDataText type='departmentName' :openid='node.label'></TranslationOpenDataText>
+                                </span>
+                                <span v-else>
+                                    <TranslationOpenDataText type='userName' :openid='node.label'></TranslationOpenDataText>
+                                </span>
+                            </span>
+                            <span v-if="user.userNameNeedTranslate != '1'">
+                                {{ node.label }}
+                            </span>
+                        </span>
+                    </el-tree>
+                </el-scrollbar>
+            </div>
+            <!-- <div>已选中&nbsp;{{chosenMembCount}}&nbsp;人</div>         :default-checked-keys="alreadyPartArray"  @check-change="onTreeItemChange" -->
+            <div slot="footer" class="dialog-footer">
+                <el-button @click="specialHolidaysDialog = false">{{ $t('btn.cancel') }}</el-button>
+                <el-button type="primary" @click="specialHolidaysChange()">{{ $t('btn.determine') }}</el-button>
+            </div>
+        </el-dialog>
     </div>
   </div>
 </template>
@@ -1114,9 +1162,23 @@ export default {
       deleteUserFlg: false,
       deleteUserFlgData: {},
       moveReportUserId: '',
-      deleteUserFlgloading: false
+      deleteUserFlgloading: false,
+
+      // 多选部门
+      filterText: '',
+      wxFilterText: '', // 转译搜索
+      whiteListAll: [],
+      whiteListAllTwo: [],
+      specialHolidaysDialog: false,
     };
   },
+  watch: {
+      filterText(val) {
+        console.log(val)
+        console.log(this.$refs.specialHolidaysTree.filter)
+        this.$refs.specialHolidaysTree.filter(val);
+      }
+  },
   filters: {
     acquireRoleName(value) {
       for (var i in that.acquireRoleList) {
@@ -2766,6 +2828,15 @@ export default {
           (res) => {
             if (res.code == "ok") {
               this.deleteUserFlgData = res.data
+              if(res.data.userReportDeptList && res.data.userReportDeptList.length > 0) {
+                res.data.userReportDeptList = res.data.userReportDeptList .map(item => {
+                  return {
+                    ...item,
+                    label: item.departmentName,
+                    id: item.departmentId
+                  }
+                })
+              }
               this.insertForm = {
                 id: res.data.id,
                 name: res.data.name,
@@ -2789,7 +2860,8 @@ export default {
                 plate4: res.data.plate4,
                 plate5: res.data.plate5,
                 jobNumber: res.data.jobNumber,
-                onlyAuditOnce: res.data.onlyAuditOnce
+                onlyAuditOnce: res.data.onlyAuditOnce,
+                reportDeptIdsList: res.data.userReportDeptList || []
               };
               this.$set(this.insertForm, 'inductionDate', res.data.inductionDate)
               this.getUserCustomConfig(1);
@@ -2922,6 +2994,14 @@ export default {
               ];
           }
 
+          if(this.user.timeType.userWithMultiDept == 1) {
+            let list = []
+            if(this.insertForm.reportDeptIdsList && this.insertForm.reportDeptIdsList.length > 0) {
+              list = this.insertForm.reportDeptIdsList.map(item => item.id)
+            }
+            form.reportDeptIds = list.join(',')
+          }
+
           if (!ssR && trs) {
             this.http.post(
               this.port.manage.insert,
@@ -3775,7 +3855,83 @@ export default {
       error => {
           this.$message({message: error,type: "error"});
       });
-    }
+    },
+    getWhiteListAll(){
+        this.http.post('/department/listAllMemb',{
+        },res => {
+            if(res.code == 'ok'){
+                let list = res.data
+                // this.haveUsersList(list)
+                this.whiteListAll = JSON.parse(JSON.stringify(list))
+                this.whiteListAllTwo = JSON.parse(JSON.stringify(list))
+            }
+        },error => {})
+    },
+    // 企业微信选人搜索
+    echartDepartment() {
+        if(this.wxFilterText != '') {
+            this.http.post("/department/listAllMemb", {
+                keyword: this.wxFilterText,
+                cursor: ''
+            },
+            res => {
+                if (res.code == "ok") {
+                    if(!Array.isArray(res.data)) {
+                        let list = res.data.data
+                        // this.haveUsersList(list)
+                        this.whiteListAll = JSON.parse(JSON.stringify(list))
+                        this.whiteListAllTwo = JSON.parse(JSON.stringify(list))
+                    } else {
+                        this.whiteListAll = []
+                    }
+                }
+            },
+            error => { });
+        } else {
+            this.getWhiteListAll()
+        }
+    },
+    haveUsersList(list){
+        for (var i in list) {
+            if (list[i].children != null) {
+                this.haveUsersList(list[i].children);
+            }
+            if (list[i].userList != null) {
+                if (list[i].children == null) {
+                    list[i].children = [];
+                }
+                list[i].userList.forEach(element => {
+                    var obj = {id: element.id, label:element.name, parentId:element.departmentId, isUser:1};
+                    list[i].children.push(obj);
+                });
+            }
+        }
+    },
+    specialHolidaysChange() {
+      let selectList = this.$refs.specialHolidaysTree.getCheckedNodes();
+      this.specialHolidaysDialog = false
+      this.insertForm.reportDeptIdsList = selectList
+    },
+    addFilldDepartment(item) {
+        this.filterText = ''
+        this.wxFilterText = ''
+        this.whiteListAll = JSON.parse(JSON.stringify(this.whiteListAllTwo));
+        this.specialHolidaysDialog = true
+        if(item) {
+          let key = item.map(item => item.id)
+          console.log(key, '<=== key')
+          setTimeout(() => {
+            this.$refs.specialHolidaysTree.setCheckedKeys(key)
+          }, 500)
+        }
+    },
+    handleDeptClose(index) {
+      this.insertForm.reportDeptIdsList.splice(index, 1)
+    },
+    filterNode(value, data) {
+        if (!value) return true;
+        return data.label.indexOf(value) !== -1;
+    },
   },
   mounted() {
     this.deactiveDate = util.formatDate.format(new Date(), "yyyy-MM-dd");
@@ -3794,6 +3950,7 @@ export default {
       this.getWxManager()
     }
     this.statesPush();
+    this.getWhiteListAll()
     // 获取企业微信的参数
     // if(this.user.companyId == '1081' || this.user.companyId == '7') {
     //   this.agentConfig()

+ 90 - 40
fhKeeper/formulahousekeeper/timesheet/src/views/workReport/daily.vue

@@ -389,12 +389,12 @@
                         <span v-if="reportTimeType.type == 3 && user.company.companyName != mingyiName">{{$t('time.hour')}}</span>
                         <!-- <span v-if="isBatch && user.company.companyName != mingyiName">, {{$t('other.fillInTheTotal')}} {{jsTime.toFixed(1)}} {{$t('time.hour')}}</span> -->
                         <span v-if="isBatch && user.company.companyName != mingyiName">, {{$t('other.fillInTheTotal')}} <el-input v-model="jsTime" @change="onBatchTimeChange" style="width:80px;"/> {{$t('time.hour')}}</span>
-                        
+
                         <!-- AI智能填报 -->
                         <el-button type="primary" @click="getAIReport()" v-if="!hasWrittenReport" style="margin-left:5px;" >智能填报</el-button>
                     </el-form-item>
                     <!--考勤时长显示-->
-                    <el-form-item :label="$t('other.attendancePunch')" v-if="workForm.time || user.companyId == 5978">
+                    <el-form-item :label="$t('other.attendancePunch')" v-if="workForm.showRefresh || user.companyId == 5978">
                         <span v-if="workForm.time">{{workForm.time.startTime}}-{{workForm.time.endTime}}, 工作{{workForm.time.workHours}}{{$t('time.hour')}}
                         <span v-if="workForm.time.askLeaveTime">|&nbsp;请假{{ workForm.time.askLeaveTime }}小时</span>
                         </span>
@@ -475,6 +475,20 @@
                                 <el-input :disabled="!domain.canEdit || domain.isOvertime==null || domain.isOvertime==0 || !domain.isOvertime" v-model="domain.overtimeHours" @blur="triggerCalculateOT(index)" @input="domain.overtimeHours=domain.overtimeHours.replace(/[^\d.]/g,'')" style="width: 100px;"></el-input><span style="margin-left:5px">{{$t('time.hour')}}</span>
                             </div>
                         </el-form-item>
+
+                        <el-form-item label="填报部门" v-if="user.timeType.userWithMultiDept == 1 && userReportDeptList.length > 0"
+                            :prop="'domains.' + index + '.reportTargetDeptId'"
+                            :rules="{ required: true, message: '请选择部门', trigger: ['change','blur'] }">
+                            <el-select v-model="domain.reportTargetDeptId" :placeholder="'请选择部门'" style="width:200px;" :clearable="true" v-if="user.userNameNeedTranslate == 0">
+                                <el-option v-for="depts in userReportDeptList" :key="depts.departmentId" :value="depts.departmentId" :label="depts.departmentName">
+                                    <span style="float: left">
+                                        <TranslationOpenDataText type='departmentName' :openid='depts.departmentName'></TranslationOpenDataText>
+                                    </span>
+                                </el-option>
+                            </el-select>
+
+                            <vueCascader :size="'medium'" :widthStr="'200'" :clearable="true" :other="index" :subjectId="[domain.reportTargetDeptId]" :subject="userReportDeptList" :radios="false" :distinction="'10'" @vueCasader="vueCasader" v-if="user.userNameNeedTranslate == 1"></vueCascader>
+                        </el-form-item>
                     
                         <el-form-item :label="$t('screening.inputProject')" :prop="'domains.' + index + '.projectId'"
                             :rules="{ required: true, message: $t('defaultText.pleaseSelectSnItem'), trigger: ['change','blur'] }">
@@ -551,7 +565,7 @@
                                 </el-select>
                             </template>
                             <template v-else-if="!user.timeType.hideStages"><!-- 项目的阶段 -->
-                                <span v-if="domain.stages != null && domain.stages.length> 0" style="margin-left:45px;">{{$t('other.inputStage')}}</span>
+                                <span v-if="domain.stages != null && domain.stages.length> 0" style="margin-left:45px;"><span v-if="user.companyId == 3092" style="color:red;margin-right: 4px">*</span>{{$t('other.inputStage')}}</span>
                                 <el-select v-model="domain.stage" :placeholder="$t('defaultText.pleaseChoose')" style="width:200px;margin-left:10px;" 
                                 clearable="true" v-if="domain.stages != null && domain.stages.length> 0"
                                 @change="changeStages(domain, index)"
@@ -780,7 +794,7 @@
                                 </el-select>
                                 <!-- 项目的阶段 -->
                                 <span v-if="domain.stages != null && domain.stages.length> 0" 
-                                    style="margin-left:30px;">{{$t('other.inputStage')}}</span>
+                                    style="margin-left:30px;"> {{$t('other.inputStage')}}</span>
                                 <el-select v-model="domain.stage" :placeholder="$t('defaultText.pleaseChoose')" style="width:200px;margin-left:10px;" 
                                 clearable="true" v-if="domain.stages != null && domain.stages.length> 0"
                                 @change="changeStages(domain, index)"
@@ -1366,7 +1380,7 @@
               :default-time="['12:00:00', '12:00:00']"
               size="small"
               popper-class="selecteorktime_datapick_popper"
-              @change="showMonthWorkTime('first')"
+              @change="showMonthWorkTime()"
             >
               </el-date-picker>
               <el-button size="small" @click="getDoubleLastWeek(1)">{{$t('time.twoWeeksAgo')}}</el-button>
@@ -1616,7 +1630,7 @@
 
         <el-tab-pane v-if="user.companyId==5978" :label="'工时异常明细'" name="third">
           <div class="selectworktime_export" style="margin-top:10px;">
-            <!-- <div class="selectworktime_export_l">
+            <div class="selectworktime_export_l">
               <el-date-picker
               class="selecteworktime_datapick"
               v-model="WorktimeDatepickValue"
@@ -1630,13 +1644,13 @@
               :default-time="['12:00:00', '12:00:00']"
               size="small"
               popper-class="selecteorktime_datapick_popper"
-              @change="showMonthWorkTime()"
+              @change="showMonthWorkTimeReminder()"
             >
               </el-date-picker>
-              <el-button size="small" @click="getDoubleLastWeek(1)">{{$t('time.twoWeeksAgo')}}</el-button>
-              <el-button size="small" @click="getLastWeek(1)">{{$t('time.lastWeek')}}</el-button>
-              <el-button size="small" @click="getThisWeek(1)">{{$t('time.nextWeek')}}</el-button>
-            </div> -->
+              <el-button size="small" @click="getDoubleLastWeek(2)">{{$t('time.twoWeeksAgo')}}</el-button>
+              <el-button size="small" @click="getLastWeek(2)">{{$t('time.lastWeek')}}</el-button>
+              <el-button size="small" @click="getThisWeek(2)">{{$t('time.nextWeek')}}</el-button>
+            </div>
             <div>
                 <el-input style="float:left;width:22%" v-if="user.userNameNeedTranslate != '1'" v-model="searchKeyword" class="input-with-select" :placeholder="$t('defaultText.pleaseEnterNametoSearch')" clearable="true" size="small">
                     <el-button slot="append" @click="searchScreen(0)" icon="el-icon-search"></el-button>
@@ -2246,6 +2260,7 @@
                         degreeId: null,
                         auditUserList: [],
                     }],
+                    showRefresh: false,
                 },
                 workRules: {
                     createDate: [{ required: true, message: this.$t('defaultText.pleaseselectaworkdate'), trigger: "change" }],
@@ -2402,7 +2417,8 @@
                 ],
                 pushWorkTimeLogDig:false,
                 pushWorkTimeLogData:[],
-                WorktimeDatepickValueForMonth:[],
+
+                userReportDeptList: []
             };
         },
         watch: {
@@ -2460,6 +2476,9 @@
             if (this.user.company.packageProject == 1) {
                 this.getBasecostItemList();
             }
+            if(this.user.timeType.userWithMultiDept == 1) {
+                this.getDeptMembData();
+            }
             if(this.user.timeType.lockWorktime){
                 this.timeRange = this.timeRange.filter(item => {return item <= this.user.timeType.allday})
             }
@@ -2488,6 +2507,25 @@
                 const isReportPictureRequired = permissionArray.some(item => item.id == companyId)
                 return isReportPictureRequired
             },
+            // 获取如何信息选的可填写部门
+            getDeptMembData() {
+                this.http.post('/user/getUserInfo', {userId: this.user.id}, res => {
+                    if (res.code == "ok") {
+                        let lists = res.data.userReportDeptList || []
+                        const optimizedList = lists.map(item => ({
+                            ...item,
+                            label: item.departmentName,
+                            value: item.departmentId,
+                        }));
+                        this.$set(this, 'userReportDeptList', optimizedList || []);
+                    } else {
+                        this.$message({
+                            message: res.msg,
+                            type: "error"
+                        });
+                    }
+                },error => { });  
+            },
             //任务被选中
             onTaskSelected(domainItem) {
                 //取服务
@@ -3804,14 +3842,14 @@
         let nowwd = [getauto[0],getauto[6]]
         this.WorktimeDatepickValue = nowwd
       }
-      this.showMonthWorkTime('first')
+      this.showMonthWorkTime()
     },
 
     handleClick(t,e){
       if (t.name == "second") {
         this.showMonthNotWorkTime()
       }else if(t.name == "first"){
-        this.showMonthWorkTime(t.name)
+        this.showMonthWorkTime()
       }else if(t.name == "third"){
         this.showMonthWorkTimeReminder()
       }
@@ -3844,8 +3882,8 @@
         "/report/exportUserDailyWorkTimeReminder",
         {
           // month: this.date,
-          startDate: this.WorktimeDatepickValueForMonth[0],
-          endDate: this.WorktimeDatepickValueForMonth[1],
+          startDate: this.WorktimeDatepickValue[0],
+          endDate: this.WorktimeDatepickValue[1],
         },
         (res) => {
           if (res.code == "ok") {
@@ -3910,20 +3948,12 @@
         }
     },
 
-    showMonthWorkTime(t) {
+    showMonthWorkTime() {
       this.monthTotalPage = 0,
         this.tbload = true
-        let parameter={}
-        if(t == "first"){
-            parameter={
-                startDate: this.WorktimeDatepickValue[0],
-                endDate: this.WorktimeDatepickValue[1],
-            }
-        }else{
-            parameter={
-                startDate: this.WorktimeDatepickValueForMonth[0],
-                endDate: this.WorktimeDatepickValueForMonth[1],
-            }
+        let parameter={
+            startDate: this.WorktimeDatepickValue[0],
+            endDate: this.WorktimeDatepickValue[1],
         }
       this.http.post(
         "/report/getUserDailyWorkTime",
@@ -3972,8 +4002,8 @@
         this.tbload = true
         let parameter={}
         parameter={
-            startDate: this.WorktimeDatepickValueForMonth[0],
-            endDate: this.WorktimeDatepickValueForMonth[1],
+            startDate: this.WorktimeDatepickValue[0],
+            endDate: this.WorktimeDatepickValue[1],
         }
       this.http.post(
         "/report/getUserDailyWorkTimeReminder",
@@ -4141,10 +4171,12 @@
       let newdate = new Date()
       let lastdate = newdate.toLocaleDateString(newdate.setDate(newdate.getDate() - 7))
       let lastwd = [this.getAutoWeekDate(lastdate)[0],this.getAutoWeekDate(lastdate)[6]]
-      if(e){
+      if(e==1){
         this.WorktimeDatepickValue = lastwd 
-        this.showMonthWorkTime('first')
-        
+        this.showMonthWorkTime()
+      }else if(e==2){
+        this.WorktimeDatepickValue = lastwd 
+        this.showMonthWorkTimeReminder()
       }else{
         this.WorktimeDatepickValue = lastwd 
         this.showMonthNotWorkTime()
@@ -4154,9 +4186,12 @@
       let newdate = new Date();
       let nowdate = newdate.toLocaleDateString();
       let nowwd = [this.getAutoWeekDate(nowdate)[0],this.getAutoWeekDate(nowdate)[6]]
-      if(e){
+      if(e==1){
+        this.WorktimeDatepickValue = nowwd 
+        this.showMonthWorkTime()
+      }else if(e==2){
         this.WorktimeDatepickValue = nowwd 
-        this.showMonthWorkTime('first')
+        this.showMonthWorkTimeReminder()
       }else{
         this.WorktimeDatepickValue = nowwd 
         this.showMonthNotWorkTime()
@@ -4166,9 +4201,12 @@
       let newdate = new Date()
       let nextdate = newdate.toLocaleDateString(newdate.setDate(newdate.getDate() - 14))
       let nextwd = [this.getAutoWeekDate(nextdate)[0],this.getAutoWeekDate(nextdate)[6]]
-      if(e){
+      if(e==1){
         this.WorktimeDatepickValue = nextwd 
-        this.showMonthWorkTime('first')
+        this.showMonthWorkTime()
+      }else if(e==2){
+        this.WorktimeDatepickValue = nextwd 
+        this.showMonthWorkTimeReminder()
       }else{
         this.WorktimeDatepickValue = nextwd 
         this.showMonthNotWorkTime()
@@ -5914,6 +5952,7 @@
                                     filteredRespList: filteredRespList,
                                     serviceList: list.report[i].serviceList,
                                     sapServiceId: list.report[i].sapServiceId,
+                                    reportTargetDeptId: list.report[i].deptId
                                 })
                                 if (list.report[i].state >= 2) {
                                     this.canEdit = true;
@@ -5944,7 +5983,8 @@
                                 domains: arr,
                                 userNames:null,
                                 userId:null,
-                                time: list.time
+                                time: list.time,
+                                showRefresh: list.showRefresh
                             }
                             console.log('workForm', this.workForm)
                         } else {
@@ -5968,7 +6008,8 @@
                                 }],
                                 userId:null,
                                 userNames:null,
-                                time: this.report.time
+                                time: this.report.time,
+                                showRefresh: list.showRefresh
                             }
                             if(this.isWeekend && this.user.timeType.lockWorktime != 1){
                                 this.$set(this.workForm.domains[0],'isOvertime',true)
@@ -7907,7 +7948,7 @@
                                 formData.append("progress", this.workForm.domains[i].progress);
                                 formData.append("workingTime", this.workForm.domains[i].workingTime);
                             } 
-
+                            
                             if(this.user.timeType.choseFromAlbum == 1 ) {
                                 console.log(this.workForm.domains[i].imgList)
                                 if(this.workForm.domains[i].imgList) {
@@ -8068,6 +8109,10 @@
                                 });
                                 return
                             }
+
+                            if(this.user.timeType.userWithMultiDept == 1) {
+                                formData.append('reportTargetDeptId', this.workForm.domains[i].reportTargetDeptId||0);
+                            }
                         }
                         this.submitingReport = true;
                         this.http.uploadFile( this.port.report.editPort, formData,
@@ -8286,6 +8331,11 @@
                     arr.push(obj.item.value)
                     this.exportParam.departmentId = arr
                 }
+
+                if(obj.distinction == '10' && obj) {
+                    const { id, other } = obj
+                    this.workForm.domains[other].reportTargetDeptId = id
+                }
             },
             //分页
             handleCurrentChange(val) {

+ 324 - 240
fhKeeper/formulahousekeeper/timesheet/src/views/workReport/list.vue

@@ -1,262 +1,280 @@
 <template>
-    <section>
+    <div class="review">
         <!--工具条-->
-        <el-col :span="24" class="toolbar" style="padding-bottom: 0px;">
-            <el-form :inline="true">
-                <el-form-item :label="$t('lable.department')" style="width: 165px">
-                    <el-cascader v-if="user.userNameNeedTranslate != 1" v-model="search.departmentIdArray" :placeholder="$t('defaultText.pleaseChoose')" style="width: 125px"
-                    :options="option" :props="{ checkStrictly: false,expandTrigger: 'hover' }" :show-all-levels="false" clearable
-                    @change="getList(1)" size="mini"></el-cascader>
+        <div class="reviewTop">
+            <el-col :span="24" class="toolbar" style="padding-bottom: 0px;">
+                <el-form :inline="true">
+                    <el-form-item :label="$t('lable.department')" style="width: 165px">
+                        <el-cascader v-if="user.userNameNeedTranslate != 1" v-model="search.departmentIdArray" :placeholder="$t('defaultText.pleaseChoose')" style="width: 125px"
+                        :options="option" :props="{ checkStrictly: false,expandTrigger: 'hover' }" :show-all-levels="false" clearable
+                        @change="getList(1)" size="mini"></el-cascader>
 
-                    <vueCascader :size="'mini'" :widthStr="'125'" :clearable="true" :subject="option" :radios="false" :distinction="'1'" @vueCasader="vueCasader" v-if="user.userNameNeedTranslate == 1"></vueCascader>
-                </el-form-item>
-
-                <el-form-item :label="'填报人'" style="width: 210px">
-                    <el-select v-if="user.userNameNeedTranslate != '1'" v-model="search.userIdArray" :placeholder="$t('defaultText.pleaseChoose')" clearable @visible-change="usersSearch" @remove-tag="usersSearch(false)" @clear="usersSearch(false)" filterable="true" size="mini" style="width: 150px" multiple collapse-tags>
-                        <el-option v-for="item in searchUsersList" :key="item.id" :label="item.name" :value="item.id">
-                            <span style="float: left" v-if="user.userNameNeedTranslate == '1'"><TranslationOpenDataText type='userName' :openid='item.name'></TranslationOpenDataText></span>
-                            <span style="float: left" v-if="user.userNameNeedTranslate != '1'">{{item.name}}</span>
-                        </el-option>
-                    </el-select>
+                        <vueCascader :size="'mini'" :widthStr="'125'" :clearable="true" :subject="option" :radios="false" :distinction="'1'" @vueCasader="vueCasader" v-if="user.userNameNeedTranslate == 1"></vueCascader>
+                    </el-form-item>
 
-                    <selectCat v-if="user.userNameNeedTranslate == '1'" :filterable="true" :size="'size'" :subject="searchUsersList" :clearable="true" :multiSelect="true" :distinction="'1'" @selectCal="selectCal"></selectCat>
-                    <!-- <selectCat :size="'size'" :subject="searchUsersList" :clearable="true" :filterable="true" @selectCal="selectCal"></selectCat> -->
-                </el-form-item>
+                    <el-form-item :label="'填报人'" style="width: 210px">
+                        <el-select v-if="user.userNameNeedTranslate != '1'" v-model="search.userIdArray" :placeholder="$t('defaultText.pleaseChoose')" clearable @visible-change="usersSearch" @remove-tag="usersSearch(false)" @clear="usersSearch(false)" filterable="true" size="mini" style="width: 150px" multiple collapse-tags>
+                            <el-option v-for="item in searchUsersList" :key="item.id" :label="item.name" :value="item.id">
+                                <span style="float: left" v-if="user.userNameNeedTranslate == '1'"><TranslationOpenDataText type='userName' :openid='item.name'></TranslationOpenDataText></span>
+                                <span style="float: left" v-if="user.userNameNeedTranslate != '1'">{{item.name}}</span>
+                            </el-option>
+                        </el-select>
 
-                <el-form-item :label="'审核人'" style="width: 210px">
-                    <el-select v-if="user.userNameNeedTranslate != '1'" v-model="search.auditUserId" :placeholder="$t('defaultText.pleaseChoose')" clearable @change="usersSearch(false)" size="mini" style="width: 150px" collapse-tags>
-                        <el-option v-for="item in searchUsersList" :key="item.id" :label="item.name" :value="item.id">
-                            <span style="float: left" v-if="user.userNameNeedTranslate == '1'"><TranslationOpenDataText type='userName' :openid='item.name'></TranslationOpenDataText></span>
-                            <span style="float: left" v-if="user.userNameNeedTranslate != '1'">{{item.name}}</span>
-                        </el-option>
-                    </el-select>
+                        <selectCat v-if="user.userNameNeedTranslate == '1'" :filterable="true" :size="'size'" :subject="searchUsersList" :clearable="true" :multiSelect="true" :distinction="'1'" @selectCal="selectCal"></selectCat>
+                        <!-- <selectCat :size="'size'" :subject="searchUsersList" :clearable="true" :filterable="true" @selectCal="selectCal"></selectCat> -->
+                    </el-form-item>
 
-                    <selectCat v-if="user.userNameNeedTranslate == '1'" :filterable="true" :size="'size'" :subject="searchUsersList" :clearable="true" :distinction="'2'" @selectCal="selectCal"></selectCat>
-                </el-form-item>
+                    <el-form-item :label="'审核人'" style="width: 210px">
+                        <el-select v-if="user.userNameNeedTranslate != '1'" v-model="search.auditUserId" :placeholder="$t('defaultText.pleaseChoose')" clearable @change="usersSearch(false)" size="mini" style="width: 150px" collapse-tags>
+                            <el-option v-for="item in searchUsersList" :key="item.id" :label="item.name" :value="item.id">
+                                <span style="float: left" v-if="user.userNameNeedTranslate == '1'"><TranslationOpenDataText type='userName' :openid='item.name'></TranslationOpenDataText></span>
+                                <span style="float: left" v-if="user.userNameNeedTranslate != '1'">{{item.name}}</span>
+                            </el-option>
+                        </el-select>
 
-                <el-form-item :label="$t('other.project')" style="width: 215px">
-                    <el-select v-model="search.projectId" :placeholder="$t('defaultText.pleaseChoose')" clearable @change="getList()" filterable="true" size="mini" style="width: 175px" popper-class="projectSelectPopperClass">
-                        <el-option v-for="item in projectList" :key="item.id" :label="item.projectName + item.projectCode" :value="item.id">
-                            <span style="float: left;color: #8492a6;">{{ item.projectCode }}</span>
-                            <span style="float: right;font-size: 13px;">{{ item.projectName }}</span>
-                        </el-option>
-                    </el-select>
-                </el-form-item>
-                <!-- <el-form-item   style="margin-left:20px;">
-                    <el-button @click="batchApprove(true)" style="margin-left:10px;" :loading="batchApproveLoading" :disabled="multipleSelection.length==0">批量通过</el-button>
-                    <el-button @click="batchApprove(false)"  :loading="batchDenyLoading"  :disabled="multipleSelection.length==0">批量驳回</el-button>
-                </el-form-item> -->
-                <!-- <div> -->
-                    
-                    <el-form-item :label="$t('weekDay.date')">
-                        <!-- <el-date-picker v-model="search.date" :editable="false" format="yyyy-MM-dd" value-format="yyyy-MM-dd" 
-                        @change="getList()" :clearable="true" type="date" placeholder="选择工作日期"></el-date-picker> -->
-                        <el-date-picker
-                            v-model="dataTime"
-                            type="daterange"
-                            :range-separator="$t('other.to')"
-                            :start-placeholder="$t('time.startDate')"
-                            :end-placeholder="$t('time.endDate')"
-                            format="yyyy-MM-dd" value-format="yyyy-MM-dd" @change="dataTimes()" size="mini">
-                        </el-date-picker>
+                        <selectCat v-if="user.userNameNeedTranslate == '1'" :filterable="true" :size="'size'" :subject="searchUsersList" :clearable="true" :distinction="'2'" @selectCal="selectCal"></selectCat>
                     </el-form-item>
 
-                    <el-form-item   style="margin-left:20px;">
-                        <el-button @click="batchApprove(true)" style="margin-left:10px;" :loading="batchApproveLoading" :disabled="multipleSelection.length==0" size="mini">{{ $t('Batchthrough') }}</el-button>
-                        <el-button @click="batchApprove(false)"   :disabled="multipleSelection.length==0" size="mini">{{ $t('Batchrejected') }}</el-button>
-                    </el-form-item>
-                    <el-form-item style="margin-left:20px;">
-                    <el-link type="primary" @click="recordList(),recordDialogVisible = true,pageIndexList = 1,pageSizeList = 20">{{ $t('Auditrecords') }}</el-link>
+                    <el-form-item :label="$t('other.project')" style="width: 215px">
+                        <el-select v-model="search.projectId" :placeholder="$t('defaultText.pleaseChoose')" clearable @change="getList()" filterable="true" size="mini" style="width: 175px" popper-class="projectSelectPopperClass">
+                            <el-option v-for="item in projectList" :key="item.id" :label="item.projectName + item.projectCode" :value="item.id">
+                                <span style="float: left;color: #8492a6;">{{ item.projectCode }}</span>
+                                <span style="float: right;font-size: 13px;">{{ item.projectName }}</span>
+                            </el-option>
+                        </el-select>
                     </el-form-item>
+                    <!-- <el-form-item   style="margin-left:20px;">
+                        <el-button @click="batchApprove(true)" style="margin-left:10px;" :loading="batchApproveLoading" :disabled="multipleSelection.length==0">批量通过</el-button>
+                        <el-button @click="batchApprove(false)"  :loading="batchDenyLoading"  :disabled="multipleSelection.length==0">批量驳回</el-button>
+                    </el-form-item> -->
+                    <!-- <div> -->
+                        
+                        <el-form-item :label="$t('weekDay.date')">
+                            <!-- <el-date-picker v-model="search.date" :editable="false" format="yyyy-MM-dd" value-format="yyyy-MM-dd" 
+                            @change="getList()" :clearable="true" type="date" placeholder="选择工作日期"></el-date-picker> -->
+                            <el-date-picker
+                                v-model="dataTime"
+                                type="daterange"
+                                :range-separator="$t('other.to')"
+                                :start-placeholder="$t('time.startDate')"
+                                :end-placeholder="$t('time.endDate')"
+                                format="yyyy-MM-dd" value-format="yyyy-MM-dd" @change="dataTimes()" size="mini">
+                            </el-date-picker>
+                        </el-form-item>
+
+                        <el-form-item   style="margin-left:20px;">
+                            <el-button @click="batchApprove(true)" style="margin-left:10px;" :loading="batchApproveLoading" :disabled="multipleSelection.length==0" size="mini">{{ $t('Batchthrough') }}</el-button>
+                            <el-button @click="batchApprove(false)"   :disabled="multipleSelection.length==0" size="mini">{{ $t('Batchrejected') }}</el-button>
+                        </el-form-item>
+                        <el-form-item style="margin-left:20px;">
+                        <el-link type="primary" @click="recordList(),recordDialogVisible = true,pageIndexList = 1,pageSizeList = 20">{{ $t('Auditrecords') }}</el-link>
+                        </el-form-item>
 
-                    <!-- 调试 -->
-                    <!-- <cascaderOption></cascaderOption> -->
-                <!-- </div> -->
-            </el-form>
-        </el-col>
+                        <!-- 调试 -->
+                        <!-- <cascaderOption></cascaderOption> -->
+                    <!-- </div> -->
+                </el-form>
+            </el-col>
+        </div>
+        
         <!--列表-->
-        <el-table :data="list" ref="multipleTable" v-if="showTable" highlight-current-row v-loading="listLoading" :height="tableHeight" style="width: 100%;"
-            @selection-change="handleSelectionChange" :default-expand-all="defaultExpandAllFlg" @expand-change="expandChange">
-            <el-table-column type="selection" width="55"></el-table-column>
-            <el-table-column type="expand" :label="''">
-                <template slot="header">
-                    <i :class="defaultExpandAllFlg ? 'el-icon-arrow-down' : 'el-icon-arrow-right'" style="cursor: pointer;" @click="defaultExpandAllFlgCli()"></i>
-                </template>
-                <template slot-scope="props">
-                    <el-timeline>
-                        <el-timeline-item v-for="(item,index) in props.row.data" :key="index">
-                            <el-card shadow="never">
-                                <p>{{ $t('other.project') + ':' }}<b>{{item.projectCode+'/'+item.project}}<span v-if="item.subProjectName != null"> / {{item.subProjectName}}</span>
-                                <span style="margin-left:15px;color:#DAA520;" >[ 
-                                                <span v-if="item.isDeptAudit==0">
-                                                    <span v-if="item.projectAuditState==0">
-                                                        {{ $t('other.waitForTheProjectReviewer') }}<span v-if="item.projectAuditorName != null">(
-                                                            <!-- {{item.projectAuditorName}} -->
-                                                            <span v-if="user.userNameNeedTranslate == '1'"><TranslationOpenDataText type='userName' :openid='item.projectAuditorName'></TranslationOpenDataText></span>
-                                                            <span v-if="user.userNameNeedTranslate != '1'">{{item.projectAuditorName}}</span>
-                                                            )</span>{{ $t('other.audit') }}
+        <div class="reviewTable" ref="reviewTable">
+            <el-table :data="list" ref="multipleTable" v-if="showTable" :height="reviewTableHeight" :key="reviewTableHeightKey" highlight-current-row v-loading="listLoading" style="width: 100%;"
+                @selection-change="handleSelectionChange" :default-expand-all="defaultExpandAllFlg" @expand-change="expandChange">
+                <el-table-column type="selection" width="55"></el-table-column>
+                <el-table-column type="expand" :label="''">
+                    <template slot="header">
+                        <i :class="defaultExpandAllFlg ? 'el-icon-arrow-down' : 'el-icon-arrow-right'" style="cursor: pointer;" @click="defaultExpandAllFlgCli()"></i>
+                    </template>
+                    <template slot-scope="props">
+                        <el-timeline>
+                            <el-timeline-item v-for="(item,index) in props.row.data" :key="index">
+                                <el-card shadow="never">
+                                    <p>{{ $t('other.project') + ':' }}<b>{{item.projectCode+'/'+item.project}}<span v-if="item.subProjectName != null"> / {{item.subProjectName}}</span>
+                                    <span style="margin-left:15px;color:#DAA520;" >[ 
+                                                    <span v-if="item.isDeptAudit==0">
+                                                        <span v-if="item.projectAuditState==0">
+                                                            {{ $t('other.waitForTheProjectReviewer') }}<span v-if="item.projectAuditorName != null">(
+                                                                <!-- {{item.projectAuditorName}} -->
+                                                                <span v-if="user.userNameNeedTranslate == '1'"><TranslationOpenDataText type='userName' :openid='item.projectAuditorName'></TranslationOpenDataText></span>
+                                                                <span v-if="user.userNameNeedTranslate != '1'">{{item.projectAuditorName}}</span>
+                                                                )</span>{{ $t('other.audit') }}
+                                                        </span>
+                                                        <span style="color:#32CD32;" v-else-if="item.projectAuditState==1">
+                                                            {{ $t('other.projectAuditor') }}<span v-if="item.projectAuditorName != null">(
+                                                                <!-- {{item.projectAuditorName}} -->
+                                                                <span v-if="user.userNameNeedTranslate == '1'"><TranslationOpenDataText type='userName' :openid='item.projectAuditorName'></TranslationOpenDataText></span>
+                                                                <span v-if="user.userNameNeedTranslate != '1'">{{item.projectAuditorName}}</span>
+                                                            )</span>{{ $t('state.approved') }}
+                                                        </span>
                                                     </span>
-                                                    <span style="color:#32CD32;" v-else-if="item.projectAuditState==1">
-                                                        {{ $t('other.projectAuditor') }}<span v-if="item.projectAuditorName != null">(
-                                                            <!-- {{item.projectAuditorName}} -->
-                                                            <span v-if="user.userNameNeedTranslate == '1'"><TranslationOpenDataText type='userName' :openid='item.projectAuditorName'></TranslationOpenDataText></span>
-                                                            <span v-if="user.userNameNeedTranslate != '1'">{{item.projectAuditorName}}</span>
-                                                        )</span>{{ $t('state.approved') }}
+                                                    <span v-else-if="item.isDeptAudit==1">
+                                                        <!-- {{($t('other.await') +item.auditDeptName+('('+item.deptAuditorName+')')+ $t('other.audit'))}} -->
+                                                        ({{$t('other.await')}}
+                                                        <span v-if="user.userNameNeedTranslate == '1'"><TranslationOpenDataText type='departmentName' :openid='item.auditDeptName'></TranslationOpenDataText></span>
+                                                        <span v-if="user.userNameNeedTranslate != '1'">{{item.auditDeptName}}</span>
+                                                        (<span v-if="user.userNameNeedTranslate == '1'"><TranslationOpenDataText type='userName' :openid='item.deptAuditorName'></TranslationOpenDataText></span>
+                                                        <span v-if="user.userNameNeedTranslate != '1'">{{item.deptAuditorName}}</span>)
+                                                        {{$t('other.audit')}})
                                                     </span>
-                                                </span>
-                                                <span v-else-if="item.isDeptAudit==1">
-                                                    <!-- {{($t('other.await') +item.auditDeptName+('('+item.deptAuditorName+')')+ $t('other.audit'))}} -->
-                                                    ({{$t('other.await')}}
-                                                    <span v-if="user.userNameNeedTranslate == '1'"><TranslationOpenDataText type='departmentName' :openid='item.auditDeptName'></TranslationOpenDataText></span>
-                                                    <span v-if="user.userNameNeedTranslate != '1'">{{item.auditDeptName}}</span>
-                                                    (<span v-if="user.userNameNeedTranslate == '1'"><TranslationOpenDataText type='userName' :openid='item.deptAuditorName'></TranslationOpenDataText></span>
-                                                    <span v-if="user.userNameNeedTranslate != '1'">{{item.deptAuditorName}}</span>)
-                                                    {{$t('other.audit')}})
-                                                </span>
-                                                 ]
-                                </span>
-                                </b></p>
-                                <p v-if="user.timeType.reportAuditType == 6" >审核流程:<span v-if="item.auditorList && item.auditorList.length == 1">一层审核(<span style="color:#20A0ff;">{{ item.auditorList[0].name }}</span>)</span>
-                                <span v-if="item.auditorList && item.auditorList.length == 2">两层审核(<span style="color:#20A0ff;">{{ item.auditorList[0].name }}->{{ item.auditorList[1].name }}</span>)</span>
-                                <el-button size="small" @click="viewOneReport(item)" v-if="!item.auditorList">查看</el-button>
-                                </p>
-                                <p v-if="user.timeType.customDegreeActive==1 && (item.degree_id != null || item.multiDegrId != '[]')">{{user.timeType.customDegreeName}}:{{item.degreeName}}</p>
-                                <p v-if="user.timeType.customDataActive==1">{{user.timeType.customDataName}}:{{item.customData}}</p>
-                                <p v-if="user.timeType.customTextActive==1">{{user.timeType.customTextName}}:{{item.customText}}</p>
-                                <p v-if="user.company.packageEngineering == 1">
-                                    {{ $t('other.professionalProgress') +':'}} <span style="margin-right:10px;" v-for="progressItem in item.professionProgressList" :key="progressItem.id">
-                                        {{progressItem.professionName}}({{progressItem.progress}}%)
-                                        <el-tooltip v-if="progressItem.auditState == 0"  :content="$t('state.WaitingAudit')" effect="light" placement="top">
-                                        <i class="iconfont firerock-icondaibandengdaishenhe"></i>
-                                        </el-tooltip>
-                                        <el-tooltip v-if="progressItem.auditState == 1" :content="$t('state.alreadyPassed')" effect="light" placement="top">
-                                        <i  class="iconfont firerock-iconshenhetongguo"></i>
-                                        </el-tooltip>
-                                        <el-tooltip v-if="progressItem.auditState == 2" :content="$t('state.notThrough')" effect="light" placement="top">
-                                        <i  class="iconfont firerock-iconshenhebohui"></i>
-                                        </el-tooltip>
-                                        </span> 
-                                </p>
-                                <p v-if="user.companyId == yuzhongCompId">
-                                                        <span>角色:{{item.extraField1? roleList.filter(r=>r.value == item.extraField1)[0].label:''}}</span>
-                                                    <span style="margin-left:10px;">工作职责:{{ item.extraField2? item.extraField2Name:''}}</span>
-                                                    <span style="margin-left:10px;">工作内容:{{ item.extraField3? item.extraField3Name:''}}</span></p>
-                                <p v-if="item.taskId != null">{{$t('other.task')}}:{{item.taskName}}
-                                    <span style="margin-left:10px;" v-if="user.companyId==3092">-- 服务:{{ item.sapServiceName }}</span></p>
-                                <p v-if="item.groupId">
-                                    <span>{{$t('other.taskGroup')}}:{{item.groupName}}</span>
-                                    <!-- 阶段 -->
-                                    <span v-if="item.stage != null && user.companyId != yuzhongCompId" style="margin-left:10px;"> {{$t('other.inputStage')}}:{{item.stage}}</span>
-                                </p>
-                                <p v-if="user.company.companyName == '成都明夷电子科技有限公司'">
-                                    <span>用时占比:{{ item.progress }}%</span>
-                                </p>
-                                <p v-else>
-                                    <span v-if="item.multiWorktime==1">{{ $t('other.project') }}</span>
-                                    <span>{{$t('time.duration')}}:</span>
-                                    <span v-if="item.startTime">{{ item.startTime + '-' + item.endTime }}</span>
-                                    <span>{{item.time.toFixed(1)}}h </span>
-                                    <span class="propsbtn" v-if="item.isOvertime === 1">
-                                    <el-tag type="danger" size="mini" style="margin-left: 65px">{{ $t('other.WorkOvertime') }}<span v-if="item.overtimeHours">{{item.overtimeHours.toFixed(1)}}{{$t('time.hour')}}</span></el-tag></span>
-                                </p>
+                                                    ]
+                                    </span>
+                                    </b></p>
+                                    <p v-if="user.timeType.reportAuditType == 6" >审核流程:<span v-if="item.auditorList && item.auditorList.length == 1">一层审核(<span style="color:#20A0ff;">{{ item.auditorList[0].name }}</span>)</span>
+                                    <span v-if="item.auditorList && item.auditorList.length == 2">两层审核(<span style="color:#20A0ff;">{{ item.auditorList[0].name }}->{{ item.auditorList[1].name }}</span>)</span>
+                                    <el-button size="small" @click="viewOneReport(item)" v-if="!item.auditorList">查看</el-button>
+                                    </p>
+                                    <p v-if="user.timeType.customDegreeActive==1 && (item.degree_id != null || item.multiDegrId != '[]')">{{user.timeType.customDegreeName}}:{{item.degreeName}}</p>
+                                    <p v-if="user.timeType.customDataActive==1">{{user.timeType.customDataName}}:{{item.customData}}</p>
+                                    <p v-if="user.timeType.customTextActive==1">{{user.timeType.customTextName}}:{{item.customText}}</p>
+                                    <p v-if="user.company.packageEngineering == 1">
+                                        {{ $t('other.professionalProgress') +':'}} <span style="margin-right:10px;" v-for="progressItem in item.professionProgressList" :key="progressItem.id">
+                                            {{progressItem.professionName}}({{progressItem.progress}}%)
+                                            <el-tooltip v-if="progressItem.auditState == 0"  :content="$t('state.WaitingAudit')" effect="light" placement="top">
+                                            <i class="iconfont firerock-icondaibandengdaishenhe"></i>
+                                            </el-tooltip>
+                                            <el-tooltip v-if="progressItem.auditState == 1" :content="$t('state.alreadyPassed')" effect="light" placement="top">
+                                            <i  class="iconfont firerock-iconshenhetongguo"></i>
+                                            </el-tooltip>
+                                            <el-tooltip v-if="progressItem.auditState == 2" :content="$t('state.notThrough')" effect="light" placement="top">
+                                            <i  class="iconfont firerock-iconshenhebohui"></i>
+                                            </el-tooltip>
+                                            </span> 
+                                    </p>
+                                    <p v-if="user.companyId == yuzhongCompId">
+                                                            <span>角色:{{item.extraField1? roleList.filter(r=>r.value == item.extraField1)[0].label:''}}</span>
+                                                        <span style="margin-left:10px;">工作职责:{{ item.extraField2? item.extraField2Name:''}}</span>
+                                                        <span style="margin-left:10px;">工作内容:{{ item.extraField3? item.extraField3Name:''}}</span></p>
+                                    <p v-if="item.taskId != null">{{$t('other.task')}}:{{item.taskName}}
+                                        <span style="margin-left:10px;" v-if="user.companyId==3092">-- 服务:{{ item.sapServiceName }}</span></p>
+                                    <p v-if="item.groupId">
+                                        <span>{{$t('other.taskGroup')}}:{{item.groupName}}</span>
+                                        <!-- 阶段 -->
+                                        <span v-if="item.stage != null && user.companyId != yuzhongCompId" style="margin-left:10px;"> {{$t('other.inputStage')}}:{{item.stage}}</span>
+                                    </p>
+                                    <p v-if="user.company.companyName == '成都明夷电子科技有限公司'">
+                                        <span>用时占比:{{ item.progress }}%</span>
+                                    </p>
+                                    <p v-else>
+                                        <span v-if="item.multiWorktime==1">{{ $t('other.project') }}</span>
+                                        <span>{{$t('time.duration')}}:</span>
+                                        <span v-if="item.startTime">{{ item.startTime + '-' + item.endTime }}</span>
+                                        <span>{{item.time.toFixed(1)}}h </span>
+                                        <span class="propsbtn" v-if="item.isOvertime === 1">
+                                        <el-tag type="danger" size="mini" style="margin-left: 65px">{{ $t('other.WorkOvertime') }}<span v-if="item.overtimeHours">{{item.overtimeHours.toFixed(1)}}{{$t('time.hour')}}</span></el-tag></span>
+                                    </p>
 
-                                <div v-if="item.multiWorktime==0">
-                                <p>{{ $t('other.matters') }}:<span v-html="item.content"></span></p>
-                                </div>
-                                <div v-if="item.multiWorktime==1" >
-                                    <div v-for="(timeItem, tIndex) in item.worktimeList" :key="tIndex"
-                                        style="border: 0.5px #ddd solid;margin:5px 0px;padding:5px; ">
-                                        <p style="line-height:20px;margin:5px 0px;">{{$t('time.duration')}}:
-                                            <span v-if="item.reportTimeType == 2" style="margin-right:10px;">{{timeItem.startTime+'-'+timeItem.endTime}}</span>
-                                        {{timeItem.time.toFixed(1)}}h  
-                                        </p>
-                                        <p style="line-height:20px;margin:5px 0px;">{{ $t('other.matters') }}:<span v-html="timeItem.content"></span></p>
+                                    <div v-if="item.multiWorktime==0">
+                                    <p>{{ $t('other.matters') }}:<span v-html="item.content"></span></p>
+                                    </div>
+                                    <div v-if="item.multiWorktime==1" >
+                                        <div v-for="(timeItem, tIndex) in item.worktimeList" :key="tIndex"
+                                            style="border: 0.5px #ddd solid;margin:5px 0px;padding:5px; ">
+                                            <p style="line-height:20px;margin:5px 0px;">{{$t('time.duration')}}:
+                                                <span v-if="item.reportTimeType == 2" style="margin-right:10px;">{{timeItem.startTime+'-'+timeItem.endTime}}</span>
+                                            {{timeItem.time.toFixed(1)}}h  
+                                            </p>
+                                            <p style="line-height:20px;margin:5px 0px;">{{ $t('other.matters') }}:<span v-html="timeItem.content"></span></p>
+                                        </div>
                                     </div>
-                                </div>
 
-                                <!--照片的显示 -->
-                                <p v-if="item.pics != null && item.pics.length > 0"> 
-                                    <el-image v-for="(pic, index) in item.pics" :key="index"
-                                        style="width: 100px; height: 100px; margin-right:10px;"
-                                        :src="pic" 
-                                        :preview-src-list="item.pics">
-                                    </el-image>
-                                </p>
-                            </el-card>
-                        </el-timeline-item>
-                    </el-timeline>
-                </template>
-            </el-table-column>
-            
-            <el-table-column prop="name" :label="$t('lable.name')" sortable>
-                <template slot-scope="scope">
-                    <div>
-                        <span v-if="user.userNameNeedTranslate == '1'">
-                            <TranslationOpenDataText type='userName' :openid='scope.row.name'></TranslationOpenDataText>
-                        </span>
-                        <span v-else>
-                            {{scope.row.name}}
-                        </span>
-                    </div>
-                </template>
-            </el-table-column>
-            <el-table-column prop="departmentName" :label="$t('lable.department')" sortable>
-                <template slot-scope="scope">
-                    <div>
-                        <span v-if="user.userNameNeedTranslate == '1'">
-                            <TranslationOpenDataText type='departmentName' :openid='scope.row.departmentName'></TranslationOpenDataText>
-                        </span>
-                        <span v-else>
-                            {{scope.row.departmentName}}
-                        </span>
-                    </div>
-                </template>
-            </el-table-column>
-            <el-table-column prop="dateStr" :label="$t('weekDay.date')" sortable>
-            </el-table-column>
-            <el-table-column prop="reportTime" :label="$t('screening.workTime') + '(h)'" >
-                <template slot-scope="scope">
-                    {{scope.row.reportTime | amounts}}
-                </template>
-            </el-table-column>
-             <el-table-column prop="cardHours" :label="$t('workAttendance') + '(h)'" v-if="user.timeType.showCorpwxCardtime==1||user.timeType.showDdCardtime==1">
-                <template slot-scope="scope">
-                    {{scope.row.cardHours?scope.row.cardHours.toFixed(1):'-'}}
-                </template>
-            </el-table-column>
-            <el-table-column prop="state" :label="$t('state.states')" sortable>
-                <template slot-scope="scope">
-                    <span v-if="scope.row.state == 0" style="color:#DAA520;">
-                        <span v-if="user.userNameNeedTranslate != '1'">
-                            <span v-if="user.company.companyName != '成都明夷电子科技有限公司'">
-                                {{scope.row.isDeptAudit==0?$t('other.Tobereviewedbytheprojectreviewer'):($t('other.await')+scope.row.auditDeptName+('('+scope.row.deptAuditorName+')')+$t('other.audit'))}}
+                                    <!--照片的显示 -->
+                                    <p v-if="item.pics != null && item.pics.length > 0"> 
+                                        <el-image v-for="(pic, index) in item.pics" :key="index"
+                                            style="width: 100px; height: 100px; margin-right:10px;"
+                                            :src="pic" 
+                                            :preview-src-list="item.pics">
+                                        </el-image>
+                                    </p>
+                                </el-card>
+                            </el-timeline-item>
+                        </el-timeline>
+                    </template>
+                </el-table-column>
+                
+                <el-table-column prop="name" :label="$t('lable.name')" sortable>
+                    <template slot-scope="scope">
+                        <div>
+                            <span v-if="user.userNameNeedTranslate == '1'">
+                                <TranslationOpenDataText type='userName' :openid='scope.row.name'></TranslationOpenDataText>
                             </span>
                             <span v-else>
-                                待审核
+                                {{scope.row.name}}
+                            </span>
+                        </div>
+                    </template>
+                </el-table-column>
+                <el-table-column prop="departmentName" :label="$t('lable.department')" sortable>
+                    <template slot-scope="scope">
+                        <div>
+                            <span v-if="user.userNameNeedTranslate == '1'">
+                                <TranslationOpenDataText type='departmentName' :openid='scope.row.departmentName'></TranslationOpenDataText>
                             </span>
-                        </span>
-                        <span v-if="user.userNameNeedTranslate == '1'">
-                            <span v-if="scope.row.isDeptAudit==0">{{$t('other.Tobereviewedbytheprojectreviewer')}}</span>
                             <span v-else>
-                                {{$t('other.await')}}
-                                <TranslationOpenDataText type='departmentName' :openid='scope.row.auditDeptName'></TranslationOpenDataText>
-                                (<TranslationOpenDataText type='userName' :openid='scope.row.deptAuditorName'></TranslationOpenDataText>)
-                                {{$t('other.audit')}}
+                                {{scope.row.departmentName}}
+                            </span>
+                        </div>
+                    </template>
+                </el-table-column>
+                <el-table-column prop="dateStr" :label="$t('weekDay.date')" sortable>
+                </el-table-column>
+                <el-table-column prop="reportTime" :label="$t('screening.workTime') + '(h)'" >
+                    <template slot-scope="scope">
+                        {{scope.row.reportTime | amounts}}
+                    </template>
+                </el-table-column>
+                <el-table-column prop="cardHours" :label="$t('workAttendance') + '(h)'" v-if="user.timeType.showCorpwxCardtime==1||user.timeType.showDdCardtime==1">
+                    <template slot-scope="scope">
+                        {{scope.row.cardHours?scope.row.cardHours.toFixed(1):'-'}}
+                    </template>
+                </el-table-column>
+                <el-table-column prop="state" :label="$t('state.states')" sortable>
+                    <template slot-scope="scope">
+                        <span v-if="scope.row.state == 0" style="color:#DAA520;">
+                            <span v-if="user.userNameNeedTranslate != '1'">
+                                <span v-if="user.company.companyName != '成都明夷电子科技有限公司'">
+                                    {{scope.row.isDeptAudit==0?$t('other.Tobereviewedbytheprojectreviewer'):($t('other.await')+scope.row.auditDeptName+('('+scope.row.deptAuditorName+')')+$t('other.audit'))}}
+                                </span>
+                                <span v-else>
+                                    待审核
+                                </span>
+                            </span>
+                            <span v-if="user.userNameNeedTranslate == '1'">
+                                <span v-if="scope.row.isDeptAudit==0">{{$t('other.Tobereviewedbytheprojectreviewer')}}</span>
+                                <span v-else>
+                                    {{$t('other.await')}}
+                                    <TranslationOpenDataText type='departmentName' :openid='scope.row.auditDeptName'></TranslationOpenDataText>
+                                    (<TranslationOpenDataText type='userName' :openid='scope.row.deptAuditorName'></TranslationOpenDataText>)
+                                    {{$t('other.audit')}}
+                                </span>
                             </span>
                         </span>
-                    </span>
-                    <span v-else-if="scope.row.state == 1" style="color:#32CD32;">{{ $t('state.alreadyPassed') }}</span>
-                    <span v-else-if="scope.row.state == 2" style="color:#FF0000;">{{ $t('state.rejected') }}</span>
-                </template>
-            </el-table-column>
-            <el-table-column :label="$t('operation')" width="220">
-                <template slot-scope="scope">
-                    <el-button type="primary" :loading="logining" size="small" @click="approve(scope.row.id,scope.row.date, scope.row)">{{ $t('btn.through') }}</el-button>
-                    <el-button type="danger" :loading="logining" size="small" @click="showDenyDialog(scope.row.id,0,scope.row.dateStr, scope.row)">{{ $t('btn.rejected') }}</el-button>
-                </template>
-            </el-table-column>
-        </el-table>
-        <!--驳回弹出框 -->
+                        <span v-else-if="scope.row.state == 1" style="color:#32CD32;">{{ $t('state.alreadyPassed') }}</span>
+                        <span v-else-if="scope.row.state == 2" style="color:#FF0000;">{{ $t('state.rejected') }}</span>
+                    </template>
+                </el-table-column>
+                <el-table-column :label="$t('operation')" width="220">
+                    <template slot-scope="scope">
+                        <el-button type="primary" :loading="logining" size="small" @click="approve(scope.row.id,scope.row.date, scope.row)">{{ $t('btn.through') }}</el-button>
+                        <el-button type="danger" :loading="logining" size="small" @click="showDenyDialog(scope.row.id,0,scope.row.dateStr, scope.row)">{{ $t('btn.rejected') }}</el-button>
+                    </template>
+                </el-table-column>
+            </el-table>
+        </div>
+
+        <!-- 分页 -->
+        <div class="reviewPaging">
+            <el-pagination
+                @size-change="reviewHandleSizeChange"
+                @current-change="reviewHandleCurrentChange"
+                :current-page="reviewTableObj.reviewTableIndex"
+                :page-sizes="[50, 200, 500, 1000, 2000]"
+                :page-size="reviewTableObj.reviewTableSize"
+                layout="total, prev, pager, next, sizes"
+                :total="reviewTableObj.reviewTableTotal"
+            >
+            </el-pagination>
+        </div>        <!--驳回弹出框 -->
         <el-dialog :title="$t('defaultText.pleaseEnterTheReason')"  v-if="denyReasonDialog" :visible.sync="denyReasonDialog" :close-on-click-modal="false" customClass="customWidth" width="500px">
             <div>
                 <el-input type="textarea" v-model="denyForm.reason" rows="2" :placeholder="$t('defaultText.pleaseEnterYourDecision')+(denyForm.i==0?$t('btn.rejected'):$t('btn.undo'))+$t('other.reason')" />
@@ -432,7 +450,7 @@
                 <el-button type="primary" @click="approveinfun()" v-else>{{ $t('btn.determine') }}</el-button>
             </div>
         </el-dialog>
-    </section>
+    </div>
 </template>
 
 <script>
@@ -511,7 +529,16 @@
                 isbatch: false,
                 defaultExpandAllFlg: false,
                 showTable: true,
-                projectList: []
+                projectList: [],
+                reviewTableHeight: 0,
+                reviewTableHeightKey: 1,
+
+                reviewTableObj: {
+                    reviewTableTotal: 0,
+                    reviewTableIndex: 1,
+                    reviewTableSize: +(localStorage.getItem("reviewTableSize") || '50'),
+                },
+                listBackup: []
             };
         },
         filters: {
@@ -787,6 +814,34 @@
                     this.getList()
                 }
             },
+            reviewHandleSizeChange(val) {
+                this.showListLoading()
+                this.reviewTableObj.reviewTableSize = val,
+                this.reviewTableObj.reviewTableIndex = 1
+                localStorage.setItem('reviewTableSize', JSON.stringify(val))
+                this.list = this.currentChangePage(val, 1, this.listBackup);
+            },
+            reviewHandleCurrentChange(val) {
+                this.showListLoading()
+                this.reviewTableObj.reviewTableIndex = val
+                this.list = this.currentChangePage(this.reviewTableObj.reviewTableSize, val, this.listBackup);
+            },
+            showListLoading() {
+                this.listLoading = true,
+                setTimeout(() => {
+                    this.listLoading = false;
+                }, 500);
+            },
+            currentChangePage(size, current, list) {
+                const tablePush = [];
+                let array = JSON.parse(JSON.stringify(list));
+                array.forEach((item, index) => {
+                    if (size * (current - 1) <= index && index <= size * current - 1) {
+                    tablePush.push(item);
+                    }
+                });
+                return tablePush;
+            },
             //获取待审核的数据列表
             getList(e) {
                 this.listLoading = true;
@@ -820,7 +875,14 @@
                 res => {
                     this.listLoading = false;
                     if (res.code == "ok") {
-                        this.list = res.data;
+                        this.listBackup = JSON.parse(JSON.stringify(res.data));
+                        this.list = this.currentChangePage(10, 1, res.data);
+                        let total = res.data.length || 0
+                        this.reviewTableObj = {
+                            reviewTableTotal: total,
+                            reviewTableIndex: 1,
+                            reviewTableSize: this.reviewTableObj.reviewTableSize
+                        }
                         // console.log(this.port.report.portList);
                     } else {
                         this.$message({
@@ -1060,6 +1122,8 @@
             };
         },
         mounted() {
+            this.reviewTableHeight = this.$refs.reviewTable.offsetHeight
+            this.reviewTableHeightKey++
             this.getList();
             this.getDepartment();
             this.getProjectList();
@@ -1068,10 +1132,30 @@
     };
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .propsbtn {
     display: inline-block;
     padding-left: 20px;
 }
 
+.review {
+    width: 100%;
+    height: calc(100vh - 60px);
+    display: flex;
+    flex-direction: column;
+    .reviewTable {
+        flex: 1;
+        position: relative;
+        overflow: hidden;
+    }
+    .reviewPaging {
+        padding: 10px 20px;
+        display: flex;
+        justify-content: flex-end;
+        width: 100%;
+        margin-top: 2px solid #999;
+        box-sizing: border-box;
+    }
+}
+
 </style>

+ 2 - 0
fhKeeper/formulahousekeeper/timesheet_h5/public/index.html

@@ -9,6 +9,8 @@
     <link rel="shortcut icon" type="image/x-icon" href="./favicon.ico"/>
     <title>工时管家</title>
     <!-- <script src="/axios.min.js"></script> -->
+    <!--接入钉钉前端组件,进行通讯录组件展示-->
+    <script src="https://auth.dingtalk.com/opendata-1.1.0.js"></script>
     <link rel="stylesheet" href="https://at.alicdn.com/t/font_1456778_1mgn5degp7t.css">
     <!-- <script src="https://cdn.bootcss.com/axios/0.19.0-beta.1/axios.min.js"></script> -->
     <!-- <script src="https://cdn.bootcdn.net/ajax/libs/axios/0.25.0/axios.min.js"></script> -->

+ 9 - 4
fhKeeper/formulahousekeeper/timesheet_h5/src/components/translationOpenDataText.vue

@@ -1,11 +1,11 @@
 <template>
     <div class="translation">
         <!-- 文本 -->
-        <span v-if="corporateWeChat">
+        <span v-if="corporateWeChat && !noRender.includes(openIdValue)">
             <ww-open-data :type='type' :openid='openIdValue'></ww-open-data>
         </span>
-        <span v-else-if="dingdingPlatform">
-            <dt-open-data :open-type='type' :open-id='openIdValue'></dt-open-data>
+        <span v-else-if="dingdingPlatform && !noRender.includes(openIdValue)">
+            <dt-open-data :open-type='dingdingOpenType[type]' :open-id='openIdValue'></dt-open-data>
         </span>
         <span v-else>{{ openIdValue }}</span>
     </div>
@@ -33,7 +33,12 @@ export default {
             corporateWeChat: false, // 企业微信转译
             dingdingPlatform: false, // 钉钉转译
 
-            openIdValue: ''
+            openIdValue: '',
+            noRender: ['全部人员', '未分配'],
+            dingdingOpenType: {
+                userName: 'userName',
+                departmentName: 'deptName',
+            }
         }
     },
     computed: {},

+ 68 - 2
fhKeeper/formulahousekeeper/timesheet_h5/src/views/edit/index.vue

@@ -69,8 +69,14 @@
                         type="default"><span style="color:#666;padding: 0 5px;">删除</span></van-tag>
                 </div>
                 <!-- <van-icon v-if="index>0&&canEdit" class="form_del" name="delete" @click="delPro(index)" /> -->
-
                 <van-cell-group :title="(user.companyId == 781 ? '任务' : '项目') + (index + 1)">
+                    <van-field readonly name="userReportDeptName" v-if="user.timeType.userWithMultiDept == 1 && userReportDeptList.length > 0"
+                        :value="item.userReportDeptName" :label="'填报部门'" placeholder="请选择部门" @click="selectDeptPopup(index, item)">
+                        <template #input>
+                            <TranslationOpenDataText type='departmentName' :openid='item.userReportDeptName'></TranslationOpenDataText>
+                        </template>
+                    </van-field>
+
                     <!-- <div>请选择投入项目</div> -->
                     <van-field readonly name="projectId" clickable :value="item.projectName"
                         :label="user.companyId == 781 ? '工作任务' : '投入项目'"
@@ -536,6 +542,19 @@
                 </div>
             </div>
         </van-popup>
+
+        <van-popup v-model="showSelectDeptPopup" position="bottom" style="height: 84%">
+            <div class="popupDiv">
+                <div class="popupCon">
+                    <div v-for="(item, index) in userReportDeptList" :key="item.value" class="popupItem paddingDiv"
+                        @click="selectedDeptId(item, index)">
+                        <p class="popupItemOne">
+                            <TranslationOpenDataText type='departmentName' :openid='item.departmentName'></TranslationOpenDataText>
+                        </p>
+                    </div>
+                </div>
+            </div>
+        </van-popup>
     </div>
 </template>
 <script>
@@ -649,6 +668,9 @@ export default {
                 name: '',
                 id: ''
             }, //  代填人员信息
+
+            userReportDeptList: [], // 可选部门
+            showSelectDeptPopup: false
         };
     },
 
@@ -1639,6 +1661,8 @@ export default {
                                     sapServiceId: list[i].sapServiceId,
                                     sapServiceName: list[i].sapServiceName,
                                     serviceList: list[i].serviceList,
+                                    userReportDeptName: list[i].userReportDeptName,
+                                    reportTargetDeptId: list[i].deptId
                                 })
                                 if (list[i].state >= 2) {
                                     this.canEdit = true;
@@ -1767,7 +1791,18 @@ export default {
             item.showPickerStage = true;
             this.$forceUpdate();
         },
-
+        selectDeptPopup(i, item) {
+            this.clickIndex = i;
+            this.showSelectDeptPopup = true;
+            this.$forceUpdate();
+        },
+        selectedDeptId(item) {
+            const { label, value } = item
+            this.form.domains[this.clickIndex].userReportDeptName = label
+            this.form.domains[this.clickIndex].reportTargetDeptId = value
+            this.showSelectDeptPopup = false;
+            this.$forceUpdate();
+        },
         // 选择项目
         clickPicker(i, item) {
             if (!item.canEdit) return;
@@ -2503,6 +2538,15 @@ export default {
                     this.$toast.fail("请选择[" + this.form.domains[i].projectName + "]项目的任务分组");
                     return;
                 }
+
+                if(this.user.timeType.userWithMultiDept == 1 && this.userReportDeptList.length > 0) {
+                    if(this.form.domains[i].reportTargetDeptId) {
+                        formData.append('reportTargetDeptId', this.form.domains[i].reportTargetDeptId || '');
+                    } else {
+                        this.$toast.fail("请选择[" + this.form.domains[i].projectName + "]填报部门");
+                        return;
+                    }
+                }
             }
             if (!this.flgLg) {
                 return
@@ -2594,6 +2638,24 @@ export default {
                 }
             });
         },
+        // 获取可选部门
+        getReportDeptList() {
+            this.$axios.post("/user/getUserInfo", {userId: this.user.id})
+            .then(res => {
+                if(res.code == "ok") {
+                    let lists = res.data.userReportDeptList || []
+                    const optimizedList = lists.map(item => ({
+                        ...item,
+                        label: item.departmentName,
+                        value: item.departmentId,
+                    }));
+                    this.userReportDeptList = optimizedList
+                    console.log(this.userReportDeptList, '<==== 返回的数据')
+                } else {
+                    this.$toast.fail('获取失败:'+res.msg);
+                }
+            }).catch(err=> {this.$toast.clear();});
+        }
     },
 
     mounted() {
@@ -2649,6 +2711,10 @@ export default {
             this.getJobResponList();
         }
 
+        if(this.user.timeType.userWithMultiDept) {
+            this.getReportDeptList()
+        }
+
         // if(localStorage.getItem("formVal")) {
         //     var obj = localStorage.getItem("formVal")
         //     this.form = JSON.parse(obj)

+ 5 - 3
fhKeeper/formulahousekeeper/timesheet_h5/src/views/login/index.vue

@@ -33,7 +33,7 @@
                 rules: {
                     username: [{ required: true, message: '请输入账号' }],
                     password: [{ required: true, message: '请输入密码' }]
-                }
+                },
             };
         },
         methods: {
@@ -296,13 +296,15 @@
                         }
                         
                     } else {
+                        console.log(window.location.href)
+                        console.log(href.indexOf("corpid") > 0, '<==== href.indexOf("corpid") > 0')
+                        console.log(!(window.location.href.indexOf("ddLoginUnique") > 0), '!(window.location.href.indexOf("ddLoginUnique") > 0)')
                         //检查环境,如果是钉钉有$CORPID$
                         if(href.indexOf("corpid") > 0) {
                             if(!(window.location.href.indexOf("ddLoginUnique") > 0)) {
                                 this.tryDingDingUrlRedirect()
-                                return
+                                // return
                             }
-
                             var key = '?corpid=';
                             var jumpkey = '&jumpto=';
                             var url = location.href;