Просмотр исходного кода

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

seyason 1 месяц назад
Родитель
Сommit
f9222f10dc
34 измененных файлов с 1109 добавлено и 209 удалено
  1. 21 2
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/pageComponents/tasks/addEditor.vue
  2. 26 11
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/pageComponents/tasks/detail.vue
  3. 166 30
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/tabbar/home/component/workbench.vue
  4. 2 2
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/tabbar/work/index.vue
  5. 2 3
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/vite.config.js
  6. 23 1
      fhKeeper/formulahousekeeper/customerBuler-crm/src/components/TaskModal/index.vue
  7. 2 2
      fhKeeper/formulahousekeeper/customerBuler-crm/src/components/TaskModal/taskFunction.ts
  8. 1 0
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/biReport/dragEdit/index.vue
  9. 15 1
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/biReport/dragEdit/previewTable.vue
  10. 2 0
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/tasks/api.ts
  11. 18 10
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/tasks/index.vue
  12. 93 14
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/tasks/taskCalendar.vue
  13. 32 29
      fhKeeper/formulahousekeeper/customerBuler-crm/src/router/routerGuards.ts
  14. 6 2
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/TaskController.java
  15. 6 7
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/ContractPayment.java
  16. 6 6
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/Task.java
  17. 2 4
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/dto/TaskDto.java
  18. 27 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/vo/DailyTaskVO.java
  19. 27 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/vo/TimeTaskVO.java
  20. 3 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/mapper/TaskMapper.java
  21. 2 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/TaskService.java
  22. 220 31
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/TaskServiceImpl.java
  23. 122 5
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/VisitPlanServiceImpl.java
  24. 12 40
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/task/TimingTask.java
  25. 132 3
      fhKeeper/formulahousekeeper/management-crm/src/main/resources/mapper/TaskMapper.xml
  26. 2 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectController.java
  27. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/application.yml
  28. 108 1
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/CompanyController.java
  29. 4 0
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/mapper/SysRoleFunctionMapper.java
  30. 4 0
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/mapper/SysRoleModuleMapper.java
  31. 1 1
      fhKeeper/formulahousekeeper/ops-platform/src/main/resources/application-dev.yml
  32. 1 1
      fhKeeper/formulahousekeeper/ops-platform/src/main/resources/application.yml
  33. 10 0
      fhKeeper/formulahousekeeper/ops-platform/src/main/resources/mapper/SysRoleFunctionMapper.xml
  34. 10 0
      fhKeeper/formulahousekeeper/ops-platform/src/main/resources/mapper/SysRoleModuleMapper.xml

+ 21 - 2
fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/pageComponents/tasks/addEditor.vue

@@ -178,6 +178,11 @@
       <van-popup v-model:show="showDatePicker" destroy-on-close position="bottom" :style="{ height: '50%' }">
         <van-date-picker v-model="showDatePickerVal" @confirm="showPickerConfirm" @cancel="showDatePicker = false" />
       </van-popup>
+
+      <!-- 选择时间 -->
+      <van-popup v-model:show="showDateTimePicker" destroy-on-close position="bottom" :style="{ height: '50%' }">
+        <van-time-picker v-model="showDatePickerTimeVal" @confirm="showPickerTimeConfirm" @cancel="showDateTimePicker = false" />
+      </van-popup>
     </div>
   </div>
 </template>
@@ -222,7 +227,9 @@ const showSelectionFlag = ref(false)
 const showSelectionFiled = ref([])
 const showSelectionArray = ref([])
 const showDatePicker = ref(false)
+const showDateTimePicker = ref(false)
 const showDatePickerVal = ref(dayjs().format("YYYY-MM-DD").split("-"))
+const showDatePickerTimeVal = ref(dayjs().format("HH:mm").split(":"))
 const showDatePickerFiled = ref('')
 const customeDate = ref([])
 const showSelectionToFlag = ref(false)
@@ -278,14 +285,26 @@ function onSubmit() {
 }
 
 function showPickerConfirm({ selectedValues }) {
-  vantFormVal.value[showDatePickerFiled.value] = selectedValues.join('-')
+
+  // vantFormVal.value[showDatePickerFiled.value] = selectedValues.join('-')
+  // showDatePicker.value = false
+
   showDatePicker.value = false
+  showDateTimePicker.value = true
+}
+
+function showPickerTimeConfirm({ selectedValues }) {
+  vantFormVal.value[showDatePickerFiled.value] = `${showDatePickerVal.value.join('-')} ${selectedValues.join(':')}`
+  showDateTimePicker.value = false
 }
 
 function showDatePickerBox(filed) {
-  const dateVal = vantFormVal.value[filed] ? vantFormVal.value[filed] : dayjs().format("YYYY-MM-DD")
+  console.log(vantFormVal.value[filed], '<==== 123321')
+  const dateVal = vantFormVal.value[filed] ? vantFormVal.value[filed].split(' ')[0] : dayjs().format("YYYY-MM-DD")
+  const timeVal = vantFormVal.value[filed] ? vantFormVal.value[filed].split(' ')[1] : dayjs().format("HH:mm")
   showDatePickerFiled.value = filed
   showDatePickerVal.value = dateVal.split("-")
+  showDatePickerTimeVal.value = timeVal.split(":")
   showDatePicker.value = true
 }
 

+ 26 - 11
fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/pageComponents/tasks/detail.vue

@@ -64,9 +64,15 @@
       </div>
     </van-popup>
 
+    <!-- 选择日期 -->
     <van-popup v-model:show="showDatePicker" destroy-on-close position="bottom" :style="{ height: '50%' }">
       <van-date-picker v-model="showDatePickerVal" @confirm="showPickerConfirm" :min-date="timeJudgment" @cancel="showDatePicker = false" />
     </van-popup>
+
+    <!-- 选择时间 -->
+    <van-popup v-model:show="showDateTimePicker" destroy-on-close position="bottom" :style="{ height: '50%' }">
+      <van-time-picker v-model="showDatePickerTimeVal" @confirm="showPickerTimeConfirm" @cancel="showDateTimePicker = false" />
+    </van-popup>
   </div>
 </template>
 
@@ -99,8 +105,10 @@ const routingInformation = routingInfos['tasks']
 const infoData = ref(props.info);
 const timeout = ref(null);
 const showDelay = ref(false);
-const showDatePicker = ref(false);
-const showDatePickerVal = ref([])
+const showDatePicker = ref(false)
+const showDateTimePicker = ref(false)
+const showDatePickerVal = ref(dayjs().format("YYYY-MM-DD").split("-"))
+const showDatePickerTimeVal = ref(dayjs().format("HH:mm").split(":"))
 const todaySDate = dayjs(new Date()).format('YYYY-MM-DD')
 const showStartDelayData = ref('');
 const showEndtDelayData = ref('');
@@ -114,32 +122,39 @@ watch(() => props.info, (newValue) => {
   initializeData(newValue.id)
 })
 
