Browse Source

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

seyason 1 year ago
parent
commit
6e9ce19639
61 changed files with 7470 additions and 230 deletions
  1. 1 1
      fhKeeper/formulahousekeeper/customerBuler-crm/src/App.vue
  2. 5 3
      fhKeeper/formulahousekeeper/customerBuler-crm/src/main.ts
  3. 2 2
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/header/header.vue
  4. 1 1
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/home copy.vue
  5. 3 3
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/login.vue
  6. 1 0
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/tasks/api.ts
  7. 63 36
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/tasks/index.vue
  8. 4 4
      fhKeeper/formulahousekeeper/customerBuler-crm/src/router/index.ts
  9. 17 0
      fhKeeper/formulahousekeeper/customerBuler-crm/src/store/Store.d.ts
  10. 28 13
      fhKeeper/formulahousekeeper/customerBuler-crm/src/store/index.ts
  11. 5 0
      fhKeeper/formulahousekeeper/customerBuler-crm/src/type.d.ts
  12. 4 1
      fhKeeper/formulahousekeeper/customerBuler-crm/src/utils/request.ts
  13. 1 0
      fhKeeper/formulahousekeeper/customerBuler-crm/src/vite-env.d.ts
  14. 5924 0
      fhKeeper/formulahousekeeper/management-crm/crm.log
  15. 21 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/BusinessItemProductController.java
  16. 57 1
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/BusinessOpportunityController.java
  17. 54 31
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/ClueController.java
  18. 6 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/ContactsController.java
  19. 75 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/ProductController.java
  20. 14 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/TaskController.java
  21. 21 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/TaskRepeatDesignController.java
  22. 69 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/BusinessItemProduct.java
  23. 10 1
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/BusinessOpportunity.java
  24. 4 1
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/Clue.java
  25. 95 1
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/Task.java
  26. 60 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/TaskRepeatDesign.java
  27. 14 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/dto/TaskDto.java
  28. 2 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/vo/ContactsVo.java
  29. 16 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/mapper/BusinessItemProductMapper.java
  30. 3 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/mapper/BusinessOpportunityMapper.java
  31. 4 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/mapper/ClueMapper.java
  32. 16 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/mapper/TaskRepeatDesignMapper.java
  33. 16 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/BusinessItemProductService.java
  34. 3 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/BusinessOpportunityService.java
  35. 5 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/ClueService.java
  36. 3 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/ContactsService.java
  37. 2 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/ProductService.java
  38. 16 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/TaskRepeatDesignService.java
  39. 2 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/TaskService.java
  40. 20 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/BusinessItemProductServiceImpl.java
  41. 9 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/BusinessOpportunityServiceImpl.java
  42. 47 8
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/ClueServiceImpl.java
  43. 15 1
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/ContactsServiceImpl.java
  44. 33 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/ProductServiceImpl.java
  45. 20 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/TaskRepeatDesignServiceImpl.java
  46. 58 4
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/TaskServiceImpl.java
  47. 3 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/UserServiceImpl.java
  48. 19 0
      fhKeeper/formulahousekeeper/management-crm/src/main/resources/mapper/BusinessItemProductMapper.xml
  49. 20 0
      fhKeeper/formulahousekeeper/management-crm/src/main/resources/mapper/BusinessOpportunityMapper.xml
  50. 80 0
      fhKeeper/formulahousekeeper/management-crm/src/main/resources/mapper/ClueMapper.xml
  51. 16 1
      fhKeeper/formulahousekeeper/management-crm/src/main/resources/mapper/TaskMapper.xml
  52. 19 0
      fhKeeper/formulahousekeeper/management-crm/src/main/resources/mapper/TaskRepeatDesignMapper.xml
  53. 24 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/GroupBudgetReviewController.java
  54. 99 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/TaskController.java
  55. 29 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java
  56. 4 3
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/TaskServiceImpl.java
  57. 4 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/WxCorpInfoServiceImpl.java
  58. 1 2
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/TaskMapper.xml
  59. 150 97
      fhKeeper/formulahousekeeper/timesheet/src/views/project/summary.vue
  60. 150 10
      fhKeeper/formulahousekeeper/timesheet/src/views/task/list.vue
  61. 3 3
      fhKeeper/formulahousekeeper/timesheet_h5/src/views/review/index.vue

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

@@ -60,7 +60,7 @@ body,
   width: 100%;
   height: 100%;
   /* overflow: hidden; */
