Browse Source

Merge remote-tracking branch 'origin/master'

yusm 1 year ago
parent
commit
031ac4404e
93 changed files with 2645 additions and 2865 deletions
  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

File diff suppressed because it is too large
+ 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": "^2.1.7",
     "pinia-plugin-persistedstate": "^3.2.1",
     "pinia-plugin-persistedstate": "^3.2.1",
     "vue": "^3.4.19",
     "vue": "^3.4.19",
-    "vue-router": "^4.3.0"
+    "vue-router": "^4.3.0",
+    "vuex": "^4.1.0"
   },
   },
   "devDependencies": {
   "devDependencies": {
     "@types/node": "^20.11.24",
     "@types/node": "^20.11.24",

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

@@ -8,7 +8,7 @@
 </template>
 </template>
 
 
 <script setup lang="ts">
 <script setup lang="ts">
-import { provide } from 'vue'
+import { provide, onMounted } from 'vue'
 import { useStore } from '@/store/index'
 import { useStore } from '@/store/index'
 import { ElNotification, NotificationParamsTyped } from 'element-plus'
 import { ElNotification, NotificationParamsTyped } from 'element-plus'
 const { setAsyncRoutesMark } = useStore()
 const { setAsyncRoutesMark } = useStore()
@@ -49,6 +49,17 @@ provide<GlobalPopup>('globalPopup', {
 const notificationTiop = (options: NotificationParamsTyped) => {
 const notificationTiop = (options: NotificationParamsTyped) => {
   ElNotification(options)
   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>
 </script>
 
 

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

@@ -62,5 +62,5 @@ watch(
 </script>
 </script>
 
 
 <template>
 <template>
-	<div ref="myChartsRef" :style="{ height: height, width: width }" :option="option" />
+	<div ref="myChartsRef" :style="{ height: height, width: width }" :option="option"></div>
 </template>
 </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_CONTACTS = "/contacts/allContacts"; //联系人
 
 
 export const ALL_USERS = "/user/getSimpleActiveUserList"; //获取所有人
 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>
 <script lang="ts" setup>
 import { ref, watch } from 'vue';
 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 { 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 { Delete, Plus } from "@element-plus/icons-vue"
 import { FormInstance, dayjs } from 'element-plus';
 import { FormInstance, dayjs } from 'element-plus';
 import { getFromValue } from '@/utils/tools';
 import { getFromValue } from '@/utils/tools';
@@ -155,10 +155,10 @@ watch(() => props.visible, (val) => {
   }
   }
 })
 })
 const customeData = ref<any>([])
 const customeData = ref<any>([])
-const clueData = ref<any>([])
 const businessData = ref<any>([])
 const businessData = ref<any>([])
+const orderData = ref<any>([])
+const clueData = ref<any>([])
 watch(() => props.editForm, (val) => {
 watch(() => props.editForm, (val) => {
-
   let taskType = 0;
   let taskType = 0;
   if (val) {
   if (val) {
     taskType = getTaskType(val);
     taskType = getTaskType(val);
@@ -175,6 +175,12 @@ watch(() => props.editForm, (val) => {
       taskTypeValueData.value = data;
       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 }) => {
   get(ALL_CLUE, {}).then(({ data }) => {
     clueData.value = data;//线索
     clueData.value = data;//线索
     if (taskType == 3) {
     if (taskType == 3) {
@@ -216,9 +222,9 @@ function closeVisible() {
 }
 }
 function submitForm(formEl: FormInstance | undefined, isClose: boolean) {
 function submitForm(formEl: FormInstance | undefined, isClose: boolean) {
   if (!formEl) return
   if (!formEl) return
-  formEl.validate((valid) => {
+  formEl.validate((valid: boolean) => {
     if (!valid) {
     if (!valid) {
-      return false
+      return false as any
     }
     }
     const repeatDesignDay = customeDate.value.join(",")
     const repeatDesignDay = customeDate.value.join(",")
     generateFormRef.value?.getData().then((res: any) => {
     generateFormRef.value?.getData().then((res: any) => {
@@ -270,7 +276,7 @@ function changeTaskType(value: TASK_VALUE_TYPE) {
     case 2:
     case 2:
       taskTypeValueData.value = [];
       taskTypeValueData.value = [];
       setTimeout(() => {
       setTimeout(() => {
-        taskTypeValueData.value = [{ label: "订单1", value: 1 }, { label: "订单2", value: 2 }]
+        taskTypeValueData.value = orderData.value
       }, 500)
       }, 500)
       break;
       break;
     case 3:
     case 3:
@@ -318,7 +324,7 @@ function changeRepeatType(value: REPEAT_VALUE_TYPE) {
   customeDate.value = [];
   customeDate.value = [];
 }
 }
 
 
-function changeEndType(value: string | number | boolean) {
+function changeEndType(value: string | number | boolean | undefined) {
   form.value = {
   form.value = {
     ...form.value,
     ...form.value,
     endType: 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 ElementPlus from 'element-plus'
 import "./TailWindCss/index.css";
 import "./TailWindCss/index.css";
 import 'element-plus/dist/index.css'
 import 'element-plus/dist/index.css'
+// import './styles/element-plus.scss'
 import 'animate.css/animate.min.css' //引入动画
 import 'animate.css/animate.min.css' //引入动画
 import * as ElementPlusIconsVue from '@element-plus/icons-vue'
 import * as ElementPlusIconsVue from '@element-plus/icons-vue'
 import piniaPluginPersistedstate from 'pinia-plugin-persistedstate'
 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-top: 4px;
     padding-bottom: 4px;
     padding-bottom: 4px;
   }
   }
-
-  .selectClas >>> .el-select__wrapper {
-    background-color: none !important;
-    box-shadow: none !important;
-  }
 }
 }
 </style>
 </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-top: 4px;
     padding-bottom: 4px;
     padding-bottom: 4px;
   }
   }
-
-  .selectClas >>> .el-select__wrapper {
-    background-color: none !important;
-    box-shadow: none !important;
-  }
 }
 }
 </style>
 </style>

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

@@ -68,9 +68,9 @@ const login = (formEl: FormInstance | undefined) => {
   if (!formEl) {
   if (!formEl) {
     return
     return
   }
   }
-  formEl.validate((valid) => {
+  formEl.validate((valid: boolean) => {
     if (!valid) {
     if (!valid) {
-      return false;
+      return false as any;
     }
     }
     loginLoading.value = true;
     loginLoading.value = true;
     //console.log(ruleForm.value);
     //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-top: 4px;
     padding-bottom: 4px;
     padding-bottom: 4px;
   }
   }
-
-  .selectClas>>>.el-select__wrapper {
-    background-color: none !important;
-    box-shadow: none !important;
-  }
 }
 }
 </style>
 </style>

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

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

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

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

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

@@ -14,9 +14,11 @@
       </div>
       </div>
     </template>
     </template>
     <div class="text-lg p-5">
     <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>2. 填写excel文件, 任务名称与优先级必填</div>
+
     </div>
     </div>
+    <!--  -->
   </el-dialog>
   </el-dialog>
 </template>
 </template>
 <script lang="ts" setup>
 <script lang="ts" setup>
@@ -25,7 +27,6 @@ import { Props, Emits } from "./type"
 
 
 const props = defineProps<Props>();
 const props = defineProps<Props>();
 const emits = defineEmits<Emits>();
 const emits = defineEmits<Emits>();
-
 watch(() => props.saveLoading, (newValue) => {
 watch(() => props.saveLoading, (newValue) => {
   if (!fileInputRef.value) return
   if (!fileInputRef.value) return
   fileInputRef.value.value = ""
   fileInputRef.value.value = ""
@@ -37,6 +38,10 @@ watch(() => props.saveLoading, (newValue) => {
 
 
 const fileInputRef = ref<HTMLInputElement>();
 const fileInputRef = ref<HTMLInputElement>();
 
 
+function getTemplate() {
+
+}
+
 function submit() {
 function submit() {
   fileInputRef.value?.click()
   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";
 import { EpPropMergeType } from "element-plus/es/utils";
-
 export const MOD = "/tasks";
 export const MOD = "/tasks";
 
 
 type StatusType = {
 type StatusType = {
@@ -56,3 +55,10 @@ export const UPDATE_TASK_STATUS = `${MOD}/updateTaskStatus`; //更新任务状
 export const UPDATE_TASK = `${MOD}/updateTask`;//修改任务
 export const UPDATE_TASK = `${MOD}/updateTask`;//修改任务
 
 
 export const ALL_USERS = "/user/getSimpleActiveUserList"; //获取所有人
 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="bg-white w-full h-full p-3 shadow-md rounded-md flex flex-col">
         <div class="ml-auto p-3">
         <div class="ml-auto p-3">
           <el-button type="primary" @click="createTasks()">创建任务</el-Button>
           <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" @click="openImportModal()">导入</el-Button>
           <el-button type="primary" :loading="btnLoading" @click="exportTasks()">导出</el-Button>
           <el-button type="primary" :loading="btnLoading" @click="exportTasks()">导出</el-Button>
         </div>
         </div>
@@ -155,16 +155,16 @@
 </template>
 </template>
 
 
 <script lang="ts" setup>
 <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 { useRouter } from 'vue-router';
 import { useStore } from '@/store';
 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 { ElTable, dayjs } from 'element-plus';
 import TaskModal from '@/components/TaskModal/index.vue';
 import TaskModal from '@/components/TaskModal/index.vue';
 import ImportModal from './ImportModal.vue';
 import ImportModal from './ImportModal.vue';
 import ExportModal from './ExportModal.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';
 import { pushMap } from './type';
 const router = useRouter()
 const router = useRouter()
 const { getFunctionList } = useStore()
 const { getFunctionList } = useStore()
@@ -173,7 +173,9 @@ const pagePermission = ref<any[]>();
 const taskModalVisible = ref(false);
 const taskModalVisible = ref(false);
 const taskForm = ref<any>();
 const taskForm = ref<any>();
 const isEdit = ref(false);
 const isEdit = ref(false);
-
+const len = computed(() => {
+  return tableRef.value?.getSelectionRows().length
+})
 const taskLoading = ref<saveLoadingType>("1");
 const taskLoading = ref<saveLoadingType>("1");
 function closeTaskModal() {
 function closeTaskModal() {
   taskModalVisible.value = false;
   taskModalVisible.value = false;
@@ -194,15 +196,12 @@ function submitForm(data: any, isClose: boolean) {
       taskLogs: []
       taskLogs: []
     }
     }
   }
   }
-  // console.log("提交的数据", getFromValue(params));
-  // return;
   taskLoading.value = "2";
   taskLoading.value = "2";
   let url = isEdit.value ? UPDATE_TASK : ADD_TASK
   let url = isEdit.value ? UPDATE_TASK : ADD_TASK
   let msg = isEdit.value ? "修改成功" : "新建成功"
   let msg = isEdit.value ? "修改成功" : "新建成功"
   post(url, getFromValue(params)).then(() => {
   post(url, getFromValue(params)).then(() => {
     taskLoading.value = "3";
     taskLoading.value = "3";
     taskModalVisible.value = isClose;
     taskModalVisible.value = isClose;
-
     globalPopup?.showSuccess(msg)
     globalPopup?.showSuccess(msg)
     search();
     search();
   }).catch(err => {
   }).catch(err => {
@@ -284,15 +283,13 @@ function closeImportModal() {
   importVisible.value = false;
   importVisible.value = false;
 }
 }
 function importExcel(data: any) {
 function importExcel(data: any) {
-  console.log("需要提交的数据,importExcel", data);
-  return
   const formData = new FormData();
   const formData = new FormData();
-  formData.append("file", data);
-  formData.append("projectId", "32277");
+  formData.append("multipartFile", data);
   importLoading.value = "2";
   importLoading.value = "2";
-  uploadFile("/document/uploadDocument", formData).then(_res => {
+  uploadFile(IMPORT_DATA, formData).then(_res => {
     globalPopup?.showSuccess("导入成功")
     globalPopup?.showSuccess("导入成功")
     importLoading.value = "3";
     importLoading.value = "3";
+    search();
   }).catch(err => {
   }).catch(err => {
     globalPopup?.showError(err)
     globalPopup?.showError(err)
     importLoading.value = "4";
     importLoading.value = "4";
@@ -303,26 +300,38 @@ const exportVisible = ref(false);
 const exportLoading = ref<saveLoadingType>("1");
 const exportLoading = ref<saveLoadingType>("1");
 const btnLoading = ref(false);
 const btnLoading = ref(false);
 function exportTasks() {
 function exportTasks() {
-  const data = tableRef.value?.getSelectionRows()
+  const data: any[] = tableRef.value?.getSelectionRows()
   if (data.length === 0) {
   if (data.length === 0) {
     // TODO 
     // TODO 
     exportVisible.value = true;
     exportVisible.value = true;
     return
     return
   }
   }
   btnLoading.value = true;
   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;
     btnLoading.value = false;
-  }, 2000)
+  }).catch(err => {
+    btnLoading.value = false;
+    globalPopup?.showError(err)
+  })
 }
 }
 function closeExportModal() {
 function closeExportModal() {
   exportVisible.value = false;
   exportVisible.value = false;
 }
 }
 function exportExcel(data: any) {
 function exportExcel(data: any) {
-  console.log("export", data);
   exportLoading.value = "2";
   exportLoading.value = "2";
-  setTimeout(() => {
+  post(EXPORT_DATA, getFromValue(data)).then(({ data }) => {
+    downloadFile(data, "任务列表.xlsx");
     exportLoading.value = "3";
     exportLoading.value = "3";
     exportVisible.value = false;
     exportVisible.value = false;
+  }).catch(err => {
+    globalPopup?.showError(err)
+  })
+  setTimeout(() => {
+
   }, 2000)
   }, 2000)
 }
 }
 function editRow(row: any) {
 function editRow(row: any) {

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

@@ -1,6 +1,6 @@
 <template>
 <template>
   <div :style="{ width: '1230px', height: '350px' }">
   <div :style="{ width: '1230px', height: '350px' }">
-    <Echarts :option="option" />
+    <Echarts :option="{}"></Echarts>
   </div>
   </div>
 </template>
 </template>
 
 
@@ -141,4 +141,5 @@ const option = reactive<Partial<EChartsOption>>({
 });
 });
 </script>
 </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">
             <el-table-column label="操作" fixed="right" width="200">
               <template #default="scope">
               <template #default="scope">
                 <el-button link type="primary" size="large" @click="editClue(scope.row)">编辑</el-button>
                 <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"
                 <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>
                 <el-button link type="danger" size="large" @click.prevent="deleteRow(scope.row)">删除</el-button>
               </template>
               </template>
             </el-table-column>
             </el-table-column>
@@ -138,7 +140,7 @@
 
 
     <DeteleTables :visibles="dialogVisible.deteleClueDialogVisible" @showDeteleClue="showDeteleClue" />
     <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']" />
       @close="closeTaskModal" @submit="submitForm" :title="'新建任务'" :disabled-list="['taskType', 'clueId']" />
   </div>
   </div>
 </template>
 </template>
@@ -218,6 +220,7 @@ const clueTemplate = ref({
   config: {}
   config: {}
 }) // 线索模板
 }) // 线索模板
 const editForm = ref({}) // 编辑表单
 const editForm = ref({}) // 编辑表单
+const taskModalForm = ref({}) // 任务弹窗表单
 
 
 // 批量变量
 // 批量变量
 const transferForm = reactive({
 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) {
 function showDeteleClue(flag: boolean) {
   dialogVisible.deteleClueDialogVisible = flag
   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 { RouteRecordRaw, createRouter, createWebHistory } from "vue-router";
 import { useStore } from "@/store/index";
 import { useStore } from "@/store/index";
+import { createRouterGuards } from "./routerGuards";
 export const routes: RouteRecordRaw[] = [
 export const routes: RouteRecordRaw[] = [
   {
   {
     path: "/",
     path: "/",
@@ -44,60 +45,7 @@ const router = createRouter({
   history: createWebHistory(),
   history: createWebHistory(),
   routes,
   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;
 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{
 .el-dialog__header, .el-dialog__body{
   margin: 0 !important;
   margin: 0 !important;
   padding: 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";
 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";
 // const target = "http://47.101.180.183:10010";
 
 
 export default defineConfig({
 export default defineConfig({
@@ -26,16 +26,28 @@ export default defineConfig({
     alias: {
     alias: {
       "@": resolve(__dirname, "./src"),
       "@": resolve(__dirname, "./src"),
     },
     },
-    //extensions: [".ts", ".js", ".vue", ".json", ".mjs"],
     extensions: [".mjs", ".js", ".ts", ".jsx", ".tsx", ".json", ".vue"],
     extensions: [".mjs", ".js", ".ts", ".jsx", ".tsx", ".json", ".vue"],
   },
   },
-  // css相关配置
   css: {
   css: {
     preprocessorOptions: {
     preprocessorOptions: {
       scss: {
       scss: {
         additionalData: '@import "@/styles/global.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;
         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 importData(MultipartFile multipartFile);
 
 
     HttpRespMsg exportData(String userId, String orderName, String orderCode, String productCode) throws Exception;
     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.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 import org.springframework.util.StringUtils;
 import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.multipart.MultipartFile;
 import org.springframework.web.multipart.MultipartFile;
 
 
 import javax.annotation.Resource;
 import javax.annotation.Resource;
+import javax.print.DocFlavor;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletRequest;
 import java.io.*;
 import java.io.*;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 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.*;
 import java.util.stream.Collectors;
 import java.util.stream.Collectors;
 
 
+import static java.text.NumberFormat.getPercentInstance;
+
 /**
 /**
  * <p>
  * <p>
  *  服务实现类
  *  服务实现类
@@ -61,6 +73,12 @@ public class SalesOrderServiceImpl extends ServiceImpl<SalesOrderMapper, SalesOr
     private SysFormMapper sysFormMapper;
     private SysFormMapper sysFormMapper;
     @Resource
     @Resource
     private WxCorpInfoService wxCorpInfoService;
     private WxCorpInfoService wxCorpInfoService;
+    @Resource
+    private CustomService customService;
+    @Resource
+    private BusinessOpportunityService businessOpportunityService;
+    @Resource
+    private ContactsService contactsService;
     @Value(value = "${upload.path}")
     @Value(value = "${upload.path}")
     private String path;
     private String path;
 
 
@@ -359,6 +377,183 @@ public class SalesOrderServiceImpl extends ServiceImpl<SalesOrderMapper, SalesOr
         return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,fileName,dataList,path);
         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) {
     public List<Integer> getBranchDepartment(Integer departmentId, List<Department> departmentList) {
         List<Integer> list = new ArrayList<>();
         List<Integer> list = new ArrayList<>();

File diff suppressed because it is too large
+ 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;
 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.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.dingtalk.api.request.OapiMessageCorpconversationAsyncsendV2Request;
 import com.dingtalk.api.request.OapiMessageCorpconversationAsyncsendV2Request;
 import com.management.platform.entity.CompanyDingding;
 import com.management.platform.entity.CompanyDingding;
@@ -96,5 +98,19 @@ public class CompanyDingdingController {
         companyDingdingService.sendOAMsg(companyDingding, "040534176023851922", "OA提醒测试","这是一次测试",form,null);
         companyDingdingService.sendOAMsg(companyDingding, "040534176023851922", "OA提醒测试","这是一次测试",form,null);
         return new HttpRespMsg();
         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(userName);
                 item.add(deptName);
                 item.add(deptName);
             }else {
             }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.getHappenDate());
             item.add(itemVO.getExpenseType());
             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<>();
             List<String> item=new ArrayList<>();
             item.add(groupBudgetReview.getProjectName());
             item.add(groupBudgetReview.getProjectName());
             item.add(groupBudgetReview.getGroupName());
             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();
                 Optional<User> first = userList.stream().filter(u -> u.getId().equals(groupBudgetReview.getCreatorId())).findFirst();
                 if(first.isPresent()){
                 if(first.isPresent()){
                     item.add("$userName="+first.get().getName()+"$");
                     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();
             String userString = corpwxUseridList.toString();
             resultData.add(pr.getProjectCode());
             resultData.add(pr.getProjectCode());
             resultData.add(pr.getProjectName());
             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("]",""));
                 resultData.add(userString.replaceAll("\\[","").replaceAll("]",""));
             }else {
             }else {
                 resultData.add(pr.getActiveUsers());
                 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[] extraField3,
                                   Integer[] sapServiceId,//依斯贝的服务Id
                                   Integer[] sapServiceId,//依斯贝的服务Id
                                   String summary,         //针对工作总结的字段
                                   String summary,         //针对工作总结的字段
-                                  String[] multiDegrId
+                                  String[] multiDegrId,
+                                  Integer[] reportTargetDeptId
                                     ) {
                                     ) {
         List<Report> reportList = new ArrayList<>();
         List<Report> reportList = new ArrayList<>();
         String token = request.getHeader("Token");
         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) {
                 if (stage == null) {
                     stage = new String[projectId.length];
                     stage = new String[projectId.length];
                 }
                 }
@@ -889,7 +890,7 @@ public class ReportController {
                             report.setStage(stage[i]);
                             report.setStage(stage[i]);
                             report.setCreateDate(localStartDate);
                             report.setCreateDate(localStartDate);
                             report.setCreatorId(token);
                             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.setProjectAuditState(0);
                             report.setProjectAuditorId(projectAuditorId[i]);
                             report.setProjectAuditorId(projectAuditorId[i]);
                             report.setTaskFinish(taskFinish[i]);
                             report.setTaskFinish(taskFinish[i]);
@@ -1002,7 +1003,7 @@ public class ReportController {
                         report.setPicStr(picStr!=null?picStr[i]:null);
                         report.setPicStr(picStr!=null?picStr[i]:null);
                         report.setCreateDate(LocalDate.parse(createDate[i], DateTimeFormatter.ofPattern("yyyy-MM-dd")));
                         report.setCreateDate(LocalDate.parse(createDate[i], DateTimeFormatter.ofPattern("yyyy-MM-dd")));
                         report.setCreatorId(token);
                         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.setProjectAuditState(0);
                         report.setProjectAuditorId(projectAuditorId[i]);
                         report.setProjectAuditorId(projectAuditorId[i]);
                         report.setTaskFinish(taskFinish[i]);
                         report.setTaskFinish(taskFinish[i]);
@@ -2634,8 +2635,8 @@ public class ReportController {
     }
     }
 
 
     @RequestMapping("/changeReminder")
     @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;
 package com.management.platform.controller;
 
 
 
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 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.ReportLog;
 import com.management.platform.entity.User;
 import com.management.platform.entity.User;
 import com.management.platform.entity.WxCorpInfo;
 import com.management.platform.entity.WxCorpInfo;
+import com.management.platform.mapper.CompanyDingdingMapper;
 import com.management.platform.mapper.UserMapper;
 import com.management.platform.mapper.UserMapper;
 import com.management.platform.mapper.WxCorpInfoMapper;
 import com.management.platform.mapper.WxCorpInfoMapper;
 import com.management.platform.service.ReportLogService;
 import com.management.platform.service.ReportLogService;
@@ -35,6 +38,8 @@ public class ReportLogController {
     private UserMapper userMapper;
     private UserMapper userMapper;
     @Resource
     @Resource
     WxCorpInfoMapper wxCorpInfoMapper;
     WxCorpInfoMapper wxCorpInfoMapper;
+    @Resource
+    private CompanyDingdingMapper companyDingdingMapper;
 
 
     @RequestMapping("/get")
     @RequestMapping("/get")
     public HttpRespMsg get(String creatorId, String createDate) {
     public HttpRespMsg get(String creatorId, String createDate) {
@@ -42,15 +47,19 @@ public class ReportLogController {
         User user = userMapper.selectById(creatorId);
         User user = userMapper.selectById(creatorId);
         List<ReportLog> list = reportLogService.list(new QueryWrapper<ReportLog>().eq("creator_id", creatorId).eq("create_date", createDate));
         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()));
         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() + "$"));
                         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;
 package com.management.platform.controller;
 
 
 
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.management.platform.entity.*;
 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.TaskCommentService;
 import com.management.platform.service.UserService;
 import com.management.platform.service.UserService;
 import com.management.platform.util.HttpRespMsg;
 import com.management.platform.util.HttpRespMsg;
@@ -46,6 +44,8 @@ public class TaskCommentController {
     private TaskRestartMapper taskRestartMapper;
     private TaskRestartMapper taskRestartMapper;
     @Resource
     @Resource
     private TaskPersonLiableMapper taskPersonLiableMapper;
     private TaskPersonLiableMapper taskPersonLiableMapper;
+    @Resource
+    private CompanyDingdingMapper companyDingdingMapper;
     /**
     /**
      * 添加任务留言
      * 添加任务留言
      * @return
      * @return
@@ -76,23 +76,26 @@ public class TaskCommentController {
         String token = request.getHeader("token");
         String token = request.getHeader("token");
         User user = userMapper.selectById(token);
         User user = userMapper.selectById(token);
         WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id",user.getCompanyId()));
         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()));
         List<User> users = userMapper.selectList(new QueryWrapper<User>().eq("company_id",user.getCompanyId()));
         for (TaskComment taskComment : taskComments) {
         for (TaskComment taskComment : taskComments) {
             List<TaskRestart> taskRestartList = taskRestarts.stream().filter(tr -> tr.getTaskCommentId().equals(taskComment.getId())).collect(Collectors.toList());
             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());
             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();
                         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) {
             for (TaskPersonLiable taskPersonLiable : taskPersonLiableList) {
                 Optional<User> first = users.stream().filter(us -> us.getId().equals(taskPersonLiable.getPersonLiableId())).findFirst();
                 Optional<User> first = users.stream().filter(us -> us.getId().equals(taskPersonLiable.getPersonLiableId())).findFirst();
                 if(first.isPresent()){
                 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()));
                 taskService.update(sample, new QueryWrapper<Task>().eq("parent_tid", task.getId()));
             }
             }
             List<TaskExecutor> oldExeList = taskExecutorMapper.selectList(new QueryWrapper<TaskExecutor>().eq("task_id", 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())))
             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());
                         .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());
             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(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->{
                     taskCommentString.append(",移除了执行人"+hasRemoveExecutor.stream().map(h->{
                         if(!h.getExecutorId().equals(user.getId())){
                         if(!h.getExecutorId().equals(user.getId())){
                             return "$userName="+h.getExecutorName()+"$";
                             return "$userName="+h.getExecutorName()+"$";
@@ -301,7 +302,7 @@ public class TaskController {
                         .map(TaskExecutor::getExecutorId).collect(Collectors.toList());
                         .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());
                 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(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->{
                         taskCommentString.append(",新增了执行人"+newAddExecutor.stream().map(h->{
                             if(!h.getExecutorId().equals(user.getId())){
                             if(!h.getExecutorId().equals(user.getId())){
                                 return "$userName="+h.getExecutorName()+"$";
                                 return "$userName="+h.getExecutorName()+"$";
@@ -317,7 +318,7 @@ public class TaskController {
                     Optional<TaskExecutor> first = oldExeList.stream().filter(o -> o.getId().equals(oldHa.getId())).findFirst();
                     Optional<TaskExecutor> first = oldExeList.stream().filter(o -> o.getId().equals(oldHa.getId())).findFirst();
                     if(first.isPresent()){
                     if(first.isPresent()){
                         if(!oldHa.getPlanHours().equals(first.get().getPlanHours())){
                         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())){
                                 if(oldHa.getExecutorId().equals(user.getId())){
                                     taskCommentString.append(",修改了执行人"+oldHa.getExecutorName()+"计划工时为"+oldHa.getPlanHours()+"小时");
                                     taskCommentString.append(",修改了执行人"+oldHa.getExecutorName()+"计划工时为"+oldHa.getPlanHours()+"小时");
                                 }else {
                                 }else {
@@ -1069,6 +1070,13 @@ public class TaskController {
                     }else {
                     }else {
                         row.createCell(2).setCellValue("");
                         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 {
                 }else {
                     row.createCell(2).setCellValue(task.getExecutorName());
                     row.createCell(2).setCellValue(task.getExecutorName());
                 }
                 }
@@ -1122,7 +1130,7 @@ public class TaskController {
                     //httpRespMsg.setError("处理超时...");
                     //httpRespMsg.setError("处理超时...");
                     httpRespMsg.setError(MessageUtils.message("request.outTime"));
                     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 mediaId = dingDingService.getTranslationMediaId(fileUrlSuffix,dingding);
                 String jobId = dingDingService.syncTranslation(mediaId,fileUrlSuffix,user.getDingdingUnionid(),dingding);
                 String jobId = dingDingService.syncTranslation(mediaId,fileUrlSuffix,user.getDingdingUnionid(),dingding);
                 int i = 0;
                 int i = 0;
@@ -1424,6 +1432,8 @@ public class TaskController {
             String executorString = executorList.stream().map(t->{
             String executorString = executorList.stream().map(t->{
                 if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                 if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                     return "$userName="+t.getExecutorName()+"$";
                     return "$userName="+t.getExecutorName()+"$";
+                }else if(dingding!=null&&dingding.getContactNeedTranslate()==1){
+                    return "$userName="+t.getExecutorName()+"$";
                 }else {
                 }else {
                     return t.getExecutorName();
                     return t.getExecutorName();
                 }
                 }
@@ -1438,7 +1448,9 @@ public class TaskController {
                     if(department.isPresent()){
                     if(department.isPresent()){
                         if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                         if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                             item.add("$departmentName="+department.get().getCorpwxDeptid()+"$");
                             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());
                             item.add(department.get().getDepartmentName());
                         }
                         }
                     }else {
                     }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,
                                   @RequestParam Integer roleId, Double monthCost, Double cost,
                                   Integer departmentId, Integer salaryType, String costApplyDate,
                                   Integer departmentId, Integer salaryType, String costApplyDate,
                                     String position, String certJson,String inductionDate,String superiorId,
                                     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,
         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);
                     row.createCell(0).setCellValue(rowNum);
                     if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                     if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                         row.createCell(1).setCellValue("$userName="+(item.getCorpwxUserid()==null?" ":item.getCorpwxUserid())+"$");
                         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 {
                     }else {
                         row.createCell(1).setCellValue(item.getName());
                         row.createCell(1).setCellValue(item.getName());
                     }
                     }
@@ -410,6 +412,16 @@ public class UserController {
                     row.createCell(3).setCellValue(item.getPhone());
                     row.createCell(3).setCellValue(item.getPhone());
                     if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                     if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                         row.createCell(4).setCellValue("$departmentName="+(item.getCorpwxDeptid()==null?" ":item.getCorpwxDeptid())+"$");
                         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 {
                     }else {
                         row.createCell(4).setCellValue(item.getDepartmentName());
                         row.createCell(4).setCellValue(item.getDepartmentName());
                     }
                     }
@@ -419,6 +431,8 @@ public class UserController {
                             if(first.isPresent()){
                             if(first.isPresent()){
                                 if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                                 if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                                     row.createCell(5).setCellValue("$userName="+(first.get().getCorpwxUserid()==null?" ":first.get().getCorpwxUserid())+"$");
                                     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 {
                                 }else {
                                     row.createCell(5).setCellValue(first.get().getName());
                                     row.createCell(5).setCellValue(first.get().getName());
                                 }
                                 }
@@ -510,7 +524,7 @@ public class UserController {
                         //httpRespMsg.setError("处理超时...");
                         //httpRespMsg.setError("处理超时...");
                         httpRespMsg.setError(MessageUtils.message("request.outTime"));
                         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 mediaId = dingDingService.getTranslationMediaId(fileUrlSuffix,dingding);
                     String jobId = dingDingService.syncTranslation(mediaId,fileUrlSuffix,user.getDingdingUnionid(), dingding);
                     String jobId = dingDingService.syncTranslation(mediaId,fileUrlSuffix,user.getDingdingUnionid(), dingding);
                     int i = 0;
                     int i = 0;
@@ -522,6 +536,7 @@ public class UserController {
                     while (i < 10) {
                     while (i < 10) {
                         Thread.sleep(300);
                         Thread.sleep(300);
                         Integer status = corpddJobCenter.get(jobId);
                         Integer status = corpddJobCenter.get(jobId);
+                        System.out.println("打印corpddJobCenter"+corpddJobCenter);
                         if (status != null) {
                         if (status != null) {
                             if (status == 1) {
                             if (status == 1) {
                                 syncTranslationResult = dingDingService.getSyncTranslationResult(jobId,dingding);
                                 syncTranslationResult = dingDingService.getSyncTranslationResult(jobId,dingding);
@@ -614,6 +629,14 @@ public class UserController {
                 if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                 if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                     row.createCell(1).setCellValue("$userName="+(item.getCorpwxUserid()==null?"":item.getCorpwxUserid())+"$");
                     row.createCell(1).setCellValue("$userName="+(item.getCorpwxUserid()==null?"":item.getCorpwxUserid())+"$");
                     row.createCell(2).setCellValue("$departmentName="+(item.getCorpwxDeptid()==null?"":item.getCorpwxDeptid())+"$");
                     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 {
                 }else {
                     row.createCell(1).setCellValue(item.getName());
                     row.createCell(1).setCellValue(item.getName());
                     row.createCell(2).setCellValue(item.getDepartmentName());
                     row.createCell(2).setCellValue(item.getDepartmentName());
@@ -663,7 +686,7 @@ public class UserController {
                     //httpRespMsg.setError("处理超时...");
                     //httpRespMsg.setError("处理超时...");
                     httpRespMsg.setError(MessageUtils.message("request.outTime"));
                     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 mediaId = dingDingService.getTranslationMediaId(fileUrlSuffix,dingding);
                 String jobId = dingDingService.syncTranslation(mediaId,fileUrlSuffix, user.getDingdingUnionid(),dingding);
                 String jobId = dingDingService.syncTranslation(mediaId,fileUrlSuffix, user.getDingdingUnionid(),dingding);
                 int i = 0;
                 int i = 0;
@@ -932,7 +955,7 @@ public class UserController {
         HttpRespMsg msg=new HttpRespMsg();
         HttpRespMsg msg=new HttpRespMsg();
         User user = userService.getById(userId);
         User user = userService.getById(userId);
         if(user!=null){
         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){
             if(userWithBeisen==null){
                 msg.setError("工号["+jobNumber+"]在HR系统中不存在,请重新输入");
                 msg.setError("工号["+jobNumber+"]在HR系统中不存在,请重新输入");
                 return msg;
                 return msg;
@@ -948,5 +971,16 @@ public class UserController {
         return msg;
         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.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 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.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.management.platform.entity.*;
 import com.management.platform.entity.*;
@@ -82,6 +83,8 @@ public class UserCorpwxTimeController {
     UserCorpwxTimeService userCorpwxTimeService;
     UserCorpwxTimeService userCorpwxTimeService;
     @Resource
     @Resource
     private CompanyDingdingMapper companyDingdingMapper;
     private CompanyDingdingMapper companyDingdingMapper;
+    @Resource
+    private CompanyDingdingService companyDingdingService;
 
 
     @RequestMapping("/getMyDeptMembsData")
     @RequestMapping("/getMyDeptMembsData")
     public HttpRespMsg getMyDeptMembsData(String startDate, String endDate) {
     public HttpRespMsg getMyDeptMembsData(String startDate, String endDate) {
@@ -300,6 +303,8 @@ public class UserCorpwxTimeController {
             dataList.add((String)dataItem.get("weekDayTxt"));
             dataList.add((String)dataItem.get("weekDayTxt"));
             if(wxCorpInfo.getSaasSyncContact()==1){
             if(wxCorpInfo.getSaasSyncContact()==1){
                 dataList.add("$userName="+(String)dataItem.get("corpwxUserid")+"$");
                 dataList.add("$userName="+(String)dataItem.get("corpwxUserid")+"$");
+            }else if(dingding!=null&&dingding.getContactNeedTranslate()==1){
+                dataList.add("$userName="+(String)dataItem.get("username")+"$");
             }else{
             }else{
                 dataList.add((String)dataItem.get("username"));
                 dataList.add((String)dataItem.get("username"));
             }
             }
@@ -380,6 +385,8 @@ public class UserCorpwxTimeController {
             dataList.add(ymonth);
             dataList.add(ymonth);
             if(wxCorpInfo.getSaasSyncContact()==1){
             if(wxCorpInfo.getSaasSyncContact()==1){
                 dataList.add("$userName="+(String)dataItem.get("corpwxUserid")+"$");
                 dataList.add("$userName="+(String)dataItem.get("corpwxUserid")+"$");
+            }else if(dingding!=null&&dingding.getContactNeedTranslate()==1){
+                dataList.add("$userName="+(String)dataItem.get("username")+"$");
             }else{
             }else{
                 dataList.add((String)dataItem.get("username"));
                 dataList.add((String)dataItem.get("username"));
             }
             }
@@ -473,6 +480,7 @@ public class UserCorpwxTimeController {
         String token = request.getHeader("TOKEN");
         String token = request.getHeader("TOKEN");
         User user = userMapper.selectById(token);
         User user = userMapper.selectById(token);
         WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", user.getCompanyId()));
         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();
         String fileName = multipartFile.getOriginalFilename();
         File file = new File(fileName == null ? "file" : fileName);
         File file = new File(fileName == null ? "file" : fileName);
@@ -530,16 +538,35 @@ public class UserCorpwxTimeController {
                     userNameList.add(username);
                     userNameList.add(username);
                 }
                 }
             }
             }
+            List<User> targetUserList=new ArrayList<>();
             HttpRespMsg respMsg=new HttpRespMsg();
             HttpRespMsg respMsg=new HttpRespMsg();
             if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1&&userNameList.size()>0){
             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);
                 respMsg = wxCorpInfoService.getBatchSearchUserInfo(wxCorpInfo, userNameList,null);
                 if(respMsg.code.equals("0")){
                 if(respMsg.code.equals("0")){
                     msg.setError("姓名为["+String.valueOf(respMsg.data)+"]的人员存在重复,请使用工号!");
                     msg.setError("姓名为["+String.valueOf(respMsg.data)+"]的人员存在重复,请使用工号!");
                     return msg;
                     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<>();
             List<UserCorpwxTime> userCorpwxTimeList = new ArrayList<>();
             int dataCount = 0;
             int dataCount = 0;
             for (int rowIndex = 0; rowIndex <= rowNum; rowIndex++) {
             for (int rowIndex = 0; rowIndex <= rowNum; rowIndex++) {
@@ -578,9 +605,9 @@ public class UserCorpwxTimeController {
                     String username =row.getCell(2).getStringCellValue().trim();
                     String username =row.getCell(2).getStringCellValue().trim();
                     //检查人员是否存在
                     //检查人员是否存在
                     Optional<User> any;
                     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();
                         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 {
                     }else {
                         any = allUserList.stream().filter(u -> u.getName().equals(username)||(u.getJobNumber()!=null&&u.getJobNumber().equals(username))).findAny();
                         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)
     @TableField(exist = false)
     private List<Integer> multiDegrIdList;
     private List<Integer> multiDegrIdList;
 
 
+    @TableField(exist = false)
+    private String userReportDeptName;
+
     @Override
     @Override
     protected Serializable pkVal() {
     protected Serializable pkVal() {
         return this.id;
         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")
     @TableField("hide_subproject")
     private Integer hideSubproject;
     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")
     @TableField("only_audit_once")
     private Integer onlyAuditOnce;
     private Integer onlyAuditOnce;
 
 
+    @TableField(exist = false)
+    private List<Department> userReportDeptList;
+
 
 
     @Override
     @Override
     protected Serializable pkVal() {
     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 departmentName;
     public String corpwxUserId;
     public String corpwxUserId;
     public String corpwxDeptId;
     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 userName;
     private String corpwxUserId;
     private String corpwxUserId;
     private Integer corpwxDeptId;
     private Integer corpwxDeptId;
+    private Integer corpDdDeptId;
     private String departmentName;
     private String departmentName;
     private String timelinessRate;
     private String timelinessRate;
     private String timelinessRateWithLeave;
     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.baomidou.mybatisplus.extension.service.IService;
 import com.dingtalk.api.request.OapiMessageCorpconversationAsyncsendV2Request;
 import com.dingtalk.api.request.OapiMessageCorpconversationAsyncsendV2Request;
 import com.management.platform.entity.CompanyDingding;
 import com.management.platform.entity.CompanyDingding;
+import com.management.platform.util.HttpRespMsg;
 
 
 import java.time.LocalDate;
 import java.time.LocalDate;
 import java.util.List;
 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 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);
     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);
     String exportWxDepartment(Department department,List<Department> departmentList);
 
 
     HttpRespMsg sortList(HttpServletRequest request,List<DepartmentVO> list);
     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 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;
     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,
     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,
                            Integer salaryType, String costApplyDate, String position, String certJson,
                            HttpServletRequest request,String inductionDate, String superiorId,String plate1,
                            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);
     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;
 package com.management.platform.service.impl;
 
 
 import com.alibaba.fastjson.JSONObject;
 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.GetCorpAccessTokenRequest;
 import com.aliyun.dingtalkoauth2_1_0.models.GetCorpAccessTokenResponse;
 import com.aliyun.dingtalkoauth2_1_0.models.GetCorpAccessTokenResponse;
 import com.aliyun.tea.TeaException;
 import com.aliyun.tea.TeaException;
 import com.aliyun.teaopenapi.models.Config;
 import com.aliyun.teaopenapi.models.Config;
+import com.aliyun.teautil.models.RuntimeOptions;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.dingtalk.api.DefaultDingTalkClient;
 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.CompanyDingding;
 import com.management.platform.entity.SysConfig;
 import com.management.platform.entity.SysConfig;
 import com.management.platform.entity.TimeType;
 import com.management.platform.entity.TimeType;
+import com.management.platform.entity.User;
 import com.management.platform.mapper.CompanyDingdingMapper;
 import com.management.platform.mapper.CompanyDingdingMapper;
 import com.management.platform.mapper.SysConfigMapper;
 import com.management.platform.mapper.SysConfigMapper;
 import com.management.platform.mapper.TimeTypeMapper;
 import com.management.platform.mapper.TimeTypeMapper;
 import com.management.platform.service.CompanyDingdingService;
 import com.management.platform.service.CompanyDingdingService;
+import com.management.platform.util.HttpRespMsg;
 import com.taobao.api.ApiException;
 import com.taobao.api.ApiException;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
@@ -594,4 +598,41 @@ public class CompanyDingdingServiceImpl extends ServiceImpl<CompanyDingdingMappe
         accessToken = dingding.getAccessToken();
         accessToken = dingding.getAccessToken();
         return accessToken;
         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.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.Wrapper;
 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.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.management.platform.entity.*;
 import com.management.platform.entity.*;
@@ -96,6 +97,7 @@ public class ContractServiceImpl extends ServiceImpl<ContractMapper, Contract> i
             String token = request.getHeader("token");
             String token = request.getHeader("token");
             User user = userMapper.selectById(token);
             User user = userMapper.selectById(token);
             WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", user.getCompanyId()));
             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(), "查看全部合同");
             List<SysRichFunction> functionContractList = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "查看全部合同");
             if(functionContractList.size() <= 0){
             if(functionContractList.size() <= 0){
                 httpRespMsg.setError(MessageUtils.message("access.viewError"));
                 httpRespMsg.setError(MessageUtils.message("access.viewError"));
@@ -179,6 +181,8 @@ public class ContractServiceImpl extends ServiceImpl<ContractMapper, Contract> i
                             String msg = "";
                             String msg = "";
                             if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                             if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                                 msg = "$userName=" + contractLog.get("operateCorpWxId") + "$" + contractLog.get("msg");
                                 msg = "$userName=" + contractLog.get("operateCorpWxId") + "$" + contractLog.get("msg");
+                            }if(dingding!=null&&dingding.getContactNeedTranslate()==1){
+                                msg = "$userName=" + contractLog.get("operateName") + "$" + contractLog.get("msg");
                             }else {
                             }else {
                                 msg = contractLog.get("operateName") + "" + contractLog.get("msg");
                                 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()+"");
             item.add(contract.getEndDate()==null?"":contract.getEndDate()+"");
             if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
             if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                 contract.setCreatorName("$userName=" + contract.getCreatorWxCorpId() + "$");
                 contract.setCreatorName("$userName=" + contract.getCreatorWxCorpId() + "$");
+            }if(dingding!=null&&dingding.getContactNeedTranslate()==1){
+                contract.setCreatorName("$userName=" + contract.getCreatorName() + "$");
             }else {
             }else {
                 contract.setCreatorName(contract.getCreatorName());
                 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){
                 if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                     String corpwxUserId = userList.stream().filter(ul -> ul.getId().equals(uid)).findFirst().get().getCorpwxUserid();
                     String corpwxUserId = userList.stream().filter(ul -> ul.getId().equals(uid)).findFirst().get().getCorpwxUserid();
                     name ="$userName="+ (corpwxUserId==null?"":corpwxUserId) +"$";
                     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 {
                 }else {
                      name = userList.stream().filter(ul -> ul.getId().equals(uid)).findFirst().get().getName();
                      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) {
             for (Map<String, Object> membMap : itemList) {
                 List<String> membRowData = new ArrayList<String>();
                 List<String> membRowData = new ArrayList<String>();
                 membRowData.add(String.valueOf(seq));
                 membRowData.add(String.valueOf(seq));
-                if(wxCorpInfo.getSaasSyncContact()==1){
+                if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                     membRowData.add("$userName="+(String)membMap.get("name")+"$");
                     membRowData.add("$userName="+(String)membMap.get("name")+"$");
                 }else {
                 }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());
                 membRowData.add(((Double)membMap.get("cost")).toString());
                 allList.add(membRowData);
                 allList.add(membRowData);
@@ -1386,6 +1393,8 @@ public class DepartmentServiceImpl extends ServiceImpl<DepartmentMapper, Departm
                 List<String> item=new ArrayList<>();
                 List<String> item=new ArrayList<>();
                 if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                 if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                     item.add("$departmentName="+(departmentMasterVO.getCorpwxDeptid()==null?"":departmentMasterVO.getCorpwxDeptid())+"$");
                     item.add("$departmentName="+(departmentMasterVO.getCorpwxDeptid()==null?"":departmentMasterVO.getCorpwxDeptid())+"$");
+                }else if(dingding!=null&&dingding.getContactNeedTranslate()==1){
+                    item.add("$departmentName="+(departmentMasterVO.getDdDeptid()==null?"":departmentMasterVO.getDdDeptid())+"$");
                 }else {
                 }else {
                     item.add(departmentMasterVO.getDepartmentName());
                     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
      * @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.setCorpName(corpName);
         dingding.setAgentId(agentId);
         dingding.setAgentId(agentId);
         dingding.setAuthUserId(authUserId);
         dingding.setAuthUserId(authUserId);
-        dingding.setSyncContact(1);
-        dingding.setContactNeedTranslate(1);//上架到钉钉应用市场,通讯录为加密模式,需要转译
-
         if (oldD == null) {
         if (oldD == null) {
+            //新开通的情况,给字段默认值
+            dingding.setSyncContact(1);
+            dingding.setContactNeedTranslate(1);//上架到钉钉应用市场,通讯录为加密模式,需要转译
             //第一次,查询对方企业的accessToken
             //第一次,查询对方企业的accessToken
             SysConfig config = sysConfigMapper.selectOne(new QueryWrapper<SysConfig>().eq("param_key", "dingding_suite_ticket"));
             SysConfig config = sysConfigMapper.selectOne(new QueryWrapper<SysConfig>().eq("param_key", "dingding_suite_ticket"));
             String suiteTicket = config.getParamValue();
             String suiteTicket = config.getParamValue();
@@ -521,6 +521,7 @@ public class DingDingServiceImpl implements DingDingService {
                     .setRoleId(smanager.getId())
                     .setRoleId(smanager.getId())
                     .setRoleName(smanager.getRolename())
                     .setRoleName(smanager.getRolename())
                     .setDingdingUserid(authUserId)
                     .setDingdingUserid(authUserId)
+                    .setName(authUserId)//新版,钉钉应用市场的用userId作name
                     .setColor(ColorUtil.randomColor())
                     .setColor(ColorUtil.randomColor())
                     .setCompanyId(company.getId());
                     .setCompanyId(company.getId());
 
 
@@ -813,11 +814,11 @@ public class DingDingServiceImpl implements DingDingService {
                 JSONArray deptArray = json.getJSONObject("auth_org_scopes").getJSONArray("authed_dept");
                 JSONArray deptArray = json.getJSONObject("auth_org_scopes").getJSONArray("authed_dept");
                 //如果授权的是全部公司部门,则递归获取子部门和人员
                 //如果授权的是全部公司部门,则递归获取子部门和人员
                 if (deptArray.size() == 1 && deptArray.getLong(0) == 1L) {
                 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 {
                 } else {
                     for (int i=0;i<deptArray.size(); i++) {
                     for (int i=0;i<deptArray.size(); i++) {
                         long deptId = deptArray.getLongValue(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) {
             if (dept.getDdDeptid() != null) {
                 Optional<DepartmentDingding> first = dingdingDeptList.stream().filter(ddpt -> ddpt.getDdDeptid().equals(dept.getDdDeptid())).findFirst();
                 Optional<DepartmentDingding> first = dingdingDeptList.stream().filter(ddpt -> ddpt.getDdDeptid().equals(dept.getDdDeptid())).findFirst();
                 if (first.isPresent()) {
                 if (first.isPresent()) {
-
                     boolean changed = false;
                     boolean changed = false;
                     DepartmentDingding departmentDingding = first.get();
                     DepartmentDingding departmentDingding = first.get();
                     if (departmentDingding.getDdParentid() == 1) {
                     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());
                         dept.setDepartmentName(departmentDingding.getName());
                         changed = true;
                         changed = true;
                     }
                     }
@@ -957,11 +958,13 @@ public class DingDingServiceImpl implements DingDingService {
                 User upUser = new User();
                 User upUser = new User();
                 upUser.setId(oldUser.getId());
                 upUser.setId(oldUser.getId());
                 boolean changed = false;
                 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()))) {
                 if (!StringUtils.isEmpty(duser.getJobNumber()) && (oldUser.getJobNumber() == null || !oldUser.getJobNumber().equals(duser.getJobNumber()))) {
                     upUser.setJobNumber(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 {
         try {
             DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/department/get");
             DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/department/get");
             OapiV2DepartmentGetRequest req = new OapiV2DepartmentGetRequest();
             OapiV2DepartmentGetRequest req = new OapiV2DepartmentGetRequest();
@@ -1516,12 +1519,13 @@ public class DingDingServiceImpl implements DingDingService {
                 DepartmentDingding departmentDingding = new DepartmentDingding();
                 DepartmentDingding departmentDingding = new DepartmentDingding();
                 departmentDingding.setCorpid(corpid);
                 departmentDingding.setCorpid(corpid);
                 departmentDingding.setDdDeptid(dept.getInteger("dept_id"));
                 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"));
                 departmentDingding.setDdParentid(dept.getInteger("parent_id"));
                 Department department = new Department();
                 Department department = new Department();
-                if (departmentDingding.getDdDeptid() == 661842181) {
-                    System.out.println("=========zfind 661842181"+departmentDingding.getName());
-                }
                 department.setCompanyId(companyId);
                 department.setCompanyId(companyId);
                 //检查,根部门是公司名称,不需要创建部门
                 //检查,根部门是公司名称,不需要创建部门
                 if (departmentDingding.getDdDeptid() != 1) {
                 if (departmentDingding.getDdDeptid() != 1) {
@@ -1536,7 +1540,7 @@ public class DingDingServiceImpl implements DingDingService {
                             departmentDingding.setId(old.getId());
                             departmentDingding.setId(old.getId());
                             //检查名称是否发生变化
                             //检查名称是否发生变化
                             System.out.println(departmentDingding.getName()+" -- 已存在:"+departmentDingding.getDdDeptid());
                             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);
                                 departmentDingdingMapper.updateById(departmentDingding);
                                 System.out.println("更新该部门");
                                 System.out.println("更新该部门");
                             }
                             }
@@ -1549,7 +1553,7 @@ public class DingDingServiceImpl implements DingDingService {
                 //获取该部门下的人员, 如果是根部门,不会创建,人员的部门id会使用数据库默认的0
                 //获取该部门下的人员, 如果是根部门,不会创建,人员的部门id会使用数据库默认的0
                 getDeptUserIdList(corpid, deptId, accessToken, addTempUserList);
                 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) {
         } catch (ApiException e) {
             e.printStackTrace();
             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");
         DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/department/listsub");
         OapiV2DepartmentListsubRequest req = new OapiV2DepartmentListsubRequest();
         OapiV2DepartmentListsubRequest req = new OapiV2DepartmentListsubRequest();
         req.setDeptId(parentDeptId);
         req.setDeptId(parentDeptId);
@@ -1573,7 +1577,12 @@ public class DingDingServiceImpl implements DingDingService {
                 DepartmentDingding departmentDingding = new DepartmentDingding();
                 DepartmentDingding departmentDingding = new DepartmentDingding();
                 departmentDingding.setCorpid(corpid);
                 departmentDingding.setCorpid(corpid);
                 departmentDingding.setDdDeptid(dept.getInteger("dept_id"));
                 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"));
                 departmentDingding.setDdParentid(dept.getInteger("parent_id"));
                 if (departmentDingding.getDdDeptid() == 661842181) {
                 if (departmentDingding.getDdDeptid() == 661842181) {
                     System.out.println("=========zfind 661842181"+departmentDingding.getName());
                     System.out.println("=========zfind 661842181"+departmentDingding.getName());
@@ -1588,7 +1597,8 @@ public class DingDingServiceImpl implements DingDingService {
                         departmentDingding.setId(old.getId());
                         departmentDingding.setId(old.getId());
                         //检查名称是否发生变化
                         //检查名称是否发生变化
                         System.out.println(departmentDingding.getName()+" -- 已存在:"+departmentDingding.getDdDeptid());
                         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);
                             departmentDingdingMapper.updateById(departmentDingding);
                             System.out.println("更新该部门");
                             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);
             getDeptUserIdList(corpid, parentDeptId, access_token, addTempUserList);
@@ -1642,7 +1652,7 @@ public class DingDingServiceImpl implements DingDingService {
                     .setRoleId(defaultRole.getId())
                     .setRoleId(defaultRole.getId())
                     .setRoleName(defaultRole.getRolename())
                     .setRoleName(defaultRole.getRolename())
                     .setCompanyId(dingding.getCompanyId())
                     .setCompanyId(dingding.getCompanyId())
-                    .setName(userJson.getString("name"))
+                    .setName(dingding.getContactNeedTranslate() == 0?userJson.getString("name"):dingdingUserid)
                     .setDingdingUserid(dingdingUserid)
                     .setDingdingUserid(dingdingUserid)
                     .setDingdingUnionid(userJson.getString("unionid"))
                     .setDingdingUnionid(userJson.getString("unionid"))
                     .setColor(ColorUtil.randomColor());
                     .setColor(ColorUtil.randomColor());
@@ -1698,9 +1708,12 @@ public class DingDingServiceImpl implements DingDingService {
         DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/user/get");
         DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/user/get");
         OapiV2UserGetRequest req = new OapiV2UserGetRequest();
         OapiV2UserGetRequest req = new OapiV2UserGetRequest();
         req.setUserid(dingdingUserid);
         req.setUserid(dingdingUserid);
+        if ("0515450852840252".equals(dingdingUserid)) {
+            System.out.println("这是张杰====================");
+        }
         req.setLanguage("zh_CN");
         req.setLanguage("zh_CN");
         OapiV2UserGetResponse rsp = client.execute(req, access_token);
         OapiV2UserGetResponse rsp = client.execute(req, access_token);
-        System.out.println(rsp.getBody());
+        System.out.println("用户详情:"+rsp.getBody());
         JSONObject resp = JSONObject.parseObject(rsp.getBody());
         JSONObject resp = JSONObject.parseObject(rsp.getBody());
         if (resp.getInteger("errcode") == 0) {
         if (resp.getInteger("errcode") == 0) {
             JSONObject userJson = resp.getJSONObject("result");
             JSONObject userJson = resp.getJSONObject("result");
@@ -1710,7 +1723,12 @@ public class DingDingServiceImpl implements DingDingService {
             if (!addTempUserList.stream().anyMatch(add->add.getDingdingUserid().equals(dingdingUserid))) {
             if (!addTempUserList.stream().anyMatch(add->add.getDingdingUserid().equals(dingdingUserid))) {
                 TempDuser duser = new TempDuser();
                 TempDuser duser = new TempDuser();
                 duser.setDingdingUserid(dingdingUserid);
                 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.setDdDeptid(ddDeptId);
                 duser.setCorpid(corpid);
                 duser.setCorpid(corpid);
                 duser.setJobNumber(userJson.getString("job_number"));
                 duser.setJobNumber(userJson.getString("job_number"));
@@ -2574,6 +2592,7 @@ public class DingDingServiceImpl implements DingDingService {
         JSONObject obj = JSONObject.parseObject(response.getBody());
         JSONObject obj = JSONObject.parseObject(response.getBody());
         if (obj.getIntValue("errcode") == 0) {
         if (obj.getIntValue("errcode") == 0) {
             media_id = obj.getString("media_id");
             media_id = obj.getString("media_id");
+            System.out.println("钉钉转译media_id=========="+media_id);
             return media_id;
             return media_id;
         }
         }
         return null;
         return null;
@@ -2595,15 +2614,19 @@ public class DingDingServiceImpl implements DingDingService {
             try {
             try {
                 TranslateFileResponse translateFileResponse = client.translateFileWithOptions(translateFileRequest, translateFileHeaders, new RuntimeOptions());
                 TranslateFileResponse translateFileResponse = client.translateFileWithOptions(translateFileRequest, translateFileHeaders, new RuntimeOptions());
                 TranslateFileResponseBody body = translateFileResponse.body;
                 TranslateFileResponseBody body = translateFileResponse.body;
+                System.out.println("钉钉转译jobId=========="+body.jobId);
+                System.out.println("钉钉转译body=========="+body);
                 return body.jobId;
                 return body.jobId;
             } catch (TeaException err) {
             } catch (TeaException err) {
                 if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
                 if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
                     // err 中含有 code 和 message 属性,可帮助开发定位问题
                     // err 中含有 code 和 message 属性,可帮助开发定位问题
+                    System.err.println(err.code+": " +err.message);
                 }
                 }
             } catch (Exception _err) {
             } catch (Exception _err) {
                 TeaException err = new TeaException(_err.getMessage(), _err);
                 TeaException err = new TeaException(_err.getMessage(), _err);
                 if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
                 if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
                     // err 中含有 code 和 message 属性,可帮助开发定位问题
                     // err 中含有 code 和 message 属性,可帮助开发定位问题
+                    System.err.println(err.code+": " +err.message);
                 }
                 }
 
 
             }
             }
@@ -2622,15 +2645,18 @@ public class DingDingServiceImpl implements DingDingService {
             try {
             try {
                 GetTranslateFileJobResultResponse translateFileJobResultWithOptions = client.getTranslateFileJobResultWithOptions(getTranslateFileJobResultRequest, getTranslateFileJobResultHeaders, new RuntimeOptions());
                 GetTranslateFileJobResultResponse translateFileJobResultWithOptions = client.getTranslateFileJobResultWithOptions(getTranslateFileJobResultRequest, getTranslateFileJobResultHeaders, new RuntimeOptions());
                 GetTranslateFileJobResultResponseBody body = translateFileJobResultWithOptions.body;
                 GetTranslateFileJobResultResponseBody body = translateFileJobResultWithOptions.body;
+                System.out.println("钉钉转译url=========="+body.url);
                 return body.url;
                 return body.url;
             } catch (TeaException err) {
             } catch (TeaException err) {
                 if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
                 if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
                     // err 中含有 code 和 message 属性,可帮助开发定位问题
                     // err 中含有 code 和 message 属性,可帮助开发定位问题
+                    System.err.println(err.code+": " +err.message);
                 }
                 }
             } catch (Exception _err) {
             } catch (Exception _err) {
                 TeaException err = new TeaException(_err.getMessage(), _err);
                 TeaException err = new TeaException(_err.getMessage(), _err);
                 if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
                 if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
                     // err 中含有 code 和 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("处理超时...");
                 httpRespMsg.setError(MessageUtils.message("request.outTime"));
                 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"));
             User user = userMapper.selectById(request.getHeader("token"));
             String mediaId = dingDingService.getTranslationMediaId(fileUrlSuffix,dingding);
             String mediaId = dingDingService.getTranslationMediaId(fileUrlSuffix,dingding);
             String jobId = dingDingService.syncTranslation(mediaId,fileUrlSuffix, user.getDingdingUnionid(),dingding);
             String jobId = dingDingService.syncTranslation(mediaId,fileUrlSuffix, user.getDingdingUnionid(),dingding);
@@ -218,7 +218,7 @@ public class ExcelExportServiceImpl implements ExcelExportService {
                 //httpRespMsg.setError("处理超时...");
                 //httpRespMsg.setError("处理超时...");
                 httpRespMsg.setError(MessageUtils.message("request.outTime"));
                 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"));
             User user = userMapper.selectById(request.getHeader("token"));
             String mediaId = dingDingService.getTranslationMediaId(fileUrlSuffix,dingding);
             String mediaId = dingDingService.getTranslationMediaId(fileUrlSuffix,dingding);
             String jobId = dingDingService.syncTranslation(mediaId,fileUrlSuffix, user.getDingdingUnionid(),dingding);
             String jobId = dingDingService.syncTranslation(mediaId,fileUrlSuffix, user.getDingdingUnionid(),dingding);
@@ -294,7 +294,7 @@ public class ExcelExportServiceImpl implements ExcelExportService {
                 //httpRespMsg.setError("处理超时...");
                 //httpRespMsg.setError("处理超时...");
                 httpRespMsg.setError(MessageUtils.message("request.outTime"));
                 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"));
             User user = userMapper.selectById(request.getHeader("token"));
             String mediaId = dingDingService.getTranslationMediaId(fileUrlSuffix,dingding);
             String mediaId = dingDingService.getTranslationMediaId(fileUrlSuffix,dingding);
             String jobId = dingDingService.syncTranslation(mediaId,fileUrlSuffix, user.getDingdingUnionid(),dingding);
             String jobId = dingDingService.syncTranslation(mediaId,fileUrlSuffix, user.getDingdingUnionid(),dingding);
@@ -371,7 +371,7 @@ public class ExcelExportServiceImpl implements ExcelExportService {
                 //httpRespMsg.setError("处理超时...");
                 //httpRespMsg.setError("处理超时...");
                 httpRespMsg.setError(MessageUtils.message("request.outTime"));
                 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"));
             User user = userMapper.selectById(request.getHeader("token"));
             String mediaId = dingDingService.getTranslationMediaId(fileUrlSuffix,dingding);
             String mediaId = dingDingService.getTranslationMediaId(fileUrlSuffix,dingding);
             String jobId = dingDingService.syncTranslation(mediaId,fileUrlSuffix,user.getDingdingUnionid(), dingding);
             String jobId = dingDingService.syncTranslation(mediaId,fileUrlSuffix,user.getDingdingUnionid(), dingding);
@@ -446,7 +446,7 @@ public class ExcelExportServiceImpl implements ExcelExportService {
                 //httpRespMsg.setError("处理超时...");
                 //httpRespMsg.setError("处理超时...");
                 httpRespMsg.setError(MessageUtils.message("request.outTime"));
                 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"));
             User user = userMapper.selectById(request.getHeader("token"));
             String mediaId = dingDingService.getTranslationMediaId(fileUrlSuffix,dingding);
             String mediaId = dingDingService.getTranslationMediaId(fileUrlSuffix,dingding);
             String jobId = dingDingService.syncTranslation(mediaId,fileUrlSuffix,user.getDingdingUnionid(), 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.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 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.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -97,6 +98,8 @@ public class ExpenseSheetServiceImpl extends ServiceImpl<ExpenseSheetMapper, Exp
     private ExpenseAuditSettingMapper expenseAuditSettingMapper;
     private ExpenseAuditSettingMapper expenseAuditSettingMapper;
     @Resource
     @Resource
     private CompanyDingdingMapper companyDingdingMapper;
     private CompanyDingdingMapper companyDingdingMapper;
+    @Resource
+    private CompanyDingdingService companyDingdingService;
 
 
 
 
     @Override
     @Override
@@ -791,7 +794,7 @@ public class ExpenseSheetServiceImpl extends ServiceImpl<ExpenseSheetMapper, Exp
         information.setUserId(owner.getId());
         information.setUserId(owner.getId());
         information.setTime(LocalDateTime.now());
         information.setTime(LocalDateTime.now());
         information.setMsg("您"+(sheet.getCreateDate() == null?"":dateTimeFormatter.format(sheet.getCreateDate())) + "费用报销申请审核"+(sheet.getStatus() == 0?"已通过":"已驳回")+", 审核人:"
         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.setType(3);//费用报销模块
         information.setContent(sheet.getId()+"");
         information.setContent(sheet.getId()+"");
         informationMapper.insert(information);
         informationMapper.insert(information);
@@ -802,6 +805,7 @@ public class ExpenseSheetServiceImpl extends ServiceImpl<ExpenseSheetMapper, Exp
         HttpRespMsg msg = new HttpRespMsg();
         HttpRespMsg msg = new HttpRespMsg();
         User user = userMapper.selectById(request.getHeader("token"));
         User user = userMapper.selectById(request.getHeader("token"));
         WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", 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()));
         //然后处理文件
         //然后处理文件
         for (MultipartFile multipartFile : files) {
         for (MultipartFile multipartFile : files) {
             String fileName = multipartFile.getOriginalFilename();
             String fileName = multipartFile.getOriginalFilename();
@@ -857,20 +861,37 @@ public class ExpenseSheetServiceImpl extends ServiceImpl<ExpenseSheetMapper, Exp
                 //做完非空校验后,进行姓名处理
                 //做完非空校验后,进行姓名处理
 
 
                 String reimburserName = reimburserCell.getStringCellValue();
                 String reimburserName = reimburserCell.getStringCellValue();
-
+                List<String> userNameList=new ArrayList<>();
+                userNameList.add(reimburserName);
                 HttpRespMsg respMsg= null;
                 HttpRespMsg respMsg= null;
                 List<User> targetUserList= new ArrayList<>();
                 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);
                     respMsg = wxCorpInfoService.getBatchSearchUserInfo(wxCorpInfo, userNameList,null);
                     if(respMsg.code.equals("0")){
                     if(respMsg.code.equals("0")){
                         msg.setError("姓名为["+String.valueOf(respMsg.data)+"]的人员存在重复,请使用工号!");
                         msg.setError("姓名为["+String.valueOf(respMsg.data)+"]的人员存在重复,请使用工号!");
                         return msg;
                         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();
                 ExpenseSheet expenseSheet = new ExpenseSheet();
                 if(functionList.size()>0){
                 if(functionList.size()>0){
                     expenseSheet.setStatus(0);
                     expenseSheet.setStatus(0);
@@ -898,18 +919,18 @@ public class ExpenseSheetServiceImpl extends ServiceImpl<ExpenseSheetMapper, Exp
                         .atZone(ZoneId.systemDefault()).toLocalDate();
                         .atZone(ZoneId.systemDefault()).toLocalDate();
                 expenseSheet.setCreateDate(localDate);
                 expenseSheet.setCreateDate(localDate);
                 Optional<User> first;
                 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.setOperatorId(user.getId());
                 expenseSheet.setRemark(remarksCell.getStringCellValue());
                 expenseSheet.setRemark(remarksCell.getStringCellValue());
                 if(StringUtils.isEmpty(expenseTypeCell.getStringCellValue())){
                 if(StringUtils.isEmpty(expenseTypeCell.getStringCellValue())){
@@ -1010,7 +1031,7 @@ public class ExpenseSheetServiceImpl extends ServiceImpl<ExpenseSheetMapper, Exp
                         }
                         }
                     }
                     }
                     if(subExpenseTypeCell!=null){
                     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())){
                         if(stringList!=null&&!stringList.contains(subExpenseTypeCell.getStringCellValue())){
                             //msg.setError("当前费用类型["+expenseTypeCell.getStringCellValue()+"]中不存在["+subExpenseTypeCell.getStringCellValue()+"]类型");
                             //msg.setError("当前费用类型["+expenseTypeCell.getStringCellValue()+"]中不存在["+subExpenseTypeCell.getStringCellValue()+"]类型");
                             msg.setError(MessageUtils.message("Reimbursement.TypeError",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<>();
                 List<String> item=new ArrayList<>();
                 if (wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                 if (wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                     item.add("$userName=" + record.getOwnerName() +"$");
                     item.add("$userName=" + record.getOwnerName() +"$");
+                }else if (dingding!=null&&dingding.getContactNeedTranslate()==1){
+                    item.add("$userName=" + record.getOwnerName() +"$");
                 }else {
                 }else {
                     item.add(record.getOwnerName());
                     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 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 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);
                             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){
                             if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                                 membRowData.add("$userName="+(us.getCorpwxUserid()==null?"":us.getCorpwxUserid())+"$");
                                 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 {
                             }else {
                                 membRowData.add(us.getName());
                                 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++) {
                             for (int i = 0; i < userCustoms.size(); i++) {
                                 switch (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();
                                     User us = userList.stream().filter(u->u.getId().equals(npu.getUserId())).findFirst().get();
                                     if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                                     if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                                         membRowData.add("$userName="+(us.getCorpwxUserid()==null?"":us.getCorpwxUserid())+"$");
                                         membRowData.add("$userName="+(us.getCorpwxUserid()==null?"":us.getCorpwxUserid())+"$");
+                                    }else if(dingding!=null&&dingding.getContactNeedTranslate()==1){
+                                        membRowData.add("$userName="+npu.getName()+"$");
                                     }else {
                                     }else {
                                         membRowData.add(npu.getName());
                                         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;
 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.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 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.InformationMapper;
 import com.management.platform.mapper.UserMapper;
 import com.management.platform.mapper.UserMapper;
 import com.management.platform.mapper.WxCorpInfoMapper;
 import com.management.platform.mapper.WxCorpInfoMapper;
+import com.management.platform.service.CompanyDingdingService;
 import com.management.platform.service.InformationService;
 import com.management.platform.service.InformationService;
 import com.management.platform.util.HttpRespMsg;
 import com.management.platform.util.HttpRespMsg;
 import com.management.platform.util.MessageUtils;
 import com.management.platform.util.MessageUtils;
@@ -40,6 +39,8 @@ public class InformationServiceImpl extends ServiceImpl<InformationMapper, Infor
 
 
     @Resource
     @Resource
     private InformationService informationService;
     private InformationService informationService;
+    @Resource
+    private CompanyDingdingService companyDingdingService;
 
 
     @Override
     @Override
     public HttpRespMsg getInformationList(HttpServletRequest request) {
     public HttpRespMsg getInformationList(HttpServletRequest request) {
@@ -49,24 +50,27 @@ public class InformationServiceImpl extends ServiceImpl<InformationMapper, Infor
             List<Information> information = informationMapper.selectList(new QueryWrapper<Information>()
             List<Information> information = informationMapper.selectList(new QueryWrapper<Information>()
                     .eq("user_id", user.getId()).orderByDesc("time").last("LIMIT 20"));
                     .eq("user_id", user.getId()).orderByDesc("time").last("LIMIT 20"));
             WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id",user.getCompanyId()));
             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();
                                 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;
             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.setUserId(owner.getId());
         information.setTime(LocalDateTime.now());
         information.setTime(LocalDateTime.now());
         information.setMsg("您"+applyTimeDesc + "请假申请审核"+(sheet.getStatus() == 0?"已通过":"已驳回")+", 审核人:"
         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.setType(4);
         information.setContent(sheet.getId()+"");
         information.setContent(sheet.getId()+"");
         informationMapper.insert(information);
         informationMapper.insert(information);
@@ -226,7 +226,7 @@ public class LeaveSheetServiceImpl extends ServiceImpl<LeaveSheetMapper, LeaveSh
         information.setUserId(sheet.getAuditorId());
         information.setUserId(sheet.getAuditorId());
         information.setTime(LocalDateTime.now());
         information.setTime(LocalDateTime.now());
         User owner = userMapper.selectById(sheet.getOwnerId());
         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.setType(4);
         information.setContent(sheet.getId()+"");
         information.setContent(sheet.getId()+"");
         informationMapper.insert(information);
         informationMapper.insert(information);
@@ -606,6 +606,13 @@ public class LeaveSheetServiceImpl extends ServiceImpl<LeaveSheetMapper, LeaveSh
                 }else {
                 }else {
                     item.add("");
                     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 {
             }else {
                 item.add(leaveSheet.getOwnerName()==null?"":leaveSheet.getOwnerName());
                 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();
             Optional<User> first = userList.stream().filter(u -> u.getId().equals(leaveSheet.getAuditorId())).findFirst();
             String auditorName = first.isPresent()?first.get().getName():"";
             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+"$";
                 auditorName = "$userName="+auditorName+"$";
             }
             }
             String statusS = "";
             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.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 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.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -55,6 +56,8 @@ public class ProjectApprovalServiceImpl extends ServiceImpl<ProjectApprovalMappe
     @Resource
     @Resource
     private SysFunctionService sysFunctionService;
     private SysFunctionService sysFunctionService;
     @Resource
     @Resource
+    private CompanyDingdingService companyDingdingService;
+    @Resource
     private ProjectApprovalCheckService projectApprovalCheckService;
     private ProjectApprovalCheckService projectApprovalCheckService;
     @Resource
     @Resource
     private WxCorpInfoService wxCorpInfoService;
     private WxCorpInfoService wxCorpInfoService;
@@ -173,6 +176,7 @@ public class ProjectApprovalServiceImpl extends ServiceImpl<ProjectApprovalMappe
         User user = userMapper.selectById(request.getHeader("token"));
         User user = userMapper.selectById(request.getHeader("token"));
         String[] arr=new String[]{"正常","紧急","重要","重要且紧急","低风险","中风险","高风险"};
         String[] arr=new String[]{"正常","紧急","重要","重要且紧急","低风险","中风险","高风险"};
         WxCorpInfo wxCorpInfo = wxCorpInfoService.getOne(new LambdaQueryWrapper<WxCorpInfo>().eq(WxCorpInfo::getCompanyId, user.getCompanyId()));
         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());
         TimeType timeType = timeTypeMapper.selectById(user.getCompanyId());
         String fileName = multipartFile.getOriginalFilename();
         String fileName = multipartFile.getOriginalFilename();
         File file = new File(fileName == null ? "file" : fileName);
         File file = new File(fileName == null ? "file" : fileName);
@@ -245,6 +249,7 @@ public class ProjectApprovalServiceImpl extends ServiceImpl<ProjectApprovalMappe
                     userNameList.add(inchargerName);
                     userNameList.add(inchargerName);
                 }
                 }
             }
             }
+            List<User> targetUserList=new ArrayList<>();
             HttpRespMsg respMsg=new HttpRespMsg();
             HttpRespMsg respMsg=new HttpRespMsg();
             if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1&&userNameList.size()>0){
             if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1&&userNameList.size()>0){
                 System.out.println("参与搜素的人员列表"+userNameList + userNameList.size());
                 System.out.println("参与搜素的人员列表"+userNameList + userNameList.size());
@@ -253,8 +258,26 @@ public class ProjectApprovalServiceImpl extends ServiceImpl<ProjectApprovalMappe
                     msg.setError("姓名为["+String.valueOf(respMsg.data)+"]的人员存在重复,请使用工号!");
                     msg.setError("姓名为["+String.valueOf(respMsg.data)+"]的人员存在重复,请使用工号!");
                     return msg;
                     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;
             int importCount = 0;
             for (int rowIndex = 0; rowIndex <= rowNum; rowIndex++) {
             for (int rowIndex = 0; rowIndex <= rowNum; rowIndex++) {
                 XSSFRow row = sheet.getRow(rowIndex);
                 XSSFRow row = sheet.getRow(rowIndex);
@@ -372,17 +395,17 @@ public class ProjectApprovalServiceImpl extends ServiceImpl<ProjectApprovalMappe
                         Optional<User> first;
                         Optional<User> first;
                         Integer exception=null;
                         Integer exception=null;
                         if(split.length==1){
                         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();
                                 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 {
                             }else {
                                 first= userList.stream().filter(u -> u.getName().equals(split[0])||(u.getJobNumber()!=null&&u.getJobNumber().equals(split[0]))).findFirst();
                                 first= userList.stream().filter(u -> u.getName().equals(split[0])||(u.getJobNumber()!=null&&u.getJobNumber().equals(split[0]))).findFirst();
                             }
                             }
                             exception=0;
                             exception=0;
                         }else {
                         }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();
                                 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;
                                 exception=1;
                             }else {
                             }else {
                                 first= userList.stream().filter(u -> u.getName().equals(split[1])&&(u.getJobNumber()!=null&&u.getJobNumber().equals(split[1]))).findFirst();
                                 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.getProjectName());
             item.add(record.getCategoryName());
             item.add(record.getCategoryName());
             item.add(record.getIsPublic()==0?"正式项目":"非项目");
             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())+"$");
                 item.add("$userName="+(record.getInchargerName()==null?"":record.getInchargerName())+"$");
             }else {
             }else {
                 item.add(record.getInchargerName()==null?"":record.getInchargerName());
                 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.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 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.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.management.platform.entity.*;
 import com.management.platform.entity.*;
 import com.management.platform.mapper.*;
 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.ExcelUtil;
 import com.management.platform.util.HttpRespMsg;
 import com.management.platform.util.HttpRespMsg;
 import com.management.platform.util.MessageUtils;
 import com.management.platform.util.MessageUtils;
@@ -61,6 +60,8 @@ public class ProjectPercentageServiceImpl extends ServiceImpl<ProjectPercentageM
     private ExcelExportService excelExportService;
     private ExcelExportService excelExportService;
     @Resource
     @Resource
     private ProjectPercentageService projectPercentageService;
     private ProjectPercentageService projectPercentageService;
+    @Resource
+    private CompanyDingdingService companyDingdingService;
     @Value(value = "${upload.path}")
     @Value(value = "${upload.path}")
     private String path;
     private String path;
     @Override
     @Override
@@ -170,6 +171,7 @@ public class ProjectPercentageServiceImpl extends ServiceImpl<ProjectPercentageM
             //获取公司全部成员
             //获取公司全部成员
             List<User> allUserList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", companyId));
             List<User> allUserList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", companyId));
             WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().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);
             Sheet sheet = workbook.getSheetAt(0);
             //由于第一行需要指明列对应的标题
             //由于第一行需要指明列对应的标题
             int rowNum = sheet.getLastRowNum();
             int rowNum = sheet.getLastRowNum();
@@ -207,6 +209,7 @@ public class ProjectPercentageServiceImpl extends ServiceImpl<ProjectPercentageM
                     userNameList.add(username);
                     userNameList.add(username);
                 }
                 }
             }
             }
+            List<User> targetUserList=new ArrayList<>();
             HttpRespMsg respMsg=new HttpRespMsg();
             HttpRespMsg respMsg=new HttpRespMsg();
             if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1&&userNameList.size()>0){
             if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1&&userNameList.size()>0){
                 System.out.println("参与搜素的人员列表"+userNameList + userNameList.size());
                 System.out.println("参与搜素的人员列表"+userNameList + userNameList.size());
@@ -215,8 +218,26 @@ public class ProjectPercentageServiceImpl extends ServiceImpl<ProjectPercentageM
                     msg.setError("姓名为["+String.valueOf(respMsg.data)+"]的人员存在重复,请使用工号!");
                     msg.setError("姓名为["+String.valueOf(respMsg.data)+"]的人员存在重复,请使用工号!");
                     return msg;
                     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++) {
             for (int rowIndex = 0; rowIndex <= rowNum; rowIndex++) {
                 Row row = sheet.getRow(rowIndex);
                 Row row = sheet.getRow(rowIndex);
                 if (row == null) {
                 if (row == null) {
@@ -269,9 +290,9 @@ public class ProjectPercentageServiceImpl extends ServiceImpl<ProjectPercentageM
                     String username = userNameCell.getStringCellValue().trim();
                     String username = userNameCell.getStringCellValue().trim();
                     //检查人员是否存在
                     //检查人员是否存在
                     Optional<User> userOp;
                     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();
                         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 {
                     }else {
                         userOp= allUserList.stream().filter(u -> u.getName().equals(username)||(u.getJobNumber()!=null&&u.getJobNumber().equals(username))).findFirst();
                         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.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 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.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -242,6 +243,8 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
     private HolidaySettingService holidaySettingService;
     private HolidaySettingService holidaySettingService;
     @Resource
     @Resource
     private CompanyDingdingMapper companyDingdingMapper;
     private CompanyDingdingMapper companyDingdingMapper;
+    @Resource
+    private CompanyDingdingService companyDingdingService;
 
 
     @Value(value = "${upload.path}")
     @Value(value = "${upload.path}")
     private String path;
     private String path;
@@ -1577,6 +1580,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                 finalDeptIds = deptIds;
                 finalDeptIds = deptIds;
             }
             }
             List<Map<String, Object>> membList = projectMapper.getProjectCost(companyId,startDate, endDate, curProjectId,stateKey, userIdList,finalDeptIds,filterDeptIds, true);
             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);
             map.put("membList", membList);
             for (Map<String, Object> membMap : membList) {
             for (Map<String, Object> membMap : membList) {
                 double pTotalTime = 0;
                 double pTotalTime = 0;
@@ -1602,6 +1606,13 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                     }else {
                     }else {
                         membRowData.add((String)("$departmentName="+membMap.get("corpwxDeptId")+"$"));
                         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 {
                 }else {
                     membRowData.add((String)membMap.get("name"));
                     membRowData.add((String)membMap.get("name"));
                     membRowData.add((String)membMap.get("departmentName"));
                     membRowData.add((String)membMap.get("departmentName"));
@@ -1904,12 +1915,17 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                                     membRowData.add("未分配");
                                     membRowData.add("未分配");
                                 }else {
                                 }else {
                                     membRowData.add(departmentService.exportWxDepartment(dept,allDepartmentList));
                                     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 {
                             }else {
                                 membRowData.add((String)membMap.get("name"));
                                 membRowData.add((String)membMap.get("name"));
                                 membRowData.add(departmentService.getSupDepartment(dept,allDepartmentList));
                                 membRowData.add(departmentService.getSupDepartment(dept,allDepartmentList));
-//                                membRowData.add((String)membMap.get("departmentName"));
                             }
                             }
                             String creatorId = (String)membMap.get("creatorId");
                             String creatorId = (String)membMap.get("creatorId");
                             User us = userList.stream().filter(u->u.getId().equals(creatorId)).findFirst().get();
                             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 {
                         }else {
                             membRowData.add("");
                             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 {
                     }else {
                         membRowData.add(user.getName());
                         membRowData.add(user.getName());
                         if(first.isPresent()){
                         if(first.isPresent()){
@@ -2772,6 +2795,8 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                 User incharger = first.get();
                 User incharger = first.get();
                 if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                 if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                     data.add("$userName="+incharger.getCorpwxUserid()+"$");
                     data.add("$userName="+incharger.getCorpwxUserid()+"$");
+                }if(dingding!=null&&dingding.getContactNeedTranslate()==1){
+                    data.add("$userName="+incharger.getDingdingUserid()+"$");
                 }else {
                 }else {
                     data.add(incharger.getName());
                     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("group_real_hours") == null?"":task.get("group_real_hours").toString());
             }
             }
             data.add(task.get("name") != null?task.get("name").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 = "";
                 String userName = "";
                 if(task.get("executor_id") != null){
                 if(task.get("executor_id") != null){
                     String[] executorIds = task.get("executor_id").toString().split(",");
                     String[] executorIds = task.get("executor_id").toString().split(",");
@@ -2929,7 +2954,11 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                         String executorId = executorIds[i];
                         String executorId = executorIds[i];
                         Optional<User> first = userList.stream().filter(ul -> ul.getId().equals(executorId)).findFirst();
                         Optional<User> first = userList.stream().filter(ul -> ul.getId().equals(executorId)).findFirst();
                         if(first.isPresent()){
                         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){
                             if (i < executorIds.length - 1){
                                 userName += ",";
                                 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("$userName="+(map.get("corpwxUserId")==null?"":map.get("corpwxUserId"))+"$");
                     rowData.add(String.valueOf(StringUtils.isEmpty(map.get("jobNumber"))?"":map.get("jobNumber")));
                     rowData.add(String.valueOf(StringUtils.isEmpty(map.get("jobNumber"))?"":map.get("jobNumber")));
                     rowData.add("$departmentName="+(map.get("corpwxDeptId")==null?"":map.get("corpwxDeptId"))+"$");
                     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 {
                 }else {
                     rowData.add((String)map.get("username"));
                     rowData.add((String)map.get("username"));
                     rowData.add(String.valueOf(StringUtils.isEmpty(map.get("jobNumber"))?"":map.get("jobNumber")));
                     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);
                 rowData.add(""+seq);
                 if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                 if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                     rowData.add("$userName="+(map.get("corpwxUserId")==null?"":map.get("corpwxUserId"))+"$");
                     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 {
                 }else {
                     rowData.add((String)map.get("username"));
                     rowData.add((String)map.get("username"));
                 }
                 }
@@ -4376,6 +4411,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         User user = userMapper.selectById(userId);
         User user = userMapper.selectById(userId);
         TimeType timeType = timeTypeMapper.selectById(user.getCompanyId());
         TimeType timeType = timeTypeMapper.selectById(user.getCompanyId());
         WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id",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()));
         List<Department> allDeptList = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id", user.getCompanyId()));
         //然后处理文件
         //然后处理文件
         String fileName = multipartFile.getOriginalFilename();
         String fileName = multipartFile.getOriginalFilename();
@@ -4476,16 +4512,35 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                         userNameList.add(inchargerName);
                         userNameList.add(inchargerName);
                     }
                     }
                 }
                 }
+                List<User> targetUserList=new ArrayList<>();
                 HttpRespMsg respMsg=new HttpRespMsg();
                 HttpRespMsg respMsg=new HttpRespMsg();
                 if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1&&userNameList.size()>0){
                 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);
                     respMsg = wxCorpInfoService.getBatchSearchUserInfo(wxCorpInfo, userNameList,null);
                     if(respMsg.code.equals("0")){
                     if(respMsg.code.equals("0")){
                         msg.setError("姓名为["+String.valueOf(respMsg.data)+"]的人员存在重复,请使用工号!");
                         msg.setError("姓名为["+String.valueOf(respMsg.data)+"]的人员存在重复,请使用工号!");
                         return msg;
                         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;
                 int importCount = 0;
                 for (int rowIndex = 0; rowIndex <= rowNum; rowIndex++) {
                 for (int rowIndex = 0; rowIndex <= rowNum; rowIndex++) {
                     XSSFRow row = sheet.getRow(rowIndex);
                     XSSFRow row = sheet.getRow(rowIndex);
@@ -4629,17 +4684,17 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                             Optional<User> first;
                             Optional<User> first;
                             Integer exception=null;
                             Integer exception=null;
                             if(split.length==1){
                             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();
                                     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 {
                                 }else {
                                     first= userList.stream().filter(u -> u.getName().equals(split[0])||(u.getJobNumber()!=null&&u.getJobNumber().equals(split[0]))).findFirst();
                                     first= userList.stream().filter(u -> u.getName().equals(split[0])||(u.getJobNumber()!=null&&u.getJobNumber().equals(split[0]))).findFirst();
                                 }
                                 }
                                 exception=0;
                                 exception=0;
                             }else {
                             }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();
                                     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;
                                     exception=1;
                                 }else {
                                 }else {
                                     first= userList.stream().filter(u -> u.getName().equals(split[1])&&(u.getJobNumber()!=null&&u.getJobNumber().equals(split[1]))).findFirst();
                                     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;
                             Optional<User> first;
                             Integer exception=null;
                             Integer exception=null;
                             if(split.length==1){
                             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();
                                     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 {
                                 }else {
                                     first= userList.stream().filter(u -> u.getName().equals(split[0])||(u.getJobNumber()!=null&&u.getJobNumber().equals(split[0]))).findFirst();
                                     first= userList.stream().filter(u -> u.getName().equals(split[0])||(u.getJobNumber()!=null&&u.getJobNumber().equals(split[0]))).findFirst();
                                 }
                                 }
                                 exception=0;
                                 exception=0;
                             }else {
                             }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();
                                     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;
                                     exception=1;
                                 }else {
                                 }else {
                                     first= userList.stream().filter(u -> u.getName().equals(split[1])&&(u.getJobNumber()!=null&&u.getJobNumber().equals(split[1]))).findFirst();
                                     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;
                                 Optional<User> first;
                                 Integer exception=null;
                                 Integer exception=null;
                                 if(split.length==1){
                                 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();
                                         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 {
                                     }else {
                                         first= userList.stream().filter(u -> u.getName().equals(split[0])||(u.getJobNumber()!=null&&u.getJobNumber().equals(split[0]))).findFirst();
                                         first= userList.stream().filter(u -> u.getName().equals(split[0])||(u.getJobNumber()!=null&&u.getJobNumber().equals(split[0]))).findFirst();
                                     }
                                     }
                                     exception=0;
                                     exception=0;
                                 }else {
                                 }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();
                                         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;
                                         exception=1;
                                     }else {
                                     }else {
                                         first= userList.stream().filter(u -> u.getName().equals(split[1])&&(u.getJobNumber()!=null&&u.getJobNumber().equals(split[1]))).findFirst();
                                         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;
                                 Optional<User> first;
                                 Integer exception=null;
                                 Integer exception=null;
                                 if(split.length==1){
                                 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();
                                         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 {
                                     }else {
                                         first= userList.stream().filter(u -> u.getName().equals(split[0])||(u.getJobNumber()!=null&&u.getJobNumber().equals(split[0]))).findFirst();
                                         first= userList.stream().filter(u -> u.getName().equals(split[0])||(u.getJobNumber()!=null&&u.getJobNumber().equals(split[0]))).findFirst();
                                     }
                                     }
                                     exception=0;
                                     exception=0;
                                 }else {
                                 }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();
                                         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;
                                         exception=1;
                                     }else {
                                     }else {
                                         first= userList.stream().filter(u -> u.getName().equals(split[1])&&(u.getJobNumber()!=null&&u.getJobNumber().equals(split[1]))).findFirst();
                                         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;
                                 Optional<User> first;
                                 Integer exception=null;
                                 Integer exception=null;
                                 if(split.length==1){
                                 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();
                                         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 {
                                     }else {
                                         first= userList.stream().filter(u -> u.getName().equals(split[0])||(u.getJobNumber()!=null&&u.getJobNumber().equals(split[0]))).findFirst();
                                         first= userList.stream().filter(u -> u.getName().equals(split[0])||(u.getJobNumber()!=null&&u.getJobNumber().equals(split[0]))).findFirst();
                                     }
                                     }
                                     exception=0;
                                     exception=0;
                                 }else {
                                 }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();
                                         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;
                                         exception=1;
                                     }else {
                                     }else {
                                         first= userList.stream().filter(u -> u.getName().equals(split[1])&&(u.getJobNumber()!=null&&u.getJobNumber().equals(split[1]))).findFirst();
                                         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);
                         userNameList.add(inchargerName);
                     }
                     }
                 }
                 }
-                System.out.println("参与搜素的人员列表"+userNameList + userNameList.size());
+                List<User> targetUserList=new ArrayList<>();
                 HttpRespMsg respMsg=new HttpRespMsg();
                 HttpRespMsg respMsg=new HttpRespMsg();
                 if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1&&userNameList.size()>0){
                 if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1&&userNameList.size()>0){
+                    System.out.println("参与搜素的人员列表"+userNameList + userNameList.size());
                     respMsg = wxCorpInfoService.getBatchSearchUserInfo(wxCorpInfo, userNameList,null);
                     respMsg = wxCorpInfoService.getBatchSearchUserInfo(wxCorpInfo, userNameList,null);
                     if(respMsg.code.equals("0")){
                     if(respMsg.code.equals("0")){
                         msg.setError("姓名为["+String.valueOf(respMsg.data)+"]的人员存在重复,请使用工号!");
                         msg.setError("姓名为["+String.valueOf(respMsg.data)+"]的人员存在重复,请使用工号!");
                         return msg;
                         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<>();
                 List<String> existCodeList = new ArrayList<>();
                 int importCount = 0;
                 int importCount = 0;
                 for (int rowIndex = 0; rowIndex <= rowNum; rowIndex++) {
                 for (int rowIndex = 0; rowIndex <= rowNum; rowIndex++) {
@@ -5416,17 +5489,17 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                             Optional<User> first;
                             Optional<User> first;
                             Integer exception=null;
                             Integer exception=null;
                             if(split.length==1){
                             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();
                                     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 {
                                 }else {
                                     first= userList.stream().filter(u -> u.getName().equals(split[0])||(u.getJobNumber()!=null&&u.getJobNumber().equals(split[0]))).findFirst();
                                     first= userList.stream().filter(u -> u.getName().equals(split[0])||(u.getJobNumber()!=null&&u.getJobNumber().equals(split[0]))).findFirst();
                                 }
                                 }
                                 exception=0;
                                 exception=0;
                             }else {
                             }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();
                                     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;
                                     exception=1;
                                 }else {
                                 }else {
                                     first= userList.stream().filter(u -> u.getName().equals(split[0])&&(u.getJobNumber()!=null&&u.getJobNumber().equals(split[1]))).findFirst();
                                     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;
                         Optional<User> first;
                         Integer exception=null;
                         Integer exception=null;
                         if(split.length==1){
                         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();
                                 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 {
                             }else {
                                 first= userList.stream().filter(u -> u.getName().equals(split[0])||(u.getJobNumber()!=null&&u.getJobNumber().equals(split[0]))).findFirst();
                                 first= userList.stream().filter(u -> u.getName().equals(split[0])||(u.getJobNumber()!=null&&u.getJobNumber().equals(split[0]))).findFirst();
                             }
                             }
                             exception=0;
                             exception=0;
                         }else {
                         }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();
                                 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;
                                 exception=1;
                             }else {
                             }else {
                                 first= userList.stream().filter(u -> u.getName().equals(split[1])&&(u.getJobNumber()!=null&&u.getJobNumber().equals(split[1]))).findFirst();
                                 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;
                                 Optional<User> first;
                                 Integer exception=null;
                                 Integer exception=null;
                                 if(split.length==1){
                                 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();
                                         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 {
                                     }else {
                                         first= userList.stream().filter(u -> u.getName().equals(split[0])||(u.getJobNumber()!=null&&u.getJobNumber().equals(split[0]))).findFirst();
                                         first= userList.stream().filter(u -> u.getName().equals(split[0])||(u.getJobNumber()!=null&&u.getJobNumber().equals(split[0]))).findFirst();
                                     }
                                     }
                                     exception=0;
                                     exception=0;
                                 }else {
                                 }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();
                                         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;
                                         exception=1;
                                     }else {
                                     }else {
                                         first= userList.stream().filter(u -> u.getName().equals(split[1])&&(u.getJobNumber()!=null&&u.getJobNumber().equals(split[1]))).findFirst();
                                         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;
                                 Optional<User> first;
                                 Integer exception=null;
                                 Integer exception=null;
                                 if(split.length==1){
                                 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();
                                         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 {
                                     }else {
                                         first= userList.stream().filter(u -> u.getName().equals(split[0])||(u.getJobNumber()!=null&&u.getJobNumber().equals(split[0]))).findFirst();
                                         first= userList.stream().filter(u -> u.getName().equals(split[0])||(u.getJobNumber()!=null&&u.getJobNumber().equals(split[0]))).findFirst();
                                     }
                                     }
                                     exception=0;
                                     exception=0;
                                 }else {
                                 }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();
                                         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;
                                         exception=1;
                                     }else {
                                     }else {
                                         first= userList.stream().filter(u -> u.getName().equals(split[1])&&(u.getJobNumber()!=null&&u.getJobNumber().equals(split[1]))).findFirst();
                                         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;
                                 Optional<User> first;
                                 Integer exception=null;
                                 Integer exception=null;
                                 if(split.length==1){
                                 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();
                                         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 {
                                     }else {
                                         first= userList.stream().filter(u -> u.getName().equals(split[0])||(u.getJobNumber()!=null&&u.getJobNumber().equals(split[0]))).findFirst();
                                         first= userList.stream().filter(u -> u.getName().equals(split[0])||(u.getJobNumber()!=null&&u.getJobNumber().equals(split[0]))).findFirst();
                                     }
                                     }
                                     exception=0;
                                     exception=0;
                                 }else {
                                 }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();
                                         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;
                                         exception=1;
                                     }else {
                                     }else {
                                         first= userList.stream().filter(u -> u.getName().equals(split[1])&&(u.getJobNumber()!=null&&u.getJobNumber().equals(split[1]))).findFirst();
                                         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> projectCustomList = projectCustomMapper.selectList(new QueryWrapper<ProjectCustom>().eq("company_id", company.getId()));
         List<ProjectCustom> customList = projectCustomList.stream().filter(pl -> pl.getCustomType() != 1).collect(Collectors.toList());
         List<ProjectCustom> customList = projectCustomList.stream().filter(pl -> pl.getCustomType() != 1).collect(Collectors.toList());
         TimeType timeType = timeTypeMapper.selectById(user.getCompanyId());
         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>();
         List<String> headList = new ArrayList<String>();
 //        headList.add("项目编号");
 //        headList.add("项目编号");
 //        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())?"是":"否"));
             rowData.add(("1".equals(projectVO.getIsPublic())?MessageUtils.message("excel.yes"):MessageUtils.message("excel.no")));
             rowData.add(("1".equals(projectVO.getIsPublic())?MessageUtils.message("excel.yes"):MessageUtils.message("excel.no")));
             rowData.add(projectVO.getProjectName());
             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){
                 if(projectVO.getInchargerId()!=null){
                     User us = userList.stream().filter(ul -> ul.getId().equals(projectVO.getInchargerId())).findFirst().get();
                     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 {
                 }else {
                     rowData.add("");
                     rowData.add("");
                 }
                 }
@@ -6547,6 +6624,12 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                     }else {
                     }else {
                         names+="$userName="+(participator.get(i).getCorpwxUserId())+"$"+",";
                         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 {
                 }else {
                     if(i==participator.size()-1){
                     if(i==participator.size()-1){
                         names+=participator.get(i).getName();
                         names+=participator.get(i).getName();
@@ -6560,10 +6643,14 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
             rowData.add(start==null?"":sdf.format(start));
             rowData.add(start==null?"":sdf.format(start));
             LocalDate end = projectVO.getPlanEndDate();
             LocalDate end = projectVO.getPlanEndDate();
             rowData.add(end==null?"":sdf.format(end));
             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();
                 Optional<User> first = userList.stream().filter(ul -> ul.getId().equals(projectVO.getCreatorId())).findFirst();
                 if(first.isPresent()){
                 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 {
                 }else {
                     rowData.add("");
                     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()));
         WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", user.getCompanyId()));
         CompanyDingding dingding = companyDingdingMapper.selectOne(new QueryWrapper<CompanyDingding>().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;
         String  projectCategorySub=null;
         if(projectCategorySubId!=null){
         if(projectCategorySubId!=null){
             switch (projectCategorySubId){
             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("projectCode")==null?"":(String)map.get("projectCode"));
             item.add((String) map.get("projectName")==null?"":(String)map.get("projectName"));
             item.add((String) map.get("projectName")==null?"":(String)map.get("projectName"));
             item.add((String) map.get("groupName")==null?"":(String)map.get("groupName"));
             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("")) {
                 if (inchargerId!=null&&!inchargerId.equals("")) {
                     Optional<User> incharger = userList.stream().filter(u -> u.getId().equals(inchargerId)).findFirst();
                     Optional<User> incharger = userList.stream().filter(u -> u.getId().equals(inchargerId)).findFirst();
                     if(incharger.isPresent()){
                     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 {
                     }else {
                         item.add("");
                         item.add("");
                     }
                     }
@@ -6770,7 +6861,11 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                     asList.forEach(al->{
                     asList.forEach(al->{
                         Optional<User> participator = userList.stream().filter(u -> u.getId().equals(al)).findFirst();
                         Optional<User> participator = userList.stream().filter(u -> u.getId().equals(al)).findFirst();
                         if(participator.isPresent()){
                         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("]",""));
                     item.add(thisList.toString().replaceAll("\\[","").replaceAll("]",""));
@@ -6778,7 +6873,6 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                     item.add("");
                     item.add("");
                 }
                 }
             }else {
             }else {
-                String inchargerId = (String)map.get("inchargerId");
                 if (inchargerId!=null&&!inchargerId.equals("")) {
                 if (inchargerId!=null&&!inchargerId.equals("")) {
                     Optional<User> incharger = userList.stream().filter(u -> u.getId().equals(inchargerId)).findFirst();
                     Optional<User> incharger = userList.stream().filter(u -> u.getId().equals(inchargerId)).findFirst();
                     if (incharger.isPresent()) {
                     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"));
                     String s = String.valueOf(membMap.get("corpwxDeptId") == null ? "" : membMap.get("corpwxDeptId"));
                     membRowData.add("$departmentName=" + s + "$");
                     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 {
                 }else {
                     membRowData.add((String)membMap.get("name"));
                     membRowData.add((String)membMap.get("name"));
                     membRowData.add((String)membMap.get("departmentName"));
                     membRowData.add((String)membMap.get("departmentName"));
@@ -7741,6 +7843,8 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                     List<String> membRowData=new ArrayList<>();
                     List<String> membRowData=new ArrayList<>();
                     if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                     if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                         membRowData.add("$userName"+(user.getCorpwxUserid()==null?"":user.getCorpwxUserid())+"$");
                         membRowData.add("$userName"+(user.getCorpwxUserid()==null?"":user.getCorpwxUserid())+"$");
+                    }else if(dingding!=null&&dingding.getContactNeedTranslate()==1){
+                        membRowData.add("$userName"+(user.getName()==null?"":user.getName())+"$");
                     }else {
                     }else {
                         membRowData.add(user.getName());
                         membRowData.add(user.getName());
                     }
                     }
@@ -8089,6 +8193,8 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
             List<String> subList=new ArrayList<>();
             List<String> subList=new ArrayList<>();
             if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
             if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                 subList.add("$userName="+(item.get("corpwxUserId")==null?"":item.get("corpwxUserId"))+"$");
                 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 {
             }else {
                 subList.add(String.valueOf(item.get("username")));
                 subList.add(String.valueOf(item.get("username")));
             }
             }
@@ -8479,12 +8585,16 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
             List<String> item=new ArrayList<>();
             List<String> item=new ArrayList<>();
             if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
             if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                 item.add("$userName="+(timelinessRateVO.getCorpwxUserId()==null?"":timelinessRateVO.getCorpwxUserId())+"$");
                 item.add("$userName="+(timelinessRateVO.getCorpwxUserId()==null?"":timelinessRateVO.getCorpwxUserId())+"$");
+            }else if(dingding!=null&&dingding.getContactNeedTranslate()==1){
+                item.add("$userName="+timelinessRateVO.getUserName()+"$");
             }else {
             }else {
                 item.add(timelinessRateVO.getUserName());
                 item.add(timelinessRateVO.getUserName());
             }
             }
             item.add(timelinessRateVO.getJobNumber());
             item.add(timelinessRateVO.getJobNumber());
             if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
             if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                 item.add("$departmentName=" + (timelinessRateVO.getCorpwxDeptId()==null?"":timelinessRateVO.getCorpwxDeptId()) + "$");
                 item.add("$departmentName=" + (timelinessRateVO.getCorpwxDeptId()==null?"":timelinessRateVO.getCorpwxDeptId()) + "$");
+            }else if(dingding!=null&&dingding.getContactNeedTranslate()==1){
+                item.add("$departmentName=" + (timelinessRateVO.getCorpDdDeptId()==null?"":timelinessRateVO.getCorpDdDeptId()) + "$");
             }else {
             }else {
                 item.add(timelinessRateVO.getDepartmentName());
                 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("$userName="+(map.get("corpwxUserId")==null?"":map.get("corpwxUserId"))+"$");
                 item.add(String.valueOf(StringUtils.isEmpty(map.get("jobNumber"))?"":map.get("jobNumber")));
                 item.add(String.valueOf(StringUtils.isEmpty(map.get("jobNumber"))?"":map.get("jobNumber")));
                 item.add("$departmentName="+(map.get("corpwxDeptId")==null?"":map.get("corpwxDeptId"))+"$");
                 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 {
             }else {
                 item.add((String) map.get("name"));
                 item.add((String) map.get("name"));
                 item.add(String.valueOf(StringUtils.isEmpty(map.get("jobNumber"))?"":map.get("jobNumber")));
                 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){
             if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                 item.add("$userName=" + map.get("name") +"$");
                 item.add("$userName=" + map.get("name") +"$");
                 item.add("$departmentName="+(map.get("corpwxDeptId")==null?"":map.get("corpwxDeptId"))+"$");
                 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 {
             }else {
                 item.add((String) map.get("name"));
                 item.add((String) map.get("name"));
                 item.add((String) map.get("departmentName")==null?"":(String) map.get("departmentName"));
                 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<>();
             List<String> item=new ArrayList<>();
             if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
             if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                 item.add("$userName="+(timelinessRateVO.getCorpwxUserId()==null?"":timelinessRateVO.getCorpwxUserId())+"$");
                 item.add("$userName="+(timelinessRateVO.getCorpwxUserId()==null?"":timelinessRateVO.getCorpwxUserId())+"$");
+            }else if(dingding!=null&&dingding.getContactNeedTranslate()==1){
+                item.add("$userName="+(timelinessRateVO.getUserName())+"$");
             }else {
             }else {
                 item.add(timelinessRateVO.getUserName());
                 item.add(timelinessRateVO.getUserName());
             }
             }
             item.add(timelinessRateVO.getJobNumber());
             item.add(timelinessRateVO.getJobNumber());
             if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
             if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                 item.add("$departmentName="+(String.valueOf(timelinessRateVO.getCorpwxDeptId()==null?"":timelinessRateVO.getCorpwxDeptId()))+"$");
                 item.add("$departmentName="+(String.valueOf(timelinessRateVO.getCorpwxDeptId()==null?"":timelinessRateVO.getCorpwxDeptId()))+"$");
+            }else if(dingding!=null&&dingding.getContactNeedTranslate()==1){
+                item.add("$departmentName="+(timelinessRateVO.getDepartmentName())+"$");
             }else {
             }else {
                 item.add(timelinessRateVO.getDepartmentName());
                 item.add(timelinessRateVO.getDepartmentName());
             }
             }
@@ -11313,6 +11434,8 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
 //                        }else {
 //                        }else {
 //                            membRowData.add((String)("$departmentName="+membMap.get("corpwxDeptId")+"$"));
 //                            membRowData.add((String)("$departmentName="+membMap.get("corpwxDeptId")+"$"));
 //                        }
 //                        }
+                    }else if(dingding!=null&&dingding.getContactNeedTranslate()==1){
+                        membRowData.add(("$userName="+(String)membMap.get("name")+"$"));
                     }else {
                     }else {
                         membRowData.add((String)membMap.get("name"));
                         membRowData.add((String)membMap.get("name"));
 //                        membRowData.add((String)membMap.get("departmentName"));
 //                        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)){
                     if (wxCorpInfo != null && wxCorpInfo.getSaasSyncContact().equals(1)){
                         item.add("$userName="+map.get("wxUserId") + "$");
                         item.add("$userName="+map.get("wxUserId") + "$");
                         item.add("$departmentName="+map.get("wxdeptId") + "$");
                         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 {
                     }else {
                         item.add(map.get("userName") + "");
                         item.add(map.get("userName") + "");
                         item.add(map.get("departmentName") + "");
                         item.add(map.get("departmentName") + "");
@@ -11593,6 +11719,9 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                 if (wxCorpInfo != null && wxCorpInfo.getSaasSyncContact().equals(1)){
                 if (wxCorpInfo != null && wxCorpInfo.getSaasSyncContact().equals(1)){
                     item.add("$userName="+maps.get(0).get("wxUserId") + "$");
                     item.add("$userName="+maps.get(0).get("wxUserId") + "$");
                     item.add("$departmentName="+maps.get(0).get("wxdeptId") + "$");
                     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 {
                 }else {
                     item.add(maps.get(0).get("userName") + "");
                     item.add(maps.get(0).get("userName") + "");
                     item.add(maps.get(0).get("departmentName") + "");
                     item.add(maps.get(0).get("departmentName") + "");
@@ -12333,6 +12462,8 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         for (LaborHourRateVo laborHourRateVo : resultList) {
         for (LaborHourRateVo laborHourRateVo : resultList) {
             if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
             if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                 list.add("$departmentName="+laborHourRateVo.getDepartment_name()+"$");
                 list.add("$departmentName="+laborHourRateVo.getDepartment_name()+"$");
+            }else if(dingding!=null&&dingding.getContactNeedTranslate()==1){
+                list.add("$departmentName="+laborHourRateVo.getDepartment_name()+"$");
             }else {
             }else {
                 list.add(laborHourRateVo.getDepartment_name());
                 list.add(laborHourRateVo.getDepartment_name());
             }
             }
@@ -12793,8 +12924,16 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
             }
             }
             deptIndex+=maps.size();
             deptIndex+=maps.size();
             for (int i = 0; i < maps.size(); i++) {
             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("projectName")));
                 list.add(String.valueOf(maps.get(i).get("projectCode")));
                 list.add(String.valueOf(maps.get(i).get("projectCode")));
                 list.add(String.valueOf(maps.get(i).get("residueTime")));
                 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<>();
                             Map<String,Object> item=new HashMap<>();
                             item.put("projectId",project.getId());
                             item.put("projectId",project.getId());
                             item.put("projectName",project.getProjectName());
                             item.put("projectName",project.getProjectName());
+                            item.put("projectCode",project.getProjectCode());
                             item.put("groupName",groupName);
                             item.put("groupName",groupName);
                             item.put("corpwxDeptId",corpwxDeptid);
                             item.put("corpwxDeptId",corpwxDeptid);
                             item.put("department_name",departmentName);
                             item.put("department_name",departmentName);
@@ -13006,6 +13146,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                             Map<String,Object> item=new HashMap<>();
                             Map<String,Object> item=new HashMap<>();
                             item.put("projectId",project.getId());
                             item.put("projectId",project.getId());
                             item.put("projectName",project.getProjectName());
                             item.put("projectName",project.getProjectName());
+                            item.put("projectCode",project.getProjectCode());
                             item.put("groupName",groupName);
                             item.put("groupName",groupName);
                             item.put("corpwxDeptId",corpwxDeptid);
                             item.put("corpwxDeptId",corpwxDeptid);
                             item.put("department_name",departmentName);
                             item.put("department_name",departmentName);
@@ -13064,6 +13205,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                             Map<String,Object> item=new HashMap<>();
                             Map<String,Object> item=new HashMap<>();
                             item.put("projectId",project.getId());
                             item.put("projectId",project.getId());
                             item.put("projectName",project.getProjectName());
                             item.put("projectName",project.getProjectName());
+                            item.put("projectCode",project.getProjectCode());
                             item.put("groupName",groupName);
                             item.put("groupName",groupName);
                             item.put("corpwxDeptId",corpwxDeptid);
                             item.put("corpwxDeptId",corpwxDeptid);
                             item.put("department_name",departmentName);
                             item.put("department_name",departmentName);
@@ -13209,6 +13351,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         row0.setHeight((short)500);
         row0.setHeight((short)500);
         List<String> row_first =new ArrayList<>();
         List<String> row_first =new ArrayList<>();
         row_first.add("项目名称");
         row_first.add("项目名称");
+        row_first.add("项目编码");
         row_first.add("负责部门");
         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.setCellValue(row_first.get(i));
             tempCell.setCellStyle(headStyle);
             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,0,0));
         sheet.addMergedRegion(new CellRangeAddress(0,1,1,1));
         sheet.addMergedRegion(new CellRangeAddress(0,1,1,1));
         sheet.addMergedRegion(new CellRangeAddress(0,1,2,2));
         sheet.addMergedRegion(new CellRangeAddress(0,1,2,2));
         sheet.addMergedRegion(new CellRangeAddress(0,1,3,3));
         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++);
         SXSSFRow row1 = sheet.createRow(rowNum++);
         row1.setHeight((short)500);
         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("");
         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);
             List<Map<String, Object>> maps = listMapGroupList.get(pid);
             if(maps.size()>1){
             if(maps.size()>1){
                 sheet.addMergedRegion(new CellRangeAddress(projectNum,projectNum+maps.size()-1,0,0));
                 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"))));
             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());
             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) {
             for (String deptId : deptIdList) {
                 List<Map<String, Object>> maps1 = listMapGroupDeptList.get(deptId);
                 List<Map<String, Object>> maps1 = listMapGroupDeptList.get(deptId);
                 if(maps1.size()>1){
                 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();
                 deptNum+=maps1.size();
             }
             }
@@ -13272,8 +13418,11 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         }
         }
         for (Map<String, Object> map : mapList) {
         for (Map<String, Object> map : mapList) {
             list.add(String.valueOf(map.get("projectName")));
             list.add(String.valueOf(map.get("projectName")));
+            list.add(String.valueOf(map.get("projectCode")));
             if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
             if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                 list.add("$departmentName="+map.get("corpwxDeptId")+"$");
                 list.add("$departmentName="+map.get("corpwxDeptId")+"$");
+            }else if(dingding!=null&&dingding.getContactNeedTranslate()==1){
+                list.add("$departmentName="+String.valueOf(map.get("department_name"))+"$");
             }else {
             }else {
                 list.add(String.valueOf(map.get("department_name")));
                 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++){
         for(int i = 0;i<mapList.size();i++){
             SXSSFRow tempRow = sheet.createRow(rowNum++);
             SXSSFRow tempRow = sheet.createRow(rowNum++);
             tempRow.setHeight((short)500);
             tempRow.setHeight((short)500);
-            for(int j=0;j<10;j++){
+            for(int j=0;j<11;j++){
                 SXSSFCell tempCell = tempRow.createCell(j);
                 SXSSFCell tempCell = tempRow.createCell(j);
                 String cellValue = "";
                 String cellValue = "";
                 tempCell.setCellStyle(cellStyle);
                 tempCell.setCellStyle(cellStyle);
@@ -13482,6 +13631,8 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                 if(i==userProgress.size()-1){
                 if(i==userProgress.size()-1){
                     if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                     if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                         sb.append("$userName="+String.valueOf(userProgress.get(i).get("userName"))+"$"+String.valueOf(userProgress.get(i).get("progress")));
                         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 {
                     }else {
                         sb.append(String.valueOf(userProgress.get(i).get("userName"))+String.valueOf(userProgress.get(i).get("progress")));
                         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 {
                 }else {
                     if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                     if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                         sb.append("$userName="+String.valueOf(userProgress.get(i).get("userName"))+"$"+String.valueOf(userProgress.get(i).get("progress"))+",");
                         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 {
                     }else {
                         sb.append(String.valueOf(userProgress.get(i).get("userName"))+String.valueOf(userProgress.get(i).get("progress"))+",");
                         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();
             deptIndex+=maps.size();
             for (int i = 0; i < maps.size(); i++) {
             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("projectName")));
                 list.add(String.valueOf(maps.get(i).get("projectCode")));
                 list.add(String.valueOf(maps.get(i).get("projectCode")));
                 list.add(String.valueOf(maps.get(i).get("taskName")));
                 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.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 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.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -101,6 +102,8 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
     @Resource
     @Resource
     private ReportLogDetailMapper reportLogDetailMapper;
     private ReportLogDetailMapper reportLogDetailMapper;
     @Resource
     @Resource
+    private CompanyDingdingService companyDingdingService;
+    @Resource
     private ReportBatchMapper reportBatchMapper;
     private ReportBatchMapper reportBatchMapper;
     @Resource
     @Resource
     private ReportLogDetailService reportLogDetailService;
     private ReportLogDetailService reportLogDetailService;
@@ -159,8 +162,6 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
     @Resource
     @Resource
     private SapProjectServiceMapper sapProjectServiceMapper;
     private SapProjectServiceMapper sapProjectServiceMapper;
     @Resource
     @Resource
-    private CompanyDingdingService companyDingdingService;
-    @Resource
     private InformationMapper informationMapper;
     private InformationMapper informationMapper;
     @Resource
     @Resource
     private TimeTypeMapper timeTypeMapper;
     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<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<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<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<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<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<>();
             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->{
             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.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.setSubProjectList(subProjectList.stream().filter(s->s.getProjectId().equals(r.getProjectId())).collect(Collectors.toList()));
                 r.setTaskList(taskMapper.recentSimpleList(r.getProjectId(), userId, r.getStage(), r.getGroupId()));
                 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);
             resultMap.put("report", reports);
             TimeType timeType = timeTypeMapper.selectById(companyId);
             TimeType timeType = timeTypeMapper.selectById(companyId);
+            boolean showRefresh = false;
             if (timeType.getShowDdCardtime() == 1) {
             if (timeType.getShowDdCardtime() == 1) {
                 List<UserDingdingTime> dingdingTimes = userDingdingTimeMapper.selectList(new QueryWrapper<UserDingdingTime>()
                 List<UserDingdingTime> dingdingTimes = userDingdingTimeMapper.selectList(new QueryWrapper<UserDingdingTime>()
                         .eq("user_id", userId).eq("work_date", date));
                         .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);
                     UserDingdingTime time = dingdingTimes.get(0);
                     resultMap.put("time", time);
                     resultMap.put("time", time);
                 }
                 }
+                showRefresh = true;
             }else if(timeType.getSyncFanwei()==1){
             }else if(timeType.getSyncFanwei()==1){
                 List<UserFvTime> userFvTimeList = userFvTimeMapper.selectList(new QueryWrapper<UserFvTime>()
                 List<UserFvTime> userFvTimeList = userFvTimeMapper.selectList(new QueryWrapper<UserFvTime>()
                         .eq("user_id", userId).eq("work_date", date));
                         .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);
                     UserFvTime time = userFvTimeList.get(0);
                     resultMap.put("time", time);
                     resultMap.put("time", time);
                 }
                 }
+                showRefresh = true;
             } else if (timeType.getShowCorpwxCardtime() == 1) {
             } else if (timeType.getShowCorpwxCardtime() == 1) {
                 User user = userMapper.selectById(userId);
                 User user = userMapper.selectById(userId);
                 List<UserCorpwxTime> corpwxTimes = userCorpwxTimeMapper.selectList(new QueryWrapper<UserCorpwxTime>()
                 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);
                     UserCorpwxTime time = corpwxTimes.get(0);
                     resultMap.put("time", time);
                     resultMap.put("time", time);
                 }
                 }
+                showRefresh = true;
             }
             }
+            resultMap.put("showRefresh", showRefresh);
 
 
             //顺便返回公司的工作时间设置
             //顺便返回公司的工作时间设置
             resultMap.put("timeType",timeType);
             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) {
     public HttpRespMsg editReport(List<Report> reportList, String date, List<User> userList, BigDecimal hourCost, Integer companyId, String summary) {
         HttpRespMsg httpRespMsg = new HttpRespMsg();
         HttpRespMsg httpRespMsg = new HttpRespMsg();
         TimeType timeType = timeTypeMapper.selectById(companyId);
         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<Integer> idList = reportList.stream().filter(r->r.getId() != null).map(Report::getId).collect(Collectors.toList());
+        List<Report> allDateReportList = reportList;
         //只有填写日报的report才会有id, 前端会把全部状态的日报都传过来
         //只有填写日报的report才会有id, 前端会把全部状态的日报都传过来
         if (idList.size() > 0) {
         if (idList.size() > 0) {
             if (date != null && !date.contains("@")) {
             if (date != null && !date.contains("@")) {
@@ -1095,8 +1108,6 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             reportService.saveOrUpdateBatch(reportList);
             reportService.saveOrUpdateBatch(reportList);
             //成都明夷电子,需要生成批量记录
             //成都明夷电子,需要生成批量记录
             Company company = companyMapper.selectById(companyId);
             Company company = companyMapper.selectById(companyId);
-            System.out.println(company.getCompanyName()+", date==="+date);
-
             if (company.getCompanyName().equals("成都明夷电子科技有限公司") || timeType.getEnableNewWeeklyfill() == 1) {//物奇需要填写周总结
             if (company.getCompanyName().equals("成都明夷电子科技有限公司") || timeType.getEnableNewWeeklyfill() == 1) {//物奇需要填写周总结
                 if (date.contains("@")) {
                 if (date.contains("@")) {
                     //批量填报
                     //批量填报
@@ -1114,7 +1125,6 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                     batch.setEndDate(LocalDate.parse(endDate, dateTimeFormatter));
                     batch.setEndDate(LocalDate.parse(endDate, dateTimeFormatter));
                     batch.setTotalWorkTime(reportList.stream().mapToDouble(Report::getWorkingTime).sum());
                     batch.setTotalWorkTime(reportList.stream().mapToDouble(Report::getWorkingTime).sum());
                     reportBatchMapper.insert(batch);
                     reportBatchMapper.insert(batch);
-                    System.out.println("生成了批记录batchId==="+batch.getId());
                     //更新batchId
                     //更新batchId
                     reportList.forEach(r->r.setBatchId(batch.getId()));
                     reportList.forEach(r->r.setBatchId(batch.getId()));
                     List<Integer> collect = reportList.stream().map(Report::getId).collect(Collectors.toList());
                     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");
                         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;
                         HashMap mapItem = (HashMap)retMsg.data;
                         List<HashMap> dateRange = (List<HashMap>)mapItem.get("dateList");
                         List<HashMap> dateRange = (List<HashMap>)mapItem.get("dateList");
                         LocalDate minDate = LocalDate.parse((String)dateRange.get(0).get("date"), dtf);
                         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.setEndDate(maxDate);
                         //周总结
                         //周总结
                         batch.setSummary(summary);
                         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);
                         reportBatchMapper.insert(batch);
                         //更新batchId
                         //更新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));
                         reportMapper.update(new Report().setBatchId(batch.getId()), new QueryWrapper<Report>().in("id", curDateReportIds));
                     } else {
                     } else {
                         for (LocalDate curDate : dateList) {
                         for (LocalDate curDate : dateList) {
@@ -2731,12 +2740,16 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
         String str = null;
         String str = null;
         String fillUserId = null;
         String fillUserId = null;
         WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", company.getId()));
         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) {//待部门直属领导审核
         if (oneReport.getState() == -1) {//待部门直属领导审核
             //str = "您"+date+"导入的日报中"+pNames+"项目被["+user.getName()+"]驳回。原因:" + reason+",请重新导入。";
             //str = "您"+date+"导入的日报中"+pNames+"项目被["+user.getName()+"]驳回。原因:" + reason+",请重新导入。";
             String sendToUser = user.getName();
             String sendToUser = user.getName();
             if (wxCorpInfo != null && wxCorpInfo.getSaasSyncContact() == 1) {
             if (wxCorpInfo != null && wxCorpInfo.getSaasSyncContact() == 1) {
                 //需要转译
                 //需要转译
                 sendToUser = "$userName="+user.getCorpwxUserid()+"$";
                 sendToUser = "$userName="+user.getCorpwxUserid()+"$";
+            }else if (dingding != null && dingding.getContactNeedTranslate() == 1) {
+                //需要转译
+                sendToUser = "$userName="+user.getDingdingUserid()+"$";
             }
             }
             str = MessageUtils.message("profession.impProReject",date,pNames,sendToUser,reason);
             str = MessageUtils.message("profession.impProReject",date,pNames,sendToUser,reason);
             fillUserId = oneReport.getFillUserid();
             fillUserId = oneReport.getFillUserid();
@@ -2746,6 +2759,9 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             if (wxCorpInfo != null && wxCorpInfo.getSaasSyncContact() == 1) {
             if (wxCorpInfo != null && wxCorpInfo.getSaasSyncContact() == 1) {
                 //需要转译
                 //需要转译
                 sendToUser = "$userName="+user.getCorpwxUserid()+"$";
                 sendToUser = "$userName="+user.getCorpwxUserid()+"$";
+            }else if (dingding != null && dingding.getContactNeedTranslate() == 1) {
+                //需要转译
+                sendToUser = "$userName="+user.getDingdingUserid()+"$";
             }
             }
             str = MessageUtils.message("profession.fillProReject",date,pNames,sendToUser,reason);
             str = MessageUtils.message("profession.fillProReject",date,pNames,sendToUser,reason);
             fillUserId = oneReport.getCreatorId();
             fillUserId = oneReport.getCreatorId();
@@ -4522,6 +4538,9 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
             if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                 dataItem.add("$userName="+(userMonthWork.corpwxUserId==null?"":userMonthWork.corpwxUserId)+"$"+(worktimeList.size()==0?"("+MessageUtils.message("entry.noFill")+")":""));
                 dataItem.add("$userName="+(userMonthWork.corpwxUserId==null?"":userMonthWork.corpwxUserId)+"$"+(worktimeList.size()==0?"("+MessageUtils.message("entry.noFill")+")":""));
                 dataItem.add("$departmentName="+(userMonthWork.departmentName==null?"":userMonthWork.departmentName)+"$");
                 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 {
             }else {
                 dataItem.add(userMonthWork.name+(worktimeList.size()==0?"("+MessageUtils.message("entry.noFill")+")":""));
                 dataItem.add(userMonthWork.name+(worktimeList.size()==0?"("+MessageUtils.message("entry.noFill")+")":""));
                 dataItem.add(userMonthWork.departmentName);
                 dataItem.add(userMonthWork.departmentName);
@@ -4570,6 +4589,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
         String token = request.getHeader("TOKEN");
         String token = request.getHeader("TOKEN");
         User user = userMapper.selectById(token);
         User user = userMapper.selectById(token);
         WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", user.getCompanyId()));
         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());
         TimeType timeType = timeTypeMapper.selectById(user.getCompanyId());
         //对于存在预算成本的公司,暂不支持导入工时
         //对于存在预算成本的公司,暂不支持导入工时
         Company company = companyMapper.selectById(companyId);
         Company company = companyMapper.selectById(companyId);
@@ -4647,15 +4667,35 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             int deptColumnExtra = (hasDept?1:0);
             int deptColumnExtra = (hasDept?1:0);
             //下标从0开始
             //下标从0开始
             int projectNameStartIndex = (withCheckIn==null?2:(6 + deptColumnExtra));
             int projectNameStartIndex = (withCheckIn==null?2:(6 + deptColumnExtra));
+            List<User> targetUserList=new ArrayList<>();
             HttpRespMsg respMsg=new HttpRespMsg();
             HttpRespMsg respMsg=new HttpRespMsg();
             if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1&&userNameList.size()>0){
             if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1&&userNameList.size()>0){
+                System.out.println("参与搜素的人员列表"+userNameList + userNameList.size());
                 respMsg = wxCorpInfoService.getBatchSearchUserInfo(wxCorpInfo, userNameList,null);
                 respMsg = wxCorpInfoService.getBatchSearchUserInfo(wxCorpInfo, userNameList,null);
                 if(respMsg.code.equals("0")){
                 if(respMsg.code.equals("0")){
                     msg.setError("姓名为["+String.valueOf(respMsg.data)+"]的人员存在重复,请使用工号!");
                     msg.setError("姓名为["+String.valueOf(respMsg.data)+"]的人员存在重复,请使用工号!");
                     return msg;
                     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;
             int dataCount = 0;
 
 
             for (int rowIndex = 0; rowIndex <= rowNum; rowIndex++) {
             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();
                     String username = withCheckIn==null?row.getCell(1).getStringCellValue().trim():row.getCell(2).getStringCellValue().trim();
                     //检查人员是否存在
                     //检查人员是否存在
                     Optional<User> any;
                     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();
                         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 {
                     }else {
                         any = allUserList.stream().filter(u -> u.getName().equals(username)||(u.getJobNumber()!=null&&u.getJobNumber().equals(username))).findAny();
                         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");
         String token = request.getHeader("TOKEN");
         User user = userMapper.selectById(token);
         User user = userMapper.selectById(token);
         WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", user.getCompanyId()));
         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());
         TimeType timeType = timeTypeMapper.selectById(user.getCompanyId());
         //对于存在预算成本的公司,暂不支持导入工时
         //对于存在预算成本的公司,暂不支持导入工时
         Company company = companyMapper.selectById(companyId);
         Company company = companyMapper.selectById(companyId);
@@ -4974,14 +5015,34 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             }
             }
             //下标从0开始
             //下标从0开始
             HttpRespMsg respMsg=new HttpRespMsg();
             HttpRespMsg respMsg=new HttpRespMsg();
+            List<User> targetUserList=new ArrayList<>();
             if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1&&userNameList.size()>0){
             if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1&&userNameList.size()>0){
+                System.out.println("参与搜素的人员列表"+userNameList + userNameList.size());
                 respMsg = wxCorpInfoService.getBatchSearchUserInfo(wxCorpInfo, userNameList,null);
                 respMsg = wxCorpInfoService.getBatchSearchUserInfo(wxCorpInfo, userNameList,null);
                 if(respMsg.code.equals("0")){
                 if(respMsg.code.equals("0")){
                     msg.setError("姓名为["+String.valueOf(respMsg.data)+"]的人员存在重复,请使用工号!");
                     msg.setError("姓名为["+String.valueOf(respMsg.data)+"]的人员存在重复,请使用工号!");
                     return msg;
                     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;
             int dataCount = 0;
 
 
             for (int rowIndex = 0; rowIndex <= rowNum; rowIndex++) {
             for (int rowIndex = 0; rowIndex <= rowNum; rowIndex++) {
@@ -5019,9 +5080,9 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                     }
                     }
                     //检查人员是否存在
                     //检查人员是否存在
                     Optional<User> any;
                     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();
                         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 {
                     }else {
                         any = allUserList.stream().filter(u -> u.getName().equals(username)||(u.getJobNumber()!=null&&u.getJobNumber().equals(username))).findAny();
                         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){
                 if(needCorpWxTranslate){
                     item.add("$userName="+(map.get("corpwxUserId")==null?"":map.get("corpwxUserId"))+"$");
                     item.add("$userName="+(map.get("corpwxUserId")==null?"":map.get("corpwxUserId"))+"$");
                     item.add(departmentService.exportWxDepartment(dept,departments));
                     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((String) map.get("name"));
                     item.add(departmentService.getSupDepartment(dept,departments));
                     item.add(departmentService.getSupDepartment(dept,departments));
                 }
                 }
@@ -5654,6 +5718,9 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                         if(needCorpWxTranslate){
                         if(needCorpWxTranslate){
                             String projectAuditorName ="$userName="+String.valueOf(map.get("projectAuditorCorpwxUserId"))+"$";
                             String projectAuditorName ="$userName="+String.valueOf(map.get("projectAuditorCorpwxUserId"))+"$";
                             item.add(projectAuditorName);
                             item.add(projectAuditorName);
+                        }else if(dingding!=null&&dingding.getContactNeedTranslate()==1){
+                            String projectAuditorName ="$userName="+(String)map.get("projectAuditorName")+"$";
+                            item.add(projectAuditorName);
                         }else {
                         }else {
                             item.add((String)map.get("projectAuditorName"));
                             item.add((String)map.get("projectAuditorName"));
                         }
                         }
@@ -5661,6 +5728,9 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                     if(needCorpWxTranslate){
                     if(needCorpWxTranslate){
                         String projectManagerName ="$userName="+String.valueOf(map.get("projectManagerCorpwxUserId"))+"$";
                         String projectManagerName ="$userName="+String.valueOf(map.get("projectManagerCorpwxUserId"))+"$";
                         item.add(projectManagerName);
                         item.add(projectManagerName);
+                    }else if(dingding!=null&&dingding.getContactNeedTranslate()==1){
+                        String projectAuditorName ="$userName="+(String)map.get("projectManagerName")+"$";
+                        item.add(projectAuditorName);
                     }else {
                     }else {
                         item.add((String)map.get("projectManagerName"));
                         item.add((String)map.get("projectManagerName"));
                     }
                     }
@@ -5718,7 +5788,29 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
 											msg = time+" " + auditMsg;
 											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;
 									msg = time+" " + auditMsg;
 								}
 								}
 							} 
 							} 
@@ -5788,6 +5880,16 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                                             } else {
                                             } else {
                                                 item.add("待" + departmentName + "(" + deptAuditorName + ")审核");
                                                 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 {
                                         } else {
                                             if (timeType.getReportAuditType() == 4) {
                                             if (timeType.getReportAuditType() == 4) {
                                                 departmentName = map.get("buDepartmentName") + "";
                                                 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")) {
                                 if (String.valueOf(map.get("projectAuditState")).equals("0") || String.valueOf(map.get("groupAuditState")).equals("0")) {
                                     String projectAuditorName = map.get("projectAuditorName") + "";
                                     String projectAuditorName = map.get("projectAuditorName") + "";
                                     String projectAuditorId = map.get("projectAuditorId") + "";
                                     String projectAuditorId = map.get("projectAuditorId") + "";
-                                    if (needCorpWxTranslate) {
+                                    if (needCorpWxTranslate||(dingding!=null&&dingding.getContactNeedTranslate()==1)) {
                                         for (User userItem : userList) {
                                         for (User userItem : userList) {
                                             if (userItem.getId().equals(projectAuditorId)) {
                                             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 + ")审核");
                                                 item.add("待项目审核人" + "(" + projectAuditorName + ")审核");
                                                 break;
                                                 break;
                                             }
                                             }
@@ -6274,6 +6380,9 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
             if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                 line.add("$departmentName="+dataItem.corpwxDeptId+"$");
                 line.add("$departmentName="+dataItem.corpwxDeptId+"$");
                 line.add("$userName="+dataItem.corpwxUserId+"$");
                 line.add("$userName="+dataItem.corpwxUserId+"$");
+            }else if(dingding!=null&&dingding.getContactNeedTranslate()==1){
+                line.add("$departmentName="+dataItem.department+"$");
+                line.add("$userName="+dataItem.name+"$");
             }else {
             }else {
                 line.add(dataItem.department);
                 line.add(dataItem.department);
                 line.add(dataItem.name);
                 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()));
         List<Report> reportList = reportMapper.selectList(new QueryWrapper<Report>().eq("creator_id", sourceUser.getId()));
         if (reportList.size() != 0){
         if (reportList.size() != 0){
+            List<Report> upList = new ArrayList<>();
             for (Report report : reportList) {
             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
         //转移日报的log
         List<ReportLog> reportCreatorLogList = reportLogMapper.selectList(new QueryWrapper<ReportLog>().eq("creator_id", sourceUser.getId()));
         List<ReportLog> reportCreatorLogList = reportLogMapper.selectList(new QueryWrapper<ReportLog>().eq("creator_id", sourceUser.getId()));
         if (reportCreatorLogList.size() != 0){
         if (reportCreatorLogList.size() != 0){
+            List<ReportLog> upList = new ArrayList<>();
             for (ReportLog log : reportCreatorLogList) {
             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()));
         List<ReportLog> reportOperatorLogList = reportLogMapper.selectList(new QueryWrapper<ReportLog>().eq("operator_id", sourceUser.getId()));
         if (reportCreatorLogList.size() != 0){
         if (reportCreatorLogList.size() != 0){
+            List<ReportLog> upList = new ArrayList<>();
             for (ReportLog log : reportOperatorLogList) {
             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());
                 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()));
         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){
             if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                 item.add("$userName="+String.valueOf(record.get("corpWxUserId"))+"$");
                 item.add("$userName="+String.valueOf(record.get("corpWxUserId"))+"$");
                 item.add("$departmentName="+String.valueOf(record.get("corpWxDeptId"))+"$");
                 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 {
             }else {
                 item.add(String.valueOf(record.get("userName")));
                 item.add(String.valueOf(record.get("userName")));
                 item.add(String.valueOf(record.get("deptName")));
                 item.add(String.valueOf(record.get("deptName")));
@@ -8921,13 +9045,13 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
     }
     }
 
 
     @Override
     @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();
         HttpRespMsg msg=new HttpRespMsg();
         DateTimeFormatter df=DateTimeFormatter.ofPattern("yyyy-MM-dd");
         DateTimeFormatter df=DateTimeFormatter.ofPattern("yyyy-MM-dd");
         Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
         Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
         WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new LambdaQueryWrapper<WxCorpInfo>().eq(WxCorpInfo::getCompanyId, companyId));
         WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new LambdaQueryWrapper<WxCorpInfo>().eq(WxCorpInfo::getCompanyId, companyId));
         LocalDate now=LocalDate.now();
         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();
         Map<String, Object> map = (Map<String, Object>) userDailyWorkTime.getData();
         List<UserMonthWork> userDailyWorkTimeData = (List<UserMonthWork>) map.get("list");
         List<UserMonthWork> userDailyWorkTimeData = (List<UserMonthWork>) map.get("list");
         if(!StringUtils.isEmpty(userId)){
         if(!StringUtils.isEmpty(userId)){
@@ -9030,6 +9154,9 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
             if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                 item.add("$userName="+String.valueOf(map.get("corpwxUserId"))+"$");
                 item.add("$userName="+String.valueOf(map.get("corpwxUserId"))+"$");
                 item.add("$departmentName="+String.valueOf(map.get("corpwxDeptId"))+"$");
                 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 {
             }else {
                 item.add(String.valueOf(map.get("name")));
                 item.add(String.valueOf(map.get("name")));
                 item.add(String.valueOf(map.get("departmentName")));
                 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表");
             System.err.println("请先初始化sys_module和sys_function表");
             return null;
             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);
         QueryWrapper<SysFunction> functionQueryWrapper = new QueryWrapper<SysFunction>().eq("package_time", 1);
         if (company.getPackageProject() == 1) {
         if (company.getPackageProject() == 1) {
             functionQueryWrapper.or().eq("package_project", 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(
                 List<SysFunction> filteredFunctions = functions.stream().filter(
                         m->Arrays.stream(functionMaps.get(str)).anyMatch(curModule->curModule.equals(m.getName()))
                         m->Arrays.stream(functionMaps.get(str)).anyMatch(curModule->curModule.equals(m.getName()))
                 ).collect(Collectors.toList());
                 ).collect(Collectors.toList());
-
                 generateRole(str, company, filteredModules, filteredFunctions);
                 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){
                         if(first.get().getCorpwxRealUserid()!=null){
                             personLiableNames.append("$userName="+(first.get().getCorpwxUserid()==null?"":first.get().getCorpwxUserid())+"$"+",");
                             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 {
                     }else {
                         personLiableNames.append(first.get().getName()+",");
                         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;
 package com.management.platform.service.impl;
 
 
 import com.alibaba.fastjson.JSONArray;
 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.Wrapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 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);
         User creator = userMapper.selectById(userId);
         Integer companyId = creator.getCompanyId();
         Integer companyId = creator.getCompanyId();
         WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().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));
         List<Project> allProjectList = null;
         List<Project> allProjectList = null;
         List<TaskGroup> allGroupList = null;
         List<TaskGroup> allGroupList = null;
         if (isMultiProject == 1) {
         if (isMultiProject == 1) {
@@ -303,18 +305,39 @@ public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements Ta
                     System.out.println("===执行人为空===");
                     System.out.println("===执行人为空===");
                 }
                 }
             }
             }
+            List<User> targetUserList=new ArrayList<>();
             System.out.println("参与搜素的人员列表"+userNameList + userNameList.size());
             System.out.println("参与搜素的人员列表"+userNameList + userNameList.size());
             HttpRespMsg respMsg=new HttpRespMsg();
             HttpRespMsg respMsg=new HttpRespMsg();
             boolean isCorpWxUser = false;
             boolean isCorpWxUser = false;
             if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1&&userNameList.size()>0){
             if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1&&userNameList.size()>0){
                 isCorpWxUser = true;
                 isCorpWxUser = true;
+                System.out.println("参与搜素的人员列表"+userNameList + userNameList.size());
                 respMsg = wxCorpInfoService.getBatchSearchUserInfo(wxCorpInfo, userNameList,null);
                 respMsg = wxCorpInfoService.getBatchSearchUserInfo(wxCorpInfo, userNameList,null);
                 if(respMsg.code.equals("0")){
                 if(respMsg.code.equals("0")){
                     httpRespMsg.setError("姓名为["+String.valueOf(respMsg.data)+"]的人员存在重复,请使用工号!");
                     httpRespMsg.setError("姓名为["+String.valueOf(respMsg.data)+"]的人员存在重复,请使用工号!");
                     return httpRespMsg;
                     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<>();
             if (targetUserList == null) targetUserList = new ArrayList<>();
             //由于第一行需要指明列对应的标题
             //由于第一行需要指明列对应的标题
             for (int rowIndex = 0; rowIndex <= sheet.getLastRowNum(); rowIndex++) {
             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++) {
                     for (int i=0;i<executorNameList.size();i++) {
                         String executorName = executorNameList.get(i);
                         String executorName = executorNameList.get(i);
                         Optional<User> first = null;
                         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();
                             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 {
                         } else {
                             first = allUserList.stream().filter(u ->u.getName().equals(executorName)).findFirst();
                             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);
         dataList.add(titleList);
         for (Map<String, Object> map : mapList) {
         for (Map<String, Object> map : mapList) {
             List<String> item=new ArrayList<>();
             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("$userName="+String.valueOf(map.get("userName"))+"$");
                 item.add("$departmentName="+String.valueOf(map.get("deptName"))+"$");
                 item.add("$departmentName="+String.valueOf(map.get("deptName"))+"$");
             }else {
             }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.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.JSONObject;
+import com.aliyun.dingtalkcontact_1_0.models.SearchUserResponse;
 import com.aliyun.dysmsapi20170525.models.SendSmsResponse;
 import com.aliyun.dysmsapi20170525.models.SendSmsResponse;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@@ -215,6 +216,8 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
     private TaskGroupService taskGroupService;
     private TaskGroupService taskGroupService;
     @Resource
     @Resource
     private ParticipationService participationService;
     private ParticipationService participationService;
+    @Resource
+    private UserReportDeptService userReportDeptService;
 
 
     @Resource
     @Resource
     private LdapTemplate ldapTemplate;
     private LdapTemplate ldapTemplate;
@@ -750,6 +753,14 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
             if (reportCount>0 || taskExecutorCount>0 || projectInchargerList>0){
             if (reportCount>0 || taskExecutorCount>0 || projectInchargerList>0){
                 reportCount = 1;
                 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);
             user.setIsExistsReport(reportCount);
             httpRespMsg.data = user;
             httpRespMsg.data = user;
         }
         }
@@ -856,6 +867,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
         }
         }
         Integer companyId = userMapper.selectById(request.getHeader("Token")).getCompanyId();
         Integer companyId = userMapper.selectById(request.getHeader("Token")).getCompanyId();
         WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().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));
         HashMap<String, Object> data = new HashMap<>();
         HashMap<String, Object> data = new HashMap<>();
         httpRespMsg.data=data;
         httpRespMsg.data=data;
         //企业微信同步方式下,按姓名查找,需要去调用企微通讯录搜索接口
         //企业微信同步方式下,按姓名查找,需要去调用企微通讯录搜索接口
@@ -879,6 +891,24 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
                 data.put("total",total);
                 data.put("total",total);
             }
             }
             return httpRespMsg;
             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 {
         }else {
             try {
             try {
                 TimeType timeType = timeTypeMapper.selectById(companyId);
                 TimeType timeType = timeTypeMapper.selectById(companyId);
@@ -1293,7 +1323,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
     @Override
     @Override
     public HttpRespMsg insertUser(String targetId, String name, String phone, Integer onlyAuditOnce, Integer roleId, Double monthCost, Double cost,
     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,
                                   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();
         HttpRespMsg httpRespMsg = new HttpRespMsg();
         DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd");
         DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd");
         try {
         try {
@@ -1370,6 +1400,18 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
                                 userCertService.saveBatch(certList);
                                 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 {
             } else {
@@ -1437,6 +1479,22 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
                     userMapper.setSuperiorNull(oldUser.getId());
                     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) {
                 if (salaryChange) {
                     UserSalary userSalary = UserSalary.copyFromUser(oldUser);
                     UserSalary userSalary = UserSalary.copyFromUser(oldUser);
                     userSalaryMapper.insert(userSalary);
                     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;
                 Long agentId = null;
                 String alertMsg = null;
                 String alertMsg = null;
                 List<String> dingUid = new ArrayList<>();
                 List<String> dingUid = new ArrayList<>();
+
                 int count = 0;
                 int count = 0;
+                HashMap<Integer, Boolean> compWorkDayMap = new HashMap<>();
                 for (int i=0;i<curUserList.size(); i++) {
                 for (int i=0;i<curUserList.size(); i++) {
                     count++;
                     count++;
                     Map<String, Object> item = curUserList.get(i);
                     Map<String, Object> item = curUserList.get(i);
                     Integer curCompanyId = (Integer)item.get("companyId");
                     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"));
                     dingUid.add((String)item.get("dingdingUserid"));
                     if (companyId == null) {
                     if (companyId == null) {
                         companyId = curCompanyId;
                         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 2 ? * *")
+    @Scheduled(cron = "0 30 12 ? * *")
     public void getByTimeWindow(){
     public void getByTimeWindow(){
         if(isDev){
         if(isDev){
             return;
             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)针对景昱
      * 每天凌晨2:50同步前一天的北森考勤数据 暂时固定公司id(5978)针对景昱
      * */
      * */
-    @Scheduled(cron ="0 38 16 ? * *")
+    @Scheduled(cron ="0 50 2 ? * *")
     public void syncAttendanceFromBeisen(){
     public void syncAttendanceFromBeisen(){
         if(isDev){
         if(isDev){
             return;
             return;
@@ -2071,8 +2090,19 @@ public class TimingTask {
         DateTimeFormatter df1=DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
         DateTimeFormatter df1=DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
         DateTimeFormatter df2=DateTimeFormatter.ofPattern("HH:mm");
         DateTimeFormatter df2=DateTimeFormatter.ofPattern("HH:mm");
         DateTimeFormatter df3=DateTimeFormatter.ofPattern("yyyy-MM-dd 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<User> userList = userMapper.selectList(new LambdaQueryWrapper<User>().eq(User::getCompanyId, 5978));
         List<UserWithBeisen> userWithBeisenList = userWithBeisenService.list(new LambdaQueryWrapper<UserWithBeisen>().eq(UserWithBeisen::getCompanyId, 5978));
         List<UserWithBeisen> userWithBeisenList = userWithBeisenService.list(new LambdaQueryWrapper<UserWithBeisen>().eq(UserWithBeisen::getCompanyId, 5978));
         BeisenConfig beisenConfig = beisenConfigMapper.selectById(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">
     <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
         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>
     </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>
 </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="department_name" property="departmentName" />
         <result column="corpwxUserId" property="corpwxUserId" />
         <result column="corpwxUserId" property="corpwxUserId" />
         <result column="corpwxDeptId" property="corpwxDeptId" />
         <result column="corpwxDeptId" property="corpwxDeptId" />
+        <result column="corpDdDeptId" property="corpDdDeptId" />
     </resultMap>
     </resultMap>
     <!-- 通用查询结果列 -->
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
     <sql id="Base_Column_List">
@@ -43,7 +44,7 @@
     </sql>
     </sql>
     <select id="getUserExpenseDetail" resultMap="UserBaseResultMap">
     <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,
         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
         from expense_item a
         left join expense_sheet b on a.expense_id = b.id
         left join expense_sheet b on a.expense_id = b.id
         left join user on user.id = b.owner_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 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
         FROM report AS a
         JOIN user AS b ON a.creator_id = b.id
         JOIN user AS b ON a.creator_id = b.id
         left join department on department.department_id = a.dept_id
         left join department on department.department_id = a.dept_id
@@ -814,7 +814,7 @@
 
 
     <!--获取人员工时-->
     <!--获取人员工时-->
     <select id="getUserWorkingTimeList" resultType="java.util.Map">
     <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,
         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=0,report.working_time,null)),0) as unPublic,
         ifnull(SUM(if(project.is_public=1,report.working_time,null)),0) as isPublic,
         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 task_group on task_group.id = a.group_id
         left join user u on u.id = a.project_auditor_id
         left join user u on u.id = a.project_auditor_id
         left join user u2 on u2.id = b.incharger_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 department dp2 on dp2.department_id = b.bu_id
         left join project_main on b.project_main_id=project_main.id
         left join project_main on b.project_main_id=project_main.id
         WHERE (<if test="stateKey == null or stateKey == 0">
         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 task_group on task_group.id = a.group_id
         left join user u on u.id = a.project_auditor_id
         left join user u on u.id = a.project_auditor_id
         left join user u2 on u2.id = b.incharger_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 department dp2 on dp2.department_id = b.bu_id
         left join project_main on b.project_main_id=project_main.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
         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 task_group on task_group.id = a.group_id
         left join user u on u.id = a.project_auditor_id
         left join user u on u.id = a.project_auditor_id
         left join user u2 on u2.id = b.incharger_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 department dp2 on dp2.department_id = b.bu_id
         left join project_main on project_main.id=b.project_main_id
         left join project_main on project_main.id=b.project_main_id
         WHERE
         WHERE
@@ -290,7 +290,7 @@
         left join task_group on task_group.id = a.group_id
         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 u on u.id = a.project_auditor_id
         left join user u2 on u2.id = b.incharger_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 department dp2 on dp2.department_id = b.bu_id
         left join project_main on project_main.id=b.project_main_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
         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 task_group on task_group.id = a.group_id
         left join user u on u.id = a.project_auditor_id
         left join user u on u.id = a.project_auditor_id
         left join user u2 on u2.id = b.incharger_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 department dp2 on dp2.department_id = b.bu_id
         left join project_main on project_main.id=b.project_main_id
         left join project_main on project_main.id=b.project_main_id
         WHERE (
         WHERE (
@@ -996,8 +996,10 @@
     </select>
     </select>
 
 
     <select id="getUserReportTimelinessRate" resultType="java.util.Map">
     <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 `user` on `user`.id=rl.operator_id
+        left join department d on `user`.department_id=d.department_id
         where rl.company_id=#{companyId}
         where rl.company_id=#{companyId}
         and rl.create_date between  #{startDate} and #{endDate}
         and rl.create_date between  #{startDate} and #{endDate}
         and rl.msg like '%提交了%'
         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
         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
         FROM
         task_executor te
         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 department d ON u.department_id=d.department_id
         LEFT JOIN task t ON te.task_id=t.`id`
         LEFT JOIN task t ON te.task_id=t.`id`
         WHERE u.company_id=#{companyId}
         WHERE u.company_id=#{companyId}
@@ -314,7 +314,7 @@
         SELECT u.id as userId
         SELECT u.id as userId
         FROM
         FROM
         task_executor te
         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 department d ON u.department_id=d.department_id
         LEFT JOIN task t ON te.task_id=t.`id`
         LEFT JOIN task t ON te.task_id=t.`id`
         WHERE u.company_id=#{companyId}
         WHERE u.company_id=#{companyId}
@@ -343,7 +343,7 @@
         (CASE t.`task_status` WHEN 0 THEN '进行中' WHEN 1 THEN '已完成' ELSE '已撤销' END) AS stateValue
         (CASE t.`task_status` WHEN 0 THEN '进行中' WHEN 1 THEN '已完成' ELSE '已撤销' END) AS stateValue
         FROM
         FROM
         task_executor te
         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`
         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`
         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">
         <if test="pageStart != null and pageSize != null">
@@ -355,7 +355,7 @@
         SELECT t.`name` AS taskName
         SELECT t.`name` AS taskName
         FROM
         FROM
         task_executor te
         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`
         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`
         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
         )as total

File diff suppressed because it is too large
+ 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}
         left join user c on c.id = a.superior_id and c.company_id = #{companyId}
         WHERE a.company_id = #{companyId}
         WHERE a.company_id = #{companyId}
           <if test="corpwxUserIds != null">
           <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>
         <if test="departmentId != null and companyId != ''">
         <if test="departmentId != null and companyId != ''">
             AND a.department_id = #{departmentId}
             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());
             ProdProcedureTeam prodProcedureTeam = prodProcedureTeamMapper.selectById(report.getUserProcedureTeamId());
             //总计划任务的工序中有总工时和总工价
             //总计划任务的工序中有总工时和总工价
             PlanProcedureTotal planProcedureTotal = planProcedureTotalMapper.selectOne(new QueryWrapper<PlanProcedureTotal>().eq("plan_id", report.getPlanId()).eq("prod_procedure_id", report.getProdProcedureId()));
             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);
             reportMapper.deleteById(id);
             reportSteelNumMapper.delete(new QueryWrapper<ReportSteelNum>().eq("report_id", 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()));
             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;
             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.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.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.hideSubproject">是否去除子项目</el-checkbox></el-form-item>
+                    <el-form-item><el-checkbox v-model="dialogData.userWithMultiDept">是否开启人员设置可填报部门</el-checkbox></el-form-item>
                 </el-form>
                 </el-form>
             </div>
             </div>
             <!-- 是否开启审批流设置,是否启用主项目模式,是否秘薪模式,是否显示日报审批流程,是否CRO企业,是否仅使用导入日报审核(不要项目审核) reportAuditType-->
             <!-- 是否开启审批流设置,是否启用主项目模式,是否秘薪模式,是否显示日报审批流程,是否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,'easyExpense',res.data.easyExpense ? true : false)
                             this.$set(this.dialogData,'enableNewWeeklyfill',res.data.enableNewWeeklyfill ? 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,'hideSubproject',res.data.hideSubproject ? true : false)
+                            this.$set(this.dialogData,'userWithMultiDept',res.data.userWithMultiDept ? true : false)
                         }else{
                         }else{
                             this.$message({
                             this.$message({
                                 message: res.msg,
                                 message: res.msg,
@@ -797,6 +799,7 @@ import App from '../../App.vue';
                     easyExpense: this.dialogData.easyExpense ? 1 : 0,
                     easyExpense: this.dialogData.easyExpense ? 1 : 0,
                     enableNewWeeklyfill: this.dialogData.enableNewWeeklyfill ? 1 : 0,
                     enableNewWeeklyfill: this.dialogData.enableNewWeeklyfill ? 1 : 0,
                     hideSubproject:this.dialogData.hideSubproject ? 1: 0, 
                     hideSubproject:this.dialogData.hideSubproject ? 1: 0, 
+                    userWithMultiDept:this.dialogData.userWithMultiDept ? 1: 0, 
                 },res => {
                 },res => {
                     if(res.code == 'ok'){
                     if(res.code == 'ok'){
                         this.editDialogG = false
                         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")
     @TableField("report_audit_flow_enable_super_dept_aduit")
     private Integer reportAuditFlowEnableSuperDeptAduit;
     private Integer reportAuditFlowEnableSuperDeptAduit;
 
 
+    /**
+     * 是否开启设置可填报部门 0-否 1-是
+     */
+    @TableField("user_with_multi_dept")
+    private Integer userWithMultiDept;
+
 
 
     @Override
     @Override
     protected Serializable pkVal() {
     protected Serializable pkVal() {

File diff suppressed because it is too large
+ 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 = {
                     let obj = {
                         id: item.value,
                         id: item.value,
-                        distinction: this.distinction
+                        distinction: this.distinction,
+                        other: this.other
                     }
                     }
                     this.$emit('vueCasader', obj)
                     this.$emit('vueCasader', obj)
                 }
                 }
@@ -330,7 +331,8 @@ export default {
                     let obj = {
                     let obj = {
                         id: item.value,
                         id: item.value,
                         distinction: this.distinction,
                         distinction: this.distinction,
-                        item: item
+                        item: item,
+                        other: this.other
                     }
                     }
                     this.$emit('vueCasader', obj)
                     this.$emit('vueCasader', obj)
                 } else {
                 } 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>
                 <ww-open-data :type='configuration.openType' :openid='translationValue'></ww-open-data>
             </span>
             </span>
             <span v-else-if="dingdingPlatform && !noRender.includes(translationValue)">
             <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>
             <span v-else>{{ translationValue }}</span>
             <span v-else>{{ translationValue }}</span>
         </template>
         </template>
@@ -54,7 +54,11 @@ export default {
                 renderIndex: 0,
                 renderIndex: 0,
             }, // 配置对象
             }, // 配置对象
 
 
-            noRender: ['全部人员', '未分配']
+            noRender: ['全部人员', '未分配'],
+            dingdingOpenType: {
+                userName: 'userName',
+                departmentName: 'deptName',
+            }
         }
         }
     },
     },
     computed: {},
     computed: {},

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

@@ -1,11 +1,11 @@
 <template>
 <template>
     <div class="translation">
     <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>
             <ww-open-data :type='type' :openid='openIdValue'></ww-open-data>
         </span>
         </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>
         <span v-else>{{ openIdValue }}</span>
         <span v-else>{{ openIdValue }}</span>
     </div>
     </div>
@@ -32,7 +32,12 @@ export default {
             corporateWeChat: false, // 企业微信转译
             corporateWeChat: false, // 企业微信转译
             dingdingPlatform: false, // 钉钉转译
             dingdingPlatform: false, // 钉钉转译
 
 
-            openIdValue: ''
+            openIdValue: '',
+            noRender: ['全部人员', '未分配'],
+            dingdingOpenType: {
+                userName: 'userName',
+                departmentName: 'deptName',
+            }
         }
         }
     },
     },
     computed: {},
     computed: {},
@@ -49,7 +54,6 @@ export default {
     },
     },
     methods: {
     methods: {
         dealWith() {
         dealWith() {
-            console.log(this.user)
             const { userNameNeedTranslate, dingdingUserid } = this.user
             const { userNameNeedTranslate, dingdingUserid } = this.user
             if (userNameNeedTranslate) {
             if (userNameNeedTranslate) {
                 this.corporateWeChat = true
                 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('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('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('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 :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-button v-for="item in theCustomList" :key="item.id" :label="item.name"></el-radio-button>
             </el-radio-group>
             </el-radio-group>

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

@@ -146,7 +146,7 @@
                     </el-form-item> -->
                     </el-form-item> -->
                     <el-form-item style="float:right;">
                     <el-form-item style="float:right;">
                         <span style="color: #666666">{{ $t('jiao-se') }}</span>
                         <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
                             <!-- <el-option
                             v-for="item in rolesa"
                             v-for="item in rolesa"
                             :key="item.value"
                             :key="item.value"
@@ -158,7 +158,7 @@
                     </el-form-item>
                     </el-form-item>
                     <el-form-item style="float:right;">
                     <el-form-item style="float:right;">
                         <span style="color: #666666">{{ $t('state.states') }}</span>
                         <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
                             <el-option
                             v-for="item in states"
                             v-for="item in states"
                             :key="item.value"
                             :key="item.value"
@@ -180,7 +180,7 @@
                         </div>
                         </div>
                     </el-form-item>
                     </el-form-item>
                      <el-form-item style="float:right;" v-if="depData != null && depData.id != '-1'">
                      <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-item>
                      
                      
                 </el-form>
                 </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>
                       <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>
+                  <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-form-item label="审核层级" v-if="user.timeType.reportAuditType == 6">
                       <el-radio-group v-model="insertForm.onlyAuditOnce" >
                       <el-radio-group v-model="insertForm.onlyAuditOnce" >
                       <el-radio  :label="0" >两层审核</el-radio>
                       <el-radio  :label="0" >两层审核</el-radio>
@@ -809,6 +818,45 @@
           <el-button type="primary" @click="transferActiveMethod">确 定</el-button>
           <el-button type="primary" @click="transferActiveMethod">确 定</el-button>
         </span>
         </span>
       </el-dialog>
       </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>
   </div>
   </div>
 </template>
 </template>
@@ -1114,9 +1162,23 @@ export default {
       deleteUserFlg: false,
       deleteUserFlg: false,
       deleteUserFlgData: {},
       deleteUserFlgData: {},
       moveReportUserId: '',
       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: {
   filters: {
     acquireRoleName(value) {
     acquireRoleName(value) {
       for (var i in that.acquireRoleList) {
       for (var i in that.acquireRoleList) {
@@ -2766,6 +2828,15 @@ export default {
           (res) => {
           (res) => {
             if (res.code == "ok") {
             if (res.code == "ok") {
               this.deleteUserFlgData = res.data
               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 = {
               this.insertForm = {
                 id: res.data.id,
                 id: res.data.id,
                 name: res.data.name,
                 name: res.data.name,
@@ -2789,7 +2860,8 @@ export default {
                 plate4: res.data.plate4,
                 plate4: res.data.plate4,
                 plate5: res.data.plate5,
                 plate5: res.data.plate5,
                 jobNumber: res.data.jobNumber,
                 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.$set(this.insertForm, 'inductionDate', res.data.inductionDate)
               this.getUserCustomConfig(1);
               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) {
           if (!ssR && trs) {
             this.http.post(
             this.http.post(
               this.port.manage.insert,
               this.port.manage.insert,
@@ -3775,7 +3855,83 @@ export default {
       error => {
       error => {
           this.$message({message: error,type: "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() {
   mounted() {
     this.deactiveDate = util.formatDate.format(new Date(), "yyyy-MM-dd");
     this.deactiveDate = util.formatDate.format(new Date(), "yyyy-MM-dd");
@@ -3794,6 +3950,7 @@ export default {
       this.getWxManager()
       this.getWxManager()
     }
     }
     this.statesPush();
     this.statesPush();
+    this.getWhiteListAll()
     // 获取企业微信的参数
     // 获取企业微信的参数
     // if(this.user.companyId == '1081' || this.user.companyId == '7') {
     // if(this.user.companyId == '1081' || this.user.companyId == '7') {
     //   this.agentConfig()
     //   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="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')}} {{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>
                         <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智能填报 -->
                         <!-- AI智能填报 -->
                         <el-button type="primary" @click="getAIReport()" v-if="!hasWrittenReport" style="margin-left:5px;" >智能填报</el-button>
                         <el-button type="primary" @click="getAIReport()" v-if="!hasWrittenReport" style="margin-left:5px;" >智能填报</el-button>
                     </el-form-item>
                     </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">{{workForm.time.startTime}}-{{workForm.time.endTime}}, 工作{{workForm.time.workHours}}{{$t('time.hour')}}
                         <span v-if="workForm.time.askLeaveTime">|&nbsp;请假{{ workForm.time.askLeaveTime }}小时</span>
                         <span v-if="workForm.time.askLeaveTime">|&nbsp;请假{{ workForm.time.askLeaveTime }}小时</span>
                         </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>
                                 <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>
                             </div>
                         </el-form-item>
                         </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'"
                         <el-form-item :label="$t('screening.inputProject')" :prop="'domains.' + index + '.projectId'"
                             :rules="{ required: true, message: $t('defaultText.pleaseSelectSnItem'), trigger: ['change','blur'] }">
                             :rules="{ required: true, message: $t('defaultText.pleaseSelectSnItem'), trigger: ['change','blur'] }">
@@ -551,7 +565,7 @@
                                 </el-select>
                                 </el-select>
                             </template>
                             </template>
                             <template v-else-if="!user.timeType.hideStages"><!-- 项目的阶段 -->
                             <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;" 
                                 <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"
                                 clearable="true" v-if="domain.stages != null && domain.stages.length> 0"
                                 @change="changeStages(domain, index)"
                                 @change="changeStages(domain, index)"
@@ -780,7 +794,7 @@
                                 </el-select>
                                 </el-select>
                                 <!-- 项目的阶段 -->
                                 <!-- 项目的阶段 -->
                                 <span v-if="domain.stages != null && domain.stages.length> 0" 
                                 <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;" 
                                 <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"
                                 clearable="true" v-if="domain.stages != null && domain.stages.length> 0"
                                 @change="changeStages(domain, index)"
                                 @change="changeStages(domain, index)"
@@ -1366,7 +1380,7 @@
               :default-time="['12:00:00', '12:00:00']"
               :default-time="['12:00:00', '12:00:00']"
               size="small"
               size="small"
               popper-class="selecteorktime_datapick_popper"
               popper-class="selecteorktime_datapick_popper"
-              @change="showMonthWorkTime('first')"
+              @change="showMonthWorkTime()"
             >
             >
               </el-date-picker>
               </el-date-picker>
               <el-button size="small" @click="getDoubleLastWeek(1)">{{$t('time.twoWeeksAgo')}}</el-button>
               <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">
         <el-tab-pane v-if="user.companyId==5978" :label="'工时异常明细'" name="third">
           <div class="selectworktime_export" style="margin-top:10px;">
           <div class="selectworktime_export" style="margin-top:10px;">
-            <!-- <div class="selectworktime_export_l">
+            <div class="selectworktime_export_l">
               <el-date-picker
               <el-date-picker
               class="selecteworktime_datapick"
               class="selecteworktime_datapick"
               v-model="WorktimeDatepickValue"
               v-model="WorktimeDatepickValue"
@@ -1630,13 +1644,13 @@
               :default-time="['12:00:00', '12:00:00']"
               :default-time="['12:00:00', '12:00:00']"
               size="small"
               size="small"
               popper-class="selecteorktime_datapick_popper"
               popper-class="selecteorktime_datapick_popper"
-              @change="showMonthWorkTime()"
+              @change="showMonthWorkTimeReminder()"
             >
             >
               </el-date-picker>
               </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>
             <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-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>
                     <el-button slot="append" @click="searchScreen(0)" icon="el-icon-search"></el-button>
@@ -2246,6 +2260,7 @@
                         degreeId: null,
                         degreeId: null,
                         auditUserList: [],
                         auditUserList: [],
                     }],
                     }],
+                    showRefresh: false,
                 },
                 },
                 workRules: {
                 workRules: {
                     createDate: [{ required: true, message: this.$t('defaultText.pleaseselectaworkdate'), trigger: "change" }],
                     createDate: [{ required: true, message: this.$t('defaultText.pleaseselectaworkdate'), trigger: "change" }],
@@ -2402,7 +2417,8 @@
                 ],
                 ],
                 pushWorkTimeLogDig:false,
                 pushWorkTimeLogDig:false,
                 pushWorkTimeLogData:[],
                 pushWorkTimeLogData:[],
-                WorktimeDatepickValueForMonth:[],
+
+                userReportDeptList: []
             };
             };
         },
         },
         watch: {
         watch: {
@@ -2460,6 +2476,9 @@
             if (this.user.company.packageProject == 1) {
             if (this.user.company.packageProject == 1) {
                 this.getBasecostItemList();
                 this.getBasecostItemList();
             }
             }
+            if(this.user.timeType.userWithMultiDept == 1) {
+                this.getDeptMembData();
+            }
             if(this.user.timeType.lockWorktime){
             if(this.user.timeType.lockWorktime){
                 this.timeRange = this.timeRange.filter(item => {return item <= this.user.timeType.allday})
                 this.timeRange = this.timeRange.filter(item => {return item <= this.user.timeType.allday})
             }
             }
@@ -2488,6 +2507,25 @@
                 const isReportPictureRequired = permissionArray.some(item => item.id == companyId)
                 const isReportPictureRequired = permissionArray.some(item => item.id == companyId)
                 return isReportPictureRequired
                 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) {
             onTaskSelected(domainItem) {
                 //取服务
                 //取服务
@@ -3804,14 +3842,14 @@
         let nowwd = [getauto[0],getauto[6]]
         let nowwd = [getauto[0],getauto[6]]
         this.WorktimeDatepickValue = nowwd
         this.WorktimeDatepickValue = nowwd
       }
       }
-      this.showMonthWorkTime('first')
+      this.showMonthWorkTime()
     },
     },
 
 
     handleClick(t,e){
     handleClick(t,e){
       if (t.name == "second") {
       if (t.name == "second") {
         this.showMonthNotWorkTime()
         this.showMonthNotWorkTime()
       }else if(t.name == "first"){
       }else if(t.name == "first"){
-        this.showMonthWorkTime(t.name)
+        this.showMonthWorkTime()
       }else if(t.name == "third"){
       }else if(t.name == "third"){
         this.showMonthWorkTimeReminder()
         this.showMonthWorkTimeReminder()
       }
       }
@@ -3844,8 +3882,8 @@
         "/report/exportUserDailyWorkTimeReminder",
         "/report/exportUserDailyWorkTimeReminder",
         {
         {
           // month: this.date,
           // month: this.date,
-          startDate: this.WorktimeDatepickValueForMonth[0],
-          endDate: this.WorktimeDatepickValueForMonth[1],
+          startDate: this.WorktimeDatepickValue[0],
+          endDate: this.WorktimeDatepickValue[1],
         },
         },
         (res) => {
         (res) => {
           if (res.code == "ok") {
           if (res.code == "ok") {
@@ -3910,20 +3948,12 @@
         }
         }
     },
     },
 
 
-    showMonthWorkTime(t) {
+    showMonthWorkTime() {
       this.monthTotalPage = 0,
       this.monthTotalPage = 0,
         this.tbload = true
         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(
       this.http.post(
         "/report/getUserDailyWorkTime",
         "/report/getUserDailyWorkTime",
@@ -3972,8 +4002,8 @@
         this.tbload = true
         this.tbload = true
         let parameter={}
         let parameter={}
         parameter={
         parameter={
-            startDate: this.WorktimeDatepickValueForMonth[0],
-            endDate: this.WorktimeDatepickValueForMonth[1],
+            startDate: this.WorktimeDatepickValue[0],
+            endDate: this.WorktimeDatepickValue[1],
         }
         }
       this.http.post(
       this.http.post(
         "/report/getUserDailyWorkTimeReminder",
         "/report/getUserDailyWorkTimeReminder",
@@ -4141,10 +4171,12 @@
       let newdate = new Date()
       let newdate = new Date()
       let lastdate = newdate.toLocaleDateString(newdate.setDate(newdate.getDate() - 7))
       let lastdate = newdate.toLocaleDateString(newdate.setDate(newdate.getDate() - 7))
       let lastwd = [this.getAutoWeekDate(lastdate)[0],this.getAutoWeekDate(lastdate)[6]]
       let lastwd = [this.getAutoWeekDate(lastdate)[0],this.getAutoWeekDate(lastdate)[6]]
-      if(e){
+      if(e==1){
         this.WorktimeDatepickValue = lastwd 
         this.WorktimeDatepickValue = lastwd 
-        this.showMonthWorkTime('first')
-        
+        this.showMonthWorkTime()
+      }else if(e==2){
+        this.WorktimeDatepickValue = lastwd 
+        this.showMonthWorkTimeReminder()
       }else{
       }else{
         this.WorktimeDatepickValue = lastwd 
         this.WorktimeDatepickValue = lastwd 
         this.showMonthNotWorkTime()
         this.showMonthNotWorkTime()
@@ -4154,9 +4186,12 @@
       let newdate = new Date();
       let newdate = new Date();
       let nowdate = newdate.toLocaleDateString();
       let nowdate = newdate.toLocaleDateString();
       let nowwd = [this.getAutoWeekDate(nowdate)[0],this.getAutoWeekDate(nowdate)[6]]
       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.WorktimeDatepickValue = nowwd 
-        this.showMonthWorkTime('first')
+        this.showMonthWorkTimeReminder()
       }else{
       }else{
         this.WorktimeDatepickValue = nowwd 
         this.WorktimeDatepickValue = nowwd 
         this.showMonthNotWorkTime()
         this.showMonthNotWorkTime()
@@ -4166,9 +4201,12 @@
       let newdate = new Date()
       let newdate = new Date()
       let nextdate = newdate.toLocaleDateString(newdate.setDate(newdate.getDate() - 14))
       let nextdate = newdate.toLocaleDateString(newdate.setDate(newdate.getDate() - 14))
       let nextwd = [this.getAutoWeekDate(nextdate)[0],this.getAutoWeekDate(nextdate)[6]]
       let nextwd = [this.getAutoWeekDate(nextdate)[0],this.getAutoWeekDate(nextdate)[6]]
-      if(e){
+      if(e==1){
         this.WorktimeDatepickValue = nextwd 
         this.WorktimeDatepickValue = nextwd 
-        this.showMonthWorkTime('first')
+        this.showMonthWorkTime()
+      }else if(e==2){
+        this.WorktimeDatepickValue = nextwd 
+        this.showMonthWorkTimeReminder()
       }else{
       }else{
         this.WorktimeDatepickValue = nextwd 
         this.WorktimeDatepickValue = nextwd 
         this.showMonthNotWorkTime()
         this.showMonthNotWorkTime()
@@ -5914,6 +5952,7 @@
                                     filteredRespList: filteredRespList,
                                     filteredRespList: filteredRespList,
                                     serviceList: list.report[i].serviceList,
                                     serviceList: list.report[i].serviceList,
                                     sapServiceId: list.report[i].sapServiceId,
                                     sapServiceId: list.report[i].sapServiceId,
+                                    reportTargetDeptId: list.report[i].deptId
                                 })
                                 })
                                 if (list.report[i].state >= 2) {
                                 if (list.report[i].state >= 2) {
                                     this.canEdit = true;
                                     this.canEdit = true;
@@ -5944,7 +5983,8 @@
                                 domains: arr,
                                 domains: arr,
                                 userNames:null,
                                 userNames:null,
                                 userId:null,
                                 userId:null,
-                                time: list.time
+                                time: list.time,
+                                showRefresh: list.showRefresh
                             }
                             }
                             console.log('workForm', this.workForm)
                             console.log('workForm', this.workForm)
                         } else {
                         } else {
@@ -5968,7 +6008,8 @@
                                 }],
                                 }],
                                 userId:null,
                                 userId:null,
                                 userNames:null,
                                 userNames:null,
-                                time: this.report.time
+                                time: this.report.time,
+                                showRefresh: list.showRefresh
                             }
                             }
                             if(this.isWeekend && this.user.timeType.lockWorktime != 1){
                             if(this.isWeekend && this.user.timeType.lockWorktime != 1){
                                 this.$set(this.workForm.domains[0],'isOvertime',true)
                                 this.$set(this.workForm.domains[0],'isOvertime',true)
@@ -7907,7 +7948,7 @@
                                 formData.append("progress", this.workForm.domains[i].progress);
                                 formData.append("progress", this.workForm.domains[i].progress);
                                 formData.append("workingTime", this.workForm.domains[i].workingTime);
                                 formData.append("workingTime", this.workForm.domains[i].workingTime);
                             } 
                             } 
-
+                            
                             if(this.user.timeType.choseFromAlbum == 1 ) {
                             if(this.user.timeType.choseFromAlbum == 1 ) {
                                 console.log(this.workForm.domains[i].imgList)
                                 console.log(this.workForm.domains[i].imgList)
                                 if(this.workForm.domains[i].imgList) {
                                 if(this.workForm.domains[i].imgList) {
@@ -8068,6 +8109,10 @@
                                 });
                                 });
                                 return
                                 return
                             }
                             }
+
+                            if(this.user.timeType.userWithMultiDept == 1) {
+                                formData.append('reportTargetDeptId', this.workForm.domains[i].reportTargetDeptId||0);
+                            }
                         }
                         }
                         this.submitingReport = true;
                         this.submitingReport = true;
                         this.http.uploadFile( this.port.report.editPort, formData,
                         this.http.uploadFile( this.port.report.editPort, formData,
@@ -8286,6 +8331,11 @@
                     arr.push(obj.item.value)
                     arr.push(obj.item.value)
                     this.exportParam.departmentId = arr
                     this.exportParam.departmentId = arr
                 }
                 }
+
+                if(obj.distinction == '10' && obj) {
+                    const { id, other } = obj
+                    this.workForm.domains[other].reportTargetDeptId = id
+                }
             },
             },
             //分页
             //分页
             handleCurrentChange(val) {
             handleCurrentChange(val) {

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

@@ -1,262 +1,280 @@
 <template>
 <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>
 
 
-                    <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>
+                    <!-- <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>
-                                                    <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>
-                                                <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>
-                                </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>
                             <span v-else>
                             <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>
-                        <span v-if="user.userNameNeedTranslate == '1'">
-                            <span v-if="scope.row.isDeptAudit==0">{{$t('other.Tobereviewedbytheprojectreviewer')}}</span>
                             <span v-else>
                             <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>
-                    </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">
         <el-dialog :title="$t('defaultText.pleaseEnterTheReason')"  v-if="denyReasonDialog" :visible.sync="denyReasonDialog" :close-on-click-modal="false" customClass="customWidth" width="500px">
             <div>
             <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')" />
                 <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>
                 <el-button type="primary" @click="approveinfun()" v-else>{{ $t('btn.determine') }}</el-button>
             </div>
             </div>
         </el-dialog>
         </el-dialog>
-    </section>
+    </div>
 </template>
 </template>
 
 
 <script>
 <script>
@@ -511,7 +529,16 @@
                 isbatch: false,
                 isbatch: false,
                 defaultExpandAllFlg: false,
                 defaultExpandAllFlg: false,
                 showTable: true,
                 showTable: true,
-                projectList: []
+                projectList: [],
+                reviewTableHeight: 0,
+                reviewTableHeightKey: 1,
+
+                reviewTableObj: {
+                    reviewTableTotal: 0,
+                    reviewTableIndex: 1,
+                    reviewTableSize: +(localStorage.getItem("reviewTableSize") || '50'),
+                },
+                listBackup: []
             };
             };
         },
         },
         filters: {
         filters: {
@@ -787,6 +814,34 @@
                     this.getList()
                     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) {
             getList(e) {
                 this.listLoading = true;
                 this.listLoading = true;
@@ -820,7 +875,14 @@
                 res => {
                 res => {
                     this.listLoading = false;
                     this.listLoading = false;
                     if (res.code == "ok") {
                     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);
                         // console.log(this.port.report.portList);
                     } else {
                     } else {
                         this.$message({
                         this.$message({
@@ -1060,6 +1122,8 @@
             };
             };
         },
         },
         mounted() {
         mounted() {
+            this.reviewTableHeight = this.$refs.reviewTable.offsetHeight
+            this.reviewTableHeightKey++
             this.getList();
             this.getList();
             this.getDepartment();
             this.getDepartment();
             this.getProjectList();
             this.getProjectList();
@@ -1068,10 +1132,30 @@
     };
     };
 </script>
 </script>
 
 
-<style lang="scss">
+<style lang="scss" scoped>
 .propsbtn {
 .propsbtn {
     display: inline-block;
     display: inline-block;
     padding-left: 20px;
     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>
 </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"/>
     <link rel="shortcut icon" type="image/x-icon" href="./favicon.ico"/>
     <title>工时管家</title>
     <title>工时管家</title>
     <!-- <script src="/axios.min.js"></script> -->
     <!-- <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">
     <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.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> -->
     <!-- <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>
 <template>
     <div class="translation">
     <div class="translation">
         <!-- 文本 -->
         <!-- 文本 -->
-        <span v-if="corporateWeChat">
+        <span v-if="corporateWeChat && !noRender.includes(openIdValue)">
             <ww-open-data :type='type' :openid='openIdValue'></ww-open-data>
             <ww-open-data :type='type' :openid='openIdValue'></ww-open-data>
         </span>
         </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>
         <span v-else>{{ openIdValue }}</span>
         <span v-else>{{ openIdValue }}</span>
     </div>
     </div>
@@ -33,7 +33,12 @@ export default {
             corporateWeChat: false, // 企业微信转译
             corporateWeChat: false, // 企业微信转译
             dingdingPlatform: false, // 钉钉转译
             dingdingPlatform: false, // 钉钉转译
 
 
-            openIdValue: ''
+            openIdValue: '',
+            noRender: ['全部人员', '未分配'],
+            dingdingOpenType: {
+                userName: 'userName',
+                departmentName: 'deptName',
+            }
         }
         }
     },
     },
     computed: {},
     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>
                         type="default"><span style="color:#666;padding: 0 5px;">删除</span></van-tag>
                 </div>
                 </div>
                 <!-- <van-icon v-if="index>0&&canEdit" class="form_del" name="delete" @click="delPro(index)" /> -->
                 <!-- <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-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> -->
                     <!-- <div>请选择投入项目</div> -->
                     <van-field readonly name="projectId" clickable :value="item.projectName"
                     <van-field readonly name="projectId" clickable :value="item.projectName"
                         :label="user.companyId == 781 ? '工作任务' : '投入项目'"
                         :label="user.companyId == 781 ? '工作任务' : '投入项目'"
@@ -536,6 +542,19 @@
                 </div>
                 </div>
             </div>
             </div>
         </van-popup>
         </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>
     </div>
 </template>
 </template>
 <script>
 <script>
@@ -649,6 +668,9 @@ export default {
                 name: '',
                 name: '',
                 id: ''
                 id: ''
             }, //  代填人员信息
             }, //  代填人员信息
+
+            userReportDeptList: [], // 可选部门
+            showSelectDeptPopup: false
         };
         };
     },
     },
 
 
@@ -1639,6 +1661,8 @@ export default {
                                     sapServiceId: list[i].sapServiceId,
                                     sapServiceId: list[i].sapServiceId,
                                     sapServiceName: list[i].sapServiceName,
                                     sapServiceName: list[i].sapServiceName,
                                     serviceList: list[i].serviceList,
                                     serviceList: list[i].serviceList,
+                                    userReportDeptName: list[i].userReportDeptName,
+                                    reportTargetDeptId: list[i].deptId
                                 })
                                 })
                                 if (list[i].state >= 2) {
                                 if (list[i].state >= 2) {
                                     this.canEdit = true;
                                     this.canEdit = true;
@@ -1767,7 +1791,18 @@ export default {
             item.showPickerStage = true;
             item.showPickerStage = true;
             this.$forceUpdate();
             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) {
         clickPicker(i, item) {
             if (!item.canEdit) return;
             if (!item.canEdit) return;
@@ -2503,6 +2538,15 @@ export default {
                     this.$toast.fail("请选择[" + this.form.domains[i].projectName + "]项目的任务分组");
                     this.$toast.fail("请选择[" + this.form.domains[i].projectName + "]项目的任务分组");
                     return;
                     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) {
             if (!this.flgLg) {
                 return
                 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() {
     mounted() {
@@ -2649,6 +2711,10 @@ export default {
             this.getJobResponList();
             this.getJobResponList();
         }
         }
 
 
+        if(this.user.timeType.userWithMultiDept) {
+            this.getReportDeptList()
+        }
+
         // if(localStorage.getItem("formVal")) {
         // if(localStorage.getItem("formVal")) {
         //     var obj = localStorage.getItem("formVal")
         //     var obj = localStorage.getItem("formVal")
         //     this.form = JSON.parse(obj)
         //     this.form = JSON.parse(obj)

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

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