Bladeren bron

Merge remote-tracking branch 'origin/master'

yusm 1 jaar geleden
bovenliggende
commit
e0da0b539a
91 gewijzigde bestanden met toevoegingen van 82658 en 66248 verwijderingen
  1. 1 1
      fhKeeper/formulahousekeeper/customerBuler-crm/index.html
  2. 158 0
      fhKeeper/formulahousekeeper/customerBuler-crm/package-lock.json
  3. 2 0
      fhKeeper/formulahousekeeper/customerBuler-crm/package.json
  4. 54 2
      fhKeeper/formulahousekeeper/customerBuler-crm/src/App.vue
  5. BIN
      fhKeeper/formulahousekeeper/customerBuler-crm/src/assets/404.png
  6. BIN
      fhKeeper/formulahousekeeper/customerBuler-crm/src/assets/defaultCover.png
  7. BIN
      fhKeeper/formulahousekeeper/customerBuler-crm/src/assets/login/background.png
  8. BIN
      fhKeeper/formulahousekeeper/customerBuler-crm/src/assets/login/login_logo.png
  9. BIN
      fhKeeper/formulahousekeeper/customerBuler-crm/src/assets/login/qiyeweixin.png
  10. 5 1
      fhKeeper/formulahousekeeper/customerBuler-crm/src/main.ts
  11. 11 0
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/404.vue
  12. 0 0
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/analysis/api.ts
  13. 0 0
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/analysis/index.vue
  14. 3 0
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/api.ts
  15. 0 0
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/business/api.ts
  16. 0 0
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/business/index.vue
  17. 0 0
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/contacts/api.ts
  18. 0 0
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/contacts/index.vue
  19. 0 0
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/corpreport/api.ts
  20. 0 0
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/corpreport/index.vue
  21. 0 0
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/customer/api.ts
  22. 0 0
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/customer/index.vue
  23. 89 0
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/home.vue
  24. 0 8
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/index.vue
  25. 146 108
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/login.vue
  26. 0 0
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/order/api.ts
  27. 0 0
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/order/index.vue
  28. 0 0
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/product/api.ts
  29. 0 0
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/product/index.vue
  30. 180 0
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/register.vue
  31. 0 0
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/system/api.ts
  32. 0 0
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/system/dictionary/api.ts
  33. 10 0
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/system/dictionary/index.vue
  34. 11 0
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/system/index.vue
  35. 0 0
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/system/role/api.ts
  36. 12 0
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/system/role/index.vue
  37. 0 0
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/tasks/api.ts
  38. 11 0
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/tasks/index.vue
  39. 0 0
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/team/api.ts
  40. 11 0
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/team/index.vue
  41. 1 0
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/thread/api.ts
  42. 9 0
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/thread/index.vue
  43. 96 34
      fhKeeper/formulahousekeeper/customerBuler-crm/src/router/index.ts
  44. 22 11
      fhKeeper/formulahousekeeper/customerBuler-crm/src/store/index.ts
  45. 0 80
      fhKeeper/formulahousekeeper/customerBuler-crm/src/styles.css
  46. 17 0
      fhKeeper/formulahousekeeper/customerBuler-crm/src/styles/global.scss
  47. 6 0
      fhKeeper/formulahousekeeper/customerBuler-crm/src/type.d.ts
  48. 6 6
      fhKeeper/formulahousekeeper/customerBuler-crm/src/utils/request.ts
  49. 22 0
      fhKeeper/formulahousekeeper/customerBuler-crm/src/utils/tools.ts
  50. 2 1
      fhKeeper/formulahousekeeper/customerBuler-crm/tsconfig.json
  51. 29048 0
      fhKeeper/formulahousekeeper/management-crm/crm.log
  52. 78 8
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/ClueController.java
  53. 21 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/ClueLogController.java
  54. 107 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/SysDictController.java
  55. 86 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/SysFormController.java
  56. 14 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/Clue.java
  57. 56 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/ClueLog.java
  58. 8 10
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/SysDict.java
  59. 70 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/SysForm.java
  60. 16 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/mapper/ClueLogMapper.java
  61. 7 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/mapper/ClueMapper.java
  62. 16 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/mapper/SysFormMapper.java
  63. 16 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/ClueLogService.java
  64. 13 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/ClueService.java
  65. 16 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/SysFormService.java
  66. 20 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/ClueLogServiceImpl.java
  67. 65 1
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/ClueServiceImpl.java
  68. 20 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/SysFormServiceImpl.java
  69. 29 28
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/UserServiceImpl.java
  70. 2 2
      fhKeeper/formulahousekeeper/management-crm/src/main/resources/logback.xml
  71. 19 0
      fhKeeper/formulahousekeeper/management-crm/src/main/resources/mapper/ClueLogMapper.xml
  72. 118 2
      fhKeeper/formulahousekeeper/management-crm/src/main/resources/mapper/ClueMapper.xml
  73. 3 3
      fhKeeper/formulahousekeeper/management-crm/src/main/resources/mapper/SysDictMapper.xml
  74. 21 0
      fhKeeper/formulahousekeeper/management-crm/src/main/resources/mapper/SysFormMapper.xml
  75. BIN
      fhKeeper/formulahousekeeper/management-crm/workTime.2024-03-01.log.gz
  76. 51263 65454
      fhKeeper/formulahousekeeper/management-crm/workTime.log
  77. 2 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectController.java
  78. 4 4
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/TaskController.java
  79. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ProjectMapper.java
  80. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/TaskMapper.java
  81. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ProjectService.java
  82. 2 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/TaskService.java
  83. 65 59
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java
  84. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java
  85. 4 4
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/TaskServiceImpl.java
  86. 21 16
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectMapper.xml
  87. 10 5
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ReportMapper.xml
  88. 11 4
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/TaskMapper.xml
  89. 3 2
      fhKeeper/formulahousekeeper/timesheet/src/views/corpreport/list.vue
  90. 509 385
      fhKeeper/formulahousekeeper/timesheet/src/views/project/summary.vue
  91. 6 1
      fhKeeper/formulahousekeeper/timesheet_h5/src/views/task/editask.vue

+ 1 - 1
fhKeeper/formulahousekeeper/customerBuler-crm/index.html

@@ -4,7 +4,7 @@
     <meta charset="UTF-8" />
     <link rel="icon" type="image/svg+xml" href="/vite.svg" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <title>Vite + Vue + TS</title>
+    <title>客户管家</title>
   </head>
   <body>
     <div id="app"></div>

+ 158 - 0
fhKeeper/formulahousekeeper/customerBuler-crm/package-lock.json

@@ -9,10 +9,12 @@
       "version": "0.0.0",
       "dependencies": {
         "@element-plus/icons-vue": "^2.3.1",
+        "@zmjs/form-design": "^0.1.16",
         "axios": "^1.6.7",
         "echarts": "^5.5.0",
         "element-plus": "^2.5.6",
         "pinia": "^2.1.7",
+        "pinia-plugin-persistedstate": "^3.2.1",
         "vue": "^3.4.19",
         "vue-router": "^4.3.0"
       },
@@ -1023,6 +1025,119 @@
         }
       }
     },
+    "node_modules/@zmjs/form-design": {
+      "version": "0.1.16",
+      "resolved": "https://registry.npmjs.org/@zmjs/form-design/-/form-design-0.1.16.tgz",
+      "integrity": "sha512-RCjB1JbV1BKJrQ14jxez8WI72oKN3JXsMkLskZyni7tVEPjmTP8s/R3ZfFzchV0FVuZ4FZnRYNYrSDxBnpqmuw==",
+      "dependencies": {
+        "@vueuse/core": "^8.2.3",
+        "ace-builds": "^1.4.14",
+        "element-plus": "^2.1.10",
+        "lodash-es": "^4.17.21",
+        "prismjs": "^1.28.0",
+        "vue": "^3.2.31",
+        "vue-prism-editor": "^2.0.0-alpha.2",
+        "vuedraggable": "^4.1.0"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/zhiyuanzmj"
+      }
+    },
+    "node_modules/@zmjs/form-design/node_modules/@types/web-bluetooth": {
+      "version": "0.0.14",
+      "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.14.tgz",
+      "integrity": "sha512-5d2RhCard1nQUC3aHcq/gHzWYO6K0WJmAbjO7mQJgCQKtZpgXxv1rOM6O/dBDhDYYVutk1sciOgNSe+5YyfM8A=="
+    },
+    "node_modules/@zmjs/form-design/node_modules/@vueuse/core": {
+      "version": "8.9.4",
+      "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-8.9.4.tgz",
+      "integrity": "sha512-B/Mdj9TK1peFyWaPof+Zf/mP9XuGAngaJZBwPaXBvU3aCTZlx3ltlrFFFyMV4iGBwsjSCeUCgZrtkEj9dS2Y3Q==",
+      "dependencies": {
+        "@types/web-bluetooth": "^0.0.14",
+        "@vueuse/metadata": "8.9.4",
+        "@vueuse/shared": "8.9.4",
+        "vue-demi": "*"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      },
+      "peerDependencies": {
+        "@vue/composition-api": "^1.1.0",
+        "vue": "^2.6.0 || ^3.2.0"
+      },
+      "peerDependenciesMeta": {
+        "@vue/composition-api": {
+          "optional": true
+        },
+        "vue": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@zmjs/form-design/node_modules/@vueuse/core/node_modules/@vueuse/shared": {
+      "version": "8.9.4",
+      "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-8.9.4.tgz",
+      "integrity": "sha512-wt+T30c4K6dGRMVqPddexEVLa28YwxW5OFIPmzUHICjphfAuBFTTdDoyqREZNDOFJZ44ARH1WWQNCUK8koJ+Ag==",
+      "dependencies": {
+        "vue-demi": "*"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      },
+      "peerDependencies": {
+        "@vue/composition-api": "^1.1.0",
+        "vue": "^2.6.0 || ^3.2.0"
+      },
+      "peerDependenciesMeta": {
+        "@vue/composition-api": {
+          "optional": true
+        },
+        "vue": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@zmjs/form-design/node_modules/@vueuse/core/node_modules/vue-demi": {
+      "version": "0.14.7",
+      "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.7.tgz",
+      "integrity": "sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==",
+      "hasInstallScript": true,
+      "bin": {
+        "vue-demi-fix": "bin/vue-demi-fix.js",
+        "vue-demi-switch": "bin/vue-demi-switch.js"
+      },
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      },
+      "peerDependencies": {
+        "@vue/composition-api": "^1.0.0-rc.1",
+        "vue": "^3.0.0-0 || ^2.6.0"
+      },
+      "peerDependenciesMeta": {
+        "@vue/composition-api": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@zmjs/form-design/node_modules/@vueuse/metadata": {
+      "version": "8.9.4",
+      "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-8.9.4.tgz",
+      "integrity": "sha512-IwSfzH80bnJMzqhaapqJl9JRIiyQU0zsRGEgnxN6jhq7992cPUJIRfV+JHRIZXjYqbwt07E1gTEp0R0zPJ1aqw==",
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      }
+    },
+    "node_modules/ace-builds": {
+      "version": "1.32.7",
+      "resolved": "https://registry.npmjs.org/ace-builds/-/ace-builds-1.32.7.tgz",
+      "integrity": "sha512-ziv35kaYELFw4suWlotz/Xsl1/1LhWAbwFoD3zIgCgP9gXGECEsAM4GhiB0T0xZdmQjyv6hmAzO280g0+n4vGw=="
+    },
     "node_modules/ansi-regex": {
       "version": "6.0.1",
       "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
@@ -2066,6 +2181,14 @@
         }
       }
     },
+    "node_modules/pinia-plugin-persistedstate": {
+      "version": "3.2.1",
+      "resolved": "https://registry.npmjs.org/pinia-plugin-persistedstate/-/pinia-plugin-persistedstate-3.2.1.tgz",
+      "integrity": "sha512-MK++8LRUsGF7r45PjBFES82ISnPzyO6IZx3CH5vyPseFLZCk1g2kgx6l/nW8pEBKxxd4do0P6bJw+mUSZIEZUQ==",
+      "peerDependencies": {
+        "pinia": "^2.0.0"
+      }
+    },
     "node_modules/pinia/node_modules/vue-demi": {
       "version": "0.14.7",
       "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.7.tgz",
@@ -2248,6 +2371,14 @@
       "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
       "dev": true
     },
+    "node_modules/prismjs": {
+      "version": "1.29.0",
+      "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz",
+      "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==",
+      "engines": {
+        "node": ">=6"
+      }
+    },
     "node_modules/proxy-from-env": {
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
@@ -2481,6 +2612,11 @@
         "url": "https://github.com/sponsors/isaacs"
       }
     },
+    "node_modules/sortablejs": {
+      "version": "1.14.0",
+      "resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.14.0.tgz",
+      "integrity": "sha512-pBXvQCs5/33fdN1/39pPL0NZF20LeRbLQ5jtnheIPN9JQAaufGjKdWduZn4U7wCtVuzKhmRkI0DFYHYRbB2H1w=="
+    },
     "node_modules/source-map-js": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
@@ -2842,6 +2978,17 @@
         }
       }
     },
+    "node_modules/vue-prism-editor": {
+      "version": "2.0.0-alpha.2",
+      "resolved": "https://registry.npmjs.org/vue-prism-editor/-/vue-prism-editor-2.0.0-alpha.2.tgz",
+      "integrity": "sha512-Gu42ba9nosrE+gJpnAEuEkDMqG9zSUysIR8SdXUw8MQKDjBnnNR9lHC18uOr/ICz7yrA/5c7jHJr9lpElODC7w==",
+      "engines": {
+        "node": ">=10"
+      },
+      "peerDependencies": {
+        "vue": "^3.0.0"
+      }
+    },
     "node_modules/vue-router": {
       "version": "4.3.0",
       "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.3.0.tgz",
@@ -2883,6 +3030,17 @@
         "typescript": "*"
       }
     },
