Selaa lähdekoodia

Merge branch 'master' of http://47.100.37.243:10191/wutt/manHourHousekeeper into master

seyason 1 vuosi sitten
vanhempi
commit
14881b33aa
100 muutettua tiedostoa jossa 3100 lisäystä ja 1252 poistoa
  1. 56 8
      fhKeeper/formulahousekeeper/customerBuler-crm/src/components/TaskModal/api.ts
  2. 77 40
      fhKeeper/formulahousekeeper/customerBuler-crm/src/components/TaskModal/index.vue
  3. 10 2
      fhKeeper/formulahousekeeper/customerBuler-crm/src/components/TaskModal/type.d.ts
  4. 13 10
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/tasks/ExportModal.vue
  5. 11 5
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/tasks/api.ts
  6. 160 60
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/tasks/index.vue
  7. 7 0
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/tasks/type.d.ts
  8. 45 40
      fhKeeper/formulahousekeeper/customerBuler-crm/src/utils/tools.ts
  9. 14 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/BusinessOpportunityController.java
  10. 14 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/ClueController.java
  11. 27 7
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/ContactsController.java
  12. 38 16
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/CustomController.java
  13. 11 3
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/TaskController.java
  14. 5 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/ContactsDocument.java
  15. 5 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/ContactsLog.java
  16. 36 15
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/Task.java
  17. 4 2
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/ContactsServiceImpl.java
  18. 1 1
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/SysFormServiceImpl.java
  19. 36 13
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/TaskServiceImpl.java
  20. 18 10
      fhKeeper/formulahousekeeper/management-crm/src/main/resources/mapper/TaskMapper.xml
  21. 5 0
      fhKeeper/formulahousekeeper/management-platform/pom.xml
  22. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/DingDingController.java
  23. 14 3
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ExpenseItemController.java
  24. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/FinanceController.java
  25. 5 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/GroupBudgetReviewController.java
  26. 5 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectRequirementController.java
  27. 16 7
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportLogController.java
  28. 16 13
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/TaskCommentController.java
  29. 233 6
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/TaskController.java
  30. 467 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/UserController.java
  31. 11 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/UserCorpwxTimeController.java
  32. 5 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/UserYearleaveSettingController.java
  33. 2 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/WeiXinCorpController.java
  34. 1 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/vo/ExpenseItemVO.java
  35. 1 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/vo/TimelinessRateVO.java
  36. 8 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/TaskMapper.java
  37. 2 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/DepartmentService.java
  38. 6 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/DingDingService.java
  39. 6 6
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ExcelExportService.java
  40. 6 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/TaskService.java
  41. 0 3
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/UserService.java
  42. 10 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ContractServiceImpl.java
  43. 40 5
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/DepartmentServiceImpl.java
  44. 107 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/DingDingServiceImpl.java
  45. 171 5
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ExcelExportServiceImpl.java
  46. 7 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ExpenseSheetServiceImpl.java
  47. 10 3
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/FinanceServiceImpl.java
  48. 22 18
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/InformationServiceImpl.java
  49. 15 4
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/LeaveSheetServiceImpl.java
  50. 5 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectApprovalServiceImpl.java
  51. 178 43
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java
  52. 6 4
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProviderInfoServiceImpl.java
  53. 6 5
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportExtraDegreeServiceImpl.java
  54. 82 10
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java
  55. 4 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/SimpleReportServiceImpl.java
  56. 10 8
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/TaskRestartServiceImpl.java
  57. 129 177
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/TaskServiceImpl.java
  58. 1 370
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/UserServiceImpl.java
  59. 1 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/WxCorpInfoServiceImpl.java
  60. 2 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ExpenseItemMapper.xml
  61. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectMapper.xml
  62. 3 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ReportMapper.xml
  63. 83 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/TaskMapper.xml
  64. 12 12
      fhKeeper/formulahousekeeper/timesheet/src/components/cascader.vue
  65. 8 8
      fhKeeper/formulahousekeeper/timesheet/src/components/cascaderOption.vue
  66. 7 7
      fhKeeper/formulahousekeeper/timesheet/src/components/select.vue
  67. 14 14
      fhKeeper/formulahousekeeper/timesheet/src/components/taskComponent.vue
  68. 129 0
      fhKeeper/formulahousekeeper/timesheet/src/components/translationOpenData.vue
  69. 90 0
      fhKeeper/formulahousekeeper/timesheet/src/components/translationOpenDataText.vue
  70. 6 0
      fhKeeper/formulahousekeeper/timesheet/src/main.js
  71. 1 0
      fhKeeper/formulahousekeeper/timesheet/src/permissions.js
  72. 10 9
      fhKeeper/formulahousekeeper/timesheet/src/views/Home.vue
  73. 13 13
      fhKeeper/formulahousekeeper/timesheet/src/views/awayOffice/awayOffice.vue
  74. 2 2
      fhKeeper/formulahousekeeper/timesheet/src/views/contract/index.vue
  75. 235 37
      fhKeeper/formulahousekeeper/timesheet/src/views/corpreport/list.vue
  76. 3 3
      fhKeeper/formulahousekeeper/timesheet/src/views/expense/expense.vue
  77. 12 12
      fhKeeper/formulahousekeeper/timesheet/src/views/leave/list.vue
  78. 1 1
      fhKeeper/formulahousekeeper/timesheet/src/views/project/CostBaseline.vue
  79. 1 1
      fhKeeper/formulahousekeeper/timesheet/src/views/project/budgetReview.vue
  80. 1 1
      fhKeeper/formulahousekeeper/timesheet/src/views/project/cost.vue
  81. 1 1
      fhKeeper/formulahousekeeper/timesheet/src/views/project/fileCenter.vue
  82. 7 7
      fhKeeper/formulahousekeeper/timesheet/src/views/project/finance.vue
  83. 8 8
      fhKeeper/formulahousekeeper/timesheet/src/views/project/info.vue
  84. 15 15
      fhKeeper/formulahousekeeper/timesheet/src/views/project/list.vue
  85. 22 22
      fhKeeper/formulahousekeeper/timesheet/src/views/project/projectInside.vue
  86. 1 1
      fhKeeper/formulahousekeeper/timesheet/src/views/project/project_gantt.vue
  87. 5 5
      fhKeeper/formulahousekeeper/timesheet/src/views/project/vueGantt.vue
  88. 11 11
      fhKeeper/formulahousekeeper/timesheet/src/views/projectApproval/projectApproval.vue
  89. 11 11
      fhKeeper/formulahousekeeper/timesheet/src/views/settings/timetype.vue
  90. 4 4
      fhKeeper/formulahousekeeper/timesheet/src/views/task/list.vue
  91. 14 12
      fhKeeper/formulahousekeeper/timesheet/src/views/team/index.vue
  92. 45 61
      fhKeeper/formulahousekeeper/timesheet/src/views/workReport/daily.vue
  93. 15 15
      fhKeeper/formulahousekeeper/timesheet/src/views/workReport/list.vue
  94. 1 1
      fhKeeper/formulahousekeeper/timesheet/src/views/workReport/list_department.vue
  95. 5 5
      fhKeeper/formulahousekeeper/timesheet/src/views/workReport/list_import.vue
  96. 1 1
      fhKeeper/formulahousekeeper/timesheet/src/views/workReport/list_profession.vue
  97. 3 3
      fhKeeper/formulahousekeeper/timesheet/src/views/workReport/weeklyCustomization.vue
  98. 3 3
      fhKeeper/formulahousekeeper/timesheet/src/views/workflow/report.vue
  99. 91 0
      fhKeeper/formulahousekeeper/timesheet_h5/src/components/translationOpenDataText.vue
  100. 0 0
      fhKeeper/formulahousekeeper/timesheet_h5/src/main.js

+ 56 - 8
fhKeeper/formulahousekeeper/customerBuler-crm/src/components/TaskModal/api.ts

@@ -1,14 +1,14 @@
 export const defalutModalForm = {
   taskName: "", //任务名称
   priority: "", //优先级
-  taskType: 2, //  任务类型
-  customerId: null, //  客户id 0
-  businessId: null, //商机id 1
+  taskType: 0, //  任务类型
+  customId: null, //  客户id 0
+  businessOpportunityId: null, //商机id 1
   orderId: null, //  订单id 2
   clueId: null, //线索id 3
   contactsId: null, //联系人id
   executorId: null, //执行人id
-  repeat: 0, //是否重复
+  isRepeat: 0, //是否重复
   repeatType: 0, //重复类型
   endType: 1, //结束类型
   repeatEndNever: 1,
@@ -37,23 +37,33 @@ export const TASK_TYPE = [
 ];
 export const TASK_TYPE_FIELD: {
   type: string;
-  field: "customerId" | "businessId" | "orderId" | "clueId";
+  field: "customId" | "businessOpportunityId" | "orderId" | "clueId";
+  valueIndex: string;
+  labelIndex: string;
 }[] = [
   {
     type: "0",
-    field: "customerId",
+    field: "customId",
+    valueIndex: "id",
+    labelIndex: "customName",
   },
   {
     type: "1",
-    field: "businessId",
+    field: "businessOpportunityId",
+    valueIndex: "id",
+    labelIndex: "name",
   },
   {
     type: "2",
     field: "orderId",
+    valueIndex: "value",
+    labelIndex: "label",
   },
   {
     type: "3",
     field: "clueId",
+    valueIndex: "id",
+    labelIndex: "clueName",
   },
 ];
 
@@ -68,4 +78,42 @@ export const defaultGenerateFormData = {
   list: [],
   config: {},
 };
-export const CUSTOMER_FORM_URL = "/sys-form/getListByCode/tasks";
+export const propertyToTaskTypeMap = {
+  customId: 0,
+  businessOpportunityId: 1,
+  orderId: 2,
+  clueId: 3,
+};
+export const propertyToEndTypeMap = {};
+/**
+ * 获取任务类型的函数
+ *
+ * @param obj 任意对象,期望该对象包含特定的属性以确定任务类型
+ * @returns 返回匹配到的任务类型值,如果没有匹配则返回null
+ */
+export function getTaskType(obj: any) {
+  if (!obj) {
+    return
+  }
+  if (obj.taskType) {
+    return obj.taskType;
+  }
+  let taskType = null;
+  for (const [property, taskTypeValue] of Object.entries(
+    propertyToTaskTypeMap
+  )) {
+    if (obj.hasOwnProperty(property)) {
+      taskType = taskTypeValue;
+      break;
+    }
+  }
+  return taskType;
+}
+
+export const CUSTOMER_FORM_URL = "/sys-form/getListByCode/tasks"; //自定义form表单
+export const ALL_CUSTOM = "/custom/getAll"; //客户
+export const ALL_CLUE = "/clue/getAll"; //线索
+export const ALL_BUSINESS = "/business-opportunity/getAll"; //商机
+export const ALL_CONTACTS = "/contacts/allContacts"; //联系人
+
+export const ALL_USERS = "/user/getSimpleActiveUserList"; //获取所有人

+ 77 - 40
fhKeeper/formulahousekeeper/customerBuler-crm/src/components/TaskModal/index.vue

@@ -34,26 +34,27 @@
           <template v-for="item in TASK_TYPE_FIELD">
             <el-select v-model="form[item.field]" v-if="form.taskType == item.type" placeholder="请选择" clearable
               filterable :disabled="disabledList && disabledList.includes(item.field)">
-              <el-option v-for="item in taskTypeValueData" :key="item.value" :value="item.value" :label="item.label" />
+              <el-option v-for="v in taskTypeValueData" :key="v.id" :value="v[item.valueIndex]"
+                :label="v[item.labelIndex]" />
             </el-select>
           </template>
         </el-form-item>
-        <el-form-item label="联系人:" v-if="TASK_TYPE.find(v => v.value === (form.taskType || '1'))?.show">
+        <el-form-item label="联系人:" v-if="TASK_TYPE.find(v => v.value == (form.taskType || '1'))?.show">
           <el-select v-model="form.contactsId" placeholder="请选择" clearable filterable
             :disabled="disabledList && disabledList.includes('contactsId')">
-            <el-option v-for="item in contactValueData" :key="item.value" :value="item.value" :label="item.label" />
+            <el-option v-for="item in contactValueData" :key="item.id" :value="item.id" :label="item.name" />
           </el-select>
         </el-form-item>
         <el-form-item label="执行人:">
           <el-select v-model="form.executorId" placeholder="请选择" clearable multiple filterable
             :disabled="disabledList && disabledList.includes('executorId')">
-            <el-option v-for="item in executorValueData" :key="item.value" :value="item.value" :label="item.label" />
+            <el-option v-for="item in executorValueData" :key="item.id" :value="item.id" :label="item.name" />
           </el-select>
         </el-form-item>
         <el-form-item label="重复提醒:">
-          <el-switch v-model="form.repeat" :active-value="1" :inactive-value="0" @change="changeRepeat" />
+          <el-switch v-model="form.isRepeat" :active-value="1" :inactive-value="0" @change="changeRepeat" />
         </el-form-item>
-        <template v-if="form.repeat === 1">
+        <template v-if="form.isRepeat === 1">
           <el-form-item label="重复类型:">
             <el-select v-model="form.repeatType" placeholder="请选择" @change="changeRepeatType">
               <el-option v-for="item in REPEAT_TYPE" :key="item.value" :value="item.value" :label="item.label" />
@@ -65,14 +66,15 @@
             </el-form-item>
             <el-form-item label="结束:">
               <el-radio-group v-model="form.endType" @change="changeEndType">
-                <el-radio label="1" class="w-full">永不</el-radio>
-                <el-radio label="2" class="w-full mb-3"><el-input-number v-model="form.repeatEndCount" :min="1"
-                    controls-position="right" />
+                <el-radio :label="1" class="w-full">永不</el-radio>
+                <el-radio :label="2" class="w-full mb-3"><el-input-number v-model="form.repeatEndCount" :min="1"
+                    controls-position="right" :disabled="form.endType != 2" />
                   次以后
                 </el-radio>
-                <el-radio label="3" class="w-full">
+                <el-radio :label="3" class="w-full">
                   <el-date-picker v-model="form.repeatEndDate" type="date" placeholder="选择日期" style="width:65%"
-                    :disabled-date="(value: Date) => (new Date() > new Date(value))" />
+                    :disabled-date="(value: Date) => (new Date() > new Date(value))" value-format="YYYY-MM-DD"
+                    :disabled="form.endType != 3" />
                   以后
                 </el-radio>
               </el-radio-group>
@@ -111,11 +113,11 @@
         </el-form-item>
       </el-form>
       <GenerateForm ref="generateFormRef" :data="generateFormData" :value="form" />
-      <div v-if="editForm">
+      <div v-if="showLog">
         <el-form-item label="操作记录" label-width="7em">
           <div class="w-full">
             <div v-for="item in form.taskLogs" class=" border-b-2 w-full pl-3">
-              {{ `${item.modTime} ${item.userName} ${item.content}` }}
+              {{ `${dayjs(item.modTime).format('YYYY-MM-DD HH:mm:ss')} ${item.userName} ${item.content}` }}
             </div>
           </div>
         </el-form-item>
@@ -126,11 +128,11 @@
 
 <script lang="ts" setup>
 import { ref, watch } from 'vue';
-import { PRIORITY, TASK_TYPE, TASK_TYPE_FIELD, defalutModalForm, REPEAT_TYPE, CUSTOMER_FORM_URL, defaultGenerateFormData } 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_USERS, getTaskType } from "./api";
 import { GenerateForm } from "@zmjs/form-design"
 import { get } from '@/utils/request';
 import { Delete, Plus } from "@element-plus/icons-vue"
-import { FormInstance } from 'element-plus';
+import { FormInstance, dayjs } from 'element-plus';
 import { getFromValue } from '@/utils/tools';
 import { Props, Emits } from './type';
 const props = defineProps<Props>()
@@ -139,10 +141,11 @@ watch(() => props.saveLoading, (val) => {
   if (val == "3") {
     formRef.value?.resetFields();
     form.value = { ...defalutModalForm };
+    generateFormRef.value?.reset();
   }
 })
 watch(() => props.visible, (val) => {
-  formRef.value?.resetFields();
+
   if (val) {
     get(CUSTOMER_FORM_URL).then(res => {
       if (Array.isArray(res.data) && res.data.length > 0) {
@@ -151,23 +154,47 @@ watch(() => props.visible, (val) => {
     })
   }
 })
+const customeData = ref<any>([])
+const clueData = ref<any>([])
+const businessData = ref<any>([])
 watch(() => props.editForm, (val) => {
-  if (!val) {
-    //TODO 如果是新增
-    form.value = { ...defalutModalForm };
-    taskTypeValueData.value = [{ label: '客户1', value: 1 }, { label: '客户2', value: 2 }];
-    contactValueData.value = [{ label: '联系人1', value: 1 }, { label: '联系人2', value: 2 }];
-    executorValueData.value = [{ label: '执行人1', value: 1 }, { label: '执行人2', value: 2 }];
-    return
-  }
-  //TODO 如果是编辑
-  form.value = { ...val };
-  customeDate.value = (form.value.repeatDesignDay || "").split(',').filter(Boolean);
-  console.log("customeDate.value ", customeDate.value, form.value.repeatDesignDay);
-  changeTaskType(form.value.taskType)
-  contactValueData.value = [{ label: '联系人1', value: 1 }, { label: '联系人2', value: 2 }];
-  executorValueData.value = [{ label: '执行人1', value: 1 }, { label: '执行人2', value: 2 }];
 
+  let taskType = 0;
+  if (val) {
+    taskType = getTaskType(val);
+  }
+  get(ALL_CUSTOM, {}).then(({ data }) => {
+    customeData.value = data;//客户
+    if (taskType == 0) {
+      taskTypeValueData.value = data;
+    }
+  })
+  get(ALL_BUSINESS, {}).then(({ data }) => {
+    businessData.value = data;//商机
+    if (taskType == 1) {
+      taskTypeValueData.value = data;
+    }
+  })
+  get(ALL_CLUE, {}).then(({ data }) => {
+    clueData.value = data;//线索
+    if (taskType == 3) {
+      taskTypeValueData.value = data;
+    }
+  })
+  get(ALL_CONTACTS, {}).then(({ data }) => {
+    contactValueData.value = data;//联系人
+  })
+  get(ALL_USERS, {}).then(({ data }) => {
+    executorValueData.value = data;
+  })
+  if (val) {
+    form.value = {
+      ...val,
+      taskType,
+    }
+  } else {
+    form.value = { ...defalutModalForm }
+  }
 })
 const rules = ref({
   taskName: [
@@ -180,9 +207,11 @@ const rules = ref({
 const form = ref<any>({});
 const formRef = ref<FormInstance>();
 const generateFormRef = ref<InstanceType<typeof GenerateForm>>();
-const generateFormData = ref<any>(defaultGenerateFormData);
+const generateFormData = ref<any>({ ...defaultGenerateFormData });
 function closeVisible() {
-  generateFormData.value = defaultGenerateFormData;
+  formRef.value?.resetFields();
+  generateFormData.value = { ...defaultGenerateFormData };
+  generateFormRef.value?.reset()
   emits('close')
 }
 function submitForm(formEl: FormInstance | undefined, isClose: boolean) {
@@ -193,6 +222,15 @@ function submitForm(formEl: FormInstance | undefined, isClose: boolean) {
     }
     const repeatDesignDay = customeDate.value.join(",")
     generateFormRef.value?.getData().then((res: any) => {
+      console.log(`{
+        ...form.value,
+        repeatDesignDay,
+        ...res
+      }`, {
+        ...form.value,
+        repeatDesignDay,
+        ...res
+      });
       let submitData = getFromValue({
         ...form.value,
         repeatDesignDay,
@@ -210,8 +248,8 @@ function changeTaskType(value: TASK_VALUE_TYPE) {
   form.value = {
     ...form.value,
     taskType: value,
-    customerId: null, //  客户id 0
-    businessId: null, //商机id 1
+    customId: null, //  客户id 0
+    businessOpportunityId: null, //商机id 1
     orderId: null, //  订单id 2
     clueId: null, //线索id 3
     contactsId: null, //联系人id
@@ -220,13 +258,13 @@ function changeTaskType(value: TASK_VALUE_TYPE) {
     case 0:
       taskTypeValueData.value = [];
       setTimeout(() => {
-        taskTypeValueData.value = [{ label: '客户1', value: 1 }, { label: '客户2', value: 2 }];
+        taskTypeValueData.value = customeData.value;
       }, 500)
       break;
     case 1:
       taskTypeValueData.value = [];
       setTimeout(() => {
-        taskTypeValueData.value = [{ label: "商机1", value: 1 }, { label: "商机2", value: 2 }]
+        taskTypeValueData.value = businessData.value;
       }, 500)
       break;
     case 2:
@@ -238,7 +276,7 @@ function changeTaskType(value: TASK_VALUE_TYPE) {
     case 3:
       taskTypeValueData.value = [];
       setTimeout(() => {
-        taskTypeValueData.value = [{ label: "线索1", value: 1 }, { label: "线索2", value: 2 }]
+        taskTypeValueData.value = clueData.value;
       }, 500)
       break;
     default:
@@ -254,7 +292,7 @@ const executorValueData = ref<any>([])
 function changeRepeat(value: string | number | boolean) {
   form.value = {
     ...form.value,
-    repeat: value,
+    isRepeat: value,
     repeatType: 0, //重复类型
     endType: 1, //结束类型
     repeatEndNever: 1,
@@ -288,7 +326,6 @@ function changeEndType(value: string | number | boolean) {
     repeatEndCount: null, //重复指定次数次数后结束
     repeatEndDate: null, //重复到指定日期后结束
     repeatDesignDay: null, //自定义日期
-    repeatDesignSameday: null, //自定义周期
   }
 }
 

+ 10 - 2
fhKeeper/formulahousekeeper/customerBuler-crm/src/components/TaskModal/type.d.ts

@@ -16,12 +16,15 @@ export interface Props {
    * @default '新建任务'
    */
   title?: string;
+  /**
+   * 需要禁用的表单的字段
+   */
   disabledList?: (
     | "taskName"
     | "priority"
     | "taskType"
-    | "customerId"
-    | "businessId"
+    | "customId"
+    | "businessOpportunityId"
     | "orderId"
     | "clueId"
     | "contactsId"
@@ -29,6 +32,11 @@ export interface Props {
     | "startDate"
     | "endDate"
   )[];
+  /**
+   *  是否显示操作记录
+   * @default false
+   */
+  showLog?: boolean;
 }
 
 export interface Emits {

+ 13 - 10
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/tasks/ExportModal.vue

@@ -19,12 +19,12 @@
             <el-option v-for="item in PRIORITY " :key="item.value" :value="item.value" :label="item.label" />
           </el-select>
         </el-form-item>
-          <el-form-item label="执行人:">
+        <el-form-item label="执行人:">
           <el-select v-model="form.executorId" placeholder="请选择" clearable multiple filterable>
-            <el-option v-for="item in executorValueData" :key="item.value" :value="item.value" :label="item.label" />
+            <el-option v-for="item in executorValueData" :key="item.id" :value="item.id" :label="item.name" />
           </el-select>
         </el-form-item>
-         <el-form-item label="开始时间:" class="w50">
+        <el-form-item label="开始时间:" class="w50">
           <el-date-picker v-model="form.startDate" type="date" placeholder="选择日期" value-format="YYYY-MM-DD" />
         </el-form-item>
         <el-form-item label="截止时间:" class="w50">
@@ -37,27 +37,30 @@
 
 <script lang="ts" setup>
 import { ref, watch } from 'vue';
-import { Props, Emits } from "./type"
-import { defalutExportForm,PRIORITY } from './api';
+import { defalutExportForm, PRIORITY,ALL_USERS } from './api';
+import { post } from '@/utils/request';
+import { Emits, Props } from './type';
 const props = defineProps<Props>();
 const emits = defineEmits<Emits>();
 watch(() => props.visible, (val) => {
   if (val) {
     form.value = { ...defalutExportForm }
-    executorValueData.value = [{ label: '执行人1', value: '1' }, { label: '执行人2', value: '2' }];
+    post(ALL_USERS, {}).then(({ data }) => {
+      executorValueData.value = data;
+    })
   }
- })
+})
 function closeVisible() {
   emits("close")
- }
+}
 function submit() {
   const { executorId, ...rest } = form.value;
   const data = {
     ...rest,
     executorId: executorId.join(','),
   }
-  emits("submit",data)
- }
+  emits("submit", data)
+}
 
 const formRef = ref();
 const form = ref<any>({})

+ 11 - 5
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/tasks/api.ts

@@ -21,10 +21,10 @@ export const defaultSearchForm = {
   orderName: "", //销售订单
   phone: "", //电话
   clueName: "", //线索名称
-  priority: "",//优先级
-  status: "",//任务状态
-  startDate: "",//开始时间
-  endDate: "",//截止时间
+  priority: "", //优先级
+  status: "", //任务状态
+  startDate: "", //开始时间
+  endDate: "", //截止时间
   pageIndex: 1,
   pageSize: 10,
 };
@@ -49,4 +49,10 @@ export const defalutExportForm = {
   endDate: "", //截止日期
 };
 
-export const PAGE_LIST = `/task/pageTask`;
+export const PAGE_LIST = `${MOD}/pageTask`; //列表
+export const ADD_TASK = `${MOD}/addTask`; //新建任务
+export const DELETE_TASKS = `${MOD}/deleteTasks`; //删除任务
+export const UPDATE_TASK_STATUS = `${MOD}/updateTaskStatus`; //更新任务状态
+export const UPDATE_TASK = `${MOD}/updateTask`;//修改任务
+
+export const ALL_USERS = "/user/getSimpleActiveUserList"; //获取所有人

+ 160 - 60
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/tasks/index.vue

@@ -12,25 +12,23 @@
                 <el-option v-for="item in PRIORITY" :key="item.value" :value="item.value" :label="item.label" />
               </el-select>
             </el-form-item>
-            <el-form-item label="客户名称:" label-width="7em" prop="customerName">
-              <el-input v-model="searchForm.customerName" placeholder="请输入" />
+            <el-form-item label="客户名称:" label-width="7em" prop="customName">
+              <el-input v-model="searchForm.customName" placeholder="请输入" />
             </el-form-item>
-            <el-form-item label="联系人:" label-width="7em" prop="tel">
-              <el-input v-model="searchForm.tel" placeholder="请输入" />
+            <el-form-item label="联系人:" label-width="7em" prop="contactsName">
+              <el-input v-model="searchForm.contactsName" placeholder="请输入" />
             </el-form-item>
-            <el-form-item label="执行人:" label-width="7em" prop="tel">
-              <el-select v-model="searchForm.status" placeholder="请选择">
-                <el-option v-for="item in STATUS" :key="item.value" :value="item.value" :label="item.label" />
-              </el-select>
+            <el-form-item label="执行人:" label-width="7em" prop="executorName">
+              <el-input v-model="searchForm.executorName" placeholder="请输入" />
             </el-form-item>
-            <el-form-item label="商机名称:" label-width="7em" prop="tel">
-              <el-input v-model="searchForm.tel" placeholder="请输入" />
+            <el-form-item label="商机名称:" label-width="7em" prop="businessName">
+              <el-input v-model="searchForm.businessName" placeholder="请输入" />
             </el-form-item>
-            <el-form-item label="销售订单:" label-width="7em" prop="tel">
-              <el-input v-model="searchForm.tel" placeholder="请输入" />
+            <el-form-item label="销售订单:" label-width="7em" prop="orderName">
+              <el-input v-model="searchForm.orderName" placeholder="请输入" />
             </el-form-item>
-            <el-form-item label="线索名称:" label-width="7em" prop="tel">
-              <el-input v-model="searchForm.tel" placeholder="请输入" />
+            <el-form-item label="线索名称:" label-width="7em" prop="clueName">
+              <el-input v-model="searchForm.clueName" placeholder="请输入" />
             </el-form-item>
             <el-form-item label="任务状态:" label-width="7em" prop="status">
               <el-select v-model="searchForm.status" placeholder="请选择">
@@ -51,7 +49,7 @@
         </div>
       </div>
     </div>
-    <div class="flex-1 p-5 overflow-auto" v-loading="loading">
+    <div class="flex-1 p-5 overflow-auto">
       <div class="bg-white w-full h-full p-3 shadow-md rounded-md flex flex-col">
         <div class="ml-auto p-3">
           <el-button type="primary" @click="createTasks()">创建任务</el-Button>
@@ -59,8 +57,8 @@
           <el-button type="primary" @click="openImportModal()">导入</el-Button>
           <el-button type="primary" :loading="btnLoading" @click="exportTasks()">导出</el-Button>
         </div>
-        <div class="flex-1">
-          <el-table :data="tableData" style="width: 100%;height: 100%;" ref="tableRef">
+        <div class="flex-1 overflow-y-auto">
+          <el-table :data="tableData" style="width: 100%;height: 100%;" ref="tableRef" v-loading="loading">
             <el-table-column type="selection" width="55" />
             <el-table-column prop="taskName" label="任务名称" header-align="center" align="center" show-overflow-tooltip
               width="200" />
@@ -71,39 +69,70 @@
               </template>
             </el-table-column>
             <el-table-column prop="status" label="状态" width="100" header-align="center" align="center">
-
               <template #default="scope">
                 <el-text :type="STATUS[scope.row.status]?.type">
                   {{ STATUS[scope.row.status]?.label }}
                 </el-text>
               </template>
             </el-table-column>
-            <el-table-column prop="customerName" label="执行人" width="120" header-align="center" align="center" />
-            <el-table-column prop="startDate" label="开始时间" width="120" :sortable="true" header-align="center"
-              align="center" />
-            <el-table-column prop="endDate" label="截止时间" width="120" :sortable="true" header-align="center"
-              align="center" />
-            <el-table-column prop="contactsName" label="联系人" header-align="center" align="center" width="120" />
+            <el-table-column prop="customName" label="执行人" width="120" header-align="center" align="center" />
+            <el-table-column prop="startDate" label="开始时间" width="200" :sortable="true" header-align="center"
+              align="center" value-format="YYYY-MM-DD" />
+            <el-table-column prop="endDate" label="截止时间" width="200" :sortable="true" header-align="center"
+              align="center" value-format="YYYY-MM-DD" />
+            <el-table-column prop="contactsName" label="联系人" header-align="center" align="center" width="120">
+              <template #default="scope">
+                <el-link :underline="false" type="primary" @click="goDetail(scope.row, 'contacts', 'contactsId')">
+                  {{ scope.row.contactsName }}
+                </el-link>
+              </template>
+            </el-table-column>
             <el-table-column prop="contactsTel" label="联系人号码" header-align="center" align="center" width="140" />
-            <el-table-column prop="customerName" label="客户名称" header-align="center" align="center" width="120" />
-            <el-table-column prop="businessName" label="商机名称" header-align="center" align="center" width="200" />
-            <el-table-column prop="businessName" label="销售订单" header-align="center" align="center" width="200" />
-            <el-table-column prop="businessName" label="线索名称" header-align="center" align="center" width="200" />
+            <el-table-column prop="customName" label="客户名称" header-align="center" align="center" width="120">
+              <template #default="scope">
+                <el-link :underline="false" type="primary" @click="goDetail(scope.row, 'customer', 'customId')">
+                  {{ scope.row.customName }}
+                </el-link>
+              </template>
+            </el-table-column>
+            <el-table-column prop="businessName" label="商机名称" header-align="center" align="center" width="200">
+              <template #default="scope">
+                <el-link :underline="false" type="primary"
+                  @click="goDetail(scope.row, 'business', 'businessOpportunityId')">
+                  {{ scope.row.businessName }}
+                </el-link>
+              </template>
+            </el-table-column>
+            <el-table-column prop="orderName" label="销售订单" header-align="center" align="center" width="200">
+              <template #default="scope">
+                <el-link :underline="false" type="primary" @click="goDetail(scope.row, 'order', 'orderId')">
+                  {{ scope.row.orderName }}
+                </el-link>
+              </template>
+            </el-table-column>
+            <el-table-column prop="clueName" label="线索名称" header-align="center" align="center" width="200">
+              <template #default="scope">
+                <el-link :underline="false" type="primary" @click="goDetail(scope.row, 'thread', 'clueId')">
+                  {{ scope.row.clueName }}
+                </el-link>
+              </template>
+            </el-table-column>
+
             <el-table-column fixed="right" label="操作" header-align="center" align="center" width="150">
 
               <template #default="scope">
                 <el-button link type="primary" size="small" @click.prevent="editRow(scope.row)">
                   编辑
                 </el-button>
-                <el-button link type="primary" size="small" v-if="scope.row.status == '3'"
-                  @click.prevent="restart(scope.$index)">
+                <el-button link type="primary" size="small" v-if="scope.row.status == '2'"
+                  @click.prevent="restart(scope.row)">
                   重启
                 </el-button>
-                <el-button link type="primary" size="small" v-else @click.prevent="finishRow(scope.$index, scope)">
+                <el-button link type="primary" size="small" v-else @click.prevent="finishRow(scope.row)">
                   完成
                 </el-button>
 
-                <el-button link type="danger" size="small" @click.prevent="deleteRow(scope.$index)">
+                <el-button link type="danger" size="small" @click.prevent="deleteRow(scope.row)">
                   删除
                 </el-button>
               </template>
@@ -112,13 +141,12 @@
         </div>
         <div class="ml-auto">
           <el-pagination layout="total, prev, pager, next, sizes" :total="totalCount"
-            :current-page="searchForm.pageIndex" hide-on-single-page @size-change="sizeChage"
-            @current-change="currentChange" />
+            :current-page="searchForm.pageIndex" @size-change="sizeChage" @current-change="currentChange" />
         </div>
       </div>
     </div>
-    <TaskModal :visible="taskModalVisible" :title="taskForm ? '编辑任务' : '新建任务'" :save-loading="taskLoading"
-      :edit-form="taskForm" @close="closeTaskModal" @submit="submitForm" />
+    <TaskModal :visible="taskModalVisible" :title="isEdit ? '编辑任务' : '新建任务'" :save-loading="taskLoading"
+      :edit-form="taskForm" :show-log="isEdit" @close="closeTaskModal" @submit="submitForm" />
     <ImportModal :visible="importVisible" :save-loading="importLoading" @close="closeImportModal"
       @submit="importExcel" />
     <ExportModal :visible="exportVisible" :save-loading="exportLoading" @close="closeExportModal"
@@ -128,42 +156,59 @@
 
 <script lang="ts" setup>
 import { inject, onBeforeMount, onMounted, ref } from 'vue';
+import { useRouter } from 'vue-router';
 import { useStore } from '@/store';
-import { MOD, PRIORITY, STATUS, defaultSearchForm, PAGE_LIST } from './api';
-import { dayjs, ElTable } from 'element-plus';
+import { MOD, PRIORITY, STATUS, defaultSearchForm, PAGE_LIST, ADD_TASK, DELETE_TASKS, UPDATE_TASK, UPDATE_TASK_STATUS } from './api';
+import { ElTable, dayjs } from 'element-plus';
 import TaskModal from '@/components/TaskModal/index.vue';
 import ImportModal from './ImportModal.vue';
 import ExportModal from './ExportModal.vue';
-import { post, uploadFile } from '@/utils/request';
-import { getFromValue } from '@/utils/tools';
+import { get, post, uploadFile } from '@/utils/request';
+import { getFromValue, confirmAction } from '@/utils/tools';
+import { pushMap } from './type';
+const router = useRouter()
 const { getFunctionList } = useStore()
 const globalPopup = inject<GlobalPopup>('globalPopup')
 const pagePermission = ref<any[]>();
 const taskModalVisible = ref(false);
 const taskForm = ref<any>();
+const isEdit = ref(false);
+
 const taskLoading = ref<saveLoadingType>("1");
 function closeTaskModal() {
   taskModalVisible.value = false;
   taskForm.value = null;
 }
 function submitForm(data: any, isClose: boolean) {
-  const { executorId } = data;
-  console.log("原有的数据", data, isClose);
+  const { executorId, startDate, endDate, repeatEndDate } = data;
   let params = {
-    ...data
+    ...data,
+    startDate: startDate && dayjs(startDate).format('YYYY-MM-DD 00:00:00'),
+    endDate: endDate && dayjs(endDate).format('YYYY-MM-DD 23:59:59'),
+    repeatEndDate: repeatEndDate && dayjs(repeatEndDate).format('YYYY-MM-DD 23:59:59')
   }
   if (executorId) {
     params = {
       ...params,
-      executorId: executorId.join(',')
+      executorId: executorId.join(','),
+      taskLogs: []
     }
   }
-  console.log("提交的数据水水水水", params, isClose);
+  // console.log("提交的数据", getFromValue(params));
+  // return;
   taskLoading.value = "2";
-  setTimeout(() => {
+  let url = isEdit.value ? UPDATE_TASK : ADD_TASK
+  let msg = isEdit.value ? "修改成功" : "新建成功"
+  post(url, getFromValue(params)).then(() => {
     taskLoading.value = "3";
     taskModalVisible.value = isClose;
-  }, 2000)
+
+    globalPopup?.showSuccess(msg)
+    search();
+  }).catch(err => {
+    taskLoading.value = "4"
+    globalPopup?.showError(err.message)
+  })
 
 }
 const searchForm = ref<any>();
@@ -174,13 +219,19 @@ const totalCount = ref<number>(0);
 const tableData = ref<any[]>([])
 function search() {
   loading.value = true;
-  post(PAGE_LIST, getFromValue(searchForm.value)).then(({ data }) => {
+  const { startDate, endDate } = searchForm.value;
+  let params = {
+    ...searchForm.value,
+    startDate: startDate && dayjs(startDate).format('YYYY-MM-DD 00:00:00'),
+    endDate: endDate && dayjs(endDate).format('YYYY-MM-DD 23:59:59')
+  }
+  post(PAGE_LIST, getFromValue(params)).then(({ data }) => {
     loading.value = false;
     const { total, record } = data;
     totalCount.value = total;
     tableData.value = record;
   }).catch(err => {
-    console.log("err", err);
+    globalPopup?.showError(err);
     loading.value = false;
   })
 }
@@ -188,7 +239,6 @@ function reset() {
   searchForm.value = { ...defaultSearchForm };
 }
 function sizeChage(currentSize: number): void {
-  console.log("object", currentSize);
   searchForm.value = {
     ...searchForm.value,
     pageSize: currentSize,
@@ -198,7 +248,6 @@ function sizeChage(currentSize: number): void {
 }
 
 function currentChange(currentPage: number): void {
-  console.log("object", currentPage);
   searchForm.value = {
     ...searchForm.value,
     pageIndex: currentPage
@@ -209,10 +258,20 @@ function currentChange(currentPage: number): void {
 function createTasks() {
   taskModalVisible.value = true;
   taskForm.value = null;
+  isEdit.value = false;
 }
 function deleteTasks() {
-  console.log("deleteTasks", searchForm.value);
-  console.log(dayjs().format('YYYY-MM-DD'));
+  confirmAction("确定删除所选内容吗?").then(() => {
+    const taskIds = tableRef.value?.getSelectionRows()?.map((item: any) => item.id).join(",")
+    post(DELETE_TASKS, {
+      taskIds
+    }).then(() => {
+      search();
+      globalPopup?.showSuccess("删除成功")
+    }).catch(err => {
+      globalPopup?.showError(err)
+    })
+  });
 }
 
 
@@ -267,17 +326,58 @@ function exportExcel(data: any) {
   }, 2000)
 }
 function editRow(row: any) {
+  isEdit.value = true;
   taskModalVisible.value = true;
-  taskForm.value = row;
+  let value = {
+    ...row
+  }
+  if (value.executorId) {
+    value.executorId = value.executorId.split(",")
+  }
+  taskForm.value = value;
 }
-function finishRow(index: any, scope: any) {
-  console.log("finishRow", index, scope);
+function finishRow(item: any) {
+  post(UPDATE_TASK_STATUS, {
+    id: item.id,
+    status: 2
+  }).then(() => {
+    search()
+    globalPopup?.showSuccess("操作成功")
+  }).catch(err => {
+    globalPopup?.showError(err)
+  })
+}
+function restart(item: any) {
+  post(UPDATE_TASK_STATUS, {
+    id: item.id,
+    status: 0
+  }).then(() => {
+    search()
+    globalPopup?.showSuccess("操作成功")
+  }).catch(err => {
+    globalPopup?.showError(err)
+  })
 }
-function restart(index: any) {
-  console.log("restart", index);
+function deleteRow(item: any) {
+  confirmAction("确定删除吗?").then(() => {
+    post(DELETE_TASKS, {
+      taskIds: item.id
+    }).then(() => {
+      search();
+      globalPopup?.showSuccess("删除成功")
+    }).catch(err => {
+      console.log("err", err);
+      globalPopup?.showError(err)
+    })
+  })
 }
-function deleteRow(index: any) {
-  console.log("deleteRow", index);
+function goDetail(item: any, path: keyof pushMap, typeId: pushMap[keyof pushMap]) {
+  router.push({
+    path: `/${path}/detail`,
+    query: {
+      id: item[typeId]
+    }
+  })
 }
 onBeforeMount(() => {
   pagePermission.value = getFunctionList(MOD);

+ 7 - 0
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/tasks/type.d.ts

@@ -21,3 +21,10 @@ export interface Emits {
    */
   (event: "submit", submitData: Object): void;
 }
+export type pushMap = {
+  contacts: "contactsId"; //联系人
+  customer: "customId"; //客户
+  business: "businessOpportunityId"; //商机
+  order: "orderId"; //订单
+  thread: "clueId"; //线索
+};

+ 45 - 40
fhKeeper/formulahousekeeper/customerBuler-crm/src/utils/tools.ts

@@ -1,6 +1,6 @@
-import { defalutModalForm } from '@/components/TaskModal/api'
-import { ElMessageBox } from 'element-plus';
-import { get } from './request';
+import { defalutModalForm } from "@/components/TaskModal/api";
+import { ElMessageBox } from "element-plus";
+import { get } from "./request";
 /**
  * 判断值是否为空
  * @param value 值
@@ -49,7 +49,7 @@ export function resetFromValue<T>(formData: T, resetForm: any = {}) {
     result[key] = "";
   }
   // return result;
-  return { ...result, ...resetForm }
+  return { ...result, ...resetForm };
 }
 
 /**
@@ -113,34 +113,34 @@ export function getAllListByCode(arr: ListByCodeType) {
 /**
  * 获取当月第一天
  * @param date 日期 new Date()
- * @returns 
+ * @returns
  */
-export function getFirstDayOfMonth(date: Date) {  
-  const firstDay = new Date(date.getFullYear(), date.getMonth(), 1);  
-  return formatDate(firstDay);  
-}  
+export function getFirstDayOfMonth(date: Date) {
+  const firstDay = new Date(date.getFullYear(), date.getMonth(), 1);
+  return formatDate(firstDay);
+}
 
 /**
  * 获取当月最后一天
  * @param date 日期 new Date()
- * @returns 
+ * @returns
  */
-export function getLastDayOfMonth(date: Date) {  
-  const nextMonth = new Date(date.getFullYear(), date.getMonth() + 1, 0);  
-  return formatDate(nextMonth);  
-}  
+export function getLastDayOfMonth(date: Date) {
+  const nextMonth = new Date(date.getFullYear(), date.getMonth() + 1, 0);
+  return formatDate(nextMonth);
+}
 
 /**
  * 将 Date 对象格式化为 "YYYY-MM-DD" 的形式
  * @param date 日期 new Date()
- * @returns 
+ * @returns
  */
-export function formatDate(date: Date) {  
-  const year = date.getFullYear();  
-  const month = (1 + date.getMonth()).toString().padStart(2, '0');  
-  const day = date.getDate().toString().padStart(2, '0');  
-  return `${year}-${month}-${day}`;  
-}  
+export function formatDate(date: Date) {
+  const year = date.getFullYear();
+  const month = (1 + date.getMonth()).toString().padStart(2, "0");
+  const day = date.getDate().toString().padStart(2, "0");
+  return `${year}-${month}-${day}`;
+}
 
 /**
  * 获取创建任务的 form
@@ -150,8 +150,8 @@ export function formatDate(date: Date) {
 export function createTaskFromType(taskType: TASK_VALUE_TYPE) {
   return {
     ...defalutModalForm,
-    taskType
-  }
+    taskType,
+  };
 }
 
 /**
@@ -160,14 +160,14 @@ export function createTaskFromType(taskType: TASK_VALUE_TYPE) {
  * @param fileName 文件名称
  */
 export async function downloadFile(fileData: any, fileName: string) {
-  const url=fileData;
-  const link = document.createElement('a');
+  const url = fileData;
+  const link = document.createElement("a");
   link.href = url;
-  link.setAttribute('download', fileName);
+  link.setAttribute("download", fileName);
   document.body.appendChild(link);
   link.click();
   document.body.removeChild(link);
-};
+}
 
 /**
  * 消息弹窗框
@@ -177,19 +177,24 @@ export async function downloadFile(fileData: any, fileName: string) {
  * @param options 消息弹窗框其他配置
  * @returns promise
  */
-export function confirmAction(message: string, title = '', type: componentType = 'warning', options = {}) {  
-  return new Promise<void>((resolve, reject) => {  
-    ElMessageBox.confirm(message, title, {  
-      ...{  
-        confirmButtonText: '确定',  
-        cancelButtonText: '取消',  
-        type: type,  
-      },  
-      ...options,  
-    })  
-      .then(() => resolve())  
-      .catch(() => reject());  
-  });  
+export function confirmAction(
+  message: string,
+  title = "",
+  type: componentType = "warning",
+  options = {}
+) {
+  return new Promise<void>((resolve, reject) => {
+    ElMessageBox.confirm(message, title, {
+      ...{
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: type,
+      },
+      ...options,
+    })
+      .then(() => resolve())
+      .catch(() => reject());
+  });
 }
 
 /**

+ 14 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/BusinessOpportunityController.java

@@ -45,6 +45,19 @@ public class BusinessOpportunityController {
 
     @Resource
     private BusinessOpportunityService bOservice;
+    @Resource
+    private BusinessOpportunityMapper businessOpportunityMapper;
+
+    @RequestMapping("getAll")
+    public Object getAll(HttpServletRequest request) {
+        User user = userMapper.selectById(request.getHeader("Token"));
+        HttpRespMsg msg = new HttpRespMsg();
+        msg.setMsg("操作成功");
+        msg.setData(
+                businessOpportunityMapper.selectList(new QueryWrapper<BusinessOpportunity>().eq("company_id", user.getCompanyId()))
+        );
+        return msg;
+    }
 
 
     @RequestMapping("exportData")
@@ -219,6 +232,7 @@ public class BusinessOpportunityController {
         return bOservice.uploadFile(bo, request, file);
     }
 
+
     //下载
     @RequestMapping("downFile")
     public Object downFile(UploadFile file, HttpServletRequest request, HttpServletResponse response) throws Exception {

+ 14 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/ClueController.java

@@ -6,6 +6,7 @@ import com.management.platform.entity.Clue;
 import com.management.platform.entity.SysDict;
 import com.management.platform.entity.UploadFile;
 import com.management.platform.entity.User;
+import com.management.platform.mapper.ClueMapper;
 import com.management.platform.mapper.SysDictMapper;
 import com.management.platform.mapper.SysFunctionMapper;
 import com.management.platform.mapper.UserMapper;
@@ -47,9 +48,22 @@ public class ClueController {
     @Resource
     private SysFunctionService sysFunctionService;
 
+    @Resource
+    private ClueMapper clueMapper;
+
     @Resource
     private SysDictMapper sysDictMapper;
 
+    @RequestMapping("getAll")
+    public Object getAll(HttpServletRequest request) {
+        User user = userMapper.selectById(request.getHeader("Token"));
+        HttpRespMsg msg = new HttpRespMsg();
+        msg.setMsg("操作成功");
+        msg.setData(
+                clueMapper.selectList(new QueryWrapper<Clue>().eq("company_id", user.getCompanyId()))
+        );
+        return msg;
+    }
 
     // 详情
     @RequestMapping("getDetail")

+ 27 - 7
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/ContactsController.java

@@ -1,8 +1,12 @@
 package com.management.platform.controller;
 
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.management.platform.entity.Contacts;
 import com.management.platform.entity.Custom;
+import com.management.platform.entity.User;
+import com.management.platform.mapper.ContactsMapper;
+import com.management.platform.mapper.UserMapper;
 import com.management.platform.service.ContactsService;
 import com.management.platform.util.HttpRespMsg;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -35,13 +39,19 @@ public class ContactsController {
     @Autowired
     private ContactsService contactsService;
 
+    @Autowired
+    private UserMapper userMapper;
+
+    @Autowired
+    private ContactsMapper contactsMapper;
+
     /**
      * 添加联系人
      * @param contacts
      * @return
      */
     @RequestMapping("/addContacts")
-    public HttpRespMsg addContacts(@RequestBody Contacts contacts){
+    public HttpRespMsg addContacts(Contacts contacts){
         return contactsService.addContacts(contacts, request);
     }
     @RequestMapping("/getAllContacts")
@@ -70,7 +80,7 @@ public class ContactsController {
      * @return
      */
     @RequestMapping("selectContactsByCustomId")
-    public HttpRespMsg selectContactsByCustomId(@RequestBody Custom custom){
+    public HttpRespMsg selectContactsByCustomId(Custom custom){
         return contactsService.selectContactsByCustomId(custom,request);
     }
 
@@ -80,7 +90,7 @@ public class ContactsController {
      * @return
      */
     @RequestMapping("updateContacts")
-    public HttpRespMsg updateContacts(@RequestBody Contacts contacts){
+    public HttpRespMsg updateContacts( Contacts contacts){
         return contactsService.updateContacts(contacts,request);
     }
 
@@ -90,7 +100,7 @@ public class ContactsController {
      * @return
      */
     @RequestMapping("deleteContacts")
-    public HttpRespMsg deleteContacts(@RequestBody List<Integer> ids){
+    public HttpRespMsg deleteContacts( List<Integer> ids){
         return contactsService.deleteContacts(ids,request);
     }
 
@@ -109,7 +119,7 @@ public class ContactsController {
      * 批量删除回收站中的联系人
      */
     @RequestMapping("confirmDeleteContacts")
-    public HttpRespMsg confirmDeleteContacts(@RequestBody List<Integer> ids){
+    public HttpRespMsg confirmDeleteContacts(List<Integer> ids){
         return contactsService.confirmDeleteContacts(ids);
     }
 
@@ -119,12 +129,12 @@ public class ContactsController {
      * @return
      */
     @RequestMapping("returnContacts")
-    public HttpRespMsg returnContacts(@RequestBody List<Integer> ids){
+    public HttpRespMsg returnContacts(List<Integer> ids){
         return contactsService.returnContacts(ids);
     }
 
     @RequestMapping("getContactsDetail")
-    public HttpRespMsg getContactsDetail(@RequestBody Contacts contacts ){
+    public HttpRespMsg getContactsDetail(Contacts contacts ){
         return contactsService.getContactsDetail(contacts,request);
     }
 
@@ -139,6 +149,16 @@ public class ContactsController {
     }
 
 
+    @RequestMapping("allContacts")
+    public HttpRespMsg allContacts(HttpServletRequest request){
+        User user = userMapper.selectById(request.getHeader("Token"));
+        HttpRespMsg msg = new HttpRespMsg();
+        msg.setMsg("操作成功");
+        msg.setData(
+                contactsMapper.selectList(new QueryWrapper<Contacts>().eq("company_id", user.getCompanyId()))
+        );
+        return msg;
+    }
 
 
 }

+ 38 - 16
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/CustomController.java

@@ -1,10 +1,12 @@
 package com.management.platform.controller;
 
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.management.platform.entity.Clue;
 import com.management.platform.entity.Custom;
 import com.management.platform.entity.UploadFile;
 import com.management.platform.entity.User;
+import com.management.platform.mapper.CustomMapper;
 import com.management.platform.mapper.UserMapper;
 import com.management.platform.service.CustomService;
 import com.management.platform.util.HttpRespMsg;
@@ -22,7 +24,7 @@ import java.util.List;
 
 /**
  * <p>
- *  前端控制器
+ * 前端控制器
  * </p>
  *
  * @author Seyason
@@ -36,32 +38,39 @@ public class CustomController {
     @Autowired
     private CustomService customService;
     @Autowired
+    private CustomMapper customMapper;
+    @Autowired
     private UserMapper userMapper;
 
     @RequestMapping("list")
-    public HttpRespMsg list(Custom custom , HttpServletRequest request){
-        return customService.getList(custom,request);
+    public HttpRespMsg list(Custom custom, HttpServletRequest request) {
+        return customService.getList(custom, request);
     }
+
     @RequestMapping("getAllCustom")
-    public HttpRespMsg getAllCustom( HttpServletRequest request){
+    public HttpRespMsg getAllCustom(HttpServletRequest request) {
         return customService.getAllCustom(request);
     }
+
     @RequestMapping("deleteList")
-    public HttpRespMsg deleteList(Custom custom , HttpServletRequest request){
-        return customService.getDeleteList(custom,request);
+    public HttpRespMsg deleteList(Custom custom, HttpServletRequest request) {
+        return customService.getDeleteList(custom, request);
     }
 
 
     @RequestMapping("insertAndUpdate")
-    public HttpRespMsg insertAndUpdate(Custom custom , HttpServletRequest request){
-        return customService.insertAndUpdate(custom,request);
+    public HttpRespMsg insertAndUpdate(Custom custom, HttpServletRequest request) {
+        return customService.insertAndUpdate(custom, request);
     }
+
     @RequestMapping("getInfo")
-    public HttpRespMsg getInfo(Custom custom , HttpServletRequest request){
-        return customService.getInfo(custom,request);
-    } @RequestMapping("getLog")
-    public HttpRespMsg getLog(Custom custom , HttpServletRequest request){
-        return customService.getInfo(custom,request);
+    public HttpRespMsg getInfo(Custom custom, HttpServletRequest request) {
+        return customService.getInfo(custom, request);
+    }
+
+    @RequestMapping("getLog")
+    public HttpRespMsg getLog(Custom custom, HttpServletRequest request) {
+        return customService.getInfo(custom, request);
     }
 
 
@@ -77,12 +86,13 @@ public class CustomController {
             }
             customService.isDelete(ids);
             msg.setMsg("操作成功");
-        }else {
+        } else {
             msg.setError("请选择客户");
 
         }
         return msg;
     }
+
     // 批量恢复
     @RequestMapping("rollback")
     public Object rollback(Custom custom) {
@@ -95,12 +105,13 @@ public class CustomController {
             }
             customService.isRollback(ids);
             msg.setMsg("操作成功");
-        }else {
+        } else {
             msg.setError("请选择客户");
 
         }
         return msg;
     }
+
     //彻底删除
     @RequestMapping("reallyDelete")
     public Object reallyDelete(Custom custom) {
@@ -113,7 +124,7 @@ public class CustomController {
             }
             customService.isReallyDelete(ids);
             msg.setMsg("操作成功");
-        }else {
+        } else {
             msg.setError("请选择客户");
 
         }
@@ -130,6 +141,17 @@ public class CustomController {
         return msg;
     }
 
+    @RequestMapping("getAll")
+    public Object getAll(HttpServletRequest request) {
+        User user = userMapper.selectById(request.getHeader("Token"));
+        HttpRespMsg msg = new HttpRespMsg();
+        msg.setMsg("操作成功");
+        msg.setData(
+                customMapper.selectList(new QueryWrapper<Custom>().eq("company_id", user.getCompanyId()))
+        );
+        return msg;
+    }
+
     // 上传
     @RequestMapping("uploadFile")
     public Object uploadFile(Custom custom, HttpServletRequest request, MultipartFile file) throws Exception {

+ 11 - 3
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/TaskController.java

@@ -43,7 +43,7 @@ import java.util.stream.Collectors;
  * @since 2021-04-19
  */
 @RestController
-@RequestMapping("/task")
+@RequestMapping("/tasks")
 public class TaskController {
     @Resource
     private HttpServletRequest request;
@@ -68,8 +68,15 @@ public class TaskController {
     }
 
     @RequestMapping("deleteTasks")
-    public HttpRespMsg deleteTasks(List<Integer> taskIds){
-        return taskService.deleteTasks(taskIds);
+    public HttpRespMsg deleteTasks(String taskIds){
+        List<Integer> ids=new ArrayList<>();
+        if (!StringUtils.isEmpty(taskIds)){
+            String[] split = taskIds.split(",");
+            for (int i = 0; i < split.length; i++) {
+                ids.add(Integer.valueOf(split[i]));
+            }
+        }
+        return taskService.deleteTasks(ids);
     }
 
     @RequestMapping("importData")
@@ -84,6 +91,7 @@ public class TaskController {
 
     @RequestMapping("updateTaskStatus")
     public HttpRespMsg updateTaskStatus(TaskDto taskDto) throws Exception {
+        System.out.println("===========>"+taskDto.getStatus());
         return taskService.updateTaskStatus(taskDto,request);
     }
 

+ 5 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/ContactsDocument.java

@@ -6,9 +6,12 @@ import com.baomidou.mybatisplus.annotation.TableId;
 import java.time.LocalDateTime;
 import com.baomidou.mybatisplus.annotation.TableField;
 import java.io.Serializable;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
+import org.springframework.format.annotation.DateTimeFormat;
 
 /**
  * <p>
@@ -62,6 +65,8 @@ public class ContactsDocument extends Model<ContactsDocument> {
      * 创建时间
      */
     @TableField("indate")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm")
     private LocalDateTime indate;
 
     /**

+ 5 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/ContactsLog.java

@@ -6,9 +6,12 @@ import com.baomidou.mybatisplus.annotation.TableId;
 import java.time.LocalDateTime;
 import com.baomidou.mybatisplus.annotation.TableField;
 import java.io.Serializable;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
+import org.springframework.format.annotation.DateTimeFormat;
 
 /**
  * <p>
@@ -38,6 +41,8 @@ public class ContactsLog extends Model<ContactsLog> {
      * 操作时间
      */
     @TableField("operate_date")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm")
     private LocalDateTime operateDate;
 
     /**

+ 36 - 15
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/Task.java

@@ -2,34 +2,32 @@ package com.management.platform.entity;
 
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.extension.activerecord.Model;
-
-import java.time.LocalDate;
-
 import com.baomidou.mybatisplus.annotation.TableId;
+import java.time.LocalDateTime;
 import com.baomidou.mybatisplus.annotation.TableField;
-
 import java.io.Serializable;
-import java.util.Date;
 import java.util.List;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
+import org.springframework.format.annotation.DateTimeFormat;
 
 /**
  * <p>
- *
+ * 
  * </p>
  *
  * @author Seyason
- * @since 2024-03-14
+ * @since 2024-04-25
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
 @Accessors(chain = true)
 public class Task extends Model<Task> {
 
-    private static final long serialVersionUID = 1L;
+    private static final long serialVersionUID=1L;
 
     @TableId(value = "id", type = IdType.AUTO)
     private Integer id;
@@ -121,7 +119,7 @@ public class Task extends Model<Task> {
     private Integer repeatType;
 
     /**
-     * 重复永不结束   1:勾选
+     * 重复永不结束   1:勾选  
      */
     @TableField("repeat_end_never")
     private Integer repeatEndNever;
@@ -135,11 +133,13 @@ public class Task extends Model<Task> {
     /**
      * 重复结束 在  ? 日期YYYY-MM-DD之后
      */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
     @TableField("repeat_end_date")
-    private Date repeatEndDate;
+    private LocalDateTime repeatEndDate;
 
     /**
-     * 自定义期: 每 ? 天一次,保存为 x1,x2,x3,x4
+     * 自定义期: 每 ? 天一次,保存为 x1,x2,x3,x4
      */
     @TableField("repeat_design_day")
     private String repeatDesignDay;
@@ -171,26 +171,35 @@ public class Task extends Model<Task> {
     /**
      * 创建时间
      */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     @TableField("create_date")
-    private Date createDate;
+    private LocalDateTime createDate;
 
     /**
      * 截止时间
      */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     @TableField("end_date")
-    private Date endDate;
+    private LocalDateTime endDate;
 
     /**
      * 开始日期
      */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     @TableField("start_date")
-    private Date startDate;
+    private LocalDateTime startDate;
 
     /**
      * 完成日期
      */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     @TableField("finish_date")
-    private Date finishDate;
+    private LocalDateTime finishDate;
+
 
     /**
      * 是否被删除: 0否,1是
@@ -198,6 +207,18 @@ public class Task extends Model<Task> {
     @TableField("is_delete")
     private Integer isDelete;
 
+    /**
+     * 客户0, 商机1 ,订单2 , 线索3
+     */
+    @TableField("task_type")
+    private Integer taskType;
+
+    /**
+     * 永不0, 几次之后 1,什么日期之后 2
+     */
+    @TableField("end_type")
+    private Integer endType;
+
     /**
      * 自定义字段存值
      */

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

@@ -274,10 +274,12 @@ public class ContactsServiceImpl extends ServiceImpl<ContactsMapper, Contacts> i
                 if (StringUtils.isNotEmpty(task.getExecutorId())) {
                     String executorIdString = task.getExecutorId();
                     String[] executorIds = executorIdString.split(",");
+                    ArrayList<String> list = new ArrayList<>();
                     for (int index = 0; index < executorIds.length; index++) {
-                        User userSelect = userMapper.selectById(executorIds);
-                        task.getExecutorNames().add(userSelect.getName());
+                        User userSelect = userMapper.selectById(executorIds[index]);
+                        list.add(userSelect.getName());
                     }
+                    task.setExecutorNames(list);
                 }
             });
 

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

@@ -163,7 +163,7 @@ public class SysFormServiceImpl extends ServiceImpl<SysFormMapper, SysForm> impl
             cellStyle.setBorderLeft(BorderStyle.THIN);//左边框
             cellStyle.setBorderTop(BorderStyle.THIN);//上边框
             cellStyle.setBorderRight(BorderStyle.THIN);//右边框
-
+            cellStyle.setDataFormat(workBook.createDataFormat().getFormat("yyyy-MM-dd HH:mm:ss"));
             if(allList.size() > 0) {
                 int start = 0;
                 for(List<String> rowList : allList) {

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

@@ -29,6 +29,8 @@ import java.io.*;
 import java.lang.reflect.Field;
 import java.lang.reflect.Method;
 import java.text.SimpleDateFormat;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
 import java.util.*;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
@@ -111,9 +113,9 @@ public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements Ta
         }
         Task task = new Task();
         BeanUtils.copyProperties(taskDto,task);
-        task.setCreateDate(new Date());//任务的创建时间
+        task.setCreateDate(LocalDateTime.now());//任务的创建时间
         //根据任务的开始时间与当下时间判断任务的状态
-        if (taskDto.getStartDate()==null||taskDto.getStartDate().after(new Date())){
+        if (taskDto.getStartDate()==null||taskDto.getStartDate().isAfter(LocalDateTime.now())){
             task.setStatus(0);
         }else {
             task.setStatus(1);
@@ -168,6 +170,7 @@ public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements Ta
         taskDto.setCompanyId(user.getCompanyId());
         List<TaskExecutor> taskExecutorList = taskExecutorMapper.selectList(new LambdaQueryWrapper<TaskExecutor>().eq(TaskExecutor::getCompanyId,user.getCompanyId()));
         List<TaskLog> taskLogList = taskLogMapper.selectList(new LambdaQueryWrapper<TaskLog>().eq(TaskLog::getCompanyId,user.getCompanyId()));
+        taskDto.setPageIndex((taskDto.getPageIndex()-1)*taskDto.getPageSize());
         List<TasKVo> taskVoList =taskMapper.getPageListTask(taskDto);
         for (TasKVo tasKVo : taskVoList) {
             if (!taskExecutorList.isEmpty()){
@@ -255,9 +258,13 @@ public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements Ta
     @Transactional(rollbackFor = Exception.class)
     public HttpRespMsg deleteTasks(List<Integer> taskIds) {
         HttpRespMsg msg = new HttpRespMsg();
+        if (taskIds.isEmpty()){
+            msg.setError("请传递关键信息");
+            return msg;
+        }
         List<Task> taskList = taskMapper.selectList(new QueryWrapper<Task>().in("id", taskIds));
         if (!taskList.isEmpty()){
-            List<Task> collect = taskList.stream().filter(task -> task.getStatus() != 2).collect(Collectors.toList());
+            List<Task> collect = taskList.stream().filter(task ->task.getStatus()!=0&& task.getStatus() != 2).collect(Collectors.toList());
             if (collect.size()>0){
                 msg.setError("存在任务未完成,不能删除");
             }
@@ -387,7 +394,7 @@ public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements Ta
                 Task task=new Task();
                 task.setCompanyId(companyId);
                 task.setCreaterId(user.getId());
-                task.setCreateDate(new Date());
+                task.setCreateDate(LocalDateTime.now());
                 for (int i = 0; i < cellNum; i++) {
                     JSONObject item = configObJSONArray.getJSONObject(i);
                     String modelName = item.getString("model");
@@ -489,18 +496,34 @@ public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements Ta
                     if(modelName.equals("startDate")){
                         if(cell != null && cell.getCellTypeEnum() != CellType.BLANK){
                             if (cell.getCellTypeEnum() == CellType.NUMERIC){
-                                double numericCellValue = cell.getNumericCellValue();
-                                long daysSince1900 = (long) numericCellValue - 2;
-                                task.setStartDate(new Date(daysSince1900));
+                                Date dateCellValue = cell.getDateCellValue();
+                                if (dateCellValue.before(new Date(-2208988800L))){
+                                    continue;
+                                }else {
+                                    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+                                    String string = format.format(dateCellValue);
+                                    System.out.println(string);
+                                    DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+                                    LocalDateTime time = LocalDateTime.parse(string, dateTimeFormatter);
+                                    task.setStartDate(time);
+                                }
                             }
                         }
                     }
                     if(modelName.equals("endDate")){
                         if(cell != null && cell.getCellTypeEnum() != CellType.BLANK){
                             if (cell.getCellTypeEnum() == CellType.NUMERIC){
-                                double numericCellValue = cell.getNumericCellValue();
-                                long daysSince1900 = (long) numericCellValue - 2;
-                                task.setEndDate(new Date(daysSince1900));
+                                Date dateCellValue = cell.getDateCellValue();
+                                if (dateCellValue.before(new Date(-2208988800L))){
+                                    continue;
+                                }else {
+                                    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+                                    String string = format.format(dateCellValue);
+                                    System.out.println(string);
+                                    DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+                                    LocalDateTime time = LocalDateTime.parse(string, dateTimeFormatter);
+                                    task.setEndDate(time);
+                                }
                             }
                         }
                     }
@@ -761,14 +784,14 @@ public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements Ta
                 }
                 else if(model.equals("startDate")){
                     if (tasKVo.getStartDate()!=null){
-                        Date startDate = tasKVo.getStartDate();
+                        LocalDateTime startDate = tasKVo.getStartDate();
                         SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
                         value=format.format(startDate);
                     }
                 }
                 else if(model.equals("endDate")){
                     if (tasKVo.getEndDate()!=null){
-                        Date endDate = tasKVo.getEndDate();
+                        LocalDateTime endDate = tasKVo.getEndDate();
                         SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
                         value=format.format(endDate);
                     }
@@ -808,7 +831,7 @@ public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements Ta
             msg.setError("缺少用户的关键信息");
         }
         LambdaUpdateWrapper<Task> luw = new LambdaUpdateWrapper<>();
-        luw.set(Task::getStatus,taskDto.getStatus()).eq(Task::getId,taskDto.getStatus());
+        luw.set(Task::getStatus,taskDto.getStatus()).eq(Task::getId,taskDto.getId());
         taskMapper.update(null,luw);
         TaskLog taskLog = new TaskLog();
         taskLog.setUserId(user.getId()).setTaskId(taskDto.getId()).setUserName(user.getName())

+ 18 - 10
fhKeeper/formulahousekeeper/management-crm/src/main/resources/mapper/TaskMapper.xml

@@ -32,6 +32,8 @@
         <result column="start_date" property="startDate" />
         <result column="finish_date" property="finishDate" />
         <result column="is_delete" property="isDelete" />
+        <result column="task_type" property="taskType" />
+        <result column="end_type" property="endType" />
         <result column="plate1" property="plate1" />
         <result column="plate2" property="plate2" />
         <result column="plate3" property="plate3" />
@@ -41,7 +43,7 @@
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        id, task_name, company_id, owner_id, contacts_id, executor_id, clue_id, custom_id, business_opportunity_id, order_id, product_id, status, priority, is_repeat, repeat_type, repeat_end_never, repeat_end_count, repeat_end_date, repeat_design_day, repeat_design_sameday, task_desc, creater_id, creater_name, create_date, end_date, start_date, finish_date, is_delete, plate1, plate2, plate3, plate4, plate5
+        id, task_name, company_id, owner_id, contacts_id, executor_id, clue_id, custom_id, business_opportunity_id, order_id, product_id, status, priority, is_repeat, repeat_type, repeat_end_never, repeat_end_count, repeat_end_date, repeat_design_day, repeat_design_sameday, task_desc, creater_id, creater_name, create_date, end_date, start_date, finish_date, is_delete, task_type, end_type, plate1, plate2, plate3, plate4, plate5
     </sql>
 
     <resultMap id="TaskVoMap" type="com.management.platform.entity.vo.TasKVo">
@@ -73,6 +75,8 @@
         <result column="start_date" property="startDate" />
         <result column="finish_date" property="finishDate" />
         <result column="is_delete" property="isDelete" />
+        <result column="task_type" property="taskType" />
+        <result column="end_type" property="endType" />
         <result column="plate1" property="plate1" />
         <result column="plate2" property="plate2" />
         <result column="plate3" property="plate3" />
@@ -91,15 +95,16 @@
         select task.* ,
                custom.custom_name,
                business_opportunity.name businessName,
-              `order`.order_name ,
+              `sales_order`.order_name ,
                clue.clue_name,
                contacts.name contacts_name ,contacts.phone
         from task
             left join  custom on task.custom_id=custom.id
             left join  business_opportunity on task.business_opportunity_id=business_opportunity.id
-            left join  `order` on task.order_id=`order`.id
+            left join  `sales_order` on task.order_id=`sales_order`.id
             left join  clue on task.clue_id=clue.id
             left join  contacts on task.contacts_id=contacts.id
+            inner join task_executor on task.id=task_executor.task_id
 
         <where>
             and 1=1 and task.is_delete=0
@@ -120,7 +125,7 @@
                 AND business_opportunity.name LIKE CONCAT('%', #{businessName}, '%')
             </if>
             <if test=" orderName!= null and orderName != ''">
-                AND `order`.order_name LIKE CONCAT('%', #{orderName}, '%')
+                AND `sales_order`.order_name LIKE CONCAT('%', #{orderName}, '%')
             </if>
             <if test=" clueName!= null and clueName != ''">
                 AND clue.clue_name LIKE CONCAT('%', #{clueName}, '%')
@@ -134,10 +139,10 @@
             <if test=" executorName!= null and executorName != '' ">
                 AND task_executor.executor_name LIKE CONCAT('%', #{executorName}, '%')
             </if>
-            <if test=" startDate!= null and startDate != '' ">
+            <if test=" startDate!= null">
                 AND task.start_date &gt; #{startDate}
             </if>
-            <if test=" endDate!= null and endDate != '' ">
+            <if test=" endDate!= null">
                 AND task.end_date &lt; #{endDate}
             </if>
             <if test=" companyId!= null ">
@@ -145,11 +150,13 @@
             </if>
 
         </where>
+        order by task.create_date desc
 
         <if test="pageIndex != null and pageSize != null">
             LIMIT #{pageIndex}, #{pageSize}
         </if>
 
+
     </select>
 
 
@@ -158,9 +165,10 @@
         from task
         left join  custom on task.custom_id=custom.id
         left join  business_opportunity on task.business_opportunity_id=business_opportunity.id
-        left join  `order` on task.order_id=`order`.id
+        left join  `sales_order` on task.order_id=`sales_order`.id
         left join  clue on task.clue_id=clue.id
         left join  contacts on task.contacts_id=contacts.id
+        inner join task_executor on task.id=task_executor.task_id
 
         <where>
             and 1=1 and task.is_delete=0
@@ -181,7 +189,7 @@
                 AND business_opportunity.name LIKE CONCAT('%', #{businessName}, '%')
             </if>
             <if test=" orderName!= null and orderName != ''">
-                AND `order`.order_name LIKE CONCAT('%', #{orderName}, '%')
+                AND `sales_order`.order_name LIKE CONCAT('%', #{orderName}, '%')
             </if>
             <if test=" clueName!= null and clueName != ''">
                 AND clue.clue_name LIKE CONCAT('%', #{clueName}, '%')
@@ -195,10 +203,10 @@
             <if test=" executorName!= null and executorName != '' ">
                 AND task_executor.executor_name LIKE CONCAT('%', #{executorName}, '%')
             </if>
-            <if test=" startDate!= null and startDate != '' ">
+            <if test=" startDate!= null  ">
                 AND task.start_date &gt; #{startDate}
             </if>
-            <if test=" endDate!= null and endDate != '' ">
+            <if test=" endDate!= null  ">
                 AND task.end_date &lt; #{endDate}
             </if>
             <if test=" companyId!= null ">

+ 5 - 0
fhKeeper/formulahousekeeper/management-platform/pom.xml

@@ -108,6 +108,11 @@
             <artifactId>dingtalk</artifactId>
             <version>1.1.50</version>
         </dependency>
+        <dependency>
+            <groupId>com.aliyun</groupId>
+            <artifactId>dingtalk</artifactId>
+            <version>2.1.14</version>
+        </dependency>
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-data-redis</artifactId>

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

@@ -8,7 +8,7 @@ import com.management.platform.entity.*;
 import com.management.platform.mapper.*;
 import com.management.platform.service.CompanyDingdingService;
 import com.management.platform.service.DingDingService;
-import com.management.platform.service.impl.DingDingServiceImpl;
+import com.management.platform.service.impl.*;
 import com.management.platform.util.*;
 import com.taobao.api.ApiException;
 import org.slf4j.Logger;

+ 14 - 3
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ExpenseItemController.java

@@ -3,9 +3,11 @@ package com.management.platform.controller;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.management.platform.entity.CompanyDingding;
 import com.management.platform.entity.ExpenseItem;
 import com.management.platform.entity.WxCorpInfo;
 import com.management.platform.entity.vo.ExpenseItemVO;
+import com.management.platform.mapper.CompanyDingdingMapper;
 import com.management.platform.mapper.ExpenseItemMapper;
 import com.management.platform.mapper.UserMapper;
 import com.management.platform.mapper.WxCorpInfoMapper;
@@ -44,6 +46,8 @@ public class ExpenseItemController {
     @Resource
     private WxCorpInfoMapper wxCorpInfoMapper;
     @Resource
+    private CompanyDingdingMapper companyDingdingMapper;
+    @Resource
     private ExcelExportService excelExportService;
     @Value(value = "${upload.path}")
     private String path;
@@ -61,6 +65,7 @@ public class ExpenseItemController {
         HttpRespMsg msg = new HttpRespMsg();
         Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
         WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new LambdaQueryWrapper<WxCorpInfo>().eq(WxCorpInfo::getCompanyId,companyId));
+        CompanyDingding dingding = companyDingdingMapper.selectOne(new LambdaQueryWrapper<CompanyDingding>().eq(CompanyDingding::getCompanyId,companyId));
         HttpRespMsg data = list(projectId);
         List<ExpenseItemVO> itemVOS = (List<ExpenseItemVO>) data.getData();
         List<List<String>> dataList=new ArrayList<>();
@@ -83,8 +88,14 @@ public class ExpenseItemController {
                 item.add(userName);
                 item.add(deptName);
             }else {
-                item.add(itemVO.getUsername());
-                item.add(itemVO.getDepartmentName());
+                if(dingding!=null&&dingding.getSyncContact()==1){
+                    item.add("$userName="+itemVO.getUsername()+"$");
+                    item.add("$departmentName="+String.valueOf(itemVO.getCorpDdDeptId())+"$");
+                }else {
+                    item.add(itemVO.getUsername());
+                    item.add(itemVO.getDepartmentName());
+                }
+
             }
             item.add(itemVO.getHappenDate());
             item.add(itemVO.getExpenseType());
@@ -99,7 +110,7 @@ public class ExpenseItemController {
         }
         String fileUrlSuffix = "费用报销明细表_" + System.currentTimeMillis();
         try {
-           return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo, fileUrlSuffix, dataList, path);
+           return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,dingding, fileUrlSuffix, dataList, path);
         } catch (Exception e) {
             e.printStackTrace();
         }

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

@@ -166,7 +166,7 @@ public class FinanceController {
         //String fileName = company.getCompanyName()+"_财务人员成本模板";
         String fileName = MessageUtils.message("fileName.financialCost",company.getCompanyName());
         //导出模板不需要转译,不传wxCorpInfo
-        return excelExportService.exportGeneralExcelByTitleAndList(null, fileName, allList, path);
+        return excelExportService.exportGeneralExcelByTitleAndList(null,null, fileName, allList, path);
     }
     @RequestMapping("/batchRemove")
     public HttpRespMsg batchRemove(String ids){

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

@@ -65,6 +65,8 @@ public class GroupBudgetReviewController {
     private TimeTypeMapper timeTypeMapper;
     @Resource
     private InformationMapper informationMapper;
+    @Resource
+    private CompanyDingdingMapper companyDingdingMapper;
 
     @RequestMapping("/add")
     public HttpRespMsg add(Integer groupId,Integer oldManDay,Integer changeManDay,Integer nowManDay,String remark){
@@ -216,6 +218,7 @@ public class GroupBudgetReviewController {
         LocalDateTime localDateTimesStart = LocalDate.parse(startDate, df).atTime(LocalTime.MIN);
         LocalDateTime localDateTimesEnd = LocalDate.parse(endDate, df).atTime(LocalTime.MAX);
         WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new LambdaQueryWrapper<WxCorpInfo>().eq(WxCorpInfo::getCompanyId, companyId));
+        CompanyDingding dingding = companyDingdingMapper.selectOne(new LambdaQueryWrapper<CompanyDingding>().eq(CompanyDingding::getCompanyId, companyId));
         List<User> userList = userMapper.selectList(new LambdaQueryWrapper<User>().eq(User::getCompanyId, companyId));
         LambdaQueryWrapper<GroupBudgetReview> queryWrapper = new LambdaQueryWrapper<GroupBudgetReview>().eq(GroupBudgetReview::getCompanyId, companyId).orderByDesc(GroupBudgetReview::getCreateTime);
         if(startDate!=null && endDate!=null){
@@ -248,7 +251,7 @@ public class GroupBudgetReviewController {
             List<String> item=new ArrayList<>();
             item.add(groupBudgetReview.getProjectName());
             item.add(groupBudgetReview.getGroupName());
-            if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+            if((wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1)||(dingding!=null&&dingding.getSyncContact()==1)){
                 Optional<User> first = userList.stream().filter(u -> u.getId().equals(groupBudgetReview.getCreatorId())).findFirst();
                 if(first.isPresent()){
                     item.add("$userName="+first.get().getName()+"$");
@@ -267,7 +270,7 @@ public class GroupBudgetReviewController {
         }
         String fileUrlSuffix = "预估工时审核表_" + System.currentTimeMillis();
         try {
-            return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,fileUrlSuffix,dataList,path);
+            return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,dingding,fileUrlSuffix,dataList,path);
         } catch (Exception e) {
             e.printStackTrace();
         }

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

@@ -64,6 +64,8 @@ public class ProjectRequirementController {
     private WxCorpInfoMapper wxCorpInfoMapper;
     @Resource
     private ExcelExportService excelExportService;
+    @Resource
+    private CompanyDingdingMapper companyDingdingMapper;
     @RequestMapping("/addOrMod")
     public HttpRespMsg addOrMod(ProjectRequirement record) {
         HttpRespMsg msg = new HttpRespMsg();
@@ -124,6 +126,7 @@ public class ProjectRequirementController {
         HttpRespMsg httpRespMsg=new HttpRespMsg();
         Integer companyId = userMapper.selectById(request.getHeader("TOKEN")).getCompanyId();
         WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", companyId));
+        CompanyDingding dingding = companyDingdingMapper.selectOne(new QueryWrapper<CompanyDingding>().eq("company_id", companyId));
         LocalDate now = LocalDate.now();
         now = now.minusDays(7);
         String startDate = DateTimeFormatter.ofPattern("yyyy-MM-dd").format(now);
@@ -166,7 +169,7 @@ public class ProjectRequirementController {
             String userString = corpwxUseridList.toString();
             resultData.add(pr.getProjectCode());
             resultData.add(pr.getProjectName());
-            if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+            if((wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1)||(dingding!=null&&dingding.getSyncContact()==1)){
                 resultData.add(userString.replaceAll("\\[","").replaceAll("]",""));
             }else {
                 resultData.add(pr.getActiveUsers());
@@ -198,7 +201,7 @@ public class ProjectRequirementController {
         //生成excel文件导出
         //String fileName = "资源需求统计报表_"+System.currentTimeMillis();
         String fileName = MessageUtils.message("fileName.resourceDemand",System.currentTimeMillis());
-        return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo, fileName, dataList, path);
+        return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,dingding, fileName, dataList, path);
     }
     @RequestMapping("/importData")
     public HttpRespMsg importData(MultipartFile multipartFile){

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

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

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

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

+ 233 - 6
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/TaskController.java

@@ -14,6 +14,7 @@ import com.management.platform.mapper.*;
 import com.management.platform.service.*;
 import com.management.platform.util.HttpRespMsg;
 import com.management.platform.util.MessageUtils;
+import org.apache.poi.hssf.usermodel.*;
 import org.assertj.core.util.Lists;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.transaction.annotation.Transactional;
@@ -25,6 +26,8 @@ import org.springframework.web.multipart.MultipartFile;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
+import java.io.FileOutputStream;
+import java.io.IOException;
 import java.time.Duration;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
@@ -101,9 +104,17 @@ public class TaskController {
     private SapProjectServiceService sapProjectServiceService;
     @Resource
     private ExcelExportService excelExportService;
+    @Resource
+    private ProjectMapper projectMapper;
+    @Resource
+    private DingDingService dingDingService;
     @Value(value = "${upload.path}")
     private String path;
 
+    //用于控制线程锁
+    public static HashMap<String, CorpwxJobResult> corpwxJobCenter = new HashMap();
+    public static HashMap<String, Integer> corpddJobCenter = new HashMap();
+
     @RequestMapping("/save")
     @Transactional
     public HttpRespMsg save(Task task) throws Exception {
@@ -259,12 +270,13 @@ public class TaskController {
                 taskService.update(sample, new QueryWrapper<Task>().eq("parent_tid", task.getId()));
             }
             List<TaskExecutor> oldExeList = taskExecutorMapper.selectList(new QueryWrapper<TaskExecutor>().eq("task_id", task.getId()));
+            CompanyDingding dingding = companyDingdingService.getOne(new LambdaQueryWrapper<CompanyDingding>().eq(CompanyDingding::getCompanyId, user.getCompanyId()));
             //计算需要移除的执行人
             List<Integer> ids = oldExeList.stream().filter(old->!task.getExecutorList().stream().anyMatch(newT->newT.getId()!=null&&newT.getId().equals(old.getId())))
                         .map(TaskExecutor::getId).collect(Collectors.toList());
             List<TaskExecutor> hasRemoveExecutor = oldExeList.stream().filter(old -> !task.getExecutorList().stream().anyMatch(newT -> newT.getId() != null && newT.getId().equals(old.getId()))).collect(Collectors.toList());
             if(hasRemoveExecutor.size()>0){
-                if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                if((wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1)||(dingding!=null&&dingding.getSyncContact()==1)){
                     taskCommentString.append(",移除了执行人"+hasRemoveExecutor.stream().map(h->{
                         if(!h.getExecutorId().equals(user.getId())){
                             return "$userName="+h.getExecutorName()+"$";
@@ -290,7 +302,7 @@ public class TaskController {
                         .map(TaskExecutor::getExecutorId).collect(Collectors.toList());
                 List<TaskExecutor> newAddExecutor = task.getExecutorList().stream().filter(newT -> !StringUtils.isEmpty(newT.getExecutorId()) && !oldExeList.stream().anyMatch(old -> newT.getExecutorId().equals(old.getExecutorId()))).collect(Collectors.toList());
                 if(newAddExecutor.size()>0){
-                    if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                    if((wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1)||(dingding!=null&&dingding.getSyncContact()==1)){
                         taskCommentString.append(",新增了执行人"+newAddExecutor.stream().map(h->{
                             if(!h.getExecutorId().equals(user.getId())){
                                 return "$userName="+h.getExecutorName()+"$";
@@ -306,7 +318,7 @@ public class TaskController {
                     Optional<TaskExecutor> first = oldExeList.stream().filter(o -> o.getId().equals(oldHa.getId())).findFirst();
                     if(first.isPresent()){
                         if(!oldHa.getPlanHours().equals(first.get().getPlanHours())){
-                            if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                            if((wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1)||(dingding!=null&&dingding.getSyncContact()==1)){
                                 if(oldHa.getExecutorId().equals(user.getId())){
                                     taskCommentString.append(",修改了执行人"+oldHa.getExecutorName()+"计划工时为"+oldHa.getPlanHours()+"小时");
                                 }else {
@@ -968,7 +980,202 @@ public class TaskController {
 
     @RequestMapping("exportTask")
     public HttpRespMsg exportTask(Integer projectId, Integer taskType) {
-        return taskService.exportTask(projectId, taskType);
+        HttpRespMsg httpRespMsg = new HttpRespMsg();
+        List<TimeTask> list= taskMapper.getTaskWithWorktime(projectId, taskType);
+        Project project = projectMapper.selectById(projectId);
+        User user = userMapper.selectById(request.getHeader("token"));
+        Integer companyId = user.getCompanyId();
+        WxCorpInfo wxCorpInfo = wxCorpInfoService.getOne(new QueryWrapper<WxCorpInfo>().eq("company_id", companyId));
+        CompanyDingding dingding = companyDingdingService.getOne(new QueryWrapper<CompanyDingding>().eq("company_id", companyId));
+        List<User> userList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", companyId));
+        try {
+            DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+            //准备导出
+            HSSFWorkbook workbook = new HSSFWorkbook();
+            //HSSFSheet sheet = workbook.createSheet("任务数据");
+            HSSFSheet sheet = workbook.createSheet(MessageUtils.message("excel.taskData"));
+            //创建表头
+            HSSFRow headRow = sheet.createRow(0);
+            //设置列宽 setColumnWidth的第二个参数要乘以256 这个参数的单位是1/256个字符宽度
+            sheet.setColumnWidth(0, 50 * 256);
+            sheet.setColumnWidth(1, 20 * 256);
+            sheet.setColumnWidth(2, 20 * 256);
+            sheet.setColumnWidth(3, 20 * 256);
+            sheet.setColumnWidth(4, 20 * 256);
+            sheet.setColumnWidth(5, 20 * 256);
+            sheet.setColumnWidth(6, 20 * 256);
+            sheet.setColumnWidth(7, 20 * 256);
+            sheet.setColumnWidth(8, 20 * 256);
+            sheet.setColumnWidth(9, 20 * 256);
+            //设置为居中加粗
+            HSSFCellStyle headStyle = workbook.createCellStyle();
+            HSSFFont font = workbook.createFont();
+            font.setBold(true);
+            headStyle.setFont(font);
+            HSSFFont redFont = workbook.createFont();
+            redFont.setColor(HSSFFont.COLOR_RED);
+            HSSFCellStyle redStyle = workbook.createCellStyle();
+            redStyle.setFont(redFont);
+            //表头
+            HSSFCell headCell;
+            headCell = headRow.createCell(0);
+            //headCell.setCellValue("任务内容");
+            headCell.setCellValue(MessageUtils.message("excel.taskContent"));
+            headCell.setCellStyle(headStyle);
+            headCell = headRow.createCell(1);
+            //headCell.setCellValue("项目");
+            headCell.setCellValue(MessageUtils.message("entry.project"));
+            headCell.setCellStyle(headStyle);
+            headCell = headRow.createCell(2);
+            //headCell.setCellValue("执行人");
+            headCell.setCellValue(MessageUtils.message("excel.executor"));
+            headCell.setCellStyle(headStyle);
+            headCell = headRow.createCell(3);
+            //headCell.setCellValue("创建时间");
+            headCell.setCellValue(MessageUtils.message("excel.creatTime"));
+            headCell.setCellStyle(headStyle);
+            headCell = headRow.createCell(4);
+            //headCell.setCellValue("截止时间");
+            headCell.setCellValue(MessageUtils.message("excel.deadline"));
+            headCell.setCellStyle(headStyle);
+            headCell = headRow.createCell(5);
+            //headCell.setCellValue("完成时间");
+            headCell.setCellValue(MessageUtils.message("excel.comTime"));
+            headCell.setCellStyle(headStyle);
+            headCell = headRow.createCell(6);
+            //headCell.setCellValue("是否完成");
+            headCell.setCellValue(MessageUtils.message("excel.whetherCom"));
+            headCell.setCellStyle(headStyle);
+            headCell = headRow.createCell(7);
+            //headCell.setCellValue("是否逾期");
+            headCell.setCellValue(MessageUtils.message("excel.overdueNot"));
+            headCell.setCellStyle(headStyle);
+            headCell = headRow.createCell(8);
+            //headCell.setCellValue("计划工时(h)");
+            headCell.setCellValue(MessageUtils.message("excel.plannedWork"));
+            headCell.setCellStyle(headStyle);
+            headCell = headRow.createCell(9);
+            //headCell.setCellValue("实际工时(h)");
+            headCell.setCellValue(MessageUtils.message("excel.actualWork"));
+            headCell.setCellStyle(headStyle);
+            int rowNum = 1;
+            for (TimeTask task : list) {
+                HSSFRow row = sheet.createRow(rowNum);
+                row.createCell(0).setCellValue(task.getName());
+                row.createCell(1).setCellValue(project.getProjectName());
+                if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                    Optional<User> first = userList.stream().filter(ul -> ul.getId().equals(task.getExecutorId())).findFirst();
+                    if(first.isPresent()){
+                        row.createCell(2).setCellValue("$userName="+(first.get().getCorpwxUserid()==null?"":first.get().getCorpwxUserid())+"$");
+                    }else {
+                        row.createCell(2).setCellValue("");
+                    }
+                }else if(dingding!=null&&dingding.getSyncContact()==1){
+                    Optional<User> first = userList.stream().filter(ul -> ul.getId().equals(task.getExecutorId())).findFirst();
+                    if(first.isPresent()){
+                        row.createCell(2).setCellValue("$userName="+(first.get().getDingdingUserid()==null?"":first.get().getDingdingUserid())+"$");
+                    }else {
+                        row.createCell(2).setCellValue("");
+                    }
+                }else {
+                    row.createCell(2).setCellValue(task.getExecutorName());
+                }
+                row.createCell(3).setCellValue(dateTimeFormatter.format(task.getCreateDate()));
+                row.createCell(4).setCellValue(task.getEndDate() != null?dateTimeFormatter.format(task.getEndDate()):"");
+                row.createCell(5).setCellValue(task.getFinishDate() !=null?dateTimeFormatter.format(task.getFinishDate()):"");
+                row.createCell(6).setCellValue(task.getTaskStatus() == 1?"Y":"N");
+                boolean isExpired = false;
+                if (task.getTaskStatus() == 0 && task.getEndDate() !=null&& !task.getEndDate().isAfter(LocalDate.now())) {
+                    isExpired = true;
+                }
+                row.createCell(7).setCellValue(isExpired?"Y":"N");
+                row.createCell(8).setCellValue(task.getPlanHours()==null?"": task.getPlanHours().toString());
+                row.createCell(9).setCellValue(task.getWorkHours());
+                rowNum++;
+            }
+            //生成Excel文件
+            //String fileUrlSuffix = "【"+project.getProjectName()+"】任务数据" + System.currentTimeMillis() + ".xls";
+            String fileUrlSuffix = "【"+project.getProjectName()+"】"+MessageUtils.message("excel.taskData") + System.currentTimeMillis() + ".xls";
+            FileOutputStream fos = new FileOutputStream(path + fileUrlSuffix);
+            workbook.write(fos);
+            fos.flush();
+            fos.close();
+            if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                String mediaId = wxCorpInfoService.getTranslationMediaId(fileUrlSuffix);
+                String jobId = wxCorpInfoService.syncTranslation(wxCorpInfo.getCorpid(),mediaId,fileUrlSuffix, null);
+                int i = 0;
+                String syncTranslationResult = null;
+                /**
+                 * 异步上传转译文件的任务完成时会触发回调,在WeiXinCorpController中的commonDevCallbackPost实现了对回调的处理,存储到corpwxJobResult表中
+                 * 此处轮询查询本地数据库,检测到有任务的回调数据时继续执行查询操作
+                 */
+                while (i < 10) {
+                    Thread.sleep(300);
+                    CorpwxJobResult corpwxJobResult = corpwxJobCenter.get(jobId);
+                    if (corpwxJobResult != null) {
+                        if (corpwxJobResult.getErrCode() == 0) {
+                            syncTranslationResult = wxCorpInfoService.getSyncTranslationResult(jobId);
+                            corpwxJobCenter.remove(jobId);
+                        } else {
+                            httpRespMsg.setError(corpwxJobResult.getErrMsg());
+                            return httpRespMsg;
+                        }
+                        break;
+                    }
+                    i++;
+                }
+                if (syncTranslationResult != null) {
+                    httpRespMsg.data = syncTranslationResult;
+                } else {
+                    //httpRespMsg.setError("处理超时...");
+                    httpRespMsg.setError(MessageUtils.message("request.outTime"));
+                }
+            }else if(dingding!=null&&dingding.getSyncContact()==1){
+                String mediaId = dingDingService.getTranslationMediaId(fileUrlSuffix,dingding);
+                String jobId = dingDingService.syncTranslation(mediaId,fileUrlSuffix,user.getDingdingUnionid(),dingding);
+                int i = 0;
+                String syncTranslationResult = null;
+                /**
+                 * 异步上传转译文件的任务完成时会触发回调,在WeiXinCorpController中的commonDevCallbackPost实现了对回调的处理,存储到corpwxJobResult表中
+                 * 此处轮询查询本地数据库,检测到有任务的回调数据时继续执行查询操作
+                 */
+                while (i < 10) {
+                    Thread.sleep(300);
+                    Integer status = corpddJobCenter.get(jobId);
+                    if (status != null) {
+                        if (status==1) {
+                            syncTranslationResult = dingDingService.getSyncTranslationResult(jobId,dingding);
+                            corpddJobCenter.remove(jobId);
+                        }
+                        break;
+                    }
+                    i++;
+                }
+                if (syncTranslationResult != null) {
+                    httpRespMsg.data = syncTranslationResult;
+                } else {
+                    //httpRespMsg.setError("处理超时...");
+                    httpRespMsg.setError(MessageUtils.message("request.outTime"));
+                }
+            }else {
+                httpRespMsg.data = "/upload/" + fileUrlSuffix;
+            }
+        } catch (NullPointerException e) {
+            e.printStackTrace();
+            //httpRespMsg.setError("验证失败或缺少数据");
+            httpRespMsg.setError(MessageUtils.message("access.verErrorOrDataLack"));
+            return httpRespMsg;
+        } catch (IOException e) {
+            e.printStackTrace();
+            //httpRespMsg.setError("文件生成错误");
+            httpRespMsg.setError(MessageUtils.message("file.generateError"));
+            return httpRespMsg;
+        }catch (Exception e){
+            e.printStackTrace();
+            httpRespMsg.setError(MessageUtils.message("access.verErrorOrDataLack"));
+            return httpRespMsg;
+        }
+        return httpRespMsg;
     }
 
     @RequestMapping("/importTask")
@@ -1178,6 +1385,7 @@ public class TaskController {
         DateTimeFormatter df=DateTimeFormatter.ofPattern("yyyy-MM-dd");
         List<Department> departmentList = departmentService.list(new LambdaQueryWrapper<Department>().eq(Department::getCompanyId, companyId));
         WxCorpInfo wxCorpInfo = wxCorpInfoService.getOne(new LambdaQueryWrapper<WxCorpInfo>().eq(WxCorpInfo::getCompanyId, companyId));
+        CompanyDingding dingding = companyDingdingService.getOne(new LambdaQueryWrapper<CompanyDingding>().eq(CompanyDingding::getCompanyId, companyId));
         HttpRespMsg respMsg = listByPage(status, viewId, null, null, type, dateType, startDate, endDate, deptId, projectId, groupId, targetUserId);
         Map<String, Object> msgData = (Map<String, Object>) respMsg.getData();
         List<Task> taskList = (List<Task>) msgData.get("records");
@@ -1224,6 +1432,8 @@ public class TaskController {
             String executorString = executorList.stream().map(t->{
                 if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                     return "$userName="+t.getExecutorName()+"$";
+                }else if(dingding!=null&&dingding.getSyncContact()==1){
+                    return "$userName="+t.getExecutorName()+"$";
                 }else {
                     return t.getExecutorName();
                 }
@@ -1238,7 +1448,9 @@ public class TaskController {
                     if(department.isPresent()){
                         if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                             item.add("$departmentName="+department.get().getCorpwxDeptid()+"$");
-                        }else {
+                        }else if(dingding!=null&&dingding.getSyncContact()==1){
+                            item.add("$departmentName="+department.get().getDdDeptid()+"$");
+                        } else {
                             item.add(department.get().getDepartmentName());
                         }
                     }else {
@@ -1252,13 +1464,28 @@ public class TaskController {
         }
         String fileName = "待办任务导出_"+System.currentTimeMillis();
         try {
-            return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,fileName , dataList, path);
+            return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,dingding,fileName , dataList, path);
         } catch (Exception e) {
             e.printStackTrace();
         }
         return msg;
     }
 
+    @RequestMapping("/userTaskCompleteDetail")
+    public HttpRespMsg userTaskCompleteDetail(Integer pageIndex,Integer pageSize,String startDate,String endDate,String userId,Integer deptId){
+        return taskService.userTaskCompleteDetail(pageIndex,pageSize,startDate,endDate,userId,deptId);
+    }
+
+    @RequestMapping("/exportUserTaskCompleteDetail")
+    public HttpRespMsg exportUserTaskCompleteDetail(String startDate,String endDate,String userId,Integer deptId){
+        return taskService.exportUserTaskCompleteDetail(startDate,endDate,userId,deptId);
+    }
+
+    @RequestMapping("/getTaskByUserId")
+    public HttpRespMsg getTaskByUserId(String startDate,String endDate,String userId,Integer pageIndex,Integer pageSize){
+        return taskService.getTaskByUserId(startDate,endDate,userId,pageIndex,pageSize);
+    }
+
 
 }
 

+ 467 - 2
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/UserController.java

@@ -12,9 +12,13 @@ import com.management.platform.service.*;
 import com.management.platform.util.ColorUtil;
 import com.management.platform.util.HttpRespMsg;
 
+import com.management.platform.util.ListUtil;
+import com.management.platform.util.MessageUtils;
+import org.apache.poi.hssf.usermodel.*;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.ldap.core.LdapTemplate;
+import org.springframework.util.StringUtils;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.RequestParam;
@@ -29,10 +33,12 @@ import javax.naming.ldap.InitialLdapContext;
 import javax.naming.ldap.LdapContext;
 import javax.naming.ldap.SortControl;
 import javax.servlet.http.HttpServletRequest;
+import java.io.FileOutputStream;
 import java.io.IOException;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -89,8 +95,28 @@ public class UserController {
     private String dcFirst;
     @Value("${spring.ldap.base.dcSecond}")
     private String dcSecond;
+    @Value(value = "${upload.path}")
+    private String path;
     @Resource
     private UserWithBeisenMapper userWithBeisenMapper;
+    @Resource
+    private SysFunctionService sysFunctionService;
+    @Resource
+    private WxCorpInfoService wxCorpInfoService;
+    @Resource
+    private WxCorpInfoMapper wxCorpInfoMapper;
+    @Resource
+    private CompanyDingdingService companyDingdingService;
+    @Resource
+    private DingDingService dingDingService;
+    @Resource
+    private UserMapper userMapper;
+    @Resource
+    private UserCertMapper userCertMapper;
+
+    public static HashMap<String, Integer> corpddJobCenter = new HashMap();
+    //用于控制线程锁
+    public static HashMap<String, CorpwxJobResult> corpwxJobCenter = new HashMap();
 
     /**
      * 登录网页端
@@ -257,14 +283,453 @@ public class UserController {
 
     @RequestMapping("/exportUsers")
     public HttpRespMsg exportUsers(Integer containInvalid) {
-        return userService.exportUsers(containInvalid,request);
+            HttpRespMsg httpRespMsg = new HttpRespMsg();
+            try {
+                String userId = request.getHeader("Token");
+                User user = userService.getById(userId);
+                TimeType timeType = timeTypeMapper.selectById(user.getCompanyId());
+                WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", user.getCompanyId()));
+                CompanyDingding dingding = companyDingdingService.getOne(new QueryWrapper<CompanyDingding>().eq("company_id", user.getCompanyId()));
+                List<User> userList = userService.list(new LambdaQueryWrapper<User>().select(User::getId, User::getName, User::getCorpwxUserid).eq(User::getCompanyId, user.getCompanyId()));
+                List<UserCustom> userCustomList = userCustomMapper.selectList(new QueryWrapper<UserCustom>().eq("company_id", user.getCompanyId()));
+                //查看当前用户是否有人员成本的查看权限
+                boolean canViewCost = sysFunctionService.hasPriviledge(user.getRoleId(), "人员成本管理");
+                System.out.println("canViewCost=========="+canViewCost);
+                //准备导出
+                HSSFWorkbook workbook = new HSSFWorkbook();
+                //HSSFSheet sheet = workbook.createSheet("全部员工列表");
+                HSSFSheet sheet = workbook.createSheet(MessageUtils.message("excel.allPeopleList"));
+                //创建表头
+                HSSFRow headRow = sheet.createRow(0);
+                //设置列宽 setColumnWidth的第二个参数要乘以256 这个参数的单位是1/256个字符宽度
+                sheet.setColumnWidth(0, 5 * 256);
+                sheet.setColumnWidth(1, 10 * 256);
+                sheet.setColumnWidth(2, 20 * 256);
+                sheet.setColumnWidth(3, 20 * 256);
+                sheet.setColumnWidth(4, 20 * 256);
+                sheet.setColumnWidth(5, 10 * 256);
+
+                sheet.setColumnWidth(6, 10 * 256);
+                sheet.setColumnWidth(7, 10 * 256);
+                sheet.setColumnWidth(8, 10 * 256);
+                //设置为居中加粗
+                HSSFCellStyle headStyle = workbook.createCellStyle();
+                HSSFFont font = workbook.createFont();
+                font.setBold(true);
+                headStyle.setFont(font);
+                //表头
+                HSSFCell headCell;
+                headCell = headRow.createCell(0);
+                //headCell.setCellValue("序号");
+                headCell.setCellValue(MessageUtils.message("entry.serialNo"));
+                headCell.setCellStyle(headStyle);
+                headCell = headRow.createCell(1);
+                //headCell.setCellValue("姓名");
+                headCell.setCellValue(MessageUtils.message("entry.name"));
+                headCell.setCellStyle(headStyle);
+                headCell = headRow.createCell(2);
+                //headCell.setCellValue("角色");
+                headCell.setCellValue(MessageUtils.message("role.role"));
+                headCell.setCellStyle(headStyle);
+                headCell = headRow.createCell(3);
+                //headCell.setCellValue("手机号");
+                headCell.setCellValue(MessageUtils.message("excel.phoneNumber"));
+                headCell.setCellStyle(headStyle);
+                headCell = headRow.createCell(4);
+                //headCell.setCellValue("部门");
+                headCell.setCellValue(MessageUtils.message("excel.department"));
+                headCell.setCellStyle(headStyle);
+                int auditIndex = -1;
+                if(timeType.getReportAuditType() == 5 || timeType.getReportAuditType() == 6){
+                    headCell = headRow.createCell(5);
+                    headCell.setCellValue("直属审核人");
+                    headCell.setCellStyle(headStyle);
+                    auditIndex=0;
+                }
+
+                int minusIndex = -2;
+                if (canViewCost) {
+                    headCell = headRow.createCell(6+auditIndex);
+                    //headCell.setCellValue("月薪");
+                    headCell.setCellValue(MessageUtils.message("excel.MonSalary"));
+                    headCell.setCellStyle(headStyle);
+                    headCell = headRow.createCell(7+auditIndex);
+                    //headCell.setCellValue("时薪");
+                    headCell.setCellValue(MessageUtils.message("excel.hourlyWage"));
+                    headCell.setCellStyle(headStyle);
+                    minusIndex = 0;
+                }
+
+                headCell = headRow.createCell(8+minusIndex+auditIndex);
+                //headCell.setCellValue("证书");
+                headCell.setCellValue(MessageUtils.message("excel.certificate"));
+                headCell.setCellStyle(headStyle);
+                for (int i = 0; i < userCustomList.size(); i++) {
+                    headCell = headRow.createCell(minusIndex+9+i+auditIndex);
+                    headCell.setCellValue(userCustomList.get(i).getName());
+                    headCell.setCellStyle(headStyle);
+                }
+                headCell = headRow.createCell(minusIndex+9+userCustomList.size()+auditIndex);
+                //headCell.setCellValue("状态");
+                headCell.setCellValue(MessageUtils.message("leave.status"));
+                headCell.setCellStyle(headStyle);
+
+                //设置日期格式
+                HSSFCellStyle style = workbook.createCellStyle();
+                style.setDataFormat(HSSFDataFormat.getBuiltinFormat("yy/mm/dd hh:mm"));
+                //新增数据行 并且装填数据
+                int rowNum = 1;
+                QueryWrapper<User> queryWrapper = new QueryWrapper<>();
+                queryWrapper.eq("company_id", user.getCompanyId());
+                if (containInvalid == 0) {
+                    queryWrapper.eq("is_active", 1);
+                }
+                List<User> data = userMapper.selectList(queryWrapper);
+                List<Department> deptList = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id", user.getCompanyId()));
+                List<String> collect = data.stream().map(da -> da.getId()).distinct().collect(Collectors.toList());
+                List<UserCert> userCertList=new ArrayList<>();
+                if(collect!=null&&!StringUtils.isEmpty(data)){
+                    userCertList = userCertMapper.selectList(new QueryWrapper<UserCert>().in("user_id", collect));
+                }
+                for (User item : data) {
+                    if (item.getDepartmentId() != 0) {
+                        Optional<Department> first = deptList.stream().filter(d -> d.getDepartmentId().equals(item.getDepartmentId())).findFirst();
+                        if(first.isPresent()){
+                            Department department =first.get();
+                            item.setDepartmentName(department.getDepartmentName());
+                        }
+                    }
+                    HSSFRow row = sheet.createRow(rowNum);
+                    row.createCell(0).setCellValue(rowNum);
+                    if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                        row.createCell(1).setCellValue("$userName="+(item.getCorpwxUserid()==null?" ":item.getCorpwxUserid())+"$");
+                    }else if(dingding!=null&&dingding.getSyncContact()==1){
+                        row.createCell(1).setCellValue("$userName="+(item.getDingdingUserid()==null?" ":item.getDingdingUserid())+"$");
+                    }else {
+                        row.createCell(1).setCellValue(item.getName());
+                    }
+                    row.createCell(2).setCellValue(item.getRoleName());
+                    row.createCell(3).setCellValue(item.getPhone());
+                    if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                        row.createCell(4).setCellValue("$departmentName="+(item.getCorpwxDeptid()==null?" ":item.getCorpwxDeptid())+"$");
+                    }else if(dingding!=null&&dingding.getSyncContact()==1){
+                        if (item.getDepartmentId() != 0) {
+                            Optional<Department> first = deptList.stream().filter(d -> d.getDepartmentId().equals(item.getDepartmentId())).findFirst();
+                            if(first.isPresent()){
+                                Department department =first.get();
+                                row.createCell(4).setCellValue("$departmentName="+(department.getDdDeptid()==null?" ":department.getDdDeptid())+"$");
+                            }else {
+                                row.createCell(4).setCellValue(item.getDepartmentName());
+                            }
+                        }
+                    }else {
+                        row.createCell(4).setCellValue(item.getDepartmentName());
+                    }
+                    if(timeType.getReportAuditType()==5||timeType.getReportAuditType()==6){
+                        if(item.getSuperiorId()!=null){
+                            Optional<User> first = userList.stream().filter(u ->u.getId().equals(item.getSuperiorId())).findFirst();
+                            if(first.isPresent()){
+                                if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                                    row.createCell(5).setCellValue("$userName="+(first.get().getCorpwxUserid()==null?" ":first.get().getCorpwxUserid())+"$");
+                                }else if(dingding!=null&&dingding.getSyncContact()==1){
+                                    row.createCell(5).setCellValue("$userName="+(first.get().getDingdingUserid()==null?" ":first.get().getDingdingUserid())+"$");
+                                }else {
+                                    row.createCell(5).setCellValue(first.get().getName());
+                                }
+                            }else {
+                                row.createCell(5).setCellValue("");
+                            }
+                        }else {
+                            row.createCell(5).setCellValue("");
+                        }
+
+                    }
+                    if (canViewCost) {
+                        row.createCell(6+auditIndex).setCellValue(item.getMonthCost()==null? 0 : item.getMonthCost().intValue());
+                        row.createCell(7+auditIndex).setCellValue(item.getCost() == null?0.0 : item.getCost().doubleValue());
+                    }
+                    List<UserCert> certList = userCertList.stream().distinct().filter(uc -> uc.getUserId().equals(item.getId())).collect(Collectors.toList());
+                    if(certList.size()>0){
+                        String s="";
+                        for (int i = 0; i < certList.size(); i++) {
+                            if(i<certList.size()-1){
+                                s+=certList.get(i).getCertName()+" "+certList.get(i).getCertDate()+",";
+                            }else {
+                                s+=certList.get(i).getCertName()+" "+certList.get(i).getCertDate();
+                            }
+                        }
+                        row.createCell(8+minusIndex+auditIndex).setCellValue(s);
+                    }else {
+                        row.createCell(8+minusIndex+auditIndex).setCellValue("");
+                    }
+                    for (int i = 0; i < userCustomList.size(); i++) {
+                        String value="";
+                        switch (i){
+                            case 0:value=item.getPlate1()==null?"":item.getPlate1();
+                                break;
+                            case 1:value=item.getPlate2()==null?"":item.getPlate2();
+                                break;
+                            case 2:value=item.getPlate3()==null?"":item.getPlate3();
+                                break;
+                            case 3:value=item.getPlate4()==null?"":item.getPlate4();
+                                break;
+                            case 4:value=item.getPlate5()==null?"":item.getPlate5();
+                                break;
+                        }
+                        row.createCell(9+i+minusIndex+auditIndex).setCellValue(value);
+                    }
+                    row.createCell(9+userCustomList.size()+minusIndex+auditIndex).setCellValue(item.getIsActive()==1?MessageUtils.message("excel.normal"):MessageUtils.message("access.deactivated"));
+                    rowNum++;
+                }
+                //生成Excel文件
+                //String fileUrlSuffix = "员工列表" + System.currentTimeMillis() + ".xls";
+                String fileUrlSuffix = MessageUtils.message("excel.peopleList") + System.currentTimeMillis() + ".xls";
+                FileOutputStream fos = new FileOutputStream(path + fileUrlSuffix);
+                workbook.write(fos);
+                fos.flush();
+                fos.close();
+                if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                    String mediaId = wxCorpInfoService.getTranslationMediaId(fileUrlSuffix);
+                    String jobId = wxCorpInfoService.syncTranslation(wxCorpInfo.getCorpid(),mediaId,fileUrlSuffix, null);
+            /*if(jobId!=null&&!jobId.equals("")){
+                File file=new File(path + fileUrlSuffix);
+                if(file.exists()){
+                    file.delete();
+                }
+            }*/
+                    int i = 0;
+                    String syncTranslationResult = null;
+                    /**
+                     * 异步上传转译文件的任务完成时会触发回调,在WeiXinCorpController中的commonDevCallbackPost实现了对回调的处理,存储到corpwxJobResult表中
+                     * 此处轮询查询本地数据库,检测到有任务的回调数据时继续执行查询操作
+                     */
+                    while (i < 10) {
+                        Thread.sleep(300);
+                        CorpwxJobResult corpwxJobResult = corpwxJobCenter.get(jobId);
+                        if (corpwxJobResult != null) {
+                            if (corpwxJobResult.getErrCode() == 0) {
+                                syncTranslationResult = wxCorpInfoService.getSyncTranslationResult(jobId);
+                                corpwxJobCenter.remove(jobId);
+                            } else {
+                                httpRespMsg.setError(corpwxJobResult.getErrMsg());
+                                return httpRespMsg;
+                            }
+                            break;
+                        }
+                        i++;
+                    }
+                    if (syncTranslationResult != null) {
+                        httpRespMsg.data = syncTranslationResult;
+                    } else {
+                        //httpRespMsg.setError("处理超时...");
+                        httpRespMsg.setError(MessageUtils.message("request.outTime"));
+                    }
+                }else if(dingding!=null&&dingding.getSyncContact()==1){
+                    String mediaId = dingDingService.getTranslationMediaId(fileUrlSuffix,dingding);
+                    String jobId = dingDingService.syncTranslation(mediaId,fileUrlSuffix,user.getDingdingUnionid(), dingding);
+                    int i = 0;
+                    String syncTranslationResult = null;
+                    /**
+                     * 异步上传转译文件的任务完成时会触发回调,在WeiXinCorpController中的commonDevCallbackPost实现了对回调的处理,存储到corpwxJobResult表中
+                     * 此处轮询查询本地数据库,检测到有任务的回调数据时继续执行查询操作
+                     */
+                    while (i < 10) {
+                        Thread.sleep(300);
+                        Integer status = corpddJobCenter.get(jobId);
+                        if (status != null) {
+                            if (status == 1) {
+                                syncTranslationResult = dingDingService.getSyncTranslationResult(jobId,dingding);
+                                corpddJobCenter.remove(jobId);
+                            }
+                            break;
+                        }
+                        i++;
+                    }
+                    if (syncTranslationResult != null) {
+                        httpRespMsg.data = syncTranslationResult;
+                    } else {
+                        //httpRespMsg.setError("处理超时...");
+                        httpRespMsg.setError(MessageUtils.message("request.outTime"));
+                    }
+                }else {
+                    httpRespMsg.data = "/upload/" + fileUrlSuffix;
+                }
+            } catch (NullPointerException e) {
+                e.printStackTrace();
+                //httpRespMsg.setError("验证失败或缺少数据");
+                httpRespMsg.setError(MessageUtils.message("access.verErrorOrDataLack"));
+                return httpRespMsg;
+            } catch (IOException e) {
+                e.printStackTrace();
+                //httpRespMsg.setError("文件生成错误");
+                httpRespMsg.setError(MessageUtils.message("file.generateError"));
+                return httpRespMsg;
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+            return httpRespMsg;
     }
 
     @RequestMapping("/pushFillReport")
     public HttpRespMsg pushFillReport(String ids, String date,Integer code) {return userService.pushFillReport(ids, request, date,code); }
 
     @RequestMapping("/exportMembList")
-    public HttpRespMsg exportMembList(boolean isFill, String ids, String date) {return userService.exportMembList(isFill, ids, request, date); }
+    public HttpRespMsg exportMembList(boolean isFill, String ids, String date) {
+        HttpRespMsg httpRespMsg = new HttpRespMsg();
+        try {
+            String userId = request.getHeader("Token");
+            User user = userMapper.selectById(userId);
+            List<String> strings = ListUtil.convertLongIdsArrayToList(ids);
+            List<Department> deptList = departmentMapper.selectList(new QueryWrapper<Department>().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<User> userList = userMapper.selectList(new QueryWrapper<User>().in("id", strings));
+            userList.forEach(u->{
+                Optional<Department> first = deptList.stream().filter(d -> d.getDepartmentId().equals(u.getDepartmentId())).findFirst();
+                if (first.isPresent()) {
+                    u.setDepartmentName(first.get().getDepartmentName());
+                }
+            });
+            //准备导出
+            HSSFWorkbook workbook = new HSSFWorkbook();
+            //HSSFSheet sheet = workbook.createSheet("人员列表");
+            HSSFSheet sheet = workbook.createSheet(MessageUtils.message("excel.perList"));
+            //创建表头
+            HSSFRow headRow = sheet.createRow(0);
+            //设置列宽 setColumnWidth的第二个参数要乘以256 这个参数的单位是1/256个字符宽度
+            sheet.setColumnWidth(0, 5 * 256);
+            sheet.setColumnWidth(1, 10 * 256);
+            sheet.setColumnWidth(2, 20 * 256);
+            //设置为居中加粗
+            HSSFCellStyle headStyle = workbook.createCellStyle();
+            HSSFFont font = workbook.createFont();
+            font.setBold(true);
+            headStyle.setFont(font);
+            //表头
+            HSSFCell headCell;
+            headCell = headRow.createCell(0);
+            //headCell.setCellValue("序号");
+            headCell.setCellValue(MessageUtils.message("entry.serialNo"));
+            headCell.setCellStyle(headStyle);
+            headCell = headRow.createCell(1);
+            //headCell.setCellValue("姓名");
+            headCell.setCellValue(MessageUtils.message("entry.name"));
+            headCell.setCellStyle(headStyle);
+            headCell = headRow.createCell(2);
+            //headCell.setCellValue("部门");
+            headCell.setCellValue(MessageUtils.message("excel.department"));
+            headCell.setCellStyle(headStyle);
+
+            //新增数据行 并且装填数据
+            int rowNum = 1;
+            for (User item : userList) {
+                HSSFRow row = sheet.createRow(rowNum);
+                row.createCell(0).setCellValue(rowNum);
+                if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                    row.createCell(1).setCellValue("$userName="+(item.getCorpwxUserid()==null?"":item.getCorpwxUserid())+"$");
+                    row.createCell(2).setCellValue("$departmentName="+(item.getCorpwxDeptid()==null?"":item.getCorpwxDeptid())+"$");
+                }else if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                    row.createCell(1).setCellValue("$userName="+(item.getDingdingUserid()==null?"":item.getDingdingUserid())+"$");
+                    Optional<Department> first = deptList.stream().filter(d -> d.getDepartmentId().equals(item.getDepartmentId())).findFirst();
+                    if(first.isPresent()){
+                        row.createCell(2).setCellValue("$departmentName="+(first.get().getDdDeptid()==null?"":first.get().getDdDeptid())+"$");
+                    }else {
+                        row.createCell(2).setCellValue("");
+                    }
+                }else {
+                    row.createCell(1).setCellValue(item.getName());
+                    row.createCell(2).setCellValue(item.getDepartmentName());
+                }
+                rowNum++;
+            }
+            //生成Excel文件
+            //String fileUrlSuffix = date+(isFill?"已填":"未填")+"人员列表" + System.currentTimeMillis() + ".xls";
+            String fileUrlSuffix = date+(isFill?MessageUtils.message("excel.Filled"):MessageUtils.message("excel.notFilled"))+MessageUtils.message("excel.perList") + System.currentTimeMillis() + ".xls";
+            FileOutputStream fos = new FileOutputStream(path + fileUrlSuffix);
+            workbook.write(fos);
+            fos.flush();
+            fos.close();
+            if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                String mediaId = wxCorpInfoService.getTranslationMediaId(fileUrlSuffix);
+                String jobId = wxCorpInfoService.syncTranslation(wxCorpInfo.getCorpid(),mediaId,fileUrlSuffix, null);
+            /*if(jobId!=null&&!jobId.equals("")){
+                File file=new File(path + fileUrlSuffix);
+                if(file.exists()){
+                    file.delete();
+                }
+            }*/
+                int i = 0;
+                String syncTranslationResult = null;
+                /**
+                 * 异步上传转译文件的任务完成时会触发回调,在WeiXinCorpController中的commonDevCallbackPost实现了对回调的处理,存储到corpwxJobResult表中
+                 * 此处轮询查询本地数据库,检测到有任务的回调数据时继续执行查询操作
+                 */
+                while (i < 10) {
+                    Thread.sleep(300);
+                    CorpwxJobResult corpwxJobResult = corpwxJobCenter.get(jobId);
+                    if (corpwxJobResult != null) {
+                        if (corpwxJobResult.getErrCode() == 0) {
+                            syncTranslationResult = wxCorpInfoService.getSyncTranslationResult(jobId);
+                            corpwxJobCenter.remove(jobId);
+                        } else {
+                            httpRespMsg.setError(corpwxJobResult.getErrMsg());
+                            return httpRespMsg;
+                        }
+                        break;
+                    }
+                    i++;
+                }
+                if (syncTranslationResult != null) {
+                    httpRespMsg.data = syncTranslationResult;
+                } else {
+                    //httpRespMsg.setError("处理超时...");
+                    httpRespMsg.setError(MessageUtils.message("request.outTime"));
+                }
+            }else if(dingding!=null&&dingding.getSyncContact()==1){
+                String mediaId = dingDingService.getTranslationMediaId(fileUrlSuffix,dingding);
+                String jobId = dingDingService.syncTranslation(mediaId,fileUrlSuffix, user.getDingdingUnionid(),dingding);
+                int i = 0;
+                String syncTranslationResult = null;
+                /**
+                 * 异步上传转译文件的任务完成时会触发回调,在WeiXinCorpController中的commonDevCallbackPost实现了对回调的处理,存储到corpwxJobResult表中
+                 * 此处轮询查询本地数据库,检测到有任务的回调数据时继续执行查询操作
+                 */
+                while (i < 10) {
+                    Thread.sleep(300);
+                    Integer status = corpddJobCenter.get(jobId);
+                    if (status != null) {
+                        if (status == 1) {
+                            syncTranslationResult = dingDingService.getSyncTranslationResult(jobId,dingding);
+                            corpddJobCenter.remove(jobId);
+                        }
+                        break;
+                    }
+                    i++;
+                }
+                if (syncTranslationResult != null) {
+                    httpRespMsg.data = syncTranslationResult;
+                } else {
+                    //httpRespMsg.setError("处理超时...");
+                    httpRespMsg.setError(MessageUtils.message("request.outTime"));
+                }
+            }else {
+                httpRespMsg.data = "/upload/" + fileUrlSuffix;
+            }
+        } catch (NullPointerException e) {
+            //httpRespMsg.setError("验证失败或缺少数据");
+            httpRespMsg.setError(MessageUtils.message("access.verErrorOrDataLack"));
+            return httpRespMsg;
+        } catch (IOException e) {
+            //httpRespMsg.setError("文件生成错误");
+            httpRespMsg.setError(MessageUtils.message("file.generateError"));
+            return httpRespMsg;
+        }catch (Exception e){
+            e.printStackTrace();
+            httpRespMsg.setError(MessageUtils.message("access.verErrorOrDataLack"));
+            return httpRespMsg;
+        }
+        return httpRespMsg;
+    }
 
     @RequestMapping("/getHRList")
     public HttpRespMsg getHRList() {return userService.getHRList(request); }

+ 11 - 2
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/UserCorpwxTimeController.java

@@ -3,6 +3,7 @@ package com.management.platform.controller;
 
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.management.platform.entity.*;
 import com.management.platform.entity.vo.SysRichFunction;
@@ -79,6 +80,8 @@ public class UserCorpwxTimeController {
     WxCorpInfoService wxCorpInfoService;
     @Resource
     UserCorpwxTimeService userCorpwxTimeService;
+    @Resource
+    private CompanyDingdingMapper companyDingdingMapper;
 
     @RequestMapping("/getMyDeptMembsData")
     public HttpRespMsg getMyDeptMembsData(String startDate, String endDate) {
@@ -245,6 +248,7 @@ public class UserCorpwxTimeController {
         User user = userMapper.selectById(token);
         Integer companyId = user.getCompanyId();
         WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", companyId));
+        CompanyDingding dingding = companyDingdingMapper.selectOne(new LambdaQueryWrapper<CompanyDingding>().eq(CompanyDingding::getCompanyId, companyId));
         Integer manageDeptId = user.getManageDeptId();
 
         HttpRespMsg ret = getMyDeptMembsData(startDate, endDate);
@@ -296,6 +300,8 @@ public class UserCorpwxTimeController {
             dataList.add((String)dataItem.get("weekDayTxt"));
             if(wxCorpInfo.getSaasSyncContact()==1){
                 dataList.add("$userName="+(String)dataItem.get("corpwxUserid")+"$");
+            }else if(dingding!=null&&dingding.getSyncContact()==1){
+                dataList.add("$userName="+(String)dataItem.get("username")+"$");
             }else{
                 dataList.add((String)dataItem.get("username"));
             }
@@ -320,7 +326,7 @@ public class UserCorpwxTimeController {
         }
         //fileName += "_人员工时统计模板"+startDate+"至"+endDate;
         fileName += MessageUtils.message("fileName.workHour",startDate,endDate);
-        return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo, fileName, allData, path);
+        return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,dingding, fileName, allData, path);
     }
 
     //导出填报工时在考勤工时的占比
@@ -330,6 +336,7 @@ public class UserCorpwxTimeController {
         User user = userMapper.selectById(token);
         Integer companyId = user.getCompanyId();
         WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", companyId));
+        CompanyDingding dingding = companyDingdingMapper.selectOne(new QueryWrapper<CompanyDingding>().eq("company_id", companyId));
         Integer manageDeptId = user.getManageDeptId();
 
         List<Map> list = new ArrayList<Map>();
@@ -375,6 +382,8 @@ public class UserCorpwxTimeController {
             dataList.add(ymonth);
             if(wxCorpInfo.getSaasSyncContact()==1){
                 dataList.add("$userName="+(String)dataItem.get("corpwxUserid")+"$");
+            }else if(dingding!=null&&dingding.getSyncContact()==1){
+                dataList.add("$userName="+(String)dataItem.get("username")+"$");
             }else{
                 dataList.add((String)dataItem.get("username"));
             }
@@ -400,7 +409,7 @@ public class UserCorpwxTimeController {
         //fileName += "_人员工时统计模板"+startDate+"至"+endDate;
         fileName = ymonth + fileName;
         fileName += "项目工时占比_" + System.currentTimeMillis();
-        return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo, fileName, allData, path);
+        return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,dingding, fileName, allData, path);
     }
     @RequestMapping("/getPunchRecordBySelf")
     public HttpRespMsg getUserPunchRecord(String date, String userId){

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

@@ -17,6 +17,7 @@ import com.management.platform.service.impl.ProjectServiceImpl;
 import com.management.platform.util.HttpRespMsg;
 import com.management.platform.util.ListUtil;
 import com.management.platform.util.MessageUtils;
+import org.hibernate.validator.constraints.pl.REGON;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.util.StringUtils;
 import org.springframework.web.bind.annotation.RequestBody;
@@ -68,6 +69,8 @@ public class UserYearleaveSettingController {
     private WxCorpInfoMapper wxCorpInfoMapper;
     @Resource
     private DepartmentService departmentService;
+    @Resource
+    private CompanyDingdingMapper companyDingdingMapper;
 
     @Value(value = "${upload.path}")
     private String path;
@@ -218,6 +221,7 @@ public class UserYearleaveSettingController {
         HttpRespMsg httpRespMsg = new HttpRespMsg();
         Integer companyId = ddLeaveQtVo.getCompanyId();
         WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id",companyId));
+        CompanyDingding dingding = companyDingdingMapper.selectOne(new QueryWrapper<CompanyDingding>().eq("company_id",companyId));
         List<String> headList = new ArrayList<>();
         List<List<String>> allList = new ArrayList<>();
         HttpRespMsg dingDingLeaveQt = getDingDingLeaveQt(ddLeaveQtVo, 1);
@@ -284,7 +288,7 @@ public class UserYearleaveSettingController {
         //String fileName = "假期剩余表_"+System.currentTimeMillis();
         String fileName = MessageUtils.message("fileName.leaveRemaining")+System.currentTimeMillis();
         try {
-            return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,fileName,allList,path);
+            return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,dingding,fileName,allList,path);
         } catch (Exception e) {
             e.printStackTrace();
         }

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

@@ -824,8 +824,8 @@ public class WeiXinCorpController {
                     corpwxJobResultMapper.insert(result);
                     ExcelExportServiceImpl.corpwxJobCenter.put(jobId, result);
                     ReportServiceImpl.corpwxJobCenter.put(jobId, result);
-                    UserServiceImpl.corpwxJobCenter.put(jobId, result);
-                    TaskServiceImpl.corpwxJobCenter.put(jobId, result);
+                    UserController.corpwxJobCenter.put(jobId, result);
+                    TaskController.corpwxJobCenter.put(jobId, result);
                 } else if ("auto_activate".equals(infoType)) {
                     //被邀请的同事自动激活使用
                     //{"xml":{"Scene":1,"InfoType":"auto_activate",

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

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

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

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

+ 8 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/TaskMapper.java

@@ -53,4 +53,12 @@ public interface TaskMapper extends BaseMapper<Task> {
     void updateEndDate(Integer id);
     @Update("update task set finish_date =null where id=#{id}")
     void updateFinishDate(Integer id);
+
+    List<Map<String,Object>>  userTaskCompleteDetail(Integer pageStart, Integer pageSize, String startDate, String endDate, String userId, Integer deptId,@Param("list") List<Integer> deptIds, Integer companyId);
+
+    Integer userTaskCompleteDetailCount(String startDate, String endDate, String userId, Integer deptId,@Param("list") List<Integer> deptIds, Integer companyId);
+
+    List<Map<String, Object>> getTaskByUserId(String startDate, String endDate, String userId, Integer pageStart, Integer pageSize);
+
+    Integer getTaskByUserIdCount(String startDate, String endDate, String userId);
 }

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

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

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

@@ -52,4 +52,10 @@ public interface DingDingService {
     String inactiveUserNotInAuthRange(String corpid);
 
     HttpRespMsg fixAttendance(Integer companyId);
+
+    String getTranslationMediaId(String fileName,CompanyDingding dingding) throws Exception;
+
+    String syncTranslation(String mediaId,String fileName,String unionId,CompanyDingding dingding) throws Exception;
+
+    String getSyncTranslationResult(String jobId,CompanyDingding dingding) throws Exception;
 }

+ 6 - 6
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ExcelExportService.java

@@ -1,5 +1,6 @@
 package com.management.platform.service;
 
+import com.management.platform.entity.CompanyDingding;
 import com.management.platform.entity.WxCorpInfo;
 import com.management.platform.util.HttpRespMsg;
 
@@ -8,11 +9,10 @@ import java.util.Map;
 
 public interface ExcelExportService {
     public void testRead(String jobId);
-    public HttpRespMsg exportGeneralExcelByTitleAndList(WxCorpInfo wxCorpInfo, String title, List<List<String>> list, String downloadPath) throws Exception;
-    public HttpRespMsg exportGeneralExcelByTitleAndList2(WxCorpInfo wxCorpInfo, String title, List<List<String>> list, String downloadPath) throws Exception;
-    public HttpRespMsg exportMultiSheetGeneralExcelByTitleAndList(WxCorpInfo wxCorpInfo,String title, List<List<String>>[] multiSheetList, String downloadPath,String[] sheetsName) throws Exception;
-    public HttpRespMsg exportTranForwx(WxCorpInfo wxCorpInfo,String title) throws Exception;
+    public HttpRespMsg exportGeneralExcelByTitleAndList(WxCorpInfo wxCorpInfo, CompanyDingding dingding, String title, List<List<String>> list, String downloadPath) throws Exception;
+    public HttpRespMsg exportGeneralExcelByTitleAndList2(WxCorpInfo wxCorpInfo, CompanyDingding dingding, String title, List<List<String>> list, String downloadPath) throws Exception;
+    public HttpRespMsg exportMultiSheetGeneralExcelByTitleAndList(WxCorpInfo wxCorpInfo, CompanyDingding dingding,String title, List<List<String>>[] multiSheetList, String downloadPath,String[] sheetsName) throws Exception;
+    public HttpRespMsg exportTranForwx(WxCorpInfo wxCorpInfo, CompanyDingding dingding,String title) throws Exception;
     void testAdd(String jobId);
-
-    HttpRespMsg exportGeneralExcelForExpense(WxCorpInfo wxCorpInfo, String fileName, List<List<String>> allList, List<Map> mapList, String path) throws Exception;
+    HttpRespMsg exportGeneralExcelForExpense(WxCorpInfo wxCorpInfo, CompanyDingding dingding, String fileName, List<List<String>> allList, List<Map> mapList, String path) throws Exception;
 }

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

@@ -35,8 +35,6 @@ public interface TaskService extends IService<Task> {
     HttpRespMsg getTaskTimeCompare(Integer projectId,Integer deptId);
     HttpRespMsg exportTaskTimeCompare(Integer projectId,Integer deptId);
 
-    HttpRespMsg exportTask(Integer projectId, Integer taskType);
-
     HttpRespMsg importTask(Integer isMultiProject, Integer projectId, Integer groupId, MultipartFile file, HttpServletRequest request) throws Exception;
 
     HttpRespMsg delete(TaskGroup item);
@@ -50,4 +48,10 @@ public interface TaskService extends IService<Task> {
     public void notifyMileStoneFinish(Integer companyId, List<Task> taskList);
 
     HttpRespMsg getExecutorPlanHour(Integer projectId);
+
+    HttpRespMsg userTaskCompleteDetail(Integer pageIndex, Integer pageSize, String startDate, String endDate, String userId, Integer deptId);
+
+    HttpRespMsg exportUserTaskCompleteDetail(String startDate, String endDate, String userId, Integer deptId);
+
+    HttpRespMsg getTaskByUserId(String startDate, String endDate, String userId, Integer pageIndex, Integer pageSize);
 }

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

@@ -54,14 +54,11 @@ public interface UserService extends IService<User> {
 
     HttpRespMsg bindWeiXin2(String code, String userId, Integer state);
 
-    HttpRespMsg exportUsers(Integer containInvalid, HttpServletRequest request);
 
     HttpRespMsg sendVcode(String mobile);
 
     HttpRespMsg pushFillReport(String ids, HttpServletRequest request, String date,Integer code);
 
-    HttpRespMsg exportMembList(boolean isFill, String ids, HttpServletRequest request, String date);
-
     HttpRespMsg getHRList(HttpServletRequest request);
 
     HttpRespMsg changeSysManager(String toUserId, Integer myRoleId, HttpServletRequest request);

+ 10 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ContractServiceImpl.java

@@ -2,6 +2,7 @@ package com.management.platform.service.impl;
 
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.management.platform.entity.*;
@@ -71,6 +72,8 @@ public class ContractServiceImpl extends ServiceImpl<ContractMapper, Contract> i
     private ContractLogMapper contractLogMapper;
     @Resource
     private InformationMapper informationMapper;
+    @Resource
+    private CompanyDingdingMapper companyDingdingMapper;
     @Value(value = "${upload.path}")
     private String path;
 
@@ -94,6 +97,7 @@ public class ContractServiceImpl extends ServiceImpl<ContractMapper, Contract> i
             String token = request.getHeader("token");
             User user = userMapper.selectById(token);
             WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", user.getCompanyId()));
+            CompanyDingding dingding = companyDingdingMapper.selectOne(new LambdaQueryWrapper<CompanyDingding>().eq(CompanyDingding::getCompanyId, user.getCompanyId()));
             List<SysRichFunction> functionContractList = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "查看全部合同");
             if(functionContractList.size() <= 0){
                 httpRespMsg.setError(MessageUtils.message("access.viewError"));
@@ -177,6 +181,8 @@ public class ContractServiceImpl extends ServiceImpl<ContractMapper, Contract> i
                             String msg = "";
                             if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                                 msg = "$userName=" + contractLog.get("operateCorpWxId") + "$" + contractLog.get("msg");
+                            }if(dingding!=null&&dingding.getSyncContact()==1){
+                                msg = "$userName=" + contractLog.get("operateName") + "$" + contractLog.get("msg");
                             }else {
                                 msg = contractLog.get("operateName") + "" + contractLog.get("msg");
                             }
@@ -226,6 +232,7 @@ public class ContractServiceImpl extends ServiceImpl<ContractMapper, Contract> i
             return httpRespMsg;
         }
         WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", user.getCompanyId()));
+        CompanyDingding dingding = companyDingdingMapper.selectOne(new QueryWrapper<CompanyDingding>().eq("company_id", user.getCompanyId()));
         HttpRespMsg contractPage = getContractPage(request, null, null, number, name, typeName, status, startDate, endDate, paymentStartDate, paymentEndDate);
         HashMap<String, Object> resultDate = (HashMap<String, Object>) contractPage.data;
         List<ContractPageVO> data = (List<ContractPageVO>)resultDate.get("data");
@@ -260,6 +267,8 @@ public class ContractServiceImpl extends ServiceImpl<ContractMapper, Contract> i
             item.add(contract.getEndDate()==null?"":contract.getEndDate()+"");
             if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                 contract.setCreatorName("$userName=" + contract.getCreatorWxCorpId() + "$");
+            }if(dingding!=null&&dingding.getSyncContact()==1){
+                contract.setCreatorName("$userName=" + contract.getCreatorName() + "$");
             }else {
                 contract.setCreatorName(contract.getCreatorName());
             }
@@ -289,7 +298,7 @@ public class ContractServiceImpl extends ServiceImpl<ContractMapper, Contract> i
         }
         String fileName = MessageUtils.message("contract.export")+System.currentTimeMillis();
         try {
-            return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,fileName,allList, path);
+            return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,dingding,fileName,allList, path);
         } catch (Exception e) {
             e.printStackTrace();
         }

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

@@ -75,6 +75,8 @@ public class DepartmentServiceImpl extends ServiceImpl<DepartmentMapper, Departm
     private ExcelExportService excelExportService;
     @Resource
     private WxCorpInfoService wxCorpInfoService;
+    @Resource
+    private CompanyDingdingMapper companyDingdingMapper;
 
     @Value("${corpId}")
     private String corpId;
@@ -670,6 +672,7 @@ public class DepartmentServiceImpl extends ServiceImpl<DepartmentMapper, Departm
             User targetUser = userMapper.selectById(request.getHeader("Token"));
             Integer companyId =targetUser.getCompanyId();
             WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", companyId));
+            CompanyDingding dingding = companyDingdingMapper.selectOne(new QueryWrapper<CompanyDingding>().eq("company_id", companyId));
             List<User> userList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", companyId));
             //当前用户管理部门
             List<Integer> deptIds=null;
@@ -812,6 +815,9 @@ public class DepartmentServiceImpl extends ServiceImpl<DepartmentMapper, Departm
                 if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                     String corpwxUserId = userList.stream().filter(ul -> ul.getId().equals(uid)).findFirst().get().getCorpwxUserid();
                     name ="$userName="+ (corpwxUserId==null?"":corpwxUserId) +"$";
+                }else if(dingding!=null&&dingding.getSyncContact()==1){
+                    String targetName = userList.stream().filter(ul -> ul.getId().equals(uid)).findFirst().get().getName();
+                    name ="$userName="+ (targetName==null?"":targetName) +"$";
                 }else {
                      name = userList.stream().filter(ul -> ul.getId().equals(uid)).findFirst().get().getName();
                 }
@@ -908,7 +914,7 @@ public class DepartmentServiceImpl extends ServiceImpl<DepartmentMapper, Departm
             //String fileName = "人员成本统计_"+System.currentTimeMillis();
             String fileName = MessageUtils.message("fileName.costStatistics",System.currentTimeMillis());
             try {
-                return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo, fileName, dataList, path);
+                return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,dingding, fileName, dataList, path);
             } catch (Exception e) {
                 e.printStackTrace();
             }
@@ -1174,6 +1180,7 @@ public class DepartmentServiceImpl extends ServiceImpl<DepartmentMapper, Departm
         try {
             Integer companyId = userMapper.selectById(request.getHeader("Token")).getCompanyId();
             WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", companyId));
+            CompanyDingding dingding = companyDingdingMapper.selectOne(new QueryWrapper<CompanyDingding>().eq("company_id", companyId));
             HttpRespMsg msg = getUserCustomDataStatistic(startDate, endDate, null, request);
             Map<String, Object> map = (Map<String, Object>) msg.data;
             List<HashMap> itemList = (List<HashMap>) map.get("list");
@@ -1194,10 +1201,14 @@ public class DepartmentServiceImpl extends ServiceImpl<DepartmentMapper, Departm
             for (Map<String, Object> membMap : itemList) {
                 List<String> membRowData = new ArrayList<String>();
                 membRowData.add(String.valueOf(seq));
-                if(wxCorpInfo.getSaasSyncContact()==1){
+                if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                     membRowData.add("$userName="+(String)membMap.get("name")+"$");
                 }else {
-                    membRowData.add((String)membMap.get("name"));
+                    if(dingding!=null&&dingding.getSyncContact()==1){
+                        membRowData.add("$userName="+(String)membMap.get("name")+"$");
+                    }else {
+                        membRowData.add((String)membMap.get("name"));
+                    }
                 }
                 membRowData.add(((Double)membMap.get("cost")).toString());
                 allList.add(membRowData);
@@ -1215,7 +1226,7 @@ public class DepartmentServiceImpl extends ServiceImpl<DepartmentMapper, Departm
             //String fileName = timeType.getCustomDataName() + "统计_"+System.currentTimeMillis();
             String fileName = MessageUtils.message("fileName.statistics",timeType.getCustomDataName(),System.currentTimeMillis());
             try {
-                return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo, fileName, allList, path);
+                return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,dingding, fileName, allList, path);
             } catch (Exception e) {
                 e.printStackTrace();
             }
@@ -1359,6 +1370,7 @@ public class DepartmentServiceImpl extends ServiceImpl<DepartmentMapper, Departm
         try {
             Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
             WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", companyId));
+            CompanyDingding dingding = companyDingdingMapper.selectOne(new QueryWrapper<CompanyDingding>().eq("company_id", companyId));
             HttpRespMsg msg = getDepartmentStatistics(null, startDate, endDate, request);
             Map<String,Object> mapData = (Map<String, Object>) msg.data;
             List<DepartmentMasterVO> costList = (List<DepartmentMasterVO>) mapData.get("costList");
@@ -1381,6 +1393,8 @@ public class DepartmentServiceImpl extends ServiceImpl<DepartmentMapper, Departm
                 List<String> item=new ArrayList<>();
                 if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                     item.add("$departmentName="+(departmentMasterVO.getCorpwxDeptid()==null?"":departmentMasterVO.getCorpwxDeptid())+"$");
+                }else if(dingding!=null&&dingding.getSyncContact()==1){
+                    item.add("$departmentName="+(departmentMasterVO.getDdDeptid()==null?"":departmentMasterVO.getDdDeptid())+"$");
                 }else {
                     item.add(departmentMasterVO.getDepartmentName());
                 }
@@ -1407,7 +1421,7 @@ public class DepartmentServiceImpl extends ServiceImpl<DepartmentMapper, Departm
             //String fileName = "部门工时统计_"+System.currentTimeMillis();
             String fileName = MessageUtils.message("fileName.depHours",System.currentTimeMillis());
             try {
-                return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo, fileName, dataList, path);
+                return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,dingding, fileName, dataList, path);
             } catch (Exception e) {
                 e.printStackTrace();
             }
@@ -1621,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

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

@@ -3,8 +3,11 @@ package com.management.platform.service.impl;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
+import com.aliyun.dingtalkcontact_1_0.Client;
 import com.aliyun.dingtalkcontact_1_0.models.GetUserHeaders;
+import com.aliyun.tea.TeaConverter;
 import com.aliyun.tea.TeaException;
+import com.aliyun.tea.TeaPair;
 import com.aliyun.teaopenapi.models.Config;
 import com.aliyun.teautil.models.RuntimeOptions;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@@ -13,13 +16,17 @@ import com.dingtalk.api.DingTalkClient;
 import com.dingtalk.api.request.*;
 import com.dingtalk.api.response.*;
 import com.management.platform.constant.Constant;
+import com.management.platform.controller.TaskController;
+import com.management.platform.controller.UserController;
 import com.management.platform.entity.*;
 import com.management.platform.entity.vo.UserVO;
 import com.management.platform.mapper.*;
 import com.management.platform.service.*;
 import com.management.platform.util.*;
 import com.taobao.api.ApiException;
+import com.taobao.api.FileItem;
 import com.taobao.api.internal.util.StringUtils;
+import com.taobao.api.internal.util.WebUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.BeanUtils;
@@ -38,6 +45,13 @@ import java.time.*;
 import java.time.format.DateTimeFormatter;
 import java.util.*;
 import java.util.stream.Collectors;
+import com.aliyun.tea.*;
+import com.aliyun.teautil.*;
+import com.aliyun.teautil.models.*;
+import com.aliyun.dingtalkcontact_1_0.*;
+import com.aliyun.dingtalkcontact_1_0.models.*;
+import com.aliyun.teaopenapi.*;
+import com.aliyun.teaopenapi.models.*;
 
 //import com.management.platform.entity.vo.LeaveQuotaNum;
 
@@ -152,6 +166,9 @@ public class DingDingServiceImpl implements DingDingService {
     @Value("${configEnv.isDev}")
     private boolean isDev;//是否是本地开发环境
 
+    @Value("${upload.path}")
+    private String path;//是否是本地开发环境
+
     public static final HashMap<String, Long> syncLog = new HashMap();
 
     @Override
@@ -1351,6 +1368,18 @@ public class DingDingServiceImpl implements DingDingService {
                                         }
                                     }
                                 }
+                            }else if(139 == bizType){
+                                JSONObject actionBizData = JSONObject.parseObject(bizItem.getString("biz_data"));
+                                String syncAction = actionBizData.getString("syncAction");
+                                if("transfer_contact_id_job_result".equals(syncAction)){
+                                    bizLogger.info("异步转译通讯录id任务完成通知");
+                                    String jobId = actionBizData.getString("jobId");
+                                    Integer status = actionBizData.getInteger("status");
+                                    ExcelExportServiceImpl.corpddJobCenter.put(jobId, status);
+                                    ReportServiceImpl.corpddJobCenter.put(jobId, status);
+                                    UserController.corpddJobCenter.put(jobId, status);
+                                    TaskController.corpddJobCenter.put(jobId, status);
+                                }
                             }
                         }
                     }
@@ -2539,6 +2568,84 @@ public class DingDingServiceImpl implements DingDingService {
         return SUITE_ACCESS_TOKEN;
     }
 
+    //上传文件获取media_id
+    @Override
+    public String getTranslationMediaId(String fileName,CompanyDingding dingding) throws Exception {
+        OapiFileUploadSingleRequest request = new OapiFileUploadSingleRequest();
+        request.setFileSize(45L);
+        request.setAgentId(String.valueOf(dingding.getAgentId()));
+        DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/file/upload/single?"+ WebUtils.buildQuery(request.getTextParams(),"utf-8"));
+        // 必须重新new一个请求
+        String media_id;
+        request = new OapiFileUploadSingleRequest();
+        request.setFile(new FileItem(path+fileName));
+        OapiFileUploadSingleResponse response = client.execute(request,getCorpAccessToken(dingding));
+        System.out.println(response.getBody());
+        JSONObject obj = JSONObject.parseObject(response.getBody());
+        if (obj.getIntValue("errcode") == 0) {
+            media_id = obj.getString("media_id");
+            return media_id;
+        }
+        return null;
+    }
+
+
+    @Override
+    public String syncTranslation(String mediaId, String fileName, String unionId,CompanyDingding dingding) throws Exception {
+        com.aliyun.dingtalkcontact_1_0.Client client = createClient();
+        TranslateFileHeaders translateFileHeaders = new TranslateFileHeaders();
+        translateFileHeaders.xAcsDingtalkAccessToken =getCorpAccessToken(dingding);
+        if(mediaId!=null){
+            java.util.Map<String, String> medias = TeaConverter.buildMap(
+                    new TeaPair(mediaId,fileName)
+            );
+            TranslateFileRequest translateFileRequest = new TranslateFileRequest()
+                    .setMedias(medias)
+                    .setUnionId(unionId);
+            try {
+                TranslateFileResponse translateFileResponse = client.translateFileWithOptions(translateFileRequest, translateFileHeaders, new RuntimeOptions());
+                TranslateFileResponseBody body = translateFileResponse.body;
+                return body.jobId;
+            } catch (TeaException err) {
+                if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
+                    // err 中含有 code 和 message 属性,可帮助开发定位问题
+                }
+            } 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 属性,可帮助开发定位问题
+                }
+
+            }
+        }
+        return null;
+    }
+
+    @Override
+    public String getSyncTranslationResult(String jobId,CompanyDingding dingding) throws Exception {
+        if(jobId!=null){
+            com.aliyun.dingtalkcontact_1_0.Client client = createClient();
+            GetTranslateFileJobResultHeaders getTranslateFileJobResultHeaders = new GetTranslateFileJobResultHeaders();
+            getTranslateFileJobResultHeaders.xAcsDingtalkAccessToken = getCorpAccessToken(dingding);
+            GetTranslateFileJobResultRequest getTranslateFileJobResultRequest = new GetTranslateFileJobResultRequest()
+                    .setJobId(jobId);
+            try {
+                GetTranslateFileJobResultResponse translateFileJobResultWithOptions = client.getTranslateFileJobResultWithOptions(getTranslateFileJobResultRequest, getTranslateFileJobResultHeaders, new RuntimeOptions());
+                GetTranslateFileJobResultResponseBody body = translateFileJobResultWithOptions.body;
+                return body.url;
+            } catch (TeaException err) {
+                if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
+                    // err 中含有 code 和 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 属性,可帮助开发定位问题
+                }
+            }
+        }
+        return null;
+    }
 
     private boolean judgeIsLeader(String userId) {
         int cnt = projectAuditorMapper.selectCount(new QueryWrapper<ProjectAuditor>().eq("auditor_id", userId));

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

@@ -1,8 +1,12 @@
 package com.management.platform.service.impl;
 
+import com.management.platform.entity.CompanyDingding;
 import com.management.platform.entity.CorpwxJobResult;
+import com.management.platform.entity.User;
 import com.management.platform.entity.WxCorpInfo;
 import com.management.platform.mapper.CorpwxJobResultMapper;
+import com.management.platform.mapper.UserMapper;
+import com.management.platform.service.DingDingService;
 import com.management.platform.service.ExcelExportService;
 import com.management.platform.service.WxCorpInfoService;
 import com.management.platform.util.ExcelUtil;
@@ -13,11 +17,13 @@ import org.apache.poi.ss.usermodel.BorderStyle;
 import org.apache.poi.ss.usermodel.CellStyle;
 import org.apache.poi.ss.usermodel.FillPatternType;
 import org.apache.poi.ss.usermodel.HorizontalAlignment;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Isolation;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
 import java.io.File;
 import java.io.FileOutputStream;
 import java.time.LocalDateTime;
@@ -29,11 +35,20 @@ import java.util.Map;
 public class ExcelExportServiceImpl implements ExcelExportService {
     //用于控制线程锁
     public static HashMap<String, CorpwxJobResult> corpwxJobCenter = new HashMap();
+    public static HashMap<String, Integer> corpddJobCenter = new HashMap();
     @Resource
     private WxCorpInfoService wxCorpInfoService;
+    @Resource
+    private DingDingService dingDingService;
+    @Resource
+    private HttpServletRequest request;
+    @Resource
+    private UserMapper userMapper;
 
     @Resource
     private CorpwxJobResultMapper corpwxJobResultMapper;
+    @Value("${upload.path}")
+    private String path;
 
     @Transactional(isolation = Isolation.READ_COMMITTED)
     public void testRead(String jobId) {
@@ -61,7 +76,7 @@ public class ExcelExportServiceImpl implements ExcelExportService {
         }
     }
 
-    public HttpRespMsg exportGeneralExcelByTitleAndList(WxCorpInfo wxCorpInfo, String title, List<List<String>> list, String downloadPath) throws Exception {
+    public HttpRespMsg exportGeneralExcelByTitleAndList(WxCorpInfo wxCorpInfo, CompanyDingding dingding, String title, List<List<String>> list, String downloadPath) throws Exception {
         HttpRespMsg httpRespMsg = new HttpRespMsg();
         if (title.contains("/")) {
             //文件名不能含有路径,得替换掉
@@ -116,13 +131,52 @@ public class ExcelExportServiceImpl implements ExcelExportService {
                 //httpRespMsg.setError("处理超时...");
                 httpRespMsg.setError(MessageUtils.message("request.outTime"));
             }
+        }else if(dingding != null && dingding.getSyncContact() == 1){
+            User user = userMapper.selectById(request.getHeader("token"));
+            String mediaId = dingDingService.getTranslationMediaId(fileUrlSuffix,dingding);
+            String jobId = dingDingService.syncTranslation(mediaId,fileUrlSuffix, user.getDingdingUnionid(),dingding);
+            System.out.println("上传待转译文件到钉钉, jobId==" + jobId);
+            int i = 0;
+            String syncTranslationResult = null;
+            /**
+             * 异步上传转译文件的任务完成时会触发回调,在DingDingController中的callback实现了对回调的处理,存储到corpddJobCenter缓存中
+             * 此处轮询查询本地数据库,检测到有任务的回调数据时继续执行查询操作
+             */
+            long t = System.currentTimeMillis();
+            while (i < 30) {
+                if (i < 10) {
+                    Thread.sleep(300);
+                } else if (i < 20){
+                    Thread.sleep(1000);
+                } else {
+                    Thread.sleep(3000);
+                }
+                System.out.println("i=="+i+", "+LocalDateTime.now());
+                Integer status = corpddJobCenter.get(jobId);
+                if (status != null) {
+                    if (status == 1) {
+                        syncTranslationResult = dingDingService.getSyncTranslationResult(jobId,dingding);
+                        corpddJobCenter.remove(jobId);
+                    }
+                    break;
+                }
+                i++;
+            }
+            if (syncTranslationResult != null) {
+                long t2 = System.currentTimeMillis();
+                System.out.println("钉钉转译文件后地址是:"+syncTranslationResult+",耗时:" + (t2 - t) + "ms");
+                httpRespMsg.data = syncTranslationResult;
+            } else {
+                //httpRespMsg.setError("处理超时...");
+                httpRespMsg.setError(MessageUtils.message("request.outTime"));
+            }
         }else {
             httpRespMsg.data = resp;
         }
         return httpRespMsg;
     }
 
-    public HttpRespMsg exportGeneralExcelForExpense(WxCorpInfo wxCorpInfo, String title, List<List<String>> list, List<Map> mapList, String downloadPath) throws Exception {
+    public HttpRespMsg exportGeneralExcelForExpense(WxCorpInfo wxCorpInfo, CompanyDingding dingding, String title, List<List<String>> list, List<Map> mapList, String downloadPath) throws Exception {
         HttpRespMsg httpRespMsg = new HttpRespMsg();
         if (title.contains("/")) {
             //文件名不能含有路径,得替换掉
@@ -164,13 +218,41 @@ public class ExcelExportServiceImpl implements ExcelExportService {
                 //httpRespMsg.setError("处理超时...");
                 httpRespMsg.setError(MessageUtils.message("request.outTime"));
             }
+        }else if(dingding != null && dingding.getSyncContact() == 1){
+            User user = userMapper.selectById(request.getHeader("token"));
+            String mediaId = dingDingService.getTranslationMediaId(fileUrlSuffix,dingding);
+            String jobId = dingDingService.syncTranslation(mediaId,fileUrlSuffix, user.getDingdingUnionid(),dingding);
+            int i = 0;
+            String syncTranslationResult = null;
+            /**
+             * 异步上传转译文件的任务完成时会触发回调,在DingDingController中的callback实现了对回调的处理,存储到corpddJobCenter缓存中
+             * 此处轮询查询本地数据库,检测到有任务的回调数据时继续执行查询操作
+             */
+            while (i < 10) {
+                Thread.sleep(300);
+                Integer status = corpddJobCenter.get(jobId);
+                if (status != null) {
+                    if (status == 1) {
+                        syncTranslationResult = dingDingService.getSyncTranslationResult(jobId,dingding);
+                        corpddJobCenter.remove(jobId);
+                    }
+                    break;
+                }
+                i++;
+            }
+            if (syncTranslationResult != null) {
+                httpRespMsg.data = syncTranslationResult;
+            } else {
+                //httpRespMsg.setError("处理超时...");
+                httpRespMsg.setError(MessageUtils.message("request.outTime"));
+            }
         }else {
             httpRespMsg.data = resp;
         }
         return httpRespMsg;
     }
 
-    public HttpRespMsg exportGeneralExcelByTitleAndList2(WxCorpInfo wxCorpInfo, String title, List<List<String>> list, String downloadPath) throws Exception {
+    public HttpRespMsg exportGeneralExcelByTitleAndList2(WxCorpInfo wxCorpInfo, CompanyDingding dingding, String title, List<List<String>> list, String downloadPath) throws Exception {
         HttpRespMsg httpRespMsg = new HttpRespMsg();
         String resp = ExcelUtil.exportGeneralExcelByTitleAndList2(title, list, downloadPath);
         if (title.contains("/")) {
@@ -212,6 +294,34 @@ public class ExcelExportServiceImpl implements ExcelExportService {
                 //httpRespMsg.setError("处理超时...");
                 httpRespMsg.setError(MessageUtils.message("request.outTime"));
             }
+        }else if(dingding != null && dingding.getSyncContact() == 1){
+            User user = userMapper.selectById(request.getHeader("token"));
+            String mediaId = dingDingService.getTranslationMediaId(fileUrlSuffix,dingding);
+            String jobId = dingDingService.syncTranslation(mediaId,fileUrlSuffix, user.getDingdingUnionid(),dingding);
+            int i = 0;
+            String syncTranslationResult = null;
+            /**
+             * 异步上传转译文件的任务完成时会触发回调,在DingDingController中的callback实现了对回调的处理,存储到corpddJobCenter缓存中
+             * 此处轮询查询本地数据库,检测到有任务的回调数据时继续执行查询操作
+             */
+            while (i < 10) {
+                Thread.sleep(300);
+                Integer status = corpddJobCenter.get(jobId);
+                if (status != null) {
+                    if (status == 1) {
+                        syncTranslationResult = dingDingService.getSyncTranslationResult(jobId,dingding);
+                        corpddJobCenter.remove(jobId);
+                    }
+                    break;
+                }
+                i++;
+            }
+            if (syncTranslationResult != null) {
+                httpRespMsg.data = syncTranslationResult;
+            } else {
+                //httpRespMsg.setError("处理超时...");
+                httpRespMsg.setError(MessageUtils.message("request.outTime"));
+            }
         }else {
             httpRespMsg.data = resp;
         }
@@ -219,7 +329,7 @@ public class ExcelExportServiceImpl implements ExcelExportService {
     }
 
 
-    public  HttpRespMsg exportMultiSheetGeneralExcelByTitleAndList(WxCorpInfo wxCorpInfo,String title, List<List<String>>[] multiSheetList, String downloadPath,String[] sheetsName) throws Exception {
+    public  HttpRespMsg exportMultiSheetGeneralExcelByTitleAndList(WxCorpInfo wxCorpInfo, CompanyDingding dingding,String title, List<List<String>>[] multiSheetList, String downloadPath,String[] sheetsName) throws Exception {
         HttpRespMsg httpRespMsg = new HttpRespMsg();
         String resp = ExcelUtil.exportMultiSheetGeneralExcelByTitleAndList(title,multiSheetList, downloadPath,sheetsName);
         if (title.contains("/")) {
@@ -261,13 +371,41 @@ public class ExcelExportServiceImpl implements ExcelExportService {
                 //httpRespMsg.setError("处理超时...");
                 httpRespMsg.setError(MessageUtils.message("request.outTime"));
             }
+        }else if(dingding != null && dingding.getSyncContact() == 1){
+            User user = userMapper.selectById(request.getHeader("token"));
+            String mediaId = dingDingService.getTranslationMediaId(fileUrlSuffix,dingding);
+            String jobId = dingDingService.syncTranslation(mediaId,fileUrlSuffix,user.getDingdingUnionid(), dingding);
+            int i = 0;
+            String syncTranslationResult = null;
+            /**
+             * 异步上传转译文件的任务完成时会触发回调,在DingDingController中的callback实现了对回调的处理,存储到corpddJobCenter缓存中
+             * 此处轮询查询本地数据库,检测到有任务的回调数据时继续执行查询操作
+             */
+            while (i < 10) {
+                Thread.sleep(300);
+                Integer status = corpddJobCenter.get(jobId);
+                if (status != null) {
+                    if (status == 1) {
+                        syncTranslationResult = dingDingService.getSyncTranslationResult(jobId,dingding);
+                        corpddJobCenter.remove(jobId);
+                    }
+                    break;
+                }
+                i++;
+            }
+            if (syncTranslationResult != null) {
+                httpRespMsg.data = syncTranslationResult;
+            } else {
+                //httpRespMsg.setError("处理超时...");
+                httpRespMsg.setError(MessageUtils.message("request.outTime"));
+            }
         }else {
             httpRespMsg.data = resp;
         }
         return httpRespMsg;
     }
 
-    public  HttpRespMsg exportTranForwx(WxCorpInfo wxCorpInfo,String title) throws Exception {
+    public  HttpRespMsg exportTranForwx(WxCorpInfo wxCorpInfo, CompanyDingding dingding,String title) throws Exception {
         HttpRespMsg httpRespMsg = new HttpRespMsg();
         if (title.contains("/")) {
             //文件名不能含有路径,得替换掉
@@ -308,6 +446,34 @@ public class ExcelExportServiceImpl implements ExcelExportService {
                 //httpRespMsg.setError("处理超时...");
                 httpRespMsg.setError(MessageUtils.message("request.outTime"));
             }
+        }else if(dingding != null && dingding.getSyncContact() == 1){
+            User user = userMapper.selectById(request.getHeader("token"));
+            String mediaId = dingDingService.getTranslationMediaId(fileUrlSuffix,dingding);
+            String jobId = dingDingService.syncTranslation(mediaId,fileUrlSuffix,user.getDingdingUnionid(), dingding);
+            int i = 0;
+            String syncTranslationResult = null;
+            /**
+             * 异步上传转译文件的任务完成时会触发回调,在DingDingController中的callback实现了对回调的处理,存储到corpddJobCenter缓存中
+             * 此处轮询查询本地数据库,检测到有任务的回调数据时继续执行查询操作
+             */
+            while (i < 10) {
+                Thread.sleep(300);
+                Integer status = corpddJobCenter.get(jobId);
+                if (status != null) {
+                    if (status == 1) {
+                        syncTranslationResult = dingDingService.getSyncTranslationResult(jobId,dingding);
+                        corpddJobCenter.remove(jobId);
+                    }
+                    break;
+                }
+                i++;
+            }
+            if (syncTranslationResult != null) {
+                httpRespMsg.data = syncTranslationResult;
+            } else {
+                //httpRespMsg.setError("处理超时...");
+                httpRespMsg.setError(MessageUtils.message("request.outTime"));
+            }
         }
         return httpRespMsg;
     }

+ 7 - 2
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ExpenseSheetServiceImpl.java

@@ -95,6 +95,8 @@ public class ExpenseSheetServiceImpl extends ServiceImpl<ExpenseSheetMapper, Exp
 
     @Resource
     private ExpenseAuditSettingMapper expenseAuditSettingMapper;
+    @Resource
+    private CompanyDingdingMapper companyDingdingMapper;
 
 
     @Override
@@ -789,7 +791,7 @@ public class ExpenseSheetServiceImpl extends ServiceImpl<ExpenseSheetMapper, Exp
         information.setUserId(owner.getId());
         information.setTime(LocalDateTime.now());
         information.setMsg("您"+(sheet.getCreateDate() == null?"":dateTimeFormatter.format(sheet.getCreateDate())) + "费用报销申请审核"+(sheet.getStatus() == 0?"已通过":"已驳回")+", 审核人:"
-                +(auditor.getCorpwxUserid() != null ? ("$userName="+auditor.getCorpwxUserid()+"$"):auditor.getName()));
+                +(auditor.getCorpwxUserid() != null ? ("$userName="+auditor.getCorpwxUserid()+"$"):auditor.getDingdingUserid()!=null?("$userName="+auditor.getDingdingUserid()+"$"):auditor.getName()));
         information.setType(3);//费用报销模块
         information.setContent(sheet.getId()+"");
         informationMapper.insert(information);
@@ -1097,6 +1099,7 @@ public class ExpenseSheetServiceImpl extends ServiceImpl<ExpenseSheetMapper, Exp
     @Override
     public HttpRespMsg exportList(ExpenseSheet sheet,Integer projectId, String startDate, String endDate) {
         WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", sheet.getCompanyId()));
+        CompanyDingding dingding = companyDingdingMapper.selectOne(new QueryWrapper<CompanyDingding>().eq("company_id", sheet.getCompanyId()));
         QueryWrapper<ExpenseSheet> queryWrapper = new QueryWrapper<ExpenseSheet>();
         queryWrapper.eq("company_id", sheet.getCompanyId()).orderByDesc("id");
         List<ExpenseMainType> mainTypes = expenseMainTypeService.list(new QueryWrapper<ExpenseMainType>().eq("company_id", sheet.getCompanyId()));
@@ -1167,6 +1170,8 @@ public class ExpenseSheetServiceImpl extends ServiceImpl<ExpenseSheetMapper, Exp
                 List<String> item=new ArrayList<>();
                 if (wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                     item.add("$userName=" + record.getOwnerName() +"$");
+                }else if (dingding!=null&&dingding.getSyncContact()==1){
+                    item.add("$userName=" + record.getOwnerName() +"$");
                 }else {
                     item.add(record.getOwnerName());
                 }
@@ -1238,7 +1243,7 @@ public class ExpenseSheetServiceImpl extends ServiceImpl<ExpenseSheetMapper, Exp
         //String fileName = "费用报销单据列表"+System.currentTimeMillis();
         String fileName = MessageUtils.message("fileName.expense")+System.currentTimeMillis();
         try {
-            return excelExportService.exportGeneralExcelForExpense(wxCorpInfo,fileName , allList,mapList, path);
+            return excelExportService.exportGeneralExcelForExpense(wxCorpInfo,dingding,fileName , allList,mapList, path);
         } catch (Exception e) {
             e.printStackTrace();
         }

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

@@ -86,6 +86,8 @@ public class FinanceServiceImpl extends ServiceImpl<FinanceMapper, Finance> impl
     UserCustomMapper userCustomMapper;
     @Resource
     WxCorpInfoService wxCorpInfoService;
+    @Resource
+    private CompanyDingdingMapper companyDingdingMapper;
 
     @Resource
     private ProjectMapper projectMapper;
@@ -625,6 +627,7 @@ public class FinanceServiceImpl extends ServiceImpl<FinanceMapper, Finance> impl
         try {
             Integer companyId = userMapper.selectById(request.getHeader("Token")).getCompanyId();
             WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", companyId));
+            CompanyDingding dingding = companyDingdingMapper.selectOne(new QueryWrapper<CompanyDingding>().eq("company_id", companyId));
             TimeType timeType = timeTypeMapper.selectById(companyId);
             boolean isSecret = timeType.getIsSecretSalary()==1?true:false;
             final List<FinanceTblcuscol> cusColList = financeTblcuscolMapper.selectList(new QueryWrapper<FinanceTblcuscol>().eq("company_id", companyId));
@@ -1197,6 +1200,8 @@ public class FinanceServiceImpl extends ServiceImpl<FinanceMapper, Finance> impl
                             BigDecimal field7 = userFinance.getCustomField7() == null? new BigDecimal(0):userFinance.getCustomField6().multiply(new BigDecimal(workingTime)).divide(userTime.get(creatorId).workingTime, 6, BigDecimal.ROUND_HALF_UP);
                             if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                                 membRowData.add("$userName="+(us.getCorpwxUserid()==null?"":us.getCorpwxUserid())+"$");
+                            }if(dingding!=null&&dingding.getSyncContact()==1){
+                                membRowData.add("$userName="+us.getName()+"$");
                             }else {
                                 membRowData.add(us.getName());
                             }
@@ -1297,6 +1302,8 @@ public class FinanceServiceImpl extends ServiceImpl<FinanceMapper, Finance> impl
                                     User us = userList.stream().filter(u->u.getId().equals(npu.getUserId())).findFirst().get();
                                     if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                                         membRowData.add("$userName="+(us.getCorpwxUserid()==null?"":us.getCorpwxUserid())+"$");
+                                    }else if(dingding!=null&&dingding.getSyncContact()==1){
+                                        membRowData.add("$userName="+npu.getName()+"$");
                                     }else {
                                         membRowData.add(npu.getName());
                                     }
@@ -1518,9 +1525,9 @@ public class FinanceServiceImpl extends ServiceImpl<FinanceMapper, Finance> impl
                             multiSheetDataList[i].add(newRow);
                         }
                     }
-                    return excelExportService.exportMultiSheetGeneralExcelByTitleAndList(wxCorpInfo,fileName , multiSheetDataList, path, sheetNameList.toArray(new String[0]));
+                    return excelExportService.exportMultiSheetGeneralExcelByTitleAndList(wxCorpInfo,dingding,fileName , multiSheetDataList, path, sheetNameList.toArray(new String[0]));
                 } else {
-                    return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,fileName , allList, path);
+                    return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,dingding,fileName , allList, path);
                 }
             } catch (Exception e) {
                 e.printStackTrace();
@@ -2052,7 +2059,7 @@ public class FinanceServiceImpl extends ServiceImpl<FinanceMapper, Finance> impl
             String fileName = MessageUtils.message("fileName.perSal")+company.getCompanyName()+yearMonth+"_"+System.currentTimeMillis();
             try {
                 //不需要转译
-                return excelExportService.exportGeneralExcelByTitleAndList(null,fileName , allList, path);
+                return excelExportService.exportGeneralExcelByTitleAndList(null,null,fileName , allList, path);
             } catch (Exception e) {
                 e.printStackTrace();
             }

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

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

+ 15 - 4
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/LeaveSheetServiceImpl.java

@@ -2,6 +2,7 @@ package com.management.platform.service.impl;
 
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -75,6 +76,8 @@ public class LeaveSheetServiceImpl extends ServiceImpl<LeaveSheetMapper, LeaveSh
     WxCorpInfoService wxCorpInfoService;
     @Resource
     InformationMapper informationMapper;
+    @Resource
+    private CompanyDingdingMapper companyDingdingMapper;
 
     @Value(value = "${upload.path}")
     private String path;
@@ -211,7 +214,7 @@ public class LeaveSheetServiceImpl extends ServiceImpl<LeaveSheetMapper, LeaveSh
         information.setUserId(owner.getId());
         information.setTime(LocalDateTime.now());
         information.setMsg("您"+applyTimeDesc + "请假申请审核"+(sheet.getStatus() == 0?"已通过":"已驳回")+", 审核人:"
-                +(auditor.getCorpwxUserid() != null ? ("$userName="+auditor.getCorpwxUserid()+"$"):auditor.getName()));
+                +(auditor.getCorpwxUserid() != null ? ("$userName="+auditor.getCorpwxUserid()+"$"):auditor.getDingdingUserid() != null ? ("$userName="+auditor.getDingdingUserid()+"$"):auditor.getName()));
         information.setType(4);
         information.setContent(sheet.getId()+"");
         informationMapper.insert(information);
@@ -223,7 +226,7 @@ public class LeaveSheetServiceImpl extends ServiceImpl<LeaveSheetMapper, LeaveSh
         information.setUserId(sheet.getAuditorId());
         information.setTime(LocalDateTime.now());
         User owner = userMapper.selectById(sheet.getOwnerId());
-        information.setMsg("请假待审核, 请假人:" + (owner.getCorpwxUserid() != null?("$userName="+owner.getCorpwxUserid()+"$"):owner.getName()));
+        information.setMsg("请假待审核, 请假人:" + (owner.getCorpwxUserid() != null?("$userName="+owner.getCorpwxUserid()+"$"):owner.getDingdingUserid() != null?("$userName="+owner.getDingdingUserid()+"$"):owner.getName()));
         information.setType(4);
         information.setContent(sheet.getId()+"");
         informationMapper.insert(information);
@@ -526,6 +529,7 @@ public class LeaveSheetServiceImpl extends ServiceImpl<LeaveSheetMapper, LeaveSh
         HttpRespMsg httpRespMsg = new HttpRespMsg();
         Integer companyId = userMapper.selectById(userId).getCompanyId();
         WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", companyId));
+        CompanyDingding dingding = companyDingdingMapper.selectOne(new LambdaQueryWrapper<CompanyDingding>().eq(CompanyDingding::getCompanyId, companyId));
         List<User> userList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", companyId).select("id","name","corpwx_userid"));
         String token = request.getHeader("TOKEN");
         User user = userMapper.selectById(token);
@@ -602,6 +606,13 @@ public class LeaveSheetServiceImpl extends ServiceImpl<LeaveSheetMapper, LeaveSh
                 }else {
                     item.add("");
                 }
+            }else if(dingding!=null&&dingding.getSyncContact()==1){
+                if (present){
+                    User us = userList.stream().filter(ul -> ul.getId().equals(leaveSheet.getOwnerId())).findFirst().get();
+                    item.add("$userName="+(us.getDingdingUserid()==null?"":us.getDingdingUserid())+"$");
+                }else {
+                    item.add("");
+                }
             }else {
                 item.add(leaveSheet.getOwnerName()==null?"":leaveSheet.getOwnerName());
             }
@@ -647,7 +658,7 @@ public class LeaveSheetServiceImpl extends ServiceImpl<LeaveSheetMapper, LeaveSh
             Optional<User> first = userList.stream().filter(u -> u.getId().equals(leaveSheet.getAuditorId())).findFirst();
             String auditorName = first.isPresent()?first.get().getName():"";
             //转译处理
-            if (wxCorpInfo != null && wxCorpInfo.getSaasSyncContact() == 1) {
+            if ((wxCorpInfo != null && wxCorpInfo.getSaasSyncContact() == 1)||(dingding != null && dingding.getSyncContact() == 1)) {
                 auditorName = "$userName="+auditorName+"$";
             }
             String statusS = "";
@@ -677,7 +688,7 @@ public class LeaveSheetServiceImpl extends ServiceImpl<LeaveSheetMapper, LeaveSh
         //String fileName = "请假信息_"+System.currentTimeMillis();
         String fileName = MessageUtils.message("fileName.leaveInfo")+System.currentTimeMillis();
         try {
-            return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,fileName , allList, path);
+            return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,dingding,fileName , allList, path);
         } catch (Exception e) {
             e.printStackTrace();
         }

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

@@ -96,6 +96,8 @@ public class ProjectApprovalServiceImpl extends ServiceImpl<ProjectApprovalMappe
     private WxCorpTemplateService wxCorpTemplateService;
     @Resource
     private ReportService reportService;
+    @Resource
+    private CompanyDingdingMapper companyDingdingMapper;
     @Value(value = "${upload.path}")
     private String path;
 
@@ -725,6 +727,7 @@ public class ProjectApprovalServiceImpl extends ServiceImpl<ProjectApprovalMappe
         String[] arr=new String[]{"正常","紧急","重要","重要且紧急","低风险","中风险","高风险"};
         Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
         WxCorpInfo wxCorpInfo = wxCorpInfoService.getOne(new LambdaQueryWrapper<WxCorpInfo>().eq(WxCorpInfo::getCompanyId, companyId));
+        CompanyDingding dingding = companyDingdingMapper.selectOne(new LambdaQueryWrapper<CompanyDingding>().eq(CompanyDingding::getCompanyId, companyId));
         titleList.add("项目编号");
         titleList.add("项目名称");
         titleList.add("项目分类");
@@ -743,7 +746,7 @@ public class ProjectApprovalServiceImpl extends ServiceImpl<ProjectApprovalMappe
             item.add(record.getProjectName());
             item.add(record.getCategoryName());
             item.add(record.getIsPublic()==0?"正式项目":"非项目");
-            if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+            if((wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1)||(dingding!=null&&dingding.getSyncContact()==1)){
                 item.add("$userName="+(record.getInchargerName()==null?"":record.getInchargerName())+"$");
             }else {
                 item.add(record.getInchargerName()==null?"":record.getInchargerName());
@@ -754,7 +757,7 @@ public class ProjectApprovalServiceImpl extends ServiceImpl<ProjectApprovalMappe
         }
         String title="立项导出_"+System.currentTimeMillis();
         try {
-            return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,title,dataList,path);
+            return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,dingding,title,dataList,path);
         } catch (Exception e) {
             e.printStackTrace();
         }

+ 178 - 43
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java

@@ -240,6 +240,8 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
     private SapProjectServiceService sapProjectServiceService;
     @Resource
     private HolidaySettingService holidaySettingService;
+    @Resource
+    private CompanyDingdingMapper companyDingdingMapper;
 
     @Value(value = "${upload.path}")
     private String path;
@@ -1575,6 +1577,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                 finalDeptIds = deptIds;
             }
             List<Map<String, Object>> membList = projectMapper.getProjectCost(companyId,startDate, endDate, curProjectId,stateKey, userIdList,finalDeptIds,filterDeptIds, true);
+            CompanyDingding dingding = companyDingdingMapper.selectOne(new LambdaQueryWrapper<CompanyDingding>().eq(CompanyDingding::getCompanyId, companyId));
             map.put("membList", membList);
             for (Map<String, Object> membMap : membList) {
                 double pTotalTime = 0;
@@ -1600,6 +1603,13 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                     }else {
                         membRowData.add((String)("$departmentName="+membMap.get("corpwxDeptId")+"$"));
                     }
+                }else if(dingding!=null&&dingding.getSyncContact()==1){
+                    membRowData.add((String)("$userName="+membMap.get("name")+"$"));
+                    if(membMap.get("departmentName").equals("未分配")){
+                        membRowData.add("未分配");
+                    }else {
+                        membRowData.add((String)("$departmentName="+membMap.get("corpDdDeptId")+"$"));
+                    }
                 }else {
                     membRowData.add((String)membMap.get("name"));
                     membRowData.add((String)membMap.get("departmentName"));
@@ -1656,6 +1666,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
             User targetUser = userMapper.selectById(request.getHeader("Token"));
             Integer companyId = targetUser.getCompanyId();
             WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", companyId));
+            CompanyDingding dingding = companyDingdingMapper.selectOne(new LambdaQueryWrapper<CompanyDingding>().eq(CompanyDingding::getCompanyId, companyId));
             Map<String, Object> resultMap = new HashMap<>();
             //当前用户管理部门
             List<Integer> deptIds=null;
@@ -1901,12 +1912,17 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                                     membRowData.add("未分配");
                                 }else {
                                     membRowData.add(departmentService.exportWxDepartment(dept,allDepartmentList));
-//                                    membRowData.add((String)("$departmentName="+membMap.get("corpwxDeptId")+"$"));
+                                }
+                            }else if(dingding!=null&&dingding.getSyncContact()==1){
+                                membRowData.add((String)("$userName="+membMap.get("name")+"$"));
+                                if(membMap.get("departmentName").equals("未分配")){
+                                    membRowData.add("未分配");
+                                }else {
+                                    membRowData.add(departmentService.exportDdDepartment(dept,allDepartmentList));
                                 }
                             }else {
                                 membRowData.add((String)membMap.get("name"));
                                 membRowData.add(departmentService.getSupDepartment(dept,allDepartmentList));
-//                                membRowData.add((String)membMap.get("departmentName"));
                             }
                             String creatorId = (String)membMap.get("creatorId");
                             User us = userList.stream().filter(u->u.getId().equals(creatorId)).findFirst().get();
@@ -2061,6 +2077,13 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                         }else {
                             membRowData.add("");
                         }
+                    }else if(dingding!=null&&dingding.getSyncContact()==1){
+                        membRowData.add((String)("$userName="+user.getName()+"$"));
+                        if(first.isPresent()){
+                            membRowData.add((String)("$departmentName="+first.get().getDdDeptid()+"$"));
+                        }else {
+                            membRowData.add("");
+                        }
                     }else {
                         membRowData.add(user.getName());
                         if(first.isPresent()){
@@ -2174,7 +2197,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                 fileName = MessageUtils.message("fileName.projectCost")+System.currentTimeMillis();
             }
 
-            return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,fileName , allList, path);
+            return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,dingding,fileName , allList, path);
         } catch (NullPointerException e) {
             e.printStackTrace();
             //httpRespMsg.setError("验证失败");
@@ -2743,6 +2766,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         User user = userMapper.selectById(request.getHeader("Token"));
         Integer companyId = user.getCompanyId();
         WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", companyId));
+        CompanyDingding dingding = companyDingdingMapper.selectOne(new LambdaQueryWrapper<CompanyDingding>().eq(CompanyDingding::getCompanyId, companyId));
         //判断用户的角色,如果是管理员和负责人,查看全部的。如果是普通员工,只能是看到参与的项目
         QueryWrapper<Project> queryWrapper = new QueryWrapper<Project>().eq("company_id", companyId);
         DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd");
@@ -2768,6 +2792,8 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                 User incharger = first.get();
                 if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                     data.add("$userName="+incharger.getCorpwxUserid()+"$");
+                }if(dingding!=null&&dingding.getSyncContact()==1){
+                    data.add("$userName="+incharger.getDingdingUserid()+"$");
                 }else {
                     data.add(incharger.getName());
                 }
@@ -2792,7 +2818,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         //String fileName = "项目报表_"+System.currentTimeMillis();
         String fileName = MessageUtils.message("fileName.projectReport")+System.currentTimeMillis();
         try {
-            return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,fileName, exportList, path);
+            return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,dingding,fileName, exportList, path);
         } catch (Exception e) {
             e.printStackTrace();
         }
@@ -2856,6 +2882,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         User user = userMapper.selectById(request.getHeader("Token"));
         Integer companyId = user.getCompanyId();
         WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", companyId));
+        CompanyDingding dingding = companyDingdingMapper.selectOne(new LambdaQueryWrapper<CompanyDingding>().eq(CompanyDingding::getCompanyId, companyId));
         List<User> userList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", companyId));
         QueryWrapper<Project> queryWrapper = new QueryWrapper<Project>().eq("company_id", companyId);
         DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd");
@@ -2916,7 +2943,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                 data.add(task.get("group_real_hours") == null?"":task.get("group_real_hours").toString());
             }
             data.add(task.get("name") != null?task.get("name").toString():"");
-            if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+            if((wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1)||(dingding!=null&&dingding.getSyncContact()==1)){
                 String userName = "";
                 if(task.get("executor_id") != null){
                     String[] executorIds = task.get("executor_id").toString().split(",");
@@ -2924,7 +2951,11 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                         String executorId = executorIds[i];
                         Optional<User> first = userList.stream().filter(ul -> ul.getId().equals(executorId)).findFirst();
                         if(first.isPresent()){
-                            userName += "$userName="+(first.get().getCorpwxUserid() == null?"":first.get().getCorpwxUserid())+"$";
+                            if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                                userName += "$userName="+(first.get().getCorpwxUserid() == null?"":first.get().getCorpwxUserid())+"$";
+                            }else if(dingding!=null&&dingding.getSyncContact()==1){
+                                userName += "$userName="+(first.get().getDingdingUserid() == null?"":first.get().getDingdingUserid())+"$";
+                            }
                             if (i < executorIds.length - 1){
                                 userName += ",";
                             }
@@ -2945,7 +2976,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         //String fileName = "项目任务报表_"+System.currentTimeMillis();
         String fileName = MessageUtils.message("fileName.projectTaskReport")+System.currentTimeMillis();
         try {
-            return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,fileName, exportList, path);
+            return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,dingding,fileName, exportList, path);
         } catch (Exception e) {
             e.printStackTrace();
         }
@@ -2959,6 +2990,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         User user = userMapper.selectById(request.getHeader("Token"));
         Integer companyId = user.getCompanyId();
         WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", companyId));
+        CompanyDingding dingding = companyDingdingMapper.selectOne(new QueryWrapper<CompanyDingding>().eq("company_id", companyId));
 
 
         //该公司下的allday
@@ -3055,7 +3087,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         //String fileName = "项目任务报表_"+System.currentTimeMillis();
         String fileName = "预估工时表"+System.currentTimeMillis();
         try {
-            return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,fileName, exportList, path);
+            return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,dingding,fileName, exportList, path);
         } catch (Exception e) {
             e.printStackTrace();
             httpRespMsg.setError(e.getMessage());
@@ -3144,6 +3176,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         User user = userMapper.selectById(request.getHeader("Token"));
         Integer companyId = user.getCompanyId();
         WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", companyId));
+        CompanyDingding dingding = companyDingdingMapper.selectOne(new QueryWrapper<CompanyDingding>().eq("company_id", companyId));
         List<Project> projectAllList = projectMapper.selectList(new QueryWrapper<Project>().eq("company_id", companyId));
         List<SysRichFunction> functionAllList = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "全部项目任务报表");
         List<SysRichFunction> functionInchargeList = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "负责项目任务报表");
@@ -3209,7 +3242,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         //String fileName = "项目成本报表_"+System.currentTimeMillis();
         String fileName = MessageUtils.message("fileName.projectCostReport")+System.currentTimeMillis();
         try {
-            return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,fileName, exportList, path);
+            return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,dingding,fileName, exportList, path);
         } catch (Exception e) {
             e.printStackTrace();
         }
@@ -3297,6 +3330,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         Integer companyId = user.getCompanyId();
         Company company = companyMapper.selectById(companyId);
         WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", companyId));
+        CompanyDingding dingding = companyDingdingMapper.selectOne(new QueryWrapper<CompanyDingding>().eq("company_id", companyId));
         List<Project> projectAllList = projectMapper.selectList(new QueryWrapper<Project>().eq("company_id", companyId));
         List<SysRichFunction> functionAllList = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "全部项目任务报表");
         List<SysRichFunction> functionInchargeList = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "负责项目任务报表");
@@ -3397,7 +3431,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         //String fileName = "项目收支平衡报表(利润表)_"+System.currentTimeMillis();
         String fileName = MessageUtils.message("fileName.profitSta")+System.currentTimeMillis();
         try {
-            return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,fileName, exportList, path);
+            return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,dingding,fileName, exportList, path);
         } catch (Exception e) {
             e.printStackTrace();
         }
@@ -3412,6 +3446,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         User user = userMapper.selectById(request.getHeader("Token"));
         Integer companyId = user.getCompanyId();
         WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", companyId));
+        CompanyDingding dingding = companyDingdingMapper.selectOne(new QueryWrapper<CompanyDingding>().eq("company_id", companyId));
         List<CustomerProject> projectList = projectMapper.getCustomerProjectInAndOut(companyId, null, null,null,null);
         List<List<String>> exportList = new ArrayList<>();
         //String[] titles = {"客户名称", "相关项目", "合同金额", "人工成本", "一般费用", "差旅费用","外包费用", "总费用", "利润", "利润率"};
@@ -3470,7 +3505,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         //String fileName = "客户项目利润报表_"+System.currentTimeMillis();
         String fileName = MessageUtils.message("fileName.cusPro")+System.currentTimeMillis();
         try {
-            return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,fileName, exportList, path);
+            return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,dingding,fileName, exportList, path);
         } catch (Exception e) {
             e.printStackTrace();
         }
@@ -4014,7 +4049,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         //String fileName = "项目阶段工时报表_"+System.currentTimeMillis();
         String fileName = MessageUtils.message("fileName.ProPeriodWork")+System.currentTimeMillis();
         try {
-            return excelExportService.exportGeneralExcelByTitleAndList2(null,fileName, dataList, path);
+            return excelExportService.exportGeneralExcelByTitleAndList2(null,null,fileName, dataList, path);
         } catch (Exception e) {
             e.printStackTrace();
         }
@@ -4094,6 +4129,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
             String token = request.getHeader("TOKEN");
             User user = userMapper.selectById(token);
             WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", user.getCompanyId()));
+            CompanyDingding dingding = companyDingdingMapper.selectOne(new QueryWrapper<CompanyDingding>().eq("company_id",user.getCompanyId()));
             TimeType timeType = timeTypeMapper.selectById(user.getCompanyId());
             List<SysRichFunction> functionAllList = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "全公司加班情况");
             List<SysRichFunction> functionDeptList = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "负责部门加班情况");
@@ -4169,6 +4205,10 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                     rowData.add("$userName="+(map.get("corpwxUserId")==null?"":map.get("corpwxUserId"))+"$");
                     rowData.add(String.valueOf(StringUtils.isEmpty(map.get("jobNumber"))?"":map.get("jobNumber")));
                     rowData.add("$departmentName="+(map.get("corpwxDeptId")==null?"":map.get("corpwxDeptId"))+"$");
+                }else if(dingding!=null&&dingding.getSyncContact()==1){
+                    rowData.add("$userName="+(String)map.get("username")+"$");
+                    rowData.add(String.valueOf(StringUtils.isEmpty(map.get("jobNumber"))?"":map.get("jobNumber")));
+                    rowData.add("$departmentName="+rowData.add((String)map.get("departmentName"))+"$");
                 }else {
                     rowData.add((String)map.get("username"));
                     rowData.add(String.valueOf(StringUtils.isEmpty(map.get("jobNumber"))?"":map.get("jobNumber")));
@@ -4311,6 +4351,8 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                 rowData.add(""+seq);
                 if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                     rowData.add("$userName="+(map.get("corpwxUserId")==null?"":map.get("corpwxUserId"))+"$");
+                }else if(dingding!=null&&dingding.getSyncContact()==1){
+                    rowData.add("$userName="+(String)map.get("username")+"$");
                 }else {
                     rowData.add((String)map.get("username"));
                 }
@@ -4345,7 +4387,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
             sheetNames[1] = MessageUtils.message("Statistics.ByPro");
             sheetNames[2] = MessageUtils.message("Statistics.ByPeople");
             try {
-                return excelExportService.exportMultiSheetGeneralExcelByTitleAndList(wxCorpInfo,fileName , totalList, path, sheetNames);
+                return excelExportService.exportMultiSheetGeneralExcelByTitleAndList(wxCorpInfo,dingding,fileName , totalList, path, sheetNames);
             } catch (Exception e) {
                 e.printStackTrace();
             }
@@ -6394,6 +6436,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         List<String> nameList= (List<String>) resultMap.get("nameList");
         Company company = companyMapper.selectById(user.getCompanyId());
         WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", company.getId()));
+        CompanyDingding dingding = companyDingdingMapper.selectOne(new QueryWrapper<CompanyDingding>().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());
         TimeType timeType = timeTypeMapper.selectById(user.getCompanyId());
@@ -6517,10 +6560,14 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
             //rowData.add(("1".equals(projectVO.getIsPublic())?"是":"否"));
             rowData.add(("1".equals(projectVO.getIsPublic())?MessageUtils.message("excel.yes"):MessageUtils.message("excel.no")));
             rowData.add(projectVO.getProjectName());
-            if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+            if((wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1)||(dingding!=null&&dingding.getSyncContact()==1)){
                 if(projectVO.getInchargerId()!=null){
                     User us = userList.stream().filter(ul -> ul.getId().equals(projectVO.getInchargerId())).findFirst().get();
-                    rowData.add("$userName="+us.getCorpwxUserid()+"$");
+                    if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                        rowData.add("$userName="+us.getCorpwxUserid()+"$");
+                    }else if(dingding!=null&&dingding.getSyncContact()==1){
+                        rowData.add("$userName="+us.getDingdingUserid()+"$");
+                    }
                 }else {
                     rowData.add("");
                 }
@@ -6536,6 +6583,12 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                     }else {
                         names+="$userName="+(participator.get(i).getCorpwxUserId())+"$"+",";
                     }
+                }else if(dingding!=null&&dingding.getSyncContact()==1){
+                    if(i==participator.size()-1){
+                        names+="$userName="+(participator.get(i).getName())+"$";
+                    }else {
+                        names+="$userName="+(participator.get(i).getName())+"$"+",";
+                    }
                 }else {
                     if(i==participator.size()-1){
                         names+=participator.get(i).getName();
@@ -6549,10 +6602,14 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
             rowData.add(start==null?"":sdf.format(start));
             LocalDate end = projectVO.getPlanEndDate();
             rowData.add(end==null?"":sdf.format(end));
-            if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+            if((wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1)||(dingding!=null&&dingding.getSyncContact()==1)){
                 Optional<User> first = userList.stream().filter(ul -> ul.getId().equals(projectVO.getCreatorId())).findFirst();
                 if(first.isPresent()){
-                    rowData.add("$userName="+(first.get().getCorpwxUserid()==null?"":first.get().getCorpwxUserid())+"$");
+                    if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                        rowData.add("$userName="+(first.get().getCorpwxUserid()==null?"":first.get().getCorpwxUserid())+"$");
+                    }else if(dingding!=null&&dingding.getSyncContact()==1){
+                        rowData.add("$userName="+(first.get().getDingdingUserid()==null?"":first.get().getDingdingUserid())+"$");
+                    }
                 }else {
                     rowData.add("");
                 }
@@ -6695,7 +6752,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         //String fileName = "项目导出_"+company.getCompanyName()+System.currentTimeMillis();
         String fileName = MessageUtils.message("fileName.proExport")+company.getCompanyName()+System.currentTimeMillis();
         try {
-            return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,fileName,allList,path);
+            return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,dingding,fileName,allList,path);
         } catch (Exception e) {
             e.printStackTrace();
         }
@@ -6707,6 +6764,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         String token = request.getHeader("TOKEN");
         User user = userMapper.selectById(token);
         WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", user.getCompanyId()));
+        CompanyDingding dingding = companyDingdingMapper.selectOne(new 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()));
         String  projectCategorySub=null;
@@ -6799,7 +6857,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         //String fileName = "项目分组_"+System.currentTimeMillis();
         String fileName = MessageUtils.message("fileName.proGroup")+System.currentTimeMillis();
         try {
-            return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,fileName , allList, path);
+            return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,dingding,fileName , allList, path);
         } catch (Exception e) {
             e.printStackTrace();
         }
@@ -6845,6 +6903,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         try {
             Integer companyId = userMapper.selectById(request.getHeader("Token")).getCompanyId();
             WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", companyId));
+            CompanyDingding dingding = companyDingdingMapper.selectOne(new QueryWrapper<CompanyDingding>().eq("company_id", companyId));
             List<User> userList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", companyId));
             TimeType timeType = timeTypeMapper.selectById(companyId);
             List<String> headList = new ArrayList<String>();
@@ -6893,6 +6952,14 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                     }
                     String s = String.valueOf(membMap.get("corpwxDeptId") == null ? "" : membMap.get("corpwxDeptId"));
                     membRowData.add("$departmentName=" + s + "$");
+                }else if(dingding!=null&&dingding.getSyncContact()==1){
+                    Optional<User> first = userList.stream().filter(ul -> ul.getId().equals(membMap.get("creatorId"))).findFirst();
+                    if(first.isPresent()){
+                        membRowData.add("$userName="+first.get().getDingdingUserid()+"$");
+                    }else {
+                        membRowData.add("");
+                    }
+                    membRowData.add("$departmentName=" + (String)membMap.get("departmentName") + "$");
                 }else {
                     membRowData.add((String)membMap.get("name"));
                     membRowData.add((String)membMap.get("departmentName"));
@@ -6936,7 +7003,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
             //String fileName = timeType.getCustomDataName() + "统计_"+System.currentTimeMillis();
             String fileName = timeType.getCustomDataName() + MessageUtils.message("Statistics.tj")+"_"+System.currentTimeMillis();
             try {
-                return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,fileName , allList, path);
+                return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,dingding,fileName , allList, path);
             } catch (Exception e) {
                 e.printStackTrace();
             }
@@ -7243,6 +7310,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         User user = userMapper.selectById(request.getHeader("Token"));
         Integer companyId = user.getCompanyId();
         WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", companyId));
+        CompanyDingding dingding = companyDingdingMapper.selectOne(new QueryWrapper<CompanyDingding>().eq("company_id", companyId));
         boolean viewAll = sysFunctionService.hasPriviledge(user.getRoleId(), "全部工时成本预警表");
         boolean incharger = sysFunctionService.hasPriviledge(user.getRoleId(), "负责项目工时成本预警表");
         List<HashMap> projectList=new ArrayList();
@@ -7348,7 +7416,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         //String fileName = "工时成本预警表_"+System.currentTimeMillis();
         String fileName = MessageUtils.message("fileName.hourCostAlert")+System.currentTimeMillis();
         try {
-            return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,fileName, exportList, path);
+            return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,dingding,fileName, exportList, path);
         } catch (Exception e) {
             e.printStackTrace();
         }
@@ -7558,6 +7626,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
             User targetUser = userMapper.selectById(request.getHeader("Token"));
             Integer companyId =targetUser.getCompanyId();
             WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", companyId));
+            CompanyDingding dingding = companyDingdingMapper.selectOne(new QueryWrapper<CompanyDingding>().eq("company_id", companyId));
             Map<String, Object> resultMap = new HashMap<>();
             //当前用户管理部门
             List<Integer> deptIds=null;
@@ -7726,6 +7795,8 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                     List<String> membRowData=new ArrayList<>();
                     if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                         membRowData.add("$userName"+(user.getCorpwxUserid()==null?"":user.getCorpwxUserid())+"$");
+                    }else if(dingding!=null&&dingding.getSyncContact()==1){
+                        membRowData.add("$userName"+(user.getName()==null?"":user.getName())+"$");
                     }else {
                         membRowData.add(user.getName());
                     }
@@ -7784,7 +7855,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
             //String fileName = "项目分类工时成本统计_"+System.currentTimeMillis();
             String fileName = MessageUtils.message("fileName.proClassLaborCost")+System.currentTimeMillis();
             try {
-                return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,fileName , allList, path);
+                return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,dingding,fileName , allList, path);
             } catch (Exception e) {
                 e.printStackTrace();
             }
@@ -8022,6 +8093,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         String token = request.getHeader("TOKEN");
         User user = userMapper.selectById(token);
         WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", user.getCompanyId()));
+        CompanyDingding dingding = companyDingdingMapper.selectOne(new QueryWrapper<CompanyDingding>().eq("company_id", user.getCompanyId()));
         HttpRespMsg userWorkingTimeList = getUserWorkingTimeList(userId,projectId,startDate, endDate, null,null,request,departmentId);
         HashMap result = (HashMap) userWorkingTimeList.data;
         List<Map<String, Object>> resultList = (List<Map<String, Object>>) result.get("result");
@@ -8090,7 +8162,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         //String fileName = "人员工时分配统计_"+System.currentTimeMillis();
         String fileName = MessageUtils.message("fileName.perHoursAllSta")+System.currentTimeMillis();
         try {
-            return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,fileName , dataList, path);
+            return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,dingding,fileName , dataList, path);
         } catch (Exception e) {
             e.printStackTrace();
         }
@@ -8450,6 +8522,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         HttpRespMsg httpRespMsg=new HttpRespMsg();
         Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
         WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", companyId));
+        CompanyDingding dingding = companyDingdingMapper.selectOne(new QueryWrapper<CompanyDingding>().eq("company_id", companyId));
         HttpRespMsg msg = getUserReportTimelinessRate(request, startDate, endDate, null, null, null, null);
         HashMap map= (HashMap) msg.data;
         List<TimelinessRateVO> list = (List<TimelinessRateVO>) map.get("list");
@@ -8462,12 +8535,16 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
             List<String> item=new ArrayList<>();
             if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                 item.add("$userName="+(timelinessRateVO.getCorpwxUserId()==null?"":timelinessRateVO.getCorpwxUserId())+"$");
+            }else if(dingding!=null&&dingding.getSyncContact()==1){
+                item.add("$userName="+timelinessRateVO.getUserName()+"$");
             }else {
                 item.add(timelinessRateVO.getUserName());
             }
             item.add(timelinessRateVO.getJobNumber());
             if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                 item.add("$departmentName=" + (timelinessRateVO.getCorpwxDeptId()==null?"":timelinessRateVO.getCorpwxDeptId()) + "$");
+            }else if(dingding!=null&&dingding.getSyncContact()==1){
+                item.add("$departmentName=" + (timelinessRateVO.getCorpDdDeptId()==null?"":timelinessRateVO.getCorpDdDeptId()) + "$");
             }else {
                 item.add(timelinessRateVO.getDepartmentName());
             }
@@ -8479,7 +8556,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         //String fileName = "人员填报及时率统计_"+System.currentTimeMillis();
         String fileName = MessageUtils.message("fileName.timePerFill")+System.currentTimeMillis();
         try {
-            return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,fileName , dataList, path);
+            return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,dingding,fileName , dataList, path);
         } catch (Exception e) {
             e.printStackTrace();
         }
@@ -8550,6 +8627,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         HttpRespMsg msg = getWaitingReviewList(request, stateKey, userId, null, null,startDate,endDate,null);
         Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
         WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", companyId));
+        CompanyDingding dingding = companyDingdingMapper.selectOne(new QueryWrapper<CompanyDingding>().eq("company_id", companyId));
         List<Department> allDeptList = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id", companyId));
         HashMap resultmap= (HashMap) msg.data;
         List<Map<String,Object>> list= (List<Map<String, Object>>) resultmap.get("result");
@@ -8584,7 +8662,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         //String fileName = "人员待审核统计_"+System.currentTimeMillis();
         String fileName = MessageUtils.message("fileName.perReviewed")+System.currentTimeMillis();
         try {
-            return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,fileName , dataList, path);
+            return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,dingding,fileName , dataList, path);
         } catch (Exception e) {
             e.printStackTrace();
         }
@@ -8704,6 +8782,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         HttpRespMsg msg=new HttpRespMsg();
         Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
         WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", companyId));
+        CompanyDingding dingding = companyDingdingMapper.selectOne(new QueryWrapper<CompanyDingding>().eq("company_id", companyId));
         HttpRespMsg httpRespMsg = getUserWorkingTimeStatic(startDate, endDate, null, null, request, userId, departmentId);
         Map<String,Object> data = (Map<String, Object>) httpRespMsg.data;
         List<Map<String,Object>> resultList= (List<Map<String, Object>>) data.get("result");
@@ -8728,6 +8807,10 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                 item.add("$userName="+(map.get("corpwxUserId")==null?"":map.get("corpwxUserId"))+"$");
                 item.add(String.valueOf(StringUtils.isEmpty(map.get("jobNumber"))?"":map.get("jobNumber")));
                 item.add("$departmentName="+(map.get("corpwxDeptId")==null?"":map.get("corpwxDeptId"))+"$");
+            }else if(dingding!=null&&dingding.getSyncContact()==1){
+                item.add("$userName="+((String) map.get("name"))+"$");
+                item.add(String.valueOf(StringUtils.isEmpty(map.get("jobNumber"))?"":map.get("jobNumber")));
+                item.add("$departmentName="+((String) map.get("departmentName")==null?"":(String) map.get("departmentName"))+"$");
             }else {
                 item.add((String) map.get("name"));
                 item.add(String.valueOf(StringUtils.isEmpty(map.get("jobNumber"))?"":map.get("jobNumber")));
@@ -8742,7 +8825,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         //String fileName = "人员工时统计_"+System.currentTimeMillis();
         String fileName = MessageUtils.message("fileName.perHoursSta")+System.currentTimeMillis();
         try {
-            return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,fileName , dataList, path);
+            return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,dingding,fileName , dataList, path);
         } catch (Exception e) {
             e.printStackTrace();
         }
@@ -9245,6 +9328,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         HttpRespMsg projectBaseCost = getProjectBaseCost(null, request, null, null);
         Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
         WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", companyId));
+        CompanyDingding dingding = companyDingdingMapper.selectOne(new QueryWrapper<CompanyDingding>().eq("company_id", companyId));
         HashMap map= (HashMap) projectBaseCost.data;
         List<Project> resultProjectList= (List<Project>) map.get("result");
         List<List<String>> dataList=new ArrayList<>();
@@ -9276,7 +9360,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         //String fileName = "项目成本基线表_"+System.currentTimeMillis();
         String fileName = MessageUtils.message("Statistics.ProjectCostBase")+System.currentTimeMillis();
         try {
-            return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,fileName , dataList, path);
+            return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,dingding,fileName , dataList, path);
         } catch (Exception e) {
             e.printStackTrace();
         }
@@ -9348,6 +9432,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         HttpRespMsg httpRespMsg=new HttpRespMsg();
         User targetUser = userMapper.selectById(request.getHeader("token"));
         WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", targetUser.getCompanyId()));
+        CompanyDingding dingding = companyDingdingMapper.selectOne(new QueryWrapper<CompanyDingding>().eq("company_id", targetUser.getCompanyId()));
         List<SysRichFunction> functionTimeList = sysFunctionMapper.getRoleFunctions(targetUser.getRoleId(), "查看工时统计");
         List<SysRichFunction> functionCostList = sysFunctionMapper.getRoleFunctions(targetUser.getRoleId(), "查看成本统计");
         HttpRespMsg msg = getTimeCostByUserCustom(startDate, endDate, null, customId, request, fieldName);
@@ -9381,7 +9466,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         //String fileName = userCustom.getName()+"工时成本统计_"+System.currentTimeMillis();
         String fileName = userCustom.getName()+MessageUtils.message("fileName.hourCost")+System.currentTimeMillis();
         try {
-            return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,fileName , dataList, path);
+            return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,dingding,fileName , dataList, path);
         } catch (Exception e) {
             e.printStackTrace();
         }
@@ -10180,6 +10265,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
         LocalDate time = LocalDate.parse(month, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
         WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", companyId));
+        CompanyDingding dingding = companyDingdingMapper.selectOne(new QueryWrapper<CompanyDingding>().eq("company_id", companyId));
         HttpRespMsg httpRespMsg = getEmpMonthHours(null, null,month,departmentId,userId,whether,request);
         Map<String,Object> data = (Map<String, Object>) httpRespMsg.data;
         List<Map<String,Object>> resultList= (List<Map<String, Object>>) data.get("result");
@@ -10205,6 +10291,9 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
             if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                 item.add("$userName=" + map.get("name") +"$");
                 item.add("$departmentName="+(map.get("corpwxDeptId")==null?"":map.get("corpwxDeptId"))+"$");
+            }else if(dingding!=null&&dingding.getSyncContact()==1){
+                item.add("$userName=" + map.get("name") +"$");
+                item.add("$departmentName="+((String) map.get("departmentName")==null?"":(String) map.get("departmentName"))+"$");
             }else {
                 item.add((String) map.get("name"));
                 item.add((String) map.get("departmentName")==null?"":(String) map.get("departmentName"));
@@ -10226,7 +10315,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         //String fileName = "人员"+time.getMonthValue()+"月度工时表"+System.currentTimeMillis();
         String fileName = MessageUtils.message("entry.personnel") +time.getMonthValue()+MessageUtils.message("fileName.monthWork")+System.currentTimeMillis();
         try {
-            return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,fileName , dataList, path);
+            return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,dingding,fileName , dataList, path);
         } catch (Exception e) {
             e.printStackTrace();
         }
@@ -10369,6 +10458,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         String token = request.getHeader("token");
         User user = userMapper.selectById(token);
         WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", user.getCompanyId()));
+        CompanyDingding dingding = companyDingdingMapper.selectOne(new QueryWrapper<CompanyDingding>().eq("company_id", user.getCompanyId()));
         HttpRespMsg httpRespMsg = deptPartInProjects(null, null, month, departmentId, request);
         Map<String, Object> data = (Map<String, Object>) (Map<String, Object>) httpRespMsg.data;
         List<Map<String, Object>> resultList = (List<Map<String, Object>>) data.get("resultList");
@@ -10404,7 +10494,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         //String fileName = "部门参与项目情况表"+System.currentTimeMillis();
         String fileName = MessageUtils.message("fileName.deptJoinPro")+System.currentTimeMillis();
         try {
-            return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,fileName , dataList, path);
+            return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,dingding,fileName , dataList, path);
         } catch (Exception e) {
             e.printStackTrace();
         }
@@ -10418,6 +10508,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
         List<User> userList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", companyId));
         WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", companyId));
+        CompanyDingding dingding = companyDingdingMapper.selectOne(new QueryWrapper<CompanyDingding>().eq("company_id", companyId));
         String startDate=null;
         String endDate=null;
         LocalDate date1;
@@ -10501,12 +10592,16 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
             List<String> item=new ArrayList<>();
             if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                 item.add("$userName="+(timelinessRateVO.getCorpwxUserId()==null?"":timelinessRateVO.getCorpwxUserId())+"$");
+            }else if(dingding!=null&&dingding.getSyncContact()==1){
+                item.add("$userName="+(timelinessRateVO.getUserName())+"$");
             }else {
                 item.add(timelinessRateVO.getUserName());
             }
             item.add(timelinessRateVO.getJobNumber());
             if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                 item.add("$departmentName="+(String.valueOf(timelinessRateVO.getCorpwxDeptId()==null?"":timelinessRateVO.getCorpwxDeptId()))+"$");
+            }else if(dingding!=null&&dingding.getSyncContact()==1){
+                item.add("$departmentName="+(timelinessRateVO.getDepartmentName())+"$");
             }else {
                 item.add(timelinessRateVO.getDepartmentName());
             }
@@ -10531,7 +10626,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         //String fileName = year+"人员填报及时率统计_"+System.currentTimeMillis();
         String fileName = year+"_"+quarter+MessageUtils.message("fileName.quarter")+MessageUtils.message("fileName.timePerFill")+System.currentTimeMillis();
         try {
-            return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,fileName , dataList, path);
+            return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,dingding,fileName , dataList, path);
         } catch (Exception e) {
             e.printStackTrace();
         }
@@ -11154,6 +11249,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
             User targetUser = userMapper.selectById(request.getHeader("Token"));
             Integer companyId =targetUser.getCompanyId();
             WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", companyId));
+            CompanyDingding dingding = companyDingdingMapper.selectOne(new QueryWrapper<CompanyDingding>().eq("company_id", companyId));
             Map<String, Object> resultMap = new HashMap<>();
             //当前用户管理部门
             List<Integer> deptIds=null;
@@ -11288,6 +11384,8 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
 //                        }else {
 //                            membRowData.add((String)("$departmentName="+membMap.get("corpwxDeptId")+"$"));
 //                        }
+                    }else if(dingding!=null&&dingding.getSyncContact()==1){
+                        membRowData.add(("$userName="+(String)membMap.get("name")+"$"));
                     }else {
                         membRowData.add((String)membMap.get("name"));
 //                        membRowData.add((String)membMap.get("departmentName"));
@@ -11321,7 +11419,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
             //生成excel文件导出
             //String fileName = "维度成本工时统计_"+System.currentTimeMillis();
             String fileName = timeType.getCustomDegreeName() + MessageUtils.message("fileName.degreeCost")+System.currentTimeMillis();
-            return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,fileName , allList, path);
+            return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,dingding,fileName , allList, path);
         } catch (NullPointerException e) {
             e.printStackTrace();
             //httpRespMsg.setError("验证失败");
@@ -11472,6 +11570,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         HttpRespMsg httpRespMsg = new HttpRespMsg();
         User user = userMapper.selectById(request.getHeader("token"));
         WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", user.getCompanyId()));
+        CompanyDingding dingding = companyDingdingMapper.selectOne(new QueryWrapper<CompanyDingding>().eq("company_id", user.getCompanyId()));
         List<UserCustom> userCustoms = userCustomMapper.selectList(new QueryWrapper<UserCustom>().eq("company_id", user.getCompanyId()).orderByAsc("id"));
         String customName = "";
         if (userCustoms.size() != 0){
@@ -11543,6 +11642,9 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                     if (wxCorpInfo != null && wxCorpInfo.getSaasSyncContact().equals(1)){
                         item.add("$userName="+map.get("wxUserId") + "$");
                         item.add("$departmentName="+map.get("wxdeptId") + "$");
+                    }else if (dingding != null && dingding.getSyncContact().equals(1)){
+                        item.add("$userName="+map.get("userName") + "$");
+                        item.add("$departmentName="+map.get("departmentName") + "$");
                     }else {
                         item.add(map.get("userName") + "");
                         item.add(map.get("departmentName") + "");
@@ -11567,6 +11669,9 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                 if (wxCorpInfo != null && wxCorpInfo.getSaasSyncContact().equals(1)){
                     item.add("$userName="+maps.get(0).get("wxUserId") + "$");
                     item.add("$departmentName="+maps.get(0).get("wxdeptId") + "$");
+                }else if (dingding != null && dingding.getSyncContact().equals(1)){
+                    item.add("$userName="+maps.get(0).get("userName") + "$");
+                    item.add("$departmentName="+maps.get(0).get("departmentName") + "$");
                 }else {
                     item.add(maps.get(0).get("userName") + "");
                     item.add(maps.get(0).get("departmentName") + "");
@@ -11605,7 +11710,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         }
         String fileName = "FTE报表"+System.currentTimeMillis();
         try {
-            return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,fileName, dataList, path);
+            return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,dingding,fileName, dataList, path);
         } catch (Exception e) {
             e.printStackTrace();
         }
@@ -12190,6 +12295,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         List<LaborHourRateVo> resultList= (List<LaborHourRateVo>) msgData.getData();
         Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
         WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new LambdaQueryWrapper<WxCorpInfo>().eq(WxCorpInfo::getCompanyId, companyId));
+        CompanyDingding dingding = companyDingdingMapper.selectOne(new QueryWrapper<CompanyDingding>().eq("company_id", companyId));
         Company company = companyMapper.selectById(companyId);
         //1.创建一个workbook,对应一个excel文件
         SXSSFWorkbook workBook = new SXSSFWorkbook();
@@ -12306,6 +12412,8 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         for (LaborHourRateVo laborHourRateVo : resultList) {
             if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                 list.add("$departmentName="+laborHourRateVo.getDepartment_name()+"$");
+            }else if(dingding!=null&&dingding.getSyncContact()==1){
+                list.add("$departmentName="+laborHourRateVo.getDepartment_name()+"$");
             }else {
                 list.add(laborHourRateVo.getDepartment_name());
             }
@@ -12352,7 +12460,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         }
         if(wxCorpInfo != null && wxCorpInfo.getSaasSyncContact() == 1){
             try {
-                return excelExportService.exportTranForwx(wxCorpInfo, title);
+                return excelExportService.exportTranForwx(wxCorpInfo,dingding, title);
             } catch (Exception e) {
                 e.printStackTrace();
             }
@@ -12489,6 +12597,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         HttpRespMsg msg=new HttpRespMsg();
         Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
         WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new LambdaQueryWrapper<WxCorpInfo>().eq(WxCorpInfo::getCompanyId, companyId));
+        CompanyDingding dingding = companyDingdingMapper.selectOne(new QueryWrapper<CompanyDingding>().eq("company_id", companyId));
         HttpRespMsg respMsg = getMembProjectCateRatio(startDate, endDate,departmentId,subUserCustomName, onlyShowWarning);
         Map<String,Object> resultMap= (Map<String, Object>) respMsg.getData();
         List<Map<String, Object>> mapList = (List<Map<String, Object>>) resultMap.get("userList");
@@ -12530,7 +12639,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         String title= "项目分类工时占比表_"+System.currentTimeMillis();
         String fileName= title+".xlsx";
         try {
-            return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,fileName,dataList,path);
+            return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,dingding,fileName,dataList,path);
         } catch (Exception e) {
             e.printStackTrace();
         }
@@ -12634,6 +12743,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         List<Map<String, Object>> mapList = (List<Map<String, Object>>) msgData.get("record");
         Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
         WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new LambdaQueryWrapper<WxCorpInfo>().eq(WxCorpInfo::getCompanyId, companyId));
+        CompanyDingding dingding = companyDingdingMapper.selectOne(new QueryWrapper<CompanyDingding>().eq("company_id", companyId));
         Company company = companyMapper.selectById(companyId);
         //1.创建一个workbook,对应一个excel文件
         SXSSFWorkbook workBook = new SXSSFWorkbook();
@@ -12764,8 +12874,16 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
             }
             deptIndex+=maps.size();
             for (int i = 0; i < maps.size(); i++) {
-                list.add("$departmentName="+String.valueOf(maps.get(i).get("corpwxDeptId"))+"$");
-                list.add("$userName="+maps.get(i).get("corpwxUserId")+"$");
+                if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                    list.add("$departmentName="+String.valueOf(maps.get(i).get("corpwxDeptId"))+"$");
+                    list.add("$userName="+maps.get(i).get("corpwxUserId")+"$");
+                }else if(dingding!=null&&dingding.getSyncContact()==1){
+                    list.add("$departmentName="+String.valueOf(maps.get(i).get("departmentName"))+"$");
+                    list.add("$userName="+String.valueOf(maps.get(i).get("userName"))+"$");
+                }else {
+                    list.add(String.valueOf(maps.get(i).get("departmentName")));
+                    list.add(String.valueOf(maps.get(i).get("userName")));
+                }
                 list.add(String.valueOf(maps.get(i).get("projectName")));
                 list.add(String.valueOf(maps.get(i).get("projectCode")));
                 list.add(String.valueOf(maps.get(i).get("residueTime")));
@@ -12808,7 +12926,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         if(wxCorpInfo != null && wxCorpInfo.getSaasSyncContact() == 1){
 
             try {
-                return excelExportService.exportTranForwx(wxCorpInfo, title);
+                return excelExportService.exportTranForwx(wxCorpInfo,dingding, title);
             } catch (Exception e) {
                 e.printStackTrace();
             }
@@ -13098,6 +13216,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         List<Map<String, Object>> mapList = (List<Map<String, Object>>) msgData.get("record");
         Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
         WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new LambdaQueryWrapper<WxCorpInfo>().eq(WxCorpInfo::getCompanyId, companyId));
+        CompanyDingding dingding = companyDingdingMapper.selectOne(new QueryWrapper<CompanyDingding>().eq("company_id", companyId));
         Company company = companyMapper.selectById(companyId);
         //1.创建一个workbook,对应一个excel文件
         SXSSFWorkbook workBook = new SXSSFWorkbook();
@@ -13244,6 +13363,8 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
             list.add(String.valueOf(map.get("projectName")));
             if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                 list.add("$departmentName="+map.get("corpwxDeptId")+"$");
+            }else if(dingding!=null&&dingding.getSyncContact()==1){
+                list.add("$departmentName="+String.valueOf(map.get("department_name"))+"$");
             }else {
                 list.add(String.valueOf(map.get("department_name")));
             }
@@ -13293,7 +13414,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         if(wxCorpInfo != null && wxCorpInfo.getSaasSyncContact() == 1){
 
             try {
-                return excelExportService.exportTranForwx(wxCorpInfo, title);
+                return excelExportService.exportTranForwx(wxCorpInfo,dingding, title);
             } catch (Exception e) {
                 e.printStackTrace();
             }
@@ -13398,6 +13519,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         percentFormat.setMaximumFractionDigits(2);
         Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
         WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new LambdaQueryWrapper<WxCorpInfo>().eq(WxCorpInfo::getCompanyId, companyId));
+        CompanyDingding dingding = companyDingdingMapper.selectOne(new QueryWrapper<CompanyDingding>().eq("company_id", companyId));
         HttpRespMsg resultMsg = projectExpendProcessList(startDate,endDate,projectId,categoryId,userId,null,null);
         Map<String, Object> msgData = (Map<String, Object>) resultMsg.getData();
         List<Map<String, Object>> mapList = (List<Map<String, Object>>) msgData.get("record");
@@ -13451,6 +13573,8 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                 if(i==userProgress.size()-1){
                     if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                         sb.append("$userName="+String.valueOf(userProgress.get(i).get("userName"))+"$"+String.valueOf(userProgress.get(i).get("progress")));
+                    }else if(dingding!=null&&dingding.getSyncContact()==1){
+                        sb.append("$userName="+String.valueOf(userProgress.get(i).get("userName"))+"$"+String.valueOf(userProgress.get(i).get("progress")));
                     }else {
                         sb.append(String.valueOf(userProgress.get(i).get("userName"))+String.valueOf(userProgress.get(i).get("progress")));
                     }
@@ -13458,6 +13582,8 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                 }else {
                     if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                         sb.append("$userName="+String.valueOf(userProgress.get(i).get("userName"))+"$"+String.valueOf(userProgress.get(i).get("progress"))+",");
+                    }else if(dingding!=null&&dingding.getSyncContact()==1){
+                        sb.append("$userName="+String.valueOf(userProgress.get(i).get("userName"))+"$"+String.valueOf(userProgress.get(i).get("progress"))+",");
                     }else {
                         sb.append(String.valueOf(userProgress.get(i).get("userName"))+String.valueOf(userProgress.get(i).get("progress"))+",");
                     }
@@ -13468,7 +13594,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         }
         String fileName = "项目耗用进度表_"+System.currentTimeMillis();
         try {
-           return   excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,fileName , dataList, path);
+           return   excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,dingding,fileName , dataList, path);
         } catch (Exception e) {
             e.printStackTrace();
         }
@@ -13547,6 +13673,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         List<Map<String, Object>> mapList = (List<Map<String, Object>>) msgData.get("record");
         Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
         WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new LambdaQueryWrapper<WxCorpInfo>().eq(WxCorpInfo::getCompanyId, companyId));
+        CompanyDingding dingding = companyDingdingMapper.selectOne(new QueryWrapper<CompanyDingding>().eq("company_id", companyId));
         Company company = companyMapper.selectById(companyId);
         //1.创建一个workbook,对应一个excel文件
         SXSSFWorkbook workBook = new SXSSFWorkbook();
@@ -13687,8 +13814,16 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
             }
             deptIndex+=maps.size();
             for (int i = 0; i < maps.size(); i++) {
-                list.add("$departmentName="+String.valueOf(maps.get(i).get("corpwxDeptId"))+"$");
-                list.add("$userName="+maps.get(i).get("corpwxUserId")+"$");
+                if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                    list.add("$departmentName="+String.valueOf(maps.get(i).get("corpwxDeptId"))+"$");
+                    list.add("$userName="+maps.get(i).get("corpwxUserId")+"$");
+                }else if(dingding!=null&&dingding.getSyncContact()==1){
+                    list.add("$departmentName="+String.valueOf(maps.get(i).get("departmentName"))+"$");
+                    list.add("$userName="+String.valueOf(maps.get(i).get("userName"))+"$");
+                }else {
+                    list.add(String.valueOf(maps.get(i).get("departmentName")));
+                    list.add(String.valueOf(maps.get(i).get("userName")));
+                }
                 list.add(String.valueOf(maps.get(i).get("projectName")));
                 list.add(String.valueOf(maps.get(i).get("projectCode")));
                 list.add(String.valueOf(maps.get(i).get("taskName")));
@@ -13736,7 +13871,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         if(wxCorpInfo != null && wxCorpInfo.getSaasSyncContact() == 1){
 
             try {
-                return excelExportService.exportTranForwx(wxCorpInfo, title);
+                return excelExportService.exportTranForwx(wxCorpInfo,dingding, title);
             } catch (Exception e) {
                 e.printStackTrace();
             }

+ 6 - 4
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProviderInfoServiceImpl.java

@@ -2,9 +2,8 @@ package com.management.platform.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.management.platform.entity.ProviderInfo;
-import com.management.platform.entity.User;
-import com.management.platform.entity.WxCorpInfo;
+import com.management.platform.entity.*;
+import com.management.platform.mapper.CompanyDingdingMapper;
 import com.management.platform.mapper.ProviderInfoMapper;
 import com.management.platform.mapper.UserMapper;
 import com.management.platform.mapper.WxCorpInfoMapper;
@@ -50,6 +49,8 @@ public class ProviderInfoServiceImpl extends ServiceImpl<ProviderInfoMapper, Pro
     WxCorpInfoMapper wxCorpInfoMapper;
     @Resource
     ExcelExportService excelExportService;
+    @Resource
+    private CompanyDingdingMapper companyDingdingMapper;
     @Value(value = "${upload.path}")
     String path;
     @Override
@@ -166,6 +167,7 @@ public class ProviderInfoServiceImpl extends ServiceImpl<ProviderInfoMapper, Pro
     public HttpRespMsg exportData(HttpServletRequest request) {
         User user = userMapper.selectById(request.getHeader("token"));
         WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", user.getCompanyId()));
+        CompanyDingding dingding = companyDingdingMapper.selectOne(new QueryWrapper<CompanyDingding>().eq("company_id", user.getCompanyId()));
         List<List<String>> dataList=new ArrayList<>();
         //String[] titleString=new String[]{"供应商编号","供应商名称","分类","联系人","联系电话","邮箱","地址","备注"};
         String[] titleString=new String[]{MessageUtils.message("excel.supplierNo"),MessageUtils.message("excel.supplierName"),MessageUtils.message("excel.classification"),MessageUtils.message("excel.contacts"),MessageUtils.message("excel.phone"),MessageUtils.message("excel.email"),MessageUtils.message("excel.address"),MessageUtils.message("excel.remarks")};
@@ -188,7 +190,7 @@ public class ProviderInfoServiceImpl extends ServiceImpl<ProviderInfoMapper, Pro
         //String fileName = "供应商统计_"+System.currentTimeMillis();
         String fileName = MessageUtils.message("fileName.supStat")+System.currentTimeMillis();
         try {
-            return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,fileName , dataList, path);
+            return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,dingding,fileName , dataList, path);
         } catch (Exception e) {
             e.printStackTrace();
         }

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

@@ -2,14 +2,12 @@ package com.management.platform.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.management.platform.entity.ReportExtraDegree;
-import com.management.platform.entity.TimeType;
-import com.management.platform.entity.User;
-import com.management.platform.entity.WxCorpInfo;
+import com.management.platform.entity.*;
 import com.management.platform.mapper.ReportExtraDegreeMapper;
 import com.management.platform.mapper.TimeTypeMapper;
 import com.management.platform.mapper.UserMapper;
 import com.management.platform.mapper.WxCorpInfoMapper;
+import com.management.platform.service.CompanyDingdingService;
 import com.management.platform.service.ExcelExportService;
 import com.management.platform.service.ReportExtraDegreeService;
 import com.management.platform.util.ExcelUtil;
@@ -57,6 +55,8 @@ public class ReportExtraDegreeServiceImpl extends ServiceImpl<ReportExtraDegreeM
     WxCorpInfoMapper wxCorpInfoMapper;
     @Resource
     ExcelExportService excelExportService;
+    @Resource
+    private CompanyDingdingService companyDingdingService;
     @Override
     public HttpRespMsg importData(HttpServletRequest request, MultipartFile multipartFile) {
         HttpRespMsg msg=new HttpRespMsg();
@@ -161,6 +161,7 @@ public class ReportExtraDegreeServiceImpl extends ServiceImpl<ReportExtraDegreeM
         HttpRespMsg httpRespMsg=new HttpRespMsg();
         User user = userMapper.selectById(request.getHeader("token"));
         WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", user.getCompanyId()));
+        CompanyDingding dingding = companyDingdingService.getOne(new QueryWrapper<CompanyDingding>().eq("company_id", user.getCompanyId()));
         List<ReportExtraDegree> reportExtraDegreeList = reportExtraDegreeMapper.selectList(new QueryWrapper<ReportExtraDegree>().eq("company_id", user.getCompanyId()));
         TimeType timeType = timeTypeMapper.selectById(user.getCompanyId());
         List<String> titleList=new ArrayList<>();
@@ -175,7 +176,7 @@ public class ReportExtraDegreeServiceImpl extends ServiceImpl<ReportExtraDegreeM
         //生成excel文件导出
         String fileName = timeType.getCustomDegreeName()+"_"+System.currentTimeMillis();
         try {
-            return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,fileName , dataList, path);
+            return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,dingding,fileName , dataList, path);
         } catch (Exception e) {
             e.printStackTrace();
         }

+ 82 - 10
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java

@@ -13,6 +13,7 @@ import com.management.platform.service.*;
 import com.management.platform.util.*;
 import com.management.platform.webservice.po.*;
 import com.management.platform.webservice.po.SapPeriod;
+import jdk.nashorn.api.scripting.ScriptObjectMirror;
 import lombok.SneakyThrows;
 import me.chanjar.weixin.mp.api.WxMpInMemoryConfigStorage;
 import me.chanjar.weixin.mp.api.WxMpService;
@@ -74,6 +75,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
     private final static Executor executor = Executors.newFixedThreadPool(3);//启用多线程
     //用于控制线程锁
     public static HashMap<String, CorpwxJobResult> corpwxJobCenter = new HashMap();
+    public static HashMap<String, Integer> corpddJobCenter=new HashMap<>();
     @Value("${wx.template_report_pass}")
     public String TEMPLATE_REPORT_PASS;
     @Value("${wx.template_report_reject}")
@@ -2729,12 +2731,16 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
         String str = null;
         String fillUserId = null;
         WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", company.getId()));
+        CompanyDingding dingding = companyDingdingService.getOne(new LambdaQueryWrapper<CompanyDingding>().eq(CompanyDingding::getCompanyId, company.getId()));
         if (oneReport.getState() == -1) {//待部门直属领导审核
             //str = "您"+date+"导入的日报中"+pNames+"项目被["+user.getName()+"]驳回。原因:" + reason+",请重新导入。";
             String sendToUser = user.getName();
             if (wxCorpInfo != null && wxCorpInfo.getSaasSyncContact() == 1) {
                 //需要转译
                 sendToUser = "$userName="+user.getCorpwxUserid()+"$";
+            }else if (dingding != null && dingding.getSyncContact() == 1) {
+                //需要转译
+                sendToUser = "$userName="+user.getDingdingUserid()+"$";
             }
             str = MessageUtils.message("profession.impProReject",date,pNames,sendToUser,reason);
             fillUserId = oneReport.getFillUserid();
@@ -2744,6 +2750,9 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             if (wxCorpInfo != null && wxCorpInfo.getSaasSyncContact() == 1) {
                 //需要转译
                 sendToUser = "$userName="+user.getCorpwxUserid()+"$";
+            }else if (dingding != null && dingding.getSyncContact() == 1) {
+                //需要转译
+                sendToUser = "$userName="+user.getDingdingUserid()+"$";
             }
             str = MessageUtils.message("profession.fillProReject",date,pNames,sendToUser,reason);
             fillUserId = oneReport.getCreatorId();
@@ -4496,6 +4505,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
         HttpRespMsg msg = getUserDailyWorkTime(request, startDate, endDate);
         Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
         WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", companyId));
+        CompanyDingding dingding = companyDingdingService.getOne(new QueryWrapper<CompanyDingding>().eq("company_id", companyId));
         //String[] weekDayCHN = {"周一","周二","周三","周四","周五","周六","周日"};
         String[] weekDayCHN = {MessageUtils.message("week.Monday"),MessageUtils.message("week.Tuesday"),MessageUtils.message("week.Wednesday"),MessageUtils.message("week.Thursday"),MessageUtils.message("week.Friday"),MessageUtils.message("week.Saturday"),MessageUtils.message("week.Sunday")};
         HashMap map = (HashMap) msg.data;
@@ -4519,6 +4529,9 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                 dataItem.add("$userName="+(userMonthWork.corpwxUserId==null?"":userMonthWork.corpwxUserId)+"$"+(worktimeList.size()==0?"("+MessageUtils.message("entry.noFill")+")":""));
                 dataItem.add("$departmentName="+(userMonthWork.departmentName==null?"":userMonthWork.departmentName)+"$");
+            }else if(dingding!=null&&dingding.getSyncContact()==1){
+                dataItem.add("$userName="+(userMonthWork.name==null?"":userMonthWork.name)+"$"+(worktimeList.size()==0?"("+MessageUtils.message("entry.noFill")+")":""));
+                dataItem.add("$departmentName="+(userMonthWork.departmentName==null?"":userMonthWork.departmentName)+"$");
             }else {
                 dataItem.add(userMonthWork.name+(worktimeList.size()==0?"("+MessageUtils.message("entry.noFill")+")":""));
                 dataItem.add(userMonthWork.departmentName);
@@ -4554,7 +4567,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
         //String fileName = "人员每日工时统计_"+startDate+"至"+endDate+"_"+System.currentTimeMillis();
         String fileName = MessageUtils.message("fileName.dailyManHour",startDate,endDate)+"_"+System.currentTimeMillis();
         try {
-             return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo, fileName, dataList, path);
+             return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,dingding, fileName, dataList, path);
         } catch (Exception e) {
             e.printStackTrace();
         }
@@ -5247,6 +5260,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             Integer companyId = company.getId();
             List<UserCustom> userCustomList = userCustomMapper.selectList(new QueryWrapper<UserCustom>().eq("company_id", companyId));
             WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", companyId));
+            CompanyDingding dingding = companyDingdingService.getOne(new QueryWrapper<CompanyDingding>().eq("company_id", companyId));
             boolean needCorpWxTranslate = (wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1);
             SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
             List<List<String>> dataList=new ArrayList<>();
@@ -5542,7 +5556,10 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                 if(needCorpWxTranslate){
                     item.add("$userName="+(map.get("corpwxUserId")==null?"":map.get("corpwxUserId"))+"$");
                     item.add(departmentService.exportWxDepartment(dept,departments));
-                }else {
+                }else if(dingding!=null&&dingding.getSyncContact()==1){
+                    item.add("$userName="+(map.get("name")==null?"":map.get("name"))+"$");
+                    item.add(departmentService.exportDdDepartment(dept,departments));
+                }else  {
                     item.add((String) map.get("name"));
                     item.add(departmentService.getSupDepartment(dept,departments));
                 }
@@ -5650,6 +5667,9 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                         if(needCorpWxTranslate){
                             String projectAuditorName ="$userName="+String.valueOf(map.get("projectAuditorCorpwxUserId"))+"$";
                             item.add(projectAuditorName);
+                        }else if(dingding!=null&&dingding.getSyncContact()==1){
+                            String projectAuditorName ="$userName="+(String)map.get("projectAuditorName")+"$";
+                            item.add(projectAuditorName);
                         }else {
                             item.add((String)map.get("projectAuditorName"));
                         }
@@ -5657,6 +5677,9 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                     if(needCorpWxTranslate){
                         String projectManagerName ="$userName="+String.valueOf(map.get("projectManagerCorpwxUserId"))+"$";
                         item.add(projectManagerName);
+                    }else if(dingding!=null&&dingding.getSyncContact()==1){
+                        String projectAuditorName ="$userName="+(String)map.get("projectManagerName")+"$";
+                        item.add(projectAuditorName);
                     }else {
                         item.add((String)map.get("projectManagerName"));
                     }
@@ -5714,7 +5737,29 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
 											msg = time+" " + auditMsg;
 										}
 									}
-								}else {
+								}else if(dingding!=null&&dingding.getSyncContact()==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;
 								}
 							} 
@@ -5784,6 +5829,16 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                                             } else {
                                                 item.add("待" + departmentName + "(" + deptAuditorName + ")审核");
                                             }
+                                        }else if (dingding!=null&&dingding.getSyncContact()==1) {
+                                            String deptAuditorName = "$userName=" + userItem.getDingdingUserid() + "$";
+                                            departmentName = "$departmentName=" + departmentName + "$";
+                                            if (timeType.getReportAuditType() == 4) {
+                                                departmentName = map.get("buDepartmentName") + "";
+                                                departmentName = "$departmentName=" + departmentName + "$";
+                                                item.add("待项目所属BU[" + departmentName + "](" + deptAuditorName + ")审核");
+                                            } else {
+                                                item.add("待" + departmentName + "(" + deptAuditorName + ")审核");
+                                            }
                                         } else {
                                             if (timeType.getReportAuditType() == 4) {
                                                 departmentName = map.get("buDepartmentName") + "";
@@ -5800,10 +5855,14 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                                 if (String.valueOf(map.get("projectAuditState")).equals("0") || String.valueOf(map.get("groupAuditState")).equals("0")) {
                                     String projectAuditorName = map.get("projectAuditorName") + "";
                                     String projectAuditorId = map.get("projectAuditorId") + "";
-                                    if (needCorpWxTranslate) {
+                                    if (needCorpWxTranslate||(dingding!=null&&dingding.getSyncContact()==1)) {
                                         for (User userItem : userList) {
                                             if (userItem.getId().equals(projectAuditorId)) {
-                                                projectAuditorName = "$userName=" + userItem.getCorpwxUserid() + "$";
+                                                if(needCorpWxTranslate){
+                                                    projectAuditorName = "$userName=" + userItem.getCorpwxUserid() + "$";
+                                                }else if(dingding!=null&&dingding.getSyncContact()==1){
+                                                    projectAuditorName = "$userName=" + userItem.getDingdingUserid() + "$";
+                                                }
                                                 item.add("待项目审核人" + "(" + projectAuditorName + ")审核");
                                                 break;
                                             }
@@ -5821,7 +5880,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             }
             //生成Excel文件
             String fileUrlSuffix = (startDate==null?"":(startDate+MessageUtils.message("leave.to")+endDate))+MessageUtils.message("excel.workReport") + System.currentTimeMillis();
-            httpRespMsg = excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,fileUrlSuffix,dataList,path);
+            httpRespMsg = excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,dingding,fileUrlSuffix,dataList,path);
         } catch (NullPointerException e) {
             //httpRespMsg.setError("验证失败或缺少数据");
             httpRespMsg.setError(MessageUtils.message("access.verErrorOrDataLack"));
@@ -6240,7 +6299,9 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
         HttpRespMsg msg = getNoReportUserList(request, startDate, endDate,noReportDeptId);
         String token = request.getHeader("TOKEN");
         TimeType timeType = timeTypeMapper.selectById(userMapper.selectById(token).getCompanyId());
-        WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", userMapper.selectById(token).getCompanyId()));
+        Integer companyId = userMapper.selectById(token).getCompanyId();
+        WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", companyId));
+        CompanyDingding dingding = companyDingdingService.getOne(new QueryWrapper<CompanyDingding>().eq("company_id", companyId));
         //String[] weekDayCHN = {"周一","周二","周三","周四","周五","周六","周日"};
         String[] weekDayCHN = {MessageUtils.message("week.Monday"),MessageUtils.message("week.Tuesday"),MessageUtils.message("week.Wednesday"),MessageUtils.message("week.Thursday"),MessageUtils.message("week.Friday"),MessageUtils.message("week.Saturday"),MessageUtils.message("week.Sunday")};
         List<UserDailyWorkItem> dailyWorkItems = (List<UserDailyWorkItem>) msg.data;
@@ -6268,6 +6329,9 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                 line.add("$departmentName="+dataItem.corpwxDeptId+"$");
                 line.add("$userName="+dataItem.corpwxUserId+"$");
+            }else if(dingding!=null&&dingding.getSyncContact()==1){
+                line.add("$departmentName="+dataItem.department+"$");
+                line.add("$userName="+dataItem.name+"$");
             }else {
                 line.add(dataItem.department);
                 line.add(dataItem.name);
@@ -6283,7 +6347,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
         //String fileName = "未填人员统计_"+startDate+"至"+endDate+"_"+System.currentTimeMillis();
         String fileName = MessageUtils.message("fileName.perNoFill")+startDate+MessageUtils.message("leave.to")+endDate+"_"+System.currentTimeMillis();
         try {
-            return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo, fileName, dataList, path);
+            return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,dingding, fileName, dataList, path);
         } catch (Exception e) {
             e.printStackTrace();
         }
@@ -8704,6 +8768,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
         Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
 
         WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", companyId));
+        CompanyDingding dingding = companyDingdingService.getOne(new QueryWrapper<CompanyDingding>().eq("company_id", companyId));
         DateTimeFormatter dtf=DateTimeFormatter.ofPattern("yyyy-MM-dd");
         List<LocalDate> dates = getDays(LocalDate.parse(startDate, dtf), LocalDate.parse(endDate, dtf));
         List<UserCustom> userCustomList = userCustomMapper.selectList(new LambdaQueryWrapper<UserCustom>().eq(UserCustom::getCompanyId, companyId));
@@ -8741,6 +8806,9 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                 item.add("$userName="+String.valueOf(record.get("corpWxUserId"))+"$");
                 item.add("$departmentName="+String.valueOf(record.get("corpWxDeptId"))+"$");
+            }else if(dingding!=null&&dingding.getSyncContact()==1){
+                item.add("$userName="+String.valueOf(record.get("userName"))+"$");
+                item.add("$departmentName="+String.valueOf(record.get("deptName"))+"$");
             }else {
                 item.add(String.valueOf(record.get("userName")));
                 item.add(String.valueOf(record.get("deptName")));
@@ -8775,7 +8843,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
         }
         String fileName = "分类工时明细表"+"_"+System.currentTimeMillis();
         try {
-            return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo, fileName, dataList, path);
+            return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,dingding, fileName, dataList, path);
         } catch (Exception e) {
             e.printStackTrace();
         }
@@ -9005,6 +9073,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
         HttpRespMsg timeReminder = getUserDailyWorkTimeReminder(request, startDate, endDate);
         Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
         WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new LambdaQueryWrapper<WxCorpInfo>().eq(WxCorpInfo::getCompanyId, companyId));
+        CompanyDingding dingding = companyDingdingService.getOne(new QueryWrapper<CompanyDingding>().eq("company_id", companyId));
         Map<String, Object> data = (Map<String, Object>) timeReminder.getData();
         List<Map<String, Object>> mapList = (List<Map<String, Object>>) data.get("list");
         List<List<String>> dataList=new ArrayList<>();
@@ -9022,6 +9091,9 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                 item.add("$userName="+String.valueOf(map.get("corpwxUserId"))+"$");
                 item.add("$departmentName="+String.valueOf(map.get("corpwxDeptId"))+"$");
+            }else if(dingding!=null&&dingding.getSyncContact()==1){
+                item.add("$userName="+String.valueOf(map.get("name"))+"$");
+                item.add("$departmentName="+String.valueOf(map.get("departmentName"))+"$");
             }else {
                 item.add(String.valueOf(map.get("name")));
                 item.add(String.valueOf(map.get("departmentName")));
@@ -9032,6 +9104,6 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             dataList.add(item);
         }
         String fileName="工时异常表"+System.currentTimeMillis();
-        return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,fileName,dataList,path);
+        return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,dingding,fileName,dataList,path);
     }
 }

+ 4 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/SimpleReportServiceImpl.java

@@ -71,6 +71,8 @@ public class SimpleReportServiceImpl extends ServiceImpl<SimpleReportMapper, Sim
     UserMapper userMapper;
     @Resource
     WxCorpInfoMapper wxCorpInfoMapper;
+    @Resource
+    private CompanyDingdingMapper companyDingdingMapper;
     @Value(value = "${upload.path}")
     private String path;
 
@@ -396,6 +398,7 @@ public class SimpleReportServiceImpl extends ServiceImpl<SimpleReportMapper, Sim
     public HttpRespMsg exportData(String yearMonth, Integer companyId, String type, HttpServletRequest request) {
         HttpRespMsg timeCost = getTimeCost(yearMonth, companyId, type, request);
         WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", companyId));
+        CompanyDingding dingding = companyDingdingMapper.selectOne(new QueryWrapper<CompanyDingding>().eq("company_id", companyId));
         HashMap map = (HashMap)timeCost.data;
         List<HashMap> costList = (List<HashMap>)map.get("costList");
         List<List<String>> dataList = new ArrayList<>();
@@ -444,7 +447,7 @@ public class SimpleReportServiceImpl extends ServiceImpl<SimpleReportMapper, Sim
         //生成excel文件导出
         String fileName = yearMonth+"_"+type+MessageUtils.message("report.report")+"_"+System.currentTimeMillis();
         try {
-            return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,fileName , dataList, path);
+            return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,dingding,fileName , dataList, path);
         } catch (Exception e) {
             e.printStackTrace();
         }

+ 10 - 8
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/TaskRestartServiceImpl.java

@@ -1,16 +1,11 @@
 package com.management.platform.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.management.platform.entity.TaskRestart;
-import com.management.platform.entity.User;
-import com.management.platform.entity.WxCorpInfo;
+import com.management.platform.entity.*;
 import com.management.platform.entity.vo.ProjectWithStage;
 import com.management.platform.entity.vo.StageCost;
 import com.management.platform.entity.vo.SysRichFunction;
-import com.management.platform.mapper.SysFunctionMapper;
-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.ExcelExportService;
 import com.management.platform.service.TaskRestartService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -50,6 +45,8 @@ public class TaskRestartServiceImpl extends ServiceImpl<TaskRestartMapper, TaskR
     private SysFunctionMapper sysFunctionMapper;
     @Resource
     private ExcelExportService excelExportService;
+    @Resource
+    private CompanyDingdingMapper companyDingdingMapper;
 
     @Value(value = "${upload.path}")
     private String path;
@@ -113,6 +110,7 @@ public class TaskRestartServiceImpl extends ServiceImpl<TaskRestartMapper, TaskR
         User user = userMapper.selectById(token);
         Integer companyId = user.getCompanyId();
         WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", companyId));
+        CompanyDingding dingding = companyDingdingMapper.selectOne(new QueryWrapper<CompanyDingding>().eq("company_id", companyId));
         List<User> userList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", companyId));
         DateTimeFormatter df=DateTimeFormatter.ofPattern("yyyy-MM-dd");
         DateTimeFormatter df2=DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
@@ -156,6 +154,10 @@ public class TaskRestartServiceImpl extends ServiceImpl<TaskRestartMapper, TaskR
                         if(first.get().getCorpwxRealUserid()!=null){
                             personLiableNames.append("$userName="+(first.get().getCorpwxUserid()==null?"":first.get().getCorpwxUserid())+"$"+",");
                         }
+                    }else if(dingding!=null&&dingding.getSyncContact()==1){
+                        if(first.get().getName()!=null){
+                            personLiableNames.append("$userName="+(first.get().getName())+"$"+",");
+                        }
                     }else {
                         personLiableNames.append(first.get().getName()+",");
                     }
@@ -167,7 +169,7 @@ public class TaskRestartServiceImpl extends ServiceImpl<TaskRestartMapper, TaskR
         }
         String fileName = "任务重启报表_"+System.currentTimeMillis();
         try {
-            return excelExportService.exportGeneralExcelByTitleAndList2(wxCorpInfo,fileName, dataList, path);
+            return excelExportService.exportGeneralExcelByTitleAndList2(wxCorpInfo,dingding,fileName, dataList, path);
         } catch (Exception e) {
             e.printStackTrace();
         }

+ 129 - 177
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/TaskServiceImpl.java

@@ -2,18 +2,17 @@ package com.management.platform.service.impl;
 
 import com.alibaba.fastjson.JSONArray;
 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.extension.service.impl.ServiceImpl;
 import com.github.pagehelper.util.StringUtil;
 import com.management.platform.entity.*;
 import com.management.platform.mapper.*;
-import com.management.platform.service.CompanyDingdingService;
-import com.management.platform.service.TaskExecutorService;
-import com.management.platform.service.TaskService;
-import com.management.platform.service.WxCorpInfoService;
+import com.management.platform.service.*;
 import com.management.platform.util.ExcelUtil;
 import com.management.platform.util.HttpRespMsg;
 import com.management.platform.util.MessageUtils;
+import jdk.nashorn.api.scripting.ScriptObjectMirror;
 import org.apache.poi.hssf.usermodel.*;
 import org.apache.poi.ss.usermodel.CellType;
 import org.apache.poi.xssf.usermodel.XSSFCell;
@@ -47,9 +46,6 @@ import java.util.stream.Collectors;
 @Transactional
 public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements TaskService {
 
-    //用于控制线程锁
-    public static HashMap<String, CorpwxJobResult> corpwxJobCenter = new HashMap();
-
     @Value(value = "${upload.path}")
     private String path;
     @Resource
@@ -80,6 +76,14 @@ public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements Ta
     private WxCorpInfoService wxCorpInfoService;
     @Resource
     private WxCorpInfoMapper wxCorpInfoMapper;
+    @Resource
+    private SysFunctionService sysFunctionService;
+    @Resource
+    private DepartmentService departmentService;
+    @Resource
+    private DepartmentOtherManagerMapper departmentOtherManagerMapper;
+    @Resource
+    private ExcelExportService excelExportService;
 
     @Override
     public HttpRespMsg getExecutorPanel(Integer projectId) {
@@ -216,176 +220,6 @@ public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements Ta
     }
 
 
-    @Override
-    public HttpRespMsg exportTask(Integer projectId, Integer taskType) {
-        HttpRespMsg httpRespMsg = new HttpRespMsg();
-        List<TimeTask> list= taskMapper.getTaskWithWorktime(projectId, taskType);
-        Project project = projectMapper.selectById(projectId);
-        Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
-        WxCorpInfo wxCorpInfo = wxCorpInfoService.getOne(new QueryWrapper<WxCorpInfo>().eq("company_id", companyId));
-        List<User> userList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", companyId));
-        try {
-            DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
-            //准备导出
-            HSSFWorkbook workbook = new HSSFWorkbook();
-            //HSSFSheet sheet = workbook.createSheet("任务数据");
-            HSSFSheet sheet = workbook.createSheet(MessageUtils.message("excel.taskData"));
-            //创建表头
-            HSSFRow headRow = sheet.createRow(0);
-            //设置列宽 setColumnWidth的第二个参数要乘以256 这个参数的单位是1/256个字符宽度
-            sheet.setColumnWidth(0, 50 * 256);
-            sheet.setColumnWidth(1, 20 * 256);
-            sheet.setColumnWidth(2, 20 * 256);
-            sheet.setColumnWidth(3, 20 * 256);
-            sheet.setColumnWidth(4, 20 * 256);
-            sheet.setColumnWidth(5, 20 * 256);
-            sheet.setColumnWidth(6, 20 * 256);
-            sheet.setColumnWidth(7, 20 * 256);
-            sheet.setColumnWidth(8, 20 * 256);
-            sheet.setColumnWidth(9, 20 * 256);
-            //设置为居中加粗
-            HSSFCellStyle headStyle = workbook.createCellStyle();
-            HSSFFont font = workbook.createFont();
-            font.setBold(true);
-            headStyle.setFont(font);
-            HSSFFont redFont = workbook.createFont();
-            redFont.setColor(HSSFFont.COLOR_RED);
-            HSSFCellStyle redStyle = workbook.createCellStyle();
-            redStyle.setFont(redFont);
-            //表头
-            HSSFCell headCell;
-            headCell = headRow.createCell(0);
-            //headCell.setCellValue("任务内容");
-            headCell.setCellValue(MessageUtils.message("excel.taskContent"));
-            headCell.setCellStyle(headStyle);
-            headCell = headRow.createCell(1);
-            //headCell.setCellValue("项目");
-            headCell.setCellValue(MessageUtils.message("entry.project"));
-            headCell.setCellStyle(headStyle);
-            headCell = headRow.createCell(2);
-            //headCell.setCellValue("执行人");
-            headCell.setCellValue(MessageUtils.message("excel.executor"));
-            headCell.setCellStyle(headStyle);
-            headCell = headRow.createCell(3);
-            //headCell.setCellValue("创建时间");
-            headCell.setCellValue(MessageUtils.message("excel.creatTime"));
-            headCell.setCellStyle(headStyle);
-            headCell = headRow.createCell(4);
-            //headCell.setCellValue("截止时间");
-            headCell.setCellValue(MessageUtils.message("excel.deadline"));
-            headCell.setCellStyle(headStyle);
-            headCell = headRow.createCell(5);
-            //headCell.setCellValue("完成时间");
-            headCell.setCellValue(MessageUtils.message("excel.comTime"));
-            headCell.setCellStyle(headStyle);
-            headCell = headRow.createCell(6);
-            //headCell.setCellValue("是否完成");
-            headCell.setCellValue(MessageUtils.message("excel.whetherCom"));
-            headCell.setCellStyle(headStyle);
-            headCell = headRow.createCell(7);
-            //headCell.setCellValue("是否逾期");
-            headCell.setCellValue(MessageUtils.message("excel.overdueNot"));
-            headCell.setCellStyle(headStyle);
-            headCell = headRow.createCell(8);
-            //headCell.setCellValue("计划工时(h)");
-            headCell.setCellValue(MessageUtils.message("excel.plannedWork"));
-            headCell.setCellStyle(headStyle);
-            headCell = headRow.createCell(9);
-            //headCell.setCellValue("实际工时(h)");
-            headCell.setCellValue(MessageUtils.message("excel.actualWork"));
-            headCell.setCellStyle(headStyle);
-            int rowNum = 1;
-            for (TimeTask task : list) {
-                HSSFRow row = sheet.createRow(rowNum);
-                row.createCell(0).setCellValue(task.getName());
-                row.createCell(1).setCellValue(project.getProjectName());
-                if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
-                    Optional<User> first = userList.stream().filter(ul -> ul.getId().equals(task.getExecutorId())).findFirst();
-                    if(first.isPresent()){
-                        row.createCell(2).setCellValue("$userName="+(first.get().getCorpwxUserid()==null?"":first.get().getCorpwxUserid())+"$");
-                    }else {
-                        row.createCell(2).setCellValue("");
-                    }
-                }else {
-                    row.createCell(2).setCellValue(task.getExecutorName());
-                }
-                row.createCell(3).setCellValue(dateTimeFormatter.format(task.getCreateDate()));
-                row.createCell(4).setCellValue(task.getEndDate() != null?dateTimeFormatter.format(task.getEndDate()):"");
-                row.createCell(5).setCellValue(task.getFinishDate() !=null?dateTimeFormatter.format(task.getFinishDate()):"");
-                row.createCell(6).setCellValue(task.getTaskStatus() == 1?"Y":"N");
-                boolean isExpired = false;
-                if (task.getTaskStatus() == 0 && task.getEndDate() !=null&& !task.getEndDate().isAfter(LocalDate.now())) {
-                    isExpired = true;
-                }
-                row.createCell(7).setCellValue(isExpired?"Y":"N");
-                row.createCell(8).setCellValue(task.getPlanHours()==null?"": task.getPlanHours().toString());
-                row.createCell(9).setCellValue(task.getWorkHours());
-                rowNum++;
-            }
-            //生成Excel文件
-            //String fileUrlSuffix = "【"+project.getProjectName()+"】任务数据" + System.currentTimeMillis() + ".xls";
-            String fileUrlSuffix = "【"+project.getProjectName()+"】"+MessageUtils.message("excel.taskData") + System.currentTimeMillis() + ".xls";
-            FileOutputStream fos = new FileOutputStream(path + fileUrlSuffix);
-            workbook.write(fos);
-            fos.flush();
-            fos.close();
-            if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
-                String mediaId = wxCorpInfoService.getTranslationMediaId(fileUrlSuffix);
-                String jobId = wxCorpInfoService.syncTranslation(wxCorpInfo.getCorpid(),mediaId,fileUrlSuffix, null);
-            /*if(jobId!=null&&!jobId.equals("")){
-                File file=new File(path + fileUrlSuffix);
-                if(file.exists()){
-                    file.delete();
-                }
-            }*/
-                int i = 0;
-                String syncTranslationResult = null;
-                /**
-                 * 异步上传转译文件的任务完成时会触发回调,在WeiXinCorpController中的commonDevCallbackPost实现了对回调的处理,存储到corpwxJobResult表中
-                 * 此处轮询查询本地数据库,检测到有任务的回调数据时继续执行查询操作
-                 */
-                while (i < 10) {
-                    Thread.sleep(300);
-                    CorpwxJobResult corpwxJobResult = corpwxJobCenter.get(jobId);
-                    if (corpwxJobResult != null) {
-                        if (corpwxJobResult.getErrCode() == 0) {
-                            syncTranslationResult = wxCorpInfoService.getSyncTranslationResult(jobId);
-                            corpwxJobCenter.remove(jobId);
-                        } else {
-                            httpRespMsg.setError(corpwxJobResult.getErrMsg());
-                            return httpRespMsg;
-                        }
-                        break;
-                    }
-                    i++;
-                }
-                if (syncTranslationResult != null) {
-                    httpRespMsg.data = syncTranslationResult;
-                } else {
-                    //httpRespMsg.setError("处理超时...");
-                    httpRespMsg.setError(MessageUtils.message("request.outTime"));
-                }
-            }else {
-                httpRespMsg.data = "/upload/" + fileUrlSuffix;
-            }
-        } catch (NullPointerException e) {
-            e.printStackTrace();
-            //httpRespMsg.setError("验证失败或缺少数据");
-            httpRespMsg.setError(MessageUtils.message("access.verErrorOrDataLack"));
-            return httpRespMsg;
-        } catch (IOException e) {
-            e.printStackTrace();
-            //httpRespMsg.setError("文件生成错误");
-            httpRespMsg.setError(MessageUtils.message("file.generateError"));
-            return httpRespMsg;
-        }catch (Exception e){
-            e.printStackTrace();
-            httpRespMsg.setError(MessageUtils.message("access.verErrorOrDataLack"));
-            return httpRespMsg;
-        }
-        return httpRespMsg;
-    }
-
     @Override
     public HttpRespMsg importTask(Integer isMultiProject, Integer projectId, Integer groupId, MultipartFile multipartFile, HttpServletRequest request) throws Exception {
         HttpRespMsg httpRespMsg = new HttpRespMsg();
@@ -798,4 +632,122 @@ public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements Ta
         httpRespMsg.data=list;
         return httpRespMsg;
     }
+
+    @Override
+    public HttpRespMsg userTaskCompleteDetail(Integer pageIndex, Integer pageSize, String startDate, String endDate, String userId, Integer deptId) {
+        HttpRespMsg msg=new HttpRespMsg();
+        Integer pageStart=null;
+        User user = userMapper.selectById(request.getHeader("token"));
+        Integer companyId = user.getCompanyId();
+        List<Department> departmentList = departmentService.list(new LambdaQueryWrapper<Department>().eq(Department::getCompanyId, companyId));
+        boolean viewAll = sysFunctionService.hasPriviledge(user.getRoleId(), "全部员工任务完成情况表");
+        boolean viewDept = sysFunctionService.hasPriviledge(user.getRoleId(), "负责部门员工任务完成情况表");
+        List<Map<String, Object>> resultMaps;
+        Integer total;
+        if(pageIndex!=null&&pageSize!=null){
+            pageStart = (pageIndex - 1) * pageSize;
+        }
+        if(!viewAll){
+            if(viewDept){
+                //获取负责部门数据
+                List<Integer> deptIds = departmentService.list(new LambdaQueryWrapper<Department>().eq(Department::getManagerId, user.getId())).stream().map(Department::getDepartmentId).distinct().collect(Collectors.toList());
+                List<Integer> targetDeptIds=new ArrayList<>();
+                targetDeptIds.addAll(deptIds);
+                for (Integer id : deptIds) {
+                    List<Integer> branchDepartment = getBranchDepartment(id, departmentList);
+                    targetDeptIds.addAll(branchDepartment);
+                }
+                resultMaps = taskMapper.userTaskCompleteDetail(pageStart, pageSize, startDate, endDate, userId, deptId,targetDeptIds, companyId);
+                total = taskMapper.userTaskCompleteDetailCount(startDate, endDate, userId, deptId, targetDeptIds, companyId);
+            }else {
+                //只能看自己的
+                resultMaps = taskMapper.userTaskCompleteDetail(pageStart, pageSize, startDate, endDate, user.getId(), deptId,null, companyId);
+                total = taskMapper.userTaskCompleteDetailCount( startDate, endDate, user.getId(), deptId, null, companyId);
+            }
+        }else {
+            resultMaps = taskMapper.userTaskCompleteDetail(pageStart, pageSize, startDate, endDate, userId, deptId,null, companyId);
+            total = taskMapper.userTaskCompleteDetailCount(startDate, endDate, userId, deptId, null, companyId);
+        }
+        Map<String,Object> map=new HashMap<>();
+        map.put("records",resultMaps);
+        map.put("total",total);
+        msg.setData(map);
+        return msg;
+    }
+
+    @Override
+    public HttpRespMsg exportUserTaskCompleteDetail(String startDate, String endDate, String userId, Integer deptId) {
+        HttpRespMsg msg=new HttpRespMsg();
+        Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
+        WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new LambdaQueryWrapper<WxCorpInfo>().eq(WxCorpInfo::getCompanyId, companyId));
+        CompanyDingding dingding = companyDingdingService.getOne(new LambdaQueryWrapper<CompanyDingding>().eq(CompanyDingding::getCompanyId, companyId));
+        HttpRespMsg respMsg = userTaskCompleteDetail(null, null, startDate, endDate, userId, deptId);
+        Map<String, Object> data = (Map<String, Object>) respMsg.getData();
+        List<Map<String, Object>> mapList = (List<Map<String, Object>>) data.get("records");
+        List<List<String>> dataList=new ArrayList<>();
+        List<String> titleList=new ArrayList<>();
+        titleList.add("员工");
+        titleList.add("部门");
+        titleList.add("任务总数量");
+        titleList.add("已完成数量");
+        titleList.add("未完成数量");
+        titleList.add("未完成率");
+        titleList.add("按时完成数量");
+        titleList.add("延迟完成数量");
+        titleList.add("按时完成率");
+        dataList.add(titleList);
+        for (Map<String, Object> map : mapList) {
+            List<String> item=new ArrayList<>();
+            if((wxCorpInfo!=null && wxCorpInfo.getSaasSyncContact()==1)||(dingding!=null&&dingding.getSyncContact()==1)){
+                item.add("$userName="+String.valueOf(map.get("userName"))+"$");
+                item.add("$departmentName="+String.valueOf(map.get("deptName"))+"$");
+            }else {
+                item.add(String.valueOf(map.get("userName")));
+                item.add(String.valueOf(map.get("deptName")));
+            }
+            item.add(String.valueOf(map.get("allNum")));
+            item.add(String.valueOf(map.get("completedNum")));
+            item.add(String.valueOf(map.get("noCompletedNum")));
+            item.add(String.valueOf(map.get("noCompletedPercent")));
+            item.add(String.valueOf(map.get("onTimeNum")));
+            item.add(String.valueOf(map.get("noOnTimeNum")));
+            item.add(String.valueOf(map.get("onTimePercent")));
+            dataList.add(item);
+        }
+        String fileName="员工任务完成情况表_"+System.currentTimeMillis();
+        try {
+            return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,dingding,fileName,dataList,path);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return msg;
+    }
+
+    @Override
+    public HttpRespMsg getTaskByUserId(String startDate, String endDate, String userId, Integer pageIndex, Integer pageSize) {
+        HttpRespMsg msg=new HttpRespMsg();
+        Integer pageStart=null;
+        if(pageIndex!=null&&pageSize!=null){
+            pageStart = (pageIndex - 1) * pageSize;
+        }
+        List<Map<String,Object>> mapList=taskMapper.getTaskByUserId(startDate,endDate,userId,pageStart,pageSize);
+        Integer total=taskMapper.getTaskByUserIdCount(startDate,endDate,userId);
+        Map<String,Object> map=new HashMap<>();
+        map.put("records",mapList);
+        map.put("total",total);
+        msg.setData(map);
+        return msg;
+    }
+
+    private List<Integer> getBranchDepartment(Integer departmentId, List<Department> departmentList) {
+        List<Integer> list = new ArrayList<>();
+        list.add(departmentId);
+        //搜到子部门进行添加
+        for (Department department : departmentList) {
+            if (departmentId.equals(department.getSuperiorId())) {
+                list.addAll(getBranchDepartment(department.getDepartmentId(), departmentList));
+            }
+        }
+        return list;
+    }
 }

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

@@ -15,6 +15,7 @@ import com.management.platform.entity.vo.UserVO;
 import com.management.platform.mapper.*;
 import com.management.platform.service.*;
 import com.management.platform.util.*;
+import jdk.nashorn.api.scripting.ScriptObjectMirror;
 import me.chanjar.weixin.mp.api.WxMpInMemoryConfigStorage;
 import me.chanjar.weixin.mp.api.WxMpService;
 import me.chanjar.weixin.mp.api.impl.WxMpServiceImpl;
@@ -105,8 +106,6 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
     public static final String GET_USERINFO_URL = "https://api.weixin.qq.com/sns/userinfo?access_token=accessToken&openid=openId&lang=zh_CN";
     public static final String[] MATCHING_FILED = {"corpwx_userid","phone","job_number"};
 
-    //用于控制线程锁
-    public static HashMap<String, CorpwxJobResult> corpwxJobCenter = new HashMap();
     @Resource
     private RedisUtil redisUtil;
 
@@ -1996,252 +1995,6 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
         return respMsg;
     }
 
-    @Override
-    public HttpRespMsg exportUsers(Integer containInvalid, HttpServletRequest request) {
-        HttpRespMsg httpRespMsg = new HttpRespMsg();
-        try {
-            String userId = request.getHeader("Token");
-            User user = userMapper.selectById(userId);
-            TimeType timeType = timeTypeMapper.selectById(user.getCompanyId());
-            WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", user.getCompanyId()));
-            List<User> userList = userMapper.selectList(new LambdaQueryWrapper<User>().select(User::getId, User::getName, User::getCorpwxUserid).eq(User::getCompanyId, user.getCompanyId()));
-            List<UserCustom> userCustomList = userCustomMapper.selectList(new QueryWrapper<UserCustom>().eq("company_id", user.getCompanyId()));
-            //查看当前用户是否有人员成本的查看权限
-            boolean canViewCost = sysFunctionService.hasPriviledge(user.getRoleId(), "人员成本管理");
-            System.out.println("canViewCost=========="+canViewCost);
-            //准备导出
-            HSSFWorkbook workbook = new HSSFWorkbook();
-            //HSSFSheet sheet = workbook.createSheet("全部员工列表");
-            HSSFSheet sheet = workbook.createSheet(MessageUtils.message("excel.allPeopleList"));
-            //创建表头
-            HSSFRow headRow = sheet.createRow(0);
-            //设置列宽 setColumnWidth的第二个参数要乘以256 这个参数的单位是1/256个字符宽度
-            sheet.setColumnWidth(0, 5 * 256);
-            sheet.setColumnWidth(1, 10 * 256);
-            sheet.setColumnWidth(2, 20 * 256);
-            sheet.setColumnWidth(3, 20 * 256);
-            sheet.setColumnWidth(4, 20 * 256);
-            sheet.setColumnWidth(5, 10 * 256);
-
-            sheet.setColumnWidth(6, 10 * 256);
-            sheet.setColumnWidth(7, 10 * 256);
-            sheet.setColumnWidth(8, 10 * 256);
-            //设置为居中加粗
-            HSSFCellStyle headStyle = workbook.createCellStyle();
-            HSSFFont font = workbook.createFont();
-            font.setBold(true);
-            headStyle.setFont(font);
-            //表头
-            HSSFCell headCell;
-            headCell = headRow.createCell(0);
-            //headCell.setCellValue("序号");
-            headCell.setCellValue(MessageUtils.message("entry.serialNo"));
-            headCell.setCellStyle(headStyle);
-            headCell = headRow.createCell(1);
-            //headCell.setCellValue("姓名");
-            headCell.setCellValue(MessageUtils.message("entry.name"));
-            headCell.setCellStyle(headStyle);
-            headCell = headRow.createCell(2);
-            //headCell.setCellValue("角色");
-            headCell.setCellValue(MessageUtils.message("role.role"));
-            headCell.setCellStyle(headStyle);
-            headCell = headRow.createCell(3);
-            //headCell.setCellValue("手机号");
-            headCell.setCellValue(MessageUtils.message("excel.phoneNumber"));
-            headCell.setCellStyle(headStyle);
-            headCell = headRow.createCell(4);
-            //headCell.setCellValue("部门");
-            headCell.setCellValue(MessageUtils.message("excel.department"));
-            headCell.setCellStyle(headStyle);
-            int auditIndex = -1;
-            if(timeType.getReportAuditType() == 5 || timeType.getReportAuditType() == 6){
-                headCell = headRow.createCell(5);
-                headCell.setCellValue("直属审核人");
-                headCell.setCellStyle(headStyle);
-                auditIndex=0;
-            }
-
-            int minusIndex = -2;
-            if (canViewCost) {
-                headCell = headRow.createCell(6+auditIndex);
-                //headCell.setCellValue("月薪");
-                headCell.setCellValue(MessageUtils.message("excel.MonSalary"));
-                headCell.setCellStyle(headStyle);
-                headCell = headRow.createCell(7+auditIndex);
-                //headCell.setCellValue("时薪");
-                headCell.setCellValue(MessageUtils.message("excel.hourlyWage"));
-                headCell.setCellStyle(headStyle);
-                minusIndex = 0;
-            }
-
-            headCell = headRow.createCell(8+minusIndex+auditIndex);
-            //headCell.setCellValue("证书");
-            headCell.setCellValue(MessageUtils.message("excel.certificate"));
-            headCell.setCellStyle(headStyle);
-            for (int i = 0; i < userCustomList.size(); i++) {
-                headCell = headRow.createCell(minusIndex+9+i+auditIndex);
-                headCell.setCellValue(userCustomList.get(i).getName());
-                headCell.setCellStyle(headStyle);
-            }
-            headCell = headRow.createCell(minusIndex+9+userCustomList.size()+auditIndex);
-            //headCell.setCellValue("状态");
-            headCell.setCellValue(MessageUtils.message("leave.status"));
-            headCell.setCellStyle(headStyle);
-
-            //设置日期格式
-            HSSFCellStyle style = workbook.createCellStyle();
-            style.setDataFormat(HSSFDataFormat.getBuiltinFormat("yy/mm/dd hh:mm"));
-            //新增数据行 并且装填数据
-            int rowNum = 1;
-            QueryWrapper<User> queryWrapper = new QueryWrapper<>();
-            queryWrapper.eq("company_id", user.getCompanyId());
-            if (containInvalid == 0) {
-                queryWrapper.eq("is_active", 1);
-            }
-            List<User> data = userMapper.selectList(queryWrapper);
-            List<Department> deptList = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id", user.getCompanyId()));
-            List<String> collect = data.stream().map(da -> da.getId()).distinct().collect(Collectors.toList());
-            List<UserCert> userCertList=new ArrayList<>();
-            if(collect!=null&&!StringUtils.isEmpty(data)){
-                userCertList = userCertMapper.selectList(new QueryWrapper<UserCert>().in("user_id", collect));
-            }
-            for (User item : data) {
-                if (item.getDepartmentId() != 0) {
-                    Optional<Department> first = deptList.stream().filter(d -> d.getDepartmentId().equals(item.getDepartmentId())).findFirst();
-                    if(first.isPresent()){
-                        Department department =first.get();
-                        item.setDepartmentName(department.getDepartmentName());
-                    }
-                }
-                HSSFRow row = sheet.createRow(rowNum);
-                row.createCell(0).setCellValue(rowNum);
-                if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
-                    row.createCell(1).setCellValue("$userName="+(item.getCorpwxUserid()==null?" ":item.getCorpwxUserid())+"$");
-                }else {
-                    row.createCell(1).setCellValue(item.getName());
-                }
-                row.createCell(2).setCellValue(item.getRoleName());
-                row.createCell(3).setCellValue(item.getPhone());
-                if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
-                    row.createCell(4).setCellValue("$departmentName="+(item.getCorpwxDeptid()==null?" ":item.getCorpwxDeptid())+"$");
-                }else {
-                    row.createCell(4).setCellValue(item.getDepartmentName());
-                }
-                if(timeType.getReportAuditType()==5||timeType.getReportAuditType()==6){
-                    if(item.getSuperiorId()!=null){
-                        Optional<User> first = userList.stream().filter(u ->u.getId().equals(item.getSuperiorId())).findFirst();
-                        if(first.isPresent()){
-                            if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
-                                row.createCell(5).setCellValue("$userName="+(first.get().getCorpwxUserid()==null?" ":first.get().getCorpwxUserid())+"$");
-                            }else {
-                                row.createCell(5).setCellValue(first.get().getName());
-                            }
-                        }else {
-                            row.createCell(5).setCellValue("");
-                        }
-                    }else {
-                        row.createCell(5).setCellValue("");
-                    }
-
-                }
-                if (canViewCost) {
-                    row.createCell(6+auditIndex).setCellValue(item.getMonthCost()==null? 0 : item.getMonthCost().intValue());
-                    row.createCell(7+auditIndex).setCellValue(item.getCost() == null?0.0 : item.getCost().doubleValue());
-                }
-                List<UserCert> certList = userCertList.stream().distinct().filter(uc -> uc.getUserId().equals(item.getId())).collect(Collectors.toList());
-                if(certList.size()>0){
-                    String s="";
-                    for (int i = 0; i < certList.size(); i++) {
-                        if(i<certList.size()-1){
-                            s+=certList.get(i).getCertName()+" "+certList.get(i).getCertDate()+",";
-                        }else {
-                            s+=certList.get(i).getCertName()+" "+certList.get(i).getCertDate();
-                        }
-                    }
-                    row.createCell(8+minusIndex+auditIndex).setCellValue(s);
-                }else {
-                    row.createCell(8+minusIndex+auditIndex).setCellValue("");
-                }
-                for (int i = 0; i < userCustomList.size(); i++) {
-                    String value="";
-                    switch (i){
-                        case 0:value=item.getPlate1()==null?"":item.getPlate1();
-                            break;
-                        case 1:value=item.getPlate2()==null?"":item.getPlate2();
-                            break;
-                        case 2:value=item.getPlate3()==null?"":item.getPlate3();
-                            break;
-                        case 3:value=item.getPlate4()==null?"":item.getPlate4();
-                            break;
-                        case 4:value=item.getPlate5()==null?"":item.getPlate5();
-                            break;
-                    }
-                    row.createCell(9+i+minusIndex+auditIndex).setCellValue(value);
-                }
-                row.createCell(9+userCustomList.size()+minusIndex+auditIndex).setCellValue(item.getIsActive()==1?MessageUtils.message("excel.normal"):MessageUtils.message("access.deactivated"));
-                rowNum++;
-            }
-            //生成Excel文件
-            //String fileUrlSuffix = "员工列表" + System.currentTimeMillis() + ".xls";
-            String fileUrlSuffix = MessageUtils.message("excel.peopleList") + System.currentTimeMillis() + ".xls";
-            FileOutputStream fos = new FileOutputStream(path + fileUrlSuffix);
-            workbook.write(fos);
-            fos.flush();
-            fos.close();
-            if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
-                String mediaId = wxCorpInfoService.getTranslationMediaId(fileUrlSuffix);
-                String jobId = wxCorpInfoService.syncTranslation(wxCorpInfo.getCorpid(),mediaId,fileUrlSuffix, null);
-            /*if(jobId!=null&&!jobId.equals("")){
-                File file=new File(path + fileUrlSuffix);
-                if(file.exists()){
-                    file.delete();
-                }
-            }*/
-                int i = 0;
-                String syncTranslationResult = null;
-                /**
-                 * 异步上传转译文件的任务完成时会触发回调,在WeiXinCorpController中的commonDevCallbackPost实现了对回调的处理,存储到corpwxJobResult表中
-                 * 此处轮询查询本地数据库,检测到有任务的回调数据时继续执行查询操作
-                 */
-                while (i < 10) {
-                    Thread.sleep(300);
-                    CorpwxJobResult corpwxJobResult = corpwxJobCenter.get(jobId);
-                    if (corpwxJobResult != null) {
-                        if (corpwxJobResult.getErrCode() == 0) {
-                            syncTranslationResult = wxCorpInfoService.getSyncTranslationResult(jobId);
-                            corpwxJobCenter.remove(jobId);
-                        } else {
-                            httpRespMsg.setError(corpwxJobResult.getErrMsg());
-                            return httpRespMsg;
-                        }
-                        break;
-                    }
-                    i++;
-                }
-                if (syncTranslationResult != null) {
-                    httpRespMsg.data = syncTranslationResult;
-                } else {
-                    //httpRespMsg.setError("处理超时...");
-                    httpRespMsg.setError(MessageUtils.message("request.outTime"));
-                }
-            }else {
-                httpRespMsg.data = "/upload/" + fileUrlSuffix;
-            }
-        } catch (NullPointerException e) {
-            e.printStackTrace();
-            //httpRespMsg.setError("验证失败或缺少数据");
-            httpRespMsg.setError(MessageUtils.message("access.verErrorOrDataLack"));
-            return httpRespMsg;
-        } catch (IOException e) {
-            e.printStackTrace();
-            //httpRespMsg.setError("文件生成错误");
-            httpRespMsg.setError(MessageUtils.message("file.generateError"));
-            return httpRespMsg;
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-        return httpRespMsg;
-    }
 
     @Override
     public HttpRespMsg sendVcode(String mobile) {
@@ -2338,128 +2091,6 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
         return msg;
     }
 
-    @Override
-    public HttpRespMsg exportMembList(boolean isFill, String ids, HttpServletRequest request, String date) {
-        HttpRespMsg httpRespMsg = new HttpRespMsg();
-        try {
-            String userId = request.getHeader("Token");
-            User user = userMapper.selectById(userId);
-            List<String> strings = ListUtil.convertLongIdsArrayToList(ids);
-            List<Department> deptList = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id", user.getCompanyId()));
-            WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", user.getCompanyId()));
-            List<User> userList = userMapper.selectList(new QueryWrapper<User>().in("id", strings));
-            userList.forEach(u->{
-                Optional<Department> first = deptList.stream().filter(d -> d.getDepartmentId().equals(u.getDepartmentId())).findFirst();
-                if (first.isPresent()) {
-                    u.setDepartmentName(first.get().getDepartmentName());
-                }
-            });
-            //准备导出
-            HSSFWorkbook workbook = new HSSFWorkbook();
-            //HSSFSheet sheet = workbook.createSheet("人员列表");
-            HSSFSheet sheet = workbook.createSheet(MessageUtils.message("excel.perList"));
-            //创建表头
-            HSSFRow headRow = sheet.createRow(0);
-            //设置列宽 setColumnWidth的第二个参数要乘以256 这个参数的单位是1/256个字符宽度
-            sheet.setColumnWidth(0, 5 * 256);
-            sheet.setColumnWidth(1, 10 * 256);
-            sheet.setColumnWidth(2, 20 * 256);
-            //设置为居中加粗
-            HSSFCellStyle headStyle = workbook.createCellStyle();
-            HSSFFont font = workbook.createFont();
-            font.setBold(true);
-            headStyle.setFont(font);
-            //表头
-            HSSFCell headCell;
-            headCell = headRow.createCell(0);
-            //headCell.setCellValue("序号");
-            headCell.setCellValue(MessageUtils.message("entry.serialNo"));
-            headCell.setCellStyle(headStyle);
-            headCell = headRow.createCell(1);
-            //headCell.setCellValue("姓名");
-            headCell.setCellValue(MessageUtils.message("entry.name"));
-            headCell.setCellStyle(headStyle);
-            headCell = headRow.createCell(2);
-            //headCell.setCellValue("部门");
-            headCell.setCellValue(MessageUtils.message("excel.department"));
-            headCell.setCellStyle(headStyle);
-
-            //新增数据行 并且装填数据
-            int rowNum = 1;
-            for (User item : userList) {
-                HSSFRow row = sheet.createRow(rowNum);
-                row.createCell(0).setCellValue(rowNum);
-                if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
-                    row.createCell(1).setCellValue("$userName="+(item.getCorpwxUserid()==null?"":item.getCorpwxUserid())+"$");
-                    row.createCell(2).setCellValue("$departmentName="+(item.getCorpwxDeptid()==null?"":item.getCorpwxDeptid())+"$");
-                }else {
-                    row.createCell(1).setCellValue(item.getName());
-                    row.createCell(2).setCellValue(item.getDepartmentName());
-                }
-                rowNum++;
-            }
-            //生成Excel文件
-            //String fileUrlSuffix = date+(isFill?"已填":"未填")+"人员列表" + System.currentTimeMillis() + ".xls";
-            String fileUrlSuffix = date+(isFill?MessageUtils.message("excel.Filled"):MessageUtils.message("excel.notFilled"))+MessageUtils.message("excel.perList") + System.currentTimeMillis() + ".xls";
-            FileOutputStream fos = new FileOutputStream(path + fileUrlSuffix);
-            workbook.write(fos);
-            fos.flush();
-            fos.close();
-            if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
-                String mediaId = wxCorpInfoService.getTranslationMediaId(fileUrlSuffix);
-                String jobId = wxCorpInfoService.syncTranslation(wxCorpInfo.getCorpid(),mediaId,fileUrlSuffix, null);
-            /*if(jobId!=null&&!jobId.equals("")){
-                File file=new File(path + fileUrlSuffix);
-                if(file.exists()){
-                    file.delete();
-                }
-            }*/
-                int i = 0;
-                String syncTranslationResult = null;
-                /**
-                 * 异步上传转译文件的任务完成时会触发回调,在WeiXinCorpController中的commonDevCallbackPost实现了对回调的处理,存储到corpwxJobResult表中
-                 * 此处轮询查询本地数据库,检测到有任务的回调数据时继续执行查询操作
-                 */
-                while (i < 10) {
-                    Thread.sleep(300);
-                    CorpwxJobResult corpwxJobResult = corpwxJobCenter.get(jobId);
-                    if (corpwxJobResult != null) {
-                        if (corpwxJobResult.getErrCode() == 0) {
-                            syncTranslationResult = wxCorpInfoService.getSyncTranslationResult(jobId);
-                            corpwxJobCenter.remove(jobId);
-                        } else {
-                            httpRespMsg.setError(corpwxJobResult.getErrMsg());
-                            return httpRespMsg;
-                        }
-                        break;
-                    }
-                    i++;
-                }
-                if (syncTranslationResult != null) {
-                    httpRespMsg.data = syncTranslationResult;
-                } else {
-                    //httpRespMsg.setError("处理超时...");
-                    httpRespMsg.setError(MessageUtils.message("request.outTime"));
-                }
-            }else {
-                httpRespMsg.data = "/upload/" + fileUrlSuffix;
-            }
-        } catch (NullPointerException e) {
-            //httpRespMsg.setError("验证失败或缺少数据");
-            httpRespMsg.setError(MessageUtils.message("access.verErrorOrDataLack"));
-            return httpRespMsg;
-        } catch (IOException e) {
-            //httpRespMsg.setError("文件生成错误");
-            httpRespMsg.setError(MessageUtils.message("file.generateError"));
-            return httpRespMsg;
-        }catch (Exception e){
-            e.printStackTrace();
-            httpRespMsg.setError(MessageUtils.message("access.verErrorOrDataLack"));
-            return httpRespMsg;
-        }
-        return httpRespMsg;
-    }
-
     @Override
     public HttpRespMsg getHRList(HttpServletRequest request) {
         HttpRespMsg msg = new HttpRespMsg();

+ 1 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/WxCorpInfoServiceImpl.java

@@ -8,6 +8,7 @@ import com.management.platform.controller.WeiXinCorpController;
 import com.management.platform.entity.*;
 import com.management.platform.mapper.*;
 import com.management.platform.service.TimeTypeService;
+import com.management.platform.service.UserService;
 import com.management.platform.service.WxCorpInfoService;
 import com.management.platform.service.WxCorpTemplateService;
 import com.management.platform.task.SFTPAsyncUploader;

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

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

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

@@ -386,7 +386,7 @@
 
     <!--获取某个项目每个人分别需要的工时-->
     <select id="getProjectCost" resultType="java.util.Map">
-        SELECT b.id as creatorId,a.project_id as projectId, b.name,b.corpwx_userid as corpwxUserId,a.dept_id as deptId,department.corpwx_deptid as corpwxDeptId, IFNULL(department.department_name, '未分配') as departmentName, SUM(a.working_time) AS cost, SUM(a.cost) AS costMoney
+        SELECT b.id as creatorId,a.project_id as projectId, b.name,b.corpwx_userid as corpwxUserId,a.dept_id as deptId,department.corpwx_deptid as corpwxDeptId,department.dd_deptid as corpDdDeptId, IFNULL(department.department_name, '未分配') as departmentName, SUM(a.working_time) AS cost, SUM(a.cost) AS costMoney
         FROM report AS a
         JOIN user AS b ON a.creator_id = b.id
         left join department on department.department_id = a.dept_id

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

@@ -996,8 +996,10 @@
     </select>
 
     <select id="getUserReportTimelinessRate" resultType="java.util.Map">
-        select `user`.name as userName,`user`.corpwx_userid as corpwxUserId,`user`.corpwx_deptid as corpwxDeptId,rl.create_date as createDate,MIN(rl.operate_date )as createTime from report_log rl
+        select `user`.name as userName,`user`.corpwx_userid as corpwxUserId,d.dd_deptid as corpDdDeptId,`user`.corpwx_deptid as corpwxDeptId,rl.create_date as createDate,MIN(rl.operate_date )as createTime
+        from report_log rl
         left join `user` on `user`.id=rl.operator_id
+        left join department d on `user`.department_id=d.department_id
         where rl.company_id=#{companyId}
         and rl.create_date between  #{startDate} and #{endDate}
         and rl.msg like '%提交了%'

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

@@ -277,4 +277,87 @@
         </if>
         group by project_id) group by task.project_id
     </select>
+
+    <select id="userTaskCompleteDetail" resultType="java.util.Map">
+        SELECT u.id as userId, u.name AS userName,u.corpwx_userid AS corpWxUserId,d.corpwx_deptid AS corpWxDeptId,d.department_name AS deptName,COUNT(t.name) AS allNum,COUNT(CASE WHEN t.task_status=0 THEN 1 END) AS noCompletedNum,COUNT(CASE WHEN t.task_status=1 THEN 1 END) AS completedNum,
+        COUNT(CASE WHEN t.finish_date &lt;= t.end_date AND t.task_status=1  THEN 1 END) AS onTimeNum,COUNT(CASE WHEN t.finish_date>t.end_date AND t.task_status=1 THEN 1 END) AS noOnTimeNum,
+        CONCAT(FORMAT(COUNT(CASE WHEN t.task_status=0 THEN 1 END)/COUNT(t.name)*100, 2), '%') AS noCompletedPercent,CONCAT(FORMAT(COUNT(CASE WHEN t.finish_date &lt;= t.end_date AND t.task_status=1  THEN 1 END)/COUNT(t.name)*100, 2), '%') AS onTimePercent
+        FROM
+        task_executor te
+        LEFT JOIN user u ON te.executor_id=u.id
+        LEFT JOIN department d ON u.department_id=d.department_id
+        LEFT JOIN task t ON te.task_id=t.`id`
+        WHERE u.company_id=#{companyId}
+        <if test="startDate!=null and startDate!='' and endDate!=null and endDate!=''">
+            AND t.start_date &lt; #{endDate} AND t.end_date &gt; #{startDate}
+        </if>
+        <if test="userId!=null and userId!=''">
+            and u.id=#{userId}
+        </if>
+        <if test="deptId!=null">
+         and d.department_id=#{deptId}
+        </if>
+        <if test="list!=null and list.size()>0">
+            and  d.department_id in
+            <foreach collection="list" item="item" open="(" close=")" separator=",">
+                #{item}
+            </foreach>
+        </if>
+        group by te.executor_id
+        <if test="pageStart != null and pageSize != null">
+            limit #{pageStart}, #{pageSize}
+        </if>
+    </select>
+
+    <select id="userTaskCompleteDetailCount" resultType="java.lang.Integer">
+        select count(1) from (
+        SELECT u.id as userId
+        FROM
+        task_executor te
+        LEFT JOIN user u ON te.executor_id=u.id
+        LEFT JOIN department d ON u.department_id=d.department_id
+        LEFT JOIN task t ON te.task_id=t.`id`
+        WHERE u.company_id=#{companyId}
+        <if test="startDate!=null and startDate!='' and endDate!=null and endDate!=''">
+            AND t.start_date &lt; #{endDate} AND t.end_date &gt; #{startDate}
+        </if>
+        <if test="userId!=null and userId!=''">
+            and u.id=#{userId}
+        </if>
+        <if test="deptId!=null">
+            and d.department_id=#{deptId}
+        </if>
+        <if test="list!=null and list.size()>0">
+            and  d.department_id in
+            <foreach collection="list" item="item" open="(" close=")" separator=",">
+                #{item}
+            </foreach>
+        </if>
+        group by te.executor_id
+        ) as total
+    </select>
+
+    <select id="getTaskByUserId" resultType="java.util.Map">
+        SELECT t.`name` AS taskName,GROUP_CONCAT(u.name) AS executorNames,GROUP_CONCAT(u.corpwx_userid) AS executorCorpWxUserIds,
+        date_format(t.`start_date`,'%Y-%m-%d') AS startDate,date_format(t.`end_date`,'%Y-%m-%d') AS endDate,date_format(t.`finish_date`,'%Y-%m-%d') AS finishDate,
+        (CASE t.`task_status` WHEN 0 THEN '进行中' WHEN 1 THEN '已完成' ELSE '已撤销' END) AS stateValue
+        FROM
+        task_executor te
+        LEFT JOIN USER u ON te.executor_id=u.id
+        LEFT JOIN task t ON te.task_id=t.`id`
+        WHERE t.start_date &lt; #{endDate} AND t.end_date &gt; #{startDate} AND FIND_IN_SET(#{userId},t.`executor_id`) GROUP BY t.`id`
+        <if test="pageStart != null and pageSize != null">
+            limit #{pageStart}, #{pageSize}
+        </if>
+    </select>
+    <select id="getTaskByUserIdCount" resultType="java.lang.Integer">
+        select count(1) from (
+        SELECT t.`name` AS taskName
+        FROM
+        task_executor te
+        LEFT JOIN USER u ON te.executor_id=u.id
+        LEFT JOIN task t ON te.task_id=t.`id`
+        WHERE t.start_date &lt; #{endDate} AND t.end_date &gt; #{startDate} AND FIND_IN_SET(#{userId},t.`executor_id`) GROUP BY t.`id`
+        )as total
+    </select>
 </mapper>

+ 12 - 12
fhKeeper/formulahousekeeper/timesheet/src/components/cascader.vue

@@ -3,18 +3,18 @@
     <div :class="disabled ? 'disabledTrue' : 'disabledFalse'" @mouseenter="moveIonDiv" @mouseleave="outIonDiv">
         <div :style="`width:${selectWidth}px;height:${selectHeight}px`" :class="classDiv ? 'select selectDiv' : 'select'" @click.stop="selectCli" :ref="disabled ? '' : 'selectDiv'">
             <div :style="'line-height: '+selectHeight+'px;font-size: '+selectFontSize+'px;'" :class="(selectName == $t('defaultText.pleaseChoose') || selectName == $t('qing-xuan-ze-bu-men') || selectName == $t('other.allDepartments')) ? 'selecttex selecttexXuan' : 'selecttex'">
-                <!-- <ww-open-data type='departmentName' :openid='selectName'></ww-open-data> -->
+                <!-- <TranslationOpenDataText type='departmentName' :openid='selectName'></TranslationOpenDataText> -->
                 <!-- {{selectName}} -->
                  <span v-if="userName">
                     <span v-if="selectNameType == 'dep'">
-                        <ww-open-data type='departmentName' :openid='selectName'></ww-open-data>
+                        <TranslationOpenDataText type='departmentName' :openid='selectName'></TranslationOpenDataText>
                     </span>
                     <span v-if="selectNameType == 'user'">
-                        <ww-open-data type='userName' :openid='selectName'></ww-open-data>
+                        <TranslationOpenDataText type='userName' :openid='selectName'></TranslationOpenDataText>
                     </span>
                 </span>
                 <span v-if="!userName">
-                    <ww-open-data type='departmentName' :openid='selectName'></ww-open-data>
+                    <TranslationOpenDataText type='departmentName' :openid='selectName'></TranslationOpenDataText>
                 </span>
             </div>
             <i :class="move ? 'el-icon-arrow-down iostu iostuHover' : 'el-icon-arrow-down iostu'" v-if="!moveIon"></i>
@@ -30,16 +30,16 @@
                         <!-- {{item.label}} -->
                         <span v-if="userName">
                             <span v-if="item.type == 'dep'">
-                                <ww-open-data type='departmentName' :openid='item.label'></ww-open-data>
+                                <TranslationOpenDataText type='departmentName' :openid='item.label'></TranslationOpenDataText>
                             </span>
                             <span v-if="item.type == 'user'">
-                                <ww-open-data type='userName' :openid='item.label'></ww-open-data>
+                                <TranslationOpenDataText type='userName' :openid='item.label'></TranslationOpenDataText>
                             </span>
                         </span>
                         <span v-if="!userName">
-                            <ww-open-data type='departmentName' :openid='item.label'></ww-open-data>
+                            <TranslationOpenDataText type='departmentName' :openid='item.label'></TranslationOpenDataText>
                         </span>
-                        <!-- <ww-open-data type='departmentName' :openid='item.label'></ww-open-data> -->
+                        <!-- <TranslationOpenDataText type='departmentName' :openid='item.label'></TranslationOpenDataText> -->
                     </span>
                     <span v-if="radios && !fistRadio" style="margin-left: -15px">
                         <el-radio v-model="optionsOId" :label="item.value">
@@ -47,16 +47,16 @@
                                 <!-- {{item.label}}  -->
                                 <span v-if="userName">
                                     <span v-if="item.type == 'dep'">
-                                        <ww-open-data type='departmentName' :openid='item.label'></ww-open-data>
+                                        <TranslationOpenDataText type='departmentName' :openid='item.label'></TranslationOpenDataText>
                                     </span>
                                     <span v-if="item.type == 'user'">
-                                        <ww-open-data type='userName' :openid='item.label'></ww-open-data>
+                                        <TranslationOpenDataText type='userName' :openid='item.label'></TranslationOpenDataText>
                                     </span>
                                 </span>
                                 <span v-if="!userName">
-                                    <ww-open-data type='departmentName' :openid='item.label'></ww-open-data>
+                                    <TranslationOpenDataText type='departmentName' :openid='item.label'></TranslationOpenDataText>
                                 </span>
-                                <!-- <ww-open-data type='departmentName' :openid='item.label'></ww-open-data> -->
+                                <!-- <TranslationOpenDataText type='departmentName' :openid='item.label'></TranslationOpenDataText> -->
                             </span>
                         </el-radio>
                     </span>

+ 8 - 8
fhKeeper/formulahousekeeper/timesheet/src/components/cascaderOption.vue

@@ -7,16 +7,16 @@
                     <!-- {{item.label}} -->
                     <span v-if="userName">
                         <span v-if="item.type == 'dep'">
-                            <ww-open-data type='departmentName' :openid='item.label'></ww-open-data>
+                            <TranslationOpenDataText type='departmentName' :openid='item.label'></TranslationOpenDataText>
                         </span>
                         <span v-if="item.type == 'user'">
-                            <ww-open-data type='userName' :openid='item.label'></ww-open-data>
+                            <TranslationOpenDataText type='userName' :openid='item.label'></TranslationOpenDataText>
                         </span>
                     </span>
                     <span v-if="!userName">
-                        <ww-open-data type='departmentName' :openid='item.label'></ww-open-data>
+                        <TranslationOpenDataText type='departmentName' :openid='item.label'></TranslationOpenDataText>
                     </span>
-                    <!-- <ww-open-data type='departmentName' :openid='item.label'></ww-open-data> -->
+                    <!-- <TranslationOpenDataText type='departmentName' :openid='item.label'></TranslationOpenDataText> -->
                 </span>
                 <span v-if="radios" style="margin-left: -15px">
                     <el-radio v-model="departmentId" :label="item.value">
@@ -24,16 +24,16 @@
                             <!-- {{item.label}}  -->
                             <span v-if="userName">
                                 <span v-if="item.type == 'dep'">
-                                    <ww-open-data type='departmentName' :openid='item.label'></ww-open-data>
+                                    <TranslationOpenDataText type='departmentName' :openid='item.label'></TranslationOpenDataText>
                                 </span>
                                 <span v-if="item.type == 'user'">
-                                    <ww-open-data type='userName' :openid='item.label'></ww-open-data>
+                                    <TranslationOpenDataText type='userName' :openid='item.label'></TranslationOpenDataText>
                                 </span>
                             </span>
                             <span v-if="!userName">
-                                <ww-open-data type='departmentName' :openid='item.label'></ww-open-data>
+                                <TranslationOpenDataText type='departmentName' :openid='item.label'></TranslationOpenDataText>
                             </span>
-                            <!-- <ww-open-data type='departmentName' :openid='item.label'></ww-open-data> -->
+                            <!-- <TranslationOpenDataText type='departmentName' :openid='item.label'></TranslationOpenDataText> -->
                         </span>
                     </el-radio>
                 </span>

+ 7 - 7
fhKeeper/formulahousekeeper/timesheet/src/components/select.vue

@@ -5,14 +5,14 @@
     <div :class="disabled ? 'disabledTrue' : 'disabledFalse'" @mouseenter="moveIonDiv" @mouseleave="outIonDiv">
         <div :style="`width:${selectWidth}px;height:${selectHeight}px`" :class="classDiv ? 'select selectDiv' : 'select'" @click="selectCli" :ref="disabled ? '' : 'selectDiv'">
             <div v-if="!multiSelect" :style="'line-height: '+selectHeight+'px;font-size: '+selectFontSize+'px;'" :class="selectName == $t('defaultText.pleaseChoose') ? 'selecttex selecttexXuan' : 'selecttex'">
-                <ww-open-data type='userName' :openid='selectName'></ww-open-data>
+                <TranslationOpenDataText type='userName' :openid='selectName'></TranslationOpenDataText>
                 <!-- {{selectName}} -->
             </div>
             <div v-if="multiSelect" :style="'line-height: '+selectHeight+'px;margin-left: -10px'" :class="selectName == $t('defaultText.pleaseChoose') ? 'selecttex selecttexXuan' : 'selecttex'">
                 <span v-if="multiSelectList.length > 0">
                     <span v-if="!tile" style="width: 100%">
                         <span class="all">
-                            <ww-open-data type='userName' :openid='multiSelectList[0].name'></ww-open-data>
+                            <TranslationOpenDataText type='userName' :openid='multiSelectList[0].name'></TranslationOpenDataText>
                             <!-- {{multiSelectList[0].name}} -->
                             <i class="el-icon-error" v-if="!disabled" @click.stop="deleteMultiSelectList('-1')"></i>
                         </span>
@@ -20,7 +20,7 @@
                     </span>
                     <span v-if="tile" style="width: 100%">
                         <span class="all" style="margin-right: 6px" v-for="(items, indexs) in multiSelectList" :key="indexs">
-                            <ww-open-data type='userName' :openid='items.name'></ww-open-data>
+                            <TranslationOpenDataText type='userName' :openid='items.name'></TranslationOpenDataText>
                             <!-- {{items.name}} -->
                             <span v-if="items.jobNumber" class="spanFllat">{{items.jobNumber}}</span>
                             <i class="el-icon-error" @click.stop="deleteMultiSelectList(indexs)" v-if="!disabled"></i>
@@ -44,10 +44,10 @@
                 <li :class="transitionBoxLiIdx == index ? 'liHover' : ''" v-for="(item, index) in options" :key="index" @mouseover="liMouseOver(index)" @click="liClick(item, index)"> 
                     <span v-if="!multiSelect" style="width: 100%">
                         <span v-if="item.name">
-                            <ww-open-data type='userName' :openid='item.name'></ww-open-data>
+                            <TranslationOpenDataText type='userName' :openid='item.name'></TranslationOpenDataText>
                         </span> 
                         <span v-if="item.auditorName">
-                            <ww-open-data type='userName' :openid='item.auditorName'></ww-open-data>
+                            <TranslationOpenDataText type='userName' :openid='item.auditorName'></TranslationOpenDataText>
                         </span>
                         <!-- {{item.name || item.auditorName}} -->
                         <span v-if="item.jobNumber" class="spanFllat">{{item.jobNumber}}</span>
@@ -56,7 +56,7 @@
                     <span v-if="multiSelect" style="width: 100%">
                         <span :class="item.flg ? 'hoverSpan hoverSpanHover' : 'hoverSpan'">
                             <span style="width: 100%;display: inline-block;">
-                                <ww-open-data type='userName' :openid='item.name'></ww-open-data>
+                                <TranslationOpenDataText type='userName' :openid='item.name'></TranslationOpenDataText>
                                 <!-- {{item.name}} -->
                                 <span v-if="item.jobNumber" class="spanFllat">{{item.jobNumber}}</span>
                             </span>
@@ -72,7 +72,7 @@
   <div v-if="wxCope" class="waihez">
     <!-- <div @click="dianjis()">点击</div> -->
     <div :style="`width:${selectWidth}px;height:${selectHeight}px;line-height:${selectHeight}px;background:#fff`" class="select selectDandu" @click="dianjis()">
-        <span v-if="!multiSelect"><ww-open-data type='userName' :openid='selectName'></ww-open-data></span>
+        <span v-if="!multiSelect"><TranslationOpenDataText type='userName' :openid='selectName'></TranslationOpenDataText></span>
         <!-- <span>你好</span> -->
     </div>
   </div>

+ 14 - 14
fhKeeper/formulahousekeeper/timesheet/src/components/taskComponent.vue

@@ -155,7 +155,7 @@
                                             {{item.name}}
                                         </span>
                                         <span v-if="user.userNameNeedTranslate == '1'">
-                                            <ww-open-data type='userName' :openid='item.name'></ww-open-data>
+                                            <TranslationOpenDataText type='userName' :openid='item.name'></TranslationOpenDataText>
                                         </span>
                                     </span>
                                 </el-checkbox>
@@ -192,7 +192,7 @@
                                     {{recentProgressInfo.creatorName}}
                                 </span>
                                 <span v-if="user.userNameNeedTranslate == '1'">
-                                    <ww-open-data type='userName' :openid='recentProgressInfo.creatorName'></ww-open-data>
+                                    <TranslationOpenDataText type='userName' :openid='recentProgressInfo.creatorName'></TranslationOpenDataText>
                                 </span>
                             </span>
                             {{ $t('geng-xin-yu') }}{{recentProgressInfo.indate | relativeTime}}
@@ -299,7 +299,7 @@
                                     </span>
                                     <span v-else>
                                         <span v-for="item,index in scope.row.executorName" :key="index">
-                                            <ww-open-data type='userName' :openid='item'></ww-open-data>
+                                            <TranslationOpenDataText type='userName' :openid='item'></TranslationOpenDataText>
                                             <span v-if="index < scope.row.executorName.length - 1">,</span>
                                         </span>
                                     </span>
@@ -347,7 +347,7 @@
                         <div>
                             <span v-if="user.userNameNeedTranslate != 1">{{scope.row.creatorName}}</span>
                             <span v-if="user.userNameNeedTranslate == 1">
-                                <ww-open-data type='userName' :openid='scope.row.creatorName'></ww-open-data>
+                                <TranslationOpenDataText type='userName' :openid='scope.row.creatorName'></TranslationOpenDataText>
                             </span>
                         </div>
                     </template>
@@ -419,7 +419,7 @@
                         <span  v-for="(pl, i) in critic" :key="i">
                         <span style="background: #778899" v-if="user.userNameNeedTranslate != 1">{{pl.length > 2 ? pl.substring(pl.length - 2, pl.length) : pl}}</span>
                         <span v-if="user.userNameNeedTranslate == 1">
-                            <ww-open-data type='userName' :openid='pl'></ww-open-data>
+                            <TranslationOpenDataText type='userName' :openid='pl'></TranslationOpenDataText>
                         </span>
                         </span>
                         <!-- <span style="background: #778899">{{pl.length}}</span> -->
@@ -446,7 +446,7 @@
                                     {{item.userName.length > 2 ? item.userName.substring(item.userName.length - 2, item.userName.length) : item.userName}}
                                 </i>   
                                 <i v-if="user.userNameNeedTranslate == 1">
-                                    <ww-open-data type='userName' :openid='item.userName'></ww-open-data>
+                                    <TranslationOpenDataText type='userName' :openid='item.userName'></TranslationOpenDataText>
                                 </i>
                             </i>
                             <div>
@@ -456,14 +456,14 @@
                                         {{item.userName}}
                                     </p>
                                     <p v-if="user.userNameNeedTranslate == 1">
-                                        <ww-open-data type='userName' :openid='item.userName'></ww-open-data>
+                                        <TranslationOpenDataText type='userName' :openid='item.userName'></TranslationOpenDataText>
                                     </p>
                                 <!-- </p> -->
                                 <em>
                                     <p style="display: inline-block;padding: 0;margin: 0;" v-if="user.userNameNeedTranslate == 1">
                                         <template v-for="listItem in item.newContent">
                                             <template v-if="listItem.type == 'user'">
-                                                <ww-open-data type='userName' :openid='listItem.value'></ww-open-data>
+                                                <TranslationOpenDataText type='userName' :openid='listItem.value'></TranslationOpenDataText>
                                             </template>
                                             <template v-if="listItem.type == 'text'">{{ listItem.value }}</template>
                                         </template>
@@ -474,7 +474,7 @@
                                     <span class="commentSpan" v-if="user.timeType.restartTaskNeedReason == 1 && item.taskPersonLiableList.length > 0">责任人: 
                                         <span v-for="responsibility, responsibilityIndex in item.taskPersonLiableList" :key="responsibilityIndex">
                                             <span v-if="user.userNameNeedTranslate == 1">
-                                                <ww-open-data type='userName' :openid='responsibility.userName'></ww-open-data>
+                                                <TranslationOpenDataText type='userName' :openid='responsibility.userName'></TranslationOpenDataText>
                                             </span>
                                             <span v-if="user.userNameNeedTranslate != 1">{{responsibility.userName}}</span>
                                             <span v-if="responsibilityIndex < item.taskPersonLiableList.length - 1">,</span>
@@ -492,7 +492,7 @@
                             <p>
                                 {{ $t('tian-bao-ren') }}: <span v-if="user.userNameNeedTranslate != 1">{{item2.userName}}</span>
                                 <span v-if="user.userNameNeedTranslate == 1">
-                                    <ww-open-data type='userName' :openid='item2.userName'></ww-open-data>
+                                    <TranslationOpenDataText type='userName' :openid='item2.userName'></TranslationOpenDataText>
                                 </span>
                                 <span style="float: right;">{{item2.createDate}}</span>
                             </p>
@@ -504,7 +504,7 @@
                                                 <!-- 待项目审核人 --> {{$t('other.waitForTheProjectReviewer')}}
                                                 <span v-if="item2.projectAuditorName != null">(
                                                     <span v-if="user.userNameNeedTranslate == '1'">
-                                                        <ww-open-data type='userName' :openid='item2.projectAuditorName'></ww-open-data>
+                                                        <TranslationOpenDataText type='userName' :openid='item2.projectAuditorName'></TranslationOpenDataText>
                                                     </span>
                                                     <span v-if="user.userNameNeedTranslate != '1'">{{item2.projectAuditorName}}</span>
                                                     )</span> 
@@ -515,7 +515,7 @@
                                                 <span v-if="item2.projectAuditorName != null">(
                                                     <!-- {{item2.projectAuditorName}} -->
                                                     <span v-if="user.userNameNeedTranslate == '1'">
-                                                        <ww-open-data type='userName' :openid='item2.projectAuditorName'></ww-open-data>
+                                                        <TranslationOpenDataText type='userName' :openid='item2.projectAuditorName'></TranslationOpenDataText>
                                                     </span>
                                                     <span v-if="user.userNameNeedTranslate != '1'">{{item2.projectAuditorName}}</span>
                                                     )</span>
@@ -525,7 +525,7 @@
                                         <span v-else-if="item2.isDeptAudit==1">
                                             ({{$t('other.await')}}
                                             <span v-if="user.userNameNeedTranslate == '1'">
-                                                <ww-open-data type='departmentName' :openid='item2.auditDeptName'></ww-open-data>
+                                                <TranslationOpenDataText type='departmentName' :openid='item2.auditDeptName'></TranslationOpenDataText>
                                             </span>
                                             <span v-if="user.userNameNeedTranslate != '1'">{{item2.auditDeptName}}</span>
                                             {{$t('other.audit')}})
@@ -549,7 +549,7 @@
                                                 {{item2.projectAuditorName}}
                                             </span>
                                             <span v-if="user.userNameNeedTranslate == 1">
-                                                <ww-open-data type='userName' :openid='item2.projectAuditorName'></ww-open-data>
+                                                <TranslationOpenDataText type='userName' :openid='item2.projectAuditorName'></TranslationOpenDataText>
                                             </span>
                                         )
                                     </span>{{$t('other.audit')}}</span>

+ 129 - 0
fhKeeper/formulahousekeeper/timesheet/src/components/translationOpenData.vue

@@ -0,0 +1,129 @@
+<template>
+    <div class="translation">
+        <!-- 文本 -->
+        <template v-if="renderType[configuration.renderIndex] === 'text'">
+            <span v-if="corporateWeChat && !noRender.includes(translationValue)">
+                <ww-open-data :type='configuration.openType' :openid='translationValue'></ww-open-data>
+            </span>
+            <span v-else-if="dingdingPlatform && !noRender.includes(translationValue)">
+                <dt-open-data :open-type='configuration.openType' :open-id='translationValue'></dt-open-data>
+            </span>
+            <span v-else>{{ translationValue }}</span>
+        </template>
+        <!-- 数组 -->
+        <template v-if="renderType[configuration.renderIndex] === 'array'">
+
+        </template>
+        <!-- 对象 -->
+        <template v-if="renderType[configuration.renderIndex] === 'object'">
+
+        </template>
+    </div>
+</template>
+
+<script>
+export default {
+    name: '',
+    components: {},
+    props: {
+        configurationItems: {
+            type: Object,
+            default: () => {
+                return {
+                    openType: 'userName',
+                    openId: '',
+                    renderIndex: 0, // 0: 纯文本,1:数组,2:显示工号
+                }
+            }
+        }
+    },
+    data() {
+        return {
+            user: JSON.parse(sessionStorage.getItem("user")),
+            renderType: ['text', 'array', 'object'],
+            corporateWeChat: false, // 企业微信转译
+            dingdingPlatform: false, // 钉钉转译
+
+            translationValue: '', // 文本转译值
+            translationValArray: [], // 数组转译值
+            translationValObject: {}, // 对象转译值
+
+            configuration: {
+                openType: 'userName',
+                openId: '',
+                renderIndex: 0,
+            }, // 配置对象
+
+            noRender: ['全部人员', '未分配']
+        }
+    },
+    computed: {},
+    watch: {
+        configurationItems: {
+            handler(newVal, oldVal) {
+                this.assignmentValue(newVal)
+            },
+        }
+    },
+    created() { },
+    mounted() {
+        this.dealWith()
+    },
+    methods: {
+        dealWith() {
+            console.log(this.user)
+            const { userNameNeedTranslate, dingdingUserid } = this.user
+            if (userNameNeedTranslate) {
+                this.corporateWeChat = true
+                if (dingdingUserid) {
+                    this.dingdingPlatform = true
+                    this.corporateWeChat = false
+                } else {
+                    this.dingdingPlatform = false
+                }
+            } else {
+                this.corporateWeChat = false
+                this.dingdingPlatform = false
+            }
+            // console.log(this.corporateWeChat, this.dingdingPlatform, this.configurationItems)
+            // console.log(this.corporateWeChat, '<=== 企业微信转译')
+            // console.log(this.dingdingPlatform, '<=== 钉钉转译')
+            this.assignmentValue(this.configurationItems)
+        },
+        assignmentValue(value) {
+            const { openType, openId, renderIndex = 0 } = value
+            this.configuration = { openType, openId, renderIndex }
+            const type = this.renderType[renderIndex]
+
+            switch (type) {
+                case 'text':
+                    this.translationValue = openId
+                    break;
+                case 'array':
+                    this.translationValArray = openId.split(',')
+                    break;
+                case 'object':
+                    this.translationValObject = openId
+                    break;
+                default:
+                    break;
+            }
+            // console.log(this.translationValue, '<=== 转译文本')
+            if (this.user.dingdingUserid) {
+                this.viewConfiguration()
+            }
+        },
+        viewConfiguration() {
+            setTimeout(() => {
+                window.DTOpenData.update(document.querySelectorAll('dt-open-data'));
+            }, 100);
+        }
+    },
+}
+</script>
+<style scoped lang='scss'>
+.translation {
+    width: auto;
+    display: inline-block;
+}
+</style>

+ 90 - 0
fhKeeper/formulahousekeeper/timesheet/src/components/translationOpenDataText.vue

@@ -0,0 +1,90 @@
+<template>
+    <div class="translation">
+        <!-- 文本 -->
+        <span v-if="corporateWeChat">
+            <ww-open-data :type='type' :openid='openIdValue'></ww-open-data>
+        </span>
+        <span v-else-if="dingdingPlatform">
+            <dt-open-data :open-type='type' :open-id='openIdValue'></dt-open-data>
+        </span>
+        <span v-else>{{ openIdValue }}</span>
+    </div>
+</template>
+
+<script>
+
+export default {
+    name: '',
+    components: {},
+    props: {
+        type: {
+            type: String,
+            default: 'userName'
+        },
+        openid: {
+            type: [String, Number],
+            default: ''
+        }
+    },
+    data() {
+        return {
+            user: JSON.parse(sessionStorage.getItem("user")),
+            corporateWeChat: false, // 企业微信转译
+            dingdingPlatform: false, // 钉钉转译
+
+            openIdValue: ''
+        }
+    },
+    computed: {},
+    watch: {
+        openid: {
+            handler(newVal, oldVal) {
+                this.assignmentValue(newVal)
+            },
+        }
+    },
+    created() { },
+    mounted() {
+        this.dealWith()
+    },
+    methods: {
+        dealWith() {
+            console.log(this.user)
+            const { userNameNeedTranslate, dingdingUserid } = this.user
+            if (userNameNeedTranslate) {
+                this.corporateWeChat = true
+                if (dingdingUserid) {
+                    this.dingdingPlatform = true
+                    this.corporateWeChat = false
+                } else {
+                    this.dingdingPlatform = false
+                }
+            } else {
+                this.corporateWeChat = false
+                this.dingdingPlatform = false
+            }
+            // console.log(this.corporateWeChat, this.dingdingPlatform, this.configurationItems)
+            // console.log(this.corporateWeChat, '<=== 企业微信转译')
+            // console.log(this.dingdingPlatform, '<=== 钉钉转译')
+            this.assignmentValue(this.openid)
+        },
+        assignmentValue(value) {
+            this.openIdValue = value
+            if (this.user.dingdingUserid) {
+                this.viewConfiguration()
+            }
+        },
+        viewConfiguration() {
+            setTimeout(() => {
+                window.DTOpenData.update(document.querySelectorAll('dt-open-data'));
+            }, 100);
+        }
+    },
+}
+</script>
+<style scoped lang='scss'>
+.translation {
+    width: auto;
+    display: inline-block;
+}
+</style>

+ 6 - 0
fhKeeper/formulahousekeeper/timesheet/src/main.js

@@ -74,6 +74,12 @@ Vue.use(VueTour)
 import Print from './assets/js/print.js'
 Vue.use(Print)
 
+// 全局转译组件
+import TranslationOpenData from '@/components/translationOpenData.vue'
+import TranslationOpenDataText from '@/components/translationOpenDataText.vue'
+Vue.component('TranslationOpenData', TranslationOpenData)
+Vue.component('TranslationOpenDataText', TranslationOpenDataText)
+
 var addRouFlag = false; 
 //角色权限对应关系
 var userModules = [{role:0, modules:["工时报告","专业审核","部门审核","自动计时","费用报销","待办任务", "项目管理", "请假管理", "审批流设置"]},

+ 1 - 0
fhKeeper/formulahousekeeper/timesheet/src/permissions.js

@@ -269,6 +269,7 @@ const StringUtil = {
         arr[i] == '全部分组耗用进度表' || arr[i] == '负责部门分组耗用进度表' ? obj.reportProjectConsumptionFirst = true : ''
         arr[i] == '全部项目耗用进度表' || arr[i] == '负责部门项目耗用进度表' ? obj.reportProjectConsumptionTwo = true : ''
         arr[i] == '全部员工任务进度表' || arr[i] == '负责部门员工任务进度表' ? obj.reportStaffTaskAccomplished = true : ''
+        arr[i] == '全部员工任务完成情况表' || arr[i] == '负责部门员工任务完成情况表' ? obj.takCompletedStatus = true : ''
 
         arr[i] == '新增立项申请'  ? obj.projectApprovalNew = true : ''
         arr[i] == '导入立项申请'  ? obj.projectApprovalImport = true : ''

+ 10 - 9
fhKeeper/formulahousekeeper/timesheet/src/views/Home.vue

@@ -81,8 +81,8 @@
                                             </span>
                                             <span v-if="user.userNameNeedTranslate == 1">
                                                 {{scope.row.omg.textOne}}
-                                                <ww-open-data v-if="user.corpwxUserid != null" type='userName' :openid='scope.row.omg.textTwo'></ww-open-data>
-                                                <dd-open-data v-if="user.dingdingUserid != null" openType='userName' :openId='scope.row.omg.textTwo'></dd-open-data>
+                                                <TranslationOpenDataText v-if="user.corpwxUserid != null" type='userName' :openid='scope.row.omg.textTwo'></TranslationOpenDataText>
+                                                <dt-open-data v-if="user.dingdingUserid != null" open-type='userName' :open-id='scope.row.omg.textTwo'></dt-open-data>
                                                 {{scope.row.omg.textThree}}
                                             </span>
                                         </span>
@@ -103,15 +103,16 @@
                 <el-dropdown trigger="hover" style="margin-left:10px;">
                     <span class="el-dropdown-link userinfo-inner">
                         <img src="../assets/image/userHead.png" />
-                        <span v-if="user.userNameNeedTranslate == 1">
-                            <ww-open-data type='userName' :openid='sysUserName'></ww-open-data>
+                        <!-- <span v-if="user.userNameNeedTranslate == 1">
+                            <TranslationOpenDataText type='userName' :openid='sysUserName'></TranslationOpenDataText>
                         </span>
                         <span v-if="user.dingdingUserid">
                             <dt-open-data open-type='userName' :open-id='user.dingdingUserid'></dt-open-data>
                         </span>
                         <span v-if="user.userNameNeedTranslate != 1">
                             {{sysUserName}}
-                        </span>
+                        </span> -->
+                        <TranslationOpenData :configurationItems="{ openType: 'userName', openId: sysUserName, renderIndex: 0 }" />
                         <!-- {{sysUserName}} -->
                     </span>
                     <el-dropdown-menu slot="dropdown">
@@ -795,7 +796,7 @@
                                                 console.log(window, 'window')
                                                 //  wx.agentConfig成功回调后,WWOpenData 才会注入到 window 对象上面
                                                 if(window.WWOpenData) {
-                                                    window.WWOpenData.bind(document.querySelector('ww-open-data'))
+                                                    window.WWOpenData.bind(document.querySelector('TranslationOpenDataText'))
                                                     if (WWOpenData.initCanvas) {
                                                         WWOpenData.initCanvas()
                                                         console.log('我企业微信 canvas 应该执行了吧')
@@ -867,12 +868,12 @@
                 const ddUrl = new URL(window.location.href);
                 const ddCorpid = ddUrl.searchParams.get("corpid") || ''
                 let ddOpenDataInit = window.DTOpenData.init(ddCorpid)
-                console.log(ddOpenDataInit, '<=== 钉钉执行的判断')
+                console.log(ddOpenDataInit, '<=== 钉钉执行 window.DTOpenData.init(ddCorpid) 的判断')
                 if (ddOpenDataInit) {
                     setTimeout(() => {
-                        console.log('延迟执行')
+                        console.log('<==== 执行 window.DTOpenData.update(document.querySelectorAll(dt-open-data))')
                         window.DTOpenData.update(document.querySelectorAll('dt-open-data'));
-                    }, 100)
+                    }, 300)
                 }else {
                     console.log('钉钉没有触发')
                 }

+ 13 - 13
fhKeeper/formulahousekeeper/timesheet/src/views/awayOffice/awayOffice.vue

@@ -146,8 +146,8 @@
                             <span v-if="index>0"><i class="el-icon-right"></i></span>
                             <span><i class="el-icon-s-custom"></i></span>
                             <span v-if="user.userNameNeedTranslate == 1">
-                            <span v-if="item.auditorType == 1"><ww-open-data type='departmentName' :openid='item.auditDeptName' ></ww-open-data>(主要负责人)</span>
-                            <ww-open-data type='userName' :openid='item.userName' v-if="item.auditorType == 2"></ww-open-data>
+                            <span v-if="item.auditorType == 1"><TranslationOpenDataText type='departmentName' :openid='item.auditDeptName' ></TranslationOpenDataText>(主要负责人)</span>
+                            <TranslationOpenDataText type='userName' :openid='item.userName' v-if="item.auditorType == 2"></TranslationOpenDataText>
                             </span>
                             <span v-if="user.userNameNeedTranslate == 0">
                             {{item.auditorType == 1?(item.auditDeptName+'(主要负责人)'):item.userName}}
@@ -219,7 +219,7 @@
                         <template slot-scope="scope">
                             <span :style="scope.row.dayCount >= 10 ? 'color:#e62412' : ''">
                                 <span v-if="user.userNameNeedTranslate != 1">{{scope.row.ownerName}}</span>
-                                <span v-if="user.userNameNeedTranslate == 1"><ww-open-data type='userName' :openid='scope.row.ownerName'></ww-open-data></span>
+                                <span v-if="user.userNameNeedTranslate == 1"><TranslationOpenDataText type='userName' :openid='scope.row.ownerName'></TranslationOpenDataText></span>
                             </span>
                         </template>
                     </el-table-column>
@@ -271,7 +271,7 @@
                             <div v-if="scope.row.status == 1" style="color: orange"><span>{{ $t('state.WaitingAudit') }}-</span>
                                 <span v-if="user.userNameNeedTranslate != 1">{{scope.row.auditorName}}</span>
                                 <span v-if="user.userNameNeedTranslate == 1">
-                                <ww-open-data type='userName' :openid='scope.row.auditorName'></ww-open-data>
+                                <TranslationOpenDataText type='userName' :openid='scope.row.auditorName'></TranslationOpenDataText>
                                 </span>
                             </div>
                             <span v-if="scope.row.status == 2" style="color: red">{{ $t('btn.rejected') }}</span>
@@ -358,7 +358,7 @@
                         <template slot-scope="scope">
                             <div v-if="scope.row.ownerName">
                                 <span v-if="user.userNameNeedTranslate != 1">{{scope.row.ownerName}}</span>
-                                <span v-if="user.userNameNeedTranslate == 1"><ww-open-data type='userName' :openid='scope.row.ownerName'></ww-open-data></span>
+                                <span v-if="user.userNameNeedTranslate == 1"><TranslationOpenDataText type='userName' :openid='scope.row.ownerName'></TranslationOpenDataText></span>
                             </div>
                             <div v-else>
                             <span>{{ $t('nostatisticsonbusinesstripsatpresent') }}</span>
@@ -368,7 +368,7 @@
                     <el-table-column prop="departmentName" :label="$t('lable.department')" width="300">
                         <template slot-scope="scope">
                             <span v-if="user.userNameNeedTranslate != 1">{{scope.row.departmentName}}</span>
-                                <span v-if="user.userNameNeedTranslate == 1"><ww-open-data type='departmentName' :openid='scope.row.departmentName'></ww-open-data></span>
+                                <span v-if="user.userNameNeedTranslate == 1"><TranslationOpenDataText type='departmentName' :openid='scope.row.departmentName'></TranslationOpenDataText></span>
                         </template>
                     </el-table-column>
                     <el-table-column prop="dayCount" :label="$t('cumulativebusinesstripdays')" width="300">
@@ -397,7 +397,7 @@
                                 <span class="custom-tree-node" slot-scope="{ node, data }">
                                     <!-- <span>{{ node.label }}</span> -->
                                     <span v-if="user.userNameNeedTranslate == '1'">
-                                        <ww-open-data type='departmentName' :openid='node.label'></ww-open-data>
+                                        <TranslationOpenDataText type='departmentName' :openid='node.label'></TranslationOpenDataText>
                                     </span>
                                     <span v-else>
                                         {{ node.label }}
@@ -414,7 +414,7 @@
                             <div style="padding:5px;color:#333;" v-if="depData != null">{{ $t('setup') }} &lt;<span style="color:#20a0ff;">
                                 <!-- {{depData.label}} -->
                                 <span v-if="user.userNameNeedTranslate != 1">{{depData.label}}</span>
-                                <span v-if="user.userNameNeedTranslate == 1"><ww-open-data type='departmentName' :openid='depData.label'></ww-open-data></span>
+                                <span v-if="user.userNameNeedTranslate == 1"><TranslationOpenDataText type='departmentName' :openid='depData.label'></TranslationOpenDataText></span>
                                 &gt;</span> {{ $t('approvalprocessforbusiness') }}
                                 <el-tooltip effect="dark" v-if="depData != null && depData.children!=null" :content="$t('onlyapplicabletotheimmediatestaffofthecurrentdepartment')" placement="top-start">
                                     <i class="el-icon-question"></i>
@@ -431,10 +431,10 @@
                                     
                                     <!-- <el-button type="primary" v-if="item.auditorType == 2" @click="editNodeDialog(index, item)">{{item.userName}}</el-button> -->
                                     <el-button type="primary" v-if="item.auditorType == 1 && user.userNameNeedTranslate == 1" @click="editNodeDialog(index, item)">
-                                        <ww-open-data type='departmentName' :openid='item.auditDeptName'></ww-open-data>
+                                        <TranslationOpenDataText type='departmentName' :openid='item.auditDeptName'></TranslationOpenDataText>
                                     </el-button>
                                     <el-button type="primary" v-if="item.auditorType == 2 && user.userNameNeedTranslate == 1" @click="editNodeDialog(index, item)">
-                                        <ww-open-data type='userName' :openid='item.userName'></ww-open-data>
+                                        <TranslationOpenDataText type='userName' :openid='item.userName'></TranslationOpenDataText>
                                     </el-button>
                                     <el-button type="primary" v-if="item.auditorType == 0" >{{ $t('projectLeader') }}</el-button>
                                     <el-button type="primary" v-if="item.auditorType == 1 && user.userNameNeedTranslate != 1" @click="editNodeDialog(index, item)">
@@ -477,7 +477,7 @@
         <!-- <el-form ref="editItemForm" :model="editItemForm" label-width="80px" :rules="editItemFormRules"> -->
         <el-form ref="editItemForm" :model="editItemForm" label-width="80px" :rules="editItemRules">
             <el-form-item :label="$t('businesspersonnel')" prop="ownerName"  style="width: 300px;display: inline-block;">
-                <span v-if="user.userNameNeedTranslate == 1"><ww-open-data type='userName' :openid='editItemForm.ownerName'></ww-open-data></span>
+                <span v-if="user.userNameNeedTranslate == 1"><TranslationOpenDataText type='userName' :openid='editItemForm.ownerName'></TranslationOpenDataText></span>
                 <span v-else>{{editItemForm.ownerName}}</span>
             </el-form-item>
             <el-form-item :label="$t('onewayroundtrip')" prop="goBack" style="width: 300px;display: inline-block;">
@@ -583,7 +583,7 @@
             <el-table-column prop="ownerName" :label="$t('businesspersonnel')" width="100" fixed="left">
                 <template slot-scope="scope">
                     <div>
-                        <span v-if="user.userNameNeedTranslate == 1"><ww-open-data type='userName' :openid='scope.row.ownerName'></ww-open-data></span>
+                        <span v-if="user.userNameNeedTranslate == 1"><TranslationOpenDataText type='userName' :openid='scope.row.ownerName'></TranslationOpenDataText></span>
                         <span v-if="user.userNameNeedTranslate != 1">{{scope.row.ownerName}}</span>
                     </div>
                 </template>
@@ -733,7 +733,7 @@
         <div style="padding:20px 40px 20px 0">
             <el-timeline :reverse="false">
                 <el-timeline-item v-for="item in auditLogList" :key="item.id" :timestamp="item.indate">
-                  <span v-if="user.userNameNeedTranslate == 1"><ww-open-data type='userName' :openid='item.auditorName'></ww-open-data> </span>
+                  <span v-if="user.userNameNeedTranslate == 1"><TranslationOpenDataText type='userName' :openid='item.auditorName'></TranslationOpenDataText> </span>
                   <span v-if="user.userNameNeedTranslate == 0">{{item.auditorName}}</span>
                   <span> {{item.isPass==0?"驳回了请假申请。":"审核通过。"}}</span>
                   <span v-if="item.isPass == 0">原因:{{item.denyReason}}</span>

+ 2 - 2
fhKeeper/formulahousekeeper/timesheet/src/views/contract/index.vue

@@ -267,7 +267,7 @@
           </el-form-item>
           <el-form-item :label="$t('dismissreason')" v-if="contractForm.status == 2">
             <span v-if="userNameNeedTranslate == 1">
-              <span><ww-open-data type='userName' :openid='contractForm.msg.name'></ww-open-data></span>
+              <span><TranslationOpenDataText type='userName' :openid='contractForm.msg.name'></TranslationOpenDataText></span>
               <span>{{contractForm.msg.text}}</span>
             </span>
             <span v-else>
@@ -275,7 +275,7 @@
             </span>
           </el-form-item>
           <el-form-item :label="$t('founder')">
-            <span v-if="user.userNameNeedTranslate == 1"><ww-open-data type='userName' :openid='contractForm.creatorName'></ww-open-data></span>
+            <span v-if="user.userNameNeedTranslate == 1"><TranslationOpenDataText type='userName' :openid='contractForm.creatorName'></TranslationOpenDataText></span>
             <span v-else>{{contractForm.creatorName}}</span>
           </el-form-item>
           <el-form-item :label="$t('creationtime')">

+ 235 - 37
fhKeeper/formulahousekeeper/timesheet/src/views/corpreport/list.vue

@@ -48,6 +48,7 @@
                   <el-menu-item index="1-26" v-if="permissions.reportProjectConsumptionTwo" @click="ssl(25)"><p>项目耗用进度表</p></el-menu-item>
                   <el-menu-item index="1-27" v-if="permissions.reportStaffTaskAccomplished" @click="ssl(26)"><p>员工任务进度表</p></el-menu-item>
                   <el-menu-item index="1-28" v-if="permissions.reportProjectEstimated" @click="ssl(27)"><p>项目预估工时表</p></el-menu-item>
+                  <el-menu-item index="1-29" v-if="permissions.takCompletedStatus" @click="ssl(28)"><p>员工任务完成情况表</p></el-menu-item>
                 </el-submenu>
               </el-menu>
           </el-col>
@@ -219,7 +220,7 @@
                 <el-table-column prop="inchargerName" :label="$t('projectmanager')"  width="130">
                   <template slot-scope="scope" >
                     <span v-if="user.userNameNeedTranslate == '1'">
-                      <ww-open-data type='userName' :openid='scope.row.inchargerName'></ww-open-data>
+                      <TranslationOpenDataText type='userName' :openid='scope.row.inchargerName'></TranslationOpenDataText>
                     </span>
                     <span v-if="user.userNameNeedTranslate != '1'">
                       {{scope.row.inchargerName}}
@@ -287,7 +288,7 @@
                   <template slot-scope="scope" >
                     <span v-for="(items, indexs) in scope.row.executor_name" :key="indexs">
                       <span v-if="user.userNameNeedTranslate == '1'">
-                        <ww-open-data type='userName' :openid='items'></ww-open-data>
+                        <TranslationOpenDataText type='userName' :openid='items'></TranslationOpenDataText>
                       </span>
                       <span v-if="user.userNameNeedTranslate != '1'">
                         {{items}}
@@ -563,7 +564,7 @@
                 <el-table-column prop="username" :label="$t('lable.name')" width="120">
                   <template slot-scope="scope" >
                     <span v-if="user.userNameNeedTranslate == '1'">
-                      <ww-open-data type='userName' :openid='scope.row.username'></ww-open-data>
+                      <TranslationOpenDataText type='userName' :openid='scope.row.username'></TranslationOpenDataText>
                     </span>
                     <span v-if="user.userNameNeedTranslate != '1'">
                       {{scope.row.username}}
@@ -574,7 +575,7 @@
                 <el-table-column prop="departmentName" :label="$t('lable.department')" width="140">
                   <template slot-scope="scope" >
                       <span v-if="user.userNameNeedTranslate == '1'">
-                        <ww-open-data type='departmentName' :openid='scope.row.departmentName'></ww-open-data>
+                        <TranslationOpenDataText type='departmentName' :openid='scope.row.departmentName'></TranslationOpenDataText>
                       </span>
                       <span v-if="user.userNameNeedTranslate != '1'">
                         {{scope.row.departmentName}}
@@ -604,7 +605,7 @@
               <el-table-column prop="username" :label="$t('ren-yuan')" width="150">
                 <template slot-scope="scope" >
                     <span v-if="user.userNameNeedTranslate == '1'">
-                      <ww-open-data type='userName' :openid='scope.row.username'></ww-open-data>
+                      <TranslationOpenDataText type='userName' :openid='scope.row.username'></TranslationOpenDataText>
                     </span>
                     <span v-if="user.userNameNeedTranslate != '1'">
                       {{scope.row.username}}
@@ -615,10 +616,10 @@
                 <template slot-scope="scope" >
                     <span v-if="user.userNameNeedTranslate == '1'">
                       <span v-for="item, index in scope.row.deptName" :key="index">
-                        <ww-open-data type='departmentName' :openid='item'></ww-open-data>
+                        <TranslationOpenDataText type='departmentName' :openid='item'></TranslationOpenDataText>
                         <span v-if="index < scope.row.deptName.length - 1">/</span>
                       </span>
-                        <!-- <ww-open-data type='departmentName' :openid='scope.row.deptName'></ww-open-data> -->
+                        <!-- <TranslationOpenDataText type='departmentName' :openid='scope.row.deptName'></TranslationOpenDataText> -->
                     </span>
                     <span v-if="user.userNameNeedTranslate != '1'">
                       {{scope.row.deptName}}
@@ -706,7 +707,7 @@
                 <el-table-column prop="userName" :label="$t('ren-yuan')" min-width="200" align="center">
                   <template slot-scope="scope" >
                     <span v-if="user.userNameNeedTranslate == '1'">
-                      <ww-open-data type='userName' :openid='scope.row.userName'></ww-open-data>
+                      <TranslationOpenDataText type='userName' :openid='scope.row.userName'></TranslationOpenDataText>
                     </span>
                     <span v-if="user.userNameNeedTranslate != '1'">
                       {{scope.row.userName}}
@@ -717,7 +718,7 @@
                 <el-table-column prop="departmentName" :label="$t('subordinatedepartments')" min-width="200" align="center">
                   <template slot-scope="scope" >
                     <span v-if="user.userNameNeedTranslate == '1'">
-                      <ww-open-data type='departmentName' :openid='scope.row.departmentName'></ww-open-data>
+                      <TranslationOpenDataText type='departmentName' :openid='scope.row.departmentName'></TranslationOpenDataText>
                     </span>
                     <span v-if="user.userNameNeedTranslate != '1'">
                       {{scope.row.departmentName}}
@@ -754,7 +755,7 @@
                 <el-table-column prop="userName" :label="$t('other.reviewer')" min-width="200" align="center">
                   <template slot-scope="scope" >
                     <span v-if="user.userNameNeedTranslate == '1'">
-                      <ww-open-data type='userName' :openid='scope.row.userName'></ww-open-data>
+                      <TranslationOpenDataText type='userName' :openid='scope.row.userName'></TranslationOpenDataText>
                     </span>
                     <span v-if="user.userNameNeedTranslate != '1'">
                       {{scope.row.userName}}
@@ -765,7 +766,7 @@
                   <template slot-scope="scope" >
                     <span v-if="user.userNameNeedTranslate == '1'">
                       <span v-for="(item,index) in scope.row.departmentName" :key="index">
-                        <ww-open-data type='departmentName' :openid='item'></ww-open-data>
+                        <TranslationOpenDataText type='departmentName' :openid='item'></TranslationOpenDataText>
                         <span v-if="index < scope.row.departmentName.length - 1">/</span>
                       </span>
                     </span>
@@ -782,7 +783,7 @@
                 <el-table-column prop="name" :label="$t('lable.name')" min-width="200" align="center">
                   <template slot-scope="scope" >
                     <span v-if="user.userNameNeedTranslate == '1'">
-                      <ww-open-data type='userName' :openid='scope.row.name'></ww-open-data>
+                      <TranslationOpenDataText type='userName' :openid='scope.row.name'></TranslationOpenDataText>
                     </span>
                     <span v-if="user.userNameNeedTranslate != '1'">
                       {{scope.row.name}}
@@ -793,7 +794,7 @@
                 <el-table-column prop="departmentName" :label="$t('lable.department')" min-width="200" align="center">
                   <template slot-scope="scope" >
                     <span v-if="user.userNameNeedTranslate == '1'">
-                      <ww-open-data type='departmentName' :openid='scope.row.departmentName'></ww-open-data>
+                      <TranslationOpenDataText type='departmentName' :openid='scope.row.departmentName'></TranslationOpenDataText>
                     </span>
                     <span v-if="user.userNameNeedTranslate != '1'">
                       {{scope.row.departmentName}}
@@ -839,7 +840,7 @@
                   <template slot-scope="scope">
                     <div>
                       <span v-if="user.userNameNeedTranslate == '1'">
-                        <ww-open-data type='userName' :openid='scope.row.name'></ww-open-data>
+                        <TranslationOpenDataText type='userName' :openid='scope.row.name'></TranslationOpenDataText>
                       </span>
                       <span v-if="user.userNameNeedTranslate != '1'">
                         {{scope.row.name}}
@@ -896,7 +897,7 @@
                     <div>
                       <span v-if="user.userNameNeedTranslate == '1'">
                         <span v-for="item, index in scope.row.deptName" :key='index'>
-                          <ww-open-data type='departmentName' :openid='item'></ww-open-data>
+                          <TranslationOpenDataText type='departmentName' :openid='item'></TranslationOpenDataText>
                           <span v-if="index < scope.row.deptName.length - 1">/</span>
                         </span>
                       </span>
@@ -950,7 +951,7 @@
                     <div>
                       <span v-for="item, index in scope.row.personLiableNames" :key="index">
                         <span v-if="user.userNameNeedTranslate == '1'">
-                          <ww-open-data type='userName' :openid='item'></ww-open-data>
+                          <TranslationOpenDataText type='userName' :openid='item'></TranslationOpenDataText>
                         </span>
                         <span v-if="user.userNameNeedTranslate != '1'">{{item}}</span>
                         <span v-if="index < scope.row.personLiableNames.length - 1">,</span>
@@ -970,7 +971,7 @@
                   <template slot-scope="scope">
                     <div>
                       <span v-if="user.userNameNeedTranslate == '1'">
-                        <ww-open-data type='userName' :openid='scope.row.userName'></ww-open-data>
+                        <TranslationOpenDataText type='userName' :openid='scope.row.userName'></TranslationOpenDataText>
                       </span>
                       <span v-if="user.userNameNeedTranslate != '1'">
                         {{scope.row.userName}}
@@ -989,7 +990,7 @@
                   <template slot-scope="scope">
                     <div>
                       <span v-if="user.userNameNeedTranslate == '1'">
-                        <ww-open-data type='departmentName' :openid='scope.row.department_name'></ww-open-data>
+                        <TranslationOpenDataText type='departmentName' :openid='scope.row.department_name'></TranslationOpenDataText>
                       </span>
                       <span v-if="user.userNameNeedTranslate != '1'">
                         {{scope.row.department_name}}
@@ -1013,7 +1014,7 @@
                 <template slot-scope="scope">
                   <div>
                     <span v-if="user.userNameNeedTranslate == '1'">
-                      <ww-open-data type='userName' :openid='scope.row.userName'></ww-open-data>
+                      <TranslationOpenDataText type='userName' :openid='scope.row.userName'></TranslationOpenDataText>
                     </span>
                     <span v-if="user.userNameNeedTranslate != '1'">
                       {{scope.row.userName}}
@@ -1056,7 +1057,7 @@
                 <template slot-scope="scope">
                   <div>
                     <span v-if="user.userNameNeedTranslate == '1'">
-                      <ww-open-data type='userName' :openid='scope.row.userName'></ww-open-data>
+                      <TranslationOpenDataText type='userName' :openid='scope.row.userName'></TranslationOpenDataText>
                     </span>
                     <span v-if="user.userNameNeedTranslate != '1'">
                       {{scope.row.userName}}
@@ -1068,7 +1069,7 @@
                 <template slot-scope="scope">
                   <div>
                     <span v-if="user.userNameNeedTranslate == '1'">
-                      <ww-open-data type='departmentName' :openid='scope.row.deptName'></ww-open-data>
+                      <TranslationOpenDataText type='departmentName' :openid='scope.row.deptName'></TranslationOpenDataText>
                     </span>
                     <span v-if="user.userNameNeedTranslate != '1'">
                       {{scope.row.deptName}}
@@ -1108,7 +1109,7 @@
                 <template slot-scope="scope">
                   <div>
                     <span v-if="user.userNameNeedTranslate == '1'">
-                      <ww-open-data type='departmentName' :openid='scope.row.departmentName'></ww-open-data>
+                      <TranslationOpenDataText type='departmentName' :openid='scope.row.departmentName'></TranslationOpenDataText>
                     </span>
                     <span v-if="user.userNameNeedTranslate != '1'">
                       {{scope.row.deptName}}
@@ -1121,7 +1122,7 @@
                 <template slot-scope="scope">
                   <div>
                     <span v-if="user.userNameNeedTranslate == '1'">
-                      <ww-open-data type='userName' :openid='scope.row.userName'></ww-open-data>
+                      <TranslationOpenDataText type='userName' :openid='scope.row.userName'></TranslationOpenDataText>
                     </span>
                     <span v-if="user.userNameNeedTranslate != '1'">
                       {{scope.row.userName}}
@@ -1142,7 +1143,7 @@
                 <template slot-scope="scope">
                   <div>
                     <span v-if="user.userNameNeedTranslate == '1'">
-                      <ww-open-data type='departmentName' :openid='scope.row.corpwxDeptId'></ww-open-data>
+                      <TranslationOpenDataText type='departmentName' :openid='scope.row.corpwxDeptId'></TranslationOpenDataText>
                     </span>
                     <span v-if="user.userNameNeedTranslate != '1'">
                       {{scope.row.departmentName}}
@@ -1179,7 +1180,7 @@
                   <div class="participatingEmployee">
                     <div v-for="(item,index) in scope.row.teamLeader" :key="index">
                       <span v-if="user.userNameNeedTranslate == '1'">
-                        <ww-open-data type='userName' :openid='item.name'></ww-open-data> 
+                        <TranslationOpenDataText type='userName' :openid='item.name'></TranslationOpenDataText> 
                       </span>
                       <span v-if="user.userNameNeedTranslate != '1'">
                         {{item.name}}
@@ -1194,7 +1195,7 @@
                   <div class="participatingEmployee">
                     <div v-for="(item,index) in scope.row.userProgress" :key="index">
                       <span v-if="user.userNameNeedTranslate == '1'">
-                        <ww-open-data type='userName' :openid='item.userName'></ww-open-data> 
+                        <TranslationOpenDataText type='userName' :openid='item.userName'></TranslationOpenDataText> 
                         {{item.progress}}
                       </span>
                       <span v-if="user.userNameNeedTranslate != '1'">
@@ -1214,7 +1215,7 @@
                 <template slot-scope="scope">
                   <div>
                     <span v-if="user.userNameNeedTranslate == '1'">
-                      <ww-open-data type='departmentName' :openid='scope.row.departmentName'></ww-open-data>
+                      <TranslationOpenDataText type='departmentName' :openid='scope.row.departmentName'></TranslationOpenDataText>
                     </span>
                     <span v-if="user.userNameNeedTranslate != '1'">
                       {{scope.row.departmentName}}
@@ -1227,7 +1228,7 @@
                 <template slot-scope="scope">
                   <div>
                     <span v-if="user.userNameNeedTranslate == '1'">
-                      <ww-open-data type='userName' :openid='scope.row.userName'></ww-open-data>
+                      <TranslationOpenDataText type='userName' :openid='scope.row.userName'></TranslationOpenDataText>
                     </span>
                     <span v-if="user.userNameNeedTranslate != '1'">
                       {{scope.row.userName}}
@@ -1253,6 +1254,41 @@
               <el-table-column align="center" prop="estimatedWorkTime" label="预估工时" min-width="150"></el-table-column>
               <el-table-column align="center" prop="workTime" label="实际工时" min-width="150"></el-table-column>
             </el-table>
+
+            <!-- 员工任务完成情况表 -->
+            <el-table  v-if="ins == 28" key="28" border :data="taskCompletedData" highlight-current-row v-loading="listLoading"  :height="+tableHeight - 1" style="width: 100%;" :span-method="objectSpanMethod">
+              <el-table-column align="center" prop="userName" label="员工" min-width="150">
+                <template slot-scope="scope">
+                  <div>
+                    <span v-if="user.userNameNeedTranslate == '1'">
+                      <TranslationOpenDataText type='userName' :openid='scope.row.userName'></TranslationOpenDataText>
+                    </span>
+                    <span v-if="user.userNameNeedTranslate != '1'">
+                      <el-link type="primary" :underline="false" @click="showUserTask(scope.row.userId)">{{scope.row.userName}}</el-link>
+                    </span>
+                  </div>
+                </template>
+              </el-table-column>
+              <el-table-column align="center" prop="deptName" label="部门" min-width="150">
+                <template slot-scope="scope">
+                  <div>
+                    <span v-if="user.userNameNeedTranslate == '1'">
+                      <TranslationOpenDataText type='deptName' :openid='scope.row.deptName'></TranslationOpenDataText>
+                    </span>
+                    <span v-if="user.userNameNeedTranslate != '1'">
+                      {{scope.row.deptName}}
+                    </span>
+                  </div>
+                </template>
+              </el-table-column>
+              <el-table-column align="center" prop="allNum" label="任务总数量" min-width="150"></el-table-column>
+              <el-table-column align="center" prop="completedNum" label="已完成数量" min-width="150"></el-table-column>
+              <el-table-column align="center" prop="noCompletedNum" label="未完成数量" min-width="150"></el-table-column>
+              <el-table-column align="center" prop="noCompletedPercent" label="未完成率" min-width="150"></el-table-column>
+              <el-table-column align="center" prop="onTimeNum" label="按时完成数量" min-width="150"></el-table-column>
+              <el-table-column align="center" prop="noOnTimeNum" label="延迟完成数量" min-width="150"></el-table-column>
+              <el-table-column align="center" prop="onTimePercent" label="按时完成率" min-width="150"></el-table-column>
+            </el-table>
         <!--工具条-->
         <el-col :span="24" class="toolbar" v-if="ins != 6 && ins != 20 && ins != 21">
           <el-pagination
@@ -1341,7 +1377,7 @@
                 <el-table-column  prop="username" :label="$t('screening.employeename')"  >
                   <template slot-scope="scope" >
                     <span v-if="user.userNameNeedTranslate == '1'">
-                      <ww-open-data type='userName' :openid='scope.row.username'></ww-open-data>
+                      <TranslationOpenDataText type='userName' :openid='scope.row.username'></TranslationOpenDataText>
                     </span>
                     <span v-if="user.userNameNeedTranslate != '1'">
                       {{scope.row.username}}
@@ -1351,7 +1387,7 @@
                 <el-table-column  prop="departmentName" :label="$t('departmentsuod')" v-if="this.user.timeType.easyExpense==0">
                   <template slot-scope="scope" >
                     <span v-if="user.userNameNeedTranslate == '1'">
-                      <ww-open-data type='departmentName' :openid='scope.row.departmentName'></ww-open-data>
+                      <TranslationOpenDataText type='departmentName' :openid='scope.row.departmentName'></TranslationOpenDataText>
                     </span>
                     <span v-if="user.userNameNeedTranslate != '1'">
                       {{scope.row.departmentName}}
@@ -1418,7 +1454,7 @@
                 <el-table-column prop="username" :label="$t('lable.name')" width="120">
                   <template slot-scope="scope" >
                     <span v-if="user.userNameNeedTranslate == '1'">
-                      <ww-open-data type='userName' :openid='scope.row.username'></ww-open-data>
+                      <TranslationOpenDataText type='userName' :openid='scope.row.username'></TranslationOpenDataText>
                     </span>
                     <span v-if="user.userNameNeedTranslate != '1'">
                       {{scope.row.username}}
@@ -1495,6 +1531,50 @@
             <el-button type="primary" @click="setForewarning()" :loading="warningTableLoading">确 定</el-button>
           </span>
         </el-dialog>
+        <!-- 员工任务数据弹窗 -->
+        <el-dialog
+          title="员工任务数据"
+          :visible.sync="showUserTaskDialog"
+          width="80%"
+          top="8.1vh"
+          :before-close="handleClose">
+          <div>
+            <div class="pagingTable">
+              <el-table  border :data="userTaskData" highlight-current-row height="50vh" v-loading="userTasklistLoading" style="width: 100%;" >
+                <el-table-column align="center" prop="executorNames" label="执行人" min-width="150">
+                  <template slot-scope="scope">
+                    <div>
+                      <span v-if="user.userNameNeedTranslate == '1'">
+                        <TranslationOpenDataText type='userName' :openid='scope.row.executorNames'></TranslationOpenDataText>
+                      </span>
+                      <span v-if="user.userNameNeedTranslate != '1'">
+                        {{scope.row.executorNames}}
+                      </span>
+                    </div>
+                  </template>
+                </el-table-column>
+                <el-table-column align="center" prop="taskName" label="任务名称" min-width="150"></el-table-column>
+                <el-table-column align="center" prop="stateValue" label="当前状态" min-width="150"></el-table-column>
+                <el-table-column align="center" prop="startDate" label="开始日期" min-width="150"></el-table-column>
+                <el-table-column align="center" prop="endDate" label="截止日期" min-width="150"></el-table-column>
+                <el-table-column align="center" prop="finishDate" label="完成日期" min-width="150"></el-table-column>
+              </el-table>
+            </div>
+        
+            <div class="pagingData">
+              <el-pagination
+                  @size-change="usertaskSizeChange"
+                  @current-change="usertaskCurrentChange"
+                  :current-page="userTaskPage"
+                  :page-sizes="[20 , 50 , 80 , 100]"
+                  :page-size="userTaskSize"
+                  layout="total, sizes, prev, pager, next"
+                  :total="userTaskTotal"
+                  style="float:right;"
+              ></el-pagination>
+            </div>
+          </div>
+        </el-dialog>
   </section>
 </template>
 
@@ -1515,12 +1595,12 @@ export default {
   data() {
     return {
       screeningCondition: { // 筛选条件的判断
-        project: [4, 8, 9, 10, 11, 14, 15, 17, 19, 20, 21, 22], // 项目筛选条件 (不等于)
+        project: [4, 8, 9, 10, 11, 14, 15, 17, 19, 20, 21, 22,28], // 项目筛选条件 (不等于)
         months: [14, 15], // 月份筛选条件 (等于)
         monthRange: [19], // 月份区间筛选条件 (等于)
-        staff: [6, 8, 9, 19, 11, 14, 18, 23, 25, 26], // 人员筛选条件 (等于)
-        departments: [14, 15, 23,21,26], // 部门筛选条件 (等于)
-        timePeriod: [5, 6, 8, 9, 10, 11, 12, 16, 17, 18, 20, 21, 22, 24, 25, 26], // 时间段筛选条件 (等于)
+        staff: [6, 8, 9, 19, 11, 14, 18, 23, 25, 26,28], // 人员筛选条件 (等于)
+        departments: [14, 15, 23,21,26,28], // 部门筛选条件 (等于)
+        timePeriod: [5, 6, 8, 9, 10, 11, 12, 16, 17, 18, 20, 21, 22, 24, 25, 26,28], // 时间段筛选条件 (等于)
       },
       efficentList:[],
       groupNames: [],
@@ -1579,14 +1659,14 @@ export default {
       this.$t('statisticsofovertimework'),this.$t('timecostearlywarningtable'),this.$t('personneltimeallocationtable'),
       this.$t('statisticsofstafffillingintimerate'),this.$t('dailyreporttobereviewedstatistics'),this.$t('statisticsofpersonnelhours'),this.$t('taskgrouptimesheet'),this.$t('projectcostbaselinetable'),
       this.$t('ren-yuan-yue-du-gong-shi-biao'), this.$t('bumenchanyuqingkuang'), this.$t('ge-fen-zu-yu-jie-duan-gong-shi-biao'), '子项目工时成本表', '任务重启表', 'FTE报表', '有效工时率表', '项目分类工时占比表', '分类工时明细表',
-      '员工项目进度表', '分组耗用进度表', '项目耗用进度表', '员工任务进度表', '项目预估工时表'],
+      '员工项目进度表', '分组耗用进度表', '项目耗用进度表', '员工任务进度表', '项目预估工时表','员工任务完成情况表'],
 
       shuzArr: [this.$t('projectreport'),this.$t('projectTaskReport'),this.$t('projectcoststatement'),
       this.$t('projectbalancesheet'),this.$t('customerprojectincomestatement'),this.$t('projectphasetimesheet'),
       this.$t('statisticsofovertimework'),this.$t('timecostearlywarningtable'),this.$t('personneltimeallocationtable'),
       this.$t('employeereporttimelinessrate'),this.$t('dailyreporttobereviewedstatistics'),this.$t('statisticsofpersonnelhours'),this.$t('taskgrouptimesheet'),this.$t('projectcostbaselinetable'),
       this.$t('ren-yuan-yue-du-gong-shi-biao'), this.$t('bumenchanyuqingkuang'), this.$t('ge-fen-zu-yu-jie-duan-gong-shi-biao'), '子项目工时成本表', '任务重启表', 'FTE报表','有效工时率表', '项目分类工时占比表', '分类工时明细表',
-      '员工项目进度表', '分组耗用进度表', '项目耗用进度表', '员工任务进度表', '项目预估工时表'],
+      '员工项目进度表', '分组耗用进度表', '项目耗用进度表', '员工任务进度表', '项目预估工时表','员工任务完成情况表'],
 
       ins: 10000,
       user: JSON.parse(sessionStorage.user),
@@ -1630,6 +1710,11 @@ export default {
       groupSize: 20,
       groupTotal: 0,
 
+      //员工任务分页参数
+      userTaskPage:1,
+      userTaskSize:20,
+      userTaskTotal:0,
+
       stateKey: 1,
 
       outputValueList: [],
@@ -1720,6 +1805,11 @@ export default {
       projectEstimatedWorkData: [], // 项目预估工时表
       subUserCustom:[],
       subUserCustomName:null,
+      taskCompletedData:[],
+      showUserTaskDialog:false,
+      userTaskData:[], //员工任务数据列表
+      userTasklistLoading:false,
+      userTaskUserId:null
     };
   },
   computed: {},
@@ -1828,6 +1918,7 @@ export default {
       if(this.permissions.reportProjectConsumptionTwo) {this.ssl(25);this.defaultActive = '1-26';return} else
       if(this.permissions.reportStaffTaskAccomplished) {this.ssl(26);this.defaultActive = '1-27';return} else
       if(this.permissions.reportProjectEstimated) {this.ssl(27);this.reportProjectEstimated = '1-28';return} else
+      if(this.permissions.takCompletedStatus) {this.ssl(28);this.takCompletedStatus = '1-29';return} else
       {this.allWrong = false}
     },
     rowspan(spanArr,position,spanName,dataItem = [],fields=false){
@@ -2077,6 +2168,18 @@ export default {
                   this.getList(true);
                 }
             },
+            //员工任务弹窗列表分页
+            usertaskSizeChange(val){
+              this.userTaskSize = val;
+              this.userTaskPage = 1
+              this.userTaskData=[]
+              this.getTaskByUserId()
+            },
+            usertaskCurrentChange(val){
+              this.userTaskPage = val;
+              this.userTaskData=[]
+              this.getTaskByUserId()
+            },
             groupSizeChange(val){
               this.groupSize = val
               this.groupPage = 1
@@ -2174,6 +2277,9 @@ export default {
                 if(this.ins == 27) {
                   this.getProjectEstimatedWork()
                 }
+                if(this.ins == 28) {
+                  this.gettaskCompletedData()
+                }
             },
       exportExcel() {
         var url = "/project";
@@ -2372,6 +2478,14 @@ export default {
           fName = '项目预估工时表' + '.xlsx'
           url = "/project/exportProjectEstimatedWorkTime"
           this.proJuctId ? sl.projectId = this.proJuctId : ''
+        }else if(this.ins == 28) {
+          fName = '员工任务完成情况表' + '.xlsx'
+          url = "/task/exportUserTaskCompleteDetail"
+          let dept = this.departmentIdArray[this.departmentIdArray.length - 1]
+          this.userId ? sl.userId = this.userId : ''
+          dept ? sl.deptId = dept : ''
+          sl.startDate = this.rangeDatas[0]
+          sl.endDate = this.rangeDatas[1]
         }
           this.http.post(url, sl,
             res => {
@@ -3519,6 +3633,9 @@ export default {
       if(this.ins == 26) {
         this.getTaskCompletionSheet()
       }
+      if(this.ins == 28) {
+        this.gettaskCompletedData()
+      }
     },
     // 任务重启表
     taskRestart() {
@@ -3886,6 +4003,78 @@ export default {
       this.total = data.total
       this.listLoading = false
     },
+    //展示员工任务数据
+    showUserTask(userId){
+        this.showUserTaskDialog=true
+        this.getTaskByUserId(userId)
+    },
+    //获取指定人员的任务数据
+    getTaskByUserId(value){
+      if(value){
+        this.userTaskUserId=value
+      }else{
+        value=this.userTaskUserId
+      }
+      this.userTasklistLoading = true; 
+      let parameter = {
+        pageIndex: this.userTaskPage,
+        pageSize: this.userTaskSize,
+        startDate: this.rangeDatas[0],
+        endDate: this.rangeDatas[1],
+        userId:value
+      }
+      this.http.post('/task/getTaskByUserId',parameter,
+        res => {
+            if (res.code == "ok") {
+                this.userTaskTotal = res.data.total;
+                this.userTaskData = res.data.records
+                this.userTasklistLoading = false; 
+            } else {
+                this.$message({
+                message: res.msg,
+                type: "error"
+                });
+            }
+        },
+        error => {
+            this.$message({
+                message: error,
+                type: "error"
+            });
+        });
+    },
+    // 获取员工任务完成情况表
+    gettaskCompletedData() {
+      let parameter = {
+        pageIndex: this.page,
+        pageSize: this.size,
+        startDate: this.rangeDatas[0],
+        endDate: this.rangeDatas[1],
+      }
+      let dept = this.departmentIdArray[this.departmentIdArray.length - 1]
+      this.userId ? parameter.userId = this.userId : ''
+      dept ? parameter.deptId = dept : ''
+      this.listLoading = true
+      this.http.post('/task/userTaskCompleteDetail',parameter,
+        res => {
+            if (res.code == "ok") {
+                this.total = res.data.total;
+                this.taskCompletedData = res.data.records
+                this.listLoading = false; 
+            } else {
+                this.$message({
+                message: res.msg,
+                type: "error"
+                });
+            }
+        },
+        error => {
+            this.$message({
+                message: error,
+                type: "error"
+            });
+        });
+    },
     // 分组耗用进度表
     async getConsumptionSchedule() {
       let parameter = {
@@ -3973,6 +4162,15 @@ export default {
 };
 </script>
 <style scoped>
+.pagingTable {
+  flex: 1 1 0%;
+  overflow: hidden;
+}
+.pagingData {
+  padding-top: 10px;
+  display: flex;
+  justify-content: flex-end;
+}
 .participatingEmployee {
   display: flex;
   flex-wrap: wrap;

+ 3 - 3
fhKeeper/formulahousekeeper/timesheet/src/views/expense/expense.vue

@@ -372,7 +372,7 @@
                     {{ scope.row.ownerName }}
                   </span>
                   <span v-if="user.userNameNeedTranslate == 1">
-                    <ww-open-data type='userName' :openid='scope.row.ownerName'></ww-open-data>
+                    <TranslationOpenDataText type='userName' :openid='scope.row.ownerName'></TranslationOpenDataText>
                   </span>
                 </div>
               </template>
@@ -540,7 +540,7 @@
           <el-table-column v-if="auditTypeItem.auditType == 1" width="172" label="审核人">
             <template slot-scope="scope">
               <span v-if="user.userNameNeedTranslate == 1">
-                <ww-open-data type='userName' :openid='scope.row.projectManagerName'></ww-open-data>
+                <TranslationOpenDataText type='userName' :openid='scope.row.projectManagerName'></TranslationOpenDataText>
               </span>
               <span v-else>{{ scope.row.projectManagerName }}</span>
             </template>
@@ -826,7 +826,7 @@
             <span class="detail-item-title"> <span class="printBox">报销人</span> </span>
             <span class="detail-item-content">
               <span v-if="user.userNameNeedTranslate == 1">
-                <ww-open-data type='userName' :openid='ParticularsList.ownerName'></ww-open-data>
+                <TranslationOpenDataText type='userName' :openid='ParticularsList.ownerName'></TranslationOpenDataText>
               </span>
               <span v-else>{{ ParticularsList.ownerName }}</span>
             </span>

+ 12 - 12
fhKeeper/formulahousekeeper/timesheet/src/views/leave/list.vue

@@ -169,8 +169,8 @@
                     <span v-if="index>0"><i class="el-icon-right"></i></span>
                     <span><i class="el-icon-s-custom"></i></span>
                     <span v-if="user.userNameNeedTranslate == 1">
-                      <span v-if="item.auditorType == 1"><ww-open-data type='departmentName' :openid='item.auditDeptName' ></ww-open-data>(主要负责人)</span>
-                      <ww-open-data type='userName' :openid='item.userName' v-if="item.auditorType == 2"></ww-open-data>
+                      <span v-if="item.auditorType == 1"><TranslationOpenDataText type='departmentName' :openid='item.auditDeptName' ></TranslationOpenDataText>(主要负责人)</span>
+                      <TranslationOpenDataText type='userName' :openid='item.userName' v-if="item.auditorType == 2"></TranslationOpenDataText>
                     </span>
                     <span v-if="user.userNameNeedTranslate == 0">
                       {{item.auditorType == 1?(item.auditDeptName+'(主要负责人)'):item.userName}}
@@ -239,7 +239,7 @@
                     <div>
                       <span v-if="user.userNameNeedTranslate != 1">{{scope.row.ownerName}}</span>
                       <span v-if="user.userNameNeedTranslate == 1">
-                        <ww-open-data type='userName' :openid='scope.row.ownerName'></ww-open-data>
+                        <TranslationOpenDataText type='userName' :openid='scope.row.ownerName'></TranslationOpenDataText>
                       </span>
                     </div>
                   </template>
@@ -274,7 +274,7 @@
                       <div v-if="scope.row.status == 1" style="color: orange"><span>{{ $t('state.WaitingAudit') }}-</span>
                         <span v-if="user.userNameNeedTranslate != 1">{{scope.row.auditorName}}</span>
                         <span v-if="user.userNameNeedTranslate == 1">
-                          <ww-open-data type='userName' :openid='scope.row.auditorName'></ww-open-data>
+                          <TranslationOpenDataText type='userName' :openid='scope.row.auditorName'></TranslationOpenDataText>
                         </span>
                       </div>
                       <div v-if="scope.row.status == 2" style="color: red">{{ $t('btn.rejected') }}<el-link style="margin-left:5px;" @click="showDenyReason(scope.row.id)">查看原因</el-link></div>
@@ -371,7 +371,7 @@
                 <template slot-scope="scope">
                     <div v-if="scope.row.ownerName">
                       <span v-if="user.userNameNeedTranslate != 1">{{scope.row.ownerName}}</span>
-                      <span v-if="user.userNameNeedTranslate == 1"><ww-open-data type='userName' :openid='scope.row.ownerName'></ww-open-data></span>
+                      <span v-if="user.userNameNeedTranslate == 1"><TranslationOpenDataText type='userName' :openid='scope.row.ownerName'></TranslationOpenDataText></span>
                     </div>
                     <div v-else>
                       <span>{{ $t('Nstatisticpresent') }}</span>
@@ -405,7 +405,7 @@
                   <span class="custom-tree-node" slot-scope="{ node, data }">
                       <!-- <span>{{ node.label }}</span> -->
                       <span v-if="user.userNameNeedTranslate == '1'">
-                        <ww-open-data type='departmentName' :openid='node.label'></ww-open-data>
+                        <TranslationOpenDataText type='departmentName' :openid='node.label'></TranslationOpenDataText>
                       </span>
                       <span v-else>
                         {{ node.label }}
@@ -422,7 +422,7 @@
                 <div style="padding:5px;color:#333;" v-if="depData != null">{{ $t('setup') }} &lt;<span style="color:#20a0ff;">
                   <!-- {{depData.label}} -->
                     <span v-if="user.userNameNeedTranslate != 1">{{depData.label}}</span>
-                    <span v-if="user.userNameNeedTranslate == 1"><ww-open-data type='departmentName' :openid='depData.label'></ww-open-data></span>
+                    <span v-if="user.userNameNeedTranslate == 1"><TranslationOpenDataText type='departmentName' :openid='depData.label'></TranslationOpenDataText></span>
                   &gt;</span> {{ $t('approvalprocessforleaveofdirect staff') }}
                     <el-tooltip effect="dark" v-if="depData != null && depData.children!=null" content="仅适用于当前部门的直属人员,子部门人员的审批流程需要单独设置" placement="top-start">
                     <i class="el-icon-question"></i>
@@ -438,11 +438,11 @@
 
                         <el-button type="primary" v-if="item.auditorType == 1 && user.userNameNeedTranslate == 1" @click="editNodeDialog(index, item)">
                           <!-- {{item.auditDeptName}} -->
-                          <ww-open-data type='departmentName' :openid='item.auditDeptName'></ww-open-data>
+                          <TranslationOpenDataText type='departmentName' :openid='item.auditDeptName'></TranslationOpenDataText>
                         </el-button>
                         <el-button type="primary" v-if="item.auditorType == 2 && user.userNameNeedTranslate == 1" @click="editNodeDialog(index, item)">
                           <!-- {{item.userName}} -->
-                            <ww-open-data type='userName' :openid='item.userName'></ww-open-data>
+                            <TranslationOpenDataText type='userName' :openid='item.userName'></TranslationOpenDataText>
                         </el-button>
 
                         <el-button type="primary" v-if="item.auditorType == 1 && user.userNameNeedTranslate != 1" @click="editNodeDialog(index, item)">
@@ -531,7 +531,7 @@
                       {{scope.row.userName}}
                     </span>
                     <span v-if="user.userNameNeedTranslate == 1">
-                      <ww-open-data type='userName' :openid='scope.row.userName'></ww-open-data>
+                      <TranslationOpenDataText type='userName' :openid='scope.row.userName'></TranslationOpenDataText>
                     </span>
                   </div>
                 </template>
@@ -542,7 +542,7 @@
                     {{scope.row.department}}
                   </span>
                   <span v-if="user.userNameNeedTranslate == 1">
-                    <ww-open-data type='departmentName' :openid='scope.row.department'></ww-open-data>
+                    <TranslationOpenDataText type='departmentName' :openid='scope.row.department'></TranslationOpenDataText>
                   </span>
                 </template>
               </el-table-column>
@@ -729,7 +729,7 @@
         <div style="padding:20px 40px 20px 0">
             <el-timeline :reverse="false">
                 <el-timeline-item v-for="item in auditLogList" :key="item.id" :timestamp="item.indate">
-                  <span v-if="user.userNameNeedTranslate == 1"><ww-open-data type='userName' :openid='item.auditorName'></ww-open-data> </span>
+                  <span v-if="user.userNameNeedTranslate == 1"><TranslationOpenDataText type='userName' :openid='item.auditorName'></TranslationOpenDataText> </span>
                   <span v-if="user.userNameNeedTranslate == 0">{{item.auditorName}}</span>
                   <span> {{item.isPass==0?"驳回了请假申请。":"审核通过。"}}</span>
                   <span v-if="item.isPass == 0">原因:{{item.denyReason}}</span>

+ 1 - 1
fhKeeper/formulahousekeeper/timesheet/src/views/project/CostBaseline.vue

@@ -57,7 +57,7 @@
                                             {{scope.row.userName}}
                                         </span>
                                         <span v-if="user.userNameNeedTranslate == 1">
-                                            <ww-open-data type='userName' :openid='scope.row.userName'></ww-open-data>
+                                            <TranslationOpenDataText type='userName' :openid='scope.row.userName'></TranslationOpenDataText>
                                         </span>
                                     </div>
                                 </template>

+ 1 - 1
fhKeeper/formulahousekeeper/timesheet/src/views/project/budgetReview.vue

@@ -77,7 +77,7 @@
                 <template slot-scope="scope">
                     <div>
                         <span v-if="user.userNameNeedTranslate == '1'">
-                            <ww-open-data type='userName' :openid='scope.row.creator'></ww-open-data>
+                            <TranslationOpenDataText type='userName' :openid='scope.row.creator'></TranslationOpenDataText>
                         </span>
                         <span v-else>
                             {{ scope.row.creator }}

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

@@ -1205,7 +1205,7 @@
                                             + _this.$t('yuan')+"<br/>" : '') + 
                                             ((_this.permissions.countHours) ? _this.$t('screening.workTime')+" : " + params[0].data.cost + _this.$t('time.hour') : '');
                                         } else {
-                                            var res = "<ww-open-data type='departmentName' :openid='"+ _this.allListData.costList[params[0].dataIndex].additionName +"'></ww-open-data>" + "<br/>" + 
+                                            var res = "<TranslationOpenDataText type='departmentName' :openid='"+ _this.allListData.costList[params[0].dataIndex].additionName +"'></TranslationOpenDataText>" + "<br/>" + 
                                             ((_this.permissions.countCost) ? _this.$t('workcost')+" : " + params[0].data.money 
                                             + _this.$t('yuan')+"<br/>" : '') + 
                                             ((_this.permissions.countHours) ? _this.$t('screening.workTime')+" : " + params[0].data.cost + _this.$t('time.hour') : '');

+ 1 - 1
fhKeeper/formulahousekeeper/timesheet/src/views/project/fileCenter.vue

@@ -61,7 +61,7 @@
                     <template slot-scope="scope">
                         <div>
                             <span v-if="user.userNameNeedTranslate != 1">{{scope.row.creatorName}}</span>
-                            <span v-else><ww-open-data type='userName' :openid='scope.row.creatorName'></ww-open-data></span>
+                            <span v-else><TranslationOpenDataText type='userName' :openid='scope.row.creatorName'></TranslationOpenDataText></span>
                         </div>
                     </template>
                 </el-table-column>

+ 7 - 7
fhKeeper/formulahousekeeper/timesheet/src/views/project/finance.vue

@@ -48,7 +48,7 @@
                     <el-table-column prop="userName" :label="$t('other.operator')">
                         <template slot-scope="scope">
                             <div>
-                                <span v-if="user.userNameNeedTranslate == '1'"><ww-open-data type='userName' :openid='scope.row.userName'></ww-open-data></span>
+                                <span v-if="user.userNameNeedTranslate == '1'"><TranslationOpenDataText type='userName' :openid='scope.row.userName'></TranslationOpenDataText></span>
                                 <span v-if="user.userNameNeedTranslate != '1'">{{scope.row.userName}}</span>
                             </div>
                         </template>
@@ -102,7 +102,7 @@
                     <el-table-column prop="userName" :label="$t('other.operator')" width="100">
                         <template slot-scope="scope">
                             <div>
-                                <span v-if="user.userNameNeedTranslate == '1'"><ww-open-data type='userName' :openid='scope.row.userName'></ww-open-data></span>
+                                <span v-if="user.userNameNeedTranslate == '1'"><TranslationOpenDataText type='userName' :openid='scope.row.userName'></TranslationOpenDataText></span>
                                 <span v-if="user.userNameNeedTranslate != '1'">{{scope.row.userName}}</span>
                             </div>
                         </template>
@@ -189,7 +189,7 @@
             <el-table-column prop="name" :label="$t('lable.name')" sortable width="150" fixed="left">
                 <template slot-scope="scope">
                     <div>
-                        <span v-if="user.userNameNeedTranslate == '1'"><ww-open-data type='userName' :openid='scope.row.name'></ww-open-data></span>
+                        <span v-if="user.userNameNeedTranslate == '1'"><TranslationOpenDataText type='userName' :openid='scope.row.name'></TranslationOpenDataText></span>
                         <span v-if="user.userNameNeedTranslate != '1'">{{scope.row.name}}</span>
                         <!-- {{scope.row.name}} -->
                     </div>
@@ -271,13 +271,13 @@
         <!--用户详细信息弹出框-->
         <el-dialog :title="$t('Checkthedetails')" v-if="userDetailVisible" :visible.sync="userDetailVisible" :close-on-click-modal="false" customClass="customWidth" width="400px">
             <div class="line"><span>{{ $t('lable.name') }}</span>
-                <span v-if="user.userNameNeedTranslate == '1'"><ww-open-data type='userName' :openid='userDetail.name'></ww-open-data></span>
+                <span v-if="user.userNameNeedTranslate == '1'"><TranslationOpenDataText type='userName' :openid='userDetail.name'></TranslationOpenDataText></span>
                 <span v-if="user.userNameNeedTranslate != '1'">{{userDetail.name}}</span>
             </div>
             <div class="line"><span>{{ $t('Worknumber') }}</span><span>{{userDetail.jobNumber}}</span></div>
             <div class="line"><span>{{ $t('lable.phone') }}</span><span>{{userDetail.phone}}</span></div>
             <div class="line"><span>{{ $t('lable.department') }}</span>
-                <span v-if="user.userNameNeedTranslate == '1'"><ww-open-data type='departmentName' :openid='userDetail.departmentName'></ww-open-data></span>
+                <span v-if="user.userNameNeedTranslate == '1'"><TranslationOpenDataText type='departmentName' :openid='userDetail.departmentName'></TranslationOpenDataText></span>
                 <span v-if="user.userNameNeedTranslate != '1'">{{userDetail.departmentName}}</span>
             </div>
             <div class="line"><span>{{ $t('costof') }}</span><span>{{userDetail.cost}}{{$t('Yuananhour')}}</span></div>
@@ -318,7 +318,7 @@
             <el-table-column prop="jobNumber" label="工号" sortable ></el-table-column>
             <el-table-column prop="name" label="姓名" >
                 <template slot-scope="scope">
-                    <span v-if="user.userNameNeedTranslate == '1'"><ww-open-data type='userName' :openid='scope.row.name'></ww-open-data></span>
+                    <span v-if="user.userNameNeedTranslate == '1'"><TranslationOpenDataText type='userName' :openid='scope.row.name'></TranslationOpenDataText></span>
                     <span v-if="user.userNameNeedTranslate != '1'">{{scope.row.name}}</span>
                 </template>
             </el-table-column>
@@ -461,7 +461,7 @@
                     <el-table-column prop="name" :label="$t('lable.name')" sortable width="90" fixed="left">
                         <template slot-scope="scope">
                             <div>
-                                <span v-if="user.userNameNeedTranslate == '1'"><ww-open-data type='userName' :openid='scope.row.name'></ww-open-data></span>
+                                <span v-if="user.userNameNeedTranslate == '1'"><TranslationOpenDataText type='userName' :openid='scope.row.name'></TranslationOpenDataText></span>
                                 <span v-if="user.userNameNeedTranslate != '1'">{{scope.row.name}}</span>
                             </div>
                         </template>

+ 8 - 8
fhKeeper/formulahousekeeper/timesheet/src/views/project/info.vue

@@ -17,7 +17,7 @@
                         <el-col :span="5" ><span class="gray_label">{{ $t('subordinatedepartments') }}:</span></el-col><el-col :span="7" ></el-col>
                         <el-col :span="18" >
                             <span v-if="user.userNameNeedTranslate != 1">{{project.departmentName}}</span>
-                            <span v-if="user.userNameNeedTranslate == 1"><ww-open-data type='departmentName' :openid='project.departmentName'></ww-open-data></span>
+                            <span v-if="user.userNameNeedTranslate == 1"><TranslationOpenDataText type='departmentName' :openid='project.departmentName'></TranslationOpenDataText></span>
                         </el-col>
                     </el-row>
                     <el-row :gutter="10">
@@ -120,7 +120,7 @@
                     <div style="margin-top:10px;color:#999;">{{ $t('projectmanager') }}</div>
                     <div><el-link style="margin:10px" @click="showUser(project.inchargerId)">
                         <span v-if="user.userNameNeedTranslate != 1">{{project.inchargerName}}</span>
-                        <span v-else><ww-open-data type='userName' :openid='project.inchargerName'></ww-open-data></span>
+                        <span v-else><TranslationOpenDataText type='userName' :openid='project.inchargerName'></TranslationOpenDataText></span>
                     </el-link></div>
                     <div style="margin-top:10px;color:#999;">{{ user.timeType.reportCc == 1?'日报抄送人':$t('newspaperauditor') }}</div>
                     <div>
@@ -130,7 +130,7 @@
                                 {{item.auditorName}}
                             </span>
                             <span v-if="user.userNameNeedTranslate == 1">
-                                <ww-open-data type='userName' :openid='item.auditorName'></ww-open-data>
+                                <TranslationOpenDataText type='userName' :openid='item.auditorName'></TranslationOpenDataText>
                             </span>
                         </el-link>
                     </div>
@@ -139,7 +139,7 @@
                     <div v-show="project.isPublic == 0" >
                         <el-link v-for="item in project.participationList" :key="item.id" style="margin:10px;" @click="showUser(item.id)">
                             <span v-if="user.userNameNeedTranslate != 1">{{item.name}}</span>
-                            <span v-else><ww-open-data type='userName' :openid='item.name'></ww-open-data></span>
+                            <span v-else><TranslationOpenDataText type='userName' :openid='item.name'></TranslationOpenDataText></span>
                         </el-link>
                         <el-button class="el-icon-plus" @click="addMembVisible=true" size="mini"></el-button>
                     </div>
@@ -275,14 +275,14 @@
         <el-dialog :title="$t('Checkthedetails')" v-if="userDetailVisible" :visible.sync="userDetailVisible" :close-on-click-modal="false" customClass="customWidth" width="500px">
             <div class="line"><span>{{ $t('lable.name') }}</span>
                 <span v-if="user.userNameNeedTranslate != 1">{{userDetail.name}}</span>
-                <span v-if="user.userNameNeedTranslate == 1"><ww-open-data type='userName' :openid='userDetail.name'></ww-open-data></span>
+                <span v-if="user.userNameNeedTranslate == 1"><TranslationOpenDataText type='userName' :openid='userDetail.name'></TranslationOpenDataText></span>
             </div>
             <div class="line"><span>{{ $t('Worknumber') }}</span><span>{{userDetail.jobNumber}}</span></div>
             <div class="line"><span>{{ $t('lable.phone') }}</span><span>{{userDetail.phone}}</span></div>
             <div class="line"><span>{{ $t('jiao-se') }}</span><span>{{userDetail.roleName}}</span></div>
             <div class="line"><span>{{ $t('lable.department') }}</span>
                 <span v-if="user.userNameNeedTranslate != 1">{{userDetail.departmentName}}</span>
-                <span v-if="user.userNameNeedTranslate == 1"><ww-open-data type='departmentName' :openid='userDetail.departmentName'></ww-open-data></span>
+                <span v-if="user.userNameNeedTranslate == 1"><TranslationOpenDataText type='departmentName' :openid='userDetail.departmentName'></TranslationOpenDataText></span>
             </div>
             <div slot="footer" class="dialog-footer">
                 <el-button type="primary" @click="userDetailVisible = false" >{{ $t('btn.determine') }}</el-button>
@@ -315,7 +315,7 @@
             <el-table :data="contractRecordData" height="500px" :loading="contractRecordLoading" :default-sort="{prop: 'date', order: 'descending'}">
                 <el-table-column :label="$t('other.operator')" prop="name" min-width="100">
                     <template slot-scope="scope">
-                        <span v-if="user.userNameNeedTranslate == 1"><ww-open-data type='userName' :openid='filterUserContract(scope.row.editUserId)'></ww-open-data></span>
+                        <span v-if="user.userNameNeedTranslate == 1"><TranslationOpenDataText type='userName' :openid='filterUserContract(scope.row.editUserId)'></TranslationOpenDataText></span>
                         <span v-else>{{filterUserContract(scope.row.editUserId)}}</span>
                     </template>
                 </el-table-column>
@@ -570,7 +570,7 @@
                                        <span style="margin:0 5px;" v-for="item in scope.row.membList" :key="item.membId">
                                             <span v-if="user.userNameNeedTranslate != 1">{{item.membName}}({{item.percentage}}%)</span>
                                             <span v-if="user.userNameNeedTranslate == 1">
-                                                <ww-open-data type='userName' :openid='item.membName'></ww-open-data>({{item.percentage}}%)
+                                                <TranslationOpenDataText type='userName' :openid='item.membName'></TranslationOpenDataText>({{item.percentage}}%)
                                             </span>
                                         </span>
                                        <el-link @click="showEditPpMembs(scope.row)">

+ 15 - 15
fhKeeper/formulahousekeeper/timesheet/src/views/project/list.vue

@@ -241,7 +241,7 @@
                             {{scope.row.inchargerName}}
                         </span>
                         <span v-if="user.userNameNeedTranslate == 1">
-                            <ww-open-data type='userName' :openid='scope.row.inchargerName'></ww-open-data>
+                            <TranslationOpenDataText type='userName' :openid='scope.row.inchargerName'></TranslationOpenDataText>
                         </span>
                     </el-link>
                 </template>
@@ -275,7 +275,7 @@
                                         {{par.name}}
                                     </span>
                                     <span v-if="user.userNameNeedTranslate == 1">
-                                        <ww-open-data type='userName' :openid='par.name'></ww-open-data>
+                                        <TranslationOpenDataText type='userName' :openid='par.name'></TranslationOpenDataText>
                                     </span>
                                 </el-link>
                             </span>
@@ -286,7 +286,7 @@
                                             {{par.name}}
                                         </span>
                                         <span v-if="user.userNameNeedTranslate == 1">
-                                            <ww-open-data type='userName' :openid='par.name'></ww-open-data>
+                                            <TranslationOpenDataText type='userName' :openid='par.name'></TranslationOpenDataText>
                                         </span>
                                     </el-link>
                                 </span>
@@ -299,7 +299,7 @@
                                 {{par.name}}
                             </el-link>
                             <el-link style="margin-right:10px;" type="primary" :underline="false" @click="showUser(par.id)" v-if="user.userNameNeedTranslate == 1">
-                                <ww-open-data type='userName' :openid='par.name'></ww-open-data>
+                                <TranslationOpenDataText type='userName' :openid='par.name'></TranslationOpenDataText>
                             </el-link>
                         </span>
                     </div>
@@ -546,14 +546,14 @@
                             <div slot="content" style="width:780px">
                                 <span v-for="(item, index) in addFormUserNames" :key="index">
                                     <!-- {{item}} -->
-                                    <ww-open-data type='userName' :openid='item'></ww-open-data>
+                                    <TranslationOpenDataText type='userName' :openid='item'></TranslationOpenDataText>
                                     <span v-if="index < addFormUserNames.length - 1">,</span>
                                 </span>
                             </div>
                             <div @click="showChooseMembTree" style="width: 800px;overflow:hidden;white-space:nowrap;height:40px;border: 1px solid #DCDFE6;border-radius: 4px;box-sizing: border-box;padding: 0 10px">
                                 <span v-for="(item, index) in addFormUserNames" :key="index">
                                     <!-- {{item}} -->
-                                    <ww-open-data type='userName' :openid='item'></ww-open-data>
+                                    <TranslationOpenDataText type='userName' :openid='item'></TranslationOpenDataText>
                                     <span v-if="index < addFormUserNames.length - 1">,</span>
                                 </span>
                             </div>
@@ -814,7 +814,7 @@
                                     <template slot-scope="scope">
                                         <span style="margin:0 5px;" v-for="item in scope.row.membList" :key="item.membId">
                                                 <span v-if="user.userNameNeedTranslate != 1">{{item.membName}}({{item.percentage}}%)</span>
-                                                <span v-if="user.userNameNeedTranslate == 1"><ww-open-data type='userName' :openid='item.membName'></ww-open-data>({{item.percentage}}%)</span>
+                                                <span v-if="user.userNameNeedTranslate == 1"><TranslationOpenDataText type='userName' :openid='item.membName'></TranslationOpenDataText>({{item.percentage}}%)</span>
                                             </span>
                                         <el-link @click="showEditPpMembs(scope.row)">{{(scope.row.membList == null || scope.row.membList.length == 0)?$t('professionalparticipants'):$t('setup')}}</el-link>
                                     </template>
@@ -867,7 +867,7 @@
         <el-dialog :title="$t('Checkthedetails')" v-if="userDetailVisible" :visible.sync="userDetailVisible" :close-on-click-modal="false" customClass="customWidth" width="400px">
             <div class="line"><span>{{ $t('lable.name') }}</span>
                 <span v-if="user.userNameNeedTranslate != 1">{{userDetail.name}}</span>
-                <span v-if="user.userNameNeedTranslate == 1"><ww-open-data type='userName' :openid='userDetail.name'></ww-open-data></span>
+                <span v-if="user.userNameNeedTranslate == 1"><TranslationOpenDataText type='userName' :openid='userDetail.name'></TranslationOpenDataText></span>
             </div>
             <div class="line"><span>{{ $t('Worknumber') }}</span><span>{{userDetail.jobNumber}}</span></div>
             <div class="line"><span>{{ $t('lable.phone') }}</span><span>{{userDetail.phone}}</span></div>
@@ -875,7 +875,7 @@
             <div class="line"><span>{{ $t('lable.department') }}</span>
 
                 <span v-if="user.userNameNeedTranslate != 1">{{userDetail.departmentName}}</span>
-                <span v-if="user.userNameNeedTranslate == 1"><ww-open-data type='departmentName' :openid='userDetail.departmentName'></ww-open-data></span>
+                <span v-if="user.userNameNeedTranslate == 1"><TranslationOpenDataText type='departmentName' :openid='userDetail.departmentName'></TranslationOpenDataText></span>
             </div>
             <div slot="footer" class="dialog-footer">
                 <el-button type="primary" @click="userDetailVisible = false" >{{ $t('btn.determine') }}</el-button>
@@ -1261,10 +1261,10 @@
                         <span class="custom-tree-node" slot-scope="{ node, data }">
                             <span v-if="user.userNameNeedTranslate == '1'">
                                 <span v-if="node.data.children">
-                                    <ww-open-data type='departmentName' :openid='node.label'></ww-open-data>
+                                    <TranslationOpenDataText type='departmentName' :openid='node.label'></TranslationOpenDataText>
                                 </span>
                                 <span v-else>
-                                    <ww-open-data type='userName' :openid='node.label'></ww-open-data>
+                                    <TranslationOpenDataText type='userName' :openid='node.label'></TranslationOpenDataText>
                                 </span>
                             </span>
                             <span v-if="user.userNameNeedTranslate != '1'">
@@ -1359,14 +1359,14 @@
                         <div slot="content" style="width:580px">
                             <span v-for="(item, index) in addGroupPersonDataPersonNames" :key="index">
                                 <!-- {{item}} -->
-                                <ww-open-data type='userName' :openid='item'></ww-open-data>
+                                <TranslationOpenDataText type='userName' :openid='item'></TranslationOpenDataText>
                                 <span v-if="index < addGroupPersonDataPersonNames.length - 1">,</span>
                             </span>
                         </div>
                         <div @click="addGroupPersonP" style="width: 450px;overflow:hidden;white-space:nowrap;height:40px;border: 1px solid #DCDFE6;border-radius: 4px;box-sizing: border-box;padding: 0 10px">
                             <span v-for="(item, index) in addGroupPersonDataPersonNames" :key="index">
                                 <!-- {{item}} -->
-                                <ww-open-data type='userName' :openid='item'></ww-open-data>
+                                <TranslationOpenDataText type='userName' :openid='item'></TranslationOpenDataText>
                                 <span v-if="index < addGroupPersonDataPersonNames.length - 1">,</span>
                             </span>
                         </div>
@@ -1402,10 +1402,10 @@
                         <span class="custom-tree-node" slot-scope="{ node, data }">
                             <span v-if="user.userNameNeedTranslate == '1'">
                                 <span v-if="node.data.children">
-                                    <ww-open-data type='departmentName' :openid='node.label'></ww-open-data>
+                                    <TranslationOpenDataText type='departmentName' :openid='node.label'></TranslationOpenDataText>
                                 </span>
                                 <span v-else>
-                                    <ww-open-data type='userName' :openid='node.label'></ww-open-data>
+                                    <TranslationOpenDataText type='userName' :openid='node.label'></TranslationOpenDataText>
                                 </span>
                             </span>
                             <span v-if="user.userNameNeedTranslate != '1'">

+ 22 - 22
fhKeeper/formulahousekeeper/timesheet/src/views/project/projectInside.vue

@@ -99,7 +99,7 @@
                                 <el-form-item :label="$t('head') + ':'">
                                     <span v-if="user.userNameNeedTranslate != '1'">{{groupDetailData.incharger}}</span>
                                     <span v-if="user.userNameNeedTranslate == '1'">
-                                        <ww-open-data type='userName' :openid='groupDetailData.incharger'></ww-open-data>
+                                        <TranslationOpenDataText type='userName' :openid='groupDetailData.incharger'></TranslationOpenDataText>
                                     </span>
                                 </el-form-item>
                                 <el-form-item :label="$t('participantin') + ':'">
@@ -108,7 +108,7 @@
                                             {{item.userName}} 
                                         </span>
                                         <span v-if="user.userNameNeedTranslate == '1'"> 
-                                            <ww-open-data type='userName' :openid='item.userName'></ww-open-data>
+                                            <TranslationOpenDataText type='userName' :openid='item.userName'></TranslationOpenDataText>
                                         </span>
                                         <span v-if="index < groupDetailData.participators.length - 1">、</span>
                                     </span>
@@ -218,7 +218,7 @@
                                                                     {{exeItem.length>2?exeItem.substring(exeItem.length-2, exeItem.length):exeItem}}
                                                                 </span>
                                                                 <span v-if="user.userNameNeedTranslate == '1'">
-                                                                    <ww-open-data type='userName' :openid='exeItem'></ww-open-data>
+                                                                    <TranslationOpenDataText type='userName' :openid='exeItem'></TranslationOpenDataText>
                                                                 </span>
                                                             </span>
                                                             </span>
@@ -303,7 +303,7 @@
                                         </span>
                                         <span v-else>
                                             <span v-for="(item, index) in scope.row.executorName" :key="index">
-                                                <ww-open-data type='userName' :openid='item'></ww-open-data>
+                                                <TranslationOpenDataText type='userName' :openid='item'></TranslationOpenDataText>
                                                 <span v-if="index < scope.row.executorName.length - 1">,</span>
                                             </span>
                                         </span>
@@ -376,10 +376,10 @@
                         <span class="custom-tree-node" slot-scope="{ node, data }">
                             <span v-if="user.userNameNeedTranslate == '1'">
                                 <span v-if="node.data.children">
-                                    <ww-open-data type='departmentName' :openid='node.label'></ww-open-data>
+                                    <TranslationOpenDataText type='departmentName' :openid='node.label'></TranslationOpenDataText>
                                 </span>
                                 <span v-else>
-                                    <ww-open-data type='userName' :openid='node.label'></ww-open-data>
+                                    <TranslationOpenDataText type='userName' :openid='node.label'></TranslationOpenDataText>
                                 </span>
                             </span>
                             <span v-if="user.userNameNeedTranslate != '1'">
@@ -520,7 +520,7 @@
                                                         {{item.name}}
                                                     </span>
                                                     <span v-if="user.userNameNeedTranslate == '1'">
-                                                        <ww-open-data type='userName' :openid='item.name'></ww-open-data>
+                                                        <TranslationOpenDataText type='userName' :openid='item.name'></TranslationOpenDataText>
                                                     </span>
                                                 </span>
                                             </el-checkbox>
@@ -562,7 +562,7 @@
                                                 {{recentProgressInfo.creatorName}}
                                             </span>
                                             <span v-if="user.userNameNeedTranslate == '1'">
-                                                <ww-open-data type='userName' :openid='recentProgressInfo.creatorName'></ww-open-data>
+                                                <TranslationOpenDataText type='userName' :openid='recentProgressInfo.creatorName'></TranslationOpenDataText>
                                             </span>
                                         </span>
                                         {{ $t('geng-xin-yu') }}{{recentProgressInfo.indate | relativeTime}}
@@ -675,7 +675,7 @@
                                                 </span>
                                                 <span v-else>
                                                     <span v-for="item,index in scope.row.executorName" :key="index">
-                                                        <ww-open-data type='userName' :openid='item'></ww-open-data>
+                                                        <TranslationOpenDataText type='userName' :openid='item'></TranslationOpenDataText>
                                                         <span v-if="index < scope.row.executorName.length - 1">,</span>
                                                     </span>
                                                 </span>
@@ -724,7 +724,7 @@
                                     <div>
                                         <span v-if="user.userNameNeedTranslate != 1">{{scope.row.creatorName}}</span>
                                         <span v-if="user.userNameNeedTranslate == 1">
-                                            <ww-open-data type='userName' :openid='scope.row.creatorName'></ww-open-data>
+                                            <TranslationOpenDataText type='userName' :openid='scope.row.creatorName'></TranslationOpenDataText>
                                         </span>
                                     </div>
                                 </template>
@@ -799,7 +799,7 @@
                                     <span  v-for="(pl, i) in critic" :key="i">
                                     <span style="background: #778899" v-if="user.userNameNeedTranslate != 1">{{pl.length > 2 ? pl.substring(pl.length - 2, pl.length) : pl}}</span>
                                     <span v-if="user.userNameNeedTranslate == 1">
-                                        <ww-open-data type='userName' :openid='pl'></ww-open-data>
+                                        <TranslationOpenDataText type='userName' :openid='pl'></TranslationOpenDataText>
                                     </span>
                                     </span>
                                     <!-- <span style="background: #778899">{{pl.length}}</span> -->
@@ -826,7 +826,7 @@
                                                 {{item.userName.length > 2 ? item.userName.substring(item.userName.length - 2, item.userName.length) : item.userName}}
                                             </i>   
                                             <i v-if="user.userNameNeedTranslate == 1">
-                                                <ww-open-data type='userName' :openid='item.userName'></ww-open-data>
+                                                <TranslationOpenDataText type='userName' :openid='item.userName'></TranslationOpenDataText>
                                             </i>
                                         </i>
                                         <div>
@@ -836,14 +836,14 @@
                                                     {{item.userName}}
                                                 </p>
                                                 <p v-if="user.userNameNeedTranslate == 1">
-                                                    <ww-open-data type='userName' :openid='item.userName'></ww-open-data>
+                                                    <TranslationOpenDataText type='userName' :openid='item.userName'></TranslationOpenDataText>
                                                 </p>
                                             <!-- </p> -->
                                             <em>
                                                 <!-- {{item.content}} -->
                                                 <p style="display: inline-block;padding: 0;margin: 0;" v-if="user.userNameNeedTranslate == 1">
                                                     {{item.content.msg1}}
-                                                    <ww-open-data type='userName' :openid='item.content.msg2'></ww-open-data>
+                                                    <TranslationOpenDataText type='userName' :openid='item.content.msg2'></TranslationOpenDataText>
                                                     {{item.content.msg3}}
                                                 </p>
                                                 <p style="display: inline-block;padding: 0;margin: 0;" v-if="user.userNameNeedTranslate != 1">{{item.content}}</p>
@@ -860,7 +860,7 @@
                                         <p>
                                             {{ $t('tian-bao-ren') }}: <span v-if="user.userNameNeedTranslate != 1">{{item2.userName}}</span>
                                             <span v-if="user.userNameNeedTranslate == 1">
-                                                <ww-open-data type='userName' :openid='item2.userName'></ww-open-data>
+                                                <TranslationOpenDataText type='userName' :openid='item2.userName'></TranslationOpenDataText>
                                             </span>
                                             <span style="float: right;">{{item2.createDate}}</span>
                                         </p>
@@ -872,7 +872,7 @@
                                                             <!-- 待项目审核人 --> {{$t('other.waitForTheProjectReviewer')}}
                                                             <span v-if="item2.projectAuditorName != null">(
                                                                 <span v-if="user.userNameNeedTranslate == '1'">
-                                                                    <ww-open-data type='userName' :openid='item2.projectAuditorName'></ww-open-data>
+                                                                    <TranslationOpenDataText type='userName' :openid='item2.projectAuditorName'></TranslationOpenDataText>
                                                                 </span>
                                                                 <span v-if="user.userNameNeedTranslate != '1'">{{item2.projectAuditorName}}</span>
                                                                 )</span> 
@@ -883,7 +883,7 @@
                                                             <span v-if="item2.projectAuditorName != null">(
                                                                 <!-- {{item2.projectAuditorName}} -->
                                                                 <span v-if="user.userNameNeedTranslate == '1'">
-                                                                    <ww-open-data type='userName' :openid='item2.projectAuditorName'></ww-open-data>
+                                                                    <TranslationOpenDataText type='userName' :openid='item2.projectAuditorName'></TranslationOpenDataText>
                                                                 </span>
                                                                 <span v-if="user.userNameNeedTranslate != '1'">{{item2.projectAuditorName}}</span>
                                                                 )</span>
@@ -893,7 +893,7 @@
                                                     <span v-else-if="item2.isDeptAudit==1">
                                                         ({{$t('other.await')}}
                                                         <span v-if="user.userNameNeedTranslate == '1'">
-                                                            <ww-open-data type='departmentName' :openid='item2.auditDeptName'></ww-open-data>
+                                                            <TranslationOpenDataText type='departmentName' :openid='item2.auditDeptName'></TranslationOpenDataText>
                                                         </span>
                                                         <span v-if="user.userNameNeedTranslate != '1'">{{item2.auditDeptName}}</span>
                                                         {{$t('other.audit')}})
@@ -917,7 +917,7 @@
                                                             {{item2.projectAuditorName}}
                                                         </span>
                                                         <span v-if="user.userNameNeedTranslate == 1">
-                                                            <ww-open-data type='userName' :openid='item2.projectAuditorName'></ww-open-data>
+                                                            <TranslationOpenDataText type='userName' :openid='item2.projectAuditorName'></TranslationOpenDataText>
                                                         </span>
                                                     )
                                                 </span>{{$t('other.audit')}}</span>
@@ -1026,7 +1026,7 @@
                                 {{$t('dai-fen-pei')}}
                             </span>
                             <span v-else>
-                                <ww-open-data type='userName' :openid='scope.row.executorName'></ww-open-data>
+                                <TranslationOpenDataText type='userName' :openid='scope.row.executorName'></TranslationOpenDataText>
                             </span>
                         </span>
                     </template>
@@ -1038,13 +1038,13 @@
         <el-dialog :title="$t('Checkthedetails')" v-if="userDetailVisible" :visible.sync="userDetailVisible" :close-on-click-modal="false" customClass="customWidth" width="400px">
             <div class="line"><span>{{ $t('lable.name') }}</span>
                 <span v-if="user.userNameNeedTranslate != 1">{{userDetail.name}}</span>
-                <span v-if="user.userNameNeedTranslate == 1"><ww-open-data type='userName' :openid='userDetail.name'></ww-open-data></span>
+                <span v-if="user.userNameNeedTranslate == 1"><TranslationOpenDataText type='userName' :openid='userDetail.name'></TranslationOpenDataText></span>
             </div>
             <div class="line"><span>{{ $t('Worknumber') }}</span><span>{{userDetail.jobNumber}}</span></div>
             <div class="line"><span>{{ $t('lable.phone') }}</span><span>{{userDetail.phone}}</span></div>
             <div class="line"><span>{{ $t('lable.department') }}</span>
                 <span v-if="user.userNameNeedTranslate != 1">{{userDetail.departmentName}}</span>
-                <span v-if="user.userNameNeedTranslate == 1"><ww-open-data type='departmentName' :openid='userDetail.departmentName'></ww-open-data></span>
+                <span v-if="user.userNameNeedTranslate == 1"><TranslationOpenDataText type='departmentName' :openid='userDetail.departmentName'></TranslationOpenDataText></span>
             </div>
             <div class="line"><span>{{ $t('costof') }}</span><span>{{userDetail.cost}}{{ $t('Yuananhour') }}</span></div>
             <div slot="footer" class="dialog-footer">

+ 1 - 1
fhKeeper/formulahousekeeper/timesheet/src/views/project/project_gantt.vue

@@ -92,7 +92,7 @@
           <div>
             <span v-if="user.userNameNeedTranslate == 1">
               <span v-for="(item, index) in scope.row.activeUsers" :key="index">
-                <ww-open-data type='userName' :openid='item'></ww-open-data>
+                <TranslationOpenDataText type='userName' :openid='item'></TranslationOpenDataText>
                 <span v-if="index < scope.row.activeUsers.length - 1">,</span>
               </span>
             </span>

+ 5 - 5
fhKeeper/formulahousekeeper/timesheet/src/views/project/vueGantt.vue

@@ -4,8 +4,8 @@
         <el-table-column prop="text" label="姓名" width="240" fixed="left" v-if="stafforpro != '按项目查看'">
           <template slot-scope="scope">
               <!-- user.userNameNeedTranslate == 1 -->
-              <span v-if="user.userNameNeedTranslate == 1 && scope.row.translationType == 'department'"><ww-open-data type='departmentName' :openid='scope.row.text'></ww-open-data></span>
-              <span v-if="user.userNameNeedTranslate == 1 && scope.row.translationType == 'user'"><ww-open-data type='userName' :openid='scope.row.text'></ww-open-data></span>
+              <span v-if="user.userNameNeedTranslate == 1 && scope.row.translationType == 'department'"><TranslationOpenDataText type='departmentName' :openid='scope.row.text'></TranslationOpenDataText></span>
+              <span v-if="user.userNameNeedTranslate == 1 && scope.row.translationType == 'user'"><TranslationOpenDataText type='userName' :openid='scope.row.text'></TranslationOpenDataText></span>
               <span v-if="user.userNameNeedTranslate == 1 && (scope.row.translationType == 'null' || scope.row.translationType == null)">{{scope.row.text}}</span>
               <span v-if="user.userNameNeedTranslate != 1">{{scope.row.text}}</span>
           </template>
@@ -14,8 +14,8 @@
           <template slot-scope="scope">
             <span v-if="user.userNameNeedTranslate == 1 && scope.row.translationType == 'user'">
               <span v-for="(item, index) in scope.row.userNameList" :key="index">
-                <!-- <ww-open-data type='userName' :openid='scope.row.text'></ww-open-data> -->
-                <ww-open-data type='userName' :openid='item'></ww-open-data>
+                <!-- <TranslationOpenDataText type='userName' :openid='scope.row.text'></TranslationOpenDataText> -->
+                <TranslationOpenDataText type='userName' :openid='item'></TranslationOpenDataText>
                 <span v-if="index < scope.row.userNameList.length - 1">,</span>
               </span>
             </span>
@@ -29,7 +29,7 @@
               <template slot-scope="scope">
                 <div>
                   <!-- <span v-if="scope.row.translationType == 'user' && scope.column.label.indexof(scope.row.end_date) != '-1'">
-                    <ww-open-data type='userName' :openid='scope.row.text'></ww-open-data>
+                    <TranslationOpenDataText type='userName' :openid='scope.row.text'></TranslationOpenDataText>
                   </span> -->
                   <span v-if="scope.row.translationType != 'user' && stafforpro != '按项目查看'">
                     <!-- {{scope.row.end_date | dataValue(scope.column, scope.row)}} -->

+ 11 - 11
fhKeeper/formulahousekeeper/timesheet/src/views/projectApproval/projectApproval.vue

@@ -61,7 +61,7 @@
                                         {{scope.row.inchargerName}}
                                     </span>
                                     <span v-if="user.userNameNeedTranslate == 1">
-                                        <ww-open-data type='userName' :openid='scope.row.inchargerName'></ww-open-data>
+                                        <TranslationOpenDataText type='userName' :openid='scope.row.inchargerName'></TranslationOpenDataText>
                                     </span>
                                 </el-link>
                             </template>
@@ -141,14 +141,14 @@
                                         <div slot="content" style="width:780px">
                                             <span v-for="(item, index) in addFormUserNames" :key="index">
                                                 <!-- {{item}} -->
-                                                <ww-open-data type='userName' :openid='item'></ww-open-data>
+                                                <TranslationOpenDataText type='userName' :openid='item'></TranslationOpenDataText>
                                                 <span v-if="index < addFormUserNames.length - 1">,</span>
                                             </span>
                                         </div>
                                         <div @click="showChooseMembTree" style="width: 800px;overflow:hidden;white-space:nowrap;height:40px;border: 1px solid #DCDFE6;border-radius: 4px;box-sizing: border-box;padding: 0 10px">
                                             <span v-for="(item, index) in addFormUserNames" :key="index">
                                                 <!-- {{item}} -->
-                                                <ww-open-data type='userName' :openid='item'></ww-open-data>
+                                                <TranslationOpenDataText type='userName' :openid='item'></TranslationOpenDataText>
                                                 <span v-if="index < addFormUserNames.length - 1">,</span>
                                             </span>
                                         </div>
@@ -272,10 +272,10 @@
                                     <span class="custom-tree-node" slot-scope="{ node, data }">
                                         <span v-if="user.userNameNeedTranslate == '1'">
                                             <span v-if="node.data.children">
-                                                <ww-open-data type='departmentName' :openid='node.label'></ww-open-data>
+                                                <TranslationOpenDataText type='departmentName' :openid='node.label'></TranslationOpenDataText>
                                             </span>
                                             <span v-else>
-                                                <ww-open-data type='userName' :openid='node.label'></ww-open-data>
+                                                <TranslationOpenDataText type='userName' :openid='node.label'></TranslationOpenDataText>
                                             </span>
                                         </span>
                                         <span v-if="user.userNameNeedTranslate != '1'">
@@ -296,7 +296,7 @@
                     <el-dialog :title="$t('Checkthedetails')" v-if="userDetailVisible" :visible.sync="userDetailVisible" :close-on-click-modal="false" customClass="customWidth" width="400px">
                         <div class="line"><span>{{ $t('lable.name') +":"}}</span>
                             <span v-if="user.userNameNeedTranslate != 1">{{userDetail.name}}</span>
-                            <span v-if="user.userNameNeedTranslate == 1"><ww-open-data type='userName' :openid='userDetail.name'></ww-open-data></span>
+                            <span v-if="user.userNameNeedTranslate == 1"><TranslationOpenDataText type='userName' :openid='userDetail.name'></TranslationOpenDataText></span>
                         </div>
                         <div class="line"><span>{{ $t('Worknumber') +":"}}</span><span>{{userDetail.jobNumber}}</span></div>
                         <div class="line"><span>{{ $t('lable.phone') +":"}}</span><span>{{userDetail.phone}}</span></div>
@@ -304,7 +304,7 @@
                         <div class="line"><span>{{ $t('lable.department') +":"}}</span>
 
                             <span v-if="user.userNameNeedTranslate != 1">{{userDetail.departmentName}}</span>
-                            <span v-if="user.userNameNeedTranslate == 1"><ww-open-data type='departmentName' :openid='userDetail.departmentName'></ww-open-data></span>
+                            <span v-if="user.userNameNeedTranslate == 1"><TranslationOpenDataText type='departmentName' :openid='userDetail.departmentName'></TranslationOpenDataText></span>
                         </div>
                         <div slot="footer" class="dialog-footer">
                             <el-button type="primary" @click="userDetailVisible = false" >{{ $t('btn.determine') }}</el-button>
@@ -324,14 +324,14 @@
                                     {{par.userName}}
                                 </span>
                                 <span v-if="user.userNameNeedTranslate == 1">
-                                    <ww-open-data type='userName' :openid='par.userName'></ww-open-data>
+                                    <TranslationOpenDataText type='userName' :openid='par.userName'></TranslationOpenDataText>
                                 </span>
                                 <span v-if="index < projectApprocalDetail.participationApprovalList.length-1">,</span>
                             </span>
                         </div>
                         <div class="line"><span>{{'项目经理:'}}</span>
                             <span v-if="user.userNameNeedTranslate != 1">{{projectApprocalDetail.inchargerName}}</span>
-                            <span v-if="user.userNameNeedTranslate == 1&&projectApprocalDetail.inchargerName"><ww-open-data type='userName' :openid='projectApprocalDetail.inchargerName'></ww-open-data></span>
+                            <span v-if="user.userNameNeedTranslate == 1&&projectApprocalDetail.inchargerName"><TranslationOpenDataText type='userName' :openid='projectApprocalDetail.inchargerName'></TranslationOpenDataText></span>
                         </div>
                         <div class="line"><span>{{'日报审核人:'}}</span>
                             <span v-for="(par,index) in projectApprocalDetail.projectApprovalAuditorList" :key="par.auditorId">
@@ -339,7 +339,7 @@
                                     {{par.auditorName}}
                                 </span>
                                 <span v-if="user.userNameNeedTranslate == 1">
-                                    <ww-open-data type='userName' :openid='par.auditorName'></ww-open-data>
+                                    <TranslationOpenDataText type='userName' :openid='par.auditorName'></TranslationOpenDataText>
                                 </span>
                                 <span v-if="index < projectApprocalDetail.projectApprovalAuditorList.length-1">,</span>
                             </span>
@@ -363,7 +363,7 @@
                         </div>
                         <div class="line" v-for="(item,index) in approvalLogData">
                             <span v-if="user.userNameNeedTranslate != 1">{{item.userName}} {{item.createTime}} {{approvalTypeStr[item.type]}}了日报</span>
-                            <span v-if="user.userNameNeedTranslate == 1"><ww-open-data type='userName' :openid='item.userName'></ww-open-data> {{item.createTime}}{{approvalTypeStr[item.type]}}了日报</span>
+                            <span v-if="user.userNameNeedTranslate == 1"><TranslationOpenDataText type='userName' :openid='item.userName'></TranslationOpenDataText> {{item.createTime}}{{approvalTypeStr[item.type]}}了日报</span>
                         </div>
                         <div slot="footer" class="dialog-footer">
                             <el-button type="primary" @click="projectApprovalDetailVisible = false" >{{'关闭'}}</el-button>

+ 11 - 11
fhKeeper/formulahousekeeper/timesheet/src/views/settings/timetype.vue

@@ -239,7 +239,7 @@
                             <el-tag style="margin:10px 0 0 10px" v-for="item in whiteList" :key="item.id" closable @close="whiteDelete(item)">
                                 <!-- {{item.label}} -->
                                 <span v-if="user.userNameNeedTranslate != '1'">{{item.label}}</span>
-                                <span v-if="user.userNameNeedTranslate == '1'"><ww-open-data type='userName' :openid='item.label'></ww-open-data></span>
+                                <span v-if="user.userNameNeedTranslate == '1'"><TranslationOpenDataText type='userName' :openid='item.label'></TranslationOpenDataText></span>
                             </el-tag>
                         </div>
 
@@ -464,7 +464,7 @@
                     <div v-if="user.userNameNeedTranslate != '1'">{{ scope.row.targetDeptsNames }}</div>
                     <div v-else>
                         <span v-for="(v,i) in (scope.row.newDeptName || [])">
-                            <ww-open-data type='departmentName' :openid='v'></ww-open-data>
+                            <TranslationOpenDataText type='departmentName' :openid='v'></TranslationOpenDataText>
                             <span v-if="i < (scope.row.newDeptName || []).length - 1">,</span>
                         </span>
                     </div>
@@ -475,7 +475,7 @@
                     <div v-if="user.userNameNeedTranslate != '1'">{{ scope.row.targetUsersNames }}</div>
                     <div v-else>
                         <span v-for="(v,i) in (scope.row.newDeptName || [])">
-                            <ww-open-data type='userName' :openid='v'></ww-open-data>
+                            <TranslationOpenDataText type='userName' :openid='v'></TranslationOpenDataText>
                             <span v-if="i < (scope.row.newUserName || []).length - 1">,</span>
                         </span>
                     </div>
@@ -515,7 +515,7 @@
                         <div class="contents">
                             <el-tag style="margin:10px 0 0 10px" v-for="(item, index) in specialHolidaysDept.labels" :key="item.id" closable @close="specialHolidaysDelete('specialHolidaysDept', index)">
                                 <span v-if="user.userNameNeedTranslate != '1'">{{item}}</span>
-                                <span v-if="user.userNameNeedTranslate == '1'"><ww-open-data type='departmentName' :openid='item'></ww-open-data></span>
+                                <span v-if="user.userNameNeedTranslate == '1'"><TranslationOpenDataText type='departmentName' :openid='item'></TranslationOpenDataText></span>
                             </el-tag>
                         </div>
                     </div>
@@ -524,7 +524,7 @@
                         <div class="contents">
                             <el-tag style="margin:10px 0 0 10px" v-for="(item, index) in specialHolidaysUser.labels" :key="item.id" closable @close="specialHolidaysDelete('specialHolidaysUser', index)">
                                 <span v-if="user.userNameNeedTranslate != '1'">{{item}}</span>
-                                <span v-if="user.userNameNeedTranslate == '1'"><ww-open-data type='userName' :openid='item'></ww-open-data></span>
+                                <span v-if="user.userNameNeedTranslate == '1'"><TranslationOpenDataText type='userName' :openid='item'></TranslationOpenDataText></span>
                             </el-tag>
                         </div>
                     </div>
@@ -590,7 +590,7 @@
                         </div>
                         <div v-else>
                             <div v-if="user.userNameNeedTranslate == 1">
-                                <ww-open-data type='departmentName' :openid='scope.row.dname'></ww-open-data>
+                                <TranslationOpenDataText type='departmentName' :openid='scope.row.dname'></TranslationOpenDataText>
                             </div>
                             <div v-else>{{scope.row.dname}}</div>
                         </div>
@@ -636,7 +636,7 @@
                             <span class="custom-tree-node" slot-scope="{ node }">
                                 <span v-if="!user.userNameNeedTranslate == 1">{{ node.label }} </span>
                                 <span v-if="user.userNameNeedTranslate == 1">
-                                    <ww-open-data type='departmentName' :openid='node.label'></ww-open-data>
+                                    <TranslationOpenDataText type='departmentName' :openid='node.label'></TranslationOpenDataText>
                                 </span>
                             </span>
                         </el-tree>
@@ -668,10 +668,10 @@
                         <span class="custom-tree-node" slot-scope="{ node, data }">
                             <span v-if="user.userNameNeedTranslate == '1'">
                                 <span v-if="node.data.children">
-                                    <ww-open-data type='departmentName' :openid='node.label'></ww-open-data>
+                                    <TranslationOpenDataText type='departmentName' :openid='node.label'></TranslationOpenDataText>
                                 </span>
                                 <span v-else>
-                                    <ww-open-data type='userName' :openid='node.label'></ww-open-data>
+                                    <TranslationOpenDataText type='userName' :openid='node.label'></TranslationOpenDataText>
                                 </span>
                             </span>
                             <span v-if="user.userNameNeedTranslate != '1'">
@@ -707,10 +707,10 @@
                         <span class="custom-tree-node" slot-scope="{ node, data }">
                             <span v-if="user.userNameNeedTranslate == '1'">
                                 <span v-if="node.data.children">
-                                    <ww-open-data type='departmentName' :openid='node.label'></ww-open-data>
+                                    <TranslationOpenDataText type='departmentName' :openid='node.label'></TranslationOpenDataText>
                                 </span>
                                 <span v-else>
-                                    <ww-open-data type='userName' :openid='node.label'></ww-open-data>
+                                    <TranslationOpenDataText type='userName' :openid='node.label'></TranslationOpenDataText>
                                 </span>
                             </span>
                             <span v-if="user.userNameNeedTranslate != '1'">

+ 4 - 4
fhKeeper/formulahousekeeper/timesheet/src/views/task/list.vue

@@ -151,7 +151,7 @@
                     <el-table-column prop="departmentName" :label="$t('subordinatedepartments')" sortable width="300" v-if="user.timeType.projectWithDept">
                         <template slot-scope="scope">
                             <div>
-                                <span v-if="user.userNameNeedTranslate == '1'"><ww-open-data type='departmentName' :openid='scope.row.departmentName'></ww-open-data></span>
+                                <span v-if="user.userNameNeedTranslate == '1'"><TranslationOpenDataText type='departmentName' :openid='scope.row.departmentName'></TranslationOpenDataText></span>
                                 <span v-if="user.userNameNeedTranslate != '1'">{{departmentName}}</span>
                             </div>
                         </template>
@@ -161,7 +161,7 @@
                             <!-- <el-link type="primary" @click="showUser(scope.row.executorId)">{{scope.row.executorName}}</el-link> -->
                             <span v-if="user.userNameNeedTranslate == '1'">
                                 <span v-for="(item, index) in scope.row.executorNameList" :key="index">
-                                    <ww-open-data type='userName' :openid='item'></ww-open-data>
+                                    <TranslationOpenDataText type='userName' :openid='item'></TranslationOpenDataText>
                                     <span v-if="index < scope.row.executorNameList.length - 1">,</span>
                                 </span>
                             </span>
@@ -227,13 +227,13 @@
         <!--用户详细信息弹出框-->
         <el-dialog :title="$t('Checkthedetails')" v-if="userDetailVisible" :visible.sync="userDetailVisible" :close-on-click-modal="false" customClass="customWidth" width="400px">
             <div class="line"><span>{{ $t('lable.name') }}</span>
-                <span v-if="user.userNameNeedTranslate == '1'"><ww-open-data type='userName' :openid='userDetail.name'></ww-open-data></span>
+                <span v-if="user.userNameNeedTranslate == '1'"><TranslationOpenDataText type='userName' :openid='userDetail.name'></TranslationOpenDataText></span>
                 <span v-if="user.userNameNeedTranslate != '1'">{{userDetail.name}}</span>
             </div>
             <div class="line"><span>{{ $t('Worknumber') }}</span><span>{{userDetail.jobNumber}}</span></div>
             <div class="line"><span>{{ $t('lable.phone') }}</span><span>{{userDetail.phone}}</span></div>
             <div class="line"><span>{{ $t('lable.department') }}</span>
-                <span v-if="user.userNameNeedTranslate == '1'"><ww-open-data type='departmentName' :openid='userDetail.name'></ww-open-data></span>
+                <span v-if="user.userNameNeedTranslate == '1'"><TranslationOpenDataText type='departmentName' :openid='userDetail.name'></TranslationOpenDataText></span>
                 <span v-if="user.userNameNeedTranslate != '1'">{{userDetail.departmentName}}</span>
             </div>
             <div class="line"><span>{{ $t('costof') }}</span><span>{{userDetail.cost}}{{ $t('Yuananhour') }}</span></div>

+ 14 - 12
fhKeeper/formulahousekeeper/timesheet/src/views/team/index.vue

@@ -27,7 +27,7 @@
                     <span class="custom-tree-node" style="position: relative;box-sizing: border-box;width: 10%;" slot-scope="{ node }" @mouseleave= mouseleave(data,$event) @mouseover= mouseover(data,$event)>
                         <span style="padding-right: 50px;box-sizing: border-box;overflow:hidden;text-overflow:ellipsis;line-height: 36px; display: inline-block;">
                           <span v-if="user.userNameNeedTranslate == '1'">
-                            <ww-open-data type='departmentName' :openid='node.label'></ww-open-data>
+                            <TranslationOpenDataText type='departmentName' :openid='node.label'></TranslationOpenDataText>
                           </span>
                           <span v-else>
                             {{ node.label }} <i v-if="node.data.ddDeptid != null" class="iconfont firerock-icondingding"></i>
@@ -80,8 +80,8 @@
                             <i class="fa fa-pencil-square-o"></i>
                             <!-- {{depData !=null ? depData.label : ''}} -->
                             <span v-if="translation == '1' && user.userNameNeedTranslate == '1'">{{depData != null ?depData.label:""}}</span>
-                            <span v-if="translation == '2' && user.userNameNeedTranslate == '1'"><ww-open-data type='departmentName' :openid='depData.label'></ww-open-data></span>
-                            <span v-if="translation == '3' && user.userNameNeedTranslate == '1'"><ww-open-data type='userName' :openid='depData.label'></ww-open-data></span>
+                            <span v-if="translation == '2' && user.userNameNeedTranslate == '1'"><TranslationOpenDataText type='departmentName' :openid='depData.label'></TranslationOpenDataText></span>
+                            <span v-if="translation == '3' && user.userNameNeedTranslate == '1'"><TranslationOpenDataText type='userName' :openid='depData.label'></TranslationOpenDataText></span>
                             <span v-if="user.userNameNeedTranslate != '1'">{{depData != null ?depData.label:""}}</span>
                             <!-- <i class="iconfont firerock-icondingding"></i> -->
                             <!-- {{translation}} -->
@@ -202,7 +202,7 @@
                         <img src="../../assets/image/qiyeweix.png" alt="">
                       </span>
                       <div v-if="user.userNameNeedTranslate == 1">
-                        <ww-open-data type='userName' :openid='scope.row.name'></ww-open-data>
+                        <TranslationOpenDataText type='userName' :openid='scope.row.name'></TranslationOpenDataText>
                       </div>
                       <div v-else>{{scope.row.name}}</div>
                     </div>
@@ -214,7 +214,7 @@
                   <template slot-scope="scope">
                     <div>
                       <div v-if="user.userNameNeedTranslate == 1">
-                        <ww-open-data type='departmentName' :openid='scope.row.departmentName'></ww-open-data>
+                        <TranslationOpenDataText type='departmentName' :openid='scope.row.departmentName'></TranslationOpenDataText>
                       </div>
                       <div v-else>{{scope.row.departmentName}}</div>
                     </div>
@@ -224,7 +224,7 @@
                   <template slot-scope="scope">
                     <div>
                       <div v-if="user.userNameNeedTranslate == 1">
-                        <ww-open-data type='userName' :openid='scope.row.superiorCorpwxUserid'></ww-open-data>
+                        <TranslationOpenDataText type='userName' :openid='scope.row.superiorCorpwxUserid'></TranslationOpenDataText>
                       </div>
                       <div v-else>{{scope.row.superiorName}}</div>
                     </div>
@@ -353,7 +353,7 @@
             <el-form ref="depForm" :model="depForm" :rules="depRules" label-width="100px">
                 <el-form-item :label="$t('departmentname')" prop="name">
                     <el-input v-model="depForm.name" :placeholder="$t('peaseenterthe')" clearable style="width: 100%" v-if="user.userNameNeedTranslate != '1'"></el-input>
-                    <div v-if="user.userNameNeedTranslate == '1'"><ww-open-data type='departmentName' :openid='depForm.name'></ww-open-data></div>
+                    <div v-if="user.userNameNeedTranslate == '1'"><TranslationOpenDataText type='departmentName' :openid='depForm.name'></TranslationOpenDataText></div>
                 </el-form-item>
 
                 <!-- 主要负责人 -->
@@ -375,7 +375,7 @@
                           <span style="float: right; color: #8492a6; font-size: 13px">{{ item.jobNumber }}</span>
                         </el-option>
                     </el-select>
-                    <selectCat :size="'medium'" :filterable="true" :widthStr="'360'" v-if="user.userNameNeedTranslate == '1' && departmentVisible" :subject="users" :subjectId="depForm.otherManagerIds" :distinction="'4'" :clearable="true" @selectCal="selectCal"></selectCat>
+                    <selectCat :subject="users" :subjectId="depForm.otherManagerIds" :size="'medium'" :filterable="true" :widthStr="'360'" :multiSelect="true" v-if="user.userNameNeedTranslate == '1' && departmentVisible"  :distinction="'4'" :clearable="true" @selectCal="selectCal"></selectCat>
                 </el-form-item>
                 <!-- 直属领导 -->
                 <el-form-item :label="$t('leadership')" prop="reportAuditUserid" v-if="user.timeType.needDeptAudit">
@@ -406,7 +406,7 @@
                       <el-input v-model="insertForm.name" :placeholder="$t('peaseenterthe')" clearable :disabled="user.userNameNeedTranslate == '1'"></el-input>
                   </el-form-item>
                   <el-form-item :label="$t('lable.name')" prop="name"  v-if="user.userNameNeedTranslate == '1'">
-                      <div><ww-open-data type='userName' :openid='insertForm.name'></ww-open-data></div>
+                      <div><TranslationOpenDataText type='userName' :openid='insertForm.name'></TranslationOpenDataText></div>
                   </el-form-item>
                   <el-form-item :label="$t('phone')" prop="phone">
                       <el-input v-model="insertForm.phone" :placeholder="$t('peaseenterthe')" clearable></el-input>
@@ -537,7 +537,7 @@
             <el-table :data="userSalaryList" highlight-current-row v-loading="listLoading" height="300px" style="width: 100%;">
                 <el-table-column prop="userName" :label="$t('lable.name')" >
                   <template slot-scope="scope">
-                    <span v-if="user.userNameNeedTranslate == 1"><ww-open-data type='userName' :openid='scope.row.userName'></ww-open-data></span>
+                    <span v-if="user.userNameNeedTranslate == 1"><TranslationOpenDataText type='userName' :openid='scope.row.userName'></TranslationOpenDataText></span>
                     <span v-else>{{scope.row.userName}}</span>
                   </template>
                   
@@ -3631,7 +3631,7 @@ export default {
     //                                 console.log(result, '请求微信成功')
     //                                 console.log(window, 'window')
     //                                 //  wx.agentConfig成功回调后,WWOpenData 才会注入到 window 对象上面
-    //                                 window.WWOpenData.bind(document.querySelector('ww-open-data'))
+    //                                 window.WWOpenData.bind(document.querySelector('TranslationOpenDataText'))
     //                             },
     //                             fail: function (res) {
     //                                 console.log('查看错误信息', res)
@@ -3668,8 +3668,10 @@ export default {
     } ,
     // 自定义组件事件
     selectCal(obj) {
+      console.log(obj, '<=== 返回的数据')
       if(obj.distinction == '4') {
-        this.depForm.otherManagerIds = obj.id
+        let userList = obj.arrUserList || []
+        this.depForm.otherManagerIds = userList.map(item => item.id)
       } else if(obj.distinction == '3') {
         this.depForm.managerId = obj.id
       } else if(obj.distinction == '5'){

+ 45 - 61
fhKeeper/formulahousekeeper/timesheet/src/views/workReport/daily.vue

@@ -48,22 +48,10 @@
                                 </el-select>
                             </div>
                             <div>
-                                <!-- <el-tree :data="data" @node-click="handleNodeClick" @node-collapse="nodeChange" @node-expand="nodeChange" node-key="id" :default-expanded-keys="expandDate" v-loading="dataLoading"> -->
                                 <el-tree :data="data" @node-click="handleNodeClick" @node-collapse="nodeChangeCollapse" @node-expand="nodeChangeExpand" ref="treeDataRef" :default-expanded-keys="nodeModelData" node-key="id" v-loading="dataLoading">
                                     <span class="custom-tree-node"  style="position: relative;box-sizing: border-box;width: 10%;" slot-scope="{ node, data}">
-                                        <!-- <span>{{ node.label }}</span> -->
                                         <span style="padding-right: 50px;box-sizing: border-box;overflow:hidden;text-overflow:ellipsis;line-height: 36px; display: inline-block;">
-                                            <span v-if="user.userNameNeedTranslate == '1'">
-                                                <span v-if="node.data.children">
-                                                    <ww-open-data type='departmentName' :openid='node.label'></ww-open-data>
-                                                </span>
-                                                <span v-else>
-                                                    <ww-open-data type='userName' :openid='node.label'></ww-open-data>
-                                                </span>
-                                            </span>
-                                            <span v-if="user.userNameNeedTranslate != '1'">
-                                                {{ node.label }}
-                                            </span>
+                                            <TranslationOpenData :configurationItems="{ openType: node.data.children ? 'departmentName' : 'userName', openId: node.label, renderIndex: 0 }"/>
                                             
                                             <span v-if="data.membCount != null && data.isUser == null">({{data.membCount}})</span>
                                         </span>
@@ -118,8 +106,12 @@
                                     <span v-if="permissions.reportsCompany||user.manageDeptId != 0 || permissions.reportsDept"> | 
                                         <!-- {{depData != null ?depData.label:""}} -->
                                         <span v-if="translation == '1' && user.userNameNeedTranslate == '1'">{{depData != null ?depData.label:""}}</span>
-                                        <span v-if="translation == '2' && user.userNameNeedTranslate == '1'"><ww-open-data type='departmentName' :openid='depData.label'></ww-open-data></span>
-                                        <span v-if="translation == '3' && user.userNameNeedTranslate == '1'"><ww-open-data type='userName' :openid='depData.label'></ww-open-data></span>
+                                        <span v-if="translation == '2' && user.userNameNeedTranslate == '1'">
+                                            <TranslationOpenData :configurationItems="{ openType: 'departmentName', openId: depData.label, renderIndex: 0 }" />
+                                        </span>
+                                        <span v-if="translation == '3' && user.userNameNeedTranslate == '1'">
+                                            <TranslationOpenData :configurationItems="{ openType: 'userName', openId: depData.label, renderIndex: 0 }" />
+                                        </span>
                                         <span v-if="user.userNameNeedTranslate != '1'">{{depData != null ?depData.label:""}}</span>
                                     <span v-if="targetUid == null">
                                     <!-- - 已提交 -->
@@ -158,7 +150,7 @@
                                     <i class="fa fa-circle"></i>
                                     <!-- {{item1.name}} -->
                                     <span v-if="user.userNameNeedTranslate == '1'">
-                                        <ww-open-data type='userName' :openid='item1.name'></ww-open-data>
+                                        <TranslationOpenData :configurationItems="{ openType: 'userName', openId: item1.name, renderIndex: 0 }" />
                                     </span>
                                     <span v-if="user.userNameNeedTranslate != '1'">
                                         {{item1.name}}
@@ -202,10 +194,7 @@
                                                                 <!-- 待项目审核人 --> {{$t('other.waitForTheProjectReviewer')}}
                                                                 <span v-if="item2.projectAuditorName != null">(
                                                                     <!-- {{item2.projectAuditorName}} -->
-                                                                    <span v-if="user.userNameNeedTranslate == '1'">
-                                                                        <ww-open-data type='userName' :openid='item2.projectAuditorName'></ww-open-data>
-                                                                    </span>
-                                                                    <span v-if="user.userNameNeedTranslate != '1'">{{item2.projectAuditorName}}</span>
+                                                                    <TranslationOpenData :configurationItems="{ openType: 'userName', openId: item2.projectAuditorName, renderIndex: 0 }" />
                                                                     )</span> 
                                                                 <!-- 审核 --> {{$t('other.audit')}}
                                                             </span>
@@ -213,10 +202,7 @@
                                                                 <!-- 项目审核人 --> {{$t('other.projectAuditor')}}
                                                                 <span v-if="item2.projectAuditorName != null">(
                                                                     <!-- {{item2.projectAuditorName}} -->
-                                                                    <span v-if="user.userNameNeedTranslate == '1'">
-                                                                        <ww-open-data type='userName' :openid='item2.projectAuditorName'></ww-open-data>
-                                                                    </span>
-                                                                    <span v-if="user.userNameNeedTranslate != '1'">{{item2.projectAuditorName}}</span>
+                                                                    <TranslationOpenData :configurationItems="{ openType: 'userName', openId: item2.projectAuditorName, renderIndex: 0 }" />
                                                                     )</span>
                                                                 <!-- 审核通过 --> {{$t('state.approved')}}
                                                             </span>
@@ -224,10 +210,7 @@
                                                         <span v-else-if="item2.isDeptAudit==1">
                                                             <!-- {{($t('other.await') +' '+ item2.auditDeptName +' '+ $t('other.audit'))}} -->
                                                             ({{$t('other.await')}}
-                                                            <span v-if="user.userNameNeedTranslate == '1'">
-                                                                <ww-open-data type='departmentName'   :openid='user.timeType.reportAuditType==4?item2.buDepartmentName:item2.auditDeptName'></ww-open-data>
-                                                            </span>
-                                                            <span v-if="user.userNameNeedTranslate != '1'">{{user.timeType.reportAuditType==4?item2.buDepartmentName:item2.auditDeptName}}</span>
+                                                            <TranslationOpenData :configurationItems="{ openType: 'departmentName', openId: user.timeType.reportAuditType==4?item2.buDepartmentName:item2.auditDeptName, renderIndex: 0 }" />
                                                             {{$t('other.audit')}})
                                                         </span>
                                                         ]</span> 
@@ -246,12 +229,13 @@
                                                         <span style="margin-left:15px;color:#DAA520;" v-if="item2.state == 0 && item2.departmentAuditState == 0">[ {{$t('other.waitingForDepartmentReview')}} ]</span>
                                                         <span style="margin-left:15px;color:#DAA520;" v-if="item2.state == 0 && item2.departmentAuditState == 1">[ {{$t('other.waitForTheProjectReviewer')}}<span v-if="item2.projectAuditorName != null">
                                                             (
-                                                                <span v-if="user.userNameNeedTranslate != 1">
+                                                                <!-- <span v-if="user.userNameNeedTranslate != 1">
                                                                     {{item2.projectAuditorName}}
                                                                 </span>
                                                                 <span v-if="user.userNameNeedTranslate == 1">
-                                                                    <ww-open-data type='userName' :openid='item2.projectAuditorName'></ww-open-data>
-                                                                </span>
+                                                                    <TranslationOpenDataText type='userName' :openid='item2.projectAuditorName'></TranslationOpenDataText>
+                                                                </span> -->
+                                                                <TranslationOpenData :configurationItems="{ openType: 'userName', openId: item2.projectAuditorName, renderIndex: 0 }" />
                                                             )
                                                         </span>{{$t('other.audit')}} ]</span>
                                                         <span style="margin-left:15px;color:#32CD32;" v-else-if="item2.state == 1">[ {{$t('state.alreadyPassed')}} ]</span>
@@ -384,7 +368,7 @@
                         <div class="daitianrbao"  @click="showChooseMembTree" v-if="user.userNameNeedTranslate == 1">
                             <span class="spnn" v-if="workForm.userNames">
                                 <span v-for="(item, index) in workForm.userNames" :key="index">
-                                    <span><ww-open-data type='userName' :openid='item'></ww-open-data></span>
+                                    <span><TranslationOpenDataText type='userName' :openid='item'></TranslationOpenDataText></span>
                                     <span v-if="index < workForm.userNames.length - 1">,</span>
                                 </span>
                             </span>
@@ -585,7 +569,7 @@
                                 
                                 <el-select v-model="domain.projectAuditorId" :disabled="!domain.canEdit" @change="$forceUpdate()" v-if="user.userNameNeedTranslate != '1'" style="width:200px;">
                                     <el-option v-for="item in domain.auditUserList" :label="item.auditorName" :value="item.auditorId" :key="item.id">
-                                        <span style="float: left" v-if="user.userNameNeedTranslate == '1'"><ww-open-data type='userName' :openid='item.auditorName'></ww-open-data></span>
+                                        <span style="float: left" v-if="user.userNameNeedTranslate == '1'"><TranslationOpenDataText type='userName' :openid='item.auditorName'></TranslationOpenDataText></span>
                                         <span style="float: left" v-if="user.userNameNeedTranslate != '1'">{{item.auditorName}}</span>
                                     </el-option>
                                 </el-select>
@@ -611,7 +595,7 @@
                         <el-form-item :label="$t('other.reviewer')" v-if="user.timeType.reportAuditType == 3">
                             <el-select v-model="domain.auditorFirst" :placeholder="$t('di-yi-shen-he-ren')" :disabled="!domain.canEdit" style="width:200px;">
                                 <el-option v-for="item in allUsersList" :key="item.id" :label="item.name" :value="item.id">
-                                    <span v-if="user.userNameNeedTranslate == 1"><ww-open-data type='userName' :openid='item.name'></ww-open-data></span>
+                                    <span v-if="user.userNameNeedTranslate == 1"><TranslationOpenDataText type='userName' :openid='item.name'></TranslationOpenDataText></span>
                                     <span v-else>{{item.name}}</span>
                                 </el-option>
                             </el-select>
@@ -620,7 +604,7 @@
                                 <i class="el-icon-right"></i>
                                 <el-select v-model="domain.auditorSec" :placeholder="$t('di-er-shen-he-ren')" :disabled="!domain.canEdit" style="width:200px;">
                                     <el-option v-for="item in allUsersList" :key="item.id" :label="item.name" :value="item.id">
-                                        <span v-if="user.userNameNeedTranslate == 1"><ww-open-data type='userName' :openid='item.name'></ww-open-data></span>
+                                        <span v-if="user.userNameNeedTranslate == 1"><TranslationOpenDataText type='userName' :openid='item.name'></TranslationOpenDataText></span>
                                         <span v-else>{{item.name}}</span>
                                     </el-option>
                                 </el-select>
@@ -630,7 +614,7 @@
                                 <i class="el-icon-right"></i>
                                 <el-select v-model="domain.auditorThird" :placeholder="$t('di-san-shen-he-ren')" :disabled="!domain.canEdit" style="width:200px;">
                                     <el-option v-for="item in allUsersList" :key="item.id" :label="item.name" :value="item.id">
-                                        <span v-if="user.userNameNeedTranslate == 1"><ww-open-data type='userName' :openid='item.name'></ww-open-data></span>
+                                        <span v-if="user.userNameNeedTranslate == 1"><TranslationOpenDataText type='userName' :openid='item.name'></TranslationOpenDataText></span>
                                         <span v-else>{{item.name}}</span>
                                     </el-option>
                                 </el-select>
@@ -639,7 +623,7 @@
                         <el-form-item :label="$t('chao-song-ren')" v-if="user.timeType.reportAuditType == 3">
                             <el-select v-model="domain.ccUserid" clearable :disabled="!domain.canEdit" style="width:200px;">
                                 <el-option v-for="item in allUsersList" :key="item.id" :label="item.name" :value="item.id">
-                                    <span v-if="user.userNameNeedTranslate == 1"><ww-open-data type='userName' :openid='item.name'></ww-open-data></span>
+                                    <span v-if="user.userNameNeedTranslate == 1"><TranslationOpenDataText type='userName' :openid='item.name'></TranslationOpenDataText></span>
                                     <span v-else>{{item.name}}</span>
                                 </el-option>
                             </el-select>
@@ -807,7 +791,7 @@
                             <el-form-item :label="$t('other.projectAuditor')" >
                                 <el-select v-model="domain.projectAuditorId" :disabled="!domain.canEdit" @change="$forceUpdate()" v-if="user.userNameNeedTranslate != '1'">
                                     <el-option v-for="item in domain.auditUserList" :label="item.auditorName" :value="item.auditorId" :key="item.id">
-                                        <span style="float: left" v-if="user.userNameNeedTranslate == '1'"><ww-open-data type='userName' :openid='item.auditorName'></ww-open-data></span>
+                                        <span style="float: left" v-if="user.userNameNeedTranslate == '1'"><TranslationOpenDataText type='userName' :openid='item.auditorName'></TranslationOpenDataText></span>
                                         <span style="float: left" v-if="user.userNameNeedTranslate != '1'">{{item.auditorName}}</span>
                                     </el-option>
                                 </el-select>
@@ -1244,12 +1228,12 @@
                                 <!-- {{(scope.row.leaveDays || scope.row.leaveTimes) ? scope.row.label + (scope.row.leaveDays ? '(' + $t('other.AskForLeave') +scope.row.leaveDays + $t('time.day') +')' : '(' + $t('other.AskForLeave') + scope.row.leaveTimes + 'h)') : scope.row.label}} -->
                                 <span v-if="scope.row.leaveDays || scope.row.leaveTimes">
                                     <span v-if="user.userNameNeedTranslate != '1'">{{scope.row.label}}</span>
-                                    <span v-if="user.userNameNeedTranslate == '1'"><ww-open-data type='userName' :openid='scope.row.label'></ww-open-data></span>
+                                    <span v-if="user.userNameNeedTranslate == '1'"><TranslationOpenDataText type='userName' :openid='scope.row.label'></TranslationOpenDataText></span>
                                     <span>{{scope.row.leaveDays ? '(' + $t('other.AskForLeave') +scope.row.leaveDays.toFixed(1) + $t('time.day') +')' : '(' + $t('other.AskForLeave') + scope.row.leaveTimes + 'h)'}}</span>
                                 </span>
                                 <span v-else>
                                     <span v-if="user.userNameNeedTranslate != '1'">{{scope.row.label}}</span>
-                                    <span v-if="user.userNameNeedTranslate == '1'"><ww-open-data type='userName' :openid='scope.row.label'></ww-open-data></span>
+                                    <span v-if="user.userNameNeedTranslate == '1'"><TranslationOpenDataText type='userName' :openid='scope.row.label'></TranslationOpenDataText></span>
                                 </span>
                             </span>
                         </template>
@@ -1257,7 +1241,7 @@
                     <el-table-column prop="deptName" :label="$t('lable.department')" >
                         <template slot-scope="scope">
                             <div>
-                                <span v-if="user.userNameNeedTranslate == '1'"><ww-open-data type='departmentName' :openid='scope.row.deptName'></ww-open-data></span>
+                                <span v-if="user.userNameNeedTranslate == '1'"><TranslationOpenDataText type='departmentName' :openid='scope.row.deptName'></TranslationOpenDataText></span>
                                 <span v-if="user.userNameNeedTranslate != '1'">{{scope.row.deptName}}</span>
                             </div>
                         </template>
@@ -1272,19 +1256,19 @@
                             <!-- <span>{{(scope.row.leaveDays || scope.row.leaveTimes) ? scope.row.label + (scope.row.leaveDays ? '(' + leaveTypeName[scope.row.leaveType] + ')' : '(' + leaveTypeName[scope.row.leaveType] + ')') : scope.row.label}}</span> -->
                             <span v-if="scope.row.leaveDays || scope.row.leaveTimes">
                                 <span v-if="user.userNameNeedTranslate != '1'">{{scope.row.label}}</span>
-                                <span v-if="user.userNameNeedTranslate == '1'"><ww-open-data type='userName' :openid='scope.row.label'></ww-open-data></span>
+                                <span v-if="user.userNameNeedTranslate == '1'"><TranslationOpenDataText type='userName' :openid='scope.row.label'></TranslationOpenDataText></span>
                                 <span>{{scope.row.leaveDays.toFixed(1) ? '(' + leaveTypeName[scope.row.leaveType] + ')' : '(' + leaveTypeName[scope.row.leaveType] + ')'}}</span>
                             </span>
                             <span v-else>
                                 <span v-if="user.userNameNeedTranslate != '1'">{{scope.row.label}}</span>
-                                <span v-if="user.userNameNeedTranslate == '1'"><ww-open-data type='userName' :openid='scope.row.label'></ww-open-data></span>
+                                <span v-if="user.userNameNeedTranslate == '1'"><TranslationOpenDataText type='userName' :openid='scope.row.label'></TranslationOpenDataText></span>
                             </span>
                         </template>
                     </el-table-column>
                     <el-table-column prop="deptName" :label="$t('lable.department')" >
                         <template slot-scope="scope">
                             <div>
-                                <span v-if="user.userNameNeedTranslate == '1'"><ww-open-data type='departmentName' :openid='scope.row.deptName'></ww-open-data></span>
+                                <span v-if="user.userNameNeedTranslate == '1'"><TranslationOpenDataText type='departmentName' :openid='scope.row.deptName'></TranslationOpenDataText></span>
                                 <span v-if="user.userNameNeedTranslate != '1'">{{scope.row.deptName}}</span>
                             </div>
                         </template>
@@ -1297,7 +1281,7 @@
             <el-table-column prop="label" :label="$t('lable.name')" >
                 <template slot-scope="scope">
                     <div>
-                        <span v-if="user.userNameNeedTranslate == '1'"><ww-open-data type='userName' :openid='scope.row.label'></ww-open-data></span>
+                        <span v-if="user.userNameNeedTranslate == '1'"><TranslationOpenDataText type='userName' :openid='scope.row.label'></TranslationOpenDataText></span>
                         <span v-if="user.userNameNeedTranslate != '1'">{{scope.row.label}}</span>
                     </div>
                 </template>
@@ -1305,7 +1289,7 @@
             <el-table-column prop="deptName" :label="$t('lable.department')" >
                 <template slot-scope="scope">
                     <div>
-                        <span v-if="user.userNameNeedTranslate == '1'"><ww-open-data type='departmentName' :openid='scope.row.deptName'></ww-open-data></span>
+                        <span v-if="user.userNameNeedTranslate == '1'"><TranslationOpenDataText type='departmentName' :openid='scope.row.deptName'></TranslationOpenDataText></span>
                         <span v-if="user.userNameNeedTranslate != '1'">{{scope.row.deptName}}</span>
                     </div>
                 </template>
@@ -1335,10 +1319,10 @@
                     <span class="custom-tree-node" slot-scope="{ node }">
                         <span v-if="user.userNameNeedTranslate == '1'">
                             <span v-if="node.data.children">
-                                <ww-open-data type='departmentName' :openid='node.label'></ww-open-data>
+                                <TranslationOpenDataText type='departmentName' :openid='node.label'></TranslationOpenDataText>
                             </span>
                             <span v-else>
-                                <ww-open-data type='userName' :openid='node.label'></ww-open-data>
+                                <TranslationOpenDataText type='userName' :openid='node.label'></TranslationOpenDataText>
                             </span>
                         </span>
                         <span v-if="user.userNameNeedTranslate != '1'">
@@ -1426,7 +1410,7 @@
             <el-table-column width="105" prop="name" fixed="left" :label="$t('lable.name')">
                 <template slot-scope="scope">
                     <span :style="scope.row.worktimeList.length==0?'color:red':''">
-                        <span v-if="user.userNameNeedTranslate == 1"><ww-open-data type='userName' :openid='scope.row.name'></ww-open-data></span>
+                        <span v-if="user.userNameNeedTranslate == 1"><TranslationOpenDataText type='userName' :openid='scope.row.name'></TranslationOpenDataText></span>
                         <span v-if="user.userNameNeedTranslate != 1">{{scope.row.name}}</span>
                         <!-- {{scope.row.name}} -->
                     </span>
@@ -1434,7 +1418,7 @@
             </el-table-column>
             <el-table-column prop="departmentName" fixed="left" :label="$t('lable.department')">
                 <template slot-scope="scope">
-                    <span v-if="user.userNameNeedTranslate == 1"><ww-open-data type='departmentName' :openid='scope.row.departmentName'></ww-open-data></span>
+                    <span v-if="user.userNameNeedTranslate == 1"><TranslationOpenDataText type='departmentName' :openid='scope.row.departmentName'></TranslationOpenDataText></span>
                     <span v-if="user.userNameNeedTranslate != 1">{{scope.row.departmentName}}</span>
                 </template>
             </el-table-column>
@@ -1596,13 +1580,13 @@
           >
             <el-table-column min-width="150" :label="$t('lable.department')" prop="department">
                 <template slot-scope="scope">
-                    <span v-if="user.userNameNeedTranslate == 1"><ww-open-data type='departmentName' :openid='scope.row.department'></ww-open-data></span>
+                    <span v-if="user.userNameNeedTranslate == 1"><TranslationOpenDataText type='departmentName' :openid='scope.row.department'></TranslationOpenDataText></span>
                     <span v-if="user.userNameNeedTranslate != 1">{{scope.row.department}}</span>
                 </template>
             </el-table-column>
             <el-table-column min-width="150" prop="name" :label="$t('lable.name')" >
                 <template slot-scope="scope">
-                    <span v-if="user.userNameNeedTranslate == 1"><ww-open-data type='userName' :openid='scope.row.name'></ww-open-data></span>
+                    <span v-if="user.userNameNeedTranslate == 1"><TranslationOpenDataText type='userName' :openid='scope.row.name'></TranslationOpenDataText></span>
                     <span v-if="user.userNameNeedTranslate != 1">{{scope.row.name}}</span>
                 </template>
             </el-table-column>
@@ -1692,14 +1676,14 @@
 
             <el-table-column width="160" prop="name" fixed="left" :label="$t('lable.name')">
                 <template slot-scope="scope">
-                    <span v-if="user.userNameNeedTranslate == 1"><ww-open-data type='userName' :openid='scope.row.name'></ww-open-data></span>
+                    <span v-if="user.userNameNeedTranslate == 1"><TranslationOpenDataText type='userName' :openid='scope.row.name'></TranslationOpenDataText></span>
                     <span v-if="user.userNameNeedTranslate != 1">{{scope.row.name}}</span>
                         <!-- {{scope.row.name}} -->
                 </template>
             </el-table-column>
             <el-table-column prop="departmentName" width="170" fixed="left" :label="$t('lable.department')">
                 <template slot-scope="scope">
-                    <span v-if="user.userNameNeedTranslate == 1"><ww-open-data type='departmentName' :openid='scope.row.departmentName'></ww-open-data></span>
+                    <span v-if="user.userNameNeedTranslate == 1"><TranslationOpenDataText type='departmentName' :openid='scope.row.departmentName'></TranslationOpenDataText></span>
                     <span v-if="user.userNameNeedTranslate != 1">{{scope.row.departmentName}}</span>
                 </template>
             </el-table-column>
@@ -1789,7 +1773,7 @@
                     <el-table-column prop="userName" :label="$t('other.operator')">
                         <template slot-scope="scope">
                             <div>
-                                <span v-if="user.userNameNeedTranslate == 1"><ww-open-data type='userName' :openid='scope.row.userName'></ww-open-data></span>
+                                <span v-if="user.userNameNeedTranslate == 1"><TranslationOpenDataText type='userName' :openid='scope.row.userName'></TranslationOpenDataText></span>
                                 <span v-if="user.userNameNeedTranslate != 1">{{scope.row.userName}}</span>
                             </div>
                         </template>
@@ -1866,7 +1850,7 @@
                 <el-table-column prop="username" :label="$t('screening.employeename')"  >
                     <template slot-scope="scope">
                         <div>
-                            <span v-if="user.userNameNeedTranslate == 1"><ww-open-data type='userName' :openid='scope.row.username'></ww-open-data></span>
+                            <span v-if="user.userNameNeedTranslate == 1"><TranslationOpenDataText type='userName' :openid='scope.row.username'></TranslationOpenDataText></span>
                             <span v-if="user.userNameNeedTranslate != 1">{{scope.row.username}}</span>
                         </div>
                     </template>
@@ -1874,7 +1858,7 @@
                 <el-table-column prop="departmentName" label="部门"  >
                     <template slot-scope="scope">
                         <div>
-                            <span v-if="user.userNameNeedTranslate == 1"><ww-open-data type='departmentName' :openid='scope.row.departmentName'></ww-open-data></span>
+                            <span v-if="user.userNameNeedTranslate == 1"><TranslationOpenDataText type='departmentName' :openid='scope.row.departmentName'></TranslationOpenDataText></span>
                             <span v-if="user.userNameNeedTranslate != 1">{{scope.row.departmentName}}</span>
                         </div>
                     </template>
@@ -1941,7 +1925,7 @@
                 <span>请选择员工:</span>
                 <el-select v-model="deleteReportParam.userIds" placeholder="请选择" style="width:500px;" filterable multiple>
                     <el-option v-for="item in usersList" :key="item.id" :label="item.name" :value="item.id">
-                        <span v-if="user.userNameNeedTranslate == 1"><ww-open-data type='userName' :openid='item.name'></ww-open-data></span>
+                        <span v-if="user.userNameNeedTranslate == 1"><TranslationOpenDataText type='userName' :openid='item.name'></TranslationOpenDataText></span>
                         <span v-else>{{item.name}}</span>
                     </el-option>
                 </el-select>
@@ -1989,7 +1973,7 @@
                     v-model="modImportUserId"
                     >
                     <el-option v-for="item in usersList" :key="item.id" :label="item.name" :value="item.id">
-                        <span v-if="user.userNameNeedTranslate == 1"><ww-open-data type='userName' :openid='item.name'></ww-open-data></span>
+                        <span v-if="user.userNameNeedTranslate == 1"><TranslationOpenDataText type='userName' :openid='item.name'></TranslationOpenDataText></span>
                         <span v-else>{{item.name}}</span>
                     </el-option>
                 </el-select>    
@@ -2035,7 +2019,7 @@
                 <el-table-column prop="username" :label="$t('screening.employeename')"   width="80px" fixed="left">
                     <template slot-scope="scope">
                         <div>
-                            <span v-if="user.userNameNeedTranslate == 1"><ww-open-data type='userName' :openid='scope.row.username'></ww-open-data></span>
+                            <span v-if="user.userNameNeedTranslate == 1"><TranslationOpenDataText type='userName' :openid='scope.row.username'></TranslationOpenDataText></span>
                             <span v-if="user.userNameNeedTranslate != 1">{{scope.row.username}}</span>
                         </div>
                     </template>
@@ -2078,7 +2062,7 @@
                         <!-- {{item.msg}} -->
                         <span v-if="user.userNameNeedTranslate != 1">{{item.msg}}</span>
                         <span v-if="user.userNameNeedTranslate == 1">
-                            <span><ww-open-data type='userName' :openid='item.msgCon.one'></ww-open-data></span>
+                            <span><TranslationOpenDataText type='userName' :openid='item.msgCon.one'></TranslationOpenDataText></span>
                             <span>{{item.msgCon.two}}</span>
                         </span>
                     </el-timeline-item>

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

@@ -14,7 +14,7 @@
                 <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'"><ww-open-data type='userName' :openid='item.name'></ww-open-data></span>
+                            <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>
@@ -26,7 +26,7 @@
                 <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'"><ww-open-data type='userName' :openid='item.name'></ww-open-data></span>
+                            <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>
@@ -92,14 +92,14 @@
                                                     <span v-if="item.projectAuditState==0">
                                                         {{ $t('other.waitForTheProjectReviewer') }}<span v-if="item.projectAuditorName != null">(
                                                             <!-- {{item.projectAuditorName}} -->
-                                                            <span v-if="user.userNameNeedTranslate == '1'"><ww-open-data type='userName' :openid='item.projectAuditorName'></ww-open-data></span>
+                                                            <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'"><ww-open-data type='userName' :openid='item.projectAuditorName'></ww-open-data></span>
+                                                            <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>
@@ -107,9 +107,9 @@
                                                 <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'"><ww-open-data type='departmentName' :openid='item.auditDeptName'></ww-open-data></span>
+                                                    <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'"><ww-open-data type='userName' :openid='item.deptAuditorName'></ww-open-data></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>
@@ -192,7 +192,7 @@
                 <template slot-scope="scope">
                     <div>
                         <span v-if="user.userNameNeedTranslate == '1'">
-                            <ww-open-data type='userName' :openid='scope.row.name'></ww-open-data>
+                            <TranslationOpenDataText type='userName' :openid='scope.row.name'></TranslationOpenDataText>
                         </span>
                         <span v-else>
                             {{scope.row.name}}
@@ -204,7 +204,7 @@
                 <template slot-scope="scope">
                     <div>
                         <span v-if="user.userNameNeedTranslate == '1'">
-                            <ww-open-data type='departmentName' :openid='scope.row.departmentName'></ww-open-data>
+                            <TranslationOpenDataText type='departmentName' :openid='scope.row.departmentName'></TranslationOpenDataText>
                         </span>
                         <span v-else>
                             {{scope.row.departmentName}}
@@ -239,8 +239,8 @@
                             <span v-if="scope.row.isDeptAudit==0">{{$t('other.Tobereviewedbytheprojectreviewer')}}</span>
                             <span v-else>
                                 {{$t('other.await')}}
-                                <ww-open-data type='departmentName' :openid='scope.row.auditDeptName'></ww-open-data>
-                                (<ww-open-data type='userName' :openid='scope.row.deptAuditorName'></ww-open-data>)
+                                <TranslationOpenDataText type='departmentName' :openid='scope.row.auditDeptName'></TranslationOpenDataText>
+                                (<TranslationOpenDataText type='userName' :openid='scope.row.deptAuditorName'></TranslationOpenDataText>)
                                 {{$t('other.audit')}}
                             </span>
                         </span>
@@ -298,7 +298,7 @@
                         <template slot-scope="scope">
                             <div>
                                 <span v-if="user.userNameNeedTranslate == '1'">
-                                    <ww-open-data type='userName' :openid='scope.row.userName'></ww-open-data>
+                                    <TranslationOpenDataText type='userName' :openid='scope.row.userName'></TranslationOpenDataText>
                                 </span>
                                 <span v-else>{{scope.row.userName}}</span>
                             </div>
@@ -316,7 +316,7 @@
                                         <span v-for="(item, index) in scope.row.membdateList" :key="index">
                                             <!-- {{item.userName}} -->
                                             <span v-if="user.userNameNeedTranslate == 1">
-                                                <ww-open-data type='userName' :openid='item.userName'></ww-open-data>
+                                                <TranslationOpenDataText type='userName' :openid='item.userName'></TranslationOpenDataText>
                                             </span>
                                             <span v-if="user.userNameNeedTranslate != 1">
                                                 {{item.userName}}
@@ -328,7 +328,7 @@
                                         <span v-for="(item, index) in scope.row.membdateList" :key="index">
                                             <!-- {{item.userName}} -->
                                             <span v-if="user.userNameNeedTranslate == 1">
-                                                <ww-open-data type='userName' :openid='item.userName'></ww-open-data>
+                                                <TranslationOpenDataText type='userName' :openid='item.userName'></TranslationOpenDataText>
                                             </span>
                                             <span v-if="user.userNameNeedTranslate != 1">
                                                 {{item.userName}}
@@ -342,7 +342,7 @@
                                     <span v-for="(item, index) in scope.row.membdateList" :key="index">
                                         <!-- {{item.userName}} -->
                                         <span v-if="user.userNameNeedTranslate == 1">
-                                            <ww-open-data type='userName' :openid='item.userName'></ww-open-data>
+                                            <TranslationOpenDataText type='userName' :openid='item.userName'></TranslationOpenDataText>
                                         </span>
                                         <span v-if="user.userNameNeedTranslate != 1">
                                             {{item.userName}}
@@ -397,7 +397,7 @@
                         <template slot-scope="scope">
                             <div>
                                 <span v-if="user.userNameNeedTranslate == '1'">
-                                    <ww-open-data type='userName' :openid='scope.row.userName'></ww-open-data>
+                                    <TranslationOpenDataText type='userName' :openid='scope.row.userName'></TranslationOpenDataText>
                                 </span>
                                 <span v-if="user.userNameNeedTranslate != '1'">{{scope.row.userName}}</span>
                                 <!-- {{scope.row.userName}} -->

+ 1 - 1
fhKeeper/formulahousekeeper/timesheet/src/views/workReport/list_department.vue

@@ -72,7 +72,7 @@
             <el-table-column prop="name" label="姓名" sortable>
                 <template slot-scope="scope">
                     <div>
-                        <span v-if="user.userNameNeedTranslate == '1'"><ww-open-data type='userName' :openid='scope.row.name'></ww-open-data></span>
+                        <span v-if="user.userNameNeedTranslate == '1'"><TranslationOpenDataText type='userName' :openid='scope.row.name'></TranslationOpenDataText></span>
                         <span v-if="user.userNameNeedTranslate != '1'">{{scope.row.name}}</span>
                     </div>
                 </template>

+ 5 - 5
fhKeeper/formulahousekeeper/timesheet/src/views/workReport/list_import.vue

@@ -111,7 +111,7 @@
                 <template slot-scope="scope">
                     <div>
                         <span v-if="user.userNameNeedTranslate == '1'">
-                            <ww-open-data type='userName' :openid='scope.row.name'></ww-open-data>
+                            <TranslationOpenDataText type='userName' :openid='scope.row.name'></TranslationOpenDataText>
                         </span>
                         <span v-if="user.userNameNeedTranslate != '1'">
                             {{scope.row.name}}
@@ -173,7 +173,7 @@
                     <el-table-column prop="userName" :label="$t('other.operator')" width="150">
                         <template slot-scope="scope">
                             <div>
-                                <span v-if="user.userNameNeedTranslate == '1'"><ww-open-data type='userName' :openid='scope.row.userName'></ww-open-data></span>
+                                <span v-if="user.userNameNeedTranslate == '1'"><TranslationOpenDataText type='userName' :openid='scope.row.userName'></TranslationOpenDataText></span>
                                 <span v-if="user.userNameNeedTranslate != '1'">{{scope.row.userName}}</span>
                             </div>
                         </template>
@@ -187,14 +187,14 @@
                                     <el-popover placement="top" width="400" trigger="hover">
                                     <div>
                                         <span v-for="(item, index) in scope.row.membdateList" :key="index">
-                                            <span v-if="user.userNameNeedTranslate == '1'"><ww-open-data type='userName' :openid='item.userName'></ww-open-data></span>
+                                            <span v-if="user.userNameNeedTranslate == '1'"><TranslationOpenDataText type='userName' :openid='item.userName'></TranslationOpenDataText></span>
                                             <span v-if="user.userNameNeedTranslate != '1'">{{item.userName}}</span>
                                             /{{item.createDate}} <span v-if="scope.row.membdateList.length > 1 && scope.row.membdateList.length - 1 != index">,</span>
                                         </span>
                                     </div>
                                     <div slot="reference" style="overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width: 180px;">
                                         <span v-for="(item, index) in scope.row.membdateList" :key="index">
-                                            <span v-if="user.userNameNeedTranslate == '1'"><ww-open-data type='userName' :openid='item.userName'></ww-open-data></span>
+                                            <span v-if="user.userNameNeedTranslate == '1'"><TranslationOpenDataText type='userName' :openid='item.userName'></TranslationOpenDataText></span>
                                             <span v-if="user.userNameNeedTranslate != '1'">{{item.userName}}</span>
                                             /{{item.createDate}} <span v-if="scope.row.membdateList.length > 1 && scope.row.membdateList.length - 1 != index">,</span>
                                         </span>
@@ -203,7 +203,7 @@
                                 </div>
                                 <div style="overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width: 180px;" v-else>
                                     <span v-for="(item, index) in scope.row.membdateList" :key="index">
-                                        <span v-if="user.userNameNeedTranslate == '1'"><ww-open-data type='userName' :openid='item.userName'></ww-open-data></span>
+                                        <span v-if="user.userNameNeedTranslate == '1'"><TranslationOpenDataText type='userName' :openid='item.userName'></TranslationOpenDataText></span>
                                         <span v-if="user.userNameNeedTranslate != '1'">{{item.userName}}</span>
                                         /{{item.createDate}} <span v-if="scope.row.membdateList.length > 1 && scope.row.membdateList.length - 1 != index">,</span>
                                     </span>

+ 1 - 1
fhKeeper/formulahousekeeper/timesheet/src/views/workReport/list_profession.vue

@@ -79,7 +79,7 @@
             <el-table-column prop="name" label="姓名" sortable>
                 <template slot-scope="scope">
                     <div>
-                        <span v-if="user.userNameNeedTranslate == '1'"><ww-open-data type='userName' :openid='scope.row.name'></ww-open-data></span>
+                        <span v-if="user.userNameNeedTranslate == '1'"><TranslationOpenDataText type='userName' :openid='scope.row.name'></TranslationOpenDataText></span>
                         <span v-if="user.userNameNeedTranslate != '1'">{{scope.row.name}}</span>
                     </div>
                 </template>

+ 3 - 3
fhKeeper/formulahousekeeper/timesheet/src/views/workReport/weeklyCustomization.vue

@@ -52,11 +52,11 @@
                     <el-table-column prop="projectAuditorId" label="审批人" width="160">
                         <template slot-scope="scope">
                             <!-- <span v-if="user.userNameNeedTranslate != '1'">{{ scope.row.projectAuditorName }}</span>
-                            <span v-if="user.userNameNeedTranslate == '1'"><ww-open-data type='userName'
-                                    :openid='scope.row.projectAuditorName'></ww-open-data></span> -->
+                            <span v-if="user.userNameNeedTranslate == '1'"><TranslationOpenDataText type='userName'
+                                    :openid='scope.row.projectAuditorName'></TranslationOpenDataText></span> -->
                             <span v-if="user.userNameNeedTranslate != '1'">{{ auditorNameFun(scope.row) }}</span>
                             <span v-if="user.userNameNeedTranslate == '1'">
-                                <ww-open-data type='userName' :openid='auditorNameFun(scope.row)'></ww-open-data>
+                                <TranslationOpenDataText type='userName' :openid='auditorNameFun(scope.row)'></TranslationOpenDataText>
                             </span>
                         </template>
                     </el-table-column>

+ 3 - 3
fhKeeper/formulahousekeeper/timesheet/src/views/workflow/report.vue

@@ -15,7 +15,7 @@
                     <span class="custom-tree-node" slot-scope="{ node, data }">
                         <!-- <span>{{ node.label }}</span> -->
                         <span v-if="user.userNameNeedTranslate == '1'">
-                          <ww-open-data type='departmentName' :openid='node.label'></ww-open-data>
+                          <TranslationOpenDataText type='departmentName' :openid='node.label'></TranslationOpenDataText>
                         </span>
                         <span v-else>
                           {{ node.label }}
@@ -30,7 +30,7 @@
             <div class="tree" :style="'height:'+ (tableHeight-120) + 'px'">
                 <div style="padding:5px;color:#333;" v-if="depData != null">{{ $t('setup') }} &lt;<span style="color:#20a0ff;">
                     <span v-if="user.userNameNeedTranslate != 1">{{depData.label}}</span>
-                    <span v-if="user.userNameNeedTranslate == 1"><ww-open-data type='departmentName' :openid='depData.label'></ww-open-data></span>
+                    <span v-if="user.userNameNeedTranslate == 1"><TranslationOpenDataText type='departmentName' :openid='depData.label'></TranslationOpenDataText></span>
                     &gt;</span> {{ $t('workinghoursapprovalprocessofdirectstaff') }}
                     <el-tooltip effect="dark" v-if="depData != null && depData.children!=null" :content="$t('onlyapplicabletotheimmediatestaffofthecurrentdepartment')" placement="top-start">
                     <i class="el-icon-question"></i>
@@ -47,7 +47,7 @@
                         <el-button type="primary" v-if="item.isDeptAudit == 1" @click="editNodeDialog(index, item)">
                             <span v-if="user.userNameNeedTranslate != 1">{{item.auditDeptName}}</span>
                             <span v-if="user.userNameNeedTranslate == 1">
-                                <ww-open-data type='departmentName' :openid='item.auditDeptName'></ww-open-data>
+                                <TranslationOpenDataText type='departmentName' :openid='item.auditDeptName'></TranslationOpenDataText>
                             </span>
                         </el-button>
                         <el-button type="primary" v-if="item.isDeptAudit == 0" >{{ $t('other.projectAuditor') }}</el-button>

+ 91 - 0
fhKeeper/formulahousekeeper/timesheet_h5/src/components/translationOpenDataText.vue

@@ -0,0 +1,91 @@
+<template>
+    <div class="translation">
+        <!-- 文本 -->
+        <span v-if="corporateWeChat">
+            <ww-open-data :type='type' :openid='openIdValue'></ww-open-data>
+        </span>
+        <span v-else-if="dingdingPlatform">
+            <dt-open-data :open-type='type' :open-id='openIdValue'></dt-open-data>
+        </span>
+        <span v-else>{{ openIdValue }}</span>
+    </div>
+</template>
+
+<script>
+
+export default {
+    name: '',
+    components: {},
+    props: {
+        type: {
+            type: String,
+            default: 'userName'
+        },
+        openid: {
+            type: [String, Number],
+            default: ''
+        }
+    },
+    data() {
+        return {
+            // user: JSON.parse(sessionStorage.getItem("user")),
+            user: JSON.parse(localStorage.getItem("userInfo")),
+            corporateWeChat: false, // 企业微信转译
+            dingdingPlatform: false, // 钉钉转译
+
+            openIdValue: ''
+        }
+    },
+    computed: {},
+    watch: {
+        openid: {
+            handler(newVal, oldVal) {
+                this.assignmentValue(newVal)
+            },
+        }
+    },
+    created() { },
+    mounted() {
+        this.dealWith()
+    },
+    methods: {
+        dealWith() {
+            console.log(this.user)
+            const { userNameNeedTranslate, dingdingUserid } = this.user
+            if (userNameNeedTranslate) {
+                this.corporateWeChat = true
+                if (dingdingUserid) {
+                    this.dingdingPlatform = true
+                    this.corporateWeChat = false
+                } else {
+                    this.dingdingPlatform = false
+                }
+            } else {
+                this.corporateWeChat = false
+                this.dingdingPlatform = false
+            }
+            // console.log(this.corporateWeChat, this.dingdingPlatform, this.configurationItems)
+            // console.log(this.corporateWeChat, '<=== 企业微信转译')
+            // console.log(this.dingdingPlatform, '<=== 钉钉转译')
+            this.assignmentValue(this.openid)
+        },
+        assignmentValue(value) {
+            this.openIdValue = value
+            if (this.user.dingdingUserid) {
+                this.viewConfiguration()
+            }
+        },
+        viewConfiguration() {
+            setTimeout(() => {
+                window.DTOpenData.update(document.querySelectorAll('dt-open-data'));
+            }, 100);
+        }
+    },
+}
+</script>
+<style scoped>
+.translation {
+    width: auto;
+    display: inline-block;
+}
+</style>

+ 0 - 0
fhKeeper/formulahousekeeper/timesheet_h5/src/main.js


Kaikkia tiedostoja ei voida näyttää, sillä liian monta tiedostoa muuttui tässä diffissä