Quellcode durchsuchen

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

zhouyy vor 5 Monaten
Ursprung
Commit
1cfddcbc0d
100 geänderte Dateien mit 6015 neuen und 3660 gelöschten Zeilen
  1. 6 0
      fhKeeper/formulahousekeeper/customerBuler-crm/src/App.vue
  2. 5 2
      fhKeeper/formulahousekeeper/customerBuler-crm/src/components/TaskModal/index.vue
  3. 14 6
      fhKeeper/formulahousekeeper/customerBuler-crm/src/components/detailcompinents/relatedTasks.vue
  4. 170 0
      fhKeeper/formulahousekeeper/customerBuler-crm/src/components/translationComponent/departmentSelection/departmentSelection.vue
  5. 0 0
      fhKeeper/formulahousekeeper/customerBuler-crm/src/components/translationComponent/personnelSearch/data.ts
  6. 20 14
      fhKeeper/formulahousekeeper/customerBuler-crm/src/components/translationComponent/personnelSearch/personnelSearch.vue
  7. 240 0
      fhKeeper/formulahousekeeper/customerBuler-crm/src/components/translationComponent/treeSelect/treeSelect.vue
  8. 0 0
      fhKeeper/formulahousekeeper/customerBuler-crm/src/components/translationComponent/type.d.ts
  9. 1 1
      fhKeeper/formulahousekeeper/customerBuler-crm/src/main.ts
  10. 0 13
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/analysis/index.vue
  11. 8 3
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/business/component/attachment.vue
  12. 4 1
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/business/component/deteleTables.vue
  13. 13 6
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/business/component/information.vue
  14. 7 2
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/business/component/operationRecord.vue
  15. 1 1
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/business/component/products.vue
  16. 8 3
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/business/component/relatedTasks.vue
  17. 1 1
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/business/detail/index.vue
  18. 10 4
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/business/index.vue
  19. 10 4
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/contacts/component/attachment.vue
  20. 4 1
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/contacts/component/deteleTables.vue
  21. 14 4
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/contacts/component/information.vue
  22. 8 3
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/contacts/component/operationRecord.vue
  23. 10 2
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/contacts/component/relatedBusiness.vue
  24. 1 1
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/contacts/component/relatedTasks.vue
  25. 5 0
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/contacts/index.vue
  26. 58 15
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/corpreport/index.vue
  27. 7 3
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/customer/component/attachment.vue
  28. 10 2
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/customer/component/deteleTables.vue
  29. 7 5
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/customer/component/information.vue
  30. 7 3
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/customer/component/operationRecord.vue
  31. 11 3
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/customer/component/relatedBusiness.vue
  32. 11 3
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/customer/component/relatedContacts.vue
  33. 11 3
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/customer/component/relatedOrders.vue
  34. 1 1
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/customer/component/relatedTasks.vue
  35. 1 1
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/customer/detail/index.vue
  36. 17 6
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/customer/index.vue
  37. 1 1
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/header/header.vue
  38. 3 3
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/order/api.ts
  39. 8 4
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/order/component/attachment.vue
  40. 4 1
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/order/component/deteleTables.vue
  41. 13 5
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/order/component/information.vue
  42. 7 3
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/order/component/operationRecord.vue
  43. 1 1
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/order/component/products.vue
  44. 7 3
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/order/component/rebate.vue
  45. 8 1
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/order/index.vue
  46. 7 3
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/product/component/attachment.vue
  47. 13 5
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/product/component/information.vue
  48. 7 3
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/product/component/operationRecord.vue
  49. 4 1
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/product/component/relatedBusiness.vue
  50. 4 1
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/product/component/relatedSalesOrder.vue
  51. 1 1
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/product/detail/index.vue
  52. 10 2
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/product/deteleTables.vue
  53. 14 4
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/product/index.vue
  54. 10 2
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/tasks/index.vue
  55. 26 11
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/team/index.vue
  56. 23 10
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/team/module/AddPersonnelModal.vue
  57. 7 3
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/thread/detail/components/attachment.vue
  58. 12 7
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/thread/detail/components/information.vue
  59. 9 4
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/thread/detail/components/operationRecord.vue
  60. 1 1
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/thread/detail/components/relatedTasks.vue
  61. 10 2
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/thread/deteleTables.vue
  62. 18 6
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/thread/index.vue
  63. 2 1
      fhKeeper/formulahousekeeper/customerBuler-crm/src/store/Store.d.ts
  64. 2 0
      fhKeeper/formulahousekeeper/customerBuler-crm/src/store/index.ts
  65. 1 1
      fhKeeper/formulahousekeeper/customerBuler-crm/src/styles/global.scss
  66. 31 0
      fhKeeper/formulahousekeeper/customerBuler-crm/src/utils/translationProcessing.ts
  67. 5 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/DepartmentController.java
  68. 39 7
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/TaskController.java
  69. 11 82
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/WeiXinCorpController.java
  70. 8 6
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/Task.java
  71. 2 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/mapper/UserMapper.java
  72. 2 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/DepartmentService.java
  73. 89 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/DepartmentServiceImpl.java
  74. 13 22
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/ExcelExportServiceImpl.java
  75. 25 20
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/TaskServiceImpl.java
  76. 10 9
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/UserServiceImpl.java
  77. 8 3
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/WxCorpInfoServiceImpl.java
  78. 11 0
      fhKeeper/formulahousekeeper/management-crm/src/main/resources/mapper/UserMapper.xml
  79. 18 15
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/DingDingServiceImpl.java
  80. 21 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/task/TimingTask.java
  81. 1 0
      fhKeeper/formulahousekeeper/plugIn/form-design-master/playground/src/components.d.ts
  82. 13 0
      fhKeeper/formulahousekeeper/plugIn/form-design-master/playground/vite.config.ts
  83. 2934 2376
      fhKeeper/formulahousekeeper/plugIn/form-design-master/pnpm-lock.yaml
  84. 2 0
      fhKeeper/formulahousekeeper/plugIn/form-design-master/src/components.d.ts
  85. 328 0
      fhKeeper/formulahousekeeper/plugIn/form-design-master/src/components/personnelSearch.vue
  86. 1 1
      fhKeeper/formulahousekeeper/plugIn/form-design-master/src/config/index.ts
  87. 1 0
      fhKeeper/formulahousekeeper/plugIn/form-design-master/src/design/WidgetForm.vue
  88. 40 17
      fhKeeper/formulahousekeeper/plugIn/form-design-master/src/design/WidgetFormItem.vue
  89. 39 19
      fhKeeper/formulahousekeeper/plugIn/form-design-master/src/generate/GenerateFormItem.vue
  90. 9 15
      fhKeeper/formulahousekeeper/plugIn/form-design-master/update/README.md
  91. 120 0
      fhKeeper/formulahousekeeper/plugIn/form-design-master/update/dist/components/personnelSearch.vue.d.ts
  92. 1 1
      fhKeeper/formulahousekeeper/plugIn/form-design-master/update/dist/config/index.d.ts
  93. 2 2
      fhKeeper/formulahousekeeper/plugIn/form-design-master/update/dist/design/DesignForm.vue.d.ts
  94. 3 0
      fhKeeper/formulahousekeeper/plugIn/form-design-master/update/dist/design/WidgetFormItem.vue.d.ts
  95. 1 1
      fhKeeper/formulahousekeeper/plugIn/form-design-master/update/dist/index.css
  96. 1282 843
      fhKeeper/formulahousekeeper/plugIn/form-design-master/update/dist/index.es.js
  97. 1 1
      fhKeeper/formulahousekeeper/plugIn/form-design-master/update/dist/index.es.js.map
  98. 9 10
      fhKeeper/formulahousekeeper/plugIn/form-design-master/update/package.json
  99. 1 1
      fhKeeper/formulahousekeeper/plugIn/form-design-master/vite.config.ts
  100. 0 0
      fhKeeper/formulahousekeeper/timesheet/src/i18n/en.json

+ 6 - 0
fhKeeper/formulahousekeeper/customerBuler-crm/src/App.vue

@@ -74,6 +74,8 @@ body,
   height: 100%;
   overflow: hidden;
   min-width: 800px;