+    "node_modules/vuedraggable": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/vuedraggable/-/vuedraggable-4.1.0.tgz",
+      "integrity": "sha512-FU5HCWBmsf20GpP3eudURW3WdWTKIbEIQxh9/8GE806hydR9qZqRRxRE3RjqX7PkuLuMQG/A7n3cfj9rCEchww==",
+      "dependencies": {
+        "sortablejs": "1.14.0"
+      },
+      "peerDependencies": {
+        "vue": "^3.0.1"
+      }
+    },
     "node_modules/which": {
       "version": "2.0.2",
       "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",

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

@@ -11,10 +11,12 @@
   },
   "dependencies": {
     "@element-plus/icons-vue": "^2.3.1",
+    "@zmjs/form-design": "^0.1.16",
     "axios": "^1.6.7",
     "echarts": "^5.5.0",
     "element-plus": "^2.5.6",
     "pinia": "^2.1.7",
+    "pinia-plugin-persistedstate": "^3.2.1",
     "vue": "^3.4.19",
     "vue-router": "^4.3.0"
   },

+ 54 - 2
fhKeeper/formulahousekeeper/customerBuler-crm/src/App.vue

@@ -2,6 +2,58 @@
   <router-view></router-view>
 </template>
 
-<script setup lang="ts"></script>
+<script setup lang="ts">
+import { provide } from 'vue'
+import { useStore } from '@/store/index'
+import { ElNotification, NotificationParamsTyped } from 'element-plus'
+const { setAsyncRoutesMark } = useStore()
+window.addEventListener('beforeunload', () => beforeunloadFn())
+const beforeunloadFn = (() => {
+  setAsyncRoutesMark(false)
+})
 
-<style scoped></style>
+provide<GlobalPopup>('globalPopup', {
+  showSuccess: (message?: string) => {
+    notificationTiop({
+      message: message || '成功',
+      type: 'success',
+      title:"提示",
+      duration: 2000
+    })
+  }, //!SECTION 成功
+  showError: (message?: string) => notificationTiop({
+    message: message || '失败',
+    type: 'error',
+    title: "提示",
+    duration: 2000
+  }), //!SECTION 失败
+  showWarning: (message: string) => notificationTiop({
+    message,
+    type: 'warning',
+    title: "提示",
+    duration: 2000
+  }), //!SECTION 警告
+  showInfo: (message: string) => notificationTiop({
+    message,
+    type: 'info',
+    title: "提示",
+    duration: 2000
+  }), //!SECTION 文本
+})
+
+const notificationTiop = (options: NotificationParamsTyped) => {
+  ElNotification(options)
+}
+
+</script>
+
+<style>
+html,
+body,
+#app,
+.layouts {
+  width: 100%;
+  height: 100%;
+  overflow: hidden;
+}
+</style>

BIN
fhKeeper/formulahousekeeper/customerBuler-crm/src/assets/404.png


BIN
fhKeeper/formulahousekeeper/customerBuler-crm/src/assets/defaultCover.png


BIN
fhKeeper/formulahousekeeper/customerBuler-crm/src/assets/login/background.png


BIN
fhKeeper/formulahousekeeper/customerBuler-crm/src/assets/login/login_logo.png


BIN
fhKeeper/formulahousekeeper/customerBuler-crm/src/assets/login/qiyeweixin.png


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

@@ -4,12 +4,15 @@ import ElementPlus from 'element-plus'
 import "./TailWindCss/index.css";
 import 'element-plus/dist/index.css'
 import * as ElementPlusIconsVue from '@element-plus/icons-vue'
+import piniaPluginPersistedstate from 'pinia-plugin-persistedstate'
 import App from './App.vue'
 import router from './router/index'
-import "./styles.css"
 import * as echarts from 'echarts';
 
 const app = createApp(App)