-  min-width: 650px;
+  min-width: 800px;
 }
 * {
   font-family: '微软雅黑';

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

@@ -9,7 +9,7 @@ import piniaPluginPersistedstate from 'pinia-plugin-persistedstate'
 import App from './App.vue'
 import router from './router/index'
 import * as echarts from 'echarts';
-
+import zhCn from "element-plus/dist/locale/zh-cn.mjs";
 const app = createApp(App)
 const pinia = createPinia()
 
@@ -21,8 +21,10 @@ for (const [key, component] of Object.entries(ElementPlusIconsVue)) {
 
 app.config.globalProperties.$echarts = echarts;
 app
-  .use(ElementPlus)
+  .use(ElementPlus, {
+    locale: zhCn,
+  })
   .use(createPinia())
   .use(router)
   .use(pinia)
-  .mount('#app')
+  .mount("#app");

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

@@ -85,7 +85,7 @@ const updateVisibleItems = () => {
   temporaryIndex.splice(temporaryIndex.length -1, 1, lastIndex)
 
   visibleItems.value = temporaryIndex;
-  console.log(visibleItems.value)
+  //console.log(visibleItems.value)
 };
 
 const setCurrentRouter = (item: RouteRecordRaw) => {
@@ -103,7 +103,7 @@ const logout = () => {
 onMounted(() => {
   routerList.value = routers;
   activeRouter.value = routerList.value.find((item) => item.path === router.currentRoute.value.path);
-  console.log("routerList", routerList);
+  //console.log("routerList", routerList);
 
   window.addEventListener('resize', updateVisibleItems);
   setTimeout(() => {

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

@@ -72,7 +72,7 @@ const logout = () => {
 onMounted(() => {
   routerList.value = getRoutersList;
   activeRouter.value = routerList.value.find((item) => item.path === router.currentRoute.value.path);
-  console.log("routerList", routerList);
+  //console.log("routerList", routerList);
 })
 
 </script>

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

@@ -73,9 +73,9 @@ const login = (formEl: FormInstance | undefined) => {
       return false;
     }
     loginLoading.value = true;
-    console.log(ruleForm.value);
+    //console.log(ruleForm.value);
     post(LOGIN, { ...ruleForm.value }).then(res => {
-      console.log(res);
+      //console.log(res);
       if(res.code == 'error') {
         globalPopup?.showError(res.msg)
         loginLoading.value = false;
@@ -90,7 +90,7 @@ const login = (formEl: FormInstance | undefined) => {
       }, 1000)
       loginLoading.value = false;
     }).catch(err => {
-      console.log(err)
+      //console.log(err)
       loginLoading.value = false;
     })
     return

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

@@ -0,0 +1 @@
+export const MDO = "/tasks";

+ 63 - 36
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/tasks/index.vue

@@ -2,43 +2,46 @@
   <div class="h-full flex">
     <div class="p-5 w-80 pr-0">
       <div class="bg-white w-full h-full shadow-md rounded-md flex flex-col">
-        <div class="flex-1 p-3 overflow-y-scroll">
-          <ul>
-            <li>sssss</li>
-            <li>sssss</li>
-            <li>sssss</li>
-            <li>sssss</li>
-            <li>sssss</li>
-            <li>sssss</li>
-            <li>sssss</li>
-            <li>sssss</li>
-            <li>sssss</li>
-            <li>sssss</li>
-            <li>sssss</li>
-            <li>sssss</li>
-            <li>sssss</li>
-            <li>sssss</li>
-            <li>sssss</li>
-            <li>sssss</li>
-            <li>sssss</li>
-            <li>sssss</li>
-            <li>sssss</li>
-            <li>sssss</li>
-            <li>sssss</li>
-            <li>sssss</li>
-            <li>sssss</li>
-            <li>sssss</li>
-            <li>sssss</li>
-            <li>sssss</li>
-            <li>sssss</li>
-            <li>sssss</li>
-            <li>sssss</li>
-            <li>sssss</li>
-          </ul>
+        <div class="flex-1 p-3 overflow-y-auto">
+          <el-form :model="ruleForm">
+            <el-form-item label="任务名称:" label-width="7em" prop="taskName">
+              <el-input v-model="ruleForm.taskName" placeholder="请输入" />
+            </el-form-item>
+            <el-form-item label="客户名称:" label-width="7em" prop="customerName">
+              <el-input v-model="ruleForm.customerName" placeholder="请输入" />
+            </el-form-item>
+            <el-form-item label="联系人电话:" label-width="7em" prop="tel">
+              <el-input v-model="ruleForm.tel" placeholder="请输入" />
+            </el-form-item>
+            <el-form-item label="优先级" label-width="7em" prop="priority">
+              <el-select v-model="ruleForm.priority" placeholder="请选择">
+                <el-option label="全部" value="0" />
+                <el-option label="高" value="1" />
+                <el-option label="中" value="2" />
+                <el-option label="低" value="3" />
+              </el-select>
+            </el-form-item>
+            <el-form-item label="任务状态" label-width="7em" prop="status">
+              <el-select v-model="ruleForm.status" placeholder="请选择">
+                <el-option label="全部" value="0" />
+                <el-option label="未开始" value="1" />
+                <el-option label="进行中" value="2" />
+                <el-option label="已完成" value="3" />
+                <el-option label="超时" value="4" />
+              </el-select>
+            </el-form-item>
+            <el-form-item label="开始日期" label-width="7em" prop="startDate">
+              <el-date-picker v-model="ruleForm.startDate" type="date" placeholder="选择日期" value-format="YYYY-MM-DD" />
+            </el-form-item>
+            <el-form-item label="结束日期" label-width="7em" prop="endDate">
+              <el-date-picker v-model="ruleForm.endDate" type="date" placeholder="选择日期" value-format="YYYY-MM-DD" />
+            </el-form-item>
+
+          </el-form>
         </div>
         <div class="w-full flex p-3 shadow-[0_-3px_5px_0px_rgba(0,0,0,0.2)]">
-          <El-button class="w-full">重置</El-Button>
-          <El-button type="primary" class="w-full">搜索</El-Button>
+          <el-button size="large" class="w-full" @click="reset()">重置</el-Button>
+          <el-button type="primary" size="large" class="w-full" @click="search()">搜索</el-Button>
         </div>
       </div>
     </div>
@@ -49,7 +52,31 @@
 </template>
 
 <script lang="ts" setup>
-
+import { onBeforeMount, onMounted, ref } from 'vue';
+import { useStore } from '@/store';
+import { MDO } from './api';
+const { getFunctionList } = useStore()
+const config = ref<any>([])
+const defaultForm = {
+  taskName: '',
+  customerName: '',
+  tel: '',
+  priority: '0',
+  status: '0',
+  startDate: '',
+  endDate: '',
+}
+const ruleForm = ref<any>()
+const reset = () => {
+  ruleForm.value = defaultForm;
+}
+const search = () => {
+  console.log("ruleForm", ruleForm.value);
+}
+onBeforeMount(() => {
+  config.value = getFunctionList(MDO);
+  ruleForm.value = defaultForm;
+})
 </script>
 
 <style lang="scss" scoped></style>

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

@@ -47,11 +47,11 @@ const router = createRouter({
 router.beforeEach((to, _from, next) => {
   const routerList = useStore().routers;
   const routers = router.getRoutes();
-  console.log(routerList, routers);
+  //console.log(routerList, routers);
   const { setAsyncRoutesMark, asyncRoutesMark, getToken } = useStore();
   const token = getToken;
   const skipPath = ["/login", "/register", "/test", "/testEcharts"];
-  console.log(token, '<==== token')
+  //console.log(token, '<==== token')
   if (skipPath.includes(to.path)) {
     next();
   } else {
@@ -90,10 +90,10 @@ router.beforeEach((to, _from, next) => {
         next({ ...to, replace: true });
       }
     } else {
-      console.log("无登录信息,跳转到登录页");
+      //console.log("无登录信息,跳转到登录页");
       next(`/login`);
     }
   }
-  console.log(routerList);
+  //console.log(routerList);
 });
 export default router;

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

@@ -0,0 +1,17 @@
+type SotreState = {
+  userInfo: any;
+  routers: RouteRecordRaw[];
+  asyncRoutesMark: boolean;
+};
+type SoreGetters = {
+  getRoutersList: () => RouteRecordRaw[];
+  getToken: () => string;
+};
+type SotreActions = {
+  setRouters(arr: any): void;
+  setAsyncRoutesMark(val: boolean): void;
+  setValue(val: any, key: keyof SotreState): void;
+  getRouterConfig(path: string): RouteRecordRaw | any;
+  getFunctionList(path: string): any[];
+  clearStore(): void;
+};

+ 28 - 13
fhKeeper/formulahousekeeper/customerBuler-crm/src/store/index.ts

@@ -1,38 +1,53 @@
 import { defineStore, acceptHMRUpdate } from "pinia";
-import { RouteRecordRaw } from "vue-router";
-export const useStore = defineStore({
-  id: "storeInfo",
+
+export const useStore = defineStore<
+  string,
+  SotreState,
+  SoreGetters,
+  SotreActions
+>("storeInfo", {
   state: () => ({
-    userInfo: { id: '' }, // 当前的用户信息
+    userInfo: {}, // 当前的用户信息
     routers: [], // 返回的所有路由
     asyncRoutesMark: false, // 是否添加过路由
   }),
   getters: {
-    getRoutersList(): RouteRecordRaw[] { // 取值
+    getRoutersList() {
+      // 取值
       return this.routers;
     },
-    getToken(): string {
-      return  this.userInfo?.id || ''
-    }
+    getToken() {
+      return this.userInfo?.id || "";
+    },
   },
   actions: {
     // 方法
-    setRouters(arr: any) {
+    setRouters(arr) {
       this.routers = arr;
     },
-    setAsyncRoutesMark(val: boolean) {
+    setAsyncRoutesMark(val) {
       this.asyncRoutesMark = val;
     },
-    setValue(val: any, key: 'userInfo' | 'routers' | 'asyncRoutesMark') {
+    setValue(val, key) {
       this[key] = val;
     },
+    getRouterConfig(path) {
+      return this.routers.find((item) => item.path === path);
+    },
+    getFunctionList(path) {
+      const config = this.getRouterConfig(path);
+      if (!config) {
+        return [];
+      }
+      return config.functionList || [];
+    },
     clearStore() {
       localStorage.clear();
       sessionStorage.clear();
-      this.userInfo = { id: '' };
+      this.userInfo = {};
       this.routers = [];
       this.asyncRoutesMark = false;
-    }
+    },
   },
   persist: true, // 是否持久化
 });

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

@@ -3,4 +3,9 @@ interface GlobalPopup extends Notify {
   showError: (message?: string) => void;
   showWarning: (message: string) => void;
   showInfo: (message: string) => void;
+}
+
+interface Tree {
+  label: string
+  children?: Tree[]
 }

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

@@ -2,6 +2,7 @@ import axios from "axios";
 import { showMessage } from "./errorStatusCode"; // 引入状态码文件
 import type { AxiosRequestConfig, AxiosResponse, AxiosError } from "axios";
 import { ElNotification } from "element-plus";
+import { useStore } from "../store/index";
 const baseURL = "/api";
 // 创建axios实例
 const instance = axios.create({
@@ -12,8 +13,10 @@ const instance = axios.create({
 instance.interceptors.request.use(
   (config: AxiosRequestConfig): any => {
     // 可在请求发送前对config进行修改,如添加请求头等
+    const { getToken } = useStore()
+    const token = getToken
     const headers = config.headers || {};
-    headers["Authorization"] = "Bxxx";
+    headers["Token"] = token;
     config.headers = headers;
     return config;
   },

+ 1 - 0
fhKeeper/formulahousekeeper/customerBuler-crm/src/vite-env.d.ts

@@ -5,3 +5,4 @@ declare module "*.vue" {
     export default vueComponent;
 }
 
+declare module "element-plus/dist/locale/zh-cn.mjs";

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


+ 21 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/BusinessItemProductController.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-07
+ */
+@RestController
+@RequestMapping("/business-item-product")
+public class BusinessItemProductController {
+
+}
+

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

@@ -1,13 +1,26 @@
 package com.management.platform.controller;
 
 
+import com.management.platform.entity.BusinessOpportunity;
+import com.management.platform.entity.User;
+import com.management.platform.mapper.UserMapper;
+import com.management.platform.service.BusinessOpportunityService;
+import com.management.platform.service.SysFunctionService;
+import com.management.platform.service.UserService;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.web.bind.annotation.RequestBody;
 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.ArrayList;
+import java.util.List;
+
 /**
  * <p>
- *  前端控制器
+ * 前端控制器
  * </p>
  *
  * @author Seyason
@@ -17,5 +30,48 @@ import org.springframework.web.bind.annotation.RestController;
 @RequestMapping("/business-opportunity")
 public class BusinessOpportunityController {
 
+    @Resource
+    private UserMapper userMapper;
+    @Resource
+    private SysFunctionService sysFunctionService;
+
+    @Resource
+    private BusinessOpportunityService bOservice;
+
+
+    @RequestMapping("insertAndUpdate")
+    public HttpRespMsg insertAndUpdate(@RequestBody BusinessOpportunity bo) {
+        HttpRespMsg msg = new HttpRespMsg();
+        msg.setMsg("操作成功");
+        return msg;
+
+    }
+
+    @RequestMapping("list")
+    public HttpRespMsg list(@RequestBody BusinessOpportunity bo, HttpServletRequest request) {
+        HttpRespMsg msg = new HttpRespMsg();
+        User user = userMapper.selectById(request.getHeader("Token"));
+        bo.setCompanyId(user.getCompanyId());
+        List<BusinessOpportunity> list = new ArrayList<>();
+        boolean isAll = sysFunctionService.hasPriviledge(user.getRoleId(), "查看全部商机");
+        boolean isNotAll = sysFunctionService.hasPriviledge(user.getRoleId(), "查看全部商机");
+        if (!isAll) {
+            list = bOservice.getAll(bo);
+        } else if (!isNotAll) {
+            list = bOservice.getAll(bo);
+        }
+        return msg;
+
+    }
+
+    @RequestMapping("getAllProduct")
+    public HttpRespMsg getAllProduct(@RequestBody BusinessOpportunity bo) {
+        HttpRespMsg msg = new HttpRespMsg();
+        msg.setMsg("操作成功");
+        return msg;
+
+    }
+
+
 }
 

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

@@ -6,8 +6,10 @@ 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.SysFunctionMapper;
 import com.management.platform.mapper.UserMapper;
 import com.management.platform.service.ClueService;
+import com.management.platform.service.SysFunctionService;
 import com.management.platform.service.UserService;
 import com.management.platform.util.HttpRespMsg;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -18,13 +20,14 @@ import org.springframework.web.bind.annotation.RestController;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
+import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
 /**
  * <p>
- *  前端控制器
+ * 前端控制器
  * </p>
  *
  * @author Seyason
@@ -37,66 +40,78 @@ public class ClueController {
     private ClueService clueService;
     @Resource
     private UserMapper userMapper;
+    @Resource
+    private SysFunctionService sysFunctionService;
 
     @Resource
     private SysDictMapper sysDictMapper;
 
 
-    @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){
+    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){
+    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);
+        User user = userMapper.selectById(request.getHeader("Token"));
+        clue.setCompanyId(user.getCompanyId());
+        boolean isAll = sysFunctionService.hasPriviledge(user.getRoleId(), "查看全部线索");
+        boolean isNotAll = sysFunctionService.hasPriviledge(user.getRoleId(), "查看负责部门线索");
+        List<Clue> list = new ArrayList<>();
+        if (!isAll) {
+            //查看全部线索
+            list = clueService.getList(clue);
+        } else if (!isNotAll) {
+            //查看负责部门线索 找出所处部门下所有的负责人
+            list = clueService.getList1(clue, user);
+        } else {
+            // 查看负责人为 自己 和 null的数据
+            list = clueService.getList2(clue, user);
+        }
         HashMap<Object, Object> map = new HashMap<>();
-        map.put("data",list);
-        map.put("total",clueService.getTotal(clue));
+        map.put("data", list);
+        map.put("total", clueService.getTotal(clue));
         return map;
     }
+
     @RequestMapping("listDeleterClue")
-    public Object listDeleterClue(@RequestBody Clue clue, HttpServletRequest request){
+    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);
+         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));
+        map.put("data", list);
+        map.put("total", clueService.getDeleterTotal(clue));
         return map;
     }
+
     @RequestMapping("/insertAndUpdate")
-    public Object inserANdUpdate(@RequestBody Clue clue, HttpServletRequest request){
+    public Object inserANdUpdate(@RequestBody Clue clue, HttpServletRequest request) {
         HttpRespMsg msg = new HttpRespMsg();
         //操作前校验
         //TODO token待定
         // User user = userMapper.selectById(request.getHeader(  "Token"));
         // Integer companyId = user.getCompanyId();
-        if (null == clue.getClueName() || "".equals(clue.getClueName())){
+        if (null == clue.getClueName() || "".equals(clue.getClueName())) {
             msg.setError("线索名称不能为空");
             return msg;
         }
-        if (null == clue.getClueSourceId()){
+        if (null == clue.getClueSourceId()) {
             msg.setError("线索来源不能为空");
             return msg;
         }
         clue.setIsDelete(0);
-        if (null != clue.getId()){
+        if (null != clue.getId()) {
             //修改
             clueService.update(clue);
             msg.setMsg("操作成功");
-        }else {
+        } else {
             //新增
             //TODO token待定
             // clue.setCompanyId(companyId);
@@ -106,12 +121,12 @@ public class ClueController {
 
             msg.setMsg("操作成功");
         }
-        return  msg;
+        return msg;
     }
 
 
     @RequestMapping("delete")
-    public Object delete(@RequestBody List<Integer> ids){
+    public Object delete(@RequestBody List<Integer> ids) {
         HttpRespMsg msg = new HttpRespMsg();
         msg.setMsg("操作成功");
         clueService.isDelete(ids);
@@ -119,14 +134,24 @@ public class ClueController {
     }
 
     @RequestMapping("rollback")
-    public Object rollback(@RequestBody List<Integer> ids){
+    public Object rollback(@RequestBody List<Integer> ids) {
         HttpRespMsg msg = new HttpRespMsg();
         msg.setMsg("操作成功");
         clueService.isRollback(ids);
         return msg;
     }
+
+    @RequestMapping("claim")
+    public Object claim(@RequestBody Clue clue, HttpServletRequest request) {
+        User user = userMapper.selectById(request.getHeader("Token"));
+        HttpRespMsg msg = new HttpRespMsg();
+        msg.setMsg("操作成功");
+        clueService.getAndTransfer(clue,user);
+        return msg;
+    }
+
     @RequestMapping("deleterDelete")
-    public Object deleterDelete(@RequestBody List<Integer> ids){
+    public Object deleterDelete(@RequestBody List<Integer> ids) {
         HttpRespMsg msg = new HttpRespMsg();
         msg.setMsg("操作成功");
         clueService.deleterDelete(ids);
@@ -134,7 +159,5 @@ public class ClueController {
     }
 
 
-
-
 }
 

+ 6 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/ContactsController.java

@@ -2,6 +2,7 @@ package com.management.platform.controller;
 
 
 import com.management.platform.entity.Contacts;
+import com.management.platform.entity.Custom;
 import com.management.platform.service.ContactsService;
 import com.management.platform.util.HttpRespMsg;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -42,5 +43,10 @@ public class ContactsController {
         return contactsService.pageContacts(pageIndex,pageSize,customName,name,phone,ownerName,request);
     }
 
+    @RequestMapping("selectContactsByCustomId")
+    public HttpRespMsg selectContactsByCustomId(@RequestBody Custom custom,HttpServletRequest request){
+        return contactsService.selectContactsByCustomId(custom,request);
+    }
+
 }
 

+ 75 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/ProductController.java

@@ -1,9 +1,20 @@
 package com.management.platform.controller;
 
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.management.platform.entity.Product;
+import com.management.platform.entity.Task;
+import com.management.platform.mapper.UserMapper;
+import com.management.platform.service.ProductService;
+import com.management.platform.service.TaskService;
+import com.management.platform.util.HttpRespMsg;
 import org.springframework.web.bind.annotation.RequestMapping;
 
 import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
 
 /**
  * <p>
@@ -16,6 +27,70 @@ import org.springframework.web.bind.annotation.RestController;
 @RestController
 @RequestMapping("/product")
 public class ProductController {
+    @Resource
+    private ProductService productService;
+    @Resource
+    private UserMapper userMapper;
+    @Resource
+    private HttpServletRequest request;
+    @Resource
+    private TaskService taskService;
+
+    @RequestMapping("/list")
+    public HttpRespMsg list(String userId,String productName,String productCode,Integer pageIndex,Integer pageSize){
+        Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
+        return productService.getList(companyId,userId,productName,productCode,pageIndex,pageSize);
+    }
+
+    @RequestMapping("/addOrUpdate")
+    public HttpRespMsg addOrUpdate(Product product){
+        HttpRespMsg msg=new HttpRespMsg();
+        Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
+        product.setCompanyId(companyId);
+        int count;
+        if(product.getId()==null){
+            count = productService.count(new LambdaQueryWrapper<Product>().eq(Product::getCompanyId, companyId).eq(Product::getProductCode, product.getProductCode()));
+        }else {
+            count = productService.count(new LambdaQueryWrapper<Product>().eq(Product::getCompanyId, companyId).ne(Product::getId,product.getId()).eq(Product::getProductCode, product.getProductCode()));
+        }
+        if(count>0){
+            msg.setError("产品编码为["+product.getProductCode()+"]的产品已存在");
+            return msg;
+        }
+        if(!productService.saveOrUpdate(product)){
+            msg.setError("验证失败");
+            return msg;
+        }
+        return msg;
+    }
+
+
+    @RequestMapping("/delete")
+    public HttpRespMsg delete(Integer id){
+        HttpRespMsg msg=new HttpRespMsg();
+        int count = taskService.count(new LambdaQueryWrapper<Task>().eq(Task::getProductId, id));
+        if(count>0){
+            msg.setError("当前产品已绑定到相关任务,删除失败");
+            return msg;
+        }
+        if(!productService.removeById(id)){
+            msg.setError("验证失败");
+            return msg;
+        }
+        return msg;
+    }
+
+    @RequestMapping("/getTemplate")
+    public HttpRespMsg getTemplate(Integer id){
+        HttpRespMsg msg=new HttpRespMsg();
+        return msg;
+    }
+
+    @RequestMapping("/importData")
+    public HttpRespMsg importData(MultipartFile file){
+        HttpRespMsg msg=new HttpRespMsg();
+        return msg;
+    }
 
 }
 

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

@@ -9,14 +9,17 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.github.pagehelper.IPage;
 import com.management.platform.entity.*;
+import com.management.platform.entity.dto.TaskDto;
 import com.management.platform.entity.vo.SysRichFunction;
 import com.management.platform.mapper.*;
 import com.management.platform.service.*;
 import com.management.platform.util.HttpRespMsg;
 import com.management.platform.util.MessageUtils;
+import com.taobao.api.internal.mapping.ApiField;
 import org.assertj.core.util.Lists;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
@@ -42,6 +45,17 @@ import java.util.stream.Collectors;
 @RestController
 @RequestMapping("/task")
 public class TaskController {
+    @Resource
+    private HttpServletRequest request;
+    @Resource
+    private TaskService taskService;
+
+
+
+    @RequestMapping("addTask")
+    public HttpRespMsg addTask(@RequestBody TaskDto taskDto){
+        return taskService.addTask(taskDto, request);
+    }
 
 }
 

+ 21 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/TaskRepeatDesignController.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-06
+ */
+@RestController
+@RequestMapping("/task-repeat-design")
+public class TaskRepeatDesignController {
+
+}
+

+ 69 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/BusinessItemProduct.java

@@ -0,0 +1,69 @@
+package com.management.platform.entity;
+
+import java.math.BigDecimal;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableField;
+import java.io.Serializable;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author Seyason
+ * @since 2024-03-07
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class BusinessItemProduct extends Model<BusinessItemProduct> {
+
+    private static final long serialVersionUID=1L;
+
+    /**
+     *  
+     */
+    @TableId("id")
+    private Integer id;
+
+    /**
+     * 产品id
+     */
+    @TableField("product_id")
+    private Integer productId;
+
+    /**
+     * 商机id
+     */
+    @TableField("business_id")
+    private Integer businessId;
+
+    /**
+     * 数量
+     */
+    @TableField("quantity")
+    private Integer quantity;
+
+    /**
+     * 折扣率
+     */
+    @TableField("discount")
+    private Integer discount;
+
+    /**
+     * 合计价格
+     */
+    @TableField("total_price")
+    private BigDecimal totalPrice;
+
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+}

+ 10 - 1
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/BusinessOpportunity.java

@@ -6,6 +6,8 @@ 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;
@@ -30,6 +32,8 @@ public class BusinessOpportunity extends Model<BusinessOpportunity> {
 
     @TableField("company_id")
     private Integer companyId;
+    private Integer productId;
+    private String inchargerId;
 
     /**
      * 商机名称
@@ -65,7 +69,9 @@ public class BusinessOpportunity extends Model<BusinessOpportunity> {
      * 创建时间
      */
     @TableField("create_time")
-    private LocalDateTime createTime;
+    private Date createTime;
+    private Date startTime;
+    private Date endTIme;
 
     /**
      * 创建人
@@ -84,6 +90,8 @@ public class BusinessOpportunity extends Model<BusinessOpportunity> {
      */
     @TableField("is_delete")
     private Integer isDelete;
+    private Integer pageIndex;
+    private Integer pageFrom;
 
     /**
      * 自定义字段存值
@@ -116,6 +124,7 @@ public class BusinessOpportunity extends Model<BusinessOpportunity> {
     private String plate5;
 
 
+
     @Override
     protected Serializable pkVal() {
         return this.id;

+ 4 - 1
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/Clue.java

@@ -87,7 +87,10 @@ public class Clue extends Model<Clue> {
      * 负责人id
      */
     @TableField("incharger_id")
-    private Integer inchargerId;
+    private String inchargerId;
+
+
+//    private String tempInchargerId;
 
     /**
      * 备注

+ 95 - 1
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/Task.java

@@ -2,6 +2,7 @@ package com.management.platform.entity;
 
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.extension.activerecord.Model;
+import java.time.LocalDate;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableField;
 import java.io.Serializable;
@@ -15,7 +16,7 @@ import lombok.experimental.Accessors;
  * </p>
  *
  * @author Seyason
- * @since 2024-02-28
+ * @since 2024-03-07
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -27,6 +28,15 @@ public class Task extends Model<Task> {
     @TableId(value = "id", type = IdType.AUTO)
     private Integer id;
 
+    /**
+     * 任务名称
+     */
+    @TableField("task_name")
+    private String taskName;
+
+    /**
+     * 公司id
+     */
     @TableField("company_id")
     private Integer companyId;
 
@@ -42,6 +52,12 @@ public class Task extends Model<Task> {
     @TableField("contacts_id")
     private Integer contactsId;
 
+    /**
+     * 执行人id,多个
+     */
+    @TableField("executor_id")
+    private String executorId;
+
     /**
      * 线索id
      */
@@ -66,6 +82,12 @@ public class Task extends Model<Task> {
     @TableField("order_id")
     private Integer orderId;
 
+    /**
+     * 产品id
+     */
+    @TableField("product_id")
+    private Integer productId;
+
     /**
      * 状态 0-启动 1-进行中 2-完成 3-推迟
      */
@@ -84,6 +106,78 @@ public class Task extends Model<Task> {
     @TableField("repeat")
     private Integer repeat;
 
+    /**
+     * 重复类型 :每天:0、每周:1、每月:2、自定义周期:3、自定义日期:4       五种
+     */
+    @TableField("repeat_type")
+    private Integer repeatType;
+
+    /**
+     * 重复永不结束   1:勾选  
+     */
+    @TableField("repeat_end_never")
+    private Integer repeatEndNever;
+
+    /**
+     * 重复结束 在  ? 次之后
+     */
+    @TableField("repeat_end_count")
+    private Integer repeatEndCount;
+
+    /**
+     * 重复结束 在  ? 日期YYYY-MM-DD之后
+     */
+    @TableField("repeat_end_date")
+    private LocalDate repeatEndDate;
+
+    /**
+     * 自定义周期: 每 ? 天一次
+     */
+    @TableField("repeat_design_day")
+    private Integer repeatDesignDay;
+
+    /**
+     * 任务描述
+     */
+    @TableField("task_desc")
+    private String taskDesc;
+
+    /**
+     * 创建人id
+     */
+    @TableField("creater_id")
+    private String createrId;
+
+    /**
+     * 创建人姓名
+     */
+    @TableField("creater_name")
+    private String createrName;
+
+    /**
+     * 创建时间
+     */
+    @TableField("create_date")
+    private LocalDate createDate;
+
+    /**
+     * 截止时间
+     */
+    @TableField("end_date")
+    private LocalDate endDate;
+
+    /**
+     * 开始日期
+     */
+    @TableField("start_date")
+    private LocalDate startDate;
+
+    /**
+     * 完成日期
+     */
+    @TableField("finish_date")
+    private LocalDate finishDate;
+
     /**
      * 自定义字段存值
      */

+ 60 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/TaskRepeatDesign.java

@@ -0,0 +1,60 @@
+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 lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author Seyason
+ * @since 2024-03-06
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class TaskRepeatDesign extends Model<TaskRepeatDesign> {
+
+    private static final long serialVersionUID=1L;
+
+    @TableId("id")
+    private Integer id;
+
+    /**
+     * 任务的id
+     */
+    @TableField("task_id")
+    private Integer taskId;
+
+    /**
+     * 第几次重复在 ? 天之后    : 保存x1,x2,x3,x4格式
+     */
+    @TableField("day_count")
+    private String dayCount;
+
+    /**
+     * 创建时间
+     */
+    @TableField("create_time")
+    private LocalDateTime createTime;
+
+    /**
+     * 修改时间
+     */
+    @TableField("uptade_time")
+    private LocalDateTime uptadeTime;
+
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+}

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

@@ -0,0 +1,14 @@
+package com.management.platform.entity.dto;
+
+import com.management.platform.entity.Task;
+import com.management.platform.entity.TaskRepeatDesign;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+@EqualsAndHashCode(callSuper = true)
+@Data
+@Accessors(chain = true)
+public class TaskDto extends Task {
+    private TaskRepeatDesign taskRepeatDesign;
+}

+ 2 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/vo/ContactsVo.java

@@ -2,8 +2,10 @@ package com.management.platform.entity.vo;
 
 import com.management.platform.entity.Contacts;
 import lombok.Data;
+import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
 
+@EqualsAndHashCode(callSuper = true)
 @Data
 @Accessors(chain = true)
 public class ContactsVo extends Contacts {

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

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

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

@@ -3,6 +3,8 @@ package com.management.platform.mapper;
 import com.management.platform.entity.BusinessOpportunity;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 
+import java.util.List;
+
 /**
  * <p>
  *  Mapper 接口
@@ -13,4 +15,5 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  */
 public interface BusinessOpportunityMapper extends BaseMapper<BusinessOpportunity> {
 
+    List<BusinessOpportunity> selectAllList(BusinessOpportunity bo);
 }

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

@@ -2,6 +2,7 @@ package com.management.platform.mapper;
 
 import com.management.platform.entity.Clue;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
 
@@ -16,8 +17,11 @@ import java.util.List;
 public interface ClueMapper extends BaseMapper<Clue> {
 
     List<Clue> list(Clue clue);
+    List<Clue> list1(@Param("clue") Clue clue ,@Param("userId") String userId);
     List<Clue> Deleterlist(Clue clue);
 
     Integer getTotal(Clue clue);
     Integer getDeleterTotal(Clue clue);
+
+    List<Clue> list2(Clue clue, String id);
 }

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

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

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

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

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

@@ -3,6 +3,8 @@ package com.management.platform.service;
 import com.management.platform.entity.BusinessOpportunity;
 import com.baomidou.mybatisplus.extension.service.IService;
 
+import java.util.List;
+
 /**
  * <p>
  *  服务类
@@ -13,4 +15,5 @@ import com.baomidou.mybatisplus.extension.service.IService;
  */
 public interface BusinessOpportunityService extends IService<BusinessOpportunity> {
 
+    List<BusinessOpportunity> getAll(BusinessOpportunity bo);
 }

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

@@ -2,6 +2,7 @@ package com.management.platform.service;
 
 import com.management.platform.entity.Clue;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.management.platform.entity.User;
 
 import javax.servlet.http.HttpServletRequest;
 import java.util.List;
@@ -22,6 +23,8 @@ public interface ClueService extends IService<Clue> {
     void isDelete(List<Integer> ids);
 
     List<Clue> getList(Clue clue);
+    List<Clue> getList1(Clue clue, User user);
+    List<Clue> getList2(Clue clue, User user);
     List<Clue> getDeleterList(Clue clue);
 
     Integer getTotal(Clue clue);
@@ -32,4 +35,6 @@ public interface ClueService extends IService<Clue> {
     void isRollback(List<Integer> ids);
 
     void deleterDelete(List<Integer> ids);
+
+    void getAndTransfer(Clue clue,User user);
 }

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

@@ -2,6 +2,7 @@ package com.management.platform.service;
 
 import com.management.platform.entity.Contacts;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.management.platform.entity.Custom;
 import com.management.platform.entity.vo.ContactsVo;
 import com.management.platform.util.HttpRespMsg;
 
@@ -20,4 +21,6 @@ public interface ContactsService extends IService<Contacts> {
     HttpRespMsg addContacts(Contacts contacts, HttpServletRequest request);
 
     HttpRespMsg pageContacts(Integer pageIndex, Integer pageSize, String customName, String name, String phone, String ownerName, HttpServletRequest request);
+
+    HttpRespMsg selectContactsByCustomId(Custom custom,HttpServletRequest request);
 }

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

@@ -2,6 +2,7 @@ package com.management.platform.service;
 
 import com.management.platform.entity.Product;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.management.platform.util.HttpRespMsg;
 
 /**
  * <p>
@@ -13,4 +14,5 @@ import com.baomidou.mybatisplus.extension.service.IService;
  */
 public interface ProductService extends IService<Product> {
 
+    HttpRespMsg getList(Integer companyId,String userId, String productName, String productCode, Integer pageIndex, Integer pageSize);
 }

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

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

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

@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.management.platform.entity.Task;
 import com.management.platform.entity.TaskGroup;
+import com.management.platform.entity.dto.TaskDto;
 import com.management.platform.util.HttpRespMsg;
 import org.springframework.web.multipart.MultipartFile;
 
@@ -21,4 +22,5 @@ import java.util.List;
  */
 public interface TaskService extends IService<Task> {
 
+    HttpRespMsg addTask(TaskDto taskDto, HttpServletRequest request);
 }

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

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

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

@@ -6,6 +6,9 @@ import com.management.platform.service.BusinessOpportunityService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.springframework.stereotype.Service;
 
+import javax.annotation.Resource;
+import java.util.List;
+
 /**
  * <p>
  *  服务实现类
@@ -17,4 +20,10 @@ import org.springframework.stereotype.Service;
 @Service
 public class BusinessOpportunityServiceImpl extends ServiceImpl<BusinessOpportunityMapper, BusinessOpportunity> implements BusinessOpportunityService {
 
+    @Resource
+    private BusinessOpportunityMapper bOMapper;
+    @Override
+    public List<BusinessOpportunity> getAll(BusinessOpportunity bo) {
+        return bOMapper.selectAllList(bo);
+    }
 }

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

@@ -4,11 +4,13 @@ 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.entity.User;
 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;
 import com.management.platform.service.SysFunctionService;
+import com.management.platform.service.UserService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -20,7 +22,7 @@ import java.util.List;
 
 /**
  * <p>
- *  服务实现类
+ * 服务实现类
  * </p>
  *
  * @author Seyason
@@ -35,6 +37,8 @@ public class ClueServiceImpl extends ServiceImpl<ClueMapper, Clue> implements Cl
     private ClueMapper clueMapper;
     @Autowired
     private ClueLogMapper clueLogMapper;
+    @Autowired
+    private UserService userService;
 
     @Override
     @Transactional(rollbackFor = Exception.class)
@@ -65,22 +69,22 @@ public class ClueServiceImpl extends ServiceImpl<ClueMapper, Clue> implements Cl
     }
 
     private Clue setNull(Clue clue) {
-        if (clue.getPlate1() == ""){
+        if (clue.getPlate1() == "") {
             clue.setPlate1(null);
         }
-        if (clue.getPlate2() == ""){
+        if (clue.getPlate2() == "") {
             clue.setPlate2(null);
         }
-        if (clue.getPlate3() == ""){
+        if (clue.getPlate3() == "") {
             clue.setPlate3(null);
         }
-        if (clue.getPlate4() == ""){
+        if (clue.getPlate4() == "") {
             clue.setPlate4(null);
         }
-        if (clue.getPlate5() == ""){
+        if (clue.getPlate5() == "") {
             clue.setPlate5(null);
         }
-    return clue;
+        return clue;
     }
 
     @Override
@@ -98,6 +102,16 @@ public class ClueServiceImpl extends ServiceImpl<ClueMapper, Clue> implements Cl
         return clueMapper.list(clue);
     }
 
+    @Override
+    public List<Clue> getList1(Clue clue, User user) {
+        return clueMapper.list1(clue, user.getId());
+    }
+
+    @Override
+    public List<Clue> getList2(Clue clue, User user) {
+        return clueMapper.list2(clue, user.getId());
+    }
+
     @Override
     public List<Clue> getDeleterList(Clue clue) {
         return clueMapper.Deleterlist(clue);
@@ -107,6 +121,7 @@ public class ClueServiceImpl extends ServiceImpl<ClueMapper, Clue> implements Cl
     public Integer getTotal(Clue clue) {
         return clueMapper.getTotal(clue);
     }
+
     @Override
     public Integer getDeleterTotal(Clue clue) {
         return clueMapper.getDeleterTotal(clue);
@@ -116,7 +131,7 @@ public class ClueServiceImpl extends ServiceImpl<ClueMapper, Clue> implements Cl
     public Clue getInfo(Clue clue) {
         Clue clue1 = clueMapper.selectById(clue.getId());
         QueryWrapper<ClueLog> queryWrapper = new QueryWrapper<>();
-        queryWrapper.eq("clue_id",clue.getId());
+        queryWrapper.eq("clue_id", clue.getId());
         List<ClueLog> logs = clueLogMapper.selectList(queryWrapper);
         clue1.setClueLogList(logs);
         return clue1;
@@ -138,5 +153,29 @@ public class ClueServiceImpl extends ServiceImpl<ClueMapper, Clue> implements Cl
         clueMapper.deleteBatchIds(ids);
     }
 
+    @Override
+    public void getAndTransfer(Clue clue,User user) {
+        UpdateWrapper<Clue> updateWrapper = new UpdateWrapper<>();
+        updateWrapper.eq("id",clue.getId());
+        String inchargerId = clue.getInchargerId();
+        ClueLog clueLog = new ClueLog();
+        clueLog.setUserId(user.getId());
+        clueLog.setClueId(clue.getId());
+        clueLog.setCreatTime(new Date());
+        if (inchargerId == null ){
+            //认领
+            clueLog.setName("认领了线索");
+            clue.setInchargerId(user.getId());
+            clueLogMapper.insert(clueLog);
+        }else {
+            //转移
+            clueLog.setName("转移了线索");
+            clue.setInchargerId(clue.getInchargerId());
+            clueLogMapper.insert(clueLog);
+        }
+        clueMapper.update(clue, updateWrapper);
+
+    }
+
 
 }

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

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.management.platform.entity.Contacts;
+import com.management.platform.entity.Custom;
 import com.management.platform.entity.User;
 import com.management.platform.entity.vo.ContactsVo;
 import com.management.platform.mapper.ContactsMapper;
@@ -56,7 +57,8 @@ public class ContactsServiceImpl extends ServiceImpl<ContactsMapper, Contacts> i
             httpRespMsg.setError("已存在该客户!");
         }
         contacts.setCompanyId(companyId)
-                .setOwnerId(user.getId())//添加时默认
+                //todo:联系人的所有人是可选择的
+//                .setOwnerId(user.getId())//添加时默认
                 .setIsDelete(0)
                 .setCreateTime(LocalDateTime.now());
         int insert = contactsMapper.insert(contacts);
@@ -84,5 +86,17 @@ public class ContactsServiceImpl extends ServiceImpl<ContactsMapper, Contacts> i
         return msg;
     }
 
+    @Override
+    public HttpRespMsg selectContactsByCustomId(Custom custom,HttpServletRequest request) {
+        HttpRespMsg msg = new HttpRespMsg();
+        String token = String.valueOf(request.getHeader("Token"));
+        User user = userMapper.selectById(token);
+        LambdaQueryWrapper<Contacts> contactsLambdaQueryWrapper = new LambdaQueryWrapper<>();
+        contactsLambdaQueryWrapper.eq(Contacts::getCustomId,custom.getId()).eq(Contacts::getCompanyId,user.getCompanyId());
+        List<Contacts> contactsList = contactsMapper.selectList(contactsLambdaQueryWrapper);
+        msg.setData(contactsList);
+        return msg;
+    }
+
 
 }

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

@@ -1,10 +1,19 @@
 package com.management.platform.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.management.platform.entity.Product;
 import com.management.platform.mapper.ProductMapper;
 import com.management.platform.service.ProductService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.management.platform.util.HttpRespMsg;
 import org.springframework.stereotype.Service;
+import org.springframework.util.StringUtils;
+
+import javax.annotation.Resource;
+import java.util.HashMap;
+import java.util.Map;
 
 /**
  * <p>
@@ -17,4 +26,28 @@ import org.springframework.stereotype.Service;
 @Service
 public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> implements ProductService {
 
+    @Resource
+    private ProductMapper productMapper;
+
+    @Override
+    public HttpRespMsg getList(Integer companyId,String userId, String productName, String productCode, Integer pageIndex, Integer pageSize) {
+        HttpRespMsg msg=new HttpRespMsg();
+        LambdaQueryWrapper<Product> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(Product::getCompanyId,companyId);
+        if(!StringUtils.isEmpty(userId)){
+            queryWrapper.eq(Product::getCreatorId,userId);
+        }
+        if(!StringUtils.isEmpty(productName)){
+            queryWrapper.like(Product::getProductName,productName);
+        }
+        if(!StringUtils.isEmpty(productCode)){
+            queryWrapper.like(Product::getProductCode,productCode);
+        }
+        IPage<Product> productIPage = productMapper.selectPage(new Page<>(pageIndex, pageSize), queryWrapper);
+        Map map=new HashMap();
+        map.put("record",productIPage.getRecords());
+        map.put("total",productIPage.getTotal());
+        msg.setData(map);
+        return msg;
+    }
 }

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

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

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

@@ -6,20 +6,20 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.github.pagehelper.util.StringUtil;
 import com.management.platform.entity.*;
+import com.management.platform.entity.dto.TaskDto;
 import com.management.platform.mapper.*;
-import com.management.platform.service.CompanyDingdingService;
-import com.management.platform.service.TaskExecutorService;
-import com.management.platform.service.TaskService;
-import com.management.platform.service.WxCorpInfoService;
+import com.management.platform.service.*;
 import com.management.platform.util.ExcelUtil;
 import com.management.platform.util.HttpRespMsg;
 import com.management.platform.util.MessageUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.poi.hssf.usermodel.*;
 import org.apache.poi.ss.usermodel.CellType;
 import org.apache.poi.xssf.usermodel.XSSFCell;
 import org.apache.poi.xssf.usermodel.XSSFRow;
 import org.apache.poi.xssf.usermodel.XSSFSheet;
 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -30,6 +30,7 @@ import javax.servlet.http.HttpServletRequest;
 import java.io.*;
 import java.text.SimpleDateFormat;
 import java.time.LocalDate;
+import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 import java.util.*;
 import java.util.stream.Collectors;
@@ -46,5 +47,58 @@ import java.util.stream.Collectors;
 @Transactional
 public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements TaskService {
 
+    @Resource
+    private UserMapper userMapper;
+    @Resource
+    private TaskMapper taskMapper;
+    @Resource
+    private TaskLogMapper taskLogMapper;
 
+    @Resource
+    private TaskRepeatDesignMapper taskRepeatDesignMapper;
+
+
+    @Override
+    @Transactional
+    public HttpRespMsg addTask(TaskDto taskDto, HttpServletRequest request) {
+        HttpRespMsg httpRespMsg = new HttpRespMsg();
+
+        String userId = String.valueOf(request.getHeader("Token"));
+        User user = userMapper.selectById(userId);
+        if (user==null){
+            httpRespMsg.setError("无法获取创建人信息!");
+            return httpRespMsg;
+        }
+
+        if (StringUtils.isEmpty(taskDto.getTaskName())||taskDto.getPriority()==null){
+            httpRespMsg.setError("缺少任务名称或任务优先级!");
+            return httpRespMsg;
+        }
+        Task task = new Task();
+        BeanUtils.copyProperties(taskDto,task);
+        task.setCreateDate(LocalDate.now());//任务的创建时间
+        task.setCreaterName(user.getName());
+        task.setCompanyId(user.getCompanyId());
+
+        taskMapper.insert(task);
+
+        //重复状态为 自定义日期:4
+        if (taskDto.getRepeatType()==4){
+            TaskRepeatDesign taskRepeatDesign = new TaskRepeatDesign();
+            taskRepeatDesign.setTaskId(task.getId());
+            taskRepeatDesign.setDayCount(taskDto.getTaskRepeatDesign().getDayCount());
+            taskRepeatDesign.setCreateTime(LocalDateTime.now());
+            taskRepeatDesignMapper.insert(taskRepeatDesign);
+        }
+        //添加任务编译记录
+        TaskLog taskLog = new TaskLog();
+        taskLog.setTaskId(task.getId());
+        taskLog.setContent("创建了任务");
+        taskLog.setUserId(userId);
+        taskLog.setUserName(user.getName());
+        taskLog.setModTime(LocalDateTime.now());
+        taskLogMapper.insert(taskLog);
+
+        return httpRespMsg;
+    }
 }

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

@@ -842,6 +842,9 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
     public HttpRespMsg getEmployeeList(Integer departmentId,Integer matchingType,String keyword, Integer status, Integer roleId, Integer onlyDirect, String cursor, Integer pageIndex, Integer pageSize, HttpServletRequest request) throws Exception {
         HttpRespMsg httpRespMsg = new HttpRespMsg();
         Boolean flag = false;
+        if(status.equals(3)){
+            status=null;
+        }
         if (status != null && status.equals(2)){
             status = 0;
             flag = true;

+ 19 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/resources/mapper/BusinessItemProductMapper.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.BusinessItemProductMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.management.platform.entity.BusinessItemProduct">
+        <id column="id" property="id" />
+        <result column="product_id" property="productId" />
+        <result column="quantity" property="quantity" />
+        <result column="discount" property="discount" />
+        <result column="total_price" property="totalPrice" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, product_id, quantity, discount, total_price
+    </sql>
+
+</mapper>

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

@@ -26,5 +26,25 @@
     <sql id="Base_Column_List">
         id, company_id, name, customer_id, amount_of_money, expected_transaction_date, stage, create_time, creator_id, remark, is_delete, plate1, plate2, plate3, plate4, plate5
     </sql>
+    <select id="selectAllList" resultType="com.management.platform.entity.BusinessOpportunity">
+        select * FROM business_opportunity b
+                 left join business_item_product ip ON ip.business_id = b.id
+                 left join product p on p.id = ip.product_id
+        WHERE b.company_id = #{companyId}
+        <if test="name != null and name != ''" >
+         and b.name = #{name}
+        </if>
+        <if test="stage != null " >
+            and b.stage = #{stage}
+        </if>
+        <if test="startTime != null and endTime != null " >
+            and b.expected_transaction_date BETWEEN #{startTime} and #{endTime}
+        </if>
+        <if test="productId != null ">
+            and p.id = #{productId}
+        </if>
+        GROUP BY b.id
+        LIMIT #{pageIndex},#{pageSize}
+    </select>
 
 </mapper>

+ 80 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/resources/mapper/ClueMapper.xml

@@ -68,6 +68,86 @@
         </if>
         limit #{pageIndex},#{pageFrom}
     </select>
+    <select id="list1" 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
+        and c.incharger_id in
+        (SELECT id from `user` WHERE department_id = (SELECT department_id from `user` WHERe id = c.id))
+        and c.incharger_id is null
+        <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="list2" 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
+        and c.incharger_id = #{userId} and c.incharger_id is null
+        <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,

+ 16 - 1
fhKeeper/formulahousekeeper/management-crm/src/main/resources/mapper/TaskMapper.xml

@@ -5,16 +5,31 @@
     <!-- 通用查询映射结果 -->
     <resultMap id="BaseResultMap" type="com.management.platform.entity.Task">
         <id column="id" property="id" />
+        <result column="task_name" property="taskName" />
         <result column="company_id" property="companyId" />
         <result column="owner_id" property="ownerId" />
         <result column="contacts_id" property="contactsId" />
+        <result column="executor_id" property="executorId" />
         <result column="clue_id" property="clueId" />
         <result column="custom_id" property="customId" />
         <result column="business_opportunity_id" property="businessOpportunityId" />
         <result column="order_id" property="orderId" />
+        <result column="product_id" property="productId" />
         <result column="status" property="status" />
         <result column="priority" property="priority" />
         <result column="repeat" property="repeat" />
+        <result column="repeat_type" property="repeatType" />
+        <result column="repeat_end_never" property="repeatEndNever" />
+        <result column="repeat_end_count" property="repeatEndCount" />
+        <result column="repeat_end_date" property="repeatEndDate" />
+        <result column="repeat_design_day" property="repeatDesignDay" />
+        <result column="task_desc" property="taskDesc" />
+        <result column="creater_id" property="createrId" />
+        <result column="creater_name" property="createrName" />
+        <result column="create_date" property="createDate" />
+        <result column="end_date" property="endDate" />
+        <result column="start_date" property="startDate" />
+        <result column="finish_date" property="finishDate" />
         <result column="plate1" property="plate1" />
         <result column="plate2" property="plate2" />
         <result column="plate3" property="plate3" />
@@ -24,7 +39,7 @@
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        id, company_id, owner_id, contacts_id, clue_id, custom_id, business_opportunity_id, order_id, status, priority, repeat, plate1, plate2, plate3, plate4, plate5
+        id, task_name, company_id, owner_id, contacts_id, executor_id, clue_id, custom_id, business_opportunity_id, order_id, product_id, status, priority, repeat, repeat_type, repeat_end_never, repeat_end_count, repeat_end_date, repeat_design_day, task_desc, creater_id, creater_name, create_date, end_date, start_date, finish_date, plate1, plate2, plate3, plate4, plate5
     </sql>
 
 </mapper>

+ 19 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/resources/mapper/TaskRepeatDesignMapper.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.TaskRepeatDesignMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.management.platform.entity.TaskRepeatDesign">
+        <id column="id" property="id" />
+        <result column="task_id" property="taskId" />
+        <result column="day_count" property="dayCount" />
+        <result column="create_time" property="createTime" />
+        <result column="uptade_time" property="uptadeTime" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, task_id, day_count, create_time, uptade_time
+    </sql>
+
+</mapper>

+ 24 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/GroupBudgetReviewController.java

@@ -2,6 +2,7 @@ package com.management.platform.controller;
 
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.management.platform.entity.*;
 import com.management.platform.mapper.ProjectMapper;
 import com.management.platform.mapper.TaskGroupMapper;
@@ -10,6 +11,8 @@ import com.management.platform.mapper.WxCorpInfoMapper;
 import com.management.platform.service.ExcelExportService;
 import com.management.platform.service.GroupBudgetReviewService;
 import com.management.platform.service.TaskService;
+import com.management.platform.service.WxCorpInfoService;
+import com.management.platform.service.impl.WxCorpInfoServiceImpl;
 import com.management.platform.util.HttpRespMsg;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.util.StringUtils;
@@ -56,6 +59,8 @@ public class GroupBudgetReviewController {
     private WxCorpInfoMapper wxCorpInfoMapper;
     @Resource
     private ExcelExportService excelExportService;
+    @Resource
+    private WxCorpInfoService wxCorpInfoService;
 
     @RequestMapping("/add")
     public HttpRespMsg add(Integer groupId,Integer oldManDay,Integer changeManDay,Integer nowManDay,String remark){
@@ -95,6 +100,7 @@ public class GroupBudgetReviewController {
     public HttpRespMsg check(Integer id,Integer checkType,String rejectReason){
         HttpRespMsg httpRespMsg=new HttpRespMsg();
         GroupBudgetReview groupBudgetReview=groupBudgetReviewService.getById(id);
+        User checker = userMapper.selectById(request.getHeader("token"));
         if(rejectReason!=null&&!StringUtils.isEmpty(rejectReason)){
             groupBudgetReview.setRejectReason(rejectReason);
         }
@@ -119,6 +125,24 @@ public class GroupBudgetReviewController {
             project.setManDay(day);
             projectMapper.updateById(project);
         }
+        if(checkType!=0){
+            User user = userMapper.selectById(groupBudgetReview.getCreatorId());
+            StringBuilder sb=new StringBuilder();
+            sb.append("$userName="+checker.getCorpwxUserid()+"$");
+            if(checkType==1){
+                sb.append("通过了");
+                sb.append("您预估工时修改申请");
+            }else{
+                sb.append("驳回了");
+                sb.append("您预估工时修改申请");
+                sb.append(",驳回理由:"+groupBudgetReview.getRejectReason());
+            }
+            String corpwxUserid = user.getCorpwxUserid();
+            if (corpwxUserid != null) {
+                WxCorpInfo info = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id",checker.getCompanyId()));
+                wxCorpInfoService.sendWXCorpMsg(info, corpwxUserid,sb.toString(), "groupBudget", WxCorpInfoServiceImpl.TEXT_CARD_MSG_REPORT_DENY);
+            }
+        }
         return  httpRespMsg;
     }
 

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

@@ -15,6 +15,7 @@ import com.management.platform.service.*;
 import com.management.platform.util.HttpRespMsg;
 import com.management.platform.util.MessageUtils;
 import org.assertj.core.util.Lists;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.StringUtils;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -98,6 +99,10 @@ public class TaskController {
     private TaskPersonLiableMapper taskPersonLiableMapper;
     @Resource
     private SapProjectServiceService sapProjectServiceService;
+    @Resource
+    private ExcelExportService excelExportService;
+    @Value(value = "${upload.path}")
+    private String path;
 
     @RequestMapping("/save")
     @Transactional
@@ -1045,7 +1050,11 @@ public class TaskController {
             List<Department> departmentList=departmentService.list(new QueryWrapper<Department>().eq("company_id",companyId));
             branchDepartment= getBranchDepartment(deptId, departmentList);
         }
-        List<Task> list = taskMapper.getTaskWithProjectName(queryWrapper, (pageIndex-1)*pageSize, pageSize,companyId,branchDepartment);
+        Integer pageStart=null;
+        if(pageIndex!=null&&pageSize!=null){
+            pageStart = (pageIndex - 1) * pageSize;
+        }
+        List<Task> list = taskMapper.getTaskWithProjectName(queryWrapper,pageStart, pageSize,companyId,branchDepartment);
         List<Integer> collect = list.stream().map(l -> l.getId()).distinct().collect(Collectors.toList());
         collect.add(-1);
         List<TaskExecutor> taskExecutorList = taskExecutorMapper.selectList(new QueryWrapper<TaskExecutor>().in("task_id", collect));
@@ -1162,5 +1171,94 @@ public class TaskController {
     }
 
 
+    @RequestMapping("exportTaskList")
+    public HttpRespMsg exportTaskList(Integer status, Integer viewId,Integer type,Integer dateType,String startDate,String endDate,Integer deptId,Integer projectId,Integer groupId,String targetUserId){
+        HttpRespMsg msg=new HttpRespMsg();
+        Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
+        DateTimeFormatter df=DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        List<Department> departmentList = departmentService.list(new LambdaQueryWrapper<Department>().eq(Department::getCompanyId, companyId));
+        WxCorpInfo wxCorpInfo = wxCorpInfoService.getOne(new LambdaQueryWrapper<WxCorpInfo>().eq(WxCorpInfo::getCompanyId, companyId));
+        HttpRespMsg respMsg = listByPage(status, viewId, null, null, type, dateType, startDate, endDate, deptId, projectId, groupId, targetUserId);
+        Map<String, Object> msgData = (Map<String, Object>) respMsg.getData();
+        List<Task> taskList = (List<Task>) msgData.get("records");
+        List<Integer> projectIds = taskList.stream().map(Task::getProjectId).distinct().collect(Collectors.toList());
+        projectIds.add(-1);
+        List<Project> projectList = projectService.list(new LambdaQueryWrapper<Project>().in(Project::getId, projectIds));
+        List<List<String>> dataList=new ArrayList<>();
+        List<String> titleList=new ArrayList<>();
+        titleList.add("序号");
+        titleList.add("项目名称");
+        titleList.add("任务阶段");
+        titleList.add("优先级");
+        titleList.add("任务名称");
+        titleList.add("执行人");
+        titleList.add("开始时间");
+        titleList.add("截止时间");
+        boolean anyMatch = projectList.stream().anyMatch(p -> p.getDeptId() != null && !StringUtils.isEmpty(p.getDeptId()));
+        if(anyMatch){
+            titleList.add("所属部门");
+        }
+        dataList.add(titleList);
+        int no=0;
+        for (Task task : taskList) {
+            no++;
+            List<String> item=new ArrayList<>();
+            item.add(no+"");
+            Optional<Project> first = projectList.stream().filter(p -> p.getId().equals(task.getProjectId())).findFirst();
+            if(first.isPresent()){
+                item.add(first.get().getProjectName());
+            }else {
+                item.add("");
+            }
+            item.add(task.getStagesName());
+            switch (task.getTaskLevel()){
+                case 0:item.add("一般");
+                    break;
+                case 1:item.add("重要");
+                    break;
+                case 2:item.add("紧急");
+                    break;
+            }
+            item.add(task.getName());
+            List<TaskExecutor> executorList = task.getExecutorList();
+            String executorString = executorList.stream().map(t->{
+                if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                    return "$userName="+t.getExecutorName()+"$";
+                }else {
+                    return t.getExecutorName();
+                }
+            }).collect(Collectors.joining(","));
+            item.add(executorString);
+            item.add(task.getStartDate()==null?"":df.format(task.getStartDate()));
+            item.add(task.getEndDate()==null?"":df.format(task.getEndDate()));
+            if(anyMatch){
+                if(first.isPresent()){
+                    Project project = first.get();
+                    Optional<Department> department = departmentList.stream().filter(d -> d.getDepartmentId().equals(project.getDeptId())).findFirst();
+                    if(department.isPresent()){
+                        if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                            item.add("$departmentName="+department.get().getCorpwxDeptid()+"$");
+                        }else {
+                            item.add(department.get().getDepartmentName());
+                        }
+                    }else {
+                        item.add("");
+                    }
+                }else {
+                    item.add("");
+                }
+            }
+            dataList.add(item);
+        }
+        String fileName = "待办任务导出_"+System.currentTimeMillis();
+        try {
+            return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,fileName , dataList, path);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return msg;
+    }
+
+
 }
 

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

@@ -11736,6 +11736,10 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                 saveOrUpdate(project);
                 //处理项目下任务 ----> 工时管家生成任务分组
                 List<ProjectTask> projectTasks = item.getProjectTasks();
+                //todo:SAP已同步项目下 删除的任务分组需要删除
+                List<Integer> needRemoveTaskGroupIds=new ArrayList<>();
+                //当前项目下本次获取到的分组数据
+                List<TaskGroup> nowAddTaskGroupList=new ArrayList<>();
                 if(projectTasks!=null&&projectTasks.size()>0){
                     //找到任务列表中 作为项目出现的第一级列表
                     Optional<ProjectTask> targetProject = projectTasks.stream().filter(p -> p.getProjectElementID().equals(project.getProjectCode())).findFirst();
@@ -11762,6 +11766,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                                     taskGroup.setId(one.getId());
                                 }
                                 taskGroupService.saveOrUpdate(taskGroup);
+                                nowAddTaskGroupList.add(taskGroup);
                                 Stages stage = new Stages();
                                 stage.setSequence(1);
                                 stage.setProjectId(project.getId());
@@ -11796,6 +11801,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                                     taskGroup.setId(one.getId());
                                 }
                                 taskGroupService.saveOrUpdate(taskGroup);
+                                nowAddTaskGroupList.add(taskGroup);
                                 Map<String,Object> map=new HashMap<>();
                                 map.put("groupId",taskGroup.getId());
                                 map.put("UUID",group.getUUID());
@@ -11889,6 +11895,28 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                         taskService.saveOrUpdateBatch(tasks);
                     }
                 }
+                //已经同步过的分组数据
+                List<TaskGroup> hadSyncTaskGroups = taskGroupMapper.selectList(new LambdaQueryWrapper<TaskGroup>().eq(TaskGroup::getProjectId, project.getId()));
+                hadSyncTaskGroups.forEach(h->{
+                    if(h.getTaskGroupCode()!=null){
+                        boolean anyMatch = nowAddTaskGroupList.stream().anyMatch(m ->m.getTaskGroupCode()!=null&&m.getTaskGroupCode().equals(h.getTaskGroupCode()));
+                        if(!anyMatch){
+                            needRemoveTaskGroupIds.add(h.getId());
+                        }
+                    }
+                });
+                //删除SAP已删除的任务分组 已存在填报数据的跳过
+                if(needRemoveTaskGroupIds.size()>0){
+                    for (Integer needRemoveTaskGroupId : needRemoveTaskGroupIds) {
+                        Integer count = reportMapper.selectCount(new LambdaQueryWrapper<Report>().eq(Report::getGroupId, needRemoveTaskGroupId));
+                        if(count>0){
+                            continue;
+                        }
+                        taskService.remove(new LambdaQueryWrapper<Task>().eq(Task::getGroupId,needRemoveTaskGroupId));
+                        stagesService.remove(new LambdaQueryWrapper<Stages>().eq(Stages::getGroupId,needRemoveTaskGroupId));
+                        taskGroupService.removeById(needRemoveTaskGroupId);
+                    }
+                }
             }
         }
         //处理项目下服务数据 ------->工时管家相关项目下任务分组下创建任务数据
@@ -11957,7 +11985,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                 LocalDate createTimeLocalDate = createTime.toLocalDate();
                 boolean b1 = WorkDayCalculateUtils.sameMonth(createDate, createTimeLocalDate);
                 boolean b2 = WorkDayCalculateUtils.sameWeek(createDate, createTimeLocalDate);
-                if (b1&&b2){
+                if (b1||b2){
                     reports.add(report);
                 }
             }

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

@@ -28,6 +28,7 @@ import org.springframework.web.multipart.MultipartFile;
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import java.io.*;
+import java.math.BigDecimal;
 import java.text.SimpleDateFormat;
 import java.time.LocalDate;
 import java.time.format.DateTimeFormatter;
@@ -178,10 +179,10 @@ public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements Ta
                 row.createCell(0).setCellValue(rowNum);
                 row.createCell(1).setCellValue((String) map.get("name"));
                 row.createCell(2).setCellValue((Double) map.get("workHours"));
-                row.createCell(3).setCellValue((Integer) map.get("planHours"));
+                row.createCell(3).setCellValue(new BigDecimal(String.valueOf(map.get("planHours"))).doubleValue());
                 HSSFCell percentCell = row.createCell(4);
-                if ((Integer) map.get("planHours") != null) {
-                    int percent = (int)(double) map.get("workHours")*100/(Integer) map.get("planHours");
+                if (map.get("planHours") != null) {
+                    int percent = (int)(double) map.get("workHours")*100/new BigDecimal(String.valueOf(map.get("planHours"))).intValue();
                     percent = (percent - 100);
                     String sign = "";
                     if (percent > 0) {

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

@@ -310,6 +310,10 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
                     //费用报销
                     title = "工时管家:任务到期通知";
                 }
+                else if ("groupBudget".equals(pageRouter)) {
+                    //预估工时审核
+                    title = "预估工时审核通知";
+                }
             }
             cardJson.put("title", title);
             cardJson.put("description", msg);

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

@@ -150,11 +150,10 @@
 
     <!-- 查询任务实际工时和计划工时对比,仅查询有实际工时的数据 -->
     <select id="getTaskTimeCompare" resultType="java.util.Map">
-        SELECT t.id , t.name AS name ,IFNULL(SUM(te.plan_hours),0) AS planHours, IFNULL(SUM(r.`working_time`),0) AS workHours FROM
+        SELECT t.id , t.name AS name ,IFNULL(SUM(te.plan_hours),0) AS planHours, IFNULL((SELECT SUM(r.`working_time`) FROM report r WHERE r.task_id=t.id AND r.state=1),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">

+ 150 - 97
fhKeeper/formulahousekeeper/timesheet/src/views/project/summary.vue

@@ -99,6 +99,17 @@
                         </div>
                         <el-divider></el-divider>
                         <div id="taskTimeComparePanel" :style="`height: ${echartsHeight}px;width:1100px`"></div>
+                        <div class="dataPaging">
+                            <el-pagination
+                                @size-change="handleSizeChange"
+                                @current-change="handleCurrentChange"
+                                :current-page="dataPagingPage"
+                                :page-sizes="[5, 10, 15, 20, 30, 40]"
+                                :page-size="dataPagingSize"
+                                layout="total, sizes, prev, pager, next"
+                                :total="dataPagingTotal">
+                            </el-pagination>
+                        </div>
                     </div>
                 </el-col>
             </el-row>
@@ -158,6 +169,11 @@
     align-items: center;
     min-width: 400px;
 }
+.dataPaging {
+    width: 100%;
+    display: flex;
+    justify-content: flex-end;
+}
 </style>
 <script>
 import vueCascader from "@/components/cascader.vue"
@@ -192,10 +208,137 @@ export default {
             departmentOption: [], // 部门
             departmentOptionValue: '',
             echartsHeight: 500,
-            departmentOptionLoading: false
+            departmentOptionLoading: false,
+            dataPagingPage: 1,
+            dataPagingSize: 10,
+            dataPagingTotal: 0,
+            dataPagingData: [],
         };
     },
     methods: {
+        handleSizeChange(val) {
+            this.dataPagingPage = 1
+            this.dataPagingSize = val
+            this.setTaskTimeCompare()
+        },
+        handleCurrentChange(val) {
+            this.dataPagingPage = val
+            this.setTaskTimeCompare()
+        },
+        setTaskTimeCompare() {
+            this.departmentOptionLoading = true
+            let newList = this.dataPagingData
+            let list = newList.slice((this.dataPagingPage - 1) * this.dataPagingSize, this.dataPagingPage * this.dataPagingSize)
+            this.taskTimeComparePublic(list)
+        },
+        taskTimeComparePublic(list) {
+            var _this = this;
+            var xList1 = [], xList2 = []
+            if(list.length > 10) {
+                this.echartsHeight = list.length * 60
+            } else {
+                this.echartsHeight = 500
+            }
+
+            var xList1 = [], xList2 = []
+            if(list.length > 10) {
+                this.echartsHeight = list.length * 60
+            } else {
+                this.echartsHeight = 500
+            }
+            
+            setTimeout(() => {
+                var taskNames = [];
+                for (var i in list) {
+                    xList1.push({
+                        "value": list[i].workHours,
+                        "id": list[i].id,
+                        "fullName": list[i].name,
+                    });
+                    xList2.push({
+                        "value": list[i].planHours,
+                        "id": list[i].id,
+                        "fullName": list[i].name,
+                    });
+                    console.log(list[i], list[i].name)
+                    taskNames.push(list[i].name.length > 12 ? list[i].name.substring(0, 12) + '..' : list[i].name);
+                }
+                var myChart = echarts.init(document.getElementById("taskTimeComparePanel"));
+                _this.compareChart = myChart;
+                var option = {
+                    // 全局调色盘。
+                    color: ["#409EFF", "#71C671"],
+                    title: {
+                        show: list.length == 0,
+                        textStyle: {
+                            color: "#666666",
+                            fontSize: 18,
+                            fontWeight: 'normal',
+                        },
+                        text: list.length == 0 ? this.$t('nodata') : this.$t('gong-shi-dui-bi'),
+                        left: "center",
+                        top: "center"
+                    },
+                    toolbox: {
+                        right: 25,
+                        show: true,
+                        feature: {
+                            saveAsImage: {
+                                show: true
+                            },
+                            restore: {
+                                show: true
+                            },
+                            magicType: {
+                                type: ['line', 'bar']
+                            },
+                        }
+                    },
+                    legend: {
+                        data: [this.$t('shi-ji-gong-shi'), this.$t('plantime')]
+                    },
+                    grid: {
+                        left: '3%',
+                        right: '4%',
+                        bottom: '3%',
+                        containLabel: true
+                    },
+                    tooltip: {
+                        trigger: 'axis',
+                        axisPointer: {
+                            type: 'shadow'
+                        },
+                    },
+                    xAxis: {
+                        type: 'value',
+                        boundaryGap: [0, 1],
+                        axisLabel: {
+                            formatter: '{value} ' + this.$t('time.hour')
+                        }
+                    },
+                    yAxis: [{
+                        type: 'category',
+                        data: taskNames
+                    }],
+                    series: [{
+                        name: this.$t('shi-ji-gong-shi'),
+                        type: 'bar',
+                        data: xList1
+                    },
+                    {
+                        name: this.$t('plantime'),
+                        type: 'bar',
+                        data: xList2
+                    }]
+                };
+                
+                myChart.setOption(option, { notMerge: true });
+                this.$nextTick(() => {
+                    myChart.resize(); // 在DOM更新后,调用resize方法更新图表大小
+                });
+                this.departmentOptionLoading = false
+            }, 1000);
+        },
         vueCasader(obj) {
             if(obj.distinction == '1') {
                 if(obj.id != '') {
@@ -278,103 +421,13 @@ export default {
             this.http.post('/task/getTaskTimeCompare', { ...obj },
                 res => {
                     if (res.code == "ok") {
-                        var xList1 = [], xList2 = [], list = res.data.reverse();
-                        if(list.length > 10) {
-                            this.echartsHeight = list.length * 60
-                        } else {
-                            this.echartsHeight = 500
-                        }
-                        setTimeout(() => {
-                            var taskNames = [];
-                            for (var i in list) {
-                                xList1.push({
-                                    "value": list[i].workHours,
-                                    "id": list[i].id,
-                                    "fullName": list[i].name,
-                                });
-                                xList2.push({
-                                    "value": list[i].planHours,
-                                    "id": list[i].id,
-                                    "fullName": list[i].name,
-                                });
-                                taskNames.push(list[i].name.length > 12 ? list[i].name.substring(0, 12) + '..' : list[i].name);
-                            }
-                            var myChart = echarts.init(document.getElementById("taskTimeComparePanel"));
-                            _this.compareChart = myChart;
-                            var option = {
-                                // 全局调色盘。
-                                color: ["#409EFF", "#71C671"],
-                                title: {
-                                    show: list.length == 0,
-                                    textStyle: {
-                                        color: "#666666",
-                                        fontSize: 18,
-                                        fontWeight: 'normal',
-                                    },
-                                    text: list.length == 0 ? this.$t('nodata') : this.$t('gong-shi-dui-bi'),
-                                    left: "center",
-                                    top: "center"
-                                },
-                                toolbox: {
-                                    right: 25,
-                                    show: true,
-                                    feature: {
-                                        saveAsImage: {
-                                            show: true
-                                        },
-                                        restore: {
-                                            show: true
-                                        },
-                                        magicType: {
-                                            type: ['line', 'bar']
-                                        },
-                                    }
-                                },
-                                legend: {
-                                    data: [this.$t('shi-ji-gong-shi'), this.$t('plantime')]
-                                },
-                                grid: {
-                                    left: '3%',
-                                    right: '4%',
-                                    bottom: '3%',
-                                    containLabel: true
-                                },
-                                tooltip: {
-                                    trigger: 'axis',
-                                    axisPointer: {
-                                        type: 'shadow'
-                                    },
-                                },
-                                xAxis: {
-                                    type: 'value',
-                                    boundaryGap: [0, 1],
-                                    axisLabel: {
-                                        formatter: '{value} ' + this.$t('time.hour')
-                                    }
-                                },
-                                yAxis: [{
-                                    type: 'category',
-                                    data: taskNames
-                                }],
-                                series: [{
-                                    name: this.$t('shi-ji-gong-shi'),
-                                    type: 'bar',
-                                    data: xList1
-                                },
-                                {
-                                    name: this.$t('plantime'),
-                                    type: 'bar',
-                                    data: xList2
-                                }]
-                            };
-                            
-                            myChart.setOption(option, { notMerge: true });
-                            this.$nextTick(() => {
-                                myChart.resize(); // 在DOM更新后,调用resize方法更新图表大小
-                            });
-                            this.departmentOptionLoading = false
-                        }, 1000);
+                        let newList = res.data.reverse()
+                        this.dataPagingData = newList
+                        this.dataPagingTotal = newList.length
+
+                        let list = newList.slice((this.dataPagingPage - 1) * this.dataPagingSize, this.dataPagingPage * this.dataPagingSize)
                         
+                        this.taskTimeComparePublic(list)
                     } else {
                         this.departmentOptionLoading = false
                         this.$message({

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

@@ -33,12 +33,22 @@
 
                 <el-form-item :label="'项目'">
                     <div style="margin-left: 8px">
-                        <el-select v-model="screenProjectId" style="width:150px;" size="small" slot="prepend" :placeholder="$t('defaultText.pleaseChoose')" clearable @change="screenProjectChange">
+                        <el-select v-model="screenProjectId" filterable style="width:150px;" size="small" slot="prepend" :placeholder="$t('defaultText.pleaseChoose')" clearable @change="screenProjectChange">
                             <el-option v-for="item in allProjectList" :key="item.id"  :label="item.projectName" :value="item.id"></el-option>
                         </el-select>
                     </div>
                 </el-form-item>
 
+                <el-form-item :label="'部门'">
+                    <div style="margin-left: 8px">
+                        <el-cascader v-if="user.userNameNeedTranslate != 1" v-model="screenDeptId" :placeholder="$t('defaultText.pleaseChoose')" style="width: 125px"
+                        :options="departmentList" :props="{ checkStrictly: false,expandTrigger: 'hover' }" :show-all-levels="false" clearable
+                        @change="getList()" size="mini"></el-cascader>
+
+                        <vueCascader :size="'mini'" :widthStr="'125'" :clearable="true" :subject="departmentList" :radios="false" :distinction="'1'" @vueCasader="vueCasader" v-if="user.userNameNeedTranslate == 1"></vueCascader>
+                    </div>
+                </el-form-item>
+
                 <el-form-item :label="'任务分组'">
                     <div style="margin-left: 8px">
                         <el-select v-model="screenTaskGroupingId" style="width:150px;" size="small" :disabled="!screenProjectId" slot="prepend" :placeholder="$t('defaultText.pleaseChoose')" clearable @change="hiddens()">
@@ -82,6 +92,7 @@
                 </el-form-item>
                 <el-form-item style="float: right;" v-if="user.companyId != '3092'">
                      <el-link type="primary" icon="el-icon-circle-plus-outline" :underline="false" @click="addTask()">新建任务</el-link>
+                     <el-link type="primary" :underline="false" @click="exportTaskList()" style="margin-left: 20px;" v-loading="exportTaskLoading">导出</el-link>
                 </el-form-item>
             </el-form>
         </el-col>
@@ -103,7 +114,7 @@
                     </el-table-column>
                     <el-table-column prop="stagesName" :label="$t('taskstage')" sortable width="180" @mouseover="mouseOver">
                     </el-table-column>
-                    <el-table-column prop="taskLevel" label="优先级" sortable width="180">
+                    <el-table-column prop="taskLevel" label="优先级" sortable width="100">
                         <template slot-scope="scope">
                             <div>
                                 <span v-if="scope.row.taskLevel == 0">一般</span>
@@ -140,11 +151,6 @@
                             </div>
                         </template>
                     </el-table-column>
-                    <el-table-column prop="projectName" :label="$t('headerTop.projectName')" sortable width="260" show-overflow-tooltip>
-                        <template slot-scope="scope">
-                            <el-link type="primary" :href="'#/projectInside/'+scope.row.projectId">{{scope.row.projectName}}</el-link>
-                        </template>
-                    </el-table-column>
                     <el-table-column prop="executorName" :label="$t('zhi-hang-ren')" sortable width="130">
                         <template slot-scope="scope">
                             <!-- <el-link type="primary" @click="showUser(scope.row.executorId)">{{scope.row.executorName}}</el-link> -->
@@ -159,6 +165,11 @@
                     </el-table-column>
                     
                     <el-table-column prop="startDate" :label="$t('starttimes')" sortable width="180"></el-table-column>
+                    <el-table-column prop="projectName" :label="$t('headerTop.projectName')" sortable width="260" show-overflow-tooltip>
+                        <template slot-scope="scope">
+                            <el-link type="primary" :href="'#/projectInside/'+scope.row.projectId">{{scope.row.projectName}}</el-link>
+                        </template>
+                    </el-table-column>
                     <el-table-column prop="endDate" :label="$t('deadline')" width="310" fixed="right" sortable>
                         <template slot-scope="scope">
                             <div style="display: flex;justify-content: space-between;padding-right: 40px">
@@ -468,6 +479,9 @@ import { error } from 'dingtalk-jsapi';
 
     // 引入自定义组件
     import selectCat from "@/components/select.vue"
+    // 引入自定义级联组件
+    import vueCascader from "@/components/cascader.vue"
+    import cascaderOption from "@/components/cascaderOption.vue"
 
     import taskComponent from "@/components/taskComponent.vue"
 
@@ -491,7 +505,9 @@ import { error } from 'dingtalk-jsapi';
             // Earning,
             quillEditor, // 富文本
             selectCat,
-            taskComponent
+            taskComponent,
+            vueCascader,
+            cascaderOption
         },
         data() {
             return {
@@ -639,7 +655,9 @@ import { error } from 'dingtalk-jsapi';
                 screenProjectId: '',
                 screenTaskGroupingId: '',
                 screenPersonnelId: '',
-                allProjectList: []
+                allProjectList: [],
+                exportTaskLoading: false,
+                screenDeptId: [],
             };
         },
         methods: {
@@ -782,6 +800,57 @@ import { error } from 'dingtalk-jsapi';
                 }
                 this.addSubProject = true;
             },
+            exportTaskList(){
+                let parameter = {
+                    status: this.searchField,
+                    viewId: this.idx,
+                    pageIndex: this.page,
+                    pageSize: this.size,
+                    // type: this.typeField
+                    projectId: this.screenProjectId,
+                    groupId: this.screenTaskGroupingId,
+                    targetUserId: this.screenPersonnelId
+                }
+                if(this.typeField != 'null' && this.typeField != null && this.typeField != '') {
+                    parameter.type = this.typeField
+                }
+                if(this.dateSelect != null && this.dateSelect.length != 0){
+                    parameter.dateType = this.dateType
+                    parameter.startDate = this.dateSelect[0]
+                    parameter.endDate = this.dateSelect[1]
+                }
+                if(this.deptId.length > 0) {
+                    parameter.deptId = this.deptId[this.deptId.length - 1]
+                } else {
+                    parameter.deptId = ''
+                }
+                this.http.post('/task/exportTaskList', parameter,
+                    res => {
+                    if (res.code == "ok") {
+                        var filePath = res.data;
+                        var fName = '待办任务导出.xlsx'
+                        const a = document.createElement('a'); // 创建a标签
+                        a.setAttribute('download', fName);// download属性
+                        a.setAttribute('href', filePath);// href链接
+                        a.click(); //自执行点击事件
+                        a.remove();
+                        this.exportLoading = false
+                        this.byQuarterDialog  = false
+                        
+                    } else {
+                        this.$message({
+                        message: res.msg,
+                        type: "error"
+                        });
+                    }
+                    },
+                    error => {
+                        this.$message({
+                            message: error,
+                            type: "error"
+                        });
+                    });
+                },
             //显示子项目
             subProject(item) {
                 this.subProjectVisible = true;
@@ -902,7 +971,7 @@ import { error } from 'dingtalk-jsapi';
 
             //获取项目列表
             getList() {
-                console.log('执行函数')
+                console.log('执行函数', this.screenDeptId)
                 this.listLoading = true;
                 let parameter = {
                     status: this.searchField,
@@ -914,6 +983,7 @@ import { error } from 'dingtalk-jsapi';
                     groupId: this.screenTaskGroupingId,
                     targetUserId: this.screenPersonnelId
                 }
+                console.log(parameter)
                 if(this.typeField != 'null' && this.typeField != null && this.typeField != '') {
                     parameter.type = this.typeField
                 }
@@ -930,6 +1000,9 @@ import { error } from 'dingtalk-jsapi';
                 } else {
                     parameter.deptId = ''
                 }
+                if(this.screenDeptId.length > 0) {
+                    parameter.deptId = this.screenDeptId[this.screenDeptId.length - 1]
+                }
                 this.http.post('/task/listByPage', parameter,
                 res => {
                     this.listLoading = false;
@@ -962,6 +1035,59 @@ import { error } from 'dingtalk-jsapi';
                 })
             },
 
+            // 导出任务
+            exportTask() {
+                // console.log('执行代码')
+                this.exportTaskLoading = true
+                let url = '' // 导出连接
+                let parameter = {
+                    status: this.searchField,
+                    viewId: this.idx,
+                    pageIndex: this.page,
+                    pageSize: this.size,
+                    // type: this.typeField
+                    projectId: this.screenProjectId,
+                    groupId: this.screenTaskGroupingId,
+                    targetUserId: this.screenPersonnelId
+                }
+                if(this.typeField != 'null' && this.typeField != null && this.typeField != '') {
+                    parameter.type = this.typeField
+                }
+                if(this.dateSelect != null && this.dateSelect.length != 0){
+                    parameter.dateType = this.dateType
+                    parameter.startDate = this.dateSelect[0]
+                    parameter.endDate = this.dateSelect[1]
+                }
+                if(this.deptId.length > 0) {
+                    parameter.deptId = this.deptId[this.deptId.length - 1]
+                } else {
+                    parameter.deptId = ''
+                }
+                this.http.post(url, parameter,
+                res => {
+                    if (res.code == "ok") {
+                        this.exportTaskLoading = false;
+                        var aTag = document.createElement('a');
+                        aTag.download = '待办任务';
+                        aTag.href = res.data;
+                        aTag.click();
+                    } else {
+                        this.exportTaskLoading = false;
+                        this.$message({
+                            message: res.msg,
+                            type: "error"
+                        });
+                    }
+                },
+                error => {
+                    this.$message({
+                        message: error,
+                        type: "error"
+                    });
+                    this.exportTaskLoading = false;
+                });
+            },  
+
             //显示新增界面
             handleAdd(i, item) {
                 if(i == -1) {
@@ -1875,6 +2001,19 @@ import { error } from 'dingtalk-jsapi';
                         type: "error"
                     });
                 });
+            },
+
+            vueCasader() {
+                if(obj.distinction == '1') {
+                    if(obj.id != '') {
+                        let arr = []
+                        arr.push(obj.id)
+                        this.screenDeptId = arr
+                    } else {
+                        this.screenDeptId = []
+                    }
+                    this.getList()
+                }
             }
         },
         created() {
@@ -1892,6 +2031,7 @@ import { error } from 'dingtalk-jsapi';
             if(this.user.timeType.projectWithDept) {
                 this.getDepartmentList()
             }
+            this.getDepartmentList()
             this.getAllProjectlist()
             // if(this.user.companyId == '428') {
             //     this.getSthForSb()

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

@@ -73,7 +73,7 @@
             <div class="formBatch">
                 <van-checkbox v-model="isAllChecked" :disabled="report.length == 0" @click="allChecked" shape="square" style="padding-left:3vw"></van-checkbox>
                 <div style="padding:1vh 2vw">
-                <van-button @click="batchAgree(true)" :disabled="!isCanAgree || report.length == 0" type="info" size="small">批量通过</van-button>
+                <van-button @click="batchAgree(true)" :disabled="!isCanAgree || report.length == 0" type="info" size="small" style="margin-right:6vw">批量通过</van-button>
                 <van-button @click="batchAgree(false)" :disabled="!isCanAgree || report.length == 0" type="danger" size="small" style="margin-left:2vw">批量驳回</van-button>
                 </div>
             </div>
@@ -171,7 +171,7 @@
                         </div>
                     </div>
                     <div class="form_btn" slot="footer">
-                        <van-button size="small" type="info" @click="approve(item.id, item)">通过</van-button>
+                        <van-button size="small" type="info" @click="approve(item.id, item)" style="margin-right: 4vw;">通过</van-button>
                         <van-button size="small" type="danger" @click="showDenyDialog(item.id,0,item.dateStr, item)">驳回</van-button>
                     </div>
                     <van-popup v-model="imgShow" position="bottom" closeable >
@@ -605,7 +605,7 @@
     }
     .login_form {
         margin-top: 46px;
-        padding-bottom: 1.2rem;
+        margin-bottom: 65px;
     }
 
     .one_report {