-function showPickerConfirm({ selectedValues }) {
-  const dates = selectedValues.join('-')
+function showPickerTimeConfirm({ selectedValues }) {
   if(showDateType.value == 'showStartDelayData') {
-    showStartDelayData.value = dates
+    showStartDelayData.value = `${showDatePickerVal.value.join('-')} ${selectedValues.join(':')}` 
     showEndtDelayData.value = ''
   }
 
   if(showDateType.value == 'showEndtDelayData') {
-    showEndtDelayData.value = dates
+    showEndtDelayData.value = `${showDatePickerVal.value.join('-')} ${selectedValues.join(':')}` 
   }
-  console.log(showStartDelayData.value)
-  console.log(showEndtDelayData.value)
+
+  showDateTimePicker.value = false
+}
+
+function showPickerConfirm({ selectedValues }) {
   showDatePicker.value = false
+  showDateTimePicker.value = true
 }
 
 function showDatePickerCli(type) {
   showDateType.value = type
   const types = type == 'showStartDelayData' ? showStartDelayData.value : showEndtDelayData.value
   timeJudgment.value = type == 'showStartDelayData' ? new Date : new Date(showStartDelayData.value)
-  showDatePickerVal.value = types.split('-')
+
+  const nemDate = dayjs().format("YYYY-MM-DD HH:mm")
+
+  showDatePickerVal.value = types ? types.split(' ')[0].split('-') : nemDate.split(' ')[0].split('-')
+  showDatePickerTimeVal.value = types ? types.split(' ')[1].split(':') : nemDate.split(' ')[1].split(':')
   showDatePicker.value = true
 }
 
 function restartTask() {
-  showStartDelayData.value = infoData.value.startDate ? infoData.value.startDate : dayjs().format("YYYY-MM-DD")
-  showEndtDelayData.value = infoData.value.endDate ? infoData.value.endDate : dayjs().format("YYYY-MM-DD")
+  showStartDelayData.value = infoData.value.startDate ? infoData.value.startDate : dayjs().format("YYYY-MM-DD HH:mm")
+  showEndtDelayData.value = infoData.value.endDate ? infoData.value.endDate : dayjs().format("YYYY-MM-DD HH:mm")
   showDelay.value = true
 }
 function delayTimeEvent() {

+ 166 - 30
fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/tabbar/home/component/workbench.vue

@@ -9,7 +9,10 @@
         :formatter="formatter" @select="calendarSelect" @panel-change="calendarPanelChangeSet">
         <template #month-title></template>
         <template #bottom-info="day">
-          <div class="doT" v-if="day?.bottomInfo"></div>
+          <div class="flex justify-items-center">
+            <div class="doT" v-if="day?.bottomInfo"></div>
+            <div class="taskDot" v-if="day?.taskInfo"></div>
+          </div>
         </template>
       </van-calendar>
       <div class="flex justify-center" @click="expandAndCollapseClick">
@@ -25,32 +28,59 @@
         <div class="w-full overflow-y-auto max-h-72 px-5 mb-5">
           <template v-for="item in visitorProgramList">
             <van-swipe-cell>
-              <div class="bg-[#FFA35919] ra6 p-4 mb-4" @click="jumpToVisitorDetails(item)">
-                <div class="w-full flex items-center justify-between">
-                  <div class="text-size-in font-bold text-[#474A56]">{{ item.planName }}</div>
-                  <div :class="`labelTag ${item.finishState == 0 ? 'toBeCompleted' : 'completed'}`">{{ ['未完成',
-                    '已完成'][item.finishState] }}</div>
-                </div>
-                <div class="w-full flex items-center justify-between mt-4">
-                  <div class="text-[#505050]" style="width: 62%;">拜访目的: {{ item.visitGoalName }}</div>
-                  <div class="w-1/3 text-[#505050] flex items-center" style="width: 38%;">
-                    <van-icon name="user-circle-o" class="text-size-in mr-2" />
-                    {{ item.customName }}
+              <!-- 拜访计划 -->
+              <template v-if="item.calendarType == 1">
+                <div class="bg-[#075985] ra6 p-4 mb-4 text-[#fff]" @click="jumpToVisitorDetails(item)">
+                  <div class="w-full flex items-center justify-between">
+                    <div class="text-size-in font-bold text-[#fff]">{{ item.planName }}</div>
+                    <div :class="`labelTag ${item.finishState == 0 ? 'toBeCompleted' : 'completed'}`">{{ ['未完成',
+                      '已完成'][item.finishState] }}</div>
+                  </div>
+                  <div class="w-full flex items-center justify-between mt-4">
+                    <div class="text-[#fff]" style="width: 62%;">拜访目的: {{ item.visitGoalName }}</div>
+                    <div class="w-1/3 text-[#fff] flex items-center" style="width: 38%;">
+                      <van-icon name="user-circle-o" class="text-size-in mr-2" />
+                      {{ item.customName }}
+                    </div>
+                  </div>
+                  <div class="w-full flex items-center justify-between mt-4">
+                    <div class="w-2/3 text-[#fff]" style="width: 62%;">拜访时间: {{ item.visitTime }}</div>
+                    <div class="w-1/3 text-[#fff] flex items-center" style="width: 38%;">
+                      <van-icon name="phone-o" class="text-size-in mr-2" />
+                      {{ item?.companyPhone }}
+                    </div>
                   </div>
                 </div>
-                <div class="w-full flex items-center justify-between mt-4">
-                  <div class="w-2/3 text-[#505050]" style="width: 62%;">拜访时间: {{ item.visitTime }}</div>
-                  <div class="w-1/3 text-[#505050] flex items-center" style="width: 38%;">
-                    <van-icon name="phone-o" class="text-size-in mr-2" />
-                    <!-- {{ item.telPhone }} -->
-                    {{ item?.companyPhone }}
+              </template>
+
+              <!-- 任务 -->
+              <template v-if="item.calendarType == 2">
+                <div class="bg-[#FFA35919] ra6 p-4 mb-4" @click="toEditTask(item)">
+                  <div class="w-full flex items-center justify-between">
+                    <div class="text-size-in font-bold text-[#474A56]">{{ item.taskName }}</div>
+                    <div :class="`labelTag ${taskStatus[item.status]?.type}`">
+                      {{ taskStatus[item.status]?.label }}
+                    </div>
+                  </div>
+                  <div class="w-full flex items-center justify-between mt-4">
+                    <div class="text-[#505050]" style="width: 100%;">优先级: {{ ['低','中','高'][item.priority] }}</div>
+                  </div>
+                  <div class="w-full flex items-center justify-between mt-4">
+                    <div class="text-[#505050]" style="width: 100%;">任务开始时间: {{ item.endDate }}</div>
+                  </div>
+                  <div class="w-full flex items-center justify-between mt-4">
+                    <div class="text-[#505050]" style="width: 100%;">任务截至时间: {{ item.startDate }}</div>
                   </div>
                 </div>
-              </div>
+              </template>
+              
 
               <template #right>
                 <div class="flex items-center flex-col justify-around h-full bg-[#F9F0E9] ra-l6 py-4">
-                  <div class="buttonCircle text-white" @click.stop="jumpToAddNewVisitors(item)">
+                  <div class="buttonCircle text-white" @click.stop="jumpToAddNewVisitors(item)" v-if="item.calendarType == 1">
+                    <img src="/src/assets/image/edit.png" class="w-full h-full">
+                  </div>
+                  <div class="buttonCircle text-white" @click.stop="toEditTask(item)" v-if="item.calendarType == 2">
                     <img src="/src/assets/image/edit.png" class="w-full h-full">
                   </div>
                   <div class="buttonCircle text-white" @click.stop="deleteVisitor(item)">
@@ -61,7 +91,7 @@
             </van-swipe-cell>
           </template>
         </div>
-        <van-button type="primary" icon="add-o" class="m-auto w-3/5" @click="jumpToAddNewVisitors()">新增计划</van-button>
+        <van-button type="primary" icon="add-o" class="m-auto w-3/5" @click="addTaskPlanPopup = true">新增</van-button>
       </div>
       <!-- 没有数据的情况下 -->
       <div class="w-full h-full flex flex-col items-center justify-center" v-if="!visitorProgramList.length">
@@ -69,10 +99,19 @@
           <img class="w-full h-full" src="/src/assets/image/schedule.png">
         </div>
         <div class="text-center text-[#C4C4C4] mb-5">您今天还没安排日程哦!</div>
-        <van-button type="primary" class="m-auto w-3/5" @click="jumpToAddNewVisitors()">马上安排</van-button>
+        <van-button type="primary" class="m-auto w-3/5" @click="addTaskPlanPopup = true">马上安排</van-button>
       </div>
     </div>
 
+    <!-- 拜访计划和任务的添加按钮 -->
+    <van-popup v-model:show="addTaskPlanPopup" closeable destroy-on-close position="bottom">
+      <div class="flex w-full flex-col p-12">
+        <van-button type="primary" class="m-auto" @click="addTaskClick()">新增任务</van-button>
+        <div class="h-6"></div>
+        <van-button type="primary" class="m-auto" @click="jumpToAddNewVisitors()">新增计划</van-button>
+      </div>
+    </van-popup>
+
     <!-- 常用表单 -->
     <div class="mt-5">
       <div class="text-size-large text-[#000] pl16">常用表单</div>
@@ -165,7 +204,7 @@
 import { ref, onActivated, nextTick } from 'vue';
 import { showConfirmDialog } from 'vant';
 import { useLifecycle } from '@hooks/useCommon.js';
-import { DELETE_VISITOR_PLAN, GET_VISITOR_PLAN, GET_FREQUENTLY_USED_CONTACTS, GET_COMMONLY_USED_MODULES, SAVE_COMMONLY_USED_FORMS, GET_PLAN_CALENDAR } from "@hooks/useApi";
+import { DELETE_VISITOR_PLAN, GET_VISITOR_PLAN, GET_FREQUENTLY_USED_CONTACTS, GET_COMMONLY_USED_MODULES, SAVE_COMMONLY_USED_FORMS, GET_PLAN_CALENDAR, DELETE_TASK } from "@hooks/useApi";
 import { routingInfos } from "@utility/generalVariables.js";
 import usePxToVwView from "@hooks/usePxTransform.js";
 import useToast from "@hooks/useToast"
@@ -174,6 +213,13 @@ import requests from "@common/requests";
 import useRouterStore from "@store/useRouterStore.js";
 import useInfoStore from "@store/useInfoStore.js";
 
+const taskStatus = [
+  { label: '未开始', type: 'infos' },
+  { label: '进行中', type: 'primarys' },
+  { label: '已完成', type: 'completed' },
+  { label: '已超时', type: 'dangers' },
+]
+
 const router = useRouterStore()
 const useInfo = useInfoStore()
 const { toastText, toastSuccess, toastFail, toastLoading } = useToast()
@@ -191,6 +237,33 @@ const commonExpressionsHaveBeenAdded = ref([])
 const commonExpressionsHaveBeenNodded = ref([])
 const areYouRequesting = ref(false)
 const displayFrequentlyUsedContacts = ref(false)
+const addTaskPlanPopup = ref(false)
+
+function addTaskClick() {
+  addTaskPlanPopup.value = false
+  const jumpTo = routingInfos['tasks']
+  router.navigateTo({
+    pathName: 'addEditor',
+    success: () => {
+      router.emit('addEditorParameter', {
+        routerInfo: JSON.stringify(jumpTo)
+      })
+    }
+  })
+}
+
+function toEditTask(row) {
+  const jumpTo = routingInfos['tasks']
+  router.navigateTo({
+    pathName: 'addEditor',
+    success: () => {
+      router.emit('addEditorParameter', {
+        routerInfo: JSON.stringify(jumpTo),
+        filedValue: JSON.stringify(row),
+      })
+    }
+  })
+}
 
 function calendarPanelChangeSet(data) {
   dateConditions.value = dayjs(data.date).format('YYYY-MM-DD')
@@ -254,12 +327,16 @@ function operationForm(type, row) {
 }
 
 function deleteVisitor(row) {
-  const { id, planName } = row
+  const { id, planName, calendarType, taskName } = row
+  const text = calendarType == 1 ? '访客' : '任务'
+  const textMessage = calendarType == 1 ? '访客计划' : '任务'
+  let formVal = {}
+  calendarType == 1 ? formVal.planId = id : formVal.taskIds = id
   showConfirmDialog({
-    title: `删除访客`,
-    message: `确定删除【${planName}】访客计划吗?`,
+    title: `删除${text}`,
+    message: `确定删除【${calendarType == 1 ? planName : taskName}】${textMessage}计划吗?`,
   }).then(() => {
-    requests.post(DELETE_VISITOR_PLAN, { planId: id }).then((res) => {
+    requests.post(calendarType == 1 ? DELETE_VISITOR_PLAN : DELETE_TASK, { ...formVal }).then((res) => {
       toastSuccess('删除成功')
       getVisitorPlan()
     }).catch((err) => {
@@ -272,7 +349,8 @@ function formatter(day) {
   const { date, bottomInfo } = day
   const currentDate = dayjs(date).format("YYYY-MM-DD");
   const rqiList = planCalendarList.value.filter(item => item.ymd === currentDate)
-  day.bottomInfo = rqiList.length > 0 ? true : false
+  day.bottomInfo = (rqiList.length > 0 ? true : false)
+  day.taskInfo = (planCalendarList.value.find(item => item.currentDate === currentDate)?.taskDtoList.length > 0 ? true : false)
   return day
 }
 
@@ -293,6 +371,7 @@ function jumpToVisitorDetails(row) {
 }
 
 function jumpToAddNewVisitors(row) {
+  addTaskPlanPopup.value = false
   router.navigateTo({
     pathName: 'addEditorVisitor',
     success: () => {
@@ -332,7 +411,21 @@ function getVisitorPlan() {
   requests.post(GET_VISITOR_PLAN, {
     calenderDate: dayjs(dateConditions.value).format('YYYY-MM-DD')
   }).then((res) => {
-    visitorProgramList.value = res.data || []
+    // visitorProgramList.value = res.data || []
+    visitorProgramList.value = [
+      ...(res.data.planList || []).map(item => {
+        return {
+          ...item,
+          calendarType: 1,
+        }
+      }),
+      ...(res.data.taskList || []).map(item => {
+        return {
+          ...item,
+          calendarType: 2,
+        }
+      }),
+    ]
   })
 }
 
@@ -352,7 +445,22 @@ function getCommonlyUsedModules() {
 function getPlanCalendarList() {
   const months = calendarRef.value.getSelectedDate()
   requests.post(GET_PLAN_CALENDAR, { ym: dayjs(months).format('YYYY-MM') }).then(({ data }) => {
-    planCalendarList.value = data || []
+    // planCalendarList.value = data.planList || []
+    const newData = [
+      ...(data.planList || []).map(item => {
+        return {
+          ...item,
+          calendarType: 1,
+        }
+      }),
+      ...(data.taskList || []).map(item => {
+        return {
+          ...item,
+          calendarType: 2,
+        }
+      }),
+    ]
+    planCalendarList.value = newData
   })
 }
 
@@ -420,6 +528,16 @@ onActivated(() => {
   top: 6px;
 }
 
+.taskDot {
+  width: 10px;
+  height: 10px;
+  border-radius: 50%;
+  background-color: #ff7300;
+  margin: auto;
+  position: relative;
+  top: 6px;
+}
+
 .toBeCompleted {
   background: rgba($color: #F38B3C, $alpha: .1);
   border-color: #F38B3C;
@@ -432,6 +550,24 @@ onActivated(() => {
   color: #07C160;
 }
 
+.infos {
+  background: rgba($color: #909399, $alpha: .1);
+  border-color: #909399;
+  color: #909399;
+}
+
+.primarys {
+  background: rgba($color: #075985, $alpha: .1);
+  border-color: #075985;
+  color: #075985;
+}
+
+.dangers {
+  background: rgba($color: #F56C6C, $alpha: .1);
+  border-color: #F56C6C;
+  color: #F56C6C;
+}
+
 .labelTag {
   font-size: 10px;
   padding: 3px 8px;

+ 2 - 2
fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/tabbar/work/index.vue

@@ -28,7 +28,7 @@ import Footer from "@components/page/footer.vue";
 
 const userInfo = useInfoStore()
 const router = useRouterStore()
-const moduleList = ref(userInfo.modularList)
+const moduleList = ref((userInfo.modularList || []).filter((item) => item.path != '/biReport'))
 
 function toModuleList(item) {
   const jumpTo = routingInfos[item.path.replace('/', '')]
@@ -44,7 +44,7 @@ function toModuleList(item) {
 
 function returnImageAddress(rows) {
   const row = routingInfos[rows.path.replace('/', '')]
-  return row.moduleImage
+  return row?.moduleImage
 }
 
 useLifecycle({

+ 2 - 3
fhKeeper/formulahousekeeper/customerBuler-crm-h5/vite.config.js

@@ -6,10 +6,9 @@ import { VantResolver } from "unplugin-vue-components/resolvers";
 import { postcssConfig } from "./postcss.config.js";
 
 // const target = 'http://192.168.2.40:10099';
-// const target = 'http://192.168.2.3:10010';
+const target = 'http://192.168.2.40:10010';
+// const target = 'http://1.94.62.58:10014';
 // const target = 'http://192.168.2.17:10010';
-const target = 'http://47.101.180.183:10014';
-// const target = 'http://47.100.37.243:10070';
 
 export default defineConfig({
   define: {

+ 23 - 1
fhKeeper/formulahousekeeper/customerBuler-crm/src/components/TaskModal/index.vue

@@ -104,13 +104,21 @@
             </el-form-item>
           </template>
         </template>
-        <el-form-item label="开始时间:" class="w50">
+        <!-- <el-form-item label="开始时间:" class="w50">
           <el-date-picker v-model="form.startDate" type="date" placeholder="选择日期" value-format="YYYY-MM-DD"
             :disabled="disabledList && disabledList.includes('startDate')" />
         </el-form-item>
         <el-form-item label="截止时间:" class="w50">
           <el-date-picker v-model="form.endDate" type="date" placeholder="选择日期" value-format="YYYY-MM-DD"
             :disabled="disabledList && disabledList.includes('endDate')" />
+        </el-form-item> -->
+        <el-form-item label="开始时间:" class="w50">
+          <el-date-picker v-model="form.startDate" type="datetime" placeholder="选择日期" value-format="YYYY-MM-DD HH:mm" format="YYYY-MM-DD HH:mm"
+            :disabled="disabledList && disabledList.includes('startDate')"  />
+        </el-form-item>
+        <el-form-item label="截止时间:" class="w50">
+          <el-date-picker v-model="form.endDate" type="datetime" placeholder="选择日期" value-format="YYYY-MM-DD HH:mm" format="YYYY-MM-DD HH:mm"
+            :disabled="disabledList && disabledList.includes('endDate')"  />
         </el-form-item>
       </el-form>
       <GenerateForm ref="generateFormRef" :data="generateFormData" :value="form" />
@@ -222,6 +230,20 @@ const form = ref<any>({});
 const formRef = ref<FormInstance>();
 const generateFormRef = ref<InstanceType<typeof GenerateForm>>();
 const generateFormData = ref<any>({ ...defaultGenerateFormData });
+
+function disableMinute() {
+  // 只允许选择 00 和 30 分钟
+  const allowed = [0, 30];
+  const disabled = [];
+  for (let i = 0; i < 60; i++) {
+    if (!allowed.includes(i)) {
+      disabled.push(i);
+    }
+  }
+  // return disabled;
+  return disabled;
+}
+
 function taskFormChange(e: any, field: 'customId' | 'businessOpportunityId' | 'orderId' | 'clueId') {
   const fieldMap = {
     'customId': 'customerId',

+ 2 - 2
fhKeeper/formulahousekeeper/customerBuler-crm/src/components/TaskModal/taskFunction.ts

@@ -9,8 +9,8 @@ export async function createTask(submitData: any, isClose: boolean) : Promise<Ta
         const { executorId, startDate, endDate, repeatEndDate } = submitData;
         let params = {
             ...submitData,
-            startDate: startDate && dayjs(startDate).format('YYYY-MM-DD'),
-            endDate: endDate && dayjs(endDate).format('YYYY-MM-DD'),
+            startDate: startDate && dayjs(startDate).format('YYYY-MM-DD HH:mm'),
+            endDate: endDate && dayjs(endDate).format('YYYY-MM-DD HH:mm'),
             repeatEndDate: repeatEndDate && dayjs(repeatEndDate).format('YYYY-MM-DD')
         }
         if (executorId) {

+ 1 - 0
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/biReport/dragEdit/index.vue

@@ -52,6 +52,7 @@ const previewTableRef = ref<InstanceType<typeof previewTable> | null>(null);
 // 保存预览的判断以及生成
 function preMethod(): any {
   const rangeFilterData = rangeFilterRef.value?.getRangeData()
+
   if(!tableData.value.length) {
     ElMessage.warning('请选择列')
     return

+ 15 - 1
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/biReport/dragEdit/previewTable.vue

@@ -7,6 +7,7 @@ import type { TableColumnCtx, SummaryMethod  } from 'element-plus'
 import rangeFilter from "./rangeFilter.vue";
 import { rangeGetSql } from '../function';
 import { formatDate } from '@/utils/times';
+import { dropdownBoxFieldIntegration } from "../list"
 
 const rangeFilterRef = ref<InstanceType<typeof rangeFilter> | null>(null);
 
@@ -79,6 +80,18 @@ function mergeColumns({ row, rowIndex, columnIndex }: { row: any, rowIndex: numb
   return { rowspan, colspan: 1 };
 }
 
+// 渲染固定数据
+function renderingLabel(row: any, item: any) {
+  const { filed } = item
+  const list = dropdownBoxFieldIntegration.filter(em => `${em.indicate}_${em.fieldName}` == filed)
+  if(list.length) {
+    const childList = list[0].list
+    return childList.find((dd: any) => dd.value == row[item.label])?.label
+  } else {
+    return row[item.label]
+  }
+}
+
 function determinationOfDataRange() {
   const rangeFilterData = rangeFilterRef.value?.getRangeData()
   const rangeSQL = rangeGetSql(rangeFilterData, addEditData)
@@ -156,7 +169,8 @@ onMounted(() => { })
               {{ scope.row[item.label] ? formatDate(new Date(scope.row[item.label])) : '' }}
             </template>
             <template v-else>
-              {{ scope.row[item.label] }}
+              <!-- {{ scope.row[item.label] }} -->
+              {{ renderingLabel(scope.row, item) }}
             </template>
           </template>
         </el-table-column>

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

@@ -64,6 +64,8 @@ export const IMPORT_DATA = `${MOD}/importData`;//导入
 export const EXPORT_DATA = `${MOD}/exportData`;//按条件导出
 export const EXPORT_DATA_BY_TASK_ID = `${MOD}/exportDataByTaskIds`;//选中导出
 
+export const GET_TASK_LIST_BY_START_AND_END = `${MOD}/getTaskListByStartAndEnd` // 获取任务日历列表
+
 // 看板类型
 export const TABLE_VIEW = 'table'
 export const KANBAN_VIEW = 'view'

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

@@ -1,6 +1,6 @@
 <template>
   <div class="h-full flex">
-    <div class="p-5 w-80 pr-0">
+    <div class="p-5 w-80 pr-0" v-if="layoutSingleChoice == TABLE_VIEW">
       <div class="bg-white w-full h-full shadow-md rounded-md flex flex-col">
         <div class="flex-1 p-3 overflow-y-auto scroll-bar">
           <el-form :model="searchForm">
@@ -170,7 +170,7 @@
         </template>
         <template v-if="layoutSingleChoice == KANBAN_VIEW">
           <div class="w-full p-4 h-full overflow-auto scroll-bar">
-            <taskCalendar />
+            <taskCalendar ref="taskCalendarRef" />
           </div>
         </template>
       </div>
@@ -181,10 +181,11 @@
           <el-form-item label="重启时间" label-width="7em" prop="showStartDelayData">
             <el-date-picker
               v-model="restartFrom.timesList"
-              type="daterange"
+              type="datetimerange"
               start-placeholder="开始时间"
               end-placeholder="结束时间"
-              value-format="YYYY-MM-DD"
+              value-format="YYYY-MM-DD HH:mm"
+              format="YYYY-MM-DD HH:mm"
               style="width: 300px"
             />
           </el-form-item>
@@ -240,7 +241,10 @@ const restartFrom = ref<any>({});
 const dateOfTheDay = ref<any>(dayjs().format('YYYY-MM-DD'))
 const isExistBusiness = sessionStorage.getItem("isExistBusiness");
 const businessLabel = isExistBusiness === "1" ? "商机" : "项目"; 
-const layoutSingleChoice = ref(TABLE_VIEW)
+const layoutSingleChoice = ref(TABLE_VIEW) // 表格视图
+// const layoutSingleChoice = ref(KANBAN_VIEW) // 日历视图
+
+const taskCalendarRef = ref<InstanceType<typeof taskCalendar> | null>()
 
 function viewsSwitching() {
 
@@ -254,8 +258,8 @@ function submitForm(data: any, isClose: boolean) {
   const { executorId, startDate, endDate, repeatEndDate } = data;
   let params = {
     ...data,
-    startDate: startDate && dayjs(startDate).format('YYYY-MM-DD'),
-    endDate: endDate && dayjs(endDate).format('YYYY-MM-DD'),
+    startDate: startDate && dayjs(startDate).format('YYYY-MM-DD HH:mm'),
+    endDate: endDate && dayjs(endDate).format('YYYY-MM-DD HH:mm'),
     repeatEndDate: repeatEndDate && dayjs(repeatEndDate).format('YYYY-MM-DD')
   }
   if (executorId) {
@@ -307,8 +311,8 @@ function search() {
   const { startDate, endDate } = searchForm.value;
   let params = {
     ...searchForm.value,
-    startDate: startDate && dayjs(startDate).format('YYYY-MM-DD 00:00:00'),
-    endDate: endDate && dayjs(endDate).format('YYYY-MM-DD 23:59:59')
+    startDate: startDate && dayjs(startDate).format('YYYY-MM-DD 00:00'),
+    endDate: endDate && dayjs(endDate).format('YYYY-MM-DD 23:59')
   }
   post(PAGE_LIST, getFromValue(params)).then(({ data }) => {
     loading.value = false;
@@ -379,7 +383,11 @@ function importExcel(data: any) {
   uploadFile(IMPORT_DATA, formData).then(_res => {
     globalPopup?.showSuccess("导入成功")
     importLoading.value = "3";
-    search();
+    if(layoutSingleChoice.value == TABLE_VIEW) {
+      search();
+    } else {
+      taskCalendarRef.value && taskCalendarRef.value.getTaskCalendar()
+    }
   }).catch(err => {
     globalPopup?.showError(err.msg)
     importLoading.value = "4";

+ 93 - 14
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/tasks/taskCalendar.vue

@@ -1,11 +1,11 @@
 
 
 <template>
-  <div class="w-full h-full flex flex-col">
-    <div class="flex-1">
+  <div class="w-full h-full flex flex-col calendarPlugin">
+    <div class="flex-1" v-loading="calendarLoading">
       <FullCalendar ref="calendarRef" :options="calendarOptions" class="h-full w-full">
         <template v-slot:eventContent='arg'>
-          <div>{{ arg.event.title }}123321</div>
+          <div>{{ arg.event.title }}</div>
         </template>
       </FullCalendar>
     </div>
@@ -13,19 +13,29 @@
 </template>
 
 <script setup lang="ts">
-import { ref } from 'vue';
+import { ref, onMounted } from 'vue';
 import FullCalendar from '@fullcalendar/vue3';
 import dayGridPlugin from '@fullcalendar/daygrid';
 import timeGridPlugin from '@fullcalendar/timegrid'
 import interactionPlugin from '@fullcalendar/interaction'
 import zhCnLocale from '@fullcalendar/core/locales/zh-cn' 
+import { post, uploadFile } from '@/utils/request';
+import { GET_TASK_LIST_BY_START_AND_END } from './api'
+import { formatDate, getFirstDayOfMonth, getLastDayOfMonth } from '@/utils/times';
+import { dayjs } from 'element-plus';
 
 // 当前选中的视图
 const currentView = ref('dayGridMonth')
-
 // 日历实例引用
 const calendarRef = ref()
 
+const dateForm = ref({
+  startDate: getFirstDayOfMonth(new Date()),
+  endDate: getLastDayOfMonth(new Date())
+})
+const calendarListData = ref([])
+const calendarLoading = ref(false)
+
 // FullCalendar 配置
 const calendarOptions = ref<any>({
   plugins: [dayGridPlugin, timeGridPlugin, interactionPlugin],
@@ -33,23 +43,92 @@ const calendarOptions = ref<any>({
   initialView: currentView.value,
   slotMinTime: '06:00:00',  // 最早显示时间
   slotMaxTime: '22:00:00',  // 最晚显示时间
-  slotDuration: '00:30:00', // 30分钟一格(timeGrid生效)
-  events: [
-    { title: '早会', start: '2025-03-16T09:00:00', end: '2025-03-20T10:00:00' },
-    { title: '午休', start: '2025-03-20T12:00:00', end: '2025-03-20T13:00:00' },
-    { title: 'AAA', start: '2025-03-17T12:00:00', end: '2025-03-19T13:00:00' },
-  ],
+  slotDuration: '01:00:00', // 一个小时一格(timeGrid生效)
+  events: [],
   headerToolbar: {  // 自定义头部
     left: 'today,prev,next',  // 左侧按钮:上一页,下一页,今天
     center: 'title',
     right: 'dayGridMonth,timeGridWeek,timeGridDay'  // 右侧显示视图切换按钮
+  },
+  slotLabelContent: (arg: any) => {
+    const hour = arg.date.getHours()
+    const meridiem = hour < 12 ? '上午' : '下午'
+    return `${meridiem} ${hour} 时`
+  },
+  datesSet: (arg: any) => { // 📌 每次切换视图或日期都会触发
+    const { startStr = '', endStr = '' } = arg
+    if (startStr && endStr) {
+      dateForm.value = {
+        startDate: startStr,
+        endDate: endStr,
+      }
+      getTaskCalendar()
+    }
   }
 })
 
+// 重新渲染表格数据
+function renderTableData() {
+  calendarOptions.value = {
+    ...calendarOptions.value,
+    events: (calendarListData.value || []).map((item: any) => {
+      return {
+        ...item,
+        start: item.startDate,
+        end: item.endDate,
+        title: item.taskName,
+        // backgroundColor: ['#909399', '#075985', '#67C23A', '#F56C6C'][item.status],
+        // borderColor: ['#909399', '#075985', '#67C23A', '#F56C6C'][item.status]
+        backgroundColor: ['#a6a9b0', '#3a7fc1', '#7fbf72', '#e28c8c'][item.status],
+        borderColor: ['#a6a9b0', '#3a7fc1', '#7fbf72', '#e28c8c'][item.status],
+      }
+    })
+  }
+}
+
+function getTaskCalendar() {
+  const { startDate, endDate } = dateForm.value
+  calendarLoading.value = true
+  post(GET_TASK_LIST_BY_START_AND_END, {
+    startDate: dayjs(startDate).format('YYYY-MM-DD'),
+    endDate: dayjs(endDate).format('YYYY-MM-DD')
+  }).then((res) => {
+    calendarListData.value = res.data || []
+    renderTableData()
+  }).finally(() => {
+    calendarLoading.value = false
+  })
+}
+
+onMounted(() => {
+  getTaskCalendar()
+})
+
+defineExpose({
+  getTaskCalendar
+})
 </script>
 
 <style lang="scss" scoped>
-:deep(.fc-today-button) {
-  margin-right: 10px;
-} 
+.calendarPlugin {
+  :deep(.fc-today-button) {
+    margin-right: 10px;
+  }
+  :deep(table) {
+    height: 100%;
+  }
+  
+  /* 强制事件内文字换行 */
+  :deep(.fc-timegrid-col-events .fc-event-main) div {
+    width: 50%;
+    white-space: normal !important;
+    word-break: break-word;
+  }
+
+  :deep(.fc-timegrid-col-events .fc-timegrid-event-harness:last-child .fc-event-main) div {
+    width: 100%;
+    white-space: normal !important;
+    word-break: break-word;
+  }
+}
 </style> 

+ 32 - 29
fhKeeper/formulahousekeeper/customerBuler-crm/src/router/routerGuards.ts

@@ -12,60 +12,63 @@ export function createRouterGuards(router: Router) {
     const skipPath = ["/login", "/register", "/test", "/testEcharts"];
     if (skipPath.includes(to.path)) {
       next();
-    } else if(to.path === '/biReport') {
-      next(`/biReport/cusReportForm`);
     } else {
       if (token && routerList && routerList.length > 0) {
         if (asyncRoutesMark) {
           next();
         } else {
           setAsyncRoutesMark(true);
-          const newRouters: any = routers;
-          const addNewRouter = newRouters.find(
-            (item: any) => item.path == "/home"
-          );
-
-          let modules = import.meta.glob("@/pages/**/*.vue");
-          routerList.forEach((item: any, index: number) => {
-            let filePath = item.path.replace("/", "")
-            const children = item.children;
-            if (children && children.length > 0) {
-              children.forEach((child: any) => {
+          const modules = import.meta.glob("@/pages/**/*.vue");
+      
+          // 遍历菜单,动态添加到 'home' 路由下
+          routerList.forEach((item: any) => {
+            let filePath = item.path.replace("/", "");
+      
+            if (item.children && item.children.length > 0) {
+              item.children.forEach((child: any) => {
                 let childFilePath = child.path.replace("/", "");
-                addNewRouter?.children.push({
+                router.addRoute('home', {
                   path: child.path,
                   name: child.name,
                   meta: {},
-                  component: modules[`/src/pages/${childFilePath}/index.vue`]
+                  component: modules[`/src/pages/${childFilePath}/index.vue`],
                 });
               });
             } else {
-              addNewRouter?.children.push({
-                path: item.path,
-                name: item.name,
-                meta: {},
-                component: modules[`/src/pages/${filePath}/index.vue`],
-              });
-              if(item.childrenList && item.childrenList.length > 0) {
-                addNewRouter.children[index + 1].children = item.childrenList.map((child: any) => {
+              let childRoutes: any[] = [];
+              if (item.childrenList && item.childrenList.length > 0) {
+                childRoutes = item.childrenList.map((child: any) => {
                   let childFilePath = child.path.replace("/", "");
                   return {
                     path: child.path,
                     name: child.name,
                     meta: { parentPath: item.path },
-                    component: modules[`/src/pages/${childFilePath}/index.vue`]
-                  }
-                })
+                    component: modules[`/src/pages/${childFilePath}/index.vue`],
+                  };
+                });
               }
+      
+              router.addRoute('home', {
+                path: item.path,
+                name: item.name,
+                meta: {},
+                component: modules[`/src/pages/${filePath}/index.vue`],
+                redirect: item.path === '/biReport' ? `/biReport/cusReportForm` : '',
+                children: childRoutes
+              });
             }
           });
-          router.addRoute(addNewRouter);
+      
+          // 添加404兜底
           router.addRoute({
             path: '/:catchAll(.*)',
             name: 'NotFound',
             component: () => import("../pages/404.vue"),
-          })
-          console.log(router.getRoutes(), '<==== router.getRoutes()')
+          });
+      
+          console.log(router.getRoutes(), '<==== router.getRoutes()');
+      
+          // ✅ 路由添加完毕后,重新进入当前页面,确保路由匹配
           next({ ...to, replace: true });
         }
       } else {

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

@@ -6,8 +6,6 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.management.platform.entity.*;
 import com.management.platform.entity.dto.TaskDto;
-import com.management.platform.mapper.TaskExecutorMapper;
-import com.management.platform.mapper.TaskMapper;
 import com.management.platform.mapper.UserMapper;
 import com.management.platform.mapper.WxCorpInfoMapper;
 import com.management.platform.service.InformationService;
@@ -132,6 +130,12 @@ public class TaskController {
     }
 
 
+    @RequestMapping("getTaskListByStartAndEnd")
+    public HttpRespMsg getTaskListByStartAndEnd(String startDate,String endDate){
+        return taskService.getTaskListByStartAndEnd( startDate, endDate,request);
+    }
+
+
 /*    @RequestMapping("sendMsg")
     public HttpRespMsg sendMsg(){
         String token = request.getHeader("Token");

+ 6 - 7
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/ContractPayment.java

@@ -1,20 +1,19 @@
 package com.management.platform.entity;
 
-import java.math.BigDecimal;
-
 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;
-
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
 import org.springframework.format.annotation.DateTimeFormat;
 
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDate;
+
 /**
  * <p>
  * 

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

@@ -181,18 +181,18 @@ public class Task extends Model<Task> {
     /**
      * 截止时间
      */
-    @JsonFormat(pattern = "yyyy-MM-dd")
-    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm")
     @TableField("end_date")
-    private LocalDate endDate;
+    private LocalDateTime endDate;
 
     /**
      * 开始日期
      */
-    @JsonFormat(pattern = "yyyy-MM-dd")
-    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm")
     @TableField("start_date")
-    private LocalDate startDate;
+    private LocalDateTime startDate;
 
     /**
      * 完成日期

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

@@ -1,17 +1,15 @@
 package com.management.platform.entity.dto;
 
+import com.fasterxml.jackson.annotation.JsonInclude;
 import com.management.platform.entity.Task;
-import com.management.platform.entity.TaskRepeatDesign;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
-import org.springframework.web.bind.annotation.RequestParam;
-
-import java.time.LocalDate;
 
 @EqualsAndHashCode(callSuper = true)
 @Data
 @Accessors(chain = true)
+@JsonInclude(value = JsonInclude.Include.NON_NULL)
 public class TaskDto extends Task {
     private Integer businessOpportunityId;
     private Integer customerId;

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

@@ -0,0 +1,27 @@
+package com.management.platform.entity.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.management.platform.entity.dto.TaskDto;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.time.LocalDate;
+import java.util.List;
+
+@Data
+@Accessors(chain = true)
+@JsonInclude(value = JsonInclude.Include.NON_NULL)
+@AllArgsConstructor
+@NoArgsConstructor
+public class DailyTaskVO {
+
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private LocalDate currentDate;
+
+    private List<TaskDto> taskDtoList;
+}

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

@@ -0,0 +1,27 @@
+package com.management.platform.entity.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.management.platform.entity.dto.TaskDto;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.time.LocalTime;
+import java.util.List;
+
+@Data
+@Accessors(chain = true)
+@JsonInclude(value = JsonInclude.Include.NON_NULL)
+@AllArgsConstructor
+@NoArgsConstructor
+public class TimeTaskVO {
+
+    @JsonFormat(pattern = "HH:mm")
+    @DateTimeFormat(pattern = "HH:mm")
+    private LocalTime currentTime;
+
+    private List<TaskDto> taskDtoList;
+}

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

@@ -12,6 +12,7 @@ import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Select;
 import org.apache.ibatis.annotations.Update;
 
+import java.time.LocalDateTime;
 import java.util.List;
 import java.util.Map;
 
@@ -68,4 +69,6 @@ public interface TaskMapper extends BaseMapper<Task> {
     List<TasKVo> getListByTaskIds(@Param("taskIdArray") String[] taskIdArray);
 
     List<TasKVo> getPageListTaskByPin(TaskDto taskDto);
+
+    List<TaskDto> getTaskListByStartAndEnd(@Param("startDate") LocalDateTime startDate, @Param("endDate") LocalDateTime endDate, @Param("departmentId") Integer departmentId, @Param("executor") String executor, @Param("companyId")Integer companyId);
 }

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

@@ -42,4 +42,6 @@ public interface TaskService extends IService<Task> {
     HttpRespMsg undoPin(Task task, HttpServletRequest request);
 
     HttpRespMsg getTaskDetail(Integer id, HttpServletRequest request);
+
+    HttpRespMsg getTaskListByStartAndEnd(String startDate, String endDate, HttpServletRequest request);
 }

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

@@ -35,6 +35,7 @@ import java.lang.reflect.Field;
 import java.lang.reflect.Method;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
+import java.time.LocalTime;
 import java.time.format.DateTimeFormatter;
 import java.util.*;
 import java.util.regex.Matcher;
@@ -129,6 +130,12 @@ public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements Ta
         HttpRespMsg httpRespMsg = new HttpRespMsg();
 
         String userId = String.valueOf(request.getHeader("Token"));
+        if (taskDto.getStartDate()!=null && taskDto.getEndDate()!=null) {
+            if (taskDto.getStartDate().isAfter(taskDto.getEndDate())) {
+                httpRespMsg.setError("任务是结束时间不能早于开始时间!");
+                return httpRespMsg;
+            }
+        }
         User user = userMapper.selectById(userId);
         if (user==null){
             httpRespMsg.setError("无法获取创建人信息!");
@@ -143,13 +150,13 @@ public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements Ta
         BeanUtils.copyProperties(taskDto,task);
         task.setCreateDate(LocalDateTime.now());//任务的创建时间
         //根据任务的开始时间与当下时间判断任务的状态
-        if (taskDto.getStartDate()!=null&&taskDto.getStartDate().isAfter(LocalDate.now())){
+        if (taskDto.getStartDate()!=null&&taskDto.getStartDate().isAfter(LocalDateTime.now())){
 //            task.setStatus(0);
             //20250116 未开始状态废弃,默认进行中
             task.setStatus(1);
-        }else if (taskDto.getEndDate()!=null&&taskDto.getEndDate().isBefore(LocalDate.now())){
+        }else if (taskDto.getEndDate()!=null&&taskDto.getEndDate().isBefore(LocalDateTime.now())){
             task.setStatus(3);
-        } else if (taskDto.getStartDate()!=null&&(taskDto.getStartDate().isBefore(LocalDate.now())||taskDto.getStartDate().isEqual(LocalDate.now()))&&taskDto.getEndDate()!=null&&(taskDto.getEndDate().isAfter(LocalDate.now())||taskDto.getEndDate().isEqual(LocalDate.now()))) {
+        } else if (taskDto.getStartDate()!=null&&(taskDto.getStartDate().isBefore(LocalDateTime.now())||taskDto.getStartDate().isEqual(LocalDateTime.now()))&&taskDto.getEndDate()!=null&&(taskDto.getEndDate().isAfter(LocalDateTime.now())||taskDto.getEndDate().isEqual(LocalDateTime.now()))) {
             task.setStatus(1);
         }
         task.setCreaterName(user.getName());
@@ -277,6 +284,12 @@ public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements Ta
     public HttpRespMsg updateTask(TaskDto taskDto, HttpServletRequest request) {
         HttpRespMsg msg=new HttpRespMsg();
         String token = String.valueOf(request.getHeader("Token"));
+        if (taskDto.getStartDate()!=null && taskDto.getEndDate()!=null) {
+            if (taskDto.getStartDate().isAfter(taskDto.getEndDate())) {
+                msg.setError("任务是结束时间不能早于开始时间!");
+                return msg;
+            }
+        }
         User user = userMapper.selectById(token);
         if (user==null){
             msg.setError("无法获取创建人信息!");
@@ -300,13 +313,13 @@ public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements Ta
             msg.setError("请保证时间段的顺序性");
             return msg;
         }
-        if (taskDto.getStartDate()!=null&&taskDto.getStartDate().isAfter(LocalDate.now())){
+        if (taskDto.getStartDate()!=null&&taskDto.getStartDate().isAfter(LocalDateTime.now())){
 //            task.setStatus(0);
             //20250116 未开始状态废弃,默认进行中
             task.setStatus(1);
-        }else if (taskDto.getEndDate()!=null&&taskDto.getEndDate().isBefore(LocalDate.now())){
+        }else if (taskDto.getEndDate()!=null&&taskDto.getEndDate().isBefore(LocalDateTime.now())){
             task.setStatus(3);
-        } else if (taskDto.getStartDate()!=null&&taskDto.getStartDate().isBefore(LocalDate.now())&&taskDto.getEndDate()!=null&&taskDto.getEndDate().isAfter(LocalDate.now()))
+        } else if (taskDto.getStartDate()!=null&&taskDto.getStartDate().isBefore(LocalDateTime.now())&&taskDto.getEndDate()!=null&&taskDto.getEndDate().isAfter(LocalDateTime.now()))
         {
             task.setStatus(1);
         }
@@ -609,15 +622,30 @@ public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements Ta
                         if(cell != null && cell.getCellTypeEnum() != CellType.BLANK){
                             if(!StringUtils.isEmpty(cell.getStringCellValue())){
                                 try {
-                                     int count = Integer.parseInt(cell.getStringCellValue());
-                                    // Excel中的日期序列号的基准日期是1900年1月1日
+//                                     double count = Double.parseDouble(cell.getStringCellValue());
+//                                    // Excel中的日期序列号的基准日期是1900年1月1日
+//                                    LocalDateTime baseDate = LocalDateTime.of(1900, 1, 1,0,0,0);
+//                                    LocalDateTime dateTime = baseDate.plusDays(count-2);// Excel的基准日期是1900年1月0日,所以需要减去2天
+//                                    task.setStartDate(dateTime);
+                                    // 将字符串转换为 double
+                                    double excelDate = Double.parseDouble(cell.getStringCellValue());
+
+                                    // 计算日期部分
                                     LocalDate baseDate = LocalDate.of(1900, 1, 1);
-                                    LocalDate date = baseDate.plusDays(count - 2); // Excel的基准日期是1900年1月0日,所以需要减去2天
-                                    task.setStartDate(date);
+                                    LocalDate date = baseDate.plusDays((int) excelDate - 2); // 减去 2 天,因为 Excel 基准日期是 1900年1月1日
+
+                                    // 计算时间部分
+                                    double timeFraction = excelDate - Math.floor(excelDate); // 获取小数部分
+                                    LocalTime time = LocalTime.ofSecondOfDay((long) (timeFraction * 86400)); // 86400 是一天的秒数
+
+                                    // 合并日期和时间
+                                    LocalDateTime dateTime = LocalDateTime.of(date, time);
+                                    task.setStartDate(dateTime);
+
 
                                 } catch (Exception e) {
-                                    System.out.println("日期时间格式不正确,应该是yyyy/MM/dd" );
-                                    msg.setError("日期时间格式不正确,应该是yyyy/MM/dd");
+                                    System.out.println("日期时间格式不正确,应该是yyyy/MM/dd HH:mm:ss" );
+                                    msg.setError("日期时间格式不正确,应该是yyyy/MM/dd HH:mm:ss");
                                     return msg;
                                 }
                             }
@@ -627,15 +655,29 @@ public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements Ta
                         if(cell != null && cell.getCellTypeEnum() != CellType.BLANK){
                             if(!StringUtils.isEmpty(cell.getStringCellValue())){
                                 try {
-                                    int count = Integer.parseInt(cell.getStringCellValue());
+                                    /*int count = Integer.parseInt(cell.getStringCellValue());
                                     // Excel中的日期序列号的基准日期是1900年1月1日
+                                    LocalDateTime baseDate = LocalDateTime.of(1900, 1, 1,0,0,0);
+                                    LocalDateTime dateTime = baseDate.plusDays(count-2);// Excel的基准日期是1900年1月0日,所以需要减去2天
+                                    task.setEndDate(dateTime);*/
+                                    // 将字符串转换为 double
+                                    double excelDate = Double.parseDouble(cell.getStringCellValue());
+
+                                    // 计算日期部分
                                     LocalDate baseDate = LocalDate.of(1900, 1, 1);
-                                    LocalDate date = baseDate.plusDays(count - 2); // Excel的基准日期是1900年1月0日,所以需要减去2天
-                                    task.setEndDate(date);
+                                    LocalDate date = baseDate.plusDays((int) excelDate - 2); // 减去 2 天,因为 Excel 基准日期是 1900年1月1日
+
+                                    // 计算时间部分
+                                    double timeFraction = excelDate - Math.floor(excelDate); // 获取小数部分
+                                    LocalTime time = LocalTime.ofSecondOfDay((long) (timeFraction * 86400)); // 86400 是一天的秒数
+
+                                    // 合并日期和时间
+                                    LocalDateTime dateTime = LocalDateTime.of(date, time);
+                                    task.setEndDate(dateTime);
 
                                 } catch (Exception e) {
-                                    System.out.println("日期时间格式不正确,应该是yyyy/MM/dd" );
-                                    msg.setError("日期时间格式不正确,应该是yyyy/MM/dd");
+                                    System.out.println("日期时间格式不正确,应该是yyyy/MM/dd HH:mm:ss" );
+                                    msg.setError("日期时间格式不正确,应该是yyyy/MM/dd HH:mm:ss");
                                     return msg;
                                 }
                             }
@@ -833,13 +875,13 @@ public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements Ta
                         msg.setError("任务:"+task.getTaskName()+"中客户/"+str+"/销售订单不应一同存在");
                         return msg;
                     }
-                    if (task.getStartDate()!=null&&task.getStartDate().isAfter(LocalDate.now())){
+                    if (task.getStartDate()!=null&&task.getStartDate().isAfter(LocalDateTime.now())){
 //                        task.setStatus(0);
                         //20250116 未开始状态废弃,默认进行中
                         task.setStatus(1);
-                    }else if (task.getEndDate()!=null&&task.getEndDate().isBefore(LocalDate.now())){
+                    }else if (task.getEndDate()!=null&&task.getEndDate().isBefore(LocalDateTime.now())){
                         task.setStatus(3);
-                    } else if (task.getStartDate()!=null&&task.getStartDate().isBefore(LocalDate.now())&&task.getEndDate()!=null&&task.getEndDate().isAfter(LocalDate.now()))
+                    } else if (task.getStartDate()!=null&&task.getStartDate().isBefore(LocalDateTime.now())&&task.getEndDate()!=null&&task.getEndDate().isAfter(LocalDateTime.now()))
                     {
                         task.setStatus(1);
                     }
@@ -1036,18 +1078,18 @@ public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements Ta
                 }
                 else if(model.equals("startDate")){
                     if (tasKVo.getStartDate()!=null){
-                        LocalDate startDate = tasKVo.getStartDate();
+                        LocalDateTime startDate = tasKVo.getStartDate();
                         // 定义日期时间格式
-                        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+                        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
                         // 格式化为字符串
                         value= startDate.format(formatter);
                     }
                 }
                 else if(model.equals("endDate")){
                     if (tasKVo.getEndDate()!=null){
-                        LocalDate endDate = tasKVo.getEndDate();
+                        LocalDateTime endDate = tasKVo.getEndDate();
                         // 定义日期时间格式
-                        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+                        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
                         // 格式化为字符串
                         value= endDate.format(formatter);
                     }
@@ -1101,7 +1143,7 @@ public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements Ta
         if(0 == taskDto.getStatus()){
             //重启相关判断
             //重启的任务必须要修改开始时间为当前日期之后
-            LocalDate nowDate = LocalDate.now();
+            LocalDateTime nowDate = LocalDateTime.now();
             if(taskDto.getStartDate().isBefore(nowDate)){
                 msg.setError("开始日期不能早于当前日期");
                 return msg;
@@ -1116,8 +1158,8 @@ public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements Ta
 
         LambdaUpdateWrapper<Task> luw = new LambdaUpdateWrapper<>();
         luw.set(Task::getStatus,taskDto.getStatus())
-                .set(Task::getStartDate,taskDto.getStartDate())
-                .set(Task::getEndDate,taskDto.getEndDate())
+                .set(taskDto.getStartDate()!=null,Task::getStartDate,taskDto.getStartDate())
+                .set(taskDto.getEndDate()!=null,Task::getEndDate,taskDto.getEndDate())
                 .eq(Task::getId,taskDto.getId());
         taskMapper.update(null,luw);
         TaskLog taskLog = new TaskLog();
@@ -1217,18 +1259,18 @@ public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements Ta
                 }
                 else if(model.equals("startDate")){
                     if (tasKVo.getStartDate()!=null){
-                        LocalDate startDate = tasKVo.getStartDate();
+                        LocalDateTime startDate = tasKVo.getStartDate();
                         // 定义日期时间格式
-                        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+                        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
                         // 格式化为字符串
                         value= startDate.format(formatter);
                     }
                 }
                 else if(model.equals("endDate")){
                     if (tasKVo.getEndDate()!=null){
-                        LocalDate endDate = tasKVo.getEndDate();
+                        LocalDateTime endDate = tasKVo.getEndDate();
                         // 定义日期时间格式
-                        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+                        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
                         // 格式化为字符串
                         value= endDate.format(formatter);
                     }
@@ -1436,6 +1478,153 @@ public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements Ta
         return respMsg;
     }
 
+    @Override
+    public HttpRespMsg getTaskListByStartAndEnd( String startDate, String endDate, HttpServletRequest request) {
+        HttpRespMsg msg = new HttpRespMsg();
+        String token = String.valueOf(request.getHeader("Token"));
+        User user = userMapper.selectById(token);
+        Integer companyId = user.getCompanyId();
+        boolean isAll = sysFunctionService.hasPriviledge(user.getRoleId(), "查看全部任务");
+        boolean isNotAll = sysFunctionService.hasPriviledge(user.getRoleId(), "查看负责部门任务");
+
+
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
+        DateTimeFormatter formatterDate = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        DateTimeFormatter formatterTime = DateTimeFormatter.ofPattern("HH:mm");
+        LocalDateTime parseStartDate = LocalDateTime.parse(startDate + " 00:00", formatter);
+        LocalDateTime parseEndDate = LocalDateTime.parse(endDate + " 00:00", formatter).plusDays(1L);
+
+        Integer departmentId=null;
+        String executor=null;
+
+        if (isAll){
+            departmentId=null;
+        }
+        else if (isNotAll){
+            departmentId= user.getDepartmentId();//找出对应的部门id
+        }else {
+            executor=user.getId();
+
+        }
+        List<TaskDto> taskDtoList= taskMapper.getTaskListByStartAndEnd(parseStartDate,parseEndDate,departmentId,executor,companyId);
+
+        /*if (type==1||type==2) {
+            // 使用LinkedHashMap保持日期顺序
+            Map<LocalDate, List<TaskDto>> dailyTasks = new LinkedHashMap<>();
+
+            // 生成从startDate到endDate的所有日期,并初始化空列表
+            LocalDate parseStart = LocalDate.parse(startDate, formatterDate);
+            LocalDate parseEnd = LocalDate.parse(endDate, formatterDate);
+            LocalDate currentDate = parseStart;
+            while (!currentDate.isAfter(parseEnd)) {
+                dailyTasks.put(currentDate, new ArrayList<>());
+                currentDate = currentDate.plusDays(1);
+            }
+
+            // 遍历任务,填充到对应的日期
+            for (TaskDto task : taskDtoList) {
+                // 根据实际字段获取任务日期,例如getExecuteDate()
+                LocalDateTime taskStartDate = task.getStartDate();
+                LocalDateTime taskEndDate = task.getEndDate();
+                if (taskStartDate != null && taskEndDate != null) {
+                    LocalDate task_start = LocalDate.from(taskStartDate);
+                    LocalDate task_end = LocalDate.from(taskEndDate);
+                    for (Map.Entry<LocalDate, List<TaskDto>> entry : dailyTasks.entrySet()) {
+                        LocalDate date = entry.getKey(); // 获取日期
+                        List<TaskDto> tasks = entry.getValue(); // 获取任务列表
+                        if (date.isAfter(task_start) && date.isBefore(task_end) || date.isEqual(task_start)) {
+                            tasks.add(task);
+                        }
+                    }
+                } else if (taskStartDate == null && taskEndDate != null) {
+                    LocalDate task_end = LocalDate.from(taskEndDate);
+                    for (Map.Entry<LocalDate, List<TaskDto>> entry : dailyTasks.entrySet()) {
+                        LocalDate date = entry.getKey(); // 获取日期
+                        List<TaskDto> tasks = entry.getValue(); // 获取任务列表
+                        if (date.isEqual(task_end)) {
+                            tasks.add(task);
+                        }
+                    }
+                } else if (taskStartDate != null) {
+                    LocalDate task_start = LocalDate.from(taskStartDate);
+                    for (Map.Entry<LocalDate, List<TaskDto>> entry : dailyTasks.entrySet()) {
+                        LocalDate date = entry.getKey(); // 获取日期
+                        List<TaskDto> tasks = entry.getValue(); // 获取任务列表
+                        if (date.isEqual(task_start)) {
+                            tasks.add(task);
+                        }
+                    }
+                }
+
+            }
+            //自定义DTO类
+            List<DailyTaskVO> result = dailyTasks.entrySet().stream()
+                    .map(entry -> new DailyTaskVO(entry.getKey(), entry.getValue()))
+                    .collect(Collectors.toList());
+            msg.setData(result);
+        }
+        else {
+            // 使用LinkedHashMap保持日期顺序
+            Map<LocalTime, List<TaskDto>> dailyTasks = new LinkedHashMap<>();
+
+            // 生成从startDate到endDate的所有日期,并初始化空列表
+            LocalTime startTime = LocalTime.of(6, 0);
+            LocalTime endTime = LocalTime.of(23, 0);
+
+            LocalTime currentTime = startTime;
+            while (!currentTime.isAfter(endTime)) {
+                dailyTasks.put(currentTime, new ArrayList<>());
+                currentTime = currentTime.plusMinutes(30);
+            }
+            // 遍历任务,填充到对应的日期
+            for (TaskDto task : taskDtoList) {
+                // 根据实际字段获取任务日期,例如getExecuteDate()
+                LocalDateTime taskStartDate = task.getStartDate();
+                LocalDateTime taskEndDate = task.getEndDate();
+                if (taskStartDate != null && taskEndDate != null) {
+                    LocalTime task_start = LocalTime.from(taskStartDate);
+                    LocalTime task_end = LocalTime.from(taskEndDate);
+                    for (Map.Entry<LocalTime, List<TaskDto>> entry : dailyTasks.entrySet()) {
+                        LocalTime date = entry.getKey(); // 获取日期
+                        List<TaskDto> tasks = entry.getValue(); // 获取任务列表
+                        if (date.isAfter(task_start) && date.isBefore(task_end) || date.equals(task_start)) {
+                            tasks.add(task);
+                        }
+                    }
+                }
+                else if (taskStartDate == null && taskEndDate != null) {
+                    LocalTime task_end = LocalTime.from(taskEndDate);
+                    for (Map.Entry<LocalTime, List<TaskDto>> entry : dailyTasks.entrySet()) {
+                        LocalTime date = entry.getKey(); // 获取日期
+                        List<TaskDto> tasks = entry.getValue(); // 获取任务列表
+                        if (date.equals(task_end)) {
+                            tasks.add(task);
+                        }
+                    }
+                }
+                else if (taskStartDate != null) {
+                    LocalTime task_start = LocalTime.from(taskStartDate);
+                    for (Map.Entry<LocalTime, List<TaskDto>> entry : dailyTasks.entrySet()) {
+                        LocalTime date = entry.getKey(); // 获取日期
+                        List<TaskDto> tasks = entry.getValue(); // 获取任务列表
+                        if (date.equals(task_start)) {
+                            tasks.add(task);
+                        }
+                    }
+                }
+            }
+            //自定义DTO类
+            List<TimeTaskVO> result = dailyTasks.entrySet().stream()
+                    .map(entry -> new TimeTaskVO(entry.getKey(), entry.getValue()))
+                    .collect(Collectors.toList());
+            msg.setData(result);
+        }*/
+
+        msg.setData(taskDtoList);
+        return msg;
+
+    }
+
     public void updateTaskRepeatConfigure(Task task){
         task.setRepeatType(null).setRepeatEndNever(null).setRepeatEndCount(null)
                 .setRepeatEndDate(null).setRepeatDesignDay(null).setRepeatDesignSameday(null)

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

@@ -5,10 +5,13 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.management.platform.entity.*;
 import com.management.platform.entity.dto.QueryVisitPlanDTO;
+import com.management.platform.entity.dto.TaskDto;
+import com.management.platform.entity.vo.DailyTaskVO;
 import com.management.platform.entity.vo.MonthActivePlanVO;
 import com.management.platform.entity.vo.VisitPlanDetailVO;
 import com.management.platform.entity.vo.VisitPlanVO;
 import com.management.platform.mapper.*;
+import com.management.platform.service.SysFunctionService;
 import com.management.platform.service.VisitPlanService;
 import com.management.platform.util.DateTimeUtil;
 import com.management.platform.util.HttpRespMsg;
@@ -17,10 +20,10 @@ import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
+import java.time.LocalDate;
 import java.time.LocalDateTime;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
+import java.time.format.DateTimeFormatter;
+import java.util.*;
 import java.util.regex.Pattern;
 import java.util.stream.Collectors;
 
@@ -47,6 +50,12 @@ public class VisitPlanServiceImpl extends ServiceImpl<VisitPlanMapper, VisitPlan
     @Resource
     private ContactsMapper contactsMapper;
 
+    @Resource
+    private SysFunctionService sysFunctionService;
+
+    @Resource
+    private TaskMapper taskMapper;
+
     @Override
     public HttpRespMsg addOrUpdateVisitPlan(VisitPlan visitPlan, HttpServletRequest request) {
         HttpRespMsg httpRespMsg = new HttpRespMsg();
@@ -350,7 +359,33 @@ public class VisitPlanServiceImpl extends ServiceImpl<VisitPlanMapper, VisitPlan
 //        IPage<VisitPlanVO> resPage = visitPlanMapper.getPageVisitPlan(page,query);
         List<VisitPlanVO> resPage = visitPlanMapper.getListVisitPlan(query);
 
-        httpRespMsg.setData(resPage);
+        Integer companyId = user.getCompanyId();
+        boolean isAll = sysFunctionService.hasPriviledge(user.getRoleId(), "查看全部任务");
+        boolean isNotAll = sysFunctionService.hasPriviledge(user.getRoleId(), "查看负责部门任务");
+        Integer departmentId=null;
+        String executor=null;
+
+        if (isAll){
+            departmentId=null;
+        }
+        else if (isNotAll){
+            departmentId= user.getDepartmentId();//找出对应的部门id
+        }else {
+            executor=user.getId();
+
+        }
+
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
+        LocalDateTime startDateParse = LocalDateTime.parse(calenderDate + " 00:00", formatter);
+        LocalDateTime endDateParse = startDateParse.plusDays(1L);
+        List<TaskDto> taskList = taskMapper.getTaskListByStartAndEnd(startDateParse, endDateParse, departmentId, executor, companyId);
+
+        HashMap<String, Object> map = new HashMap<>();
+        map.put("planList",resPage);
+        map.put("taskList",taskList);
+
+        httpRespMsg.setData(map);
+
         return httpRespMsg;
     }
 
@@ -380,7 +415,89 @@ public class VisitPlanServiceImpl extends ServiceImpl<VisitPlanMapper, VisitPlan
             return httpRespMsg;
         }
         List<MonthActivePlanVO> list = visitPlanMapper.getMonthActivePlan(user.getId(),ym);
-        httpRespMsg.setData(list);
+
+        Integer companyId = user.getCompanyId();
+        boolean isAll = sysFunctionService.hasPriviledge(user.getRoleId(), "查看全部任务");
+        boolean isNotAll = sysFunctionService.hasPriviledge(user.getRoleId(), "查看负责部门任务");
+        Integer departmentId=null;
+        String executor=null;
+
+        if (isAll){
+            departmentId=null;
+        }
+        else if (isNotAll){
+            departmentId= user.getDepartmentId();//找出对应的部门id
+        }else {
+            executor=user.getId();
+
+        }
+
+        // 解析为 LocalDate,获取该月的第一天
+        LocalDate startDate = LocalDate.parse(ym + "-01"); // 加上-01表示第一天
+        // 转换为 LocalDateTime
+        LocalDateTime parseStartDate = startDate.atStartOfDay(); // 获取开始时间
+        LocalDateTime parseEndDate = parseStartDate.plusMonths(1L);// 获取结束时间
+        List<TaskDto> taskList = taskMapper.getTaskListByStartAndEnd(parseStartDate, parseEndDate, departmentId, executor, companyId);
+
+        Map<LocalDate, List<TaskDto>> dailyTasks = new LinkedHashMap<>();
+
+        // 生成从startDate到endDate的所有日期,并初始化空列表
+
+        LocalDate parseEnd = startDate.plusMonths(1L).plusDays(-1L);
+        LocalDate currentDate = startDate;
+        while (!currentDate.isAfter(parseEnd)) {
+            dailyTasks.put(currentDate, new ArrayList<>());
+            currentDate = currentDate.plusDays(1);
+        }
+
+        // 遍历任务,填充到对应的日期
+        for (TaskDto task : taskList) {
+            // 根据实际字段获取任务日期,例如getExecuteDate()
+            LocalDateTime taskStartDate = task.getStartDate();
+            LocalDateTime taskEndDate = task.getEndDate();
+            if (taskStartDate != null && taskEndDate != null) {
+                LocalDate task_start = LocalDate.from(taskStartDate);
+                LocalDate task_end = LocalDate.from(taskEndDate);
+                for (Map.Entry<LocalDate, List<TaskDto>> entry : dailyTasks.entrySet()) {
+                    LocalDate date = entry.getKey(); // 获取日期
+                    List<TaskDto> tasks = entry.getValue(); // 获取任务列表
+                    if (date.isAfter(task_start) && date.isBefore(task_end) || date.isEqual(task_start)) {
+                        tasks.add(task);
+                    }
+                }
+            } else if (taskStartDate == null && taskEndDate != null) {
+                LocalDate task_end = LocalDate.from(taskEndDate);
+                for (Map.Entry<LocalDate, List<TaskDto>> entry : dailyTasks.entrySet()) {
+                    LocalDate date = entry.getKey(); // 获取日期
+                    List<TaskDto> tasks = entry.getValue(); // 获取任务列表
+                    if (date.isEqual(task_end)) {
+                        tasks.add(task);
+                    }
+                }
+            } else if (taskStartDate != null) {
+                LocalDate task_start = LocalDate.from(taskStartDate);
+                for (Map.Entry<LocalDate, List<TaskDto>> entry : dailyTasks.entrySet()) {
+                    LocalDate date = entry.getKey(); // 获取日期
+                    List<TaskDto> tasks = entry.getValue(); // 获取任务列表
+                    if (date.isEqual(task_start)) {
+                        tasks.add(task);
+                    }
+                }
+            }
+
+        }
+        //自定义DTO类
+        List<DailyTaskVO> result = dailyTasks.entrySet().stream()
+                .map(entry -> new DailyTaskVO(entry.getKey(), entry.getValue()))
+                .collect(Collectors.toList());
+
+        List<DailyTaskVO> collect = result.stream().filter(r -> !r.getTaskDtoList().isEmpty()).collect(Collectors.toList());
+
+        HashMap<String, Object> map = new HashMap<>();
+        map.put("planList",list);
+        map.put("taskList",collect);
+
+        httpRespMsg.setData(map);
         return httpRespMsg;
     }
 }

+ 12 - 40
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/task/TimingTask.java

@@ -1,60 +1,32 @@
 package com.management.platform.task;
 
-import com.alibaba.fastjson.JSON;
-import com.alibaba.fastjson.JSONArray;
-import com.alibaba.fastjson.JSONObject;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.baomidou.mybatisplus.core.injector.methods.SelectById;
-import com.management.platform.controller.WeiXinCorpController;
-import com.management.platform.entity.*;
 import com.management.platform.entity.Task;
-import com.management.platform.entity.vo.TokenVo;
+import com.management.platform.entity.TaskExecutor;
+import com.management.platform.entity.User;
+import com.management.platform.entity.WxCorpInfo;
 import com.management.platform.mapper.*;
-import com.management.platform.service.*;
-import com.management.platform.service.impl.WxCorpInfoServiceImpl;
-import com.management.platform.util.*;
-import com.management.platform.webservice.po.*;
-import jdk.nashorn.internal.ir.ContinueNode;
+import com.management.platform.service.OperationRecordService;
+import com.management.platform.service.WxCorpInfoService;
+import com.management.platform.util.RedisUtil;
 import lombok.extern.slf4j.Slf4j;
-import me.chanjar.weixin.mp.api.WxMpInMemoryConfigStorage;
-import me.chanjar.weixin.mp.api.WxMpService;
-import me.chanjar.weixin.mp.api.impl.WxMpServiceImpl;
-import me.chanjar.weixin.mp.bean.template.WxMpTemplateData;
-import me.chanjar.weixin.mp.bean.template.WxMpTemplateMessage;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
-import org.springframework.http.*;
-import org.springframework.http.client.ClientHttpResponse;
 import org.springframework.scheduling.annotation.EnableScheduling;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
-import org.springframework.transaction.annotation.Transactional;
-import org.springframework.util.StringUtils;
-import org.springframework.web.client.DefaultResponseErrorHandler;
 import org.springframework.web.client.RestTemplate;
 
 import javax.annotation.Resource;
 import java.io.File;
-import java.io.IOException;
-import java.math.BigDecimal;
-import java.security.SecureRandom;
-import java.sql.Time;
-import java.sql.Timestamp;
-import java.text.DecimalFormat;
-import java.time.*;
-import java.time.Period;
-import java.time.format.DateTimeFormatter;
-import java.time.temporal.TemporalAccessor;
-import java.time.temporal.TemporalAdjusters;
-import java.time.temporal.WeekFields;
-import java.util.*;
-import java.util.concurrent.*;
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.Executor;
+import java.util.concurrent.Executors;
 import java.util.stream.Collectors;
 import java.util.stream.IntStream;
 
-import static org.apache.logging.log4j.message.ParameterizedMessage.format;
-
 /**
  * Author: 吴涛涛
  * Date : 2019 - 12 - 31 16:04
@@ -149,7 +121,7 @@ public class TimingTask {
 //        List<WxCorpInfo> wxCorpInfos = wxCorpInfoMapper.selectList(new QueryWrapper<WxCorpInfo>().eq("company_id", 5770));
         List<WxCorpInfo> wxCorpInfos = wxCorpInfoMapper.selectList(null);
         for (WxCorpInfo wxCorpInfo : wxCorpInfos) {
-            LocalDate now = LocalDate.now();
+            LocalDateTime now = LocalDateTime.now();
             List<Task> taskList = taskMapper.selectList(new QueryWrapper<Task>().eq("company_id", wxCorpInfo.getCompanyId()).eq("status",0).and(wrapper -> wrapper.eq("end_date", now).or().eq("end_date", now.plusDays(1))));
             List<User> userList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", wxCorpInfo.getCompanyId()));
             List<Integer> taskIds = taskList.stream().map(Task::getId).distinct().collect(Collectors.toList());

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

@@ -193,11 +193,38 @@
             <if test=" executorName!= null and executorName != '' ">
                 AND te.executor_name LIKE CONCAT('%', #{executorName}, '%')
             </if>
-            <if test=" startDate!= null">
+            <!--<if test=" startDate!= null">
                 AND task.start_date &gt; #{startDate}
             </if>
             <if test=" endDate!= null">
                 AND task.end_date &lt; #{endDate}
+            </if>-->
+            <if test=" startDate!= null and endDate!= null">
+                AND
+                (
+                    (
+                        (task.start_date IS NULL OR task.start_date &lt;= #{startDate}) AND (task.end_date &gt;= #{startDate} AND task.end_date &lt;= #{endDate})
+                    )
+                    OR
+                    (
+                        (task.end_date IS NULL OR task.end_date &gt;= #{endDate}) AND (task.start_date &gt;= #{startDate} AND task.start_date &lt;= #{endDate})
+                    )
+                    OR
+                    (
+                        task.start_date IS NOT NULL AND task.end_date IS NOT NULL AND task.start_date &gt;= #{startDate}
+                        AND task.start_date &lt;= #{endDate} AND task.end_date &gt;= #{startDate} AND task.end_date &lt;= #{endDate}
+                    )
+                    OR
+                    (
+                    task.start_date IS NOT NULL AND task.end_date IS NOT NULL AND task.start_date &lt;= #{startDate} AND task.end_date &gt; #{endDate}
+                    )
+                )
+            </if>
+            <if test=" startDate != null and endDate == null">
+                AND (task.end_date IS NOT NULL and task.end_date &gt;= #{startDate})
+            </if>
+            <if test=" startDate == null and endDate != null">
+                AND (task.start_date IS NOT NULL and task.start_date &lt;= #{endDate})
             </if>
             <if test=" companyId!= null ">
                 AND task.company_id = #{companyId}
@@ -275,11 +302,38 @@
             <if test=" executorName!= null and executorName != '' ">
                 AND te.executor_name LIKE CONCAT('%', #{executorName}, '%')
             </if>
-            <if test=" startDate!= null  ">
+            <!--<if test=" startDate!= null  ">
                 AND task.start_date &gt; #{startDate}
             </if>
             <if test=" endDate!= null  ">
                 AND task.end_date &lt; #{endDate}
+            </if>-->
+            <if test=" startDate!= null and endDate!= null">
+                AND
+                (
+                    (
+                        (task.start_date IS NULL OR task.start_date &lt;= #{startDate}) AND (task.end_date &gt;= #{startDate} AND task.end_date &lt;= #{endDate})
+                    )
+                OR
+                    (
+                        (task.end_date IS NULL OR task.end_date &gt;= #{endDate}) AND (task.start_date &gt;= #{startDate} AND task.start_date &lt;= #{endDate})
+                    )
+                OR
+                    (
+                        task.start_date IS NOT NULL AND task.end_date IS NOT NULL AND task.start_date &gt;= #{startDate}
+                        AND task.start_date &lt;= #{endDate} AND task.end_date &gt;= #{startDate} AND task.end_date &lt;= #{endDate}
+                    )
+                    OR
+                    (
+                    task.start_date IS NOT NULL AND task.end_date IS NOT NULL AND task.start_date &lt;= #{startDate} AND task.end_date &gt; #{endDate}
+                    )
+                )
+            </if>
+            <if test=" startDate != null and endDate == null">
+                AND (task.end_date IS NOT NULL and task.end_date &gt;= #{startDate})
+            </if>
+            <if test=" startDate == null and endDate != null">
+                AND (task.start_date IS NOT NULL and task.start_date &lt;= #{endDate})
             </if>
             <if test=" companyId!= null ">
                 AND task.company_id = #{companyId}
@@ -368,11 +422,34 @@
             <if test=" executorName!= null and executorName != '' ">
                 AND te.executor_name LIKE CONCAT('%', #{executorName}, '%')
             </if>
-            <if test=" startDate!= null">
+            <!--<if test=" startDate!= null">
                 AND task.start_date &gt; #{startDate}
             </if>
             <if test=" endDate!= null">
                 AND task.end_date &lt; #{endDate}
+            </if>-->
+            <if test=" startDate!= null and endDate!= null">
+                AND
+                (
+                    (
+                        (task.start_date IS NULL OR task.start_date &lt;= #{startDate}) AND (task.end_date &gt;= #{startDate} AND task.end_date &lt;= #{endDate})
+                    )
+                OR
+                    (
+                        (task.end_date IS NULL OR task.end_date &gt;= #{endDate}) AND (task.start_date &gt;= #{startDate} AND task.start_date &lt;= #{endDate})
+                    )
+                OR
+                    (
+                        task.start_date IS NOT NULL AND task.end_date IS NOT NULL AND task.start_date &gt;= #{startDate}
+                        AND task.start_date &lt;= #{endDate} AND task.end_date &gt;= #{startDate} AND task.end_date &lt;= #{endDate}
+                    )
+                )
+            </if>
+            <if test=" startDate != null and endDate == null">
+                AND (task.end_date IS NOT NULL and task.end_date &gt;= #{startDate})
+            </if>
+            <if test=" startDate == null and endDate != null">
+                AND (task.start_date IS NOT NULL and task.start_date &lt;= #{endDate})
             </if>
             <if test=" companyId!= null ">
                 AND task.company_id = #{companyId}
@@ -395,6 +472,58 @@
         </if>
 
     </select>
+    <select id="getTaskListByStartAndEnd" resultType="com.management.platform.entity.dto.TaskDto">
+        select DISTINCT task.id,task.task_name,task.start_date,task.end_date,task.status,task.priority
+        from task
+        left join  custom on task.custom_id=custom.id
+        left join  business_opportunity on task.business_opportunity_id=business_opportunity.id
+        left join  `sales_order` on task.order_id=`sales_order`.id
+        left join  clue on task.clue_id=clue.id
+        left join  contacts on task.contacts_id=contacts.id
+        <if test=" departmentId!= null " >
+            inner join task_executor on task.id=task_executor.task_id
+        </if>
+        <if test=" executor!= null and executor != '' " >
+            inner join task_executor on task.id=task_executor.task_id
+        </if>
+        <where>
+            and 1=1 and task.is_delete=0
+            <if test=" startDate!= null and endDate!= null">
+                AND
+                (
+                (
+                (task.start_date IS NULL OR task.start_date &lt;= #{startDate}) AND (task.end_date &gt;= #{startDate} AND task.end_date &lt;= #{endDate})
+                )
+                OR
+                (
+                (task.end_date IS NULL OR task.end_date &gt; #{endDate}) AND (task.start_date &gt;= #{startDate} AND task.start_date &lt; #{endDate})
+                )
+                OR
+                (
+                task.start_date IS NOT NULL AND task.end_date IS NOT NULL AND task.start_date &gt;= #{startDate}
+                AND task.start_date &lt; #{endDate} AND task.end_date &gt;= #{startDate} AND task.end_date &lt; #{endDate}
+                )
+                OR
+                (
+                task.start_date IS NOT NULL AND task.end_date IS NOT NULL AND task.start_date &lt;= #{startDate} AND task.end_date &gt; #{endDate}
+                )
+                )
+            </if>
+            <if test=" companyId!= null ">
+                AND task.company_id = #{companyId}
+            </if>
+            <if test=" departmentId!= null " >
+                AND task_executor.task_id in ( SELECT DISTINCT te.task_id FROM task_executor te
+                LEFT JOIN `user` u ON u.id=te.executor_id
+                where u.department_id = #{departmentId} )
+            </if>
+            <if test=" executor!= null and executor != '' " >
+                AND task_executor.task_id in ( SELECT DISTINCT te.task_id FROM task_executor te
+                where te.executor_id= #{executor} or te.executor_id is null )
+            </if>
+        </where>
+        order by task.create_date desc
+    </select>
 
     <update id="updateRepeatConfig">
         update task

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

@@ -1319,8 +1319,8 @@ public class ProjectController {
 
     //导出FTE报表
     @RequestMapping("/exportFTEData")
-    public HttpRespMsg exportFTEData(String monthStart,String monthEnd,String area,HttpServletRequest request){
-        return projectService.exportFTEData(monthStart,monthEnd,area,request);
+    public HttpRespMsg exportFTEData(String monthStart,String monthEnd,String area,Integer departmentId ,HttpServletRequest request){
+        return projectService.exportFTEData(monthStart,monthEnd,area,departmentId,request);
     }
 
     @RequestMapping("/syncProjectWithFanwei")

+ 1 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/resources/application.yml

@@ -15,7 +15,7 @@ spring:
       location: C:/upload/
   datasource:
     driver-class-name: com.mysql.cj.jdbc.Driver
-    url: jdbc:mysql://1.94.62.58:17089/man_hour_manager?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&rewriteBatchedStatements=true&useSSL=false
+    url: jdbc:mysql://1.94.62.58:17089/man_mld?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&rewriteBatchedStatements=true&useSSL=false
     username: root
     password: P011430@Huoshi*
 #    url: jdbc:mysql://47.100.37.243:7644/man_hour_manager?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&rewriteBatchedStatements=true

+ 108 - 1
fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/CompanyController.java

@@ -8,8 +8,9 @@ import com.management.platform.entity.*;
 import com.management.platform.entity.vo.FeiShuInfoVO;
 import com.management.platform.mapper.*;
 import com.management.platform.service.CompanyService;
+import com.management.platform.service.FeishuInfoService;
 import com.management.platform.util.HttpRespMsg;
-import com.sun.org.apache.regexp.internal.RE;
+import lombok.RequiredArgsConstructor;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.http.HttpHeaders;
@@ -28,6 +29,8 @@ import java.time.Duration;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.LocalTime;
+import java.util.Arrays;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Optional;
 import java.util.stream.Collectors;
@@ -42,6 +45,7 @@ import java.util.stream.Collectors;
  */
 @RestController
 @RequestMapping("/company")
+@RequiredArgsConstructor
 public class CompanyController {
     @Value("${syncDDMembUrl}")
     private String syncDDMembUrl;
@@ -62,6 +66,56 @@ public class CompanyController {
     @Resource
     FeishuInfoMapper feishuInfoMapper;
 
+    @Resource
+    private CompanySigningMapper companySigningMapper;
+
+    @Resource
+    private AuditWorkflowTimeSettingMapper auditWorkflowTimeSettingMapper;
+
+    @Resource
+    private CompanyCustomerContactMapper companyCustomerContactMapper;
+
+    @Resource
+    private CompanyReportMapper companyReportMapper;
+    @Resource
+    private CustomerInfoMapper customerInfoMapper;
+
+    @Resource
+    private DepartmentMapper departmentMapper;
+    @Resource
+    private FeishuInfoService feishuInfoService;
+
+    @Resource
+    private OperationRecordMapper operationRecordMapper;
+    @Resource
+    private ProjectMapper projectMapper;
+    @Resource
+    private ProjectCategoryMapper projectCategoryMapper;
+
+    @Resource
+    private SysRoleMapper sysRoleMapper;
+
+    @Resource
+    private SysRoleModuleMapper sysRoleModuleMapper;
+
+    @Resource
+    private SysRoleFunctionMapper sysRoleFunctionMapper;
+
+    @Resource
+    private TaskMapper taskMapper;
+
+    @Resource
+    private TimeTypeMapper timeTypeMapper;
+
+    @Resource
+    private UserCorpwxTimeMapper userCorpwxTimeMapper;
+
+
+
+
+
+
+
     public static LocalDateTime lastSyncDDTime;
 
     /**
@@ -238,5 +292,58 @@ public class CompanyController {
     public HttpRespMsg getSuperManagerId(Integer companyId){
         return companyService.getSuperManagerId(companyId);
     }
+
+    @RequestMapping("/getNeedDelList")
+    public HttpRespMsg getNeedDelList(Integer pageIndex, Integer pageSize){
+        QueryWrapper<Company> queryWrapper = new QueryWrapper<Company>();
+        HttpRespMsg msg = new HttpRespMsg();
+        LocalDateTime localDateTime = LocalDateTime.now().plusYears(-2L);
+        queryWrapper.eq("set_meal",0).le("expiration_date",localDateTime).orderByAsc("expiration_date");
+        IPage<Company> result = companyMapper.selectPage(new Page<>(pageIndex, pageSize), queryWrapper);
+        HashMap<String, Object> map = new HashMap<>();
+        map.put("record",result.getRecords());
+        map.put("total",result.getTotal());
+        msg.setData(map);
+        return msg;
+    }
+
+    @RequestMapping("/delNeedDelList")
+    public HttpRespMsg delNeedDelList(String companyIds){
+        HttpRespMsg msg = new HttpRespMsg();
+        if (org.apache.commons.lang3.StringUtils.isEmpty(companyIds)){
+            msg.setError("请传递公司的关键信息");
+            return msg;
+        }
+        QueryWrapper<Company> queryWrapper = new QueryWrapper<Company>();
+        String[] strings = companyIds.split(",");
+        List<String> companyIdList = Arrays.asList(strings);
+        queryWrapper.in("id",companyIdList);
+        List<Company> companyList = companyMapper.selectList(queryWrapper);
+        List<Integer> companyIdCollect = companyList.stream().map(Company::getId).collect(Collectors.toList());
+        companySigningMapper.delete(new QueryWrapper<CompanySigning>().in("company_id",companyIdCollect));
+        auditWorkflowTimeSettingMapper.delete(new QueryWrapper<AuditWorkflowTimeSetting>().in("company_id",companyIdCollect));
+        companyCustomerContactMapper.delete(new QueryWrapper<CompanyCustomerContact>().in("company_id",companyIdCollect));
+        companyDingdingMapper.delete(new QueryWrapper<CompanyDingding>().in("company_id",companyIdCollect));
+        companyReportMapper.delete(new QueryWrapper<CompanyReport>().in("company_id",companyIdCollect));
+        customerInfoMapper.delete(new QueryWrapper<CustomerInfo>().in("company_id",companyIdCollect));
+        departmentMapper.delete(new QueryWrapper<Department>().in("company_id",companyIdCollect));
+        operationRecordMapper.delete(new QueryWrapper<OperationRecord>().in("company_id",companyIdCollect));
+        projectMapper.delete(new QueryWrapper<Project>().in("company_id",companyIdCollect));
+        projectCategoryMapper.delete(new QueryWrapper<ProjectCategory>().in("company_id",companyIdCollect));
+        reportMapper.delete(new QueryWrapper<Report>().in("company_id",companyIdCollect));
+
+        sysRoleModuleMapper.deleteNeedToDel(companyIdCollect);
+        sysRoleFunctionMapper.deleteNeedToDel(companyIdCollect);
+        sysRoleMapper.delete(new QueryWrapper<SysRole>().in("company_id",companyIdCollect));
+
+        taskMapper.delete(new QueryWrapper<Task>().in("company_id",companyIdCollect));
+        timeTypeMapper.delete(new QueryWrapper<TimeType>().in("company_id",companyIdCollect));
+        userMapper.delete(new QueryWrapper<User>().in("company_id",companyIdCollect));
+        userCorpwxTimeMapper.delete(new QueryWrapper<UserCorpwxTime>().in("company_id",companyIdCollect));
+        wxCorpInfoMapper.delete(new QueryWrapper<WxCorpInfo>().in("company_id",companyIdCollect));
+
+        feishuInfoService.remove(new QueryWrapper<FeishuInfo>().in("company_id",companyIdCollect));
+        return msg;
+    }
 }
 

+ 4 - 0
fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/mapper/SysRoleFunctionMapper.java

@@ -2,6 +2,7 @@ package com.management.platform.mapper;
 
 import com.management.platform.entity.SysRoleFunction;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
 
@@ -15,4 +16,7 @@ import java.util.List;
  */
 public interface SysRoleFunctionMapper extends BaseMapper<SysRoleFunction> {
     List<SysRoleFunction> getRoleFunctionNames(Integer roleId);
+
+    void deleteNeedToDel(@Param("list") List<Integer> list);
+
 }

+ 4 - 0
fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/mapper/SysRoleModuleMapper.java

@@ -2,6 +2,9 @@ package com.management.platform.mapper;
 
 import com.management.platform.entity.SysRoleModule;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
  * <p>
@@ -13,4 +16,5 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  */
 public interface SysRoleModuleMapper extends BaseMapper<SysRoleModule> {
 
+    void deleteNeedToDel(@Param("list") List<Integer> list);
 }

+ 1 - 1
fhKeeper/formulahousekeeper/ops-platform/src/main/resources/application-dev.yml

@@ -13,7 +13,7 @@ spring:
       max-request-size: 100MB
   datasource:
     driver-class-name: com.mysql.cj.jdbc.Driver
-    url: jdbc:mysql://47.101.180.183:17089/man_dev?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&rewriteBatchedStatements=true&useSSL=false
+    url: jdbc:mysql://1.94.62.58:17089/man_dev?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&rewriteBatchedStatements=true&useSSL=false
     username: root
     password: P011430@Huoshi*
     hikari:

+ 1 - 1
fhKeeper/formulahousekeeper/ops-platform/src/main/resources/application.yml

@@ -14,7 +14,7 @@ spring:
       location: C:/upload/
   datasource:
     driver-class-name: com.mysql.cj.jdbc.Driver
-    url: jdbc:mysql://47.101.180.183:17089/man_dev?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&rewriteBatchedStatements=true
+    url: jdbc:mysql://1.94.62.58:17089/man_dev?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&rewriteBatchedStatements=true
     username: root
     password: P011430@Huoshi*
     hikari:

+ 10 - 0
fhKeeper/formulahousekeeper/ops-platform/src/main/resources/mapper/SysRoleFunctionMapper.xml

@@ -17,6 +17,16 @@
     <sql id="Base_Column_List">
         role_id, function_id
     </sql>
+    <delete id="deleteNeedToDel">
+        DELETE FROM sys_role_function
+        WHERE role_id IN (
+        SELECT sr.id FROM sys_role sr
+        WHERE sr.company_id IN
+        <foreach collection="list" item="item" open="(" close=")" separator=",">
+            #{item}
+        </foreach>
+        )
+    </delete>
 
     <select id="getRoleFunctionNames" resultMap="BaseResultMap1">
         select role_id, function_id, sys_function.name as function_name from sys_role_function

+ 10 - 0
fhKeeper/formulahousekeeper/ops-platform/src/main/resources/mapper/SysRoleModuleMapper.xml

@@ -12,5 +12,15 @@
     <sql id="Base_Column_List">
         role_id, module_id
     </sql>
+    <delete id="deleteNeedToDel">
+        DELETE FROM sys_role_module
+            WHERE role_id IN (
+                SELECT sr.id FROM sys_role sr
+                WHERE sr.company_id IN
+                    <foreach collection="list" item="item" open="(" close=")" separator=",">
+                        #{item}
+                    </foreach>
+                )
+    </delete>
 
 </mapper>