+const pinia = createPinia()
+
+pinia.use(piniaPluginPersistedstate)
 
 for (const [key, component] of Object.entries(ElementPlusIconsVue)) {
   app.component(key, component)
@@ -20,4 +23,5 @@ app
   .use(ElementPlus)
   .use(createPinia())
   .use(router)
+  .use(pinia)
   .mount('#app')

+ 11 - 0
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/404.vue

@@ -0,0 +1,11 @@
+<template>
+  <div>
+    404
+  </div>
+</template>
+
+<script lang="ts" setup>
+
+</script>
+
+<style lang="scss" scoped></style>

+ 0 - 0
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/analysis/api.ts


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


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

@@ -0,0 +1,3 @@
+export const SENDVCODE = "/user/sendVcode";     //发送验证码
+export const REGISTER = "/user/insertCompany";  //注册
+export const LOGIN = "/user/loginAdmin";        //登录

+ 0 - 0
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/business/api.ts


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


+ 0 - 0
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/contacts/api.ts


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


+ 0 - 0
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/corpreport/api.ts


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


+ 0 - 0
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/customer/api.ts


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


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

@@ -0,0 +1,89 @@
+<template>
+  <div class="w-full h-full">
+    <el-container>
+      <el-header class="bg-sky-800 leading-10 flex flex-row justify-between">
+        <div class=" flex flex-row justify-start items-center text-white flex-1">
+          <div v-for="routerItem in routerList"
+            :class="`border-b-2 border-transparent hover:border-white p-2 mr-4 multipleyHeader ${activeRouter?.path === routerItem.path ? 'border-white' : ''}`"
+            :key="routerItem.path">
+            <div v-if="!routerItem.children" @click="setCurrentRouter(routerItem)">
+              {{ routerItem.name }}
+            </div>
+            <div v-else class="flex justify-center items-center">
+              <el-dropdown>
+                <div class="text-white w-full h-full headerText">
+                  {{ routerItem.name }}
+                  <el-icon class="el-icon--right">
+                    <arrow-down />
+                  </el-icon>
+                </div>
+                <template #dropdown>
+                  <el-dropdown-menu>
+                    <el-dropdown-item v-for="child in routerItem.children"
+                      :key="child.path"
+                      @click="setCurrentRouter(child)">
+                      {{ child.name }}
+                    </el-dropdown-item>
+                  </el-dropdown-menu>
+                </template>
+              </el-dropdown>
+            </div>
+          </div>
+        </div>
+        <div class="flex flex-row justify-start items-center text-white">
+          <el-icon :size="26" class="ml-4 cursor-pointer">
+            <Bell />
+          </el-icon>
+          <div>
+            <img class="w-8 h-8 rounded-full ml-4 cursor-pointer" :src="defaultCover" alt="" @click="logout()">
+          </div>
+          <el-icon :size="26" class="ml-4 cursor-pointer">
+            <Grid />
+          </el-icon>
+        </div>
+      </el-header>
+      <el-main>
+        <router-view />
+      </el-main>
+    </el-container>
+  </div>
+</template>
+
+<script lang="ts" setup>
+import { onMounted, ref } from 'vue';
+import { RouteRecordRaw, useRouter } from 'vue-router';
+import { useStore } from "@/store"
+import defaultCover from "@/assets/defaultCover.png";
+const { getRoutersList } = useStore()
+const router = useRouter();
+const routerList = ref<RouteRecordRaw[]>([]);
+const activeRouter = ref<RouteRecordRaw>();
+const setCurrentRouter = (item: RouteRecordRaw) => {
+  activeRouter.value = item;
+  if (item.children && item.children.length > 0) {
+    router.push({ path: item.children[0].path });
+    return
+  }
+  router.push({ path: item.path });
+};
+const logout = () => {
+  router.push({ path: '/login' });
+};
+onMounted(() => {
+  routerList.value = getRoutersList;
+  activeRouter.value = routerList.value.find((item) => item.path === router.currentRoute.value.path);
+  console.log("routerList", routerList);
+})
+
+</script>
+
+<style scoped lang="scss">
+.multipleyHeader {
+  height: 96%;
+  display: flex;
+  align-items: center;
+  .headerText {
+    font-size: 16px;
+  }
+}
+</style>

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

@@ -1,8 +0,0 @@
-<template>
-    <div>
-        indexyemian
-    </div>
-</template>
-<script setup lang="ts">
-</script>
-<style scoped lang="scss"></style>

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

@@ -1,118 +1,156 @@
 <template>
-    <div @click="tologin">登录</div>
-    <h2> {{ store.name }}</h2>
-    <h1 @click="changeName">修改名称</h1>
-    <el-tree :data="data" :props="defaultProps" @node-click="handleNodeClick" />
-    <div @click="networkRequest()">点击发起网络请求</div>
-    <div class="abc fonsSize30">测试sass样式</div>
-    <div class="text-pink-200">1111</div>
+  <div class="loginView w-screen h-screen overflow-hidden flex">
+    <div class="w-96 bg-white m-auto border-t-8 border-blue-400 shadow-xl rounded-md pl-9 pr-9">
+      <div class="m-auto pt-4">
+        <img class="w-1/5 h-1/5 m-auto" :src="loginLogo" alt="">
+      </div>
+      <h2 class="text-xl text-center pt-4 font-bold">客户管家</h2>
+      <el-form class="pt-4" ref="ruleFormRef" :model="ruleForm" :rules="rules">
+        <el-form-item prop="username">
+          <el-input clearable :prefix-icon="UserFilled" size="large" class="mt-2" v-model="ruleForm.username"
+            autocomplete="off" placeholder="账号/手机号" />
+        </el-form-item>
+        <el-form-item prop="password">
+          <el-input clearable :prefix-icon="Lock" show-password size="large" class="mt-4" v-model="ruleForm.password"
+            autocomplete="off" placeholder="密码" />
+        </el-form-item>
+        <div class="pt-4">
+          <el-button type="primary" size="large" class="w-full" :loading="loginLoading"
+            @click="login(ruleFormRef)">登录</el-button>
+        </div>
+      </el-form>
+      <el-divider content-position="center">或</el-divider>
+      <div class="m-auto mb-5">
+        <img class="w-9 m-auto p-1 rounded-full border-blue-300 border-2 cursor-pointer" :src="qiyeweixin" alt="">
+      </div>
+      <div class="flex justify-between pb-5">
+        <div class="cursor-pointer text-blue-400 hover:text-blue-300">联系客服</div>
+        <div class="flex justify-around">
+          <div class="mr-4 cursor-pointer text-blue-400 hover:text-blue-300" @click="useHelp()">使用说明</div>
+          <div class="cursor-pointer text-blue-400 hover:text-blue-300" @click="toRegister()">企业注册</div>
+        </div>
+      </div>
+      <el-dialog v-model="helpDialog" width="30%" title="使用说明">
+        <div class="p-2 text-xl">文档水水水水</div>
+        <div>文档水水水水</div>
+        <div>文档水水水水</div>
+      </el-dialog>
+    </div>
+  </div>
 </template>
-<script lang="ts" setup>
-
-import { useRouter } from 'vue-router'
-import { useStore } from "../store/index";
-import { post } from '@/utils/request'
 
-const router = useRouter()
-const store = useStore()
-function tologin() {
-    router.push({
-        name: 'index'
-    })
-}
-function changeName(): void {
-    store.name = '索索'
-}
+<script lang="ts" setup>
+import { reactive, ref, inject } from "vue";
+import { useRouter } from "vue-router";
+import loginLogo from "@/assets/login/login_logo.png";
+import qiyeweixin from "@/assets/login/qiyeweixin.png";
+import { UserFilled, Lock } from '@element-plus/icons-vue'
+import { type FormInstance, type FormRules } from 'element-plus'
+import { useStore } from '@/store/index'
+import { post } from "@/utils/request";
+import { LOGIN } from "./api";
+const { setRouters } = useStore()
+const router = useRouter();
+const globalPopup = inject<GlobalPopup>('globalPopup')
+const ruleFormRef = ref<FormInstance>();
+const ruleForm = ref({
+  username: "",
+  password: "",
+});
+const loginLoading = ref(false);
+const rules = reactive<FormRules<typeof ruleForm>>({
+  username: [{ required: true, trigger: "blur", message: "请输入账号/手机号" }],
+  password: [{ required: true, trigger: "blur", message: "请输入密码" }],
+})
+const helpDialog = ref(false);
 
-async function networkRequest(): Promise<void> {
-    console.log('发起请求')
-    const requestUrl = '/user/loginAdmin'
-    const data = {
-        username: '18130408100',
-        password: '220926'
+const login = (formEl: FormInstance | undefined) => {
+  if (!formEl) {
+    return
+  }
+  formEl.validate((valid) => {
+    if (!valid) {
+      return false;
     }
-    // proxy.$post(requestUrl, data)
-    // .then((response: any) => {
-    //     console.log(response, '<=== 请求返回的数据')
-    // })
-    const res = await post(requestUrl, data)
-    console.log(res, '<=== 请求返回的数据')
-}
-
-
-interface Tree {
-    label: string
-    children?: Tree[]
-}
-
-const handleNodeClick = (data: Tree) => {
-    console.log(data)
-}
-
-const data: Tree[] = [
-    {
-        label: 'Level one 1',
-        children: [
-            {
-                label: 'Level two 1-1',
-                children: [
-                    {
-                        label: 'Level three 1-1-1',
-                    },
-                ],
-            },
-        ],
-    },
-    {
-        label: 'Level one 2',
-        children: [
-            {
-                label: 'Level two 2-1',
-                children: [
-                    {
-                        label: 'Level three 2-1-1',
-                    },
-                ],
-            },
-            {
-                label: 'Level two 2-2',
-                children: [
-                    {
-                        label: 'Level three 2-2-1',
-                    },
-                ],
-            },
-        ],
-    },
-    {
-        label: 'Level one 3',
+    loginLoading.value = true;
+    console.log(ruleForm.value);
+    globalPopup?.showSuccess();
+    let newRouter = [
+      {
+        path: '/thread',
+        name: '线索'
+      }, {
+        path: "/tasks",
+        name: "任务"
+      }, {
+        path: "/system",
+        name: "系统",
         children: [
-            {
-                label: 'Level two 3-1',
-                children: [
-                    {
-                        label: 'Level three 3-1-1',
-                    },
-                ],
-            },
-            {
-                label: 'Level two 3-2',
-                children: [
-                    {
-                        label: 'Level three 3-2-1',
-                    },
-                ],
-            },
-        ],
-    },
-]
+          {
+            path: "/role",
+            name: "角色管理"
+          }, {
+            path: "/dictionary",
+            name:"系统字典"
+          }
+        ]
+      }
+    ]
+    setRouters(newRouter)
+    setTimeout(() => {
+      loginLoading.value = false;
+      router.push(newRouter[0].path);
+    }, 1000);
+    return
+    post(LOGIN, { ...ruleForm.value }).then(res => {
+      console.log(res);
+      // if(res.code == 'error') {
+      //   ElMessage.error({
+      //     message: "登录失败",
+      //     type: "error",
+      //     duration: 2000,
+      //   })
+      //   loginLoading.value = false;
+      //   return
+      // }
+      // ElMessage.success({
+      //   message: "登录成功",
+      //   type: "success",
+      //   duration: 2000,
+      // })
+      // setTimeout(() => {
+      //   loginLoading.value = false;
+      // }, 1000)
+      // loginLoading.value = false;
+    }).catch(err => {
+      console.log(err)
+      loginLoading.value = false;
+    })
+    return
+    // let newRouter = [
+    //   {
+    //     path: '/thread',
+    //     name: 'thread'
+    //   }
+    // ]
+    // setRouters(newRouter)
+    // setTimeout(() => {
+    //   loginLoading.value = false;
+    //   router.push(newRouter[0].path);
+    // }, 1000);
+  })
 
-const defaultProps = {
-    children: 'children',
-    label: 'label',
+};
+const useHelp = () => {
+  helpDialog.value = true;
+}
+const toRegister = () => {
+  router.push("/register");
 }
-
 </script>
 
-<style lang="scss" scoped></style>
-
+<style lang="scss" scoped>
+.loginView {
+  background: #f0f2f5 url("../assets/login/background.png") no-repeat;
+}
+</style>

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


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


+ 0 - 0
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/product/api.ts


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


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

@@ -0,0 +1,180 @@
+<template>
+  <div class="loginView w-screen h-screen overflow-hidden flex">
+    <div class="w-[32rem] bg-white m-auto border-t-8 border-blue-400 shadow-xl rounded-md pl-9 pr-9">
+      <h2 class="text-xl text-center pt-4 font-bold">注册</h2>
+      <el-form class="pt-4" ref="ruleFormRef" :model="ruleForm" :rules="rules">
+        <el-form-item class="pt-1" prop="companyName">
+          <el-input type="text" size="large" v-model="ruleForm.companyName" autocomplete="off" placeholder="公司名"
+            clearable :prefix-icon="HomeFilled"></el-input>
+        </el-form-item>
+        <el-form-item class="pt-1" prop="name">
+          <el-input type="text" size="large" v-model="ruleForm.name" autocomplete="off" placeholder="姓名" clearable
+            :prefix-icon="UserFilled"></el-input>
+        </el-form-item>
+        <el-form-item class="pt-1" prop="phone">
+          <el-input type="text" size="large" v-model="ruleForm.phone" autocomplete="off" placeholder="手机号" clearable
+            :prefix-icon="Iphone"></el-input>
+        </el-form-item>
+        <el-form-item class="pt-1" prop="vcode">
+          <el-input type="text" size="large" v-model="ruleForm.vcode" autocomplete="off" placeholder="验证码" clearable
+            :prefix-icon="Tickets">
+            <template #append>
+              <el-button @click="sendVcode()" :disabled="ruleForm.phone == '' || showTimer">发送验证码<span
+                  v-if="showTimer">({{ countNum }})</span></el-button>
+            </template>
+          </el-input>
+        </el-form-item>
+        <el-form-item class="pt-1" prop="password">
+          <el-input type="password" size="large" v-model="ruleForm.password" autocomplete="off"
+            placeholder="设置密码,长度不低于6位" clearable :prefix-icon="Lock">
+          </el-input>
+        </el-form-item>
+        <el-form-item class="pt-1" prop="repwd">
+          <el-input type="password" size="large" v-model="ruleForm.repwd" autocomplete="off" placeholder="重复密码"
+            clearable :prefix-icon="Lock">
+          </el-input>
+        </el-form-item>
+        <div class="pt-4 mb-5">
+          <el-button type="primary" size="large" class="w-full" :loading="registerLoading"
+            @click="register(ruleFormRef)">注册</el-button>
+        </div>
+      </el-form>
+      <div class="text-right mb-5 cursor-pointer text-blue-400 hover:text-blue-300" @click="router.push('/login')">
+        已有账号?返回登录
+      </div>
+    </div>
+  </div>
+</template>
+
+<script lang="ts" setup>
+import { inject, reactive, ref } from "vue";
+import { useRouter, useRoute } from "vue-router";
+import { HomeFilled, UserFilled, Lock, Iphone, Tickets } from '@element-plus/icons-vue'
+import { ElNotification, ElMessage, type FormInstance, type FormRules } from 'element-plus'
+import { isValueEmpty } from "@/utils/tools";
+import { post } from "@/utils/request";
+import { REGISTER, SENDVCODE } from "./api";
+const globalPopup = inject<GlobalPopup>('globalPopup')
+const router = useRouter();
+const route = useRoute();
+const ruleFormRef = ref<FormInstance>();
+const ruleForm = ref({
+  companyName: "",
+  name: "",
+  phone: "",
+  vcode: "",
+  password: "",
+  repwd: ""
+});
+const rules = reactive<FormRules<typeof ruleForm>>({
+  companyName: [{ required: true, message: '请输入公司名', trigger: 'blur' },],
+  name: [{ required: true, message: '请输入姓名', trigger: 'blur' },],
+  phone: [
+    { required: true, message: '请输入手机号', trigger: 'blur' },
+    { min: 11, max: 11, message: '请输入正确的手机号', trigger: 'blur' },
+  ],
+  vcode: [
+    { required: true, message: '请输入验证码', trigger: 'blur' },
+  ],
+  password: [
+    { required: true, message: '请设置密码,长度不低于6位', trigger: 'blur' },
+    { min: 6, message: '密码长度不少于6位', trigger: 'blur' },
+  ],
+  repwd: [
+    { required: true, message: '请重复输入密码', trigger: 'blur' },
+    {
+      validator: (_rule, value, callback) => {
+        if (value !== ruleForm.value.password) {
+          callback(new Error('两次密码不一致'));
+        } else {
+          callback();
+        }
+      }, trigger: 'blur'
+    }
+  ]
+})
+
+const registerLoading = ref(false);
+const showTimer = ref(false);
+const countNum = ref(10);
+const countDown = () => {
+  if (countNum.value > 0) {
+    setTimeout(() => {
+      countNum.value -= 1;
+      countDown()
+    }, 1000)
+  } else {
+    showTimer.value = false;
+    countNum.value = 10;
+  }
+}
+const sendVcode = () => {
+  showTimer.value = true;
+  countDown();
+  if (ruleForm.value.phone.trim().length != 11) {
+    ElMessage.error({
+      message: "请输入正确的手机号",
+      type: "error",
+      duration: 2000,
+    })
+    return
+  }
+  post(SENDVCODE, {
+    mobile: ruleForm.value.phone
+  }).then(res => {
+    if (res.code == "ok") {
+      ElMessage.success({
+        message: "发送成功",
+        type: "success",
+        duration: 2000,
+      })
+      showTimer.value = true;
+      countDown();
+    }
+  })
+}
+const register = (formEl: FormInstance | undefined) => {
+  if (!formEl) {
+    return
+  }
+
+  formEl.validate((valid) => {
+    if (!valid) {
+      return false;
+    }
+    registerLoading.value = true;
+    let params = {
+      ...ruleForm.value,
+    }
+    /* 如果地址栏有参数,就带上 */
+    if (!isValueEmpty(route.query)) {
+      params = {
+        ...params,
+        ...route.query
+      }
+    }
+    post(REGISTER, params).then(res => {
+      if (res.code == "ok") {
+        globalPopup?.showSuccess("注册成功")
+        registerLoading.value = false;
+        router.back()
+      } else {
+        globalPopup?.showError(res.message || res.msg || "注册失败")
+        registerLoading.value = false;
+      }
+    }).catch(err => {
+      globalPopup?.showError(err.message || err.msg || "注册失败")
+      registerLoading.value = false;
+    })
+
+  })
+
+};
+
+</script>
+
+<style lang="scss" scoped>
+.loginView {
+  background: #f0f2f5 url("../assets/login/background.png") no-repeat;
+}
+</style>

+ 0 - 0
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/system/api.ts


+ 0 - 0
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/system/dictionary/api.ts


+ 10 - 0
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/system/dictionary/index.vue

@@ -0,0 +1,10 @@
+<template>
+<div>
+  系统字典
+</div>
+</template>
+<script lang="ts" setup>
+
+</script>
+<style lang="scss" scoped>
+</style>

+ 11 - 0
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/system/index.vue

@@ -0,0 +1,11 @@
+<template>
+  <div>
+    <router-view></router-view>
+  </div>
+</template>
+
+<script lang="ts" setup>
+
+</script>
+
+<style lang="scss" scoped></style>

+ 0 - 0
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/system/role/api.ts


+ 12 - 0
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/system/role/index.vue

@@ -0,0 +1,12 @@
+<template>
+  <div>
+    角色权限
+    <div>左右</div>
+    <div></div>
+  </div>
+</template>
+<script lang="ts" setup>
+
+</script>
+<style lang="scss" scoped>
+</style>

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


+ 11 - 0
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/tasks/index.vue

@@ -0,0 +1,11 @@
+<template>
+  <div>
+    任务
+  </div>
+</template>
+
+<script lang="ts" setup>
+
+</script>
+
+<style lang="scss" scoped></style>

+ 0 - 0
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/team/api.ts


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

@@ -0,0 +1,11 @@
+<template>
+  <div>
+    团队
+  </div>
+</template>
+
+<script lang="ts" setup>
+
+</script>
+
+<style lang="scss" scoped></style>

+ 1 - 0
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/thread/api.ts

@@ -0,0 +1 @@
+export const TEST_API = "/api/test"; //发送验证码

+ 9 - 0
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/thread/index.vue

@@ -0,0 +1,9 @@
+<template>
+<div id="" class="h100">
+    线索文件
+</div>
+</template>
+<script setup lang="ts">
+</script>
+<style scoped lang="scss">
+</style>

+ 96 - 34
fhKeeper/formulahousekeeper/customerBuler-crm/src/router/index.ts

@@ -1,36 +1,98 @@
-import { createRouter, createWebHistory, } from 'vue-router'
-import Login from '../pages/login.vue';
+import { RouteRecordRaw, createRouter, createWebHistory } from "vue-router";
+import { useStore } from "@/store/index";
+export const routes: RouteRecordRaw[] = [
+  {
+    path: "/",
+    redirect: "/login",
+  },
+  {
+    name: "login",
+    path: "/login",
+    component: () => import("../pages/login.vue"),
+  },
+  {
+    name: "register",
+    path: "/register",
+    component: () => import("../pages/register.vue"),
+  },
+  {
+    name: "home",
+    path: "/home",
+    component: () => import("../pages/home.vue"),
+    children: [
+      // {
+      //     name: 'thread',
+      //     path: '/thread',
+      //     component: () => import("../pages/thread/thread.vue")
+      // },
+    ],
+  },
+  {
+    name: "test",
+    path: "/test",
+    component: () => import("../pages/test/index.vue"),
+  },
+  {
+    name: "testEcharts",
+    path: "/testEcharts",
+    component: () => import("../pages/test/echarts.vue"),
+  },
+];
 
-export const routes = [
-    {
-        path: '/',
-        redirect: '/login'
-    },
-    {
-        name: 'login',
-        path: '/login',
-        component: Login
-    },
-    {
-        name: 'index',
-        path: '/index',
-        component: () => import("../pages/index.vue")
-    }, {
-        name: "test",
-        path: "/test",
-        component: () => import("../pages/test/index.vue")
-    }, {
-        name: "testEcharts",
-        path: "/testEcharts",
-        component: () => import("../pages/test/echarts.vue")
-    }
-]
 const router = createRouter({
-    scrollBehavior: () => ({ left: 0, top: 0 }),
-    history: createWebHistory(),
-    routes,
-})
-router.beforeEach((_to, _from, next) => {
-    next()
-})
-export default router
+  scrollBehavior: () => ({ left: 0, top: 0 }),
+  history: createWebHistory(),
+  routes,
+});
+router.beforeEach((to, _from, next) => {
+  const routerList = useStore().routers;
+  const routers = router.getRoutes();
+  console.log(routerList, routers);
+  const { setAsyncRoutesMark, asyncRoutesMark } = useStore();
+  const token = true;
+  const skipPath = ["/login", "/register", "/test", "/testEcharts"];
+  if (skipPath.includes(to.path)) {
+    next();
+  } else {
+    if (token && routerList && routerList.length > 0) {
+      if (asyncRoutesMark) {
+        next();
+      } else {
+        setAsyncRoutesMark(true);
+        const newRouters: any = routers;
+        const addNewRouter = newRouters.find(
+          (item: any) => item.path == "/home"
+        );
+        routerList.forEach((item: any) => {
+          let filePath = item.path.split("/")[1];
+          if (item.children && item.children.length > 0) {
+            item.children.forEach((child: any) => {
+              let childFilePath = child.path.split("/")[1];
+              addNewRouter?.children.push({
+                path: child.path,
+                name: child.name,
+                meta: {},
+                component: () =>
+                  import(`@/pages/${filePath}/${childFilePath}/index.vue`),
+              });
+            });
+          } else {
+            addNewRouter?.children.push({
+              path: item.path,
+              name: item.name,
+              meta: {},
+              component: () => import(`@/pages/${filePath}/index.vue`),
+            });
+          }
+        });
+        router.addRoute(addNewRouter);
+        next({ ...to, replace: true });
+      }
+    } else {
+      console.log("无登录信息,跳转到登录页");
+      next(`/login`);
+    }
+  }
+  console.log(routerList);
+});
+export default router;

+ 22 - 11
fhKeeper/formulahousekeeper/customerBuler-crm/src/store/index.ts

@@ -1,18 +1,29 @@
 import { defineStore, acceptHMRUpdate } from "pinia";
