Переглянути джерело

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

zhouyy 1 місяць тому
батько
коміт
24744673c9
39 змінених файлів з 1122 додано та 221 видалено
  1. 21 2
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/pageComponents/tasks/addEditor.vue
  2. 166 30
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/tabbar/home/component/workbench.vue
  3. 2 2
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/tabbar/work/index.vue
  4. 2 3
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/vite.config.js
  5. 23 1
      fhKeeper/formulahousekeeper/customerBuler-crm/src/components/TaskModal/index.vue
  6. 2 2
      fhKeeper/formulahousekeeper/customerBuler-crm/src/components/TaskModal/taskFunction.ts
  7. 15 1
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/biReport/dragEdit/previewTable.vue
  8. 2 0
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/tasks/api.ts
  9. 6 5
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/tasks/index.vue
  10. 58 9
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/tasks/taskCalendar.vue
  11. 32 29
      fhKeeper/formulahousekeeper/customerBuler-crm/src/router/routerGuards.ts
  12. 6 2
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/TaskController.java
  13. 6 7
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/ContractPayment.java
  14. 6 6
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/Task.java
  15. 2 4
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/dto/TaskDto.java
  16. 27 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/vo/DailyTaskVO.java
  17. 27 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/vo/TimeTaskVO.java
  18. 3 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/mapper/TaskMapper.java
  19. 2 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/TaskService.java
  20. 218 29
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/TaskServiceImpl.java
  21. 122 5
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/VisitPlanServiceImpl.java
  22. 12 40
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/task/TimingTask.java
  23. 132 3
      fhKeeper/formulahousekeeper/management-crm/src/main/resources/mapper/TaskMapper.xml
  24. 7 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ExpenseSheetController.java
  25. 2 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectController.java
  26. 10 4
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/ExpenseItem.java
  27. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ExpenseSheetService.java
  28. 54 13
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ExpenseSheetServiceImpl.java
  29. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/application.yml
  30. 6 5
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ExpenseItemMapper.xml
  31. 108 1
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/CompanyController.java
  32. 4 0
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/mapper/SysRoleFunctionMapper.java
  33. 4 0
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/mapper/SysRoleModuleMapper.java
  34. 1 1
      fhKeeper/formulahousekeeper/ops-platform/src/main/resources/application-dev.yml
  35. 1 1
      fhKeeper/formulahousekeeper/ops-platform/src/main/resources/application.yml
  36. 10 0
      fhKeeper/formulahousekeeper/ops-platform/src/main/resources/mapper/SysRoleFunctionMapper.xml
  37. 10 0
      fhKeeper/formulahousekeeper/ops-platform/src/main/resources/mapper/SysRoleModuleMapper.xml
  38. 11 9
      fhKeeper/formulahousekeeper/timesheet/src/views/expense/expense.vue
  39. 0 1
      fhKeeper/formulahousekeeper/timesheet/src/views/team/index.vue

+ 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
 }
 

+ 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) {

+ 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'

+ 6 - 5
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/tasks/index.vue

@@ -240,7 +240,8 @@ 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) // 日历视图
 
 function viewsSwitching() {
 
@@ -254,8 +255,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 +308,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;

+ 58 - 9
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/tasks/taskCalendar.vue

@@ -2,10 +2,10 @@
 
 <template>
   <div class="w-full h-full flex flex-col">
-    <div class="flex-1">
+    <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],
@@ -34,16 +44,55 @@ const calendarOptions = ref<any>({
   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' },
-  ],
+  events: [],
   headerToolbar: {  // 自定义头部
     left: 'today,prev,next',  // 左侧按钮:上一页,下一页,今天
     center: 'title',
     right: 'dayGridMonth,timeGridWeek,timeGridDay'  // 右侧显示视图切换按钮
+  },
+  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
+      }
+    })
   }
+}
+
+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()
 })
 
 </script>

+ 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);
 }

+ 218 - 29
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;
@@ -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

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

