Explorar o código

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

zhouyy hai 7 meses
pai
achega
9366db53d2
Modificáronse 32 ficheiros con 627 adicións e 437 borrados
  1. 29 33
      fhKeeper/formulahousekeeper/customerBuler-crm/package-lock.json
  2. 2 0
      fhKeeper/formulahousekeeper/customerBuler-crm/package.json
  3. 0 0
      fhKeeper/formulahousekeeper/customerBuler-crm/src/components/translationComponent/personnelSearch/data.ts
  4. 182 19
      fhKeeper/formulahousekeeper/customerBuler-crm/src/components/translationComponent/personnelSearch/personnelSearch.vue
  5. 0 9
      fhKeeper/formulahousekeeper/customerBuler-crm/src/components/translationComponent/personnelSearch/type.d.ts
  6. 8 4
      fhKeeper/formulahousekeeper/customerBuler-crm/src/components/translationComponent/textTranslation/textTranslation.vue
  7. 10 4
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/analysis/index.vue
  8. 62 0
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/home.vue
  9. 1 0
      fhKeeper/formulahousekeeper/customerBuler-crm/src/store/Store.d.ts
  10. 2 0
      fhKeeper/formulahousekeeper/customerBuler-crm/src/store/index.ts
  11. 1 1
      fhKeeper/formulahousekeeper/customerBuler-crm/src/type.d.ts
  12. 10 2
      fhKeeper/formulahousekeeper/customerBuler-crm/vite.config.ts
  13. 2 2
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/BusinessOpportunityController.java
  14. 1 1
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/ClueController.java
  15. 1 1
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/CustomController.java
  16. 5 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/UserController.java
  17. 56 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/WeiXinCorpController.java
  18. 3 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/mapper/UserMapper.java
  19. 2 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/UserService.java
  20. 3 6
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/ContactsServiceImpl.java
  21. 2 2
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/ProductServiceImpl.java
  22. 1 1
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java
  23. 62 5
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java
  24. 2 2
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/SalesOrderServiceImpl.java
  25. 48 17
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/SysRoleServiceImpl.java
  26. 16 5
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/TaskServiceImpl.java
  27. 66 307
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/UserServiceImpl.java
  28. 20 0
      fhKeeper/formulahousekeeper/management-crm/src/main/resources/mapper/UserMapper.xml
  29. 23 7
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportController.java
  30. 2 4
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/DingDingServiceImpl.java
  31. 4 4
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java
  32. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ReportMapper.xml

+ 29 - 33
fhKeeper/formulahousekeeper/customerBuler-crm/package-lock.json

@@ -12,6 +12,8 @@
         "@zmjs/form-design": "file:../plugIn/form-design-master/update",
         "animate.css": "^4.1.1",
         "axios": "^1.6.7",
+        "browserslist": "^4.24.2",
+        "caniuse-lite": "^1.0.30001680",
         "echarts": "^5.5.0",
         "element-plus": "^2.5.6",
         "pinia": "^2.1.7",
@@ -1270,10 +1272,9 @@
       }
     },
     "node_modules/browserslist": {
-      "version": "4.23.0",
-      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz",
-      "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==",
-      "dev": true,
+      "version": "4.24.2",
+      "resolved": "https://registry.npmmirror.com/browserslist/-/browserslist-4.24.2.tgz",
+      "integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==",
       "funding": [
         {
           "type": "opencollective",
@@ -1289,10 +1290,10 @@
         }
       ],
       "dependencies": {
-        "caniuse-lite": "^1.0.30001587",
-        "electron-to-chromium": "^1.4.668",
-        "node-releases": "^2.0.14",
-        "update-browserslist-db": "^1.0.13"
+        "caniuse-lite": "^1.0.30001669",
+        "electron-to-chromium": "^1.5.41",
+        "node-releases": "^2.0.18",
+        "update-browserslist-db": "^1.1.1"
       },
       "bin": {
         "browserslist": "cli.js"
@@ -1311,10 +1312,9 @@
       }
     },
     "node_modules/caniuse-lite": {
-      "version": "1.0.30001616",
-      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001616.tgz",
-      "integrity": "sha512-RHVYKov7IcdNjVHJFNY/78RdG4oGVjbayxv8u5IO74Wv7Hlq4PnJE6mo/OjFijjVFNy5ijnCt6H3IIo4t+wfEw==",
-      "dev": true,
+      "version": "1.0.30001680",
+      "resolved": "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001680.tgz",
+      "integrity": "sha512-rPQy70G6AGUMnbwS1z6Xg+RkHYPAi18ihs47GH0jcxIG7wArmPgY3XbS2sRdBbxJljp3thdT8BIqv9ccCypiPA==",
       "funding": [
         {
           "type": "opencollective",
@@ -1476,10 +1476,9 @@
       }
     },
     "node_modules/electron-to-chromium": {
-      "version": "1.4.756",
-      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.756.tgz",
-      "integrity": "sha512-RJKZ9+vEBMeiPAvKNWyZjuYyUqMndcP1f335oHqn3BEQbs2NFtVrnK5+6Xg5wSM9TknNNpWghGDUCKGYF+xWXw==",
-      "dev": true
+      "version": "1.5.63",
+      "resolved": "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.5.63.tgz",
+      "integrity": "sha512-ddeXKuY9BHo/mw145axlyWjlJ1UBt4WK3AlvkT7W2AbqfRQoacVoRUCF6wL3uIx/8wT9oLKXzI+rFqHHscByaA=="
     },
     "node_modules/element-plus": {
       "version": "2.7.2",
@@ -1562,10 +1561,9 @@
       }
     },
     "node_modules/escalade": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz",
-      "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==",
-      "dev": true,
+      "version": "3.2.0",
+      "resolved": "https://registry.npmmirror.com/escalade/-/escalade-3.2.0.tgz",
+      "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
       "engines": {
         "node": ">=6"
       }
@@ -2021,10 +2019,9 @@
       "dev": true
     },
     "node_modules/node-releases": {
-      "version": "2.0.14",
-      "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz",
-      "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==",
-      "dev": true
+      "version": "2.0.18",
+      "resolved": "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.18.tgz",
+      "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g=="
     },
     "node_modules/normalize-path": {
       "version": "3.0.0",
@@ -2105,9 +2102,9 @@
       }
     },
     "node_modules/picocolors": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