+import { RouteRecordRaw } from "vue-router";
 export const useStore = defineStore({
-    id: "index",
-    state: () => ({name: "old name",}),
-    getters: {
-        myName: (state) => {
-            return `getters ${state.name}`
-        }
+  id: "index",
+  state: () => ({
+    userInfo: {}, // 当前的用户信息
+    routers: [], // 返回的所有路由
+    asyncRoutesMark: false, // 是否添加过路由
+  }),
+  getters: {
+    // 取值
+    getRoutersList(): RouteRecordRaw[] {
+      return this.routers;
+    } 
+  },
+  actions: {
+    // 方法
+    setRouters(arr: any) {
+      this.routers = arr;
     },
-    actions: {
-        changeName(name: string) {
-            this.name = name
-        }
+    setAsyncRoutesMark(val: boolean) {
+      this.asyncRoutesMark = val;
     },
+  },
+  persist: true, // 是否持久化
 });
 if (import.meta.hot) {
-    import.meta.hot.accept(acceptHMRUpdate(useStore, import.meta.hot))
+  import.meta.hot.accept(acceptHMRUpdate(useStore, import.meta.hot));
 }

+ 0 - 80
fhKeeper/formulahousekeeper/customerBuler-crm/src/styles.css

@@ -1,80 +0,0 @@
-:root {
-    font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif;
-    line-height: 1.5;
-    font-weight: 400;
-  
-    color-scheme: light dark;
-    color: rgba(255, 255, 255, 0.87);
-    background-color: #242424;
-  
-    font-synthesis: none;
-    text-rendering: optimizeLegibility;
-    -webkit-font-smoothing: antialiased;
-    -moz-osx-font-smoothing: grayscale;
-  }
-  
-  a {
-    font-weight: 500;
-    color: #646cff;
-    text-decoration: inherit;
-  }
-  a:hover {
-    color: #535bf2;
-  }
-  
-  body {
-    margin: 0;
-    display: flex;
-    place-items: center;
-    min-width: 320px;
-    min-height: 100vh;
-  }
-  
-  h1 {
-    font-size: 3.2em;
-    line-height: 1.1;
-  }
-  
-  button {
-    border-radius: 8px;
-    border: 1px solid transparent;
-    padding: 0.6em 1.2em;
-    font-size: 1em;
-    font-weight: 500;
-    font-family: inherit;
-    background-color: #1a1a1a;
-    cursor: pointer;
-    transition: border-color 0.25s;
-  }
-  button:hover {
-    border-color: #646cff;
-  }
-  button:focus,
-  button:focus-visible {
-    outline: 4px auto -webkit-focus-ring-color;
-  }
-  
-  .card {
-    padding: 2em;
-  }
-  
-  #app {
-    max-width: 1280px;
-    margin: 0 auto;
-    padding: 2rem;
-    text-align: center;
-  }
-  
-  @media (prefers-color-scheme: light) {
-    :root {
-      color: #213547;
-      background-color: #ffffff;
-    }
-    a:hover {
-      color: #747bff;
-    }
-    button {
-      background-color: #f9f9f9;
-    }
-  }
-  

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

@@ -0,0 +1,17 @@
+$darkBlue: #3475C5;
+$ashen: #FEFEFE;
+$backColor: #EEF3F6;
+$black: #000;
+$fontBlack: #333;
+$fontGray: #999;
+$modena: #6F4AFE;
+
+.text-gray{
+    color : $fontGray
+}
+.text-black {
+    color : $fontBlack
+}
+.back-dark {
+    background-color : $darkBlue
+}

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

@@ -0,0 +1,6 @@
+interface GlobalPopup extends Notify {
+  showSuccess: (message?: string) => void;
+  showError: (message?: string) => void;
+  showWarning: (message: string) => void;
+  showInfo: (message: string) => void;
+}

+ 6 - 6
fhKeeper/formulahousekeeper/customerBuler-crm/src/utils/request.ts

@@ -2,10 +2,10 @@ import axios from "axios";
 import { showMessage } from "./errorStatusCode"; // 引入状态码文件
 import type { AxiosRequestConfig, AxiosResponse, AxiosError } from "axios";
 import { ElNotification } from "element-plus";
-
+const baseURL = "/api";
 // 创建axios实例
 const instance = axios.create({
-  baseURL: "/api", // 设置API的基础URL
+  baseURL, // 设置API的基础URL
 });
 
 // 请求拦截器
@@ -42,9 +42,9 @@ instance.interceptors.response.use(
 );
 
 // 封装GET请求
-export async function get<T>(url: string, params?: any): Promise<T> {
+export async function get(url: string, params?: any): Promise<any> {
   return instance
-    .get<T>(url, { params })
+    .get(url, { params })
     .then((response) => response.data)
     .catch((error) => {
       throw error;
@@ -52,9 +52,9 @@ export async function get<T>(url: string, params?: any): Promise<T> {
 }
 
 // 封装POST请求
-export async function post<T>(url: string, data?: any): Promise<T> {
+export async function post(url: string, data?: any): Promise<any> {
   return instance
-    .post<T>(url, data, {
+    .post(url, data, {
       headers: {
         "Content-type": " application/x-www-form-urlencoded; charset=UTF-8",
       },

+ 22 - 0
fhKeeper/formulahousekeeper/customerBuler-crm/src/utils/tools.ts

@@ -0,0 +1,22 @@
+export function isValueEmpty(value: any): boolean {
+  if (value === null || value === undefined) {
+    return true;
+  }
+  if (typeof value === "string" && value.trim() === "") {
+    return true;
+  }
+  if (Array.isArray(value) && value.length === 0) {
+    return true;
+  }
+  if (
+    typeof value === "object" &&
+    !Array.isArray(value) &&
+    Object.keys(value).length === 0
+  ) {
+    return true;
+  }
+  if (typeof value === "symbol" && value.toString() === "Symbol()") {
+    return true;
+  }
+  return false;
+}

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

@@ -23,7 +23,8 @@
     "noFallthroughCasesInSwitch": true,
     "paths": {
       "@/*": ["./src/*"]
-    }
+    },
+    "types": ["element-plus/global"]
   },
   "include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.vue"],
   "references": [{ "path": "./tsconfig.node.json" }]

File diff suppressed because it is too large
+ 29048 - 0
fhKeeper/formulahousekeeper/management-crm/crm.log


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

@@ -1,8 +1,14 @@
 package com.management.platform.controller;
 
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.management.platform.entity.Clue;
+import com.management.platform.entity.SysDict;
+import com.management.platform.entity.User;
+import com.management.platform.mapper.SysDictMapper;
+import com.management.platform.mapper.UserMapper;
 import com.management.platform.service.ClueService;
+import com.management.platform.service.UserService;
 import com.management.platform.util.HttpRespMsg;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.RequestBody;
@@ -11,7 +17,10 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 /**
  * <p>
@@ -26,17 +35,55 @@ import java.util.List;
 public class ClueController {
     @Resource
     private ClueService clueService;
+    @Resource
+    private UserMapper userMapper;
+
+    @Resource
+    private SysDictMapper sysDictMapper;
 
-//    @RequestMapping("listClue")
-//    public Object list(@RequestBody Clue clue){
-//        clueService.getList(clue);
-//        return
-//    }
-    @RequestMapping("/inserANdUpdate")
-    public Object inserANdUpdate(@RequestBody Clue clue){
+
+    @RequestMapping("getClueSources")
+    public Object getClueSources(){
+        QueryWrapper<SysDict> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("code", "ClueSources");
+        return sysDictMapper.selectList(queryWrapper);
+    }
+    @RequestMapping("getDetail")
+    public Object getDetail(@RequestBody Clue clue){
+        HttpRespMsg msg = new HttpRespMsg();
+        msg.setData(clueService.getInfo(clue));
+        return msg;
+    }
+    @RequestMapping("listClue")
+    public Object list(@RequestBody Clue clue, HttpServletRequest request){
+        //TODO token待定
+        // User user = userMapper.selectById(request.getHeader(  "Token"));
+        // clue.setCompanyId(user.getCompanyId());
+        List<Clue> list =  clueService.getList(clue);
+        HashMap<Object, Object> map = new HashMap<>();
+        map.put("data",list);
+        map.put("total",clueService.getTotal(clue));
+        return map;
+    }
+    @RequestMapping("listDeleterClue")
+    public Object listDeleterClue(@RequestBody Clue clue, HttpServletRequest request){
+        //TODO token待定
+        // User user = userMapper.selectById(request.getHeader(  "Token"));
+        // clue.setCompanyId(user.getCompanyId());
+        List<Clue> list =  clueService.getDeleterList(clue);
+        HashMap<Object, Object> map = new HashMap<>();
+        map.put("data",list);
+        map.put("total",clueService.getDeleterTotal(clue));
+        return map;
+    }
+    @RequestMapping("/insertAndUpdate")
+    public Object inserANdUpdate(@RequestBody Clue clue, HttpServletRequest request){
         HttpRespMsg msg = new HttpRespMsg();
         //操作前校验
-        if (null == clue.getClueName() || "" == clue.getClueName()){
+        //TODO token待定
+        // User user = userMapper.selectById(request.getHeader(  "Token"));
+        // Integer companyId = user.getCompanyId();
+        if (null == clue.getClueName() || "".equals(clue.getClueName())){
             msg.setError("线索名称不能为空");
             return msg;
         }
@@ -51,7 +98,12 @@ public class ClueController {
             msg.setMsg("操作成功");
         }else {
             //新增
+            //TODO token待定
+            // clue.setCompanyId(companyId);
+            // clue.setCreateId(user.getId());
+
             clueService.insert(clue);
+
             msg.setMsg("操作成功");
         }
         return  msg;
@@ -66,5 +118,23 @@ public class ClueController {
         return msg;
     }
 
+    @RequestMapping("rollback")
+    public Object rollback(@RequestBody List<Integer> ids){
+        HttpRespMsg msg = new HttpRespMsg();
+        msg.setMsg("操作成功");
+        clueService.isRollback(ids);
+        return msg;
+    }
+    @RequestMapping("deleterDelete")
+    public Object deleterDelete(@RequestBody List<Integer> ids){
+        HttpRespMsg msg = new HttpRespMsg();
+        msg.setMsg("操作成功");
+        clueService.deleterDelete(ids);
+        return msg;
+    }
+
+
+
+
 }
 

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

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

+ 107 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/SysDictController.java

@@ -1,10 +1,26 @@
 package com.management.platform.controller;
 
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.management.platform.entity.Clue;
+import com.management.platform.entity.Custom;
+import com.management.platform.entity.SysDict;
+import com.management.platform.entity.SysForm;
+import com.management.platform.mapper.UserMapper;
+import com.management.platform.service.ClueService;
+import com.management.platform.service.CustomService;
+import com.management.platform.service.SysDictService;
+import com.management.platform.service.SysFormService;
+import com.management.platform.util.HttpRespMsg;
 import org.springframework.web.bind.annotation.RequestMapping;
 
+import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+
 /**
  * <p>
  *  前端控制器
@@ -16,6 +32,97 @@ import org.springframework.web.bind.annotation.RestController;
 @RestController
 @RequestMapping("/sys-dict")
 public class SysDictController {
+    @Resource
+    private SysDictService sysDictService;
+    @Resource
+    private HttpServletRequest request;
+    @Resource
+    private UserMapper userMapper;
+    @Resource
+    private ClueService clueService;
+    @Resource
+    private CustomService customService;
+
+
+    @RequestMapping("/list")
+    public HttpRespMsg list(){
+        HttpRespMsg msg=new HttpRespMsg();
+        Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
+        List<SysDict> list = sysDictService.list(new LambdaQueryWrapper<SysDict>().eq(SysDict::getCompanyId, companyId));
+        msg.setData(list);
+        return msg;
+    }
+
+    @RequestMapping("/getListByCode")
+    public HttpRespMsg getListByCode(@RequestParam String code){
+        HttpRespMsg msg=new HttpRespMsg();
+        Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
+        List<SysDict> sysDictList = sysDictService.list(new LambdaQueryWrapper<SysDict>().eq(SysDict::getCompanyId, companyId).eq(SysDict::getCode, code).orderByAsc(SysDict::getSeq));
+        msg.setData(sysDictList);
+        return msg;
+    }
+
+    @RequestMapping("addOrUpdate")
+    public HttpRespMsg addOrUpdate(SysDict sysDict){
+        HttpRespMsg msg=new HttpRespMsg();
+        Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
+        sysDict.setCompanyId(companyId);
+        Integer count;
+        if(sysDict.getId()==null){
+            count = sysDictService.count(new LambdaQueryWrapper<SysDict>().eq(SysDict::getCode, sysDict.getCode()).eq(SysDict::getName,sysDict.getName()).eq(SysDict::getCompanyId, companyId));
+        }else {
+            count = sysDictService.count(new LambdaQueryWrapper<SysDict>().ne(sysDict.getId()!=null,SysDict::getId, sysDict.getId()).eq(SysDict::getName,sysDict.getName()).eq(SysDict::getCode, sysDict.getCode()).eq(SysDict::getCompanyId, companyId));
+        }
+        if(count>0){
+            msg.setError("名称为["+sysDict.getName()+"]的自定义配置名称已存在");
+            return msg;
+        }
+
+        if(!sysDictService.saveOrUpdate(sysDict)){
+            msg.setError("验证失败");
+        };
+        return msg;
+    }
 
+    @RequestMapping("/delete")
+    public HttpRespMsg delete(Integer id,String code){
+        HttpRespMsg msg=new HttpRespMsg();
+        Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
+        int count;
+        switch (code){
+            case "ClueSources":
+                count= clueService.count(new LambdaQueryWrapper<Clue>().eq(Clue::getCompanyId, companyId).eq(Clue::getClueSourceId, id));
+                if(count>0){
+                    msg.setError("当前线索来源数据已被使用无法删除");
+                    return msg;
+                }
+                break;
+            case "CustomLevel":
+                count = customService.count(new LambdaQueryWrapper<Custom>().eq(Custom::getCompanyId, companyId).eq(Custom::getCustomerLevelId, id));
+                if(count>0){
+                    msg.setError("当前客户级别数据已被使用无法删除");
+                    return msg;
+                }
+                break;
+            case "CustomSources":
+                count = customService.count(new LambdaQueryWrapper<Custom>().eq(Custom::getCompanyId, companyId).eq(Custom::getCustomSourceId, id));
+                if(count>0){
+                    msg.setError("当前客户来源数据已被使用无法删除");
+                    return msg;
+                }
+                break;
+            case "CustomIndustry":
+                count = customService.count(new LambdaQueryWrapper<Custom>().eq(Custom::getCompanyId, companyId).eq(Custom::getCustomerIndustryId, id));
+                if(count>0){
+                    msg.setError("当前客户行业数据已被使用无法删除");
+                    return msg;
+                }
+                break;
+        }
+        if(!sysDictService.removeById(id)){
+            msg.setError("验证失败");
+        }
+        return msg;
+    }
 }
 

+ 86 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/SysFormController.java

@@ -0,0 +1,86 @@
+package com.management.platform.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.management.platform.entity.SysForm;
+import com.management.platform.mapper.UserMapper;
+import com.management.platform.service.SysFormService;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Priority;
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2024-03-04
+ */
+@RestController
+@RequestMapping("/sys-form")
+public class SysFormController {
+    @Resource
+    private SysFormService sysFormService;
+    @Resource
+    private HttpServletRequest request;
+    @Resource
+    private UserMapper userMapper;
+
+
+    @RequestMapping("/list")
+    public HttpRespMsg list(){
+        HttpRespMsg msg=new HttpRespMsg();
+        Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
+        List<SysForm> list = sysFormService.list(new LambdaQueryWrapper<SysForm>().eq(SysForm::getCompanyId, companyId));
+        msg.setData(list);
+        return msg;
+    }
+
+    @RequestMapping("/getListByCode")
+    public HttpRespMsg getListByCode(@RequestParam String code){
+        HttpRespMsg msg=new HttpRespMsg();
+        Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
+        List<SysForm> sysFormList = sysFormService.list(new LambdaQueryWrapper<SysForm>().eq(SysForm::getCompanyId, companyId).eq(SysForm::getCode, code));
+        msg.setData(sysFormList);
+        return msg;
+    }
+
+    @RequestMapping("addOrUpdate")
+    public HttpRespMsg addOrUpdate(SysForm sysForm){
+        HttpRespMsg msg=new HttpRespMsg();
+        Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
+        sysForm.setCompanyId(companyId);
+        Integer count;
+        if(sysForm.getId()==null){
+            count = sysFormService.count(new LambdaQueryWrapper<SysForm>().eq(SysForm::getCode, sysForm.getCode()).eq(SysForm::getName,sysForm.getName()).eq(SysForm::getCompanyId, companyId));
+        }else {
+            count = sysFormService.count(new LambdaQueryWrapper<SysForm>().ne(sysForm.getId()!=null,SysForm::getId, sysForm.getId()).eq(SysForm::getName,sysForm.getName()).eq(SysForm::getCode, sysForm.getCode()).eq(SysForm::getCompanyId, companyId));
+        }
+        if(count>0){
+            msg.setError("名称为["+sysForm.getName()+"]的自定义模板配置已存在");
+            return msg;
+        }
+        if(!sysFormService.saveOrUpdate(sysForm)){
+            msg.setError("验证失败");
+        };
+        return msg;
+    }
+
+    @RequestMapping("/delete")
+    public HttpRespMsg delete(Integer id){
+        HttpRespMsg msg=new HttpRespMsg();
+        if(!sysFormService.removeById(id)){
+            msg.setError("验证失败");
+        }
+        return msg;
+    }
+}
+

+ 14 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/Clue.java

@@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableField;
 import java.io.Serializable;
 import java.util.Date;
+import java.util.List;
 
 import lombok.Data;
 import lombok.EqualsAndHashCode;
@@ -34,6 +35,9 @@ public class Clue extends Model<Clue> {
      */
     @TableField("company_id")
     private Integer companyId;
+    //创建人
+    @TableField("create_id")
+    private String createId;
 
     /**
      * 线索名称
@@ -41,6 +45,8 @@ public class Clue extends Model<Clue> {
     @TableField("clue_name")
     private String clueName;
 
+    private String companyName;
+
     /**
      * 线索来源
      */
@@ -130,6 +136,14 @@ public class Clue extends Model<Clue> {
      */
     @TableField("create_time")
     private Date createTime;
+    private Date startTime;
+    private Date endTime;
+
+    private Integer pageIndex;
+    private Integer pageFrom;
+
+    private List<ClueLog> clueLogList;
+
 
 
     @Override

+ 56 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/ClueLog.java

@@ -0,0 +1,56 @@
+package com.management.platform.entity;
+
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.time.LocalDateTime;
+import com.baomidou.mybatisplus.annotation.TableField;
+import java.io.Serializable;
+import java.util.Date;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author Seyason
+ * @since 2024-03-04
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class ClueLog extends Model<ClueLog> {
+
+    private static final long serialVersionUID=1L;
+
+    @TableId("id")
+    private Long id;
+
+    @TableField("clue_id")
+    private Integer clueId;
+
+    /**
+     * 操作时间
+     */
+    @TableField("creat_time")
+    private Date creatTime;
+
+    /**
+     * 操作内容
+     */
+    @TableField("name")
+    private String name;
+
+    @TableField("user_id")
+    private String userId;
+
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+}

+ 8 - 10
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/SysDict.java

@@ -1,5 +1,6 @@
 package com.management.platform.entity;
 
+import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.extension.activerecord.Model;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableField;
@@ -14,7 +15,7 @@ import lombok.experimental.Accessors;
  * </p>
  *
  * @author Seyason
- * @since 2024-02-28
+ * @since 2024-03-04
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -23,17 +24,14 @@ public class SysDict extends Model<SysDict> {
 
     private static final long serialVersionUID=1L;
 
-    /**
-     * 字典代码
-     */
-    @TableId("code")
-    private String code;
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
 
     /**
-     * 字典
+     * 字典编码
      */
-    @TableField("id")
-    private String id;
+    @TableField("code")
+    private String code;
 
     /**
      * 名字
@@ -53,7 +51,7 @@ public class SysDict extends Model<SysDict> {
 
     @Override
     protected Serializable pkVal() {
-        return this.code;
+        return this.id;
     }
 
 }

+ 70 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/SysForm.java

@@ -0,0 +1,70 @@
+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.LocalDateTime;
+import com.baomidou.mybatisplus.annotation.TableField;
+import java.io.Serializable;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author Seyason
+ * @since 2024-03-04
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class SysForm extends Model<SysForm> {
+
+    private static final long serialVersionUID=1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 表单对应模块路由
+     */
+    @TableField("code")
+    private String code;
+
+    /**
+     * 模板名称
+     */
+    @TableField("name")
+    private String name;
+
+    /**
+     * 公司ID
+     */
+    @TableField("company_id")
+    private Integer companyId;
+
+    /**
+     * 配置详情
+     */
+    @TableField("config")
+    private String config;
+
+    @TableField("create_time")
+    private LocalDateTime createTime;
+
+    /**
+     * 是否为当前模板 0-否 1-是
+     */
+    @TableField("is_current")
+    private Integer isCurrent;
+
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+}

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

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

+ 7 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/mapper/ClueMapper.java

@@ -3,6 +3,8 @@ package com.management.platform.mapper;
 import com.management.platform.entity.Clue;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 
+import java.util.List;
+
 /**
  * <p>
  *  Mapper 接口
@@ -13,4 +15,9 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  */
 public interface ClueMapper extends BaseMapper<Clue> {
 
+    List<Clue> list(Clue clue);
+    List<Clue> Deleterlist(Clue clue);
+
+    Integer getTotal(Clue clue);
+    Integer getDeleterTotal(Clue clue);
 }

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

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

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

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

+ 13 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/ClueService.java

@@ -3,6 +3,7 @@ package com.management.platform.service;
 import com.management.platform.entity.Clue;
 import com.baomidou.mybatisplus.extension.service.IService;
 
+import javax.servlet.http.HttpServletRequest;
 import java.util.List;
 
 /**
@@ -19,4 +20,16 @@ public interface ClueService extends IService<Clue> {
     void update(Clue clue);
 
     void isDelete(List<Integer> ids);
+
+    List<Clue> getList(Clue clue);
+    List<Clue> getDeleterList(Clue clue);
+
+    Integer getTotal(Clue clue);
+    Integer getDeleterTotal(Clue clue);
+
+    Clue getInfo(Clue clue);
+
+    void isRollback(List<Integer> ids);
+
+    void deleterDelete(List<Integer> ids);
 }

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

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

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

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

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

@@ -3,6 +3,8 @@ package com.management.platform.service.impl;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.management.platform.entity.Clue;
+import com.management.platform.entity.ClueLog;
+import com.management.platform.mapper.ClueLogMapper;
 import com.management.platform.mapper.ClueMapper;
 import com.management.platform.service.ClueService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -11,6 +13,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import javax.servlet.http.HttpServletRequest;
 import java.beans.Transient;
 import java.util.Date;
 import java.util.List;
@@ -30,6 +33,8 @@ public class ClueServiceImpl extends ServiceImpl<ClueMapper, Clue> implements Cl
     private SysFunctionService sysFunctionService;
     @Autowired
     private ClueMapper clueMapper;
+    @Autowired
+    private ClueLogMapper clueLogMapper;
 
     @Override
     @Transactional(rollbackFor = Exception.class)
@@ -37,7 +42,13 @@ public class ClueServiceImpl extends ServiceImpl<ClueMapper, Clue> implements Cl
         setNull(clue);
         clue.setCreateTime(new Date());
         clueMapper.insert(clue);
-
+        Integer id = clue.getId();
+        ClueLog clueLog = new ClueLog();
+        clueLog.setClueId(id);
+        clueLog.setName("创建了线索");
+//        clueLog.setUserId(clue.getCreateId());
+        clueLog.setCreatTime(new Date());
+        clueLogMapper.insert(clueLog);
     }
 
     @Override
@@ -45,6 +56,12 @@ public class ClueServiceImpl extends ServiceImpl<ClueMapper, Clue> implements Cl
     public void update(Clue clue) {
         setNull(clue);
         clueMapper.updateById(clue);
+        ClueLog clueLog = new ClueLog();
+        clueLog.setClueId(clue.getId());
+        clueLog.setName("编辑了线索");
+//        clueLog.setUserId(clue.getCreateId());
+        clueLog.setCreatTime(new Date());
+        clueLogMapper.insert(clueLog);
     }
 
     private Clue setNull(Clue clue) {
@@ -75,4 +92,51 @@ public class ClueServiceImpl extends ServiceImpl<ClueMapper, Clue> implements Cl
         clue.setIsDelete(1);
         clueMapper.update(clue, updateWrapper);
     }
+
+    @Override
+    public List<Clue> getList(Clue clue) {
+        return clueMapper.list(clue);
+    }
+
+    @Override
+    public List<Clue> getDeleterList(Clue clue) {
+        return clueMapper.Deleterlist(clue);
+    }
+
+    @Override
+    public Integer getTotal(Clue clue) {
+        return clueMapper.getTotal(clue);
+    }
+    @Override
+    public Integer getDeleterTotal(Clue clue) {
+        return clueMapper.getDeleterTotal(clue);
+    }
+
+    @Override
+    public Clue getInfo(Clue clue) {
+        Clue clue1 = clueMapper.selectById(clue.getId());
+        QueryWrapper<ClueLog> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("clue_id",clue.getId());
+        List<ClueLog> logs = clueLogMapper.selectList(queryWrapper);
+        clue1.setClueLogList(logs);
+        return clue1;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void isRollback(List<Integer> ids) {
+        UpdateWrapper<Clue> updateWrapper = new UpdateWrapper<>();
+        updateWrapper.in("id", ids);
+        Clue clue = new Clue();
+        clue.setIsDelete(0);
+        clueMapper.update(clue, updateWrapper);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void deleterDelete(List<Integer> ids) {
+        clueMapper.deleteBatchIds(ids);
+    }
+
+
 }

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

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

+ 29 - 28
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/UserServiceImpl.java

@@ -625,30 +625,6 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
             }
             moduleList.add(findIndex,centerManageModule);
         }
-        //组装层级关系,默认只有两级
-        List<SysModule> menuList = new ArrayList<>();
-        for (SysModule module : moduleList) {
-            if (module.getParentId() == null) {
-                menuList.add(module);
-            }
-            if(timeType.getProjectCustom()==0){
-                if(module.getName().equals("项目表单设置")){
-                    continue;
-                }
-            }
-        }
-        for (SysModule mainMenu : menuList) {
-            List<SysModule> list = moduleList.stream().filter(mod -> mainMenu.getId().equals(mod.getParentId())).collect(Collectors.toList());
-            if(timeType.getProjectCustom()==0){
-                Optional<SysModule> first = list.stream().filter(l -> l.getName().equals("项目表单设置")).findFirst();
-                if(first.isPresent()){
-                    list.remove(first.get());
-                }
-            }
-            mainMenu.setChildren(list);
-        }
-
-        user.setModuleList(menuList);
         //此处返回权限集合
         List<Integer> functionIdList = new ArrayList<>();
         //获取角色所有的功能id
@@ -660,6 +636,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
         //获取当前公司开启了得报表
         List<CompanyReport> companyReportList = companyReportMapper.selectList(new QueryWrapper<CompanyReport>().eq("company_id", company.getId()));
         List<Integer> formIds = companyReportList.stream().map(CompanyReport::getReportFormId).collect(Collectors.toList());
+        List<SysFunction> functionList=new ArrayList<>();
         if (functionIdList.size() > 0) {
             //根据功能id获取可用的操作代码
             if (formIds.size() == 0) {
@@ -704,12 +681,36 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
                 return wrapper;
             });
             functionQueryWrapper.orderByAsc("seq");
-            List<SysFunction> functionList = sysFunctionMapper.selectList(functionQueryWrapper);
+            functionList = sysFunctionMapper.selectList(functionQueryWrapper);
             functionList = functionList.stream().filter(f->functionIdList.contains(f.getId())).collect(Collectors.toList());
             user.setFunctionList(functionList);
-        } else {
-            user.setFunctionList(new ArrayList<>());
         }
+        //组装层级关系,默认只有两级
+        List<SysModule> menuList = new ArrayList<>();
+        for (SysModule module : moduleList) {
+            if (module.getParentId() == null) {
+                menuList.add(module);
+            }
+            if(timeType.getProjectCustom()==0){
+                if(module.getName().equals("项目表单设置")){
+                    continue;
+                }
+            }
+            //赋予菜单对应功能列表
+            module.setFunctionList(functionList.stream().filter(item -> item.getModuleId().equals(module.getId())).collect(Collectors.toList()));
+        }
+        for (SysModule mainMenu : menuList) {
+            List<SysModule> list = moduleList.stream().filter(mod -> mainMenu.getId().equals(mod.getParentId())).collect(Collectors.toList());
+            if(timeType.getProjectCustom()==0){
+                Optional<SysModule> first = list.stream().filter(l -> l.getName().equals("项目表单设置")).findFirst();
+                if(first.isPresent()){
+                    list.remove(first.get());
+                }
+            }
+            mainMenu.setChildren(list);
+        }
+
+        user.setModuleList(menuList);
     }
 
     private boolean judgeIsLeader(String userId) {
@@ -1272,7 +1273,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
 //                task.setGroupId(taskGroup.getId());
 //                task.setSeq(0);
 //                task.setName(MessageUtils.message("Stages.example"));
-                taskMapper.insert(task);
+//                taskMapper.insert(task);
                 httpRespMsg.data = user;
             }
         }

+ 2 - 2
fhKeeper/formulahousekeeper/management-crm/src/main/resources/logback.xml

@@ -14,11 +14,11 @@
 	
 	<!-- 系统日志输出 -->
 	<appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
-	    <file>${log.path}/workTime.log</file>
+	    <file>${log.path}/crm.log</file>
         <!-- 循环政策:基于时间创建日志文件 -->
 		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
             <!-- 日志文件名格式 -->
-			<fileNamePattern>${log.path}/workTime.%d{yyyy-MM-dd}.log.gz</fileNamePattern>
+			<fileNamePattern>${log.path}/crm.%d{yyyy-MM-dd}.log.gz</fileNamePattern>
 			<!-- 日志最大的历史 2天 -->
 			<maxHistory>7</maxHistory>
 		</rollingPolicy>

+ 19 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/resources/mapper/ClueLogMapper.xml

@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.management.platform.mapper.ClueLogMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.management.platform.entity.ClueLog">
+        <id column="id" property="id" />
+        <result column="clue_id" property="clueId" />
+        <result column="creat_time" property="creatTime" />
+        <result column="name" property="name" />
+        <result column="user_id" property="userId" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, clue_id, creat_time, name, user_id
+    </sql>
+
+</mapper>

+ 118 - 2
fhKeeper/formulahousekeeper/management-crm/src/main/resources/mapper/ClueMapper.xml

@@ -8,7 +8,8 @@
         <result column="company_id" property="companyId" />
         <result column="clue_name" property="clueName" />
         <result column="clue_source_id" property="clueSourceId" />
-        <result column="contact_information" property="contactInformation" />
+        <result column="phone" property="phone" />
+        <result column="email" property="email" />
         <result column="customer_industry_id" property="customerIndustryId" />
         <result column="customer_level_id" property="customerLevelId" />
         <result column="address" property="address" />
@@ -20,11 +21,126 @@
         <result column="plate3" property="plate3" />
         <result column="plate4" property="plate4" />
         <result column="plate5" property="plate5" />
+        <result column="company_name" property="companyName" />
+        <result column="create_time" property="createTime" />
+        <result column="create_id" property="createId" />
     </resultMap>
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        id, company_id, clue_name, clue_source_id, contact_information, customer_industry_id, customer_level_id, address, incharger_id, remark, is_delete, plate1, plate2, plate3, plate4, plate5
+        id, company_id, clue_name, clue_source_id, phone , email, customer_industry_id, customer_level_id, address, incharger_id, remark, is_delete, plate1, plate2, plate3, plate4, plate5,create_time,createId
     </sql>
+    <select id="list" resultType="com.management.platform.entity.Clue">
+        select c.id,
+               c.company_id,
+               (select company_name from company where company_id = c.id) companyName,
+               c.clue_name,
+               c.clue_source_id,
+               c.phone,
+               c.email,
+               c.customer_industry_id,
+               c.customer_level_id,
+               c.address,
+               c.incharger_id,
+               c.remark,
+               c.is_delete,
+               c.plate1,
+               c.plate2,
+               c.plate3,
+               c.plate4,
+               c.plate5,
+               c.create_time,
+               c.create_id
+        from Clue c
+        where
+            c.company_id = #{companyId} and is_delete = 0
+        <if test="startTime != null and endTime != null ">
+        and  c.create_time BETWEEN  #{startTime} and #{endTime}
+        </if>
+        <if test="clueName != null and clueName != '' ">
+        and  c.clue_name =  #{clueName}
+        </if>
+        <if test="clueSourceId != null">
+        and  c.clue_source_id =  #{clueSourceId}
+        </if>
+        <if test="customerIndustryId != null">
+        and  c.customer_industry_id =  #{customerIndustryId}
+        </if>
+        limit #{pageIndex},#{pageFrom}
+    </select>
+    <select id="Deleterlist" resultType="com.management.platform.entity.Clue">
+        select c.id,
+               c.company_id,
+               (select company_name from company where company_id = c.id) companyName,
+               c.clue_name,
+               c.clue_source_id,
+               c.phone,
+               c.email,
+               c.customer_industry_id,
+               c.customer_level_id,
+               c.address,
+               c.incharger_id,
+               c.remark,
+               c.is_delete,
+               c.plate1,
+               c.plate2,
+               c.plate3,
+               c.plate4,
+               c.plate5,
+               c.create_time,
+               c.create_id
+        from Clue c
+        where
+            c.company_id = #{companyId} and is_delete = 1
+        <if test="startTime != null and endTime != null ">
+        and  c.create_time BETWEEN  #{startTime} and #{endTime}
+        </if>
+        <if test="clueName != null and clueName != '' ">
+        and  c.clue_name =  #{clueName}
+        </if>
+        <if test="clueSourceId != null">
+        and  c.clue_source_id =  #{clueSourceId}
+        </if>
+        <if test="customerIndustryId != null">
+        and  c.customer_industry_id =  #{customerIndustryId}
+        </if>
+        limit #{pageIndex},#{pageFrom}
+    </select>
+    <select id="getTotal" resultType="java.lang.Integer">
+        select count(*)
+        from Clue c
+        where
+        c.company_id = #{companyId} and is_delete = 0
+        <if test="startTime != null and endTime != null ">
+            and  c.create_time BETWEEN  #{startTime} and #{endTime}
+        </if>
+        <if test="clueName != null and clueName != '' ">
+            and  c.clue_name =  #{clueName}
+        </if>
+        <if test="clueSourceId != null">
+            and  c.clue_source_id =  #{clueSourceId}
+        </if>
+        <if test="customerIndustryId != null">
+            and  c.customer_industry_id =  #{customerIndustryId}
+        </if>
+    </select>
+    <select id="getDeleterTotal" resultType="java.lang.Integer">
+        select count(*)
+        from Clue c
+        where
+        c.company_id = #{companyId} and is_delete = 1
+        <if test="startTime != null and endTime != null ">
+            and  c.create_time BETWEEN  #{startTime} and #{endTime}
+        </if>
+        <if test="clueName != null and clueName != '' ">
+            and  c.clue_name =  #{clueName}
+        </if>
+        <if test="clueSourceId != null">
+            and  c.clue_source_id =  #{clueSourceId}
+        </if>
+        <if test="customerIndustryId != null">
+            and  c.customer_industry_id =  #{customerIndustryId}
+        </if>
+    </select>
 
 </mapper>

+ 3 - 3
fhKeeper/formulahousekeeper/management-crm/src/main/resources/mapper/SysDictMapper.xml

@@ -4,8 +4,8 @@
 
     <!-- 通用查询映射结果 -->
     <resultMap id="BaseResultMap" type="com.management.platform.entity.SysDict">
-        <id column="code" property="code" />
-        <result column="id" property="id" />
+        <id column="id" property="id" />
+        <result column="code" property="code" />
         <result column="name" property="name" />
         <result column="seq" property="seq" />
         <result column="company_id" property="companyId" />
@@ -13,7 +13,7 @@
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        code, id, name, seq, company_id
+        id, code, name, seq, company_id
     </sql>
 
 </mapper>

+ 21 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/resources/mapper/SysFormMapper.xml

@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.management.platform.mapper.SysFormMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.management.platform.entity.SysForm">
+        <id column="id" property="id" />
+        <result column="code" property="code" />
+        <result column="name" property="name" />
+        <result column="company_id" property="companyId" />
+        <result column="config" property="config" />
+        <result column="create_time" property="createTime" />
+        <result column="is_current" property="isCurrent" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, code, name, company_id, config, create_time, is_current
+    </sql>
+
+</mapper>

BIN
fhKeeper/formulahousekeeper/management-crm/workTime.2024-03-01.log.gz


File diff suppressed because it is too large
+ 51263 - 65454
fhKeeper/formulahousekeeper/management-crm/workTime.log


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

@@ -1260,8 +1260,8 @@ public class ProjectController {
 
     //FTE报表
     @RequestMapping("/getFTEData")
-    public HttpRespMsg getFTEData(@RequestParam Integer pageIndex, @RequestParam Integer pageSize,String monthStart,String monthEnd,String area,String sortProp, Integer sortOrder,HttpServletRequest request){
-        return projectService.getFTEData(pageIndex,pageSize,monthStart,monthEnd,area,sortProp,sortOrder,request);
+    public HttpRespMsg getFTEData(@RequestParam Integer pageIndex, @RequestParam Integer pageSize,String monthStart,String monthEnd,String area,String userId,String sortProp, Integer sortOrder,HttpServletRequest request){
+        return projectService.getFTEData(pageIndex,pageSize,monthStart,monthEnd,area,userId,sortProp,sortOrder,request);
     }
 
     //导出FTE报表

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

@@ -952,13 +952,13 @@ public class TaskController {
     }
 
     @RequestMapping("/getTaskTimeCompare")
-    public HttpRespMsg getTaskTimeCompare(Integer projectId) {
-        return taskService.getTaskTimeCompare(projectId);
+    public HttpRespMsg getTaskTimeCompare(Integer projectId,Integer deptId) {
+        return taskService.getTaskTimeCompare(projectId,deptId);
     }
 
     @RequestMapping("/exportTaskTimeCompare")
-    public HttpRespMsg exportTaskTimeCompare(Integer projectId) {
-        return taskService.exportTaskTimeCompare(projectId);
+    public HttpRespMsg exportTaskTimeCompare(Integer projectId,Integer deptId) {
+        return taskService.exportTaskTimeCompare(projectId,deptId);
     }
 
     @RequestMapping("exportTask")

+ 1 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ProjectMapper.java

@@ -160,7 +160,7 @@ public interface ProjectMapper extends BaseMapper<Project> {
 
     List<Project> selectNearProject(String userId);
 
-    List<Map<String, Object>> getFTEData(Integer companyId, String startDate, String endDate, Integer start, Integer size, String area,String sortProp, Integer sortOrder, List<Integer> branchDepartment, List<Integer> deptIds);
+    List<Map<String, Object>> getFTEData(Integer companyId, String startDate, String endDate, Integer start, Integer size, String area,String userId,String sortProp, Integer sortOrder, List<Integer> branchDepartment, List<Integer> deptIds);
 
     List<Map<String, Object>> getTimeCostByToken(Integer companyId, String startDate, String endDate);
 

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

@@ -29,7 +29,7 @@ public interface TaskMapper extends BaseMapper<Task> {
 
     List<Task> nameList(@Param(Constants.WRAPPER) Wrapper wrapper);
 
-    List getTaskTimeCompare(Integer projectId);
+    List getTaskTimeCompare(Integer projectId,Integer deptId);
 
     List<TimeTask> getTaskWithWorktime(Integer projectId, Integer taskType);
 

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

@@ -243,7 +243,7 @@ public interface ProjectService extends IService<Project> {
 
     HttpRespMsg nearProject(HttpServletRequest request);
 
-    HttpRespMsg getFTEData(Integer pageIndex, Integer pageSize,String monthStart,String monthEnd, String area,String sortProp, Integer sortOrder, HttpServletRequest request);
+    HttpRespMsg getFTEData(Integer pageIndex, Integer pageSize,String monthStart,String monthEnd, String area,String userId,String sortProp, Integer sortOrder, HttpServletRequest request);
 
     HttpRespMsg exportFTEData(String monthStart,String monthEnd, String area, HttpServletRequest request);
 

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

@@ -32,8 +32,8 @@ public interface TaskService extends IService<Task> {
     List<Task> nameList(Wrapper<Task> queryWrapper);
 
 
-    HttpRespMsg getTaskTimeCompare(Integer projectId);
-    HttpRespMsg exportTaskTimeCompare(Integer projectId);
+    HttpRespMsg getTaskTimeCompare(Integer projectId,Integer deptId);
+    HttpRespMsg exportTaskTimeCompare(Integer projectId,Integer deptId);
 
     HttpRespMsg exportTask(Integer projectId, Integer taskType);
 

+ 65 - 59
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java

@@ -11289,7 +11289,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
 
     //获取FTE报表数据
     @Override
-    public HttpRespMsg getFTEData(Integer pageIndex, Integer pageSize,String monthStart,String monthEnd, String area,String sortProp, Integer sortOrder, HttpServletRequest request) {
+    public HttpRespMsg getFTEData(Integer pageIndex, Integer pageSize,String monthStart,String monthEnd, String area,String userId,String sortProp, Integer sortOrder, HttpServletRequest request) {
         HttpRespMsg httpRespMsg =new HttpRespMsg();
         User targetUser = userMapper.selectById(request.getHeader("token"));
         List<SysRichFunction> functionAllList = sysFunctionMapper.getRoleFunctions(targetUser.getRoleId(), "全部部门FTE报表");
@@ -11327,10 +11327,10 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         if(pageIndex!=null&&pageSize!=null){
             Integer size=pageSize;
             Integer start=(pageIndex-1)*size;
-            resultList=projectMapper.getFTEData(targetUser.getCompanyId(),startDate,endDate,start,size,area,sortProp,sortOrder,null,deptIds);
-            total=projectMapper.getFTEData(targetUser.getCompanyId(),startDate,endDate,null,null,area,sortProp,sortOrder,null,deptIds).size();
+            resultList=projectMapper.getFTEData(targetUser.getCompanyId(),startDate,endDate,start,size,area,userId,sortProp,sortOrder,null,deptIds);
+            total=projectMapper.getFTEData(targetUser.getCompanyId(),startDate,endDate,null,null,area,userId,sortProp,sortOrder,null,deptIds).size();
         }else{
-            resultList=projectMapper.getFTEData(targetUser.getCompanyId(),startDate,endDate,null,null,area,sortProp,sortOrder,null,deptIds);
+            resultList=projectMapper.getFTEData(targetUser.getCompanyId(),startDate,endDate,null,null,area,userId,sortProp,sortOrder,null,deptIds);
         }
         //固定月工时数 163.125
         double regularMonthTime=163.125;
@@ -11366,7 +11366,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         if (userCustoms.size() != 0){
             customName = userCustoms.get(0).getName();
         }
-        HttpRespMsg fteData = getFTEData(null, null, monthStart,monthEnd, area,null,null, request);
+        HttpRespMsg fteData = getFTEData(null, null, monthStart,monthEnd, area,null,null,null, request);
         LocalDate timeStart = LocalDate.parse(monthStart, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
         LocalDate timeEnd = LocalDate.parse(monthEnd, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
         timeStart=timeStart.with(TemporalAdjusters.firstDayOfMonth());
@@ -12778,31 +12778,33 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                             item.put("groupName",groupName);
                             item.put("corpwxDeptId",corpwxDeptid);
                             item.put("department_name",departmentName);
-                            if(!taskGroup.isPresent()){
-                                item.put("planHour",0);
-                                item.put("realHour",0);
-                                item.put("realCost",0);
-                                item.put("overHour",0);
-                                item.put("normalHour",0);
-                                item.put("process","0%");
-                            }else {
-                                Optional<Map<String, Object>> first = resultList.stream().filter(r -> Integer.valueOf(String.valueOf(r.get("projectId"))).equals(project.getId())
-                                        && Integer.valueOf(String.valueOf(r.get("groupId"))).equals(taskGroup.get().getId()) &&( Integer.valueOf(String.valueOf(r.get("deptId"))).equals(7459)||subDeptIds.contains( Integer.valueOf(String.valueOf(r.get("deptId")))))).findFirst();
-                                if(first.isPresent()){
-                                    item.put("planHour",first.get().get("planHour"));
-                                    item.put("realHour",first.get().get("realHour"));
-                                    item.put("realCost",first.get().get("realCost"));
-                                    item.put("overHour",first.get().get("overHour"));
-                                    item.put("normalHour",first.get().get("normalHour"));
-                                    item.put("process",first.get().get("process"));
+                            if(taskGroup.isPresent()){
+                                List<Map<String, Object>> mapList = resultList.stream().filter(r -> Integer.valueOf(String.valueOf(r.get("projectId"))).equals(project.getId())
+                                        && Integer.valueOf(String.valueOf(r.get("groupId"))).equals(taskGroup.get().getId()) && (Integer.valueOf(String.valueOf(r.get("deptId"))).equals(7459) || subDeptIds.contains(Integer.valueOf(String.valueOf(r.get("deptId")))))).collect(Collectors.toList());
+                                if(mapList!=null&&mapList.size()>0){
+                                    item.put("planHour",mapList.stream().mapToDouble(m-> Double.valueOf(String.valueOf(m.get("planHour")))).sum());
+                                    item.put("realHour",mapList.stream().mapToDouble(m-> Double.valueOf(String.valueOf(m.get("realHour")))).sum());
+                                    item.put("realCost",mapList.stream().mapToDouble(m-> Double.valueOf(String.valueOf(m.get("overHour")))).sum());
+                                    item.put("overHour",mapList.stream().mapToDouble(m-> Double.valueOf(String.valueOf(m.get("overHour")))).sum());
+                                    item.put("normalHour",mapList.stream().mapToDouble(m-> Double.valueOf(String.valueOf(m.get("normalHour")))).sum());
+                                    double realHour = mapList.stream().mapToDouble(m -> Double.valueOf(String.valueOf(m.get("realHour")))).sum();
+                                    double planHour = mapList.stream().mapToDouble(m -> Double.valueOf(String.valueOf(m.get("planHour")))).sum();
+                                    item.put("process",percentFormat.format(realHour/planHour));
                                 }else {
                                     item.put("planHour",0);
                                     item.put("realHour",0);
                                     item.put("realCost",0);
                                     item.put("overHour",0);
                                     item.put("normalHour",0);
-                                    item.put("process","0%");
+                                    item.put("process","0.00%");
                                 }
+                            }else {
+                                item.put("planHour",0);
+                                item.put("realHour",0);
+                                item.put("realCost",0);
+                                item.put("overHour",0);
+                                item.put("normalHour",0);
+                                item.put("process","0.00%");
                             }
                             itemList.add(item);
                         }
@@ -12821,31 +12823,33 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                             item.put("groupName",groupName);
                             item.put("corpwxDeptId",corpwxDeptid);
                             item.put("department_name",departmentName);
-                            if(!taskGroup.isPresent()){
-                                item.put("planHour",0);
-                                item.put("realHour",0);
-                                item.put("realCost",0);
-                                item.put("overHour",0);
-                                item.put("normalHour",0);
-                                item.put("process","0%");
-                            }else {
-                                Optional<Map<String, Object>> first = resultList.stream().filter(r -> Integer.valueOf(String.valueOf(r.get("projectId"))).equals(project.getId())
-                                        && Integer.valueOf(String.valueOf(r.get("groupId"))).equals(taskGroup.get().getId()) &&( Integer.valueOf(String.valueOf(r.get("deptId"))).equals(7460)||subDeptIds.contains( Integer.valueOf(String.valueOf(r.get("deptId")))))).findFirst();
-                                if(first.isPresent()){
-                                    item.put("planHour",first.get().get("planHour"));
-                                    item.put("realHour",first.get().get("realHour"));
-                                    item.put("realCost",first.get().get("realCost"));
-                                    item.put("overHour",first.get().get("overHour"));
-                                    item.put("normalHour",first.get().get("normalHour"));
-                                    item.put("process",first.get().get("process"));
+                            if(taskGroup.isPresent()){
+                                List<Map<String, Object>> mapList = resultList.stream().filter(r -> Integer.valueOf(String.valueOf(r.get("projectId"))).equals(project.getId())
+                                        && Integer.valueOf(String.valueOf(r.get("groupId"))).equals(taskGroup.get().getId()) && (Integer.valueOf(String.valueOf(r.get("deptId"))).equals(7460) || subDeptIds.contains(Integer.valueOf(String.valueOf(r.get("deptId")))))).collect(Collectors.toList());
+                                if(mapList!=null&&mapList.size()>0){
+                                    item.put("planHour",mapList.stream().mapToDouble(m-> Double.valueOf(String.valueOf(m.get("planHour")))).sum());
+                                    item.put("realHour",mapList.stream().mapToDouble(m-> Double.valueOf(String.valueOf(m.get("realHour")))).sum());
+                                    item.put("realCost",mapList.stream().mapToDouble(m-> Double.valueOf(String.valueOf(m.get("overHour")))).sum());
+                                    item.put("overHour",mapList.stream().mapToDouble(m-> Double.valueOf(String.valueOf(m.get("overHour")))).sum());
+                                    item.put("normalHour",mapList.stream().mapToDouble(m-> Double.valueOf(String.valueOf(m.get("normalHour")))).sum());
+                                    double realHour = mapList.stream().mapToDouble(m -> Double.valueOf(String.valueOf(m.get("realHour")))).sum();
+                                    double planHour = mapList.stream().mapToDouble(m -> Double.valueOf(String.valueOf(m.get("planHour")))).sum();
+                                    item.put("process",percentFormat.format(realHour/planHour));
                                 }else {
                                     item.put("planHour",0);
                                     item.put("realHour",0);
                                     item.put("realCost",0);
                                     item.put("overHour",0);
                                     item.put("normalHour",0);
-                                    item.put("process","0%");
+                                    item.put("process","0.00%");
                                 }
+                            }else {
+                                item.put("planHour",0);
+                                item.put("realHour",0);
+                                item.put("realCost",0);
+                                item.put("overHour",0);
+                                item.put("normalHour",0);
+                                item.put("process","0.00%");
                             }
                             itemList.add(item);
                         }
@@ -12868,31 +12872,33 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                             item.put("groupName",groupName);
                             item.put("corpwxDeptId",corpwxDeptid);
                             item.put("department_name",departmentName);
-                            if(!taskGroup.isPresent()){
-                                item.put("planHour",0);
-                                item.put("realHour",0);
-                                item.put("realCost",0);
-                                item.put("overHour",0);
-                                item.put("normalHour",0);
-                                item.put("process","0%");
-                            }else {
-                                Optional<Map<String, Object>> first = resultList.stream().filter(r -> Integer.valueOf(String.valueOf(r.get("projectId"))).equals(project.getId())
-                                        && Integer.valueOf(String.valueOf(r.get("groupId"))).equals(taskGroup.get().getId()) &&( Integer.valueOf(String.valueOf(r.get("deptId"))).equals(7458)||subDeptIds.contains( Integer.valueOf(String.valueOf(r.get("deptId")))))).findFirst();
-                                if(first.isPresent()){
-                                    item.put("planHour",first.get().get("planHour"));
-                                    item.put("realHour",first.get().get("realHour"));
-                                    item.put("realCost",first.get().get("realCost"));
-                                    item.put("overHour",first.get().get("overHour"));
-                                    item.put("normalHour",first.get().get("normalHour"));
-                                    item.put("process",first.get().get("process"));
+                            if(taskGroup.isPresent()){
+                                List<Map<String, Object>> mapList = resultList.stream().filter(r -> Integer.valueOf(String.valueOf(r.get("projectId"))).equals(project.getId())
+                                        && Integer.valueOf(String.valueOf(r.get("groupId"))).equals(taskGroup.get().getId()) && (Integer.valueOf(String.valueOf(r.get("deptId"))).equals(7458) || subDeptIds.contains(Integer.valueOf(String.valueOf(r.get("deptId")))))).collect(Collectors.toList());
+                                if(mapList!=null&&mapList.size()>0){
+                                    item.put("planHour",mapList.stream().mapToDouble(m-> Double.valueOf(String.valueOf(m.get("planHour")))).sum());
+                                    item.put("realHour",mapList.stream().mapToDouble(m-> Double.valueOf(String.valueOf(m.get("realHour")))).sum());
+                                    item.put("realCost",mapList.stream().mapToDouble(m-> Double.valueOf(String.valueOf(m.get("overHour")))).sum());
+                                    item.put("overHour",mapList.stream().mapToDouble(m-> Double.valueOf(String.valueOf(m.get("overHour")))).sum());
+                                    item.put("normalHour",mapList.stream().mapToDouble(m-> Double.valueOf(String.valueOf(m.get("normalHour")))).sum());
+                                    double realHour = mapList.stream().mapToDouble(m -> Double.valueOf(String.valueOf(m.get("realHour")))).sum();
+                                    double planHour = mapList.stream().mapToDouble(m -> Double.valueOf(String.valueOf(m.get("planHour")))).sum();
+                                    item.put("process",percentFormat.format(realHour/planHour));
                                 }else {
                                     item.put("planHour",0);
                                     item.put("realHour",0);
                                     item.put("realCost",0);
                                     item.put("overHour",0);
                                     item.put("normalHour",0);
-                                    item.put("process","0%");
+                                    item.put("process","0.00%");
                                 }
+                            }else {
+                                item.put("planHour",0);
+                                item.put("realHour",0);
+                                item.put("realCost",0);
+                                item.put("overHour",0);
+                                item.put("normalHour",0);
+                                item.put("process","0.00%");
                             }
                             itemList.add(item);
                         }

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

@@ -8283,7 +8283,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                     break;
                 }
             }
-            item.put("userName",(String) map.get("name"));
+            item.put("userName",(String) map.get("realName"));
             item.put("departmentName",departmentService.getSupDepartment(dept,departments));
             item.put("departmentId",dept.getCorpwxDeptid());
             item.put("projectCode",(String) map.get("projectCode"));

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

@@ -117,16 +117,16 @@ public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements Ta
     }
 
     @Override
-    public HttpRespMsg getTaskTimeCompare(Integer projectId) {
+    public HttpRespMsg getTaskTimeCompare(Integer projectId,Integer deptId) {
         HttpRespMsg msg = new HttpRespMsg();
-        msg.data = taskMapper.getTaskTimeCompare(projectId);
+        msg.data = taskMapper.getTaskTimeCompare(projectId,deptId);
         return msg;
     }
 
     @Override
-    public HttpRespMsg exportTaskTimeCompare(Integer projectId) {
+    public HttpRespMsg exportTaskTimeCompare(Integer projectId,Integer deptId) {
         HttpRespMsg httpRespMsg = new HttpRespMsg();
-        List<Map> list= taskMapper.getTaskTimeCompare(projectId);
+        List<Map> list= taskMapper.getTaskTimeCompare(projectId,deptId);
         Project project = projectMapper.selectById(projectId);
         try {
             //准备导出

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

@@ -1744,6 +1744,9 @@
         <if test="area!=null and area != '' ">
             and u.plate1 = #{area}
         </if>
+        <if test="userId!=null and userId != '' ">
+            and u.id = #{userId}
+        </if>
         <if test="branchDepartment!=null and branchDepartment.size()>0">
             and u.department_id in
             <foreach collection="branchDepartment" open="(" close=")" separator="," item="item">
@@ -1890,22 +1893,24 @@
     </select>
 
     <select id="groupExpendProcessList" resultType="java.util.Map">
-        SELECT p.project_name AS projectName,p.id as projectId,tg.id as groupId,d.department_name,d.department_id as deptId,d.corpwx_deptid AS corpwxDeptId,tg.name AS groupName,
-        IFNULL(SUM(CASE WHEN (r.create_date BETWEEN #{startDate} AND #{endDate} AND r.state=1 AND r.project_id IS NOT NULL) THEN r.working_time ELSE NULL END),0) AS realHour,
-        IFNULL(SUM(CASE WHEN (r.create_date BETWEEN #{startDate} AND #{endDate} AND r.state=1 AND r.project_id IS NOT NULL) THEN r.cost ELSE NULL END),0) AS realCost,
-        IFNULL(SUM(CASE WHEN (r.create_date BETWEEN #{startDate} AND #{endDate} AND r.state=1 AND r.project_id IS NOT NULL) THEN r.overtime_hours ELSE NULL END),0) AS overHour,
-        IFNULL(SUM(CASE WHEN (r.create_date BETWEEN #{startDate} AND #{endDate} AND r.state=1 AND r.project_id IS NOT NULL) THEN r.working_time ELSE NULL END)
-              -SUM(CASE WHEN (r.create_date BETWEEN #{startDate} AND #{endDate} AND r.state=1 AND r.project_id IS NOT NULL) THEN r.overtime_hours ELSE NULL END),0) AS normalHour,
-        IFNULL(tg.man_day*8,0) AS planHour,
-        CONCAT(ROUND((IFNULL(SUM(CASE WHEN (r.create_date BETWEEN #{startDate} AND #{endDate} AND r.state=1 AND r.project_id IS NOT NULL) THEN r.working_time ELSE NULL END),0)/IFNULL(tg.man_day*8,0))*100,2),'%') as process
-        FROM  task_group tg
-        LEFT JOIN task t ON t.group_id=tg.id
-        LEFT JOIN report r  ON r.task_id=t.id
-        LEFT JOIN project p ON p.id=r.project_id
-        LEFT JOIN department d ON d.department_id=r.dept_id
-        WHERE r.company_id=#{companyId}  AND tg.name IN ('生产部电气','生产部车间','工程部现场安装施工','工程部配合调试','研发部工艺设计','研发部结构设计','研发部BIM设计','研发部电气设计','研发部工艺调试验收','研发部电气调试验收')
+        SELECT p.project_name AS projectName,p.id AS projectId,tg.id AS groupId,d.department_name,d.department_id AS deptId,d.corpwx_deptid AS corpwxDeptId,tg.name AS groupName,
+        IFNULL((SELECT SUM(working_time) FROM report  WHERE task_id=t.id AND dept_id=d.department_id AND create_date BETWEEN #{startDate} AND #{endDate} AND state=1 AND project_id IS NOT NULL),0) AS realHour,
+        IFNULL((SELECT SUM(cost) FROM report  WHERE task_id=t.id AND dept_id=d.department_id AND create_date BETWEEN #{startDate} AND #{endDate} AND state=1 AND project_id IS NOT NULL) ,0) AS realCost,
+        IFNULL((SELECT SUM(overtime_hours) FROM report  WHERE task_id=t.id AND dept_id=d.department_id AND create_date BETWEEN #{startDate} AND #{endDate} AND state=1 AND project_id IS NOT NULL ),0) AS overHour,
+        (IFNULL((SELECT SUM(working_time) FROM report  WHERE task_id=t.id AND dept_id=d.department_id AND create_date BETWEEN #{startDate} AND #{endDate} AND state=1 AND project_id IS NOT NULL),0)
+        -IFNULL((SELECT SUM(overtime_hours) FROM report  WHERE task_id=t.id AND dept_id=d.department_id AND create_date BETWEEN #{startDate} AND #{endDate} AND state=1 AND project_id IS NOT NULL ),0)) as normalHour,
+        IFNULL(SUM(te.plan_hours),0) AS planHour
+        FROM task_executor te
+        LEFT JOIN task t ON t.id=te.task_id
+        LEFT JOIN USER u ON te.executor_id=u.id
+        LEFT JOIN task_group tg ON tg.id=t.group_id
+        LEFT JOIN project p ON p.id=tg.project_id
+        LEFT JOIN department d ON d.department_id=u.department_id
+        WHERE u.company_id=#{companyId}
+        AND tg.name IN ('生产部电气','生产部车间','工程部现场安装施工','工程部配合调试','研发部工艺设计','研发部结构设计','研发部BIM设计','研发部电气设计','研发部工艺调试验收','研发部电气调试验收')
+        AND d.department_id IN ( 7458, 7459, 7902, 7903, 7460, 7813, 7814, 7815, 7816)
         <if test="userId!=null and userId!=''">
-            and r.creator_id=#{userId}
+            and t.executor_id=#{userId}
         </if>
         <if test="list!=null and list.size()>0">
             and d.department_id in
@@ -1919,7 +1924,7 @@
                 #{item}
             </foreach>
         </if>
-        GROUP BY tg.id ORDER BY p.id,d.department_id
+        GROUP BY p.id,tg.id,d.department_id ORDER BY p.id,d.department_id
     </select>
 
     <select id="projectExpendProcessList" resultType="java.util.Map">

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

@@ -62,7 +62,7 @@
     </sql>
     <!--根据日期获取全部报告信息-->
     <select id="getAllReportByDate" resultType="java.util.Map">
-        SELECT a.id, c.name,c.job_number as jobNumber,c.corpwx_userid as corpwxUserId,c.corpwx_deptid as corpwxDeptId, b.project_name AS project,b.project_code as projectCode,b.category_name as categoryName, a.working_time AS duration, a.content, a.create_time   AS time,a.create_date as createDate,
+        SELECT a.id, c.name,uwb.name as realName,c.job_number as jobNumber,c.corpwx_userid as corpwxUserId,c.corpwx_deptid as corpwxDeptId, b.project_name AS project,b.project_code as projectCode,b.category_name as categoryName, a.working_time AS duration, a.content, a.create_time   AS time,a.create_date as createDate,
         a.state, a.time_type as timeType, a.cost, a.report_time_type as reportTimeType,a.start_time as startTime,u.job_number as jobNumber,
         a.end_time  as endTime, d.name as subProjectName,d.code as subProjectCode,a.task_id as taskId, task.name as taskName, a.is_overtime as isOvertime,a.progress as progress,
         a.department_audit_state as departmentAuditState, a.stage, a.pic_str as picStr, multi_worktime as multiWorktime,a.is_dept_audit as isDeptAudit,a.group_audit_state as groupAuditState,task_group.incharger_id as inchargerId,a.project_audit_state as projectAuditState,a.audit_dept_managerid as deptAuditorName
@@ -75,6 +75,7 @@
         JOIN project AS b ON a.project_id=b.id
         LEFT JOIN project_separate AS ps on b.id=ps.id
         LEFT JOIN user AS c ON a.creator_id=c.id
+        LEFT JOIN user_with_beisen AS uwb ON c.job_number=c.job_number
         left join sub_project as d on d.id = a.sub_project_id
         left join task on task.id = a.task_id
         left join report_extra_degree on report_extra_degree.id = a.degree_id
@@ -118,7 +119,7 @@
     </select>
 
     <select id="getAllReportByDateWithReportLog" resultType="java.util.Map">
-        SELECT a.id, c.name,c.job_number as jobNumber,c.corpwx_userid as corpwxUserId,c.corpwx_deptid as corpwxDeptId, b.project_name AS project,b.project_code as projectCode,b.category_name as categoryName, a.working_time AS duration, a.content, a.create_time   AS time,a.create_date as createDate,
+        SELECT a.id, c.name,uwb.name as realName,c.job_number as jobNumber,c.corpwx_userid as corpwxUserId,c.corpwx_deptid as corpwxDeptId, b.project_name AS project,b.project_code as projectCode,b.category_name as categoryName, a.working_time AS duration, a.content, a.create_time   AS time,a.create_date as createDate,
         a.state, a.time_type as timeType, a.cost, a.report_time_type as reportTimeType,a.start_time as startTime,u.job_number as jobNumber,
         a.end_time  as endTime, d.name as subProjectName,d.code as subProjectCode,a.task_id as taskId, task.name as taskName, a.is_overtime as isOvertime,a.progress as progress,
         a.department_audit_state as departmentAuditState, a.stage, a.pic_str as picStr, multi_worktime as multiWorktime,a.is_dept_audit as isDeptAudit,a.group_audit_state as groupAuditState,task_group.incharger_id as inchargerId,a.project_audit_state as projectAuditState,a.audit_dept_managerid as deptAuditorName
@@ -131,6 +132,7 @@
         JOIN project AS b ON a.project_id=b.id
         LEFT JOIN project_separate AS ps on b.id=ps.id
         LEFT JOIN user AS c ON a.creator_id=c.id
+        LEFT JOIN user_with_beisen AS uwb ON c.job_number=c.job_number
         left join sub_project as d on d.id = a.sub_project_id
         left join task on task.id = a.task_id
         left join report_extra_degree on report_extra_degree.id = a.degree_id
@@ -1063,8 +1065,9 @@
         ps.contract_code as contractCode,ps.project_category_sub as projectCategorySub,ps.region,DATE_FORMAT(p.create_date,'%Y-%m-%d') as createDate,DATE_FORMAT(ps.warranty_start_date,'%Y-%m-%d') as warrantyStartDate,
         DATE_FORMAT(ps.warranty_end_date,'%Y-%m-%d') as warrantyEndDate,DATE_FORMAT(p.finish_date,'%Y-%m-%d') as finishDate,ps.bu,IFNULL(p.man_day*8,0) as planTime,IFNULL(SUM(r.working_time),0) as realityTime,
         case  when p.man_day*8-SUM(r.working_time) &gt;= 0 then '否' else '是' end as isOver ,case when p.man_day*8-SUM(r.working_time) &gt; 0 then (p.man_day*8-SUM(r.working_time)) else '0' end as remaining,
-        (select GROUP_CONCAT(CONCAT(u.job_number,'/',u.name)) from participation pa
+        (select GROUP_CONCAT(CONCAT(u.job_number,'/',uwb.name)) from participation pa
         left join user u on pa.user_id=u.id
+        left join user_with_beisen uwb on u.job_number=uwb.job_number
         where pa.project_id=p.id ) as participations
         from project p
         left join project_main pm on p.project_main_id=pm.id
@@ -1096,12 +1099,14 @@
 
     <select id="getTaskGroupPlanTime" resultType="java.util.Map">
         select tg.project_id as projectId,tg.task_group_code as taskGroupCode,tg.name,tg.wbs_code as wbsCode,IFNULL(tg.man_day*8,0) as planTime,tg.id as groupId,
-        CONCAT(uu.job_number,'/',uu.name) as incahrgerName,
-        (select GROUP_CONCAT(CONCAT(u.job_number,'/',u.name)) from group_participator gp
+        CONCAT(uu.job_number,'/',uwb2.name) as incahrgerName,
+        (select GROUP_CONCAT(CONCAT(u.job_number,'/',uwb1.name)) from group_participator gp
         left join user u on gp.user_id=u.id
+        left join user_with_beisen uwb1 on u.job_number=uwb1.job_number
         where gp.group_id=tg.id ) as participations
         from task_group tg
         left join user uu on uu.id=tg.incharger_id
+        left join user_with_beisen uwb2 on uu.job_number=uwb2.job_number
         <where>
             tg.project_id in
             <foreach collection="list" open="(" close=")" separator="," item="item">

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

@@ -150,10 +150,17 @@
 
     <!-- 查询任务实际工时和计划工时对比,仅查询有实际工时的数据 -->
     <select id="getTaskTimeCompare" resultType="java.util.Map">
-        SELECT task.id , task.name AS name, task.plan_hours as planHours, IFNULL(SUM(report.`working_time`),0) AS workHours FROM report
-                                                                                                                                     LEFT JOIN task ON report.`task_id` = task.id AND report.state = 1
-        WHERE task.project_id = #{projectId}
-        GROUP BY task.id
+        SELECT t.id , t.name AS name ,IFNULL(SUM(te.plan_hours),0) AS planHours, IFNULL(SUM(r.`working_time`),0) AS workHours FROM
+        task_executor te
+        LEFT JOIN USER u ON te.executor_id=u.id
+        LEFT JOIN task t ON t.id=te.task_id
+        LEFT JOIN report r ON r.task_id=t.id AND r.state=1
+        LEFT JOIN project p ON p.id=t.project_id
+        WHERE p.id= #{projectId}
+        <if test="deptId!=null and deptId">
+            and u.department_id=#{deptId}
+        </if>
+        GROUP BY t.id
     </select>
 
     <!--查询任务,带实际工时-->

+ 3 - 2
fhKeeper/formulahousekeeper/timesheet/src/views/corpreport/list.vue

@@ -82,9 +82,9 @@
         <!-- 时间段筛选 ins == 6 || ins == 8 || ins == 9 || ins == 10 || ins == 11 || ins == 12 || ins == 5 || ins == 16 || ins == 17 || ins == 18 || ins == 20 || ins == 21 || ins == 22 -->
         <template v-if="screeningCondition.timePeriod.includes(ins)">
           <span>
-            <span class="demonstration" style="color:#999;padding:0 10px">
+            <!-- <span class="demonstration" style="color:#999;padding:0 10px">
               {{ ins == 15 ? $t('xiang-mu-chuang-jian-shi-jian-duan') : $t('message.period') }}
-            </span>
+            </span> -->
             <el-date-picker v-model="rangeDatas" type="daterange" value-format="yyyy-MM-dd" :placeholder="$t('selectstartdate')" @change="picks()" :range-separator="$t('other.to')" :start-placeholder="$t('time.startDate')" :end-placeholder="$t('time.endDate')" style="width:300px" :clearable="ins == 15" size="small"> </el-date-picker>
           </span>
         </template>
@@ -2495,6 +2495,7 @@ export default {
         monthStart: this.monthRange[0]+"-01",
         monthEnd: this.monthRange[1]+"-01",
         area: this.areaName || null,
+        userId:this.userId,
         pageIndex: this.page,
         pageSize: this.size
       }

File diff suppressed because it is too large
+ 509 - 385
fhKeeper/formulahousekeeper/timesheet/src/views/project/summary.vue


+ 6 - 1
fhKeeper/formulahousekeeper/timesheet_h5/src/views/task/editask.vue

@@ -151,6 +151,9 @@
                         <div class="popupSearch" v-if="user.userNameNeedTranslate != '1'">
                             <van-search v-model="executor.searchText" placeholder="输入员工姓名搜索" @search="onSearch" shape="round" background="#F4F4F4"></van-search>
                         </div>
+                        <div class="popupSearch" v-if="user.userNameNeedTranslate == '1'">
+                            <van-search v-model="executor.searchText" placeholder="输入员工姓名搜索" @search="getOnSearch(executor.searchText)" shape="round" background="#F4F4F4"></van-search>
+                        </div>
 
                         <div class="popupCon conBorder">
                             <van-radio-group v-model="executor.item" class="popupItem marginNone borderNone">
@@ -421,7 +424,9 @@ export default {
             this.finishDateShow = false
         },
         
-        executorChange(item,index){           // 选择执行人
+        executorChange(item,index){  // 选择执行人
+            this.executor.searchText = ''
+            this.getOnSearch('')
             this.executor.show = true
             this.executor.index = index
             this.executor.searchList.forEach(u=>{if (u.id == item.executorId) {