+  color: #606266; 
+  font-size: 14px;  
 }
 * {
   font-family: '微软雅黑';
@@ -105,4 +107,8 @@ body,
 .el-loading-mask {
   z-index: 1900 !important;
 }
+
+table {
+  font-size: 14px !important;
+}
 </style>

+ 5 - 2
fhKeeper/formulahousekeeper/customerBuler-crm/src/components/TaskModal/index.vue

@@ -46,10 +46,11 @@
           </el-select>
         </el-form-item>
         <el-form-item label="执行人:">
-          <el-select v-model="form.executorId" placeholder="请选择" clearable multiple filterable
+          <!-- <el-select v-model="form.executorId" placeholder="请选择" clearable multiple filterable
             :disabled="disabledList && disabledList.includes('executorId')">
             <el-option v-for="item in executorValueData" :key="item.id" :value="item.id" :label="item.name" />
-          </el-select>
+          </el-select> -->
+          <personnel-search v-model="form.executorId" :size="''" multiple placeholder="请选择" :disabled="disabledList && disabledList.includes('executorId')"></personnel-search>
         </el-form-item>
         <el-form-item label="重复提醒:">
           <el-switch v-model="form.isRepeat" :active-value="1" :inactive-value="0" @change="changeRepeat" />
@@ -136,6 +137,8 @@ import { FormInstance, dayjs } from 'element-plus';
 import { getFromValue } from '@/utils/tools';
 import { Props, Emits } from './type';
 import { URL_GETALL } from '@/pages/contacts/api';
+import personnelSearch from '@/components/translationComponent/personnelSearch/personnelSearch.vue';
+
 const props = defineProps<Props>()
 const emits = defineEmits<Emits>();
 watch(() => props.saveLoading, (val) => {

+ 14 - 6
fhKeeper/formulahousekeeper/customerBuler-crm/src/components/detailcompinents/relatedTasks.vue

@@ -17,7 +17,15 @@
                 </el-table-column>
                 <el-table-column prop="priorityStr" sortable label="优先级" width="130" />
                 <el-table-column prop="statusStr" label="状态" width="130" />
-                <el-table-column prop="executorNamesStr" label="执行人" width="130" />
+                <el-table-column prop="executorNamesStr" label="执行人" width="130">
+                    <template #default="scope">
+                        <template v-for="(item, index) in (scope.row.executorNames || [])">
+                            <TextTranslation translationTypes="userName" :translationValue="item">
+                            </TextTranslation>
+                            <span v-if="index < (scope.row.executorNames || []).length - 1">,</span>
+                        </template>
+                    </template>
+                </el-table-column>
                 <el-table-column prop="startTimes" sortable label="开始时间" width="130" />
                 <el-table-column prop="endTimes" sortable label="截至时间" width="130" />
             </el-table>
@@ -106,11 +114,11 @@ function receiveAssignment(item: any) {
     information.value = item.information
     const dataVal = item.data
     for (let i in dataVal) {
-        dataVal[i].executorNamesStr = (dataVal[i].executorNames || []).join(','),
-            dataVal[i].startTimes = dataVal[i].startDate ? formatDate(new Date(dataVal[i].startDate)) : '',
-            dataVal[i].endTimes = dataVal[i].endDate ? formatDate(new Date(dataVal[i].endDate)) : '',
-            dataVal[i].priorityStr = PRIORITY.find(item => item.value == dataVal[i].priority)?.label || '',
-            dataVal[i].statusStr = STATUS.find(item => item.value == dataVal[i].status)?.label || ''
+        dataVal[i].executorNamesStr = (dataVal[i].executorNames || []).join(',')
+        dataVal[i].startTimes = dataVal[i].startDate ? formatDate(new Date(dataVal[i].startDate)) : ''
+        dataVal[i].endTimes = dataVal[i].endDate ? formatDate(new Date(dataVal[i].endDate)) : ''
+        dataVal[i].priorityStr = PRIORITY.find(item => item.value == dataVal[i].priority)?.label || ''
+        dataVal[i].statusStr = STATUS.find(item => item.value == dataVal[i].status)?.label || ''
     }
     relatedTaskstable.value = dataVal
 }

+ 170 - 0
fhKeeper/formulahousekeeper/customerBuler-crm/src/components/translationComponent/departmentSelection/departmentSelection.vue

@@ -0,0 +1,170 @@
+<script lang="ts" setup>
+import { ref, reactive, onMounted, inject, watchEffect, computed } from 'vue';
+import type { CascaderProps, CascaderNode } from 'element-plus'
+import { cloneDeep, debounce } from 'lodash';
+import { post } from "@/utils/request";
+import { useStore } from '@/store/index'
+import { Emits } from '../type';
+import { storeToRefs } from 'pinia';
+import { updateDepTreeData, generateUniqueId } from '@/utils/tools'
+
+const emit = defineEmits<Emits>();
+const props = defineProps({
+  modelValue: { type: null, required: true },
+  size: { type: String as () => assemblySize, required: true, default: () => 'small' },
+  placeholder: { type: String, required: false, default: () => '请选择' },
+  multiple: { type: Boolean, required: false, default: false },
+  disabled: { type: Boolean, required: false, default: false },
+  clearable: { type: Boolean, required: false, default: true },
+  options: { type: Array as () => any, required: false, default: () => [] },
+  width: { type: String, required: false, default: () => '100%' },
+  isAddChineseCharacters: { type: Boolean, required: false, default: false },
+  props: {
+    type: Object as () => CascaderProps, required: false, default: () => {
+      return {
+        value: 'id',
+        expandTrigger: 'hover' as const,
+        checkStrictly: true
+      }
+    }
+  }
+})
+const { departmentList, userInfo } = storeToRefs(useStore());
+const { setValue } = useStore()
+const departmentVal = ref(props.modelValue); // 响应式绑定 v-model 的值
+const departmentValTwo = ref(props.modelValue);
+const departmentProps = ref<CascaderProps>({})
+const departmantArray = ref<any>([]);
+const visibleFlag = ref<boolean>(false);
+const deptRef = ref<any>(null)
+
+const deptLabel = computed(() => {
+  if (Array.isArray(departmentVal.value)) {
+    const deptId = departmentVal.value[departmentVal.value.length - 1]
+    return findLabelById(departmantArray.value, deptId)
+  }
+  return ''
+})
+
+async function filterMethod(node: CascaderNode, keyword: string) {
+  const { userNameNeedTranslate } = userInfo.value
+  if(userNameNeedTranslate == 0) {
+    return [keyword].includes(node.label)
+  }
+  const { data = [] } = await post(`/department/listAllMemb`, { keyword, cursor: '2' })
+  const keywordList = data.flatMap(extractLabels)
+  return [...keywordList].includes(node.label)
+}
+
+function getDeptList(keyword: string = '') {
+  post(`/department/listAllMemb`, { keyword }).then(res => {
+    const deptList = updateDepTreeData(res.data, props.isAddChineseCharacters)
+    departmantArray.value = deptList
+    if (!keyword) {
+      setValue((deptList || []), 'departmentList')
+    }
+  })
+}
+
+function visibleChange(visible: boolean) { // 下拉框出现/隐藏时触发
+  if (!props.multiple) {
+    setTimeout(() => {
+      departmentVal.value = visible ? [] : cloneDeep(departmentValTwo.value)
+    }, 10)
+  }
+  visibleFlag.value = visible
+}
+
+function updateValue(val: any) { // 值改变的时候触发
+  if (!props.multiple) {
+    deptRef.value.$refs.input.value = '';
+    deptRef.value.togglePopperVisible()
+  }
+  departmentValTwo.value = cloneDeep(val)
+  emit('update:modelValue', departmentVal.value)
+  emit('change', val)
+}
+
+function findLabelById(tree: any, id: any) {
+  for (let node of tree) {
+    if (node.id == id) {
+      return node.label;
+    }
+    if (node.children && node.children.length > 0) {
+      const result: any = findLabelById(node.children, id);
+      if (result) {
+        return result;
+      }
+    }
+  }
+  return null;
+}
+
+function extractLabels(node: any) {
+  let labels: any[] = [];
+  if (node.label) {
+    labels.push(node.label);
+  }
+  if (node.children && Array.isArray(node.children)) {
+    node.children.forEach((child: any) => {
+      labels = labels.concat(extractLabels(child));
+    });
+  }
+  return labels;
+}
+
+onMounted(() => {
+  departmentProps.value = props.props
+  if (departmentList.value.length == 0) {
+    if (props.options.length > 0) {
+      departmantArray.value = props.options
+    } else {
+      getDeptList()
+    }
+  } else {
+    departmantArray.value = departmentList.value
+  }
+})
+</script>
+
+<template>
+  <div class="departmentSelectionDiv" :style="`width: ${width}`">
+    <!-- <el-cascader v-model="departmentVal" :ref="'deptRef'" :options="departmantArray" :props="departmentProps"
+      :size="size" :clearable="clearable" :placeholder="placeholder" filterable :show-all-levels="false"
+      :class="`departmentSelection ${!multiple && !visibleFlag ? 'clearColor' : ''}`" :style="`width: ${width}`"
+      :filter-method="filterMethod" @visible-change="visibleChange" @change="updateValue">
+      <template #default="{ node, data }">
+        <span>
+          <TextTranslation translationTypes="departmentName" :translationValue="data.label"></TextTranslation>
+        </span>
+      </template>
+    </el-cascader>
+    <div class="coverDept" v-if="!visibleFlag">
+      <TextTranslation translationTypes="departmentName" :translationValue="deptLabel"></TextTranslation>
+    </div> -->
+  </div>
+</template>
+
+<style>
+.clearColor .el-input .el-input__inner {
+  color: transparent !important;
+}
+</style>
+
+<style lang="scss" scoped>
+.departmentSelectionDiv {
+  position: relative;
+  display: inline-block;
+
+  .coverDept {
+    position: absolute;
+    top: 50%;
+    transform: translateY(-50%);
+    left: 6px;
+    background: #fff;
+    color: #303133;
+    font-size: 12px;
+    height: calc(100% - 4px);
+  }
+}
+</style>

+ 0 - 0
fhKeeper/formulahousekeeper/customerBuler-crm/src/components/translationComponent/personnelSearch/data.ts


+ 20 - 14
fhKeeper/formulahousekeeper/customerBuler-crm/src/components/translationComponent/personnelSearch/personnelSearch.vue

@@ -1,19 +1,20 @@
 <script lang="ts" setup>
-import { ref, reactive, onMounted, inject, watchEffect, computed } from 'vue';
+import { ref, reactive, onMounted, inject, watchEffect, watch, computed } from 'vue';
 import { debounce } from 'lodash';
 import { storeToRefs } from 'pinia';
-import { Emits, optionsType } from './type';
+import { Emits, optionsType } from '../type';
 import { useStore } from '@/store/index'
 import { generateUniqueId } from '@/utils/tools'
 import { post, get, uploadFile } from "@/utils/request";
 
 const props = defineProps({
-  modelValue: { type: [String, Number, Array, Object, Boolean], required: true },
+  modelValue: { type: null, required: true },
   multiple: { type: Boolean, required: false, default: false },
   size: { type: String as () => assemblySize, required: true, default: () => 'small' },
   placeholder: { type: String, required: false, default: () => '请选择' },
   disabled: { type: Boolean, required: false, default: false },
   options: { type: Array as () => optionsType, required: false, default: () => [] },
+  clearable: { type: Boolean, required: false, default: true },
   width: { type: String, required: false, default: () => '100%' },
 });
 const emit = defineEmits<Emits>();
@@ -29,9 +30,15 @@ const controlTranslation = reactive({
 
 const selectedValue = ref(props.modelValue); // 响应式绑定 v-model 的值
 
+watch(() => props.modelValue, (newValue, _oldValue) => {
+  if(newValue != selectedValue.value) {
+    selectedValue.value = newValue
+  }
+});
+
 const getSelectedLabel = computed(() => {
   if (!props.multiple) {
-    const item = getPersonnelListItems(selectedValue.value);
+    const item = getPersonnelListItems(selectedValue.value || props.modelValue);
     return item ? item.label : props.placeholder
   }
 
@@ -40,7 +47,7 @@ const getSelectedLabel = computed(() => {
       if (selectedValue.value.length <= 0) {
         return props.placeholder
       }
-      const item = getPersonnelListItems(selectedValue.value);
+      const item = getPersonnelListItems(selectedValue.value || props.modelValue);
       return item ? item.label : props.placeholder
     } else {
       return props.placeholder
@@ -96,7 +103,11 @@ function updateValue(val: any) { // 值改变的时候触发
 
 onMounted(() => {
   if (personnelList.value.length == 0) {
-    getUserList()
+    if (props.options.length > 0) {
+      personnelArray.value = props.options
+    } else {
+      getUserList()
+    }
   } else {
     personnelArray.value = personnelList.value
   }
@@ -142,7 +153,7 @@ onMounted(() => {
 <el-option v-for="item in personnelArray" :key="item.value" :label="item.label" :value="item.value"></el-option>
 </el-select> -->
   <el-select-v2 v-model="selectedValue" :ref="`selectRef${timeRef}`" :multiple="multiple" :size="size"
-    :loading="selectLoading" :placeholder="placeholder" :disabled="disabled" clearable filterable collapse-tags
+    :loading="selectLoading" :placeholder="placeholder" :disabled="disabled" :clearable="clearable" filterable collapse-tags
     :style="`width: ${width}`" :options="personnelArray"
     :class="`custom-select ${!controlTranslation.visibleFlag ? 'setUpInput' : ''}`" @change="updateValue"
     @visible-change="visibleChange" :filter-method="filterMethod">
@@ -155,7 +166,7 @@ onMounted(() => {
             {{ placeholder }}
           </template>
           <template v-else>
-            <span style="color: #303133;">
+            <span style="color: #606266;">
               <TextTranslation translationTypes="userName" :translationValue="getSelectedLabel"></TextTranslation>
             </span>
           </template>
@@ -181,7 +192,6 @@ onMounted(() => {
       </div>
     </template>
   </el-select-v2>
-  <span class="aabbcc">aabbcc</span>
 </template>
 
 <style lang="scss" scoped>
@@ -195,7 +205,7 @@ onMounted(() => {
       display: none;
     }
   }
-  
+
   :deep(.el-select__input) {
     margin-left: 0;
   }
@@ -204,8 +214,4 @@ onMounted(() => {
 .setUpInput :deep(.el-input__inner) {
   color: #fff !important;
 }
-
-.aabbcc {
-  color: $modena;
-}
 </style>

+ 240 - 0
fhKeeper/formulahousekeeper/customerBuler-crm/src/components/translationComponent/treeSelect/treeSelect.vue

@@ -0,0 +1,240 @@
+<script lang="ts" setup>
+import { ref, reactive, onMounted, inject, watchEffect, computed, watch } from 'vue';
+import type { CascaderProps, CascaderNode } from 'element-plus'
+import { cloneDeep, debounce } from 'lodash';
+import { post } from "@/utils/request";
+import { useStore } from '@/store/index'
+import { Emits } from '../type';
+import { storeToRefs } from 'pinia';
+import { updateDepTreeData, generateUniqueId } from '@/utils/tools'
+const emit = defineEmits<Emits>();
+
+const props = defineProps({
+  modelValue: { type: null, required: true },
+  size: { type: String as () => assemblySize, required: true, default: () => 'small' },
+  placeholder: { type: String, required: false, default: () => '请选择' },
+  multiple: { type: Boolean, required: false, default: false }, // 多选
+  anyLevel: { type: Boolean, required: false, default: true }, // 选择任意一级
+  checkStrictly: { type: Boolean, required: false, default: false }, // 是否父子级相互不关联
+  disabled: { type: Boolean, required: false, default: false },
+  clearable: { type: Boolean, required: false, default: true },
+  options: { type: Array as () => any, required: false, default: () => [] },
+  width: { type: String, required: false, default: () => '100%' },
+  isAddChineseCharacters: { type: Boolean, required: false, default: false },
+  props: {
+    type: Object as () => CascaderProps, required: false, default: () => {
+      return {
+        value: 'id',
+        expandTrigger: 'hover' as const,
+        checkStrictly: true
+      }
+    }
+  }
+})
+
+const { departmentList, userInfo } = storeToRefs(useStore());
+const { setValue } = useStore()
+const treeSelectVal = ref(props.modelValue); // 响应式绑定 v-model 的值
+const treeSelectArray = ref<any>([]);
+const visibleFlag = ref(false);
+const selectLoading = ref(false);
+const treeSelectRef = ref();
+const searchCriteria = ref<string[]>([])
+
+watch(() => props.modelValue, (newValue, _oldValue) => {
+  if(newValue != treeSelectVal.value) {
+    treeSelectVal.value = newValue
+  }
+});
+
+const getSelectedLabel = computed(() => {
+  if (!props.multiple) {
+    return treeSelectVal.value ? findLabelById(treeSelectArray.value, treeSelectVal.value) : props.placeholder
+  }
+
+  if (props.multiple) {
+    if (Array.isArray(treeSelectVal.value)) {
+      if (treeSelectVal.value.length <= 0) {
+        return props.placeholder
+      }
+
+      return treeSelectVal.value ? findLabelById(treeSelectArray.value, treeSelectVal.value[0]) : props.placeholder
+    }
+  }
+
+  return props.placeholder
+})
+
+const filterMethod = debounce(filterMethods, 500)
+async function filterMethods(val: string) {
+  const { userNameNeedTranslate } = userInfo.value
+  if (val == '') {
+    treeSelectArray.value = departmentList.value
+    selectLoading.value = false
+    searchCriteria.value = []
+    treeSelectRef.value.filter()
+    return
+  }
+  if (userNameNeedTranslate == 0) {
+    searchCriteria.value = [val]
+    setTimeout(() => {
+      treeSelectRef.value.filter()
+    }, 10)
+    return
+  }
+  if (userNameNeedTranslate == 1) {
+    selectLoading.value = true
+    const { data = [] } = await post(`/department/listAllMemb`, { keyword: val })
+    const keywordList = data.flatMap(extractLabels)
+    searchCriteria.value = keywordList
+    console.log(searchCriteria.value)
+    setTimeout(() => {
+      selectLoading.value = false
+      treeSelectRef.value.filter()
+    }, 100)
+  }
+}
+
+function filterNode(_value: string, data: Tree) {
+  const { userNameNeedTranslate } = userInfo.value
+  if (searchCriteria.value.length == 0) {
+    return true
+  }
+  if (userNameNeedTranslate == 0) {
+    return data.label.indexOf(searchCriteria.value[0]) > -1
+  }
+  if (userNameNeedTranslate == 0) {
+    return [...searchCriteria.value].includes(data.label)
+  }
+}
+
+function tagClose(_evt: MouseEvent) {
+  if (Array.isArray(treeSelectVal.value)) {
+    treeSelectVal.value.shift()
+    updateValue(treeSelectVal.value)
+  }
+}
+
+function getDeptList(keyword: string = '') {
+  post(`/department/listAllMemb`, { keyword }).then(res => {
+    const deptList = updateDepTreeData(res.data, props.isAddChineseCharacters)
+    treeSelectArray.value = deptList
+    if (!keyword) {
+      setValue((deptList || []), 'departmentList')
+    }
+  })
+}
+
+function visibleChange(visible: boolean) { // 下拉框出现/隐藏时触发
+  visibleFlag.value = visible
+}
+
+function findLabelById(tree: any, id: any) {
+  for (let node of tree) {
+    if (node.id == id) {
+      return node.label;
+    }
+    if (node.children && node.children.length > 0) {
+      const result: any = findLabelById(node.children, id);
+      if (result) {
+        return result;
+      }
+    }
+  }
+  return null;
+}
+
+function extractLabels(node: any) {
+  let labels: any[] = [];
+  if (node.label) {
+    labels.push(node.label);
+  }
+  if (node.children && Array.isArray(node.children)) {
+    node.children.forEach((child: any) => {
+      labels = labels.concat(extractLabels(child));
+    });
+  }
+  return labels;
+}
+
+function updateValue(val: any) { // 值改变的时候触发
+  emit('update:modelValue', treeSelectVal.value)
+  emit('change', val)
+}
+
+onMounted(() => {
+  console.log(treeSelectVal.value, '<==== 数据')
+  if (departmentList.value.length == 0) {
+    if (props.options.length > 0) {
+      treeSelectArray.value = props.options
+    } else {
+      getDeptList()
+    }
+  } else {
+    treeSelectArray.value = departmentList.value
+  }
+})
+</script>
+
+<template>
+  <el-tree-select v-model="treeSelectVal" ref="treeSelectRef" :data="treeSelectArray" :size="size"
+    :loading="selectLoading" :clearable="clearable" :placeholder="placeholder" :show-checkbox="anyLevel"
+    :multiple="multiple" node-key="id" :render-after-expand="true" :check-strictly="checkStrictly" filterable
+    collapse-tags :style="`width: ${width}`" :default-expanded-keys="(!multiple && checkStrictly) ? [treeSelectVal] : Array.isArray(treeSelectVal) ? [...treeSelectVal] : [treeSelectVal]" :class="`custom-select ${!visibleFlag ? 'setUpInput' : ''}`"
+    @change="updateValue" @visible-change="visibleChange" :filter-method="filterMethod"
+    :filter-node-method="filterNode">
+    <!-- 单选 -->
+    <template #prefix v-if="!multiple">
+      <div style="height: 100%;display: flex;align-items: center;">
+        <div v-if="!visibleFlag" class="selectSingleChoice">
+          <template v-if="getSelectedLabel == placeholder">
+            {{ placeholder }}
+          </template>
+          <template v-else>
+            <span style="color: #606266;">
+              <TextTranslation translationTypes="departmentName" :translationValue="getSelectedLabel"></TextTranslation>
+            </span>
+          </template>
+        </div>
+      </div>
+    </template>
+    <!-- 多选 -->
+    <template #tag v-if="multiple">
+      <template v-if="Array.isArray(treeSelectVal) && treeSelectVal.length > 0">
+        <el-tag type="info" :size="size" closable @close="tagClose">
+          <TextTranslation translationTypes="departmentName" :translationValue="getSelectedLabel"></TextTranslation>
+        </el-tag>
+        <el-tag type="info" :size="size" v-if="treeSelectVal.length > 1">+{{ treeSelectVal.length }}</el-tag>
+      </template>
+      <template v-else>
+        <span style="color: #A8ABB2">{{ placeholder }}</span>
+      </template>
+    </template>
+    <!-- 主要内容 -->
+    <template #default="{ node, data }">
+      <TextTranslation translationTypes="departmentName" :translationValue="node.label"></TextTranslation>
+    </template>
+  </el-tree-select>
+</template>
+
+<style lang="scss" scoped>
+.custom-select {
+  :deep(.el-select__placeholder.is-transparent) {
+    color: transparent !important;
+  }
+
+  :deep(.el-select__placeholder) {
+    span {
+      display: none;
+    }
+  }
+
+  :deep(.el-select__input) {
+    margin-left: 0;
+  }
+}
+
+.setUpInput :deep(.el-input__inner) {
+  color: #fff !important;
+}
+</style>

fhKeeper/formulahousekeeper/customerBuler-crm/src/components/translationComponent/personnelSearch/type.d.ts → fhKeeper/formulahousekeeper/customerBuler-crm/src/components/translationComponent/type.d.ts


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

@@ -35,7 +35,7 @@ app.config.globalProperties.$echarts = echarts;
 app
   .use(ElementPlus, {
     locale: zhCn,
-    zIndex: 1800,
+    zIndex: 1600,
   })
   .use(createPinia())
   .use(router)

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

@@ -6,7 +6,6 @@ import Divider from './components/Divider.vue';
 import Echarts from '@/components/ReEcharts/index.vue';
 import { EChartsOption, use } from 'echarts';
 import { dayjs } from 'element-plus';
-import personnelSearch from '@/components/translationComponent/personnelSearch/personnelSearch.vue';
 import {
   getSummaryData,
   getBulletinData,
@@ -17,16 +16,6 @@ import {
   SummaryData
 } from './api';
 
-const selectVal = ref<Array<string | number>>([])
-const selectVals = ref<string | number>('')
-const selectChange = (val: any) => {
-  console.log(val, '<===== 当前的数据 selectVal')
-  console.log(selectVal.value, '<===== 双向绑定的数据 selectVal')
-}
-const selectChange2 = (val: any) => {
-  console.log(val, '<===== 当前的数据 selectVals')
-  console.log(selectVals.value, '<===== 双向绑定的数据 selectVals')
-}
 const permissionOptions = [
   {
     label: '仅本人',
@@ -192,8 +181,6 @@ watchEffect(() => {
           </el-select>
         </div>
         <div class="w-40">
-          <personnel-search v-model="selectVal" :size="'small'" multiple placeholder="你好世界" @change="selectChange"></personnel-search>
-          <personnel-search v-model="selectVals" :size="'small'" placeholder="你好世界" @change="selectChange2"></personnel-search>
           <el-select
             ref="select1"
             size="small"

+ 8 - 3
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/business/component/attachment.vue

@@ -13,9 +13,14 @@
         </div>
         <div class="flex-1 overflow-auto pt-3">
             <el-table :data="attachmenttable" border style="width: 100%;height: 200px;">
-                <el-table-column prop="name" label="附件名称" width="180" />
+                <el-table-column prop="name" label="附件名称" />
                 <el-table-column prop="size" label="附件大小" width="120" />
-                <el-table-column prop="userName" label="上传人" width="120" />
+                <el-table-column prop="userName" label="上传人" width="120">
+                    <template #default="scope">
+                        <TextTranslation translationTypes="userName" :translationValue="scope.row.userName">
+                        </TextTranslation>
+                    </template>
+                </el-table-column>
                 <el-table-column prop="newCreateTime" label="上传时间" width="180" />
                 <el-table-column label="操作" width="180" fixed="right">
                     <template #default="scope">
@@ -138,7 +143,7 @@ onMounted(() => { });
 .attachment {
     .title {
         font-size: 18px;
-        color: #000
+        color: #606266
     }
 }
 </style>

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

@@ -21,7 +21,10 @@
                     <el-table-column v-for="(item, index) in tableColumn" :prop="item.prop" :label="item.label" :key="index"
                         :width="item.width">
                         <template #default="scope">
-                            <span>{{ scope.row[item.prop] }}</span>
+                            <template v-if="['inchargerName', 'creatorName'].includes(item.prop)">
+                                <TextTranslation translationTypes="userName" :translationValue="scope.row[item.prop]"></TextTranslation>
+                            </template>
+                            <span v-else>{{ scope.row[item.prop] }}</span>
                         </template>
                     </el-table-column>
                     <el-table-column label="操作" fixed="right" width="120">

+ 13 - 6
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/business/component/information.vue

@@ -22,7 +22,8 @@
             </div>
             <div class="formItem flex pt-3 pb-1">
                 <div class="w-22 text-right text-gray-500">联系人:</div>
-                <div class="flex-1 overflow-hidden text-ellipsis whitespace-nowrap ml-1">{{ information.contactsName }}
+                <div class="flex-1 overflow-hidden text-ellipsis whitespace-nowrap ml-1">
+                    {{ information.contactsName }}
                 </div>
             </div>
             <div class="formItem flex pt-3 pb-1">
@@ -32,7 +33,9 @@
             </div>
             <div class="formItem flex pt-3 pb-1">
                 <div class="w-22 text-right text-gray-500">负责人:</div>
-                <div class="flex-1 overflow-hidden text-ellipsis whitespace-nowrap ml-1">{{ information.inchargerName }}</div>
+                <div class="flex-1 overflow-hidden text-ellipsis whitespace-nowrap ml-1">
+                    <TextTranslation translationTypes="userName" :translationValue="information.inchargerName"></TextTranslation>
+                </div>
             </div>
             <div class="formItem flex pt-3 pb-1">
                 <div class="w-22 text-right text-gray-500">预计成交日期:</div>
@@ -41,7 +44,9 @@
             </div>
             <div class="formItem flex pt-3 pb-1">
                 <div class="w-22 text-right text-gray-500">创建人:</div>
-                <div class="flex-1 overflow-hidden text-ellipsis whitespace-nowrap ml-1">{{ information.creatorName }}</div>
+                <div class="flex-1 overflow-hidden text-ellipsis whitespace-nowrap ml-1">
+                    <TextTranslation translationTypes="userName" :translationValue="information.creatorName"></TextTranslation>
+                </div>
             </div>
             <div class="formItem flex pt-3 pb-1">
                 <div class="w-22 text-right text-gray-500">创建时间:</div>
@@ -88,9 +93,10 @@
             <div class="scroll-bar m-6">
                 <div class="flex mb-4">
                     <div class="w-20 flex items-center justify-end pr-4">转移至:</div>
-                    <el-select v-model="transferValue" placeholder="请选择" class="flex1">
+                    <!-- <el-select v-model="transferValue" placeholder="请选择" class="flex1">
                         <el-option v-for="item in transferOptions" :key="item.id" :label="item.name" :value="item.id" />
-                    </el-select>
+                    </el-select> -->
+                    <personnel-search v-model="transferValue" :size="''" placeholder="请选择"></personnel-search>
                 </div>
                 <div class="pl-3 text-[#e94a4a]">转移后,将看不到此商机</div>
             </div>
@@ -128,6 +134,7 @@ import { formatDateTime } from '@/utils/times';
 import { confirmAction } from '@/utils/tools';
 import { useStore } from '@/store/index'
 import { URL_GETALL } from '@/pages/contacts/api';
+import personnelSearch from '@/components/translationComponent/personnelSearch/personnelSearch.vue';
 
 const { userInfo } = useStore()
 const globalPopup = inject<GlobalPopup>('globalPopup')
@@ -281,7 +288,7 @@ onMounted(() => {
 .information {
     .title {
         font-size: 18px;
-        color: #000
+        color: #606266
     }
 
     .form {

+ 7 - 2
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/business/component/operationRecord.vue

@@ -6,7 +6,12 @@
         <div class="flex-1 overflow-auto pt-5">
             <el-table :data="operationRecordtable" border style="width: 100%;height: 278px;">
                 <el-table-column prop="newCreatTime" label="操作时间" width="160" />
-                <el-table-column prop="userName" label="操作人" width="120" />
+                <el-table-column prop="userName" label="操作人" width="120">
+                    <template #default="scope">
+                        <TextTranslation translationTypes="userName" :translationValue="scope.row.userName">
+                        </TextTranslation>
+                    </template>
+                </el-table-column>
                 <el-table-column prop="name" label="操作内容" />
             </el-table>
         </div>
@@ -41,7 +46,7 @@ onMounted(() => {
 .operationRecord {
     .title {
         font-size: 18px;
-        color: #000
+        color: #606266
     }
 }
 </style>

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

@@ -162,7 +162,7 @@ onMounted(() => {
 .relatedTasks {
     .title {
         font-size: 18px;
-        color: #000
+        color: #606266
     }
 }
 </style>

+ 8 - 3
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/business/component/relatedTasks.vue

@@ -12,12 +12,17 @@
                     <template #default="scope">
                         <el-button link type="primary" size="large">{{
                             scope.row.taskName
-                        }}</el-button>
+                            }}</el-button>
                     </template>
                 </el-table-column>
                 <el-table-column prop="priority" label="优先级" width="130" />
                 <el-table-column prop="status" label="状态" width="130" />
-                <el-table-column prop="executor" label="执行人" width="130" />
+                <el-table-column prop="executor" label="执行人" width="130">
+                    <template #default="scope">
+                        <TextTranslation translationTypes="userName" :translationValue="scope.row.executor">
+                        </TextTranslation>
+                    </template>
+                </el-table-column>
                 <el-table-column prop="startTime" label="开始时间" width="130" />
                 <el-table-column prop="endTime" label="截至时间" width="130" />
             </el-table>
@@ -78,7 +83,7 @@ onMounted(() => {
 .relatedTasks {
     .title {
         font-size: 18px;
-        color: #000
+        color: #606266
     }
 }
 </style>

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

@@ -333,7 +333,7 @@ onMounted(() => {
 
   .backGray {
     background-color: #F4F5F7;
-    color: #000;
+    color: #606266;
   }
 
   .backOrange {

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

@@ -25,9 +25,10 @@
               </el-select>
             </el-form-item>
             <el-form-item label="负责人">
-              <el-select v-model="businessOpportunityForm.inchargerId" placeholder="请选择" clearable>
+              <!-- <el-select v-model="businessOpportunityForm.inchargerId" placeholder="请选择" clearable>
                 <el-option v-for="item in fixedData.Personnel" :key="item.id" :label="item.name" :value="item.id" />
-              </el-select>
+              </el-select> -->
+              <personnel-search v-model="businessOpportunityForm.inchargerId" :size="''" placeholder="请选择"></personnel-search>
             </el-form-item>
             <el-form-item label="创建时间">
               <el-date-picker v-model="businessOpportunityForm.startTime" type="date" placeholder="请选择"
@@ -72,6 +73,9 @@
               <template #default="scope">
                 <div class="table-text-textnowrap" v-if="item.eventName"
                   @click="dealWithTableColumn(scope.row, item.eventName)">{{ scope.row[item.prop] }}</div>
+                <template v-else-if="['inchargerName', 'creatorName'].includes(item.prop)">
+                  <TextTranslation translationTypes="userName" :translationValue="scope.row[item.prop]"></TextTranslation>
+                </template>
                 <template v-else>{{ scope.row[item.prop] }}</template>
               </template>
             </el-table-column>
@@ -134,9 +138,10 @@
       <div class="scroll-bar m-6">
         <div class="flex mb-4">
           <div class="w-20 flex items-center justify-end pr-4">转移至:</div>
-          <el-select v-model="transferPersonnel" placeholder="请选择" class="flex1">
+          <!-- <el-select v-model="transferPersonnel" placeholder="请选择" class="flex1">
             <el-option v-for="item in fixedData.Personnel" :key="item.id" :label="item.name" :value="item.id" />
-          </el-select>
+          </el-select> -->
+          <personnel-search v-model="transferPersonnel" :size="''" placeholder="请选择"></personnel-search>
         </div>
         <div class="pl-3 text-[#e94a4a]">转移后,将看不到此商机</div>
       </div>
@@ -195,6 +200,7 @@ import TaskModal from '@/components/TaskModal/index.vue'
 import DeteleBusiness from './component/deteleTables.vue'
 import StageSetting from './component/stageSetting.vue'
 import { GETTABLELISTPRODUCT } from "../order/api";
+import personnelSearch from '@/components/translationComponent/personnelSearch/personnelSearch.vue';
 
 const route = useRoute()
 const router = useRouter()

+ 10 - 4
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/contacts/component/attachment.vue

@@ -13,9 +13,14 @@
         </div>
         <div class="flex-1 overflow-auto pt-3">
             <el-table :data="attachmenttable" border style="width: 100%;height: 200px;">
-                <el-table-column prop="documentName" label="附件名称" width="180" />
+                <el-table-column prop="documentName" label="附件名称" />
                 <el-table-column prop="size" label="附件大小" width="120" />
-                <el-table-column prop="creatorName" label="上传人" width="120" />
+                <el-table-column prop="creatorName" label="上传人" width="120">
+                    <template #default="scope">
+                        <TextTranslation translationTypes="userName" :translationValue="scope.row.creatorName">
+                        </TextTranslation>
+                    </template>
+                </el-table-column>
                 <el-table-column prop="indate" label="上传时间" width="180" />
                 <el-table-column label="操作" width="180" fixed="right">
                     <template #default="scope">
@@ -33,7 +38,8 @@
                 <div class="flex justify-between items-center border-b pb-3 dialog-header">
                     <h4 :id="titleId">{{ '文件重命名' }}</h4>
                     <div>
-                        <el-button type="primary" @click="saveEditClue()" :loading="allLoading.saveLoading">保存</el-button>
+                        <el-button type="primary" @click="saveEditClue()"
+                            :loading="allLoading.saveLoading">保存</el-button>
                         <el-button @click="allVisible.renameDialogVisible = false">取消</el-button>
                     </div>
                 </div>
@@ -76,7 +82,7 @@ const allVisible = reactive({
 })
 
 function saveEditClue() {
-    if(!fileFormVal.value.name) {
+    if (!fileFormVal.value.name) {
         globalPopup?.showWarning('请输入文件名称')
         return
     }

+ 4 - 1
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/contacts/component/deteleTables.vue

@@ -21,7 +21,10 @@
                     <el-table-column v-for="(item, index) in tableColumns" :prop="item.prop" :label="item.label" :key="index"
                         :width="item.width">
                         <template #default="scope">
-                            <span>{{ scope.row[item.prop] }}</span>
+                            <template v-if="['creatorName', 'ownerName'].includes(item.prop)">
+                                <TextTranslation translationTypes="userName" :translationValue="scope.row[item.prop]"></TextTranslation>
+                            </template>
+                            <span v-else>{{ scope.row[item.prop] }}</span>
                         </template>
                     </el-table-column>
                     <el-table-column label="操作" fixed="right" width="120">

+ 14 - 4
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/contacts/component/information.vue

@@ -11,7 +11,14 @@
         <div class="form flex flex-wrap justify-between">
             <div v-for="item in formItems" :key="item.label" class="formItem flex pt-2 pb-1" :style="{ width: item.width }">
                 <div :class="item.labelClass">{{ item.label }}:</div>
-                <div class="flex-1 overflow-hidden text-ellipsis whitespace-nowrap ml-1" v-ellipsis-tooltip>{{ item.value }}</div>
+                <div class="flex-1 overflow-hidden text-ellipsis whitespace-nowrap ml-1" v-ellipsis-tooltip>
+                    <template v-if="['ownerName', 'creatorName'].includes(item.key)">
+                        <TextTranslation translationTypes="userName" :translationValue="item.value"></TextTranslation>
+                    </template>
+                    <template v-else>
+                        {{ item.value }}
+                    </template>
+                </div>
             </div>
         </div>
 
@@ -48,10 +55,11 @@
             <div class="scroll-bar m-6">
                 <div class="flex mb-4">
                     <div class="w-20 flex items-center justify-end pr-4">转移至:</div>
-                    <el-select v-model="transferValue" placeholder="请选择" class="flex1">
+                    <!-- <el-select v-model="transferValue" placeholder="请选择" class="flex1">
                         <el-option v-for="item in transferOptions" :key="item.value" :label="item.label"
                             :value="item.value" />
-                    </el-select>
+                    </el-select> -->
+                    <personnel-search v-model="transferValue" :size="''" placeholder="请选择" :clearable="false"></personnel-search>
                 </div>
                 <div class="pl-3 text-[#e94a4a]">转移后,将看不到此联系人</div>
             </div>
@@ -65,6 +73,8 @@ import { getFromValue, getTemplateKey } from '@/utils/tools';
 import { GETGENERATEFOEM, GETPERSONNEL, URL_TRANSFERCONTACTS, URL_UPLOAD } from '../api';
 import { get, post } from '@/utils/request';
 
+import personnelSearch from '@/components/translationComponent/personnelSearch/personnelSearch.vue';
+
 const globalPopup = inject<GlobalPopup>('globalPopup')
 const emits = defineEmits(['refreshData']);
 const props = defineProps<{
@@ -203,7 +213,7 @@ onMounted(async () => {
 .information {
     .title {
         font-size: 18px;
-        color: #000
+        color: #606266
     }
 
     .form {

+ 8 - 3
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/contacts/component/operationRecord.vue

@@ -5,8 +5,13 @@
         </div>
         <div class="flex-1 overflow-auto pt-5">
             <el-table :data="operationRecordtable" border style="width: 100%;height: 278px;">
-                <el-table-column prop="operateDate" label="操作时间" width="150" />
-                <el-table-column prop="operateName" label="操作人" width="120" />
+                <el-table-column prop="operateDate" label="操作时间" width="160" />
+                <el-table-column prop="operateName" label="操作人" width="120">
+                    <template #default="scope">
+                        <TextTranslation translationTypes="userName" :translationValue="scope.row.operateName">
+                        </TextTranslation>
+                    </template>
+                </el-table-column>
                 <el-table-column prop="msg" label="操作内容" />
             </el-table>
         </div>
@@ -32,7 +37,7 @@ onMounted(() => {
 .operationRecord {
     .title {
         font-size: 18px;
-        color: #000
+        color: #606266
     }
 }
 </style>

+ 10 - 2
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/contacts/component/relatedBusiness.vue

@@ -16,11 +16,19 @@
                     </template>
                 </el-table-column>
                 <el-table-column prop="customerName" label="客户名称" width="140" />
-                <el-table-column prop="inchargerName" label="负责人" width="130" />
+                <el-table-column prop="inchargerName" label="负责人" width="130">
+                    <template #default="scope">
+                        <TextTranslation translationTypes="userName" :translationValue="scope.row.inchargerName"></TextTranslation>
+                    </template>
+                </el-table-column>
                 <el-table-column prop="amountOfMoney" label="商机金额" width="130" />
                 <el-table-column prop="expectedTransactionDate" label="预计成交时间" width="170" />
                 <el-table-column prop="stageValue" label="商机阶段" width="130" />
-                <el-table-column prop="creatorName" label="创建人" width="130" />
+                <el-table-column prop="creatorName" label="创建人" width="130">
+                    <template #default="scope">
+                        <TextTranslation translationTypes="userName" :translationValue="scope.row.creatorName"></TextTranslation>
+                    </template>
+                </el-table-column>
                 <el-table-column prop="createTime" label="创建时间" width="130" />
                 <el-table-column prop="editTime" label="修改时间" width="130" />
             </el-table>

+ 1 - 1
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/contacts/component/relatedTasks.vue

@@ -36,7 +36,7 @@ onMounted(() => {
 .relatedTasks {
     .title {
         font-size: 18px;
-        color: #000
+        color: #606266
     }
 }
 </style>

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

@@ -8,6 +8,7 @@
             <el-form-item v-for="(item, index) in filterItems" :key="index" :label="item.label">
               <el-input v-if="item.type === 'input'" v-model="filterForm[item.key as keyof FilterForm]" clearable
                 placeholder="请输入"></el-input>
+              <personnel-search v-model="filterForm[item.key as keyof FilterForm]" :size="''" placeholder="请选择" v-else-if="['ownerId', 'creatorId'].includes(item.key) && item.type != 'input'"></personnel-search>
               <el-select v-else v-model="filterForm[item.key as keyof FilterForm]" placeholder="请选择" clearable>
                 <el-option v-for="option in item.options" :key="option.id" :label="option.name" :value="option.id" />
               </el-select>
@@ -44,6 +45,9 @@
                   <el-button link type="primary" size="large" @click="toDetali(scope.row)">{{ scope.row.name
                   }}</el-button>
                 </template>
+                <template v-if="['creatorName', 'ownerName'].includes(column.prop)">
+                  <TextTranslation translationTypes="userName" :translationValue="scope.row[column.prop]"></TextTranslation>
+                </template>
                 <template v-if="column.event === 'getSex'">
                   {{ getSex(scope.row.sex) }}
                 </template>
@@ -136,6 +140,7 @@ import { ElTable, UploadRequestOptions } from "element-plus";
 import DeteleTables from './component/deteleTables.vue'
 import TaskModal from '@/components/TaskModal/index.vue'
 import { createTask } from "@/components/TaskModal/taskFunction";
+import personnelSearch from '@/components/translationComponent/personnelSearch/personnelSearch.vue';
 
 const router = useRouter()
 const globalPopup = inject<GlobalPopup>('globalPopup')

+ 58 - 15
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/corpreport/index.vue

@@ -13,10 +13,16 @@ import {
   exportFile
 } from './api';
 import { downloadFile } from '@/utils/tools';
+import { dealWithTranslation } from '@/utils/translationProcessing'
+import personnelSearch from '@/components/translationComponent/personnelSearch/personnelSearch.vue';
+import treeSelect from '@/components/translationComponent/treeSelect/treeSelect.vue'
+import { useStore } from '@/store/index'
+import { storeToRefs } from 'pinia';
 
+const { userInfo } = storeToRefs(useStore());
 const isLoading = ref(false);
 const dataSource = ref([]);
-const form = reactive({ type: 1, date: undefined, member: undefined });
+const form = reactive({ type: 1, date: undefined, member: '' });
 const memberOptions: any = ref([]);
 // 0 客户总量  1 客户转化率
 const dataType = ref<0 | 1>(0);
@@ -76,6 +82,19 @@ const queryOverall = async (payload?: RequestProps) => {
     name: form.type === 1 ? d.name : d.departmentName
   }));
 
+  const sourceData = data.map((d: any) => ({
+    name: form.type === 1 ? d.name : d.departmentName,
+    ['成交客户数']: d.customerDeal,
+    ['新增客户数']: d.customertotal
+  }))
+
+  const sourceDataTypes = sourceData.map((item: any) => {
+    return {
+      type: form.type === 1 ? 'userName' : 'departmentName',
+      id: item.name
+    }
+  })
+
   // @ts-ignore
   chartOptions.series = [
     { type: 'bar', barWidth: 20 },
@@ -84,11 +103,12 @@ const queryOverall = async (payload?: RequestProps) => {
   // @ts-ignore
   chartOptions.dataset.dimensions = ['name', '成交客户数', '新增客户数'];
   // @ts-ignore
-  chartOptions.dataset.source = data.map((d) => ({
-    name: form.type === 1 ? d.name : d.departmentName,
-    ['成交客户数']: d.customerDeal,
-    ['新增客户数']: d.customertotal
-  }));
+  chartOptions.dataset.source = userInfo.userNameNeedTranslate == 1 ? dealWithTranslation(sourceDataTypes, sourceData) : sourceData
+  // chartOptions.dataset.source = data.map((d) => ({
+  //   name: form.type === 1 ? d.name : d.departmentName,
+  //   ['成交客户数']: d.customerDeal,
+  //   ['新增客户数']: d.customertotal
+  // }));
   chartOptions.legend = {};
 };
 
@@ -103,15 +123,28 @@ const queryConversion = async (payload?: RequestProps) => {
     dealRate: d.dealRate * 100
   }));
 
+  const sourceData = data.map((d: any) => ({
+    name: form.type === 1 ? d.name : d.departmentName,
+    ['客户转化率(%)']: d.dealRate * 100
+  }))
+
+  const sourceDataTypes = sourceData.map((item: any) => {
+    return {
+      type: form.type === 1 ? 'userName' : 'departmentName',
+      id: item.name
+    }
+  })
+
   // @ts-ignore
   chartOptions.series = [{ type: 'bar', barWidth: 20 }];
   // @ts-ignore
   chartOptions.dataset.dimensions = ['name', '客户转化率(%)'];
   // @ts-ignore
-  chartOptions.dataset.source = data.map((d) => ({
-    name: form.type === 1 ? d.name : d.departmentName,
-    ['客户转化率(%)']: d.dealRate * 100
-  }));
+  chartOptions.dataset.source = userInfo.userNameNeedTranslate == 1 ? dealWithTranslation(sourceDataTypes, sourceData) : sourceData
+  // chartOptions.dataset.source = data.map((d) => ({
+  //   name: form.type === 1 ? d.name : d.departmentName,
+  //   ['客户转化率(%)']: d.dealRate * 100
+  // }));
   chartOptions.legend = undefined;
 };
 
@@ -144,13 +177,13 @@ watchEffect(async () => {
           </el-select>
         </el-form-item>
         <el-form-item>
-          <el-select v-model="form.type" @change="form.member = undefined" style="width: 112px">
+          <el-select v-model="form.type" @change="form.member = ''" style="width: 112px">
             <el-option label="按部门" :value="0" />
             <el-option label="按员工" :value="1" />
           </el-select>
         </el-form-item>
         <el-form-item>
-          <el-select
+          <!-- <el-select
             style="width: 208px"
             clearable
             v-model="form.member"
@@ -162,7 +195,13 @@ watchEffect(async () => {
               :label="date.name"
               :value="date.id"
             />
-          </el-select>
+          </el-select> -->
+          <template v-if="form.type == 1">
+            <personnel-search v-model="form.member" :size="''" placeholder="选择员工" width="240px"></personnel-search>
+          </template>
+          <template v-if="form.type == 0">
+            <tree-select v-model="form.member" :size="''" checkStrictly placeholder="选择部门" width="240px"></tree-select>
+          </template>
         </el-form-item>
         <el-form-item>
           <!-- :loading="isLoading" -->
@@ -180,7 +219,7 @@ watchEffect(async () => {
         @tab-change="
           () => {
             form.date = undefined;
-            form.member = undefined;
+            form.member = '';
             form.type = 1;
             dataSource = [];
           }
@@ -194,7 +233,11 @@ watchEffect(async () => {
       <Echarts :option="chartOptions"></Echarts>
     </div>
     <el-table :data="dataSource">
-      <el-table-column prop="name" label="名称" />
+      <el-table-column prop="name" label="名称">
+        <template #default="scope">
+          <TextTranslation translationTypes="userName" :translationValue="scope.row.name"></TextTranslation>
+        </template>
+      </el-table-column>
       <el-table-column prop="dealRate" label="客户转化率(%)" v-if="dataType === 1" />
       <template v-else>
         <el-table-column prop="customertotal" label="新增客户数" />

+ 7 - 3
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/customer/component/attachment.vue

@@ -13,9 +13,13 @@
         </div>
         <div class="flex-1 overflow-auto pt-3">
             <el-table :data="attachmenttable" border style="width: 100%;height: 200px;">
-                <el-table-column prop="name" label="附件名称" width="180" />
+                <el-table-column prop="name" label="附件名称" />
                 <el-table-column prop="size" label="附件大小" width="120" />
-                <el-table-column prop="userName" label="上传人" width="120" />
+                <el-table-column prop="userName" label="上传人" width="120">
+                    <template #default="scope">
+                        <TextTranslation translationTypes="userName" :translationValue="scope.row.userName"></TextTranslation>
+                    </template>
+                </el-table-column>
                 <el-table-column prop="createTime" label="上传时间" width="180" sortable />
                 <el-table-column label="操作" width="180" fixed="right">
                     <template #default="scope">
@@ -138,7 +142,7 @@ onMounted(() => {
 .attachment {
     .title {
         font-size: 18px;
-        color: #000
+        color: #606266
     }
 }
 </style>

+ 10 - 2
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/customer/component/deteleTables.vue

@@ -24,8 +24,16 @@
                     <el-table-column prop="email" label="邮箱" width="200"></el-table-column>
                     <el-table-column prop="customerIndustryValue" label="客户行业" width="180"></el-table-column>
                     <el-table-column prop="customerLevelValue" label="客户级别" width="180"></el-table-column>
-                    <el-table-column prop="inchargerName" label="负责人" width="190"></el-table-column>
-                    <el-table-column prop="creatorName" label="创建人" width="180"></el-table-column>
+                    <el-table-column prop="inchargerName" label="负责人" width="190">
+                        <template #default="scope">
+                            <TextTranslation translationTypes="userName" :translationValue="scope.row.inchargerName"></TextTranslation>
+                        </template>
+                    </el-table-column>
+                    <el-table-column prop="creatorName" label="创建人" width="180">
+                        <template #default="scope">
+                            <TextTranslation translationTypes="userName" :translationValue="scope.row.creatorName"></TextTranslation>
+                        </template>
+                    </el-table-column>
                     <el-table-column prop="newCreateTime" label="创建时间" width="180"></el-table-column>
                     <el-table-column label="操作" fixed="right" width="120">
                         <template #default="scope">

+ 7 - 5
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/customer/component/information.vue

@@ -58,13 +58,13 @@
       <div class="formItem flex pt-2 pb-1">
         <div class="w-22 text-right text-gray-500">负责人:</div>
         <div class="flex-1 overflow-hidden text-ellipsis whitespace-nowrap ml-1">
-          {{ information.inchargerName }}
+          <TextTranslation translationTypes="userName" :translationValue="information.inchargerName"></TextTranslation>
         </div>
       </div>
       <div class="formItem flex pt-2 pb-1">
         <div class="w-22 text-right text-gray-500">创建人:</div>
         <div class="flex-1 overflow-hidden text-ellipsis whitespace-nowrap ml-1">
-          {{ information.creatorName }}
+          <TextTranslation translationTypes="userName" :translationValue="information.creatorName"></TextTranslation>
         </div>
       </div>
       <div class="formItem flex pt-2 pb-1">
@@ -105,14 +105,15 @@
       <div class="scroll-bar m-6">
         <div class="flex mb-4">
           <div class="w-20 flex items-center justify-end pr-4">转移至:</div>
-          <el-select v-model="transferValue" placeholder="请选择" class="flex1">
+          <!-- <el-select v-model="transferValue" placeholder="请选择" class="flex1">
             <el-option
               v-for="item in transferOptions"
               :key="item.id"
               :label="item.name"
               :value="item.id"
             />
-          </el-select>
+          </el-select> -->
+          <personnel-search v-model="transferValue" :size="''" placeholder="请选择"></personnel-search>
         </div>
         <div class="pl-3 text-[#e94a4a]">转移后,将看不到此客户</div>
       </div>
@@ -152,6 +153,7 @@ import { useStore } from '@/store/index';
 import { get, post } from '@/utils/request';
 import { GETPERSONNEL, URL_CLAIM, URL_EDITSAVE, URL_TEMPLALE } from '../api';
 import { formatDate } from '@/utils/times';
+import personnelSearch from '@/components/translationComponent/personnelSearch/personnelSearch.vue';
 
 const emits = defineEmits(['refreshData']);
 const { userInfo } = useStore();
@@ -315,7 +317,7 @@ onMounted(() => {
 .information {
   .title {
     font-size: 18px;
-    color: #000;
+    color: #606266;
   }
 
   .form {

+ 7 - 3
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/customer/component/operationRecord.vue

@@ -5,8 +5,12 @@
         </div>
         <div class="flex-1 overflow-auto pt-5">
             <el-table :data="operationRecordtable" border style="width: 100%;height: 278px;">
-                <el-table-column prop="creatTime" label="操作时间" width="140" />
-                <el-table-column prop="userName" label="操作人" width="120" />
+                <el-table-column prop="creatTime" label="操作时间" width="150" />
+                <el-table-column prop="userName" label="操作人" width="120">
+                    <template #default="scope">
+                        <TextTranslation translationTypes="userName" :translationValue="scope.row.userName"></TextTranslation>
+                    </template>
+                </el-table-column>
                 <el-table-column prop="name" label="操作内容" />
             </el-table>
         </div>
@@ -42,7 +46,7 @@ onMounted(() => {
 .operationRecord {
     .title {
         font-size: 18px;
-        color: #000
+        color: #606266
     }
 }
 </style>

+ 11 - 3
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/customer/component/relatedBusiness.vue

@@ -16,11 +16,19 @@
                     </template>
                 </el-table-column>
                 <el-table-column prop="customerName" label="客户名称" width="130" />
-                <el-table-column prop="inchargerName" label="负责人" width="130" />
+                <el-table-column prop="inchargerName" label="负责人" width="130">
+                    <template #default="scope">
+                        <TextTranslation translationTypes="userName" :translationValue="scope.row.inchargerName"></TextTranslation>
+                    </template>
+                </el-table-column>
                 <el-table-column prop="amountOfMoney" label="商机金额" width="130" />
                 <el-table-column prop="expectedTransactionDate" label="预计成交时间" width="200" />
                 <el-table-column prop="stageValue" label="商机阶段" width="140" />
-                <el-table-column prop="creatorName" label="创建人" width="130" />
+                <el-table-column prop="creatorName" label="创建人" width="130">
+                    <template #default="scope">
+                        <TextTranslation translationTypes="userName" :translationValue="scope.row.creatorName"></TextTranslation>
+                    </template>
+                </el-table-column>
                 <el-table-column prop="createTime" label="创建时间" width="130" />
             </el-table>
         </div>
@@ -188,7 +196,7 @@ onMounted(() => {
 .relatedTasks {
     .title {
         font-size: 18px;
-        color: #000
+        color: #606266
     }
 }
 </style>

+ 11 - 3
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/customer/component/relatedContacts.vue

@@ -29,8 +29,16 @@
                         <template v-if="scope.row.sex == 0">女</template>
                     </template>
                 </el-table-column>
-                <el-table-column prop="ownerName" label="负责人" width="130" />
-                <el-table-column prop="creatorName" label="创建人" width="130" />
+                <el-table-column prop="ownerName" label="负责人" width="130">
+                    <template #default="scope">
+                        <TextTranslation translationTypes="userName" :translationValue="scope.row.ownerName"></TextTranslation>
+                    </template>
+                </el-table-column>
+                <el-table-column prop="creatorName" label="创建人" width="130">
+                    <template #default="scope">
+                        <TextTranslation translationTypes="userName" :translationValue="scope.row.creatorName"></TextTranslation>
+                    </template>
+                </el-table-column>
                 <el-table-column prop="createTime" label="创建时间" width="130" />
             </el-table>
         </div>
@@ -156,7 +164,7 @@ onMounted(() => {
 .relatedTasks {
     .title {
         font-size: 18px;
-        color: #000
+        color: #606266
     }
 }
 </style>

+ 11 - 3
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/customer/component/relatedOrders.vue

@@ -22,8 +22,16 @@
                 <el-table-column prop="unReceivedPayment" label="未回款(¥)" width="130" />
                 <el-table-column prop="typeName" label="订单类型" width="130" />
                 <el-table-column prop="placeTime" label="下单时间" width="200" />
-                <el-table-column prop="inchargerName" label="负责人" width="130" />
-                <el-table-column prop="creatorName" label="创建人" width="130" />
+                <el-table-column prop="inchargerName" label="负责人" width="130">
+                    <template #default="scope">
+                        <TextTranslation translationTypes="userName" :translationValue="scope.row.inchargerName"></TextTranslation>
+                    </template>
+                </el-table-column>
+                <el-table-column prop="creatorName" label="创建人" width="130">
+                    <template #default="scope">
+                        <TextTranslation translationTypes="userName" :translationValue="scope.row.creatorName"></TextTranslation>
+                    </template>
+                </el-table-column>
                 <el-table-column prop="createTime" label="创建时间" width="200" />
             </el-table>
         </div>
@@ -201,7 +209,7 @@ onMounted(() => {
 .relatedTasks {
     .title {
         font-size: 18px;
-        color: #000
+        color: #606266
     }
 }
 </style>

+ 1 - 1
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/customer/component/relatedTasks.vue

@@ -78,7 +78,7 @@ onMounted(() => {
 .relatedTasks {
     .title {
         font-size: 18px;
-        color: #000
+        color: #606266
     }
 }
 </style>

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

@@ -135,7 +135,7 @@ onMounted(() => {
 
   .backGray {
     background-color: #F4F5F7;
-    color: #000;
+    color: #606266;
   }
 
   .startStep {

+ 17 - 6
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/customer/index.vue

@@ -30,9 +30,10 @@
               </el-select>
             </el-form-item>
             <el-form-item label="负责人">
-              <el-select v-model="customerCriteriaForm.inchargerId" placeholder="请选择" clearable>
+              <!-- <el-select v-model="customerCriteriaForm.inchargerId" placeholder="请选择" clearable>
                 <el-option v-for="item in fixedData.Personnel" :key="item.id" :label="item.name" :value="item.id" />
-              </el-select>
+              </el-select> -->
+              <personnel-search v-model="customerCriteriaForm.inchargerId" :size="''" placeholder="请选择"></personnel-search>
             </el-form-item>
             <el-form-item label="创建时间">
               <el-date-picker v-model="customerCriteriaForm.startTime" type="date" placeholder="请选择" :clearable="false"
@@ -79,8 +80,16 @@
             <el-table-column prop="email" label="邮箱" width="200"></el-table-column>
             <el-table-column prop="customerIndustryValue" label="客户行业" width="180"></el-table-column>
             <el-table-column prop="customerLevelValue" label="客户级别" width="180" sortable="custom"></el-table-column>
-            <el-table-column prop="inchargerName" label="负责人" width="190"></el-table-column>
-            <el-table-column prop="creatorName" label="创建人" width="180"></el-table-column>
+            <el-table-column prop="inchargerName" label="负责人" width="190">
+              <template #default="scope">
+                <TextTranslation translationTypes="userName" :translationValue="scope.row.inchargerName"></TextTranslation>
+              </template>
+            </el-table-column>
+            <el-table-column prop="creatorName" label="创建人" width="180">
+              <template #default="scope">
+                <TextTranslation translationTypes="userName" :translationValue="scope.row.creatorName"></TextTranslation>
+              </template>
+            </el-table-column>
             <el-table-column prop="newCreateTime" label="创建时间" width="180"></el-table-column>
             <el-table-column label="操作" fixed="right" width="200" v-permission="['customerEdit', 'tasksAdd', 'customerDelete']">
               <template #default="scope">
@@ -135,9 +144,10 @@
       <div class="scroll-bar m-6">
         <div class="flex mb-4">
           <div class="w-20 flex items-center justify-end pr-4">转移至:</div>
-          <el-select v-model="transferPersonnel" placeholder="请选择" class="flex1">
+          <!-- <el-select v-model="transferPersonnel" placeholder="请选择" class="flex1">
             <el-option v-for="item in fixedData.Personnel" :key="item.id" :label="item.name" :value="item.id" />
-          </el-select>
+          </el-select> -->
+          <personnel-search v-model="transferPersonnel" :size="''" placeholder="请选择"></personnel-search>
         </div>
         <div class="pl-3 text-[#e94a4a]">转移后,将看不到此客户</div>
       </div>
@@ -188,6 +198,7 @@ import { tableShowOverflowTooltip } from '@/utils/globalVariables'
 
 import TaskModal from '@/components/TaskModal/index.vue'
 import DeteleBusiness from './component/deteleTables.vue'
+import personnelSearch from '@/components/translationComponent/personnelSearch/personnelSearch.vue';
 
 // 定义类型
 interface fixedDataInterface {

+ 1 - 1
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/header/header.vue

@@ -7,7 +7,7 @@
     <div v-for="(routerItem, routerItemIdex) in routerList" @click="setCurrentRouter(routerItem)"
       :class="`border-b-2 border-transparent hover:border-white p-2 mr-4 cursor-pointer multipleyHeader ${activeRouter?.path === routerItem.path ? 'border-white' : ''}`"
       :key="routerItem.path" ref="childDivs" v-show="visibleItems.includes(routerItemIdex)">
-      <div v-if="routerItem.children && routerItem.children.length <= 0 && routerItem?.isMenu" class="text-nowrap">
+      <div v-if="routerItem.children && routerItem.children.length <= 0 && routerItem?.isMenu" class="text-nowrap headerText">
         {{ routerItem.name }}
       </div>
       <div v-if="routerItem.children && routerItem.children.length > 0" class="flex justify-center items-center">

+ 3 - 3
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/order/api.ts

@@ -27,9 +27,9 @@ export const tableColumns: TableColumn[] = [
     { prop: 'orderName', label: '订单名称', event: 'toDetali', width: '150' },
     { prop: 'customName', label: '客户名称', width: '200' },
     { prop: 'businessOpportunityName', label: '商机名称', width: '200' },
-    { prop: 'price', label: '订单金额(¥)', width: '120' },
-    { prop: 'receivedPayment', label: '已回款(¥)', width: '100' },
-    { prop: 'unReceivedPayment', label: '未回款(¥)', width: '100' },
+    { prop: 'price', label: '订单金额(¥)', width: '140' },
+    { prop: 'receivedPayment', label: '已回款(¥)', width: '140' },
+    { prop: 'unReceivedPayment', label: '未回款(¥)', width: '140' },
     { prop: 'receivedStatus', label: '回款状态', width: '100' },
     { prop: 'typeName', label: '订单类型', width: '200' },
     { prop: 'placeTime', label: '下单时间', width: '200' },

+ 8 - 4
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/order/component/attachment.vue

@@ -13,9 +13,13 @@
         </div>
         <div class="flex-1 overflow-auto pt-3">
             <el-table :data="attachmenttable" border style="width: 100%;height: 200px;">
-                <el-table-column prop="attachmentName" label="附件名称" width="180" />
-                <el-table-column prop="size" label="附件大小" width="120" />
-                <el-table-column prop="creatorName" label="上传人" width="120" />
+                <el-table-column prop="attachmentName" label="附件名称" />
+                <el-table-column prop="size" label="附件大小" width="120"/>
+                <el-table-column prop="creatorName" label="上传人" width="120">
+                    <template #default="scope">
+                        <TextTranslation translationTypes="userName" :translationValue="scope.row.creatorName"></TextTranslation>
+                    </template>
+                </el-table-column>
                 <el-table-column prop="indate" label="上传时间" width="180" />
                 <el-table-column label="操作" width="180" fixed="right">
                     <template #default="scope">
@@ -155,7 +159,7 @@ onMounted(() => {
 .attachment {
     .title {
         font-size: 18px;
-        color: #000
+        color: #606266
     }
 }
 </style>

+ 4 - 1
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/order/component/deteleTables.vue

@@ -21,7 +21,10 @@
                     <el-table-column v-for="(item, index) in tableColumns" :prop="item.prop" :label="item.label"
                         :key="index" :width="item.width">
                         <template #default="scope">
-                            <span>{{ scope.row[item.prop] }}</span>
+                            <template v-if="['customSignerName', 'companySignerName', 'inchargerName', 'creatorName'].includes(item.prop)">
+                                <TextTranslation translationTypes="userName" :translationValue="scope.row[item.prop]"></TextTranslation>
+                            </template>
+                            <span v-else>{{ scope.row[item.prop] }}</span>
                         </template>
                     </el-table-column>
                     <el-table-column label="操作" fixed="right" width="120">

+ 13 - 5
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/order/component/information.vue

@@ -10,8 +10,14 @@
         <div class="form flex flex-wrap justify-between">
             <div v-for="item in formItems" :key="item.label" class="formItem flex" :style="`width: ${item.width}`">
                 <div :class="item.labelClass">{{ item.label }}:</div>
-                <div class="flex-1 overflow-hidden text-ellipsis whitespace-nowrap ml-1" v-ellipsis-tooltip>{{
-                    item.value }}</div>
+                <div class="flex-1 overflow-hidden text-ellipsis whitespace-nowrap ml-1" v-ellipsis-tooltip>
+                    <template v-if="['customSignerName', 'companySignerName', 'inchargerName', 'creatorName'].includes(item.key)">
+                        <TextTranslation translationTypes="userName" :translationValue="item.value"></TextTranslation>
+                    </template>
+                    <template v-else>
+                        {{ item.value }}
+                    </template>
+                </div>
             </div>
         </div>
 
@@ -29,10 +35,11 @@
             <div class="scroll-bar m-6">
                 <div class="flex mb-4">
                     <div class="w-20 flex items-center justify-end pr-4">转移至:</div>
-                    <el-select v-model.trim="transferValue" placeholder="请选择" class="flex1">
+                    <personnel-search v-model="transferValue" :size="''" placeholder="请选择"></personnel-search>
+                    <!-- <el-select v-model.trim="transferValue" placeholder="请选择" class="flex1">
                         <el-option v-for="item in transferOptions" :key="item.value" :label="item.label"
                             :value="item.value" />
-                    </el-select>
+                    </el-select> -->
                 </div>
                 <div class="pl-3 text-[#e94a4a]">转移后,将看不到此联系人</div>
             </div>
@@ -65,6 +72,7 @@ import { getFromValue, getTemplateKey } from '@/utils/tools';
 import { get, post } from '@/utils/request';
 import { GETGENERATEFOEM, GETPERSONNEL, URL_OEDERUPDATE, URL_PRODUTWITHORDER, URL_TRANSFER, paymentStatus } from '../api';
 import { formatDate } from '@/utils/times';
+import personnelSearch from '@/components/translationComponent/personnelSearch/personnelSearch.vue';
 
 const globalPopup = inject<GlobalPopup>('globalPopup')
 const emits = defineEmits(['refreshData']);
@@ -242,7 +250,7 @@ onMounted(async () => {
 .information {
     .title {
         font-size: 18px;
-        color: #000
+        color: #606266
     }
 
     .form {

+ 7 - 3
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/order/component/operationRecord.vue

@@ -5,8 +5,12 @@
         </div>
         <div class="flex-1 overflow-auto pt-5">
             <el-table :data="operationRecordtable" border style="width: 100%;height: 278px;">
-                <el-table-column prop="auditTime" label="操作时间" width="150" />
-                <el-table-column prop="auditorName" label="操作人" width="120" />
+                <el-table-column prop="auditTime" label="操作时间" width="160" />
+                <el-table-column prop="auditorName" label="操作人" width="120">
+                    <template #default="scope">
+                        <TextTranslation translationTypes="userName" :translationValue="scope.row.auditorName"></TextTranslation>
+                    </template>
+                </el-table-column>
                 <el-table-column prop="auditorContent" label="操作内容" />
             </el-table>
         </div>
@@ -32,7 +36,7 @@ onMounted(() => {
 .operationRecord {
     .title {
         font-size: 18px;
-        color: #000
+        color: #606266
     }
 }
 </style>

+ 1 - 1
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/order/component/products.vue

@@ -198,7 +198,7 @@ onMounted(() => {
 .relatedTasks {
     .title {
         font-size: 18px;
-        color: #000
+        color: #606266
     }
 }
 </style>

+ 7 - 3
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/order/component/rebate.vue

@@ -8,8 +8,12 @@
         </div>
         <div class="flex-1 overflow-auto pt-5">
             <el-table :data="operationRecordtable" border style="width: 100%;height: 278px;">
-                <el-table-column prop="createTime" label="回款时间" width="170" />
-                <el-table-column prop="creatorName" label="操作人" width="120" />
+                <el-table-column prop="createTime" label="回款时间" width="190" />
+                <el-table-column prop="creatorName" label="操作人" width="120">
+                    <template #default="scope">
+                        <TextTranslation translationTypes="userName" :translationValue="scope.row.creatorName"></TextTranslation>
+                    </template>
+                </el-table-column>
                 <el-table-column prop="money" label="回款金额" width="120" />
                 <el-table-column prop="unReceivedPayment" label="未回款金额" width="120" />
                 <el-table-column :label="'操作'" :width="'120px'" fixed="right">
@@ -132,7 +136,7 @@ onMounted(() => {
 .operationRecord {
     .title {
         font-size: 18px;
-        color: #000
+        color: #606266
     }
 }
 </style>

+ 8 - 1
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/order/index.vue

@@ -9,6 +9,9 @@
               <el-form-item :label="item.label" v-if="item.type != 'date'">
                 <el-input v-if="item.type === 'input'" v-model="filterForm[item.key as keyof FilterForm]" clearable
                   placeholder="请输入"></el-input>
+                <template v-else-if="['inchargerId'].includes(item.key)">
+                  <personnel-search v-model="filterForm[item.key as keyof FilterForm]" :size="''" placeholder="请选择"></personnel-search>
+                </template>
                 <el-select v-else v-model="filterForm[item.key as keyof FilterForm]" placeholder="请选择" clearable>
                   <el-option v-for="option in item.options" :key="option.id" :label="option.name" :value="option.id" />
                 </el-select>
@@ -37,7 +40,7 @@
         <div class="flex justify-end pb-3">
           <!-- 操作按钮 -->
           <el-button type="primary" v-permission="['orderAdd']" @click="editOrder(false)">新建订单</el-button>
-          <el-button type="primary" :disabled="batchTableData.length <= 0">批量转移</el-button>
+          <!-- <el-button type="primary" :disabled="batchTableData.length <= 0">批量转移</el-button> -->
           <el-button type="primary" v-permission="['orderDelete']" @click="batchDeteleItem()" :disabled="batchTableData.length <= 0">批量删除</el-button>
           <el-button type="primary" v-permission="['orderRecycle']" @click="showVisible('deteleOrderVisible')">回收站</el-button>
           <el-button type="primary" v-permission="['orderImport']" @click="showVisible('importVisible')">导入</el-button>
@@ -56,6 +59,9 @@
                   }}</el-button> -->
                   <div class="table-text-textnowrap" @click.prevent="toDetali(scope.row)">{{ scope.row[column.prop] }}</div>
                 </template>
+                <template v-if="['customSignerName', 'companySignerName', 'inchargerName', 'creatorName'].includes(column.prop)">
+                  <TextTranslation translationTypes="userName" :translationValue="scope.row[column.prop]"></TextTranslation>
+                </template>
                 <template v-if="column.prop === 'receivedStatus'">
                   <div>{{ selectData.RemittanceStatus[scope.row.receivedStatus].name }}</div>
                 </template>
@@ -148,6 +154,7 @@ import { URL_FETALL } from "../customer/api";
 import RelatedProducts from '@/components/relatedProducts/relatedProducts.vue'
 import DeteleTables from './component/deteleTables.vue'
 import TaskModal from '@/components/TaskModal/index.vue'
+import personnelSearch from '@/components/translationComponent/personnelSearch/personnelSearch.vue';
 
 
 const router = useRouter()

+ 7 - 3
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/product/component/attachment.vue

@@ -13,9 +13,13 @@
         </div>
         <div class="flex-1 overflow-auto pt-3">
             <el-table :data="attachmenttable" border style="width: 100%;height: 200px;">
-                <el-table-column prop="attachmentName" label="附件名称" width="180" />
+                <el-table-column prop="attachmentName" label="附件名称"/>
                 <el-table-column prop="size" label="附件大小" width="120" />
-                <el-table-column prop="creatorName" label="上传人" width="120" />
+                <el-table-column prop="creatorName" label="上传人" width="120">
+                    <template #default="scope">
+                        <TextTranslation translationTypes="userName" :translationValue="scope.row.creatorName"></TextTranslation>
+                    </template>
+                </el-table-column>
                 <el-table-column prop="indate" label="上传时间" width="180" />
                 <el-table-column label="操作" width="180" fixed="right">
                     <template #default="scope">
@@ -162,7 +166,7 @@ onMounted(() => {
 .attachment {
     .title {
         font-size: 18px;
-        color: #000
+        color: #606266
     }
 }
 </style>

+ 13 - 5
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/product/component/information.vue

@@ -39,11 +39,17 @@
             </div>
             <div class="formItem flex pt-2 pb-1">
                 <div class="w-22 text-right text-gray-500">负责人:</div>
-                <div class="flex-1 overflow-hidden text-ellipsis whitespace-nowrap ml-1">{{ info.inchargerName }}</div>
+                <div class="flex-1 overflow-hidden text-ellipsis whitespace-nowrap ml-1">
+                    <TextTranslation translationTypes="userName" :translationValue="info.inchargerName"></TextTranslation>
+                    <!-- {{ info.inchargerName }} -->
+                </div>
             </div>
             <div class="formItem flex pt-2 pb-1">
                 <div class="w-22 text-right text-gray-500">创建人:</div>
-                <div class="flex-1 overflow-hidden text-ellipsis whitespace-nowrap ml-1">{{ info.creatorName }}</div>
+                <div class="flex-1 overflow-hidden text-ellipsis whitespace-nowrap ml-1">
+                    <TextTranslation translationTypes="userName" :translationValue="info.creatorName"></TextTranslation>
+                    <!-- {{ info.creatorName }} -->
+                </div>
             </div>
             <div class="formItem flex pt-2 pb-1">
                 <div class="w-22 text-right text-gray-500">创建时间:</div>
@@ -72,9 +78,10 @@
             <div class="scroll-bar m-6">
                 <div class="flex mb-4">
                     <div class="w-20 flex items-center justify-end pr-4">转移至:</div>
-                    <el-select v-model="transferValue" placeholder="请选择" class="flex1">
+                        <personnel-search v-model="transferValue" :size="''" placeholder="请选择"></personnel-search>
+                    <!-- <el-select v-model="transferValue" placeholder="请选择" class="flex1">
                         <el-option v-for="item in transferOptions" :key="item.id" :label="item.name" :value="item.id" />
-                    </el-select>
+                    </el-select> -->
                 </div>
                 <div class="pl-3 text-[#e94a4a]">转移后,将看不到此产品</div>
             </div>
@@ -106,6 +113,7 @@ import { ADDPRODUCT, GETDOEMCODE, GETINCHARGER, GETPERSONNEL, GETTEMPLATE, MOD }
 import { useStore } from '@/store/index'
 import { post, get } from '@/utils/request';
 import { GenerateForm } from '@zmjs/form-design';
+import personnelSearch from '@/components/translationComponent/personnelSearch/personnelSearch.vue';
 
 const props = defineProps<{
     data: any
@@ -241,7 +249,7 @@ onMounted(async () => {
 .information {
     .title {
         font-size: 18px;
-        color: #000
+        color: #606266
     }
 
     .form {

+ 7 - 3
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/product/component/operationRecord.vue

@@ -5,8 +5,12 @@
         </div>
         <div class="flex-1 overflow-auto pt-5">
             <el-table :data="operationRecordtable" border style="width: 100%;height: 278px;">
-                <el-table-column prop="auditTime" label="操作时间" width="140" />
-                <el-table-column prop="auditorName" label="操作人" width="120" />
+                <el-table-column prop="auditTime" label="操作时间" width="160" />
+                <el-table-column prop="auditorName" label="操作人" width="120">
+                    <template #default="scope">
+                        <TextTranslation translationTypes="userName" :translationValue="scope.row.auditorName"></TextTranslation>
+                    </template>
+                </el-table-column>
                 <el-table-column prop="auditorContent" label="操作内容" />
             </el-table>
         </div>
@@ -40,7 +44,7 @@ onMounted(() => {
 .operationRecord {
     .title {
         font-size: 18px;
-        color: #000
+        color: #606266
     }
 }
 </style>

+ 4 - 1
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/product/component/relatedBusiness.vue

@@ -11,6 +11,9 @@
                     <template #default="scope">
                         <div class="table-text-textnowrap" v-if="item.eventName"
                             @click="dealWithTableColumn(scope.row, item.eventName)">{{ scope.row[item.prop] }}</div>
+                        <template v-else-if="['inchargerName', 'creatorName'].includes(item.prop)">
+                            <TextTranslation translationTypes="userName" :translationValue="scope.row[item.prop]"></TextTranslation>
+                        </template>
                         <template v-else>{{ scope.row[item.prop] }}</template>
                     </template>
                 </el-table-column>
@@ -77,7 +80,7 @@ onMounted(() => {
 .relatedTasks {
     .title {
         font-size: 18px;
-        color: #000
+        color: #606266
     }
 }
 </style>

+ 4 - 1
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/product/component/relatedSalesOrder.vue

@@ -13,6 +13,9 @@
                                 scope.row[column.prop]
                                 }}</el-button>
                         </template>
+                        <template v-else-if="['inchargerName', 'creatorName'].includes(column.prop)">
+                            <TextTranslation translationTypes="userName" :translationValue="scope.row[column.prop]"></TextTranslation>
+                        </template>
                     </template>
                 </el-table-column>
             </el-table>
@@ -66,7 +69,7 @@ onMounted(() => {
 .relatedTasks {
     .title {
         font-size: 18px;
-        color: #000
+        color: #606266
     }
 }
 </style>

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

@@ -151,7 +151,7 @@ onMounted(() => {
 
   .backGray {
     background-color: #F4F5F7;
-    color: #000;
+    color: #606266;
   }
 
   .startStep {

+ 10 - 2
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/product/deteleTables.vue

@@ -24,8 +24,16 @@
                     <el-table-column prop="price" label="标准价格(元)" width="180"></el-table-column>
                     <el-table-column prop="inventory" label="库存" width="180"></el-table-column>
                     <el-table-column prop="status" label="状态" width="180"></el-table-column>
-                    <el-table-column prop="inchargerName" label="负责人" width="190"></el-table-column>
-                    <el-table-column prop="creatorName" label="创建人" width="180"></el-table-column>
+                    <el-table-column prop="inchargerName" label="负责人" width="190">
+                        <template #default="scope">
+                          <TextTranslation translationTypes="userName" :translationValue="scope.row.inchargerName"></TextTranslation>
+                        </template>
+                      </el-table-column>
+                      <el-table-column prop="creatorName" label="创建人" width="180">
+                        <template #default="scope">
+                          <TextTranslation translationTypes="userName" :translationValue="scope.row.creatorName"></TextTranslation>
+                        </template>
+                      </el-table-column>
                     <el-table-column prop="createTime" label="创建时间" width="180"></el-table-column>
                     <el-table-column label="操作" fixed="right" width="120">
                         <template #default="scope">

+ 14 - 4
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/product/index.vue

@@ -21,9 +21,10 @@
               </el-select>
             </el-form-item>
             <el-form-item label="负责人">
-              <el-select v-model="filterProductForm.userId" placeholder="请选择" filterable clearable>
+              <personnel-search v-model="filterProductForm.userId" :size="''" placeholder="请选择"></personnel-search>
+              <!-- <el-select v-model="filterProductForm.userId" placeholder="请选择" filterable clearable>
                 <el-option v-for="item in fixedData.Personnel" :key="item.id" :label="item.name" :value="item.id" />
-              </el-select>
+              </el-select> -->
             </el-form-item>
             <el-form-item label="创建时间">
               <el-date-picker v-model="filterProductForm.startTime" type="date" placeholder="请选择" :clearable="false"
@@ -72,8 +73,16 @@
                 {{ scope.row.status == 1 ? '上架' : '下架' }}
               </template>
             </el-table-column>
-            <el-table-column prop="inchargerName" label="负责人" width="190"></el-table-column>
-            <el-table-column prop="creatorName" label="创建人" width="180"></el-table-column>
+            <el-table-column prop="inchargerName" label="负责人" width="190">
+              <template #default="scope">
+                <TextTranslation translationTypes="userName" :translationValue="scope.row.inchargerName"></TextTranslation>
+              </template>
+            </el-table-column>
+            <el-table-column prop="creatorName" label="创建人" width="180">
+              <template #default="scope">
+                <TextTranslation translationTypes="userName" :translationValue="scope.row.creatorName"></TextTranslation>
+              </template>
+            </el-table-column>
             <el-table-column prop="createTime" label="创建时间" width="180"></el-table-column>
             <el-table-column label="操作" fixed="right" width="200" v-permission="['productEdit', 'productDelete']">
               <template #default="scope">
@@ -145,6 +154,7 @@ import { post, get, uploadFile } from "@/utils/request";
 import { useRouter, useRoute } from "vue-router";
 import { GenerateForm } from '@zmjs/form-design';
 import DeteleTables from "./deteleTables.vue";
+import personnelSearch from '@/components/translationComponent/personnelSearch/personnelSearch.vue';
 
 const router = useRouter()
 const globalPopup = inject<GlobalPopup>('globalPopup')

+ 10 - 2
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/tasks/index.vue

@@ -63,7 +63,7 @@
             <el-table-column type="selection" width="55" />
             <el-table-column prop="taskName" label="任务名称" header-align="center" align="center" show-overflow-tooltip
               width="200" />
-            <el-table-column prop="priority" label="优先级" width="90" :sortable="true" header-align="center"
+            <el-table-column prop="priority" label="优先级" width="100" :sortable="true" header-align="center"
               align="center">
               <template #default="scope">
                 {{ PRIORITY.find(item => item.value == scope.row.priority)?.label }}
@@ -76,7 +76,15 @@
                 </el-text>
               </template>
             </el-table-column>
-            <el-table-column prop="executorNames" label="执行人" width="120" header-align="center" align="center" />
+            <el-table-column prop="executorNames" label="执行人" width="120" header-align="center" align="center">
+              <template #default="scope">
+                <template v-for="(item, index) in (scope.row.taskExecutors || [])">
+                    <TextTranslation translationTypes="userName" :translationValue="item">
+                    </TextTranslation>
+                    <span v-if="index < (scope.row.taskExecutors || []).length - 1">,</span>
+                </template>
+              </template>
+            </el-table-column>
             <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"

+ 26 - 11
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/team/index.vue

@@ -61,7 +61,7 @@
               <template #default="{ node, data }">
                 <div class="flex justify-between treeContent">
                   <div class="custom-tree-node" @mouseleave="mouseleave(data,$event)" @mouseover="mouseover(data,$event)">
-                    <div class="treeLabel">{{ node.label }}</div>
+                    <div class="treeLabel"><TextTranslation translationTypes="departmentName" :translationValue="node.label"></TextTranslation></div>
                     <div class="treeIcon nodeEle" id="treeIcon" v-if="data.id > 0">
                       <el-link type="primary" :icon="CirclePlus" :underline="false" @click.stop="dialogFromCli('addDeptDialogVisible', data, true)"></el-link>
                       <el-link type="primary" :icon="Delete" :underline="false" style="margin-left: 6px;" @click.stop="deteleDept(data)"></el-link>
@@ -77,12 +77,20 @@
         <div class="bg-white w-full h-full shadow-md rounded-md flex flex-col overflow-hidden pt-2 pl-2 pr-2">
           <div class="flex-1">
             <el-table ref="multipleTableRef" :data="tableData" v-loading="loadingFrom.tableLoading"
-              @selection-change="changeBatch" style="width: 100%;height: 100%;">
+              @selection-change="changeBatch" style="width: 100%;height: calc(100vh - 204px);">
               <el-table-column type="selection" width="55" />
-              <el-table-column label="姓名" property="name" width="150"></el-table-column>
+              <el-table-column label="姓名" property="name" width="150">
+                <template #default="scope">
+                  <TextTranslation translationTypes="userName" :translationValue="scope.row.name"></TextTranslation>
+                </template>
+              </el-table-column>
               <el-table-column label="手机" property="phone"></el-table-column>
               <el-table-column label="工号" property="jobNumber"></el-table-column>
-              <el-table-column label="部门" property="departmentName"></el-table-column>
+              <el-table-column label="部门" property="departmentName">
+                <template #default="scope">
+                  <TextTranslation translationTypes="departmentName" :translationValue="scope.row.departmentName"></TextTranslation>
+                </template>
+              </el-table-column>
               <el-table-column label="角色" property="roleName"></el-table-column>
               <el-table-column label="创建时间" property="createTime"></el-table-column>
               <el-table-column label="操作" width="200" fixed="right">
@@ -147,14 +155,16 @@
             <el-input v-model="deptForm.name" placeholder="请输入部门名称" clearable />
           </el-form-item>
           <el-form-item label="主要负责人">
-            <el-select v-model="deptForm.managerId" placeholder="请选择" style="width: 100%" clearable>
+            <!-- <el-select v-model="deptForm.managerId" placeholder="请选择" style="width: 100%" clearable>
               <el-option v-for="item in userList" :key="item.id" :label="item.name" :value="item.id" />
-            </el-select>
+            </el-select> -->
+            <personnel-search v-model="deptForm.managerId" :size="''" placeholder="请选择"></personnel-search>
           </el-form-item>
           <el-form-item label="其他负责人">
-            <el-select v-model="deptForm.otherManagerIds" placeholder="请选择" style="width: 100%" multiple clearable>
+            <!-- <el-select v-model="deptForm.otherManagerIds" placeholder="请选择" style="width: 100%" multiple clearable>
               <el-option v-for="item in userList" :key="item.id" :label="item.name" :value="item.id" />
-            </el-select>
+            </el-select> -->
+            <personnel-search v-model="deptForm.otherManagerIds" :size="''" multiple placeholder="请选择"></personnel-search>
           </el-form-item>
         </el-form>
       </div>
@@ -253,6 +263,8 @@ import { GET_DATA_LIST, DETELE_DEPT, MOD, GET_USERINFO, GET_ROUTELIST, DEACTIVEU
 import { post, uploadFile } from "@/utils/request";
 import { getFromValue, updateDepTreeData, resetFromValue, confirmAction, downloadFile } from '@/utils/tools'
 
+import personnelSearch from '@/components/translationComponent/personnelSearch/personnelSearch.vue';
+
 // 导入页面
 import AddPersonnelModal from './module/AddPersonnelModal.vue'
 import BatchOperation from './module/BatchOperation.vue'
@@ -429,10 +441,11 @@ function addPersone(item: any) {
     return
   }
   post(GET_USERINFO, { userId: item.id }).then(res => {
-    const { id, name, phone, jobNumber, roleId, departmentCascade, inductionDate } = res.data
+    const { id, name, phone, jobNumber, roleId, departmentCascade, departmentId, inductionDate } = res.data
     let newData = {
-      id, name, phone, jobNumber, roleId, departmentId:
-        departmentCascade && departmentCascade.split(',').map(Number).reverse(),
+      id, name, phone, jobNumber, roleId, 
+      // departmentId: departmentCascade && departmentCascade.split(',').map(Number).reverse(),
+      departmentId: departmentId,
       inductionDate
     }
     personnelFromData.value = newData
@@ -458,6 +471,8 @@ async function personnelModalConfirm(data: any, modelType: string) {
 function createDepartment(formEl: FormInstance | undefined) {
   if (!formEl) return
   let data = getFromValue(deptForm)
+  console.log(data, '<==== 对应的数据')
+  return
   loadingFrom.deptDialogVisibleLoading = true
   post(GET_ADDDEPT, { ...deptForm, otherManagerIds: data.otherManagerIds && data.otherManagerIds.join(',') }).then(res => {
     if (res.code != 'ok') {

+ 23 - 10
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/team/module/AddPersonnelModal.vue

@@ -1,5 +1,6 @@
 <template>
-    <el-dialog v-model="data.addPersonnelDialogVisible" :title="'添加人员'" :show-close="false" width="600" :before-close="handleClose">
+    <el-dialog v-model="data.addPersonnelDialogVisible" :title="'添加人员'" :show-close="false" width="600"
+        :before-close="handleClose">
         <template #header="{ close, titleId, titleClass }">
             <div class="flex justify-between items-center border-b pb-3 dialog-header">
                 <h4 :id="titleId">添加/编辑人员</h4>
@@ -15,7 +16,12 @@
             <el-form ref="personnelRuleFormRef" style="max-width: 500px" :model="personnelFrom" :rules="personnelRules"
                 label-width="120px" size="large" status-icon>
                 <el-form-item label="姓名" prop="name">
-                    <el-input v-model="personnelFrom.name" placeholder="请输入姓名" clearable />
+                    <el-input v-if="userInfo.userNameNeedTranslate == 0" v-model="personnelFrom.name"
+                        placeholder="请输入姓名" clearable />
+                    <div v-if="userInfo.userNameNeedTranslate == 1">
+                        <TextTranslation translationTypes="userName" :translationValue="personnelFrom.name">
+                        </TextTranslation>
+                    </div>
                 </el-form-item>
                 <el-form-item label="电话">
                     <el-input v-model="personnelFrom.phone" placeholder="请输入电话" clearable />
@@ -24,26 +30,33 @@
                     <el-input v-model="personnelFrom.jobNumber" placeholder="请输入工号" clearable />
                 </el-form-item>
                 <el-form-item label="部门">
-                    <el-cascader v-model="personnelFrom.departmentId" :options="data.deptList" placeholder="请选择部门" :props="{ checkStrictly: true }" clearable style="width: 100%" />
+                    <!-- <el-cascader v-model="personnelFrom.departmentId" :options="data.deptList" placeholder="请选择部门" :props="{ checkStrictly: true }" clearable style="width: 100%" /> -->
+                    <tree-select v-model="personnelFrom.departmentId" :size="''" checkStrictly placeholder="请选择部门" :key="personnelFrom.departmentId"></tree-select>
                 </el-form-item>
                 <el-form-item label="角色">
                     <el-select v-model="personnelFrom.roleId" placeholder="请选择角色" size="large">
-                        <el-option v-for="item in data.roleList" :key="item.id" :label="item.rolename" :value="item.id" />
+                        <el-option v-for="item in data.roleList" :key="item.id" :label="item.rolename"
+                            :value="item.id" />
                     </el-select>
                 </el-form-item>
                 <el-form-item label="入职时间">
-                    <el-date-picker v-model="personnelFrom.inductionDate" type="date" placeholder="选择入职时间" value-format="YYYY-MM-DD" style="width: 100%" />
+                    <el-date-picker v-model="personnelFrom.inductionDate" type="date" placeholder="选择入职时间"
+                        value-format="YYYY-MM-DD" style="width: 100%" />
                 </el-form-item>
             </el-form>
-        </div> 
+        </div>
     </el-dialog>
 </template>
 <script setup lang="ts">
 import { ref, watch, reactive } from 'vue'
 import { FormRules, FormInstance } from 'element-plus'
 import { getFromValue, resetFromValue } from '@/utils/tools'
+import { storeToRefs } from 'pinia';
+import { useStore } from '@/store/index'
+import treeSelect from '@/components/translationComponent/treeSelect/treeSelect.vue'
 
 const emit = defineEmits(['closeModal', 'personnelModalConfirm']);
+const { userInfo } = storeToRefs(useStore());
 // 定义类型
 interface Props {
     data: {
@@ -60,7 +73,8 @@ interface personnelFromType { // 类型定义
     phone: string | number,
     jobNumber: string,
     roleId: string | number,
-    departmentId: string[] | number[],
+    // departmentId: string[] | number[],
+    departmentId: string | number,
     inductionDate: string,
 }
 const data = ref<Props['data']>({
@@ -76,7 +90,7 @@ const personnelFrom = ref<personnelFromType>({ // 填写的内容
     phone: '',
     jobNumber: '',
     roleId: '',
-    departmentId: [],
+    departmentId: '',
     inductionDate: '',
 });
 
@@ -92,8 +106,7 @@ const personnelRules = reactive<FormRules<typeof personnelFrom>>({ // 部门表
 function addPersonel(formEl: FormInstance | undefined) {
     if (!formEl) return
     let dataForm = getFromValue(personnelFrom.value)
-    const { departmentId } = dataForm
-    emit('personnelModalConfirm', { ...dataForm, departmentId: departmentId && departmentId[departmentId.length - 1]  }, 'addPersonnelDialogVisible')
+    emit('personnelModalConfirm', { ...dataForm }, 'addPersonnelDialogVisible')
 }
 
 // 监听 Props 的变化

+ 7 - 3
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/thread/detail/components/attachment.vue

@@ -13,9 +13,13 @@
         </div>
         <div class="flex-1 overflow-auto pt-3">
             <el-table :data="attachmenttable" border style="width: 100%;height: 100%;">
-                <el-table-column prop="name" label="附件名称" width="200" />
+                <el-table-column prop="name" label="附件名称" />
                 <el-table-column prop="size" label="附件大小" width="120" />
-                <el-table-column prop="userName" label="上传人" width="120" />
+                <el-table-column prop="userName" label="上传人" width="120">
+                    <template #default="scope">
+                        <TextTranslation translationTypes="userName" :translationValue="scope.row.userName"></TextTranslation>
+                    </template>
+                </el-table-column>
                 <el-table-column prop="createTime" label="上传时间" width="180" />
                 <el-table-column label="操作" width="180" fixed="right">
                     <template #default="scope">
@@ -144,7 +148,7 @@ onMounted(() => {
 .attachment {
     .title {
         font-size: 18px;
-        color: #000
+        color: #606266
     }
 }
 </style>

+ 12 - 7
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/thread/detail/components/information.vue

@@ -52,14 +52,17 @@
             </div>
             <div class="formItem flex pt-3 pb-1">
                 <div class="w-20 text-right text-gray-500">负责人:</div>
-                <div class="flex-1 overflow-hidden text-ellipsis whitespace-nowrap ml-1" v-ellipsis-tooltip>{{
-                    information.inchargerName }}
+                <div class="flex-1 overflow-hidden text-ellipsis whitespace-nowrap ml-1" v-ellipsis-tooltip>
+                    <TextTranslation translationTypes="userName" :translationValue="information.inchargerName"></TextTranslation>
+                    <!-- {{ information.inchargerName }} -->
                 </div>
             </div>
             <div class="formItem flex pt-3 pb-1">
                 <div class="w-20 text-right text-gray-500">创建人:</div>
-                <div class="flex-1 overflow-hidden text-ellipsis whitespace-nowrap ml-1" v-ellipsis-tooltip>{{
-                    information.createName }}</div>
+                <div class="flex-1 overflow-hidden text-ellipsis whitespace-nowrap ml-1" v-ellipsis-tooltip>
+                    <TextTranslation translationTypes="userName" :translationValue="information.createName"></TextTranslation>
+                    <!-- {{ information.createName }} -->
+                </div>
             </div>
             <div class="formItem flex pt-3 pb-1">
                 <div class="w-20 text-right text-gray-500">创建时间:</div>
@@ -107,9 +110,10 @@
             <div class="scroll-bar m-6">
                 <div class="flex mb-4">
                     <div class="w-20 flex items-center justify-end pr-4">转移至:</div>
-                    <el-select v-model="transferValue" placeholder="请选择" class="flex1">
+                    <!-- <el-select v-model="transferValue" placeholder="请选择" class="flex1">
                         <el-option v-for="item in transferOptions" :key="item.id" :label="item.name" :value="item.id" />
-                    </el-select>
+                    </el-select> -->
+                    <personnel-search v-model="transferValue" :size="''" placeholder="请选择"></personnel-search>
                 </div>
                 <div class="pl-3 text-[#e94a4a]">转移后,将看不到此线索</div>
             </div>
@@ -148,6 +152,7 @@ import { all } from 'axios';
 import { formatDateTime } from '@/utils/times';
 import { UPDATEINSET } from '@/pages/business/api';
 import { GETTABLELIST } from '@/pages/product/api';
+import personnelSearch from '@/components/translationComponent/personnelSearch/personnelSearch.vue';
 
 interface personnelInterface {
     id: string | number,
@@ -369,7 +374,7 @@ onMounted(async () => {
 .information {
     .title {
         font-size: 18px;
-        color: #000
+        color: #606266
     }
 
     .form {

+ 9 - 4
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/thread/detail/components/operationRecord.vue

@@ -5,8 +5,13 @@
         </div>
         <div class="flex-1 overflow-auto pt-5">
             <el-table :data="operationRecordtable" border style="width: 100%;height: 100%;">
-                <el-table-column prop="creatTime" label="操作时间" width="150" />
-                <el-table-column prop="userName" label="操作人" width="120" />
+                <el-table-column prop="creatTime" label="操作时间" width="180" />
+                <el-table-column prop="userName" label="操作人" width="120">
+                    <template #default="scope">
+                        <TextTranslation translationTypes="userName" :translationValue="scope.row.userName">
+                        </TextTranslation>
+                    </template>
+                </el-table-column>
                 <el-table-column prop="name" label="操作内容" />
             </el-table>
         </div>
@@ -29,13 +34,13 @@ watchEffect(() => {
     operationRecordtable.value = props.data
 });
 // 生命周期钩子
-onMounted(() => {});
+onMounted(() => { });
 </script>
 <style scoped lang="scss">
 .operationRecord {
     .title {
         font-size: 18px;
-        color: #000
+        color: #606266
     }
 }
 </style>

+ 1 - 1
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/thread/detail/components/relatedTasks.vue

@@ -112,7 +112,7 @@ onMounted(() => {
 .relatedTasks {
     .title {
         font-size: 18px;
-        color: #000
+        color: #606266
     }
 }
 </style>

+ 10 - 2
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/thread/deteleTables.vue

@@ -22,8 +22,16 @@
                     <el-table-column prop="email" label="邮箱" width="180"></el-table-column>
                     <el-table-column prop="customerIndustryValue" label="客户行业" width="180"></el-table-column>
                     <el-table-column prop="customerLevelValue" label="客户级别" width="180"></el-table-column>
-                    <el-table-column prop="inchargerName" label="负责人" width="190"></el-table-column>
-                    <el-table-column prop="createName" label="创建人" width="180"></el-table-column>
+                    <el-table-column prop="inchargerName" label="负责人" width="190">
+                        <template #default="scope">
+                            <TextTranslation translationTypes="userName" :translationValue="scope.row.inchargerName"></TextTranslation>
+                        </template>
+                    </el-table-column>
+                    <el-table-column prop="createName" label="创建人" width="180">
+                        <template #default="scope">
+                            <TextTranslation translationTypes="userName" :translationValue="scope.row.createName"></TextTranslation>
+                        </template>
+                    </el-table-column>
                     <el-table-column prop="createTime" label="创建时间" width="180"></el-table-column>
                     <el-table-column label="操作" fixed="right" width="120">
                         <template #default="scope">

+ 18 - 6
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/thread/index.vue

@@ -29,9 +29,10 @@
               </el-select>
             </el-form-item>
             <el-form-item label="负责人">
-              <el-select v-model="filterCriteriaForm.inchargerId" placeholder="请选择" filterable clearable>
+              <!-- <el-select v-model="filterCriteriaForm.inchargerId" placeholder="请选择" filterable clearable>
                 <el-option v-for="item in fixedData.Personnel" :key="item.id" :label="item.name" :value="item.id" />
-              </el-select>
+              </el-select> -->
+              <personnel-search v-model="filterCriteriaForm.inchargerId" :size="''" placeholder="请选择"></personnel-search>
             </el-form-item>
             <el-form-item label="创建时间">
               <el-date-picker v-model="filterCriteriaForm.startTime" type="date" placeholder="请选择" :clearable="false"
@@ -73,8 +74,16 @@
             <el-table-column prop="email" label="邮箱" width="180"></el-table-column>
             <el-table-column prop="customerIndustryValue" label="客户行业" width="180"></el-table-column>
             <el-table-column prop="customerLevelValue" label="客户级别" width="180" sortable="custom"></el-table-column>
-            <el-table-column prop="inchargerName" label="负责人" width="190"></el-table-column>
-            <el-table-column prop="createName" label="创建人" width="180"></el-table-column>
+            <el-table-column prop="inchargerName" label="负责人" width="190">
+              <template #default="scope">
+                <TextTranslation translationTypes="userName" :translationValue="scope.row.inchargerName"></TextTranslation>
+              </template>
+            </el-table-column>
+            <el-table-column prop="createName" label="创建人" width="180">
+              <template #default="scope">
+                <TextTranslation translationTypes="userName" :translationValue="scope.row.createName"></TextTranslation>
+              </template>
+            </el-table-column>
             <el-table-column prop="createTime" label="创建时间" width="180"></el-table-column>
             <el-table-column label="操作" fixed="right" width="200" v-permission="['threadEdit', 'tasksAdd', 'threadDelete']">
               <template #default="scope">
@@ -127,9 +136,10 @@
       <div class="scroll-bar m-6">
         <div class="flex mb-4">
           <div class="w-20 flex items-center justify-end pr-4">转移至:</div>
-          <el-select v-model="transferForm.transferValue" placeholder="请选择" class="flex1">
+          <!-- <el-select v-model="transferForm.transferValue" placeholder="请选择" class="flex1">
             <el-option v-for="item in fixedData.Personnel" :key="item.id" :label="item.name" :value="item.id" />
-          </el-select>
+          </el-select> -->
+          <personnel-search v-model="transferForm.transferValue" :size="''" placeholder="请选择"></personnel-search>
         </div>
         <div class="pl-3 text-[#e94a4a]">转移后,将看不到此线索</div>
       </div>
@@ -178,6 +188,8 @@ import DeteleTables from "./deteleTables.vue";
 import { createTask } from "@/components/TaskModal/taskFunction";
 import { tableShowOverflowTooltip } from '@/utils/globalVariables'
 
+import personnelSearch from '@/components/translationComponent/personnelSearch/personnelSearch.vue';
+
 // 定义类型
 interface fixedDataInterface {
   id: string | number,

+ 2 - 1
fhKeeper/formulahousekeeper/customerBuler-crm/src/store/Store.d.ts

@@ -2,7 +2,8 @@ type SotreState = {
   userInfo: any;
   routers: RouteRecordRaw[];
   asyncRoutesMark: boolean;
-  personnelList: any[]
+  personnelList: any[];
+  departmentList: any[];
 };
 type SoreGetters = {
   getRoutersList: () => RouteRecordRaw[];

+ 2 - 0
fhKeeper/formulahousekeeper/customerBuler-crm/src/store/index.ts

@@ -11,6 +11,7 @@ export const useStore = defineStore<
     routers: [], // 返回的所有路由
     asyncRoutesMark: false, // 是否添加过路由
     personnelList: [], // 人员列表
+    departmentList: [], // 部门列表
   }),
   getters: {
     getRoutersList() {
@@ -50,6 +51,7 @@ export const useStore = defineStore<
       this.userInfo = {};
       this.routers = [];
       this.personnelList = [];
+      this.departmentList = [];
       this.asyncRoutesMark = false;
     },
   },

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

@@ -1,7 +1,7 @@
 $darkBlue: #3475c5;
 $ashen: #fefefe;
 $backColor: #eef3f6;
-$black: #000;
+$black: #606266;
 $fontBlack: #333;
 $fontGray: #999;
 $modena: #6f4afe;

+ 31 - 0
fhKeeper/formulahousekeeper/customerBuler-crm/src/utils/translationProcessing.ts

@@ -0,0 +1,31 @@
+declare var WWOpenData: any; // wx 小程序对象
+/**
+ * echarts 转译处理
+ * @param items 需要转译的数据源
+ * @param allData 源数据
+ */
+export function dealWithTranslation(items: { type: 'userName' | 'departmentName', id: number | string }[], allData: any[]) {
+  if (WWOpenData.initCanvas) {
+    WWOpenData.initCanvas();
+  }
+  const myFunOne = async () => {
+    const result: any = await new Promise((resolve, reject) => {
+      if (WWOpenData.prefetch) {
+        WWOpenData.prefetch({ items }, (err: any, data: any) => {
+          if (err) {
+            return reject(err);
+          }
+          resolve(data);
+        });
+      }
+    });
+    for (var i in allData) {
+      if (result.items[i]) {
+        allData[i].name = result.items[i].data;
+      }
+    }
+    return allData
+  };
+
+  myFunOne();
+}

+ 5 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/DepartmentController.java

@@ -56,6 +56,11 @@ public class DepartmentController {
         return departmentService.listAllMemb(request,keyword,cursor);
     }
 
+    @RequestMapping("/listAllMembNew")
+    public HttpRespMsg listAllMembNew(HttpServletRequest request,String keyword,String cursor) throws Exception {
+        return departmentService.listAllMembNew(request,keyword,cursor);
+    }
+
     //获取我可以管辖到的人员列表,进行代填时选择的人员列表用到
     @RequestMapping("/listMyMembs")
     public HttpRespMsg listMyMembs(HttpServletRequest request) {

+ 39 - 7
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/TaskController.java

@@ -14,6 +14,7 @@ import com.management.platform.entity.dto.TaskDto;
 import com.management.platform.entity.vo.SysRichFunction;
 import com.management.platform.mapper.*;
 import com.management.platform.service.*;
+import com.management.platform.service.impl.WxCorpInfoServiceImpl;
 import com.management.platform.util.DateTimeUtil;
 import com.management.platform.util.HttpRespMsg;
 import com.management.platform.util.MessageUtils;
@@ -62,6 +63,12 @@ public class TaskController {
     private InformationService informationService;
     @Resource
     private TaskInformationService taskInformationService;
+    @Resource
+    WxCorpInfoMapper wxCorpInfoMapper;
+    @Resource
+    WxCorpInfoService wxCorpInfoService;
+    @Resource
+    UserMapper userMapper;
 
 
 
@@ -163,7 +170,7 @@ public class TaskController {
                 if (task.getRepeatType()!=null&&task.getRepeatType()==0){
                     //获取任务重复结束 重复永不结束   1:勾选
                     if (task.getRepeatEndNever()!=null&&task.getRepeatEndNever()==1){
-                        saveInformationList(executorIdList,task);
+                        saveInformationListAndSendMsg(executorIdList,task);
                     }else if (task.getRepeatEndCount()!=null&&task.getRepeatEndCount()>0){
                         TaskInformation taskInformation = selectTaskInformation(task);
                         int between = task.getRepeatEndCount();
@@ -183,7 +190,7 @@ public class TaskController {
                     //每周一才执行
                     if (LocalDateTime.now().getDayOfWeek().getValue()==1){
                         if (task.getRepeatEndNever()!=null&&task.getRepeatEndNever()==1){
-                            saveInformationList(executorIdList,task);
+                            saveInformationListAndSendMsg(executorIdList,task);
                         }else if (task.getRepeatEndCount()!=null&&task.getRepeatEndCount()>0){
                             TaskInformation taskInformation = selectTaskInformation(task);
                             int between = task.getRepeatEndCount();
@@ -207,7 +214,7 @@ public class TaskController {
                     //每月一号才执行
                     if (LocalDateTime.now().getDayOfMonth()==1){
                         if (task.getRepeatEndNever()!=null&&task.getRepeatEndNever()==1){
-                            saveInformationList(executorIdList,task);
+                            saveInformationListAndSendMsg(executorIdList,task);
                         }else if (task.getRepeatEndCount()!=null&&task.getRepeatEndCount()>0){
                             TaskInformation taskInformation = selectTaskInformation(task);
                             int between = task.getRepeatEndCount();
@@ -232,7 +239,7 @@ public class TaskController {
                     int num = (int) ChronoUnit.DAYS.between(LocalDateTime.now(), task.getCreateDate());
                     if (num%task.getRepeatDesignSameday()==0){
                         if (task.getRepeatEndNever()!=null&&task.getRepeatEndNever()==1){
-                            saveInformationList(executorIdList,task);
+                            saveInformationListAndSendMsg(executorIdList,task);
                         }else if (task.getRepeatEndCount()!=null&&task.getRepeatEndCount()>0){
                             TaskInformation taskInformation = selectTaskInformation(task);
                             int between = task.getRepeatEndCount();
@@ -255,7 +262,7 @@ public class TaskController {
                     //获取任务重复结束 重复永不结束   1:勾选
                     int num = (int) ChronoUnit.DAYS.between(LocalDateTime.now(), task.getCreateDate());
                     if (task.getRepeatDesignDay().contains(num+"")){
-                        saveInformationList(executorIdList,task);
+                        saveInformationListAndSendMsg(executorIdList,task);
                     }else {
                         continue;
                     }
@@ -276,14 +283,14 @@ public class TaskController {
             taskInformationNew.setTaskId(task.getId())
                     .setCompanyId(task.getCompanyId()).setCount(between -1);
             taskInformationService.save(taskInformationNew);
-            saveInformationList(executorIdList,task);
+            saveInformationListAndSendMsg(executorIdList,task);
         }else {
             Integer count = taskInformation.getCount();
             if (count>0){
                 count -= 1;
                 UpdateWrapper<TaskInformation> updateWrapper = new UpdateWrapper<TaskInformation>().set("count", count).eq("id", taskInformation.getId());
                 taskInformationService.update(updateWrapper);
-                saveInformationList(executorIdList,task);
+                saveInformationListAndSendMsg(executorIdList,task);
             }
         }
     }
@@ -307,5 +314,30 @@ public class TaskController {
         }
     }
 
+    private void saveInformationListAndSendMsg(List<String> executorIdList,Task task) {
+        if (!executorIdList.isEmpty()){
+            ArrayList<Information> informationArrayList = new ArrayList<>();
+            String msg="你有新的任务:"+task.getTaskName();
+            if (task.getStatus()!=null&&task.getStatus()==1){
+                msg="你有任务:"+task.getTaskName()+"执行中";
+            } else if (task.getStatus() != null && task.getStatus() == 3) {
+                msg="你有任务:"+task.getTaskName()+"已逾期";
+            }
+            for (String userId : executorIdList) {
+                Information information = new Information();
+                information.setUserId(userId).setMsg(msg)
+                        .setTime(new Date()).setChecked(0);
+                informationArrayList.add(information);
+                User user = userMapper.selectById(userId);
+                WxCorpInfo corpinfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", user.getCompanyId()));
+                if (corpinfo!=null&&corpinfo.getSaasSyncContact()==1) {
+                    wxCorpInfoService.sendWXCorpMsg(corpinfo, user.getCorpwxUserid(), msg, null, WxCorpInfoServiceImpl.TEXT_CARD_MSG_TASK);
+                    log.info("给{}发送信息:{}",user.getCorpwxUserid(),msg);
+                }
+            }
+            informationService.saveBatch(informationArrayList);
+        }
+    }
+
 }
 

Datei-Diff unterdrückt, da er zu groß ist
+ 11 - 82
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/WeiXinCorpController.java


+ 8 - 6
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/Task.java

@@ -3,6 +3,8 @@ package com.management.platform.entity;
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.extension.activerecord.Model;
 import com.baomidou.mybatisplus.annotation.TableId;
+
+import java.time.LocalDate;
 import java.time.LocalDateTime;
 import com.baomidou.mybatisplus.annotation.TableField;
 import java.io.Serializable;
@@ -179,18 +181,18 @@ public class Task extends Model<Task> {
     /**
      * 截止时间
      */
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
     @TableField("end_date")
-    private LocalDateTime endDate;
+    private LocalDate endDate;
 
     /**
      * 开始日期
      */
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
     @TableField("start_date")
-    private LocalDateTime startDate;
+    private LocalDate startDate;
 
     /**
      * 完成日期

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

@@ -65,4 +65,6 @@ public interface UserMapper extends BaseMapper<User> {
     List<UserVO> getCustomerTransferRate(String startDate, String endDate, String userId, Integer companyId);
 
     List<Map<String, Object>> getSimpleActiveUserList(@Param("map") HashMap<String, Object> map);
+
+    List<Map<String, Object>> selectListSimple(@Param("users")List users);
 }

+ 2 - 0
fhKeeper/formulahousekeeper/management-crm/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);
+
+    HttpRespMsg listAllMembNew(HttpServletRequest request, String keyword, String cursor) throws Exception;
 }

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

@@ -1636,6 +1636,95 @@ public class DepartmentServiceImpl extends ServiceImpl<DepartmentMapper, Departm
         return msg;
     }
 
+    @Override
+    public HttpRespMsg listAllMembNew(HttpServletRequest request, String keyword, String cursor) throws Exception {
+        Integer companyId = userMapper.selectById(request.getHeader("TOKEN")).getCompanyId();
+        HttpRespMsg msg = new HttpRespMsg();
+        List<HashMap> userMapList = new ArrayList<>();
+        //通讯录查询人员
+        WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", companyId));
+        if (StringUtils.isNotBlank(keyword) && wxCorpInfo!=null && wxCorpInfo.getSaasSyncContact()==1){
+            HashMap<String, List> result = wxCorpInfoService.getOpenId(wxCorpInfo.getCorpid(), keyword, cursor,0,20);
+            List users = result.get("user");
+            List depts = result.get("dept");
+            if (users.size()!=0){
+                List<User> realUser = userMapper.selectList(new QueryWrapper<User>().in("corpwx_userid", users));
+                if (realUser.size()!=0){
+                    List<DepartmentVO> listById = new ArrayList<>();
+                    for (User item : realUser) {
+                        HttpRespMsg departmentListById = getDepartmentListById(item);
+                        listById = (List<DepartmentVO>) departmentListById.data;
+                        if (listById.size()==0){
+                            //加上未分配的部门
+                            DepartmentVO unAssignedDeptById = new DepartmentVO();
+                            unAssignedDeptById.setId(0);
+                            //unAssignedDept.setLabel("未分配");
+                            unAssignedDeptById.setLabel(MessageUtils.message("department.noDistribution"));
+                            listById.add(unAssignedDeptById);
+                        }
+                        //封装员工信息
+                        HashMap<String, Object> user = new HashMap<String, Object>();
+                        user.put("id", item.getId());
+                        user.put("name", item.getName());
+                        user.put("departmentId", item.getDepartmentId());
+                        userMapList.add(user);
+                        fillDeptUser(listById, userMapList);
+                    }
+//                    HashMap<String, Object> data = new HashMap<>();
+//                    data.put("data",listById);
+//                    data.put("nextCursor","");
+                    msg.data = listById;
+                    return msg;
+                }
+            }
+            if (depts.size()!=0){
+                List<Department> departmentList = departmentMapper.selectList(new QueryWrapper<Department>().in("corpwx_deptid", depts).eq("company_id",companyId));
+                List<Department> allDepartmentList = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id",companyId));
+                List<User> userList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", companyId).eq("is_active",1));
+                List<DepartmentOtherManager> departmentOtherManagerList = departmentOtherManagerMapper.selectList(new QueryWrapper<DepartmentOtherManager>().eq("company_id", companyId));
+                //结果列表
+                List<DepartmentVO> list = new ArrayList<>();
+                List<Department> rootDepartments = departmentList.stream().filter(dept -> dept.getSuperiorId() == null).collect(Collectors.toList());
+                rootDepartments.forEach(root->{
+                    DepartmentVO rootDeptVO = formatDepartmentToVO(root, departmentOtherManagerList);
+                    list.add(rootDeptVO);
+                    fillSubDepartmentList(allDepartmentList, rootDeptVO, departmentOtherManagerList);
+                });
+                //处理部门下人员列表
+                List<DepartmentVO> userListWithDept = getUserListWithDept(userList, list);
+//                HashMap<String, Object> data = new HashMap<>();
+//                data.put("data",userListWithDept);
+//                data.put("nextCursor","");
+                msg.data = userListWithDept;
+                return msg;
+            }
+            ArrayList<Object> emptyList = new ArrayList<>();
+            msg.data = emptyList;
+            return msg;
+        }else {
+            HttpRespMsg departmentList = departmentService.getDepartmentList(request);
+            List<DepartmentVO> list = (List<DepartmentVO>) departmentList.data;
+            //加上未分配的部门
+            DepartmentVO unAssignedDept = new DepartmentVO();
+            unAssignedDept.setId(0);
+            //unAssignedDept.setLabel("未分配");
+            unAssignedDept.setLabel(MessageUtils.message("department.noDistribution"));
+            list.add(unAssignedDept);
+            //获取公司全部人员
+            List<User> userList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", companyId).eq("is_active", 1));
+            for (User u : userList) {
+                HashMap<String, Object> user = new HashMap<String, Object>();
+                user.put("id", u.getId());
+                user.put("name", u.getName());
+                user.put("departmentId", u.getDepartmentId());
+                userMapList.add(user);
+            }
+            fillDeptUser(list, userMapList);
+            msg.data = list;
+            return msg;
+        }
+    }
+
     /**
      * 递归对返回的部门数据进行排序
      * @param list

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

@@ -94,28 +94,19 @@ public class ExcelExportServiceImpl implements ExcelExportService {
                 }
                 System.out.println("i=="+i+", "+LocalDateTime.now());
                 CorpwxJobResult corpwxJobResult = corpwxJobCenter.get(jobId);
-                if (corpwxJobResult != null) {
-                    if (corpwxJobResult.getErrCode() == 0) {
-                        syncTranslationResult = wxCorpInfoService.getSyncTranslationResult(jobId);
-                        corpwxJobCenter.remove(jobId);
-                    } else {
-                        long t2 = System.currentTimeMillis();
-                        System.out.println("222企业微信转译报错:"+corpwxJobResult.getErrMsg()+",耗时:" + (t2 - t) + "ms");
-                        httpRespMsg.setError(corpwxJobResult.getErrMsg());
-                        return httpRespMsg;
-                    }
-                    break;
+
+
+                syncTranslationResult = wxCorpInfoService.getSyncTranslationResult(jobId);
+                if (syncTranslationResult != null && !syncTranslationResult.equals("")) {
+                    long t2 = System.currentTimeMillis();
+                    System.out.println("企业微信转译文件后地址是:"+syncTranslationResult+",耗时:" + (t2 - t) + "ms");
+                    httpRespMsg.data = syncTranslationResult;
+                    return httpRespMsg;
                 }
                 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"));
-            }
+            httpRespMsg.setError(MessageUtils.message("request.outTime"));
         }else {
             httpRespMsg.data = resp;
         }
@@ -158,7 +149,7 @@ public class ExcelExportServiceImpl implements ExcelExportService {
                 }
                 i++;
             }
-            if (syncTranslationResult != null) {
+            if (syncTranslationResult != null && !syncTranslationResult.equals("")) {
                 httpRespMsg.data = syncTranslationResult;
             } else {
                 //httpRespMsg.setError("处理超时...");
@@ -206,7 +197,7 @@ public class ExcelExportServiceImpl implements ExcelExportService {
                 }
                 i++;
             }
-            if (syncTranslationResult != null) {
+            if (syncTranslationResult != null && !syncTranslationResult.equals("")) {
                 httpRespMsg.data = syncTranslationResult;
             } else {
                 //httpRespMsg.setError("处理超时...");
@@ -255,7 +246,7 @@ public class ExcelExportServiceImpl implements ExcelExportService {
                 }
                 i++;
             }
-            if (syncTranslationResult != null) {
+            if (syncTranslationResult != null && !syncTranslationResult.equals("")) {
                 httpRespMsg.data = syncTranslationResult;
             } else {
                 //httpRespMsg.setError("处理超时...");
@@ -302,7 +293,7 @@ public class ExcelExportServiceImpl implements ExcelExportService {
                 }
                 i++;
             }
-            if (syncTranslationResult != null) {
+            if (syncTranslationResult != null && !syncTranslationResult.equals("")) {
                 httpRespMsg.data = syncTranslationResult;
             } else {
                 //httpRespMsg.setError("处理超时...");

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

@@ -111,6 +111,8 @@ public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements Ta
     @Resource
     private InformationService informationService;
 
+    @Resource
+    private WxCorpInfoMapper wxCorpInfoMapper;
 
 
     @Override
@@ -124,7 +126,7 @@ public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements Ta
             httpRespMsg.setError("无法获取创建人信息!");
             return httpRespMsg;
         }
-
+        WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", user.getCompanyId()));
         if (StringUtils.isEmpty(taskDto.getTaskName())||taskDto.getPriority()==null){
             httpRespMsg.setError("缺少任务名称或任务优先级!");
             return httpRespMsg;
@@ -133,11 +135,11 @@ public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements Ta
         BeanUtils.copyProperties(taskDto,task);
         task.setCreateDate(LocalDateTime.now());//任务的创建时间
         //根据任务的开始时间与当下时间判断任务的状态
-        if (taskDto.getStartDate()!=null&&taskDto.getStartDate().isAfter(LocalDateTime.now())){
+        if (taskDto.getStartDate()!=null&&taskDto.getStartDate().isAfter(LocalDate.now())){
             task.setStatus(0);
-        }else if (taskDto.getEndDate()!=null&&taskDto.getEndDate().isBefore(LocalDateTime.now())){
+        }else if (taskDto.getEndDate()!=null&&taskDto.getEndDate().isBefore(LocalDate.now())){
             task.setStatus(3);
-        } else if (taskDto.getStartDate()!=null&&taskDto.getStartDate().isBefore(LocalDateTime.now())&&taskDto.getEndDate()!=null&&taskDto.getEndDate().isAfter(LocalDateTime.now()))
+        } else if (taskDto.getStartDate()!=null&&taskDto.getStartDate().isBefore(LocalDate.now())&&taskDto.getEndDate()!=null&&taskDto.getEndDate().isAfter(LocalDate.now()))
         {
             task.setStatus(1);
         }
@@ -174,6 +176,9 @@ public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements Ta
             information.setTime(new Date()).setChecked(0).setMsg("你有新的任务");
             informationArrayList.add(information);
             informationService.saveBatch(informationArrayList);
+            if (wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                wxCorpInfoService.sendWXCorpMsg(wxCorpInfo,user.getCorpwxUserid(),"你有新的任务",null, WxCorpInfoServiceImpl.TEXT_CARD_MSG_TASK);
+            }
         }
 
         //添加任务编译记录
@@ -286,11 +291,11 @@ public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements Ta
             msg.setError("请保证时间段的顺序性");
             return msg;
         }
-        if (taskDto.getStartDate()!=null&&taskDto.getStartDate().isAfter(LocalDateTime.now())){
+        if (taskDto.getStartDate()!=null&&taskDto.getStartDate().isAfter(LocalDate.now())){
             task.setStatus(0);
-        }else if (taskDto.getEndDate()!=null&&taskDto.getEndDate().isBefore(LocalDateTime.now())){
+        }else if (taskDto.getEndDate()!=null&&taskDto.getEndDate().isBefore(LocalDate.now())){
             task.setStatus(3);
-        } else if (taskDto.getStartDate()!=null&&taskDto.getStartDate().isBefore(LocalDateTime.now())&&taskDto.getEndDate()!=null&&taskDto.getEndDate().isAfter(LocalDateTime.now()))
+        } else if (taskDto.getStartDate()!=null&&taskDto.getStartDate().isBefore(LocalDate.now())&&taskDto.getEndDate()!=null&&taskDto.getEndDate().isAfter(LocalDate.now()))
         {
             task.setStatus(1);
         }
@@ -590,7 +595,7 @@ public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements Ta
                                     // Excel中的日期序列号的基准日期是1900年1月1日
                                     LocalDate baseDate = LocalDate.of(1900, 1, 1);
                                     LocalDate date = baseDate.plusDays(count - 2); // Excel的基准日期是1900年1月0日,所以需要减去2天
-                                    task.setStartDate(date.atStartOfDay());
+                                    task.setStartDate(date);
 
                                 } catch (Exception e) {
                                     System.out.println("日期时间格式不正确,应该是yyyy/MM/dd" );
@@ -608,7 +613,7 @@ public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements Ta
                                     // Excel中的日期序列号的基准日期是1900年1月1日
                                     LocalDate baseDate = LocalDate.of(1900, 1, 1);
                                     LocalDate date = baseDate.plusDays(count - 2); // Excel的基准日期是1900年1月0日,所以需要减去2天
-                                    task.setEndDate(date.atStartOfDay());
+                                    task.setEndDate(date);
 
                                 } catch (Exception e) {
                                     System.out.println("日期时间格式不正确,应该是yyyy/MM/dd" );
@@ -810,11 +815,11 @@ public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements Ta
                         msg.setError("任务:"+task.getTaskName()+"中客户/商机/销售订单不应一同存在");
                         return msg;
                     }
-                    if (task.getStartDate()!=null&&task.getStartDate().isAfter(LocalDateTime.now())){
+                    if (task.getStartDate()!=null&&task.getStartDate().isAfter(LocalDate.now())){
                         task.setStatus(0);
-                    }else if (task.getEndDate()!=null&&task.getEndDate().isBefore(LocalDateTime.now())){
+                    }else if (task.getEndDate()!=null&&task.getEndDate().isBefore(LocalDate.now())){
                         task.setStatus(3);
-                    } else if (task.getStartDate()!=null&&task.getStartDate().isBefore(LocalDateTime.now())&&task.getEndDate()!=null&&task.getEndDate().isAfter(LocalDateTime.now()))
+                    } else if (task.getStartDate()!=null&&task.getStartDate().isBefore(LocalDate.now())&&task.getEndDate()!=null&&task.getEndDate().isAfter(LocalDate.now()))
                     {
                         task.setStatus(1);
                     }
@@ -1013,18 +1018,18 @@ public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements Ta
                 }
                 else if(model.equals("startDate")){
                     if (tasKVo.getStartDate()!=null){
-                        LocalDateTime startDate = tasKVo.getStartDate();
+                        LocalDate startDate = tasKVo.getStartDate();
                         // 定义日期时间格式
-                        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+                        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
                         // 格式化为字符串
                         value= startDate.format(formatter);
                     }
                 }
                 else if(model.equals("endDate")){
                     if (tasKVo.getEndDate()!=null){
-                        LocalDateTime endDate = tasKVo.getEndDate();
+                        LocalDate endDate = tasKVo.getEndDate();
                         // 定义日期时间格式
-                        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+                        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
                         // 格式化为字符串
                         value= endDate.format(formatter);
                     }
@@ -1165,18 +1170,18 @@ public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements Ta
                 }
                 else if(model.equals("startDate")){
                     if (tasKVo.getStartDate()!=null){
-                        LocalDateTime startDate = tasKVo.getStartDate();
+                        LocalDate startDate = tasKVo.getStartDate();
                         // 定义日期时间格式
-                        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+                        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
                         // 格式化为字符串
                         value= startDate.format(formatter);
                     }
                 }
                 else if(model.equals("endDate")){
                     if (tasKVo.getEndDate()!=null){
-                        LocalDateTime endDate = tasKVo.getEndDate();
+                        LocalDate endDate = tasKVo.getEndDate();
                         // 定义日期时间格式
-                        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+                        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
                         // 格式化为字符串
                         value= endDate.format(formatter);
                     }

Datei-Diff unterdrückt, da er zu groß ist
+ 10 - 9
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/UserServiceImpl.java


+ 8 - 3
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/WxCorpInfoServiceImpl.java

@@ -87,6 +87,7 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
 
     public static final int TEXT_CARD_MSG_EXPENSE_AGREE = 21;//费用报销审核通过
     public static final int TEXT_CARD_MSG_EXPENSE_DENY = 22;//费用报销审核驳回
+    public static final int TEXT_CARD_MSG_TASK = 23;//费用报销审核驳回
 
     private static Object userLock = new Object();
 
@@ -244,9 +245,11 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
         System.out.println(resp);
         JSONObject json = JSONObject.parseObject(resp);
         if(json.getIntValue("errcode")==0){
-            JSONObject result = (JSONObject) json.get("result");
-            JSONObject contact_id_translate = (JSONObject) result.get("contact_id_translate");
-            resultUrl = contact_id_translate.getString("url");
+            if (json.getIntValue("status")==3){
+                JSONObject result = (JSONObject) json.get("result");
+                JSONObject contact_id_translate = (JSONObject) result.get("contact_id_translate");
+                resultUrl = contact_id_translate.getString("url");
+            }
         }else {
             throw new Exception(json.toJSONString());
         }
@@ -284,6 +287,8 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
                     title = "日报驳回";
                 } else if (msgType.equals(TEXT_CARD_MSG_REPORT_AGREE)) {
                     title = "日报审核通过";
+                } else if (msgType.equals(TEXT_CARD_MSG_TASK)) {
+                    title = "客户管家:任务信息提醒";
                 }
             } else {
                 jumpUrl = jumpUrl.replace("STATE", pageRouter);

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

@@ -353,6 +353,17 @@
                 </if>
             </where>
     </select>
+    <select id="selectListSimple" resultType="java.util.Map">
+        select id as value, name as label,job_number as jobNumber from user u
+        <where>
+            <if test="users !=null">
+                and u.corpwx_userid in
+                <foreach collection="users" item="item" open="(" close=")" separator=",">
+                    #{item}
+                </foreach>
+            </if>
+        </where>
+    </select>
 
     <update id="updateActiveByIds">
         update user set is_active=1 WHERE id IN

+ 18 - 15
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/DingDingServiceImpl.java

@@ -2758,24 +2758,27 @@ public class DingDingServiceImpl implements DingDingService {
             String endTime = null;
             String realPlanStartTime = null;
             String realPlanEndTime = null;
-            for (int i=0;i<array.size(); i++) {
-                JSONObject obj = array.getJSONObject(i);
-                //出差类型
-                System.out.println(obj);
-                if (obj.getInteger("approve_biz_type") == 2) {
-                    if (obj.getString("check_type").equals("OnDuty")) {
-                        //出差开始时间
-                        System.out.println("出差开始时间=="+obj.getString("check_date_time"));
-                        startTime = obj.getString("check_date_time");
-                        realPlanStartTime = obj.getString("real_plan_time");
-                    } else {
-                        //出差结束时间
-                        System.out.println("出差结束时间=="+obj.getString("check_date_time"));
-                        endTime = obj.getString("check_date_time");
-                        realPlanEndTime = obj.getString("real_plan_time");
+            if (array != null) {
+                for (int i=0;i<array.size(); i++) {
+                    JSONObject obj = array.getJSONObject(i);
+                    //出差类型
+                    System.out.println(obj);
+                    if (obj.getInteger("approve_biz_type") == 2) {
+                        if (obj.getString("check_type").equals("OnDuty")) {
+                            //出差开始时间
+                            System.out.println("出差开始时间=="+obj.getString("check_date_time"));
+                            startTime = obj.getString("check_date_time");
+                            realPlanStartTime = obj.getString("real_plan_time");
+                        } else {
+                            //出差结束时间
+                            System.out.println("出差结束时间=="+obj.getString("check_date_time"));
+                            endTime = obj.getString("check_date_time");
+                            realPlanEndTime = obj.getString("real_plan_time");
+                        }
                     }
                 }
             }
+
             if (startTime != null && endTime != null) {
                 //获取到出差的时间,计算时长
                 DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

+ 21 - 2
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/task/TimingTask.java

@@ -1564,11 +1564,23 @@ public class TimingTask {
                         return;
                     }
                     if (alertDay.equals(localDate.getDayOfMonth())) {
-                        //获取上个月的开始和节数日期
+                        //获取上个月的开始和结束日期
                         LocalDate startDate = localDate.minusMonths(1).with(TemporalAdjusters.firstDayOfMonth());
                         LocalDate endDate = localDate.minusMonths(1).with(TemporalAdjusters.lastDayOfMonth());
                         userList = reportService.getNotFullReportUserList(company.getId(), startDate, endDate);
                     }
+                } else if (t.getAlertType() == 5) {
+                    //3--每月固定日期提醒本月的
+                    Integer alertDay = t.getAlertDay();
+                    if (alertDay == null) {
+                        return;
+                    }
+                    if (alertDay.equals(localDate.getDayOfMonth())) {
+                        //获取本月的开始和结束日期
+                        LocalDate startDate = localDate.with(TemporalAdjusters.firstDayOfMonth());
+                        LocalDate endDate = localDate.with(TemporalAdjusters.lastDayOfMonth());
+                        userList = reportService.getNotFullReportUserList(company.getId(), startDate, endDate);
+                    }
                 } else if (t.getAlertType() == 4) {
                     //4--每周提醒上周漏填
                     LocalDate lastSunday = localDate.with(DayOfWeek.SUNDAY).minusWeeks(1);
@@ -1632,6 +1644,13 @@ public class TimingTask {
                                 } else {
                                     jsonObj.put("value", "您上个月有"+u.get("daysTxt")+"共"+(Integer)u.get("days")+"天未填写工时报告,请尽快填写");
                                 }
+                            } else if (t.getAlertType() == 5) {
+                                //每月提醒本月
+                                if ((Integer)u.get("days") > 3) {
+                                    jsonObj.put("value", "您本月有"+u.get("daysTxt")+"...共"+(Integer)u.get("days")+"天未填写工时报告,请尽快填写");
+                                } else {
+                                    jsonObj.put("value", "您本月有"+u.get("daysTxt")+"共"+(Integer)u.get("days")+"天未填写工时报告,请尽快填写");
+                                }
                             } else {
                                 if (finalLastWeekNotFill) {
                                     String text = null;
@@ -1654,7 +1673,7 @@ public class TimingTask {
                                 json.put("content_item",dataJson);
                             }
                             if (cpList.size() > 0) {
-                                System.out.println("发送企业微信漏填提醒:" + LocalDateTime.now().toString() + ", corpUid=" + corpUid + ", json=" + json.toJSONString());
+//                                System.out.println("发送企业微信漏填提醒:" + LocalDateTime.now().toString() + ", corpUid=" + corpUid + ", json=" + json.toJSONString());
                                 wxCorpInfoService.sendWXCorpTemplateMsg(cpList.get(0), corpUid, json);
                             }
                         } else if (u.get("wxOpenid") != null) {

+ 1 - 0
fhKeeper/formulahousekeeper/plugIn/form-design-master/playground/src/components.d.ts

@@ -25,6 +25,7 @@ declare module 'vue' {
     ElRate: typeof import('element-plus/es')['ElRate']
     ElRow: typeof import('element-plus/es')['ElRow']
     ElSelect: typeof import('element-plus/es')['ElSelect']
+    ElSelectV2: typeof import('element-plus/es')['ElSelectV2']
     ElSlider: typeof import('element-plus/es')['ElSlider']
     ElSpace: typeof import('element-plus/es')['ElSpace']
     ElSwitch: typeof import('element-plus/es')['ElSwitch']

+ 13 - 0
fhKeeper/formulahousekeeper/plugIn/form-design-master/playground/vite.config.ts

@@ -3,4 +3,17 @@ import Vue from '@vitejs/plugin-vue'
 
 export default defineConfig({
   plugins: [Vue()],
+  server: {
+    host: '0.0.0.0',
+    port: 19100,
+    open: true,
+    proxy: {
+      '/api': {
+        // 这里的'/api'表示需要转发到的接口路径前缀
+        target: 'http://127.0.0.1:10010', // 将请求转发到的目标地址
+        changeOrigin: true, // 支持跨域
+        rewrite: (path) => path.replace(/^\/api/, '') // 去除请求路径中的'/api'前缀
+      }
+    }
+  },
 })

Datei-Diff unterdrückt, da er zu groß ist
+ 2934 - 2376
fhKeeper/formulahousekeeper/plugIn/form-design-master/pnpm-lock.yaml


+ 2 - 0
fhKeeper/formulahousekeeper/plugIn/form-design-master/src/components.d.ts

@@ -30,8 +30,10 @@ declare module 'vue' {
     ElSwitch: typeof import('element-plus/es')['ElSwitch']
     ElTable: typeof import('element-plus/es')['ElTable']
     ElTableColumn: typeof import('element-plus/es')['ElTableColumn']
+    ElTag: typeof import('element-plus/es')['ElTag']
     ElTimePicker: typeof import('element-plus/es')['ElTimePicker']
     ElUpload: typeof import('element-plus/es')['ElUpload']
+    PersonnelSearch: typeof import('./components/personnelSearch.vue')['default']
   }
 }
 

+ 328 - 0
fhKeeper/formulahousekeeper/plugIn/form-design-master/src/components/personnelSearch.vue

@@ -0,0 +1,328 @@
+<script lang="ts" setup>
+// import { ref, reactive, onMounted, inject, watchEffect, watch, computed } from 'vue';
+
+const props = defineProps({
+  modelValue: { type: null, required: true },
+  multiple: { type: Boolean, required: false, default: false },
+  size: { type: String as () => '' | 'large' | 'default' | 'small', required: true, default: () => '' },
+  placeholder: { type: String, required: false, default: () => '请选择' },
+  disabled: { type: Boolean, required: false, default: false },
+  options: { type: Array as () => optionsType, required: false, default: () => [] },
+  clearable: { type: Boolean, required: false, default: true },
+  width: { type: String, required: false, default: () => '100%' },
+  url: { type: String, required: false, default: () => '' },
+});
+
+type optionsType = {
+  label: string,
+  value: string | number,
+  jobNumber?: string,
+}[]
+
+interface Emits {
+  (event: "change", value: any): void;
+  /**
+   * 双向绑定事件
+   * @param value 对应数据
+   */
+  (event: "update:modelValue", value: any): void;
+}
+
+const emit = defineEmits<Emits>();
+const personnelArray = ref<optionsType>([]);
+const { userInfo = {}, personnelList = [] } = JSON.parse(sessionStorage.getItem('storeInfo') || '{}')
+const textSize = ref({
+  'small': { height: '20px', fontSize: '12px' },
+  'default': { height: '28px', fontSize: '14px' },
+  '': { height: '28px', fontSize: '14px' },
+  'large': { height: '36px', fontSize: '14px' },
+})
+
+const selectLoading = ref(false);
+const controlTranslation = reactive({
+  visibleFlag: false // 下拉框出现隐藏
+})
+
+const selectedValue = ref(props.modelValue); // 响应式绑定 v-model 的值
+
+watch(() => props.modelValue, (newValue, _oldValue) => {
+  if(newValue != selectedValue.value) {
+    selectedValue.value = newValue
+  }
+});
+
+const getSelectedLabel = computed(() => {
+  if (!props.multiple) {
+    const item = getPersonnelListItems(selectedValue.value || props.modelValue);
+    return item ? item.label : props.placeholder
+  }
+
+  if (props.multiple) {
+    if (Array.isArray(selectedValue.value)) {
+      if (selectedValue.value.length <= 0) {
+        return props.placeholder
+      }
+      const item = getPersonnelListItems(selectedValue.value || props.modelValue);
+      return item ? item.label : props.placeholder
+    } else {
+      return props.placeholder
+    }
+  }
+
+  return props.placeholder
+})
+
+function tagClose(_evt: MouseEvent) {
+  if (Array.isArray(selectedValue.value)) {
+    selectedValue.value.shift()
+    updateValue(selectedValue.value)
+  }
+}
+function getPersonnelListItems(val: any) {
+  let value = val;
+  if (Array.isArray(val) && val.length > 0) {
+    value = val[0]
+  }
+  return personnelList.find((item: any) => item.value == value)
+}
+
+function getUserList(keyword: string = '') {
+  newPost(props.url, keyword).then(res => {
+    personnelArray.value = (res || [])
+  }).finally(() => {
+    selectLoading.value = false
+  })
+}
+
+function newPost(url: string, keyword: string): Promise<any> {
+  return new Promise((resolve, reject) => {
+    const token: any = sessionStorage.getItem('token');
+    
+    if (!token) {
+      reject(new Error("Token is missing"));
+      return;
+    }
+
+    const body = new URLSearchParams();
+    body.append('keyword', keyword);
+    
+    fetch(url, {
+      method: "POST",  // 确保请求方法正确,如果是其他方法需要修改
+      headers: {
+        "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
+        "Token": token
+      },
+      body: body.toString()
+    })
+      .then(resp => {
+        if (!resp.ok) {
+          reject(new Error(`Error: ${resp.statusText}`));
+        }
+        return resp.json();
+      })
+      .then((json) => {
+        const res = json.data;
+        if (Array.isArray(res)) {
+          const personnelArray = res.map(data => ({
+            label: data['label'],
+            value: data['value'],
+          }));
+          resolve(personnelArray);
+        } else {
+          reject(new Error("Invalid data format"));
+        }
+      })
+      .catch((error) => {
+        reject(error);
+      });
+  });
+}
+
+function visibleChange(visible: boolean) { // 下拉框出现/隐藏时触发
+  if(visible) {
+    personnelArray.value = personnelList
+  }
+  controlTranslation.visibleFlag = visible
+}
+
+const filterMethod = debounce(filterMethods, 500)
+function filterMethods(val: string) {
+  if (val == '') {
+    personnelArray.value = personnelList
+    selectLoading.value = false
+    return personnelArray.value
+  }
+  selectLoading.value = true
+  getUserList(val)
+}
+
+function updateValue(val: any) { // 值改变的时候触发
+  emit('update:modelValue', selectedValue.value)
+  emit('change', val)
+}
+
+function debounce(func: Function, delay: number) {
+  let timer: any;
+
+  return (...args: any[]) => {
+    if (timer) {
+      clearTimeout(timer);
+    }
+
+    timer = setTimeout(() => {
+      func(...args);
+    }, delay);
+  };
+}
+
+onMounted(() => {
+  if (personnelList.length == 0) {
+    getUserList()
+  } else {
+    personnelArray.value = personnelList
+  }
+})
+</script>
+
+<template>
+  <!-- <el-select-v2 v-model="selectedValue" :multiple="multiple" :size="size"
+    :loading="selectLoading" :placeholder="placeholder" :disabled="disabled" :clearable="clearable" filterable collapse-tags :options="(personnelArray || [])"
+    :style="`width: ${width}`" :class="`custom-select-v2-reset ${!controlTranslation.visibleFlag ? 'setUpInputReset' : ''}`"
+     @change="updateValue"
+    @visible-change="visibleChange" :filter-method="filterMethod">
+    <template #prefix v-if="!multiple">
+      <div class="selectV2SingleChoiceReset">
+        <div v-if="!controlTranslation.visibleFlag" class="selectSingleChoice" :style="`line-height: ${textSize[size].height};font-size:${textSize[size].fontSize}`">
+          <template v-if="getSelectedLabel == placeholder">
+            <span style="color: #A8ABB2">{{ placeholder }}</span> 
+          </template>
+          <template v-else>
+            <span style="color: #606266;">
+              {{ getSelectedLabel }}
+            </span>
+          </template>
+        </div>
+      </div>
+    </template>
+    <template #prefix v-if="multiple">
+      <div class="selectV2SingleChoiceTwoReset">
+        <div class="selectSingleChoice" :style="`line-height: ${textSize[size].height};font-size:${textSize[size].fontSize}`">
+          <template v-if="getSelectedLabel == placeholder">
+            <span style="color: #A8ABB2">{{ placeholder }}</span> 
+          </template>
+          <template v-else>
+            <el-tag type="info" :size="size" closable @close="tagClose" style="margin-right: 5px;">
+              {{ getSelectedLabel }}
+            </el-tag>
+            <el-tag type="info" :size="size" v-if="selectedValue.length > 1">+{{ selectedValue.length }}</el-tag>
+          </template>
+        </div>
+      </div>
+    </template>
+    <template #default="{ item }">
+      <div class="flex items-center">
+        {{ item.label }}
+      </div>
+    </template>
+  </el-select-v2> -->
+
+  <el-select v-model="selectedValue" :multiple="multiple" :size="size"
+    :loading="selectLoading" :placeholder="placeholder" :disabled="disabled" :clearable="clearable" filterable collapse-tags
+    :style="`width: ${width}`" :class="`custom-select-v2-reset ${!controlTranslation.visibleFlag ? 'setUpInputReset' : ''}`"
+     @change="updateValue"
+    @visible-change="visibleChange" :filter-method="filterMethod">
+    <template #prefix v-if="!multiple">
+      <div class="selectV2SingleChoiceReset">
+        <div v-if="!controlTranslation.visibleFlag" class="selectSingleChoice" :style="`line-height: ${textSize[size].height};font-size:${textSize[size].fontSize}`">
+          <template v-if="getSelectedLabel == placeholder">
+            <span style="color: #A8ABB2">{{ placeholder }}</span> 
+          </template>
+          <template v-else>
+            <span style="color: #606266;">
+              <!-- {{ getSelectedLabel }} -->
+              <ww-open-data type='userName' :openid='getSelectedLabel'></ww-open-data>
+            </span>
+          </template>
+        </div>
+      </div>
+    </template>
+    <template #prefix v-if="multiple">
+      <div class="selectV2SingleChoiceTwoReset">
+        <div class="selectSingleChoice" :style="`line-height: ${textSize[size].height};font-size:${textSize[size].fontSize}`">
+          <template v-if="getSelectedLabel == placeholder">
+            <span style="color: #A8ABB2">{{ placeholder }}</span> 
+          </template>
+          <template v-else>
+            <el-tag type="info" :size="size" closable @close="tagClose" style="margin-right: 5px;">
+              <!-- {{ getSelectedLabel }} -->
+              <ww-open-data type='userName' :openid='getSelectedLabel'></ww-open-data>
+            </el-tag>
+            <el-tag type="info" :size="size" v-if="selectedValue.length > 1">+{{ selectedValue.length }}</el-tag>
+          </template>
+        </div>
+      </div>
+    </template>
+    <el-option
+      v-for="item in (personnelArray || [])"
+      :key="item.value"
+      :label="item.label"
+      :value="item.value"
+    >
+      <span style="float: left">
+        <ww-open-data type='userName' :openid='item.label'></ww-open-data>
+        <!-- {{ item.label }} -->
+      </span>
+    </el-option>
+  </el-select>
+</template>
+reset
+<style lang="scss">
+.custom-select-v2-reset {
+  position: relative;
+  .selectV2SingleChoiceReset, .selectV2SingleChoiceTwoReset {
+    position: absolute;
+    display: flex;
+    align-items: center;
+    transform: translate(0,-50%);
+    .selectSingleChoice {
+      background: #fff;
+    }
+  }
+  .el-select-v2__placeholder {
+    display: none !important;
+  }
+  .el-select-v2__selected-item {
+    .el-tag {
+      display: none !important;
+    }
+  }
+
+  .selectV2SingleChoiceReset {
+    top: 50%;
+    left: 14px;
+  }
+
+  .selectV2SingleChoiceTwoReset {
+    position: relative;
+    transform: translate(0);
+  }
+
+  .el-input__inner::placeholder {
+    color: transparent !important;
+  }
+
+  .el-select__tags {
+    .el-tag {
+      display: none !important;
+    }
+  }
+
+  .el-select-tags-wrapper {
+    width: 110px !important;
+  }
+}
+
+.setUpInputReset .el-input__inner {
+  color: #fff !important;
+}
+</style>

+ 1 - 1
fhKeeper/formulahousekeeper/plugIn/form-design-master/src/config/index.ts

@@ -16,7 +16,7 @@ export interface WidgetForm {
     size: '' | 'default' | 'small' | 'large'
     hideRequiredAsterisk: boolean
     labelWidth: number
-    labelPosition: string
+    labelPosition: 'top' | 'right' | 'left' 
   }
 }
 

+ 1 - 0
fhKeeper/formulahousekeeper/plugIn/form-design-master/src/design/WidgetForm.vue

@@ -24,6 +24,7 @@
           :element="element"
           :index="index"
           :list="list"
+          :configurationItems="config"
         />
       </template>
     </Draggable>

+ 40 - 17
fhKeeper/formulahousekeeper/plugIn/form-design-master/src/design/WidgetFormItem.vue

@@ -1,17 +1,22 @@
 <script lang="ts" setup>
 import Draggable from 'vuedraggable'
 import { cloneWidget } from '@/components/ComponentGroup.vue'
+import personnelSearch from '@/components/personnelSearch.vue';
+import type { WidgetForm } from '@/config'
 
-const { element, index, list, ...props } = defineProps<{
+const { element, index, list, ...props  } = defineProps<{
   list: any
   element: any
   index: number
   selectWidget: any
+  configurationItems: WidgetForm['config']
 }>()
 defineEmits(['itemClick', 'delete', 'update:selectWidget'])
 
 let selectWidget = $(useVModel(props, 'selectWidget'))
 
+const { userInfo = {} } = JSON.parse(sessionStorage.getItem('storeInfo') || '{}')
+
 const handleCopyClick = () => {
   list.splice(index + 1, 0, cloneWidget(list[index]))
   selectWidget = list[index + 1]
@@ -50,6 +55,7 @@ const handleDeleteClick = () => {
             :element="colElement"
             :list="col.list"
             :index="colIndex"
+            :configurationItems="configurationItems"
           />
         </template>
       </Draggable>
@@ -234,22 +240,39 @@ const handleDeleteClick = () => {
       </template>
 
       <template v-if="element.type === 'select'">
-        <el-select
-          :model-value="element.options.defaultValue"
-          :multiple="element.options.multiple"
-          :placeholder="element.options.placeholder"
-          :clearable="element.options.clearable"
-          :filterable="element.options.filterable"
-          :disabled="element.options.disabled"
-          :style="{ width: element.options.width }"
-        >
-          <el-option
-            v-for="item of element.options.options"
-            :key="item.value"
-            :value="item.value"
-            :label="element.options.showLabel ? item.label : item.value"
-          />
-        </el-select>
+        <template v-if="userInfo.userNameNeedTranslate == 1 && element.options.remoteFunc.indexOf('getSimpleActiveUserListNew') > -1">
+          <personnelSearch 
+            :model-value="element.options.defaultValue" 
+            :multiple="element.options.multiple"
+            :placeholder="element.options.placeholder"
+            :clearable="element.options.clearable"
+            :filterable="element.options.filterable"
+            :disabled="element.options.disabled"
+            :url="element.options.remoteFunc"
+            :size="configurationItems.size"
+            :options="[]"
+            :style="{ width: element.options.width }"
+          >
+          </personnelSearch>
+        </template>
+        <template v-else>
+          <el-select
+            :model-value="element.options.defaultValue"
+            :multiple="element.options.multiple"
+            :placeholder="element.options.placeholder"
+            :clearable="element.options.clearable"
+            :filterable="element.options.filterable"
+            :disabled="element.options.disabled"
+            :style="{ width: element.options.width }"
+          >
+            <el-option
+              v-for="item of element.options.options"
+              :key="item.value"
+              :value="item.value"
+              :label="element.options.showLabel ? item.label : item.value"
+            />
+          </el-select>
+        </template>
       </template>
 
       <template v-if="element.type === 'switch'">

+ 39 - 19
fhKeeper/formulahousekeeper/plugIn/form-design-master/src/generate/GenerateFormItem.vue

@@ -230,25 +230,43 @@
     </template>
 
     <template v-if="element.type === 'select'">
-      <el-select
-        v-model="data"
-        :multiple="element.options.multiple"
-        :placeholder="element.options.placeholder"
-        :clearable="element.options.clearable"
-        :filterable="element.options.filterable"
-        :disabled="disabled || element.options.disabled"
-        :style="{ width: element.options.width }"
-        @change="(value: any) => specializedHandleSelect(value, element)"
-      >
-        <el-option
-          v-for="item of element.options.remote
-            ? element.options.remoteOptions
-            : element.options.options"
-          :key="item.value"
-          :value="item.value"
-          :label="element.options.showLabel ? item.label : item.value"
-        />
-      </el-select>
+      <template v-if="userInfo.userNameNeedTranslate == 1 && element.options.remoteFunc.indexOf('getSimpleActiveUserListNew') > -1">
+        <personnelSearch 
+          v-model="data" 
+          :multiple="element.options.multiple"
+          :placeholder="element.options.placeholder"
+          :clearable="element.options.clearable"
+          :filterable="element.options.filterable"
+          :disabled="disabled || element.options.disabled"
+          :url="element.options.remoteFunc"
+          :size="config.size"
+          :options="[]"
+          :style="{ width: element.options.width }"
+          @change="(value: any) => specializedHandleSelect(value, element)"
+        >
+        </personnelSearch>
+      </template>
+      <template v-else>
+        <el-select
+          v-model="data"
+          :multiple="element.options.multiple"
+          :placeholder="element.options.placeholder"
+          :clearable="element.options.clearable"
+          :filterable="element.options.filterable"
+          :disabled="disabled || element.options.disabled"
+          :style="{ width: element.options.width }"
+          @change="(value: any) => specializedHandleSelect(value, element)"
+        >
+          <el-option
+            v-for="item of element.options.remote
+              ? element.options.remoteOptions
+              : element.options.options"
+            :key="item.value"
+            :value="item.value"
+            :label="element.options.showLabel ? item.label : item.value"
+          />
+        </el-select>
+      </template>
     </template>
 
     <template v-if="element.type === 'switch'">
@@ -341,7 +359,9 @@
 <script lang="ts" setup>
 import type { WidgetForm } from '@/config'
 import zhCn from "element-plus/es/locale/lang/zh-cn";
+import personnelSearch from '@/components/personnelSearch.vue';
 
+const { userInfo = {} } = JSON.parse(sessionStorage.getItem('storeInfo') || '{}')
 const props = defineProps<{
   config: WidgetForm['config']
   element: any

+ 9 - 15
fhKeeper/formulahousekeeper/plugIn/form-design-master/update/README.md

@@ -28,26 +28,16 @@ $ pnpm install @zmjs/form-design
 ```shell
 $ yarn add @zmjs/form-design
 ```
-### 示例
-
-**npm 引入**
-
-```javascript
-import { createApp } from 'vue'
-import App from './App.vue'
-import {DesignForm} from '@zmjs/form-design'
-
-createApp(App)
-  .use(DesignForm)
-  .mount('#app')
-```
-## 2 组件说明
 
 ### 表单设计器(DesignForm)
 
 #### 示例
 
 ```html
+<script setup lang="ts">
+import { DesignForm } from '@zmjs/form-design'
+</script>
+
 <template>
   <DesignForm ref="designForm" />
 </template>
@@ -82,6 +72,10 @@ createApp(App)
 #### 示例
 
 ```html
+<script setup lang="ts">
+import { GenerateForm } from '@zmjs/form-design'
+</script>
+
 <template>
   <GenerateForm ref="generateForm" />
 </template>
@@ -120,4 +114,4 @@ createApp(App)
 
 填写服务器上传地址、参数名等配置信息。
 
-![](https://ftp.bmp.ovh/imgs/2021/04/91624bc0a32bad63.png)
+![](https://ftp.bmp.ovh/imgs/2021/04/91624bc0a32bad63.png)

+ 120 - 0
fhKeeper/formulahousekeeper/plugIn/form-design-master/update/dist/components/personnelSearch.vue.d.ts

@@ -0,0 +1,120 @@
+declare const _default: import("vue").DefineComponent<{
+    modelValue: {
+        type: null;
+        required: true;
+    };
+    multiple: {
+        type: BooleanConstructor;
+        required: false;
+        default: boolean;
+    };
+    size: {
+        type: () => '' | 'large' | 'default' | 'small';
+        required: true;
+        default: () => string;
+    };
+    placeholder: {
+        type: StringConstructor;
+        required: false;
+        default: () => string;
+    };
+    disabled: {
+        type: BooleanConstructor;
+        required: false;
+        default: boolean;
+    };
+    options: {
+        type: () => {
+            label: string;
+            value: string | number;
+            jobNumber?: string | undefined;
+        }[];
+        required: false;
+        default: () => never[];
+    };
+    clearable: {
+        type: BooleanConstructor;
+        required: false;
+        default: boolean;
+    };
+    width: {
+        type: StringConstructor;
+        required: false;
+        default: () => string;
+    };
+    url: {
+        type: StringConstructor;
+        required: false;
+        default: () => string;
+    };
+}, {}, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
+    change: (value: any) => void;
+} & {
+    "update:modelValue": (value: any) => void;
+}, string, import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, Readonly<import("vue").ExtractPropTypes<{
+    modelValue: {
+        type: null;
+        required: true;
+    };
+    multiple: {
+        type: BooleanConstructor;
+        required: false;
+        default: boolean;
+    };
+    size: {
+        type: () => '' | 'large' | 'default' | 'small';
+        required: true;
+        default: () => string;
+    };
+    placeholder: {
+        type: StringConstructor;
+        required: false;
+        default: () => string;
+    };
+    disabled: {
+        type: BooleanConstructor;
+        required: false;
+        default: boolean;
+    };
+    options: {
+        type: () => {
+            label: string;
+            value: string | number;
+            jobNumber?: string | undefined;
+        }[];
+        required: false;
+        default: () => never[];
+    };
+    clearable: {
+        type: BooleanConstructor;
+        required: false;
+        default: boolean;
+    };
+    width: {
+        type: StringConstructor;
+        required: false;
+        default: () => string;
+    };
+    url: {
+        type: StringConstructor;
+        required: false;
+        default: () => string;
+    };
+}>> & {
+    "onUpdate:modelValue"?: ((value: any) => any) | undefined;
+    onChange?: ((value: any) => any) | undefined;
+}, {
+    placeholder: string;
+    multiple: boolean;
+    size: "" | "small" | "default" | "large";
+    disabled: boolean;
+    options: {
+        label: string;
+        value: string | number;
+        jobNumber?: string | undefined;
+    }[];
+    clearable: boolean;
+    width: string;
+    url: string;
+}>;
+export default _default;

+ 1 - 1
fhKeeper/formulahousekeeper/plugIn/form-design-master/update/dist/config/index.d.ts

@@ -15,7 +15,7 @@ export interface WidgetForm {
         size: '' | 'default' | 'small' | 'large';
         hideRequiredAsterisk: boolean;
         labelWidth: number;
-        labelPosition: string;
+        labelPosition: 'top' | 'right' | 'left';
     };
 }
 export declare const getWidgetForm: () => WidgetForm;

+ 2 - 2
fhKeeper/formulahousekeeper/plugIn/form-design-master/update/dist/design/DesignForm.vue.d.ts

@@ -35,7 +35,7 @@ declare const _default: import("vue").DefineComponent<{
             size: "" | "small" | "default" | "large";
             hideRequiredAsterisk: boolean;
             labelWidth: number;
-            labelPosition: string;
+            labelPosition: "top" | "right" | "left";
         };
     };
     setJson: (json: WidgetForm) => void;
@@ -69,9 +69,9 @@ declare const _default: import("vue").DefineComponent<{
         type: FunctionConstructor;
     };
 }>>, {
+    clearable: boolean;
     preview: boolean;
     generateJson: boolean;
-    clearable: boolean;
     basicFieldsList: ("number" | "input" | "select" | "textarea" | "time" | "switch" | "text" | "password" | "radio" | "checkbox" | "date" | "rate" | "slider")[];
     advanceFieldsList: ("img-upload" | "download" | "cascader")[];
     layoutFieldsList: string[];

+ 3 - 0
fhKeeper/formulahousekeeper/plugIn/form-design-master/update/dist/design/WidgetFormItem.vue.d.ts

@@ -1,13 +1,16 @@
+import type { WidgetForm } from '@/config';
 declare const _default: import("vue").DefineComponent<__VLS_TypePropsToRuntimeProps<{
     list: any;
     element: any;
     index: number;
     selectWidget: any;
+    configurationItems: WidgetForm['config'];
 }>, {}, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, ("itemClick" | "delete" | "update:selectWidget")[], "itemClick" | "delete" | "update:selectWidget", import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, Readonly<import("vue").ExtractPropTypes<__VLS_TypePropsToRuntimeProps<{
     list: any;
     element: any;
     index: number;
     selectWidget: any;
+    configurationItems: WidgetForm['config'];
 }>>> & {
     onItemClick?: ((...args: any[]) => any) | undefined;
     onDelete?: ((...args: any[]) => any) | undefined;

Datei-Diff unterdrückt, da er zu groß ist
+ 1 - 1
fhKeeper/formulahousekeeper/plugIn/form-design-master/update/dist/index.css


Datei-Diff unterdrückt, da er zu groß ist
+ 1282 - 843
fhKeeper/formulahousekeeper/plugIn/form-design-master/update/dist/index.es.js


Datei-Diff unterdrückt, da er zu groß ist
+ 1 - 1
fhKeeper/formulahousekeeper/plugIn/form-design-master/update/dist/index.es.js.map


Datei-Diff unterdrückt, da er zu groß ist
+ 9 - 10
fhKeeper/formulahousekeeper/plugIn/form-design-master/update/package.json


+ 1 - 1
fhKeeper/formulahousekeeper/plugIn/form-design-master/vite.config.ts

@@ -98,5 +98,5 @@ export default defineConfig({
         },
       },
     },
-  },
+  }
 })

+ 0 - 0
fhKeeper/formulahousekeeper/timesheet/src/i18n/en.json


Einige Dateien werden nicht angezeigt, da zu viele Dateien in diesem Diff geändert wurden.