-      "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="
+      "version": "1.1.1",
+      "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz",
+      "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="
     },
     "node_modules/picomatch": {
       "version": "2.3.1",
@@ -2844,10 +2841,9 @@
       "dev": true
     },
     "node_modules/update-browserslist-db": {
-      "version": "1.0.15",
-      "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.15.tgz",
-      "integrity": "sha512-K9HWH62x3/EalU1U6sjSZiylm9C8tgq2mSvshZpqc7QE69RaA2qjhkW2HlNA0tFpEbtyFz7HTqbSdN4MSwUodA==",
-      "dev": true,
+      "version": "1.1.1",
+      "resolved": "https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz",
+      "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==",
       "funding": [
         {
           "type": "opencollective",
@@ -2863,8 +2859,8 @@
         }
       ],
       "dependencies": {
-        "escalade": "^3.1.2",
-        "picocolors": "^1.0.0"
+        "escalade": "^3.2.0",
+        "picocolors": "^1.1.0"
       },
       "bin": {
         "update-browserslist-db": "cli.js"

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

@@ -15,6 +15,8 @@
     "@zmjs/form-design": "file:../plugIn/form-design-master/update",
     "animate.css": "^4.1.1",
     "axios": "^1.6.7",
+    "browserslist": "^4.24.2",
+    "caniuse-lite": "^1.0.30001680",
     "echarts": "^5.5.0",
     "element-plus": "^2.5.6",
     "pinia": "^2.1.7",

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


+ 182 - 19
fhKeeper/formulahousekeeper/customerBuler-crm/src/components/translationComponent/personnelSearch/personnelSearch.vue

@@ -1,48 +1,211 @@
 <script lang="ts" setup>
 import { ref, reactive, onMounted, inject, watchEffect, computed } from 'vue';
+import { debounce } from 'lodash';
 import { storeToRefs } from 'pinia';
-import { Props, 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<Props>();
+const props = defineProps({
+  modelValue: { type: [String, Number, Array, Object, Boolean], 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: () => [] },
+  width: { type: String, required: false, default: () => '100%' },
+});
 const emit = defineEmits<Emits>();
-const { userInfo } = storeToRefs(useStore());
-const options = ref<optionsType>([]);
+const personnelArray = ref<optionsType>([]);
+const { userInfo, personnelList } = storeToRefs(useStore());
+const { setValue } = useStore()
 
 const timeRef = generateUniqueId()
+const selectLoading = ref(false);
 const controlTranslation = reactive({
-  visibleFlag: false
+  visibleFlag: false // 下拉框出现隐藏
 })
 
 const selectedValue = ref(props.modelValue); // 响应式绑定 v-model 的值
 
-// function getUserList(keyword: string = '', flag: boolean = true) {
-//   post(`/user/getEmployeeList`, {
-//     keyword,
-//     status: 3,
-//     matchingType: 0,
-//   })
-// }
+const getSelectedLabel = computed(() => {
+  if (!props.multiple) {
+    const item = getPersonnelListItems(selectedValue.value);
+    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);
+      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.value.find((item: any) => item.value == value)
+}
+
+function getUserList(keyword: string = '') {
+  post(`/user/getSimpleActiveUserListNew`, { keyword }).then(res => {
+    personnelArray.value = res.data
+    if (!keyword) {
+      setValue((res.data || []), 'personnelList')
+    }
+  }).finally(() => {
+    selectLoading.value = false
+  })
+}
 
 function visibleChange(visible: boolean) { // 下拉框出现/隐藏时触发
-  console.log(visible, '<==== visible')
   controlTranslation.visibleFlag = visible
 }
+
+const filterMethod = debounce(filterMethods, 500)
+function filterMethods(val: string) {
+  if (val == '') {
+    personnelArray.value = personnelList.value
+    selectLoading.value = false
+    return personnelArray.value
+  }
+  getUserList(val)
+}
+
 function updateValue(val: any) { // 值改变的时候触发
   emit('update:modelValue', selectedValue.value)
   emit('change', val)
 }
 
-console.log(props, userInfo, '<==== 看看数据')
+onMounted(() => {
+  if (personnelList.value.length == 0) {
+    getUserList()
+  } else {
+    personnelArray.value = personnelList.value
+  }
+})
 </script>
 
 <template>
-  <!-- <el-select v-model="selectedValue" :ref="`selectRef${timeRef}`" :multiple="multiple ? true : false" :size="size ? size : ''" :placeholder="placeholder ? placeholder : '请输入'"
-    :disabled="disabled ? true : false" clearable collapse-tags @change="updateValue" @visible-change="visibleChange">
-    <el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value"></el-option>
-  </el-select> -->
+  <!-- <el-select v-model="selectedValue" :ref="`selectRef${timeRef}`" :multiple="multiple" :size="size"
+    :loading="selectLoading" :placeholder="placeholder" :disabled="disabled" clearable filterable collapse-tags
+    :style="`width: ${width}`"
+    :class="`custom-select ${userInfo.userNameNeedTranslate != 1 && !controlTranslation.visibleFlag ? 'setUpInput' : ''}`"
+    @change="updateValue" @visible-change="visibleChange"
+    :filter-method="(val: string) => { selectLoading = true, filterMethod(val) }">
+    搜索内容显示
+    <template #prefix v-if="!multiple">
+      <div style="height: 100%;display: flex;align-items: center;">
+        单选
+        <div v-if="!controlTranslation.visibleFlag" class="selectSingleChoice">
+          <template v-if="getSelectedLabel == placeholder">
+            {{ placeholder }}
+          </template>
+<template v-else>
+            <span style="color: #303133;">
+              <TextTranslation translationTypes="userName" :translationValue="getSelectedLabel"></TextTranslation>
+            </span>
+          </template>
+</div>
+</div>
+</template>
+<template #tag v-if="multiple">
+      多选
+      <template v-if="Array.isArray(selectedValue) && selectedValue.length > 0">
+        <el-tag type="info" :size="size" closable @close="tagClose">
+          <TextTranslation translationTypes="userName" :translationValue="getSelectedLabel"></TextTranslation>
+        </el-tag>
+        <el-tag type="info" :size="size" v-if="selectedValue.length > 1">+{{ selectedValue.length }}</el-tag>
+      </template>
+<template v-else>
+        <span style="color: #A8ABB2">{{ placeholder }}</span> 
+      </template>
 </template>
+主题内容显示
+<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
+    :style="`width: ${width}`" :options="personnelArray"
+    :class="`custom-select ${!controlTranslation.visibleFlag ? 'setUpInput' : ''}`" @change="updateValue"
+    @visible-change="visibleChange" :filter-method="filterMethod">
+    <!-- 搜索内容显示 -->
+    <template #prefix v-if="!multiple">
+      <div style="height: 100%;display: flex;align-items: center;">
+        <!-- 单选 -->
+        <div v-if="!controlTranslation.visibleFlag" class="selectSingleChoice">
+          <template v-if="getSelectedLabel == placeholder">
+            {{ placeholder }}
+          </template>
+          <template v-else>
+            <span style="color: #303133;">
+              <TextTranslation translationTypes="userName" :translationValue="getSelectedLabel"></TextTranslation>
+            </span>
+          </template>
+        </div>
+      </div>
+    </template>
+    <template #tag v-if="multiple">
+      <!-- 多选 -->
+      <template v-if="Array.isArray(selectedValue) && selectedValue.length > 0">
+        <el-tag type="info" :size="size" closable @close="tagClose">
+          <TextTranslation translationTypes="userName" :translationValue="getSelectedLabel"></TextTranslation>
+        </el-tag>
+        <el-tag type="info" :size="size" v-if="selectedValue.length > 1">+{{ selectedValue.length }}</el-tag>
+      </template>
+      <template v-else>
+        <span style="color: #A8ABB2">{{ placeholder }}</span>
+      </template>
+    </template>
+    <!-- 基础 -->
+    <template #default="{ item }">
+      <div class="flex items-center">
+        <TextTranslation translationTypes="userName" :translationValue="item.label"></TextTranslation>
+      </div>
+    </template>
+  </el-select-v2>
+  <span class="aabbcc">aabbcc</span>
+</template>
+
+<style lang="scss" scoped>
+.custom-select {
+  :deep(.el-select__placeholder.is-transparent) {
+    color: transparent !important;
+  }
 
-<style lang="scss" scoped></style>
+  :deep(.el-select__placeholder) {
+    span {
+      display: none;
+    }
+  }
+  
+  :deep(.el-select__input) {
+    margin-left: 0;
+  }
+}
+
+.setUpInput :deep(.el-input__inner) {
+  color: #fff !important;
+}
+
+.aabbcc {
+  color: $modena;
+}
+</style>

+ 0 - 9
fhKeeper/formulahousekeeper/customerBuler-crm/src/components/translationComponent/personnelSearch/type.d.ts

@@ -4,15 +4,6 @@ export type optionsType = {
   jobNumber?: string,
 }[]
 
-export interface Props {
-  modelValue: any,
-  size: assemblySize,
-  placeholder: string,
-  disabled?: Boolean,
-  multiple?: Boolean,
-  options?: optionsType, // 使用自定义数据
-}
-
 export interface Emits {
   (event: "change", value: any): void;
   /**

+ 8 - 4
fhKeeper/formulahousekeeper/customerBuler-crm/src/components/translationComponent/textTranslation/textTranslation.vue

@@ -1,9 +1,9 @@
 <template>
-  <template v-if="userInfo.userNameNeedTranslate == 1">
-    <ww-open-data :type='translationTypes' :openid='translationValue'></ww-open-data>
+  <template v-if="!translationVal">
+    {{ translationValue }}
   </template>
   <template v-else>
-    {{ translationValue }}
+    <ww-open-data :type="translationTypes" :openid="translationValue"></ww-open-data>
   </template>
 </template>
 <script lang="ts" setup>
@@ -19,5 +19,9 @@ interface Props {
 const props = defineProps<Props>();
 const { userInfo } = storeToRefs(useStore());
 
-console.log(props, '<==== 看看数据')
+const translationVal = ref(false);
+
+onMounted(() => {
+  translationVal.value = userInfo.value.userNameNeedTranslate == 0 ? false : true;
+})
 </script>

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

@@ -17,10 +17,15 @@ import {
   SummaryData
 } from './api';
 
-const selectVal = ref<string | number>('')
+const selectVal = ref<Array<string | number>>([])
+const selectVals = ref<string | number>('')
 const selectChange = (val: any) => {
-  console.log(val, '<===== 当前的数据')
-  console.log(selectVal.value, '<===== 双向绑定的数据')
+  console.log(val, '<===== 当前的数据 selectVal')
+  console.log(selectVal.value, '<===== 双向绑定的数据 selectVal')
+}
+const selectChange2 = (val: any) => {
+  console.log(val, '<===== 当前的数据 selectVals')
+  console.log(selectVals.value, '<===== 双向绑定的数据 selectVals')
 }
 const permissionOptions = [
   {
@@ -187,7 +192,8 @@ watchEffect(() => {
           </el-select>
         </div>
         <div class="w-40">
-          <personnel-search v-model="selectVal" size="small" :disabled="false" multiple placeholder="你好世界" @change="selectChange"></personnel-search>
+          <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"

+ 62 - 0
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/home.vue

@@ -18,11 +18,73 @@
 <script lang="ts" setup>
 import Header from '@/pages/header/header.vue';
 import { nextTick, onMounted, ref } from 'vue';
+import { storeToRefs } from 'pinia';
+import { useStore } from '@/store/index'
+import { post } from "@/utils/request";
+const { userInfo } = storeToRefs(useStore());
+
+declare var wx: any; // wx 小程序对象
+declare var window: Window & { WWOpenData: any }; // 如果是 window.WWOpenData
+declare var WWOpenData: any; // wx 小程序对象
+
 const isLoading = ref(true);
+const agentConfig = () => {
+  var isCorpWX = true
+  var ua = navigator.userAgent.toLowerCase();
+  if (ua.indexOf("wxwork") > 0) {
+    isCorpWX = false;
+  }
+  const curUrl = location.href.split("#")[0];
+  post(`/wxcorp/getCorpWXConfig`, { url: curUrl, token: userInfo.value.id }).then(res => {
+    wx.config({
+      beta: true,
+      debug: isCorpWX, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
+      appId: res.data.appid, // 必填,公众号的唯一标识 
+      timestamp: res.data.timestamp, // 必填,生成签名的时间戳 
+      nonceStr: res.data.noncestr, // 必填,生成签名的随机串 
+      signature: res.data.sign, // 必填,签名,见附录1 
+      jsApiList: ['chooseImage', 'previewImage', 'uploadImage', 'downloadImage', 'previewFile', 'getLocation', 'agentConfig', 'getLocalImgData']
+    });
+
+    wx.ready(() => {
+      post(`/wxcorp/getCorpWXAgentConfig`, { url: curUrl, token: userInfo.value.id }).then(res => {
+        wx.agentConfig({
+          corpid: res.data.corpid, // 必填,企业微信的corpid,必须与当前登录的企业一致
+          agentid: res.data.agentid, // 必填,企业微信的应用id (e.g. 1000247)
+          timestamp: res.data.timestamp, // 必填,生成签名的时间戳
+          nonceStr: res.data.nonceStr, // 必填,生成签名的随机串
+          signature: res.data.signature, // 必填,签名,见附录-JS-SDK使用权限签名算法
+          jsApiList: ['selectExternalContact', 'selectEnterpriseContact', 'openAppManage'], //必填,传入需要使用的接口名称
+          success: function (result: any) {
+            console.log(result, '请求微信成功')
+            console.log(window, 'window')
+            //  wx.agentConfig成功回调后,WWOpenData 才会注入到 window 对象上面
+            if (window.WWOpenData) {
+              window.WWOpenData.bind(document.querySelector('ww-open-data'))
+              if (WWOpenData.initCanvas) {
+                WWOpenData.initCanvas()
+                console.log('我企业微信 canvas 应该执行了吧')
+              }
+            }
+          },
+          fail: function (res: any) {
+            console.log('查看错误信息', res)
+            if (res.errMsg.indexOf('function not exist') > -1) {
+              alert('版本过低请升级')
+            }
+          },
+        })
+      })
+    })
+  })
+}
 
 onMounted(async () => {
   await nextTick();
   isLoading.value = false;
+  if (userInfo.value.userNameNeedTranslate == 1) {
+    agentConfig()
+  }
 });
 </script>
 

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

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

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

@@ -10,6 +10,7 @@ export const useStore = defineStore<
     userInfo: {}, // 当前的用户信息
     routers: [], // 返回的所有路由
     asyncRoutesMark: false, // 是否添加过路由
+    personnelList: [], // 人员列表
   }),
   getters: {
     getRoutersList() {
@@ -48,6 +49,7 @@ export const useStore = defineStore<
       sessionStorage.clear();
       this.userInfo = {};
       this.routers = [];
+      this.personnelList = [];
       this.asyncRoutesMark = false;
     },
   },

+ 1 - 1
fhKeeper/formulahousekeeper/customerBuler-crm/src/type.d.ts

@@ -27,7 +27,7 @@ type templateKey = { // 自定义模板键值
 
 type translationType = "userName" | "departmentName" | "deptName"; // 企业微信, 钉钉转译类型,
 
-type assemblySize = "mini" | "medium" | "large" | '' | 'large' | 'default' | 'small';
+type assemblySize = '' | 'large' | 'default' | 'small';
 
 type saveLoadingType = "1" | "2" | "3" | "4"; //1是没有保存, 2是正在保存, 3是保存成功, 4是保存失败
 

+ 10 - 2
fhKeeper/formulahousekeeper/customerBuler-crm/vite.config.ts

@@ -10,7 +10,13 @@ const target = "http://127.0.0.1:10010";
 // const target = 'http://47.101.180.183:10010';
 
 export default defineConfig({
-  plugins: [vue()],
+  plugins: [vue({
+    template: {
+      compilerOptions: {
+        isCustomElement: (tag) => tag === 'ww-open-data'
+      }
+    }
+  })],
   server: {
     host: '0.0.0.0',
     port: 19123,
@@ -33,7 +39,9 @@ export default defineConfig({
   css: {
     preprocessorOptions: {
       scss: {
-        additionalData: '@import "@/styles/global.scss";'
+        // additionalData: '@import "@/styles/global.scss";'
+        additionalData: '@use "@/styles/global.scss" as *;', // 使用 @use 语法
+        api: "modern-compiler"
       }
     }
   },

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

@@ -138,7 +138,7 @@ public class BusinessOpportunityController {
 
                 if(model.equals("inchargerId")){
                     if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
-                        value = "$userName"+String.valueOf(aClass.getMethod("getInchargerName").invoke(data))+"$";
+                        value = "$userName="+String.valueOf(aClass.getMethod("getInchargerName").invoke(data))+"$";
                     }else {
                         value = String.valueOf(aClass.getMethod("getInchargerName").invoke(data)).equals("null") ? "" :String.valueOf(aClass.getMethod("getInchargerName").invoke(data));
                     }
@@ -147,7 +147,7 @@ public class BusinessOpportunityController {
                 }
 
                 if(model.equals("contactsId")){
-                    value = String.valueOf(aClass.getMethod("getContactsName").invoke(data));
+                    value = String.valueOf(aClass.getMethod("getContactsName").invoke(data)).equals("null")?"":String.valueOf(aClass.getMethod("getContactsName").invoke(data));
                 }
                 if(model.equals("customerId")){
                     value = String.valueOf(aClass.getMethod("getCustomerName").invoke(data));

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

@@ -238,7 +238,7 @@ public class ClueController {
 
                 if(model.equals("inchargerId")){
                     if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
-                        value = "$userName"+String.valueOf(aClass.getMethod("getInchargerName").invoke(data))+"$";
+                        value = "$userName="+String.valueOf(aClass.getMethod("getInchargerName").invoke(data))+"$";
                     }else {
                         value = String.valueOf(aClass.getMethod("getInchargerName").invoke(data)).equals("null") ? "" :String.valueOf(aClass.getMethod("getInchargerName").invoke(data));
                     }

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

@@ -152,7 +152,7 @@ public class CustomController {
 
                 if(model.equals("inchargerId")){
                     if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
-                        value = "$userName"+String.valueOf(aClass.getMethod("getInchargerName").invoke(data))+"$";
+                        value = "$userName="+String.valueOf(aClass.getMethod("getInchargerName").invoke(data))+"$";
                     }else {
                         value = String.valueOf(aClass.getMethod("getInchargerName").invoke(data)).equals("null") ? "" :String.valueOf(aClass.getMethod("getInchargerName").invoke(data));
                     }

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

@@ -144,6 +144,11 @@ public class UserController {
         return userService.getSimpleActiveUserList(departmentId,request,keyword,cursor);
     }
 
+    @RequestMapping("/getSimpleActiveUserListNew")
+    public HttpRespMsg getSimpleActiveUserListNew(Integer departmentId,String keyword,String cursor) throws Exception {
+        return userService.getSimpleActiveUserListNew(departmentId,request,keyword,cursor);
+    }
+
     @RequestMapping("/getUserListByRole")
     public HttpRespMsg getUserListByRole(String tableName){
         return userService.getUserListByRole(request,tableName);

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 56 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/WeiXinCorpController.java


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

@@ -11,6 +11,7 @@ import org.apache.ibatis.annotations.Update;
 
 import java.time.LocalDate;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
@@ -62,4 +63,6 @@ public interface UserMapper extends BaseMapper<User> {
     List<UserVO> getCustomerTotalCount(String startDate, String endDate, String userId, Integer companyId);
 
     List<UserVO> getCustomerTransferRate(String startDate, String endDate, String userId, Integer companyId);
+
+    List<Map<String, Object>> getSimpleActiveUserList(@Param("map") HashMap<String, Object> map);
 }

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

@@ -107,4 +107,6 @@ public interface UserService extends IService<User> {
     HttpRespMsg setActiveByIds(String ids, int isActive);
 
     HttpRespMsg deleteUserSalaryById(String id);
+
+    HttpRespMsg getSimpleActiveUserListNew(Integer departmentId, HttpServletRequest request, String keyword, String cursor) throws Exception;
 }

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

@@ -688,6 +688,7 @@ public class ContactsServiceImpl extends ServiceImpl<ContactsMapper, Contacts> i
         map.put("ownerName", ownerName);
         map.put("email", email);
         map.put("creatorName", creatorName);
+        map.put("companyId",user.getCompanyId());
         Page<ContactsVo> pageContacts = contactsMapper.pageContacts(new Page<>(-1,-1), map);
         List<ContactsVo> records = pageContacts.getRecords();
 
@@ -701,11 +702,7 @@ public class ContactsServiceImpl extends ServiceImpl<ContactsMapper, Contacts> i
                 String value = "";
 
                 if(model.equals("customId")){
-                    if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
-                        value = "$userName"+String.valueOf(aClass.getMethod("getCustomName").invoke(contactsVo))+"$";
-                    }else {
-                        value = String.valueOf(aClass.getMethod("getCustomName").invoke(contactsVo)).equals("null") ?"" :String.valueOf(aClass.getMethod("getCustomName").invoke(contactsVo));
-                    }
+                    value = String.valueOf(aClass.getMethod("getCustomName").invoke(contactsVo)).equals("null") ?"" :String.valueOf(aClass.getMethod("getCustomName").invoke(contactsVo));
                 }
                 else if(model.equals("sex")){
                     value = String.valueOf(aClass.getMethod("getSex").invoke(contactsVo)).equals("null") ?"":String.valueOf(aClass.getMethod("getSex").invoke(contactsVo));
@@ -720,7 +717,7 @@ public class ContactsServiceImpl extends ServiceImpl<ContactsMapper, Contacts> i
                 }
                 else if(model.equals("ownerId")){
                     if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
-                        value = "$userName"+String.valueOf(aClass.getMethod("getOwnerName").invoke(contactsVo))+"$";
+                        value = "$userName="+String.valueOf(aClass.getMethod("getOwnerName").invoke(contactsVo))+"$";
                     }else {
                         value = String.valueOf(aClass.getMethod("getOwnerName").invoke(contactsVo)).equals("null") ? "" :String.valueOf(aClass.getMethod("getOwnerName").invoke(contactsVo));
                     }

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

@@ -456,7 +456,7 @@ public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> impl
                             String value = String.valueOf(aClass.getMethod("get" + targetName).invoke(product)==null?"":aClass.getMethod("get" + targetName).invoke(product));
                             if(model.equals("inchargerId")){
                                 if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
-                                    value = "$userName"+String.valueOf(aClass.getMethod("getInchargerName").invoke(product))+"$";
+                                    value = "$userName="+String.valueOf(aClass.getMethod("getInchargerName").invoke(product))+"$";
                                 }else {
                                     value = String.valueOf(aClass.getMethod("getInchargerName").invoke(product));
                                 }
@@ -480,7 +480,7 @@ public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> impl
                     String value = String.valueOf(aClass.getMethod("get" + targetName).invoke(product)==null?"":aClass.getMethod("get" + targetName).invoke(product));
                     if(model.equals("inchargerId")){
                         if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
-                            value = "$userName"+String.valueOf(aClass.getMethod("getInchargerName").invoke(product))+"$";
+                            value = "$userName="+String.valueOf(aClass.getMethod("getInchargerName").invoke(product))+"$";
                         }else {
                             value = String.valueOf(aClass.getMethod("getInchargerName").invoke(product));
                         }

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

@@ -7692,7 +7692,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                     List<Map<String, Object>> mapList = membList.stream().filter(mb -> mb.get("creatorId").equals(user.getId())).collect(Collectors.toList());
                     List<String> membRowData=new ArrayList<>();
                     if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
-                        membRowData.add("$userName"+(user.getCorpwxUserid()==null?"":user.getCorpwxUserid())+"$");
+                        membRowData.add("$userName="+(user.getCorpwxUserid()==null?"":user.getCorpwxUserid())+"$");
                     }else {
                         membRowData.add(user.getName());
                     }

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

@@ -8764,7 +8764,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
     public HttpRespMsg exportCustomerTotalCount(String startDate, String endDate, String userId, Integer departmentId, Integer exportType, HttpServletRequest request) throws Exception {
         User user = userMapper.selectById(request.getHeader("token"));
         WxCorpInfo wxCorpInfo = wxCorpInfoService.getOne(new LambdaQueryWrapper<WxCorpInfo>().eq(WxCorpInfo::getCompanyId, user.getCompanyId()));
-
+        List<Department> deptName = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id", user.getCompanyId()));
 
         List<List<String>> dataList = new ArrayList<>();
         List<String> titleList = new ArrayList<>();
@@ -8780,7 +8780,11 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             List<UserVO> userVOList = (List<UserVO>) respMsg.getData();
             for (UserVO userVO : userVOList) {
                 List<String> item = new ArrayList<>();
-                item.add(userVO.getName());
+                if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                    item.add("$userName="+userVO.getName()+"$");
+                }else{
+                    item.add(userVO.getName());
+                }
                 item.add((userVO.getCustomertotal() == null ? 0 : userVO.getCustomertotal()) + "");
                 item.add((userVO.getCustomerDeal() == null ? 0 : userVO.getCustomerDeal()) + "");
                 item.add((userVO.getDealRate() == null ? 0 : userVO.getDealRate()) + "");
@@ -8793,7 +8797,22 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             List<DepartmentVO> departmentVOList = (List<DepartmentVO>) respMsg.getData();
             for (DepartmentVO departmentVO : departmentVOList) {
                 List<String> item = new ArrayList<>();
-                item.add(departmentVO.getDepartmentName());
+                //取部门名
+                for (Department department : deptName) {
+                    if (departmentVO.getId().toString().equals(department.getDepartmentId().toString())){
+                        if (wxCorpInfo!=null && wxCorpInfo.getSaasSyncContact()==1){
+                            item.add(exportWxDepartment(department));
+                        }else {
+                            item.add(getSupDepartment(department));
+                        }
+                        break;
+                    }
+                }
+                /*if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                    item.add("$departmentName="+departmentVO.getDepartmentName()+"$");
+                }else{
+                    item.add(departmentVO.getDepartmentName());
+                }*/
                 item.add((departmentVO.getCustomertotal() == null ? 0 : departmentVO.getCustomertotal()) + "");
                 item.add((departmentVO.getCustomerDeal() == null ? 0 : departmentVO.getCustomerDeal()) + "");
                 item.add((departmentVO.getDealRate() == null ? 0 : departmentVO.getDealRate()) + "");
@@ -8805,12 +8824,40 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
 
         return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo, fileName, dataList, path);
     }
+    private String exportWxDepartment(Department department) {
+        if(department == null || department.getCorpwxDeptid() == null){
+            return "";
+        }
+        String depHierarchy = "$departmentName="+department.getCorpwxDeptid()+"$";
+        //搜到父部门进行添加
+        if (department.getCorpwxDeptpid()==null || department.getCorpwxDeptpid()==1) {
+            return depHierarchy;
+        }else{
+            Department supDep = departmentMapper.selectOne(new QueryWrapper<Department>().eq("corpwx_deptid", department.getCorpwxDeptpid()).eq("company_id", department.getCompanyId()));
+            return exportWxDepartment(supDep) + "/" + depHierarchy;
+        }
+    }
+
+    //递归获取所有上级部门字符串,格式:"上级部门/上级部门/部门"
+    private String getSupDepartment(Department department) {
+        if (department == null){
+            return "";
+        }
+        String depHierarchy = department.getDepartmentName();
+        //搜到父部门进行添加
+        if (department.getSuperiorId()==null) {
+            return depHierarchy;
+        } else {
+            Department supDep = departmentMapper.selectById(department.getSuperiorId());
+            return getSupDepartment(supDep) + "/" + depHierarchy;
+        }
+    }
 
     @Override
     public HttpRespMsg exportCustomerTransferRate(String startDate, String endDate, String userId, Integer departmentId, Integer exportType, HttpServletRequest request) throws Exception {
         User user = userMapper.selectById(request.getHeader("token"));
         WxCorpInfo wxCorpInfo = wxCorpInfoService.getOne(new LambdaQueryWrapper<WxCorpInfo>().eq(WxCorpInfo::getCompanyId, user.getCompanyId()));
-
+        List<Department> deptName = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id", user.getCompanyId()));
 
         List<List<String>> dataList = new ArrayList<>();
         List<String> titleList = new ArrayList<>();
@@ -8836,7 +8883,17 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             List<DepartmentVO> departmentVOList = (List<DepartmentVO>) respMsg.getData();
             for (DepartmentVO departmentVO : departmentVOList) {
                 List<String> item = new ArrayList<>();
-                item.add(departmentVO.getDepartmentName());
+                //取部门名
+                for (Department department : deptName) {
+                    if (departmentVO.getId().toString().equals(department.getDepartmentId().toString())){
+                        if (wxCorpInfo!=null && wxCorpInfo.getSaasSyncContact()==1){
+                            item.add(exportWxDepartment(department));
+                        }else {
+                            item.add(getSupDepartment(department));
+                        }
+                        break;
+                    }
+                }
                 item.add(departmentVO.getDealRate() + "");
                 dataList.add(item);
             }

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

@@ -638,7 +638,7 @@ public class SalesOrderServiceImpl extends ServiceImpl<SalesOrderMapper, SalesOr
                             String value = String.valueOf(aClass.getMethod("get" + targetName).invoke(salesOrder)==null?"":aClass.getMethod("get" + targetName).invoke(salesOrder));
                             if(model.equals("inchargerId")){
                                 if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
-                                    value = "$userName"+String.valueOf(aClass.getMethod("getInchargerName").invoke(salesOrder))+"$";
+                                    value = "$userName="+String.valueOf(aClass.getMethod("getInchargerName").invoke(salesOrder))+"$";
                                 }else {
                                     value = String.valueOf(aClass.getMethod("getInchargerName").invoke(salesOrder));
                                 }
@@ -668,7 +668,7 @@ public class SalesOrderServiceImpl extends ServiceImpl<SalesOrderMapper, SalesOr
                     String value = String.valueOf(aClass.getMethod("get" + targetName).invoke(salesOrder)==null?"":aClass.getMethod("get" + targetName).invoke(salesOrder));
                     if(model.equals("inchargerId")){
                         if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
-                            value = "$userName"+String.valueOf(aClass.getMethod("getInchargerName").invoke(salesOrder))+"$";
+                            value = "$userName="+String.valueOf(aClass.getMethod("getInchargerName").invoke(salesOrder))+"$";
                         }else {
                             value = String.valueOf(aClass.getMethod("getInchargerName").invoke(salesOrder));
                         }

+ 48 - 17
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/SysRoleServiceImpl.java

@@ -29,12 +29,11 @@ import java.util.stream.Collectors;
 @Transactional
 public class SysRoleServiceImpl extends ServiceImpl<SysRoleMapper, SysRole> implements SysRoleService {
 
-    public static String[] employeeModules =  {"工时报告","项目报告审核", "专业审核","部门审核","费用报销","待办任务", "项目管理", "请假管理", "导入日报审核"};
-    public static String[] pmModules =  {"工时报告","项目报告审核", "专业审核","部门审核","费用报销","待办任务", "项目管理", "请假管理", "导入日报审核"};
-    public static String[] financeModules =  {"工时成本统计", "财务核算成本", "费用报销", "组织架构", "请假管理"};
-    public static String[] pmoModules =  {"工时报告","项目报告审核","查看全部任务", "费用报销", "待办任务", "项目管理", "客户管理", "工程专业管理","请假管理"};
-    public static String[] corpLeaderModules =  {"工时报告","查看全部任务","工时成本统计","自定义数值统计","财务核算成本","项目报表服务",
-            "费用报销","待办任务","项目管理","请假管理","查看全部报销单", "查看全部请假单"};
+    public static String[] employeeModules =  {"商机","线索", "客户","联系人","任务", "销售订单","产品管理"};
+    public static String[] pmModules =  {"商机","线索", "客户","联系人","任务","报表服务", "销售订单","产品管理"};
+    public static String[] financeModules =  {"商机","线索", "客户","联系人","任务","报表服务", "销售订单","产品管理"};
+    public static String[] pmoModules =  {"商机","线索", "客户","联系人","任务","报表服务", "销售订单","产品管理"};
+    public static String[] corpLeaderModules =  {"商机","线索", "客户","联系人","任务","报表服务","数据分析", "销售订单","产品管理","组织架构","系统设置"};
 
     public static final HashMap<String, String[]> moduleMaps = new HashMap();
     static {
@@ -45,14 +44,46 @@ public class SysRoleServiceImpl extends ServiceImpl<SysRoleMapper, SysRole> impl
         moduleMaps.put("公司领导", corpLeaderModules);
     }
 //
-    public static String[] employeeFunctions = {"查看相关人员工时","请假填报","费用填报"};
-    public static String[] pmFunctions = {"新增项目", "查看相关人员工时","请假填报","费用填报","代填日报"};
-    public static String[] financeFunctions = {"人员成本管理", "添加人员", "导出人员", "导入人员", "请假填报","费用填报", "查看全部请假单"};
-    public static String[] pmoFunctions = {"新增项目","查看全部项目","管理全部项目","分类管理","导入项目","代填日报", "请假填报","费用填报",
-            "导出项目","查看资源分配", "基线成本项管理","查看成本基线","校正成本基线","查看合同金额"};
-    public static String[] corpLeaderFunctions = {"查看全公司工时","查看全部项目","导出项目","查看资源分配",
-            "查看成本基线","查看合同金额", "请假填报","费用填报", "查看全部请假单","项目任务报表","项目成本报表","项目收支平衡表","客户项目利润表",
-            "项目阶段工时表", "加班情况统计表"};
+    public static String[] employeeFunctions = {"新增\\编辑商机","导入","导出","编辑","新增"};
+    public static String[] pmFunctions = {"编辑","新增","导入","导出","删除","回收站",
+    "查看负责部门商机","新增\\编辑商机",
+    "查看负责部门线索",
+    "查看负责部门客户",
+    "查看负责部门联系人", "查看负责部门任务",
+            "负责部门线索数据","负责部门商机数据",
+            "负责部门销售数据","负责部门任务数据",
+            "查看负责部门产品数据",
+            "查看负责部门订单"
+    };
+    public static String[] financeFunctions = {
+             "查看全部商机",
+            "查看全部线索",
+            "查看全部客户",
+            "查看全部联系人", "查看全部任务",
+            "全部线索数据","全部商机数据",
+            "全部销售数据","全部任务数据",
+            "查看全部产品数据",
+            "查看全部订单",
+            "角色权限","系统字典","自定义表单"};
+    public static String[] pmoFunctions = {"编辑","新增","导入","导出","删除","回收站",
+            "查看负责部门商机","新增\\编辑商机",
+            "查看负责部门线索",
+            "查看负责部门客户",
+            "查看负责部门联系人", "查看负责部门任务",
+            "负责部门线索数据","负责部门商机数据",
+            "负责部门销售数据","负责部门任务数据",
+            "查看负责部门产品数据",
+            "查看负责部门订单"};
+    public static String[] corpLeaderFunctions = {"编辑","新增","导入","导出","删除","回收站",
+            "查看负责部门商机", "查看全部商机","新增\\编辑商机",
+            "查看负责部门线索","查看全部线索",
+            "查看负责部门客户","查看全部客户",
+            "查看负责部门联系人","查看全部联系人", "查看负责部门任务","查看全部任务",
+            "负责部门线索数据","全部线索数据","负责部门商机数据","全部商机数据",
+            "负责部门销售数据","全部销售数据","负责部门任务数据","全部任务数据",
+            "查看全部产品数据","查看负责部门产品数据",
+            "查看负责部门订单","查看全部订单"
+            };
     public static final HashMap<String, String[]> functionMaps = new HashMap();
     static {
         functionMaps.put("普通员工", employeeFunctions);
@@ -184,9 +215,9 @@ public class SysRoleServiceImpl extends ServiceImpl<SysRoleMapper, SysRole> impl
                 generateRole(str, company, modules, functions);
             } else {
                 //其他角色按照过滤的来生成
-                List<SysModule> filteredModules = modules.stream().filter(
-                        m->Arrays.stream(moduleMaps.get(str)).anyMatch(curModule->curModule.equals(m.getName()))
-                ).collect(Collectors.toList());
+                String[] mocules = moduleMaps.get(str);
+                List<SysModule> filteredModules = modules.stream().
+                        filter(m->Arrays.stream(mocules).anyMatch(curModule->curModule.equals(m.getName()))).collect(Collectors.toList());
                 List<SysFunction> filteredFunctions = functions.stream().filter(
                         m->Arrays.stream(functionMaps.get(str)).anyMatch(curModule->curModule.equals(m.getName()))
                 ).collect(Collectors.toList());

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

@@ -914,6 +914,11 @@ public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements Ta
         WxCorpInfo wxCorpInfo = wxCorpInfoService.getOne(new LambdaQueryWrapper<WxCorpInfo>().eq(WxCorpInfo::getCompanyId, user.getCompanyId()));
         List<TaskExecutor> taskExecutorList = taskExecutorMapper.selectList(new LambdaQueryWrapper<TaskExecutor>().eq(TaskExecutor::getCompanyId,user.getCompanyId()));
         List<TaskLog> taskLogList = taskLogMapper.selectList(new LambdaQueryWrapper<TaskLog>().eq(TaskLog::getCompanyId,user.getCompanyId()));
+        if (sysForm==null){
+            HttpRespMsg httpRespMsg = new HttpRespMsg();
+            httpRespMsg.setError("该公司暂无配置自定义表单");
+            return httpRespMsg;
+        }
         String config = sysForm.getConfig();
         JSONObject configOb = JSON.parseObject(config);
         JSONArray configObJSONArray = configOb.getJSONArray("list");
@@ -991,14 +996,20 @@ public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements Ta
                     }
                 }
                 else if(model.equals("executorId")){
-                    StringJoiner stringJoiner = new StringJoiner(",");
                     List<String> taskExecutors = tasKVo.getTaskExecutors();
                     if (taskExecutors!=null&&!taskExecutors.isEmpty()){
-                        for (String taskExecutor : taskExecutors) {
-                            stringJoiner.add(taskExecutor);
-                        }
+                        String executorString = taskExecutors.stream()
+                                .map(
+                                t->{
+                                    if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                                return "$userName="+t+"$";}
+                                    else {return t;}
+                                    }
+                                ).collect(Collectors.joining(","));
+                        value =executorString.isEmpty()?"":executorString;
+                    }else {
+                        value="";
                     }
-                    value =stringJoiner.length()==0?"":stringJoiner.toString();
                 }
                 else if(model.equals("startDate")){
                     if (tasKVo.getStartDate()!=null){

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 66 - 307
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/UserServiceImpl.java


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

@@ -333,6 +333,26 @@
         </where>
         group by  c.incharger_id
     </select>
+    <select id="getSimpleActiveUserList" resultType="java.util.Map">
+        select id as value, name as label,job_number as jobNumber from user u
+            <where>
+                <if test="map.companyId !=null">
+                    and u.company_id=#{map.companyId}
+                </if>
+                <if test="map.isActive !=null">
+                    and u.is_active=#{map.isActive}
+                </if>
+                <if test="map.name !=null">
+                    and u.name like concat('%',#{map.name},'%')
+                </if>
+                <if test="map.deptIds !=null">
+                    and u.department_id in
+                    <foreach collection="map.deptIds" item="item" open="(" close=")" separator=",">
+                        #{item}
+                    </foreach>
+                </if>
+            </where>
+    </select>
 
     <update id="updateActiveByIds">
         update user set is_active=1 WHERE id IN

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

@@ -441,13 +441,29 @@ public class ReportController {
 
 
         //添加财务审核该月后无法再次填报该月日报
-        if(null != createDate && 1== createDate.length){
-            String reportYM = createDate[0].substring(0,7);
-            Integer count = financialAuditMapper.checkFinanceReview(user.getCompanyId(),reportYM);
-            if(0 < count){
-                HttpRespMsg msg = new HttpRespMsg();
-                msg.setError(MessageUtils.message("report.financial_report",reportYM));
-                return msg;
+        if(null != createDate && 0 < createDate.length){
+            String createDateOne = createDate[0];
+            if (createDateOne.contains("@")) {
+                //批量填报的日期
+                String[] dateArray = createDateOne.split("@");
+                for (String date : dateArray) {
+                    String reportYM = date.substring(0,7);
+                    Integer count = financialAuditMapper.checkFinanceReview(user.getCompanyId(),reportYM);
+                    if(0 < count){
+                        HttpRespMsg msg = new HttpRespMsg();
+                        msg.setError(MessageUtils.message("report.financial_report",reportYM));
+                        return msg;
+                    }
+                }
+            } else {
+                //单个日期
+                String reportYM = createDateOne.substring(0,7);
+                Integer count = financialAuditMapper.checkFinanceReview(user.getCompanyId(),reportYM);
+                if(0 < count){
+                    HttpRespMsg msg = new HttpRespMsg();
+                    msg.setError(MessageUtils.message("report.financial_report",reportYM));
+                    return msg;
+                }
             }
         }
 

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

@@ -505,6 +505,7 @@ public class DingDingServiceImpl implements DingDingService {
             //新开通的情况,给字段默认值
             dingding.setSyncContact(1);
 //            dingding.setContactNeedTranslate(1);//上架到钉钉应用市场,采用数据安全中心的方式,不需要转译了。
+            dingding.setContactNeedTranslate(0);
             //第一次,查询对方企业的accessToken
             SysConfig config = sysConfigMapper.selectOne(new QueryWrapper<SysConfig>().eq("param_key", "dingding_suite_ticket"));
             String suiteTicket = config.getParamValue();
@@ -1579,15 +1580,12 @@ public class DingDingServiceImpl implements DingDingService {
                 departmentDingding.setCorpid(corpid);
                 departmentDingding.setDdDeptid(dept.getInteger("dept_id"));
                 //TODO:对于钉钉市场的用户,需要通讯录加密的,没有返回部门名称,用部门id替代
-                if (companyDingding.getContactNeedTranslate() == 1) {
+                if (companyDingding.getContactNeedTranslate() != null && companyDingding.getContactNeedTranslate() == 1) {
                     departmentDingding.setName(dept.getString("dept_id"));
                 } else {
                     departmentDingding.setName(dept.getString("name"));
                 }
                 departmentDingding.setDdParentid(dept.getInteger("parent_id"));
-                if (departmentDingding.getDdDeptid() == 661842181) {
-                    System.out.println("=========zfind 661842181"+departmentDingding.getName());
-                }
                 synchronized (deptLock) {
                     List<DepartmentDingding> departmentDingdings = departmentDingdingMapper.selectList(new QueryWrapper<DepartmentDingding>()
                             .eq("corpid", corpid)

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

@@ -9877,11 +9877,11 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
         for (User item : needRangeUserList) {
             for (LocalDate day : days) {
                 boolean workDay = WorkDayCalculateUtils.isWorkDay(day);
-                //去掉非工作日
+                boolean match = list.stream().anyMatch(l -> l.get("createDate").equals(df.format(day)) && l.get("userId").equals(item.getId()));
+                //去掉非工作日且无日报
                 if(!workDay){
                     continue;
                 }
-                boolean match = list.stream().anyMatch(l -> l.get("createDate").equals(df.format(day)) && l.get("userId").equals(item.getId()));
                 if(!match){
                     Map<String,Object> map=new HashMap<>();
                     map.put("userId",item.getId());
@@ -9943,12 +9943,12 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                     Method method = aClass.getMethod(getter);
                     String invoke = (String) method.invoke(targetUser);
                     if(invoke==null||invoke.equals("有加班费")){
-                        if((!(Double.valueOf(String.valueOf(map.get("workingTime"))).equals(Double.valueOf(String.valueOf(map.get("cardTime"))))))&&(map.containsKey("cancelNormal")&&(Integer)map.get("cancelNormal")!=1)){
+                        if((!(Double.valueOf(String.valueOf(map.get("workingTime"))).equals(Double.valueOf(String.valueOf(map.get("cardTime"))))))&&(map.containsKey("cancelNormal")&&(Integer.valueOf(String.valueOf(map.get("cancelNormal"))))!=1)){
                             map.put("exceedCardTime",1);
                         }
                         map.put("invokeValue","有加班费");
                     }else{
-                        if(((Double.valueOf(String.valueOf(map.get("workingTime")))<Double.valueOf(String.valueOf(map.get("cardTime")))))&&(map.containsKey("cancelNormal")&&(Integer)map.get("cancelNormal")!=1)){
+                        if(((Double.valueOf(String.valueOf(map.get("workingTime")))<Double.valueOf(String.valueOf(map.get("cardTime")))))&&(map.containsKey("cancelNormal")&&(Integer.valueOf(String.valueOf(map.get("cancelNormal"))))!=1)){
                             map.put("exceedCardTime",1);
                         }
                         map.put("invokeValue","无加班费");

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

@@ -1380,7 +1380,7 @@
 
     <select id="getUserDailyWorkTimeReminder" resultType="java.util.Map">
         SELECT date_format(r.create_date,'%Y-%m-%d') AS createDate,u.name AS name,u.id as userId,u.corpwx_userid as corpwxUserId,d.corpwx_deptid as corpwxDeptId,d.department_name AS departmentName,
-        IFNULL(SUM(r.working_time),0) AS  workingTime,IFNULL(ufv.work_hours,0) AS cardTime,ufv.cancel_normal as cancelNormal
+        IFNULL(SUM(r.working_time),0) AS  workingTime,IFNULL(ufv.work_hours,0) AS cardTime,IFNULL(ufv.cancel_normal, 0) as cancelNormal
         FROM report  r
         LEFT JOIN user u ON r.creator_id=u.id
         LEFT JOIN department d ON d.department_id=u.department_id