@@ -60,8 +60,13 @@ public class ExpenseSheetController {
     @RequestMapping("/add")
     public HttpRespMsg add(ExpenseSheet sheet, String items) {
         String userId = request.getHeader("Token");
-        return expenseSheetService.add(sheet, items, userId);
-
+        try {
+            return expenseSheetService.add(sheet, items, userId);
+        } catch (Exception e) {
+            HttpRespMsg msg = new HttpRespMsg();
+            msg.setError("验证失败:"+e.getMessage());
+            return msg;
+        }
     }
 
     @RequestMapping("/delete")

+ 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")

+ 10 - 4
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/ExpenseItem.java

@@ -15,7 +15,7 @@ import lombok.experimental.Accessors;
  * </p>
  *
  * @author Seyason
- * @since 2023-07-20
+ * @since 2025-03-23
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -99,6 +99,12 @@ public class ExpenseItem extends Model<ExpenseItem> {
     @TableField("status")
     private Integer status;
 
+    /**
+     * 项目经理审核模式下的审核人id
+     */
+    @TableField("auditor_id")
+    private String auditorId;
+
 
     @TableField(exist = false)
     private String projectName;
@@ -106,10 +112,10 @@ public class ExpenseItem extends Model<ExpenseItem> {
     @TableField(exist = false)
     private Integer isIncharger;
 
+//    @TableField(exist = false)
+//    private String projectManagerId;
     @TableField(exist = false)
-    private String projectManagerId;
-    @TableField(exist = false)
-    private String projectManagerName;
+    private String auditorName;
 
     @Override
     protected Serializable pkVal() {

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

@@ -18,7 +18,7 @@ import java.util.List;
  */
 public interface ExpenseSheetService extends IService<ExpenseSheet> {
 
-    HttpRespMsg add(ExpenseSheet sheet, String items, String userId);
+    HttpRespMsg add(ExpenseSheet sheet, String items, String userId) throws Exception;
 
     HttpRespMsg delete(Integer id);
 

+ 54 - 13
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ExpenseSheetServiceImpl.java

@@ -70,6 +70,8 @@ public class ExpenseSheetServiceImpl extends ServiceImpl<ExpenseSheetMapper, Exp
     @Resource
     private ExpenseItemService expenseItemService;
     @Resource
+    private DepartmentMapper departmentMapper;
+    @Resource
     private ExpenseItemMapper expenseItemMapper;
     @Resource
     private ProjectMapper projectMapper;
@@ -108,7 +110,7 @@ public class ExpenseSheetServiceImpl extends ServiceImpl<ExpenseSheetMapper, Exp
 
 
     @Override
-    public HttpRespMsg add(ExpenseSheet sheet, String items, String userId) {
+    public HttpRespMsg add(ExpenseSheet sheet, String items, String userId) throws Exception {
         HttpRespMsg msg = new HttpRespMsg();
         User user = userMapper.selectById(userId);
         ExpenseAuditSetting auditSetting = expenseAuditSettingMapper.selectById(user.getCompanyId());
@@ -318,6 +320,30 @@ public class ExpenseSheetServiceImpl extends ServiceImpl<ExpenseSheetMapper, Exp
                 JSONObject obj = array.getJSONObject(i);
                 ExpenseItem expenseItem = JSONObject.toJavaObject(obj, ExpenseItem.class);
                 expenseItem.setExpenseId(sheet.getId());
+                //按项目经理审核时,非项目是部门负责人审核,需要设置审核人
+                if (auditSetting != null && auditSetting.getAuditType() == 1) {
+                    Project project = projectMapper.selectById(expenseItem.getProjectId());
+                    if (project.getIsPublic() == 0) {
+                        if (project.getInchargerId() == null) {
+                            throw new Exception("请先设置项目【"+project.getProjectName()+"】的项目经理");
+                        } else {
+                            expenseItem.setAuditorId(project.getInchargerId());
+                        }
+                    } else {
+                        //非项目
+                        User owner = userMapper.selectById(sheet.getOwnerId());
+                        if (owner.getDepartmentId() == null) {
+                            throw new Exception("请先设置报销人【"+owner.getName()+"】的部门");
+                        } else {
+                            Department department = departmentMapper.selectById(owner.getDepartmentId());
+                            if (department.getManagerId() == null) {
+                                throw new Exception("请先设置部门【"+department.getDepartmentName()+"】的负责人");
+                            } else {
+                                expenseItem.setAuditorId(department.getManagerId());
+                            }
+                        }
+                    }
+                }
                 itemList.add(expenseItem);
             }
         }
@@ -547,13 +573,9 @@ public class ExpenseSheetServiceImpl extends ServiceImpl<ExpenseSheetMapper, Exp
         } else if(expenseAuditSetting.getAuditType() == 1){
             //增加按项目经理审核模式下,项目经理可以查看相关费用报销单的条件
             if (sheet.getStatus() != null) {
-                //取待审核的
-                //项目经理审核模式下,只能查看自己项目的费用报销单
-                List<Integer> projectIds = projectMapper.selectList(new QueryWrapper<Project>().eq("incharger_id", token)).stream().map(Project::getId).collect(Collectors.toList());
-                System.out.println("项目经理的项目id"+projectIds);
-                if (projectIds.size() > 0) {
-                    List<Integer> expenseIds = expenseItemMapper.selectList(new QueryWrapper<ExpenseItem>().in("project_id", projectIds)).stream().map(ExpenseItem::getExpenseId).distinct().collect(Collectors.toList());
-                    System.out.println("项目经理的项目的费用报销单id"+expenseIds);
+                //项目经理审核模式下,只能查看自己需要审核的单据
+                List<Integer> expenseIds = expenseItemMapper.selectList(new QueryWrapper<ExpenseItem>().eq("auditor_id", token)).stream().map(ExpenseItem::getExpenseId).distinct().collect(Collectors.toList());
+                if (expenseIds.size() > 0) {
                     queryWrapper.in("id", expenseIds);
                 } else {
                     //没有项目的项目经理,不显示任何数据
@@ -724,7 +746,7 @@ public class ExpenseSheetServiceImpl extends ServiceImpl<ExpenseSheetMapper, Exp
         for (ExpenseItem expenseItem : list) {
             for (Project project : Project) {
                 if ((project.getId().equals(expenseItem.getProjectId()))){
-                    if (token.equals(project.getInchargerId())) {
+                    if (token.equals(expenseItem.getAuditorId())) {
                         expenseItem.setIsIncharger(1);
                     } else {
                         expenseItem.setIsIncharger(0);
@@ -732,11 +754,10 @@ public class ExpenseSheetServiceImpl extends ServiceImpl<ExpenseSheetMapper, Exp
                     expenseItem.setProjectName(project.getProjectName());
                     //获取审核人姓名
                     if (!(expenseAuditSetting == null || expenseAuditSetting.getAuditType() == 0)) {
-                        expenseItem.setProjectManagerId(project.getInchargerId());
-                        if (project.getInchargerId() != null) {
-                            User user = userMapper.selectById(project.getInchargerId());
+                        if (expenseItem.getAuditorId() != null) {
+                            User user = userMapper.selectById(expenseItem.getAuditorId());
                             if (user != null) {
-                                expenseItem.setProjectManagerName(user.getName());
+                                expenseItem.setAuditorName(user.getName());
                             }
                         }
                     }
@@ -979,6 +1000,7 @@ public class ExpenseSheetServiceImpl extends ServiceImpl<ExpenseSheetMapper, Exp
                 List<SysRichFunction> functionList = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "费用审核");
                 List<ExpenseMainType> expenseMainTypeList = expenseMainTypeService.list(new QueryWrapper<ExpenseMainType>().eq("company_id", user.getCompanyId()));
                 List<ExpenseType> expenseTypeList = expenseTypeMapper.selectList(new QueryWrapper<ExpenseType>().eq("company_id",user.getCompanyId()));
+                ExpenseAuditSetting expenseAuditSetting = expenseAuditSettingMapper.selectById(user.getCompanyId());
                 //由于第一行需要指明报销人列对应的标题
                 XSSFRow firstRow = sheet.getRow(2);
                 if (firstRow == null) {
@@ -1158,6 +1180,25 @@ public class ExpenseSheetServiceImpl extends ServiceImpl<ExpenseSheetMapper, Exp
                             || (StringUtils.isEmpty(pro.getProjectName())?"":pro.getProjectName()).equals(codeCell.getStringCellValue())).findFirst();
                     if (project.isPresent()) {
                         expenseItem.setProjectId(project.get().getId());
+                        if (expenseAuditSetting != null && expenseAuditSetting.getAuditType() == 1) {
+                            //按项目和非项目分别设置审核人
+                            if (project.get().getIsPublic() == 0) {
+                                expenseItem.setAuditorId(project.get().getInchargerId());
+                            } else {
+                                //非项目,设置部门负责人为审核人
+                                User user1 = userList.stream().filter(us -> us.getId().equals(user.getId())).findFirst().get();
+                                if (user1.getDepartmentId() == null) {
+                                    throw new Exception("当前用户没有部门信息");
+                                } else {
+                                    Department dept = departmentMapper.selectById(user1.getDepartmentId());
+                                    if (dept.getManagerId() == null) {
+                                        throw new Exception("当前用户所在部门没有负责人");
+                                    } else {
+                                        expenseItem.setAuditorId(dept.getManagerId());
+                                    }
+                                }
+                            }
+                        }
                     }
                     expenseItem.setExpenseId(expenseSheet.getId());
                     if(happenDateCell!=null && !happenDateCell.toString().trim().equals("")){

+ 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

+ 6 - 5
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ExpenseItemMapper.xml

@@ -17,6 +17,7 @@
         <result column="expense_type" property="expenseType" />
         <result column="pic" property="pic" />
         <result column="status" property="status" />
+        <result column="auditor_id" property="auditorId" />
     </resultMap>
     <resultMap id="UserBaseResultMap" type="com.management.platform.entity.vo.ExpenseItemVO">
         <id column="id" property="id" />
@@ -40,15 +41,15 @@
     </resultMap>
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        id, expense_id, project_id, happen_date, invoice_type, invoice_no, tax_percent, tax_value, amount, remark, expense_type, pic, status
+        id, expense_id, project_id, happen_date, invoice_type, invoice_no, tax_percent, tax_value, amount, remark, expense_type, pic, status, auditor_id
     </sql>
     <select id="getUserExpenseDetail" resultMap="UserBaseResultMap">
         select a.id, a.expense_id, a.project_id, a.happen_date, a.invoice_type, a.tax_percent, a.tax_value, a.amount, a.remark, a.expense_type, a.pic,a.status,
-        user.name as username,user.corpwx_userid as corpwxUserId, department.department_name,department.corpwx_deptid as corpwxDeptId,department.dd_deptid as corpDdDeptId
+               user.name as username,user.corpwx_userid as corpwxUserId, department.department_name,department.corpwx_deptid as corpwxDeptId,department.dd_deptid as corpDdDeptId
         from expense_item a
-        left join expense_sheet b on a.expense_id = b.id
-        left join user on user.id = b.owner_id
-        left join department on department.department_id = user.department_id
+                 left join expense_sheet b on a.expense_id = b.id
+                 left join user on user.id = b.owner_id
+                 left join department on department.department_id = user.department_id
         where a.project_id = #{projectId}  and b.status=0  order by a.happen_date desc
     </select>
 

+ 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>

+ 11 - 9
fhKeeper/formulahousekeeper/timesheet/src/views/expense/expense.vue

@@ -469,7 +469,8 @@
               <template slot-scope="scope">
                 <span v-if="scope.row.status == 1" class="waiting">{{ statusTxt[scope.row.status] }}</span>
                 <span v-if="scope.row.status == 2" class="rejected">{{ statusTxt[scope.row.status] }}</span>
-                <span v-if="scope.row.status == 0 || scope.row.status == 3">{{ statusTxt[scope.row.status] }}</span>
+                <span v-if="scope.row.status == 0" class="pass">{{ statusTxt[scope.row.status] }}</span>
+                <span v-if="scope.row.status == 3">{{ statusTxt[scope.row.status] }}</span>
                 <span v-if="scope.row.status == 4" style="color: red">{{ statusTxt[scope.row.status] }}</span>
               </template>
             </el-table-column>
@@ -661,15 +662,16 @@
             <template slot-scope="scope">
               <span v-if="scope.row.status == 1" class="waiting">{{ statusTxt[scope.row.status] }}</span>
               <span v-if="scope.row.status == 2" class="rejected">{{ statusTxt[scope.row.status] }}</span>
-              <span v-if="scope.row.status == 0 || scope.row.status == 3">{{ statusTxt[scope.row.status] }}</span>
+              <span v-if="scope.row.status == 0" class="pass">{{ statusTxt[scope.row.status] }}</span>
+              <span v-if="scope.row.status == 3">{{ statusTxt[scope.row.status] }}</span>
             </template>
           </el-table-column>
           <el-table-column v-if="auditTypeItem.auditType == 1" width="172" :label="$t('other.reviewer')">
             <template slot-scope="scope">
               <span v-if="user.userNameNeedTranslate == 1">
-                <TranslationOpenDataText type='userName' :openid='scope.row.projectManagerName'></TranslationOpenDataText>
+                <TranslationOpenDataText type='userName' :openid='scope.row.auditorName'></TranslationOpenDataText>
               </span>
-              <span v-else>{{ scope.row.projectManagerName }}</span>
+              <span v-else>{{ scope.row.auditorName }}</span>
             </template>
           </el-table-column>
           <el-table-column prop="projectId" :label="$t('other.project')" width="155">
@@ -1132,7 +1134,8 @@
               <span class="detail-item-content">
                 <span v-if="item.status == 1" class="waiting">{{ statusTxt[item.status] }}</span>
                 <span v-if="item.status == 2" class="rejected">{{ statusTxt[item.status] }}</span>
-                <span v-if="item.status == 0 || item.status == 3">{{ statusTxt[item.status] }}</span>
+                <span v-if="item.status == 0" class="pass">{{ statusTxt[item.status] }}</span>
+                <span v-if="item.status == 3">{{ statusTxt[item.status] }}</span>
               </span>
             </div>
             <div class="detail-item">
@@ -2466,20 +2469,16 @@ export default {
       }, 0)
     },
     zhi(e) {
-      // console.log('看看值', e)
       var i = e
       if (this.invoiceList[i].amount == null || this.invoiceList[i].amount == 'null' || this.invoiceList[i].taxPercent == null || this.invoiceList[i].taxPercent == 'null') {
         return
       }
       this.invoiceList[i].taxValue = this.invoiceList[i].amount * this.invoiceList[i].taxPercent / 100
-      // console.log(this.invoiceList[i].amount, this.invoiceList[i].taxPercent)
       var shui = this.invoiceList[i].taxPercent / 100 // 税率
       var zhi = this.invoiceList[i].amount / (1 + shui) * shui
       this.invoiceList[i].taxValue = zhi.toFixed(2)
     },
     zhiNum(i, val) {
-      // console.log('看看值', i, val)
-      // console.log(this.ParticularsList.invoiceList)
       if (this.ParticularsList.invoiceList[i].amount == null || this.ParticularsList.invoiceList[i].amount == 'null' || this.ParticularsList.invoiceList[i].taxPercent == null || this.ParticularsList.invoiceList[i].taxPercent == 'null') {
         return
       }
@@ -3151,6 +3150,9 @@ export default {
 .rejected {
   color: red;
 }
+.pass {
+  color:green;
+}
 
 .newInvoice {
   position: absolute;

+ 0 - 1
fhKeeper/formulahousekeeper/timesheet/src/views/team/index.vue

@@ -3342,7 +3342,6 @@ export default {
           };
           that.depTitle = this.$t('addsubdepartment');
         } else {
-          console.log(that.depData, '看看值')
           if (that.depData.managerId == "null") {
             that.depData.managerId = "";
           }