فهرست منبع

Merge remote-tracking branch 'origin/master'

yusm 4 هفته پیش
والد
کامیت
a863987cd7
25فایلهای تغییر یافته به همراه1853 افزوده شده و 9764 حذف شده
  1. 1313 9653
      fhKeeper/formulahousekeeper/course-manager/courseManager.log
  2. 12 1
      fhKeeper/formulahousekeeper/course-pc/src/views/coursemanagement/list.vue
  3. 2 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/constant/Constant.java
  4. 29 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/FinanceMonthlyWorktimeController.java
  5. 33 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportController.java
  6. 2 71
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/TaskGroupController.java
  7. 11 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/FinanceMonthlyWorktime.java
  8. 8 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/Report.java
  9. 7 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/TimeType.java
  10. 6 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ReportMapper.java
  11. 9 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/FinanceMonthlyWorktimeService.java
  12. 2 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/TaskGroupService.java
  13. 4 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/DepartmentServiceImpl.java
  14. 269 8
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/FinanceMonthlyWorktimeServiceImpl.java
  15. 4 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java
  16. 38 5
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java
  17. 55 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/TaskGroupServiceImpl.java
  18. 3 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/WxCorpInfoServiceImpl.java
  19. 2 2
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/FmwDetailMapper.xml
  20. 27 3
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ReportMapper.xml
  21. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/TaskFilesMapper.xml
  22. 2 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/TimeTypeMapper.xml
  23. 1 1
      fhKeeper/formulahousekeeper/ops-platform/src/main/resources/application.yml
  24. 13 13
      fhKeeper/formulahousekeeper/timesheet/src/views/settings/timetype.vue
  25. BIN
      fhKeeper/formulahousekeeper/webttkuaiban/src/main/resources/static/image/customerNew/demand.jpg

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 1313 - 9653
fhKeeper/formulahousekeeper/course-manager/courseManager.log


+ 12 - 1
fhKeeper/formulahousekeeper/course-pc/src/views/coursemanagement/list.vue

@@ -77,7 +77,7 @@
             ></el-pagination>
         </el-col>
         <!-- 新增/编辑课程 -->
-        <el-dialog :visible.sync="addDialogVisible" :title="newCourse.id ? '编辑课程' : '添加课程'" width="900px" :close-on-click-modal="false">
+        <el-dialog :visible.sync="addDialogVisible" :title="newCourse.id ? '编辑课程' : '添加课程'" width="900px" :close-on-click-modal="false" @close="stopCourseVideo">
             <el-form :model="newCourse" ref="newCourseForm" label-width="100px" :rules="courseRules">
                 <el-form-item label="课程分类" prop="categoryValue">
                     <el-select v-model="newCourse.categoryValue" placeholder="请选择" style="width: 100%">
@@ -165,6 +165,7 @@
                         <video 
                             controls
                             width="300"
+                            ref="courseVideoPlayer"
                             :src="newCourse.courseUrl"
                             style="margin-top: 10px; max-width: 100%">
                             您的浏览器不支持视频播放
@@ -455,6 +456,16 @@ export default {
             this.videoDialogVisible = false;
         },
         
+        // 停止课程视频播放
+        stopCourseVideo() {
+            if (this.$refs.courseVideoPlayer) {
+                const videoElement = this.$refs.courseVideoPlayer;
+                videoElement.pause();
+                videoElement.currentTime = 0;
+                // 不清除视频源,只暂停播放
+            }
+        },
+        
         // 删除视频
         deleteVideo() {
             this.$confirm('确认删除该视频?', '提示', {

+ 2 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/constant/Constant.java

@@ -61,4 +61,6 @@ public class Constant {
     
     public static final int ZHE_ZHONG_COMPANY_ID=4811;
     public static final int MLD_COMPANY_ID=876;
+    //泓浒
+    public static final int HONG_HU_COMPANY_ID=7536;
 }

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

@@ -1,6 +1,7 @@
 package com.management.platform.controller;
 
 
+import com.management.platform.entity.FmwDetail;
 import com.management.platform.service.FinanceMonthlyWorktimeService;
 import com.management.platform.util.HttpRespMsg;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -26,9 +27,35 @@ public class FinanceMonthlyWorktimeController {
     private FinanceMonthlyWorktimeService financeMonthlyWorktimeService;
 
     @RequestMapping("/send")
-    public HttpRespMsg send(@RequestParam("fmwId")String fmwId, @RequestParam("timesheetDate") String timesheetDate, HttpServletRequest request) {
-        return financeMonthlyWorktimeService.send(fmwId,timesheetDate,request);
+    public HttpRespMsg send(@RequestParam("id")String id, @RequestParam("timesheetDate") String timesheetDate, HttpServletRequest request) {
+        return financeMonthlyWorktimeService.send(id,timesheetDate,request);
     }
 
+    @RequestMapping("/getByMonth")
+    public HttpRespMsg getByMonth(Integer companyId, String ymonth, @RequestParam(required = false, defaultValue = "0" ) Integer reGenerate,HttpServletRequest request) {
+        try {
+            return financeMonthlyWorktimeService.getByMonth(companyId, ymonth,reGenerate, request);
+        } catch (Exception e) {
+            e.printStackTrace();
+            HttpRespMsg msg = new HttpRespMsg();
+            msg.setError(e.getMessage());
+            return msg;
+        }
+    }
+
+    @RequestMapping("/setTimesheetDate")
+    public HttpRespMsg setTimesheetDate(Integer id, String timesheetDate, HttpServletRequest request) {
+        return financeMonthlyWorktimeService.setTimesheetDate(id, timesheetDate,request);
+    }
+
+    @RequestMapping("/changeWorktime")
+    public HttpRespMsg changeWorktime(FmwDetail detail, HttpServletRequest request) {
+        return financeMonthlyWorktimeService.changeWorktime(detail,request);
+    }
+
+    @RequestMapping("/setStatusFinal")
+    public HttpRespMsg setStatusFinal(Integer id, HttpServletRequest request) {
+        return financeMonthlyWorktimeService.setStatusFinal(id,request);
+    }
 }
 

+ 33 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportController.java

@@ -54,6 +54,8 @@ public class ReportController {
     @Autowired
     private ReportService reportService;
     @Resource
+    private ErpOrderInfoMapper erpOrderInfoMapper;
+    @Resource
     private ProjectBasecostSettingMapper projectBasecostSettingMapper;
     @Resource
     private TimeAutoExcludeMapper timeAutoExcludeMapper;
@@ -1550,6 +1552,37 @@ public class ReportController {
 
             }
         }
+        //针对泓浒(苏州),需要按照工单号的部门来设置工时所属部门,同时设置是否是协作工时
+        if (Constant.HONG_HU_COMPANY_ID == company.getId()) {
+            List<String> collect = reportList.stream().map(Report::getExtraField4).collect(Collectors.toList());
+            List<ErpOrderInfo> orderList = erpOrderInfoMapper.selectList(new QueryWrapper<ErpOrderInfo>().in("order_id", collect));
+            for (Report report : reportList) {
+                String errorMsg = null;
+                Optional<ErpOrderInfo> first = orderList.stream().filter(order -> order.getOrderId().equals(report.getExtraField4())).findFirst();
+                if (first.isPresent()) {
+                    if (first.get().getDeptId() == null) {
+                        errorMsg = "工单号:"+report.getExtraField4()+"无部门id";
+                    } else {
+                        Department deptItem = departmentMapper.selectOne(new QueryWrapper<Department>().eq("dept_code", first.get().getDeptId()));
+                        if (deptItem != null) {
+                            if (!deptItem.getDepartmentId().equals(report.getDeptId())) {
+                                report.setDeptId(deptItem.getDepartmentId());
+                                report.setIsAssist(true);
+                            }
+                        } else {
+                            errorMsg = "工时系统中尚未给部门:"+first.get().getDeptName()+"设置部门编号";
+                        }
+                    }
+                } else {
+                    errorMsg = "erpOrderInfo表中工单号不存在:"+report.getExtraField4();
+                }
+                if (errorMsg != null) {
+                    HttpRespMsg httpRespMsg = new HttpRespMsg();
+                    httpRespMsg.setError(errorMsg);
+                    return httpRespMsg;
+                }
+            }
+        }
 
         //项目所属bu审核
         if(comTimeType.getReportAuditType() == 4){

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

@@ -352,77 +352,8 @@ public class TaskGroupController {
             //创建随项目创建而创建的模板
             QueryWrapper<User> eq = new QueryWrapper<User>().eq("id", request.getHeader("token"));
             User user = userMapper.selectOne(eq);
-            List<GroupTemplate> groupTemplates = GroupTemplateMapper.selectList(new QueryWrapper<GroupTemplate>().eq("company_id", user.getCompanyId()).eq("cre_with_pro", true));
-            if (groupTemplates.size()==0){
-                //创建默认分组
-                TaskGroup group = new TaskGroup();
-                group.setProjectId(item.getProjectId());
-                //group.setName("项目阶段");
-                group.setName(MessageUtils.message("entry.projectStage"));
-                taskGroupService.save(group);
-            }else{
-                for (GroupTemplate groupTemplate : groupTemplates) {
-                    TaskGroup group = new TaskGroup();
-                    group.setProjectId(item.getProjectId());
-                    group.setName(groupTemplate.getName());
-                    taskGroupService.save(group);
-                    //从模板创建任务列表
-                    Project project = projectMapper.selectById(item.getProjectId());
-                    String inchargerId = project.getInchargerId();
-                    User inchargerUser = userMapper.selectById(inchargerId);
-                    List<GroupTmpstages> stages = groupTmpstagesMapper.selectList(new QueryWrapper<GroupTmpstages>().eq("template_id", groupTemplate.getId()));
-                    List<Stages> batchList = new ArrayList<>();
-                    stages.forEach(s->{
-                        Stages stageItem = new Stages();
-                        stageItem.setGroupId(group.getId());
-                        stageItem.setStagesName(s.getStagesName());
-                        stageItem.setSequence(s.getSequence());
-                        stageItem.setProjectId(item.getProjectId());
-                        batchList.add(stageItem);
-                    });
-                    stagesService.saveBatch(batchList);
-                    //阶段的任务,里程碑,风险
-                    List<GtemplateTask> gtemplateTaskList = gtemplateTaskMapper.selectList(
-                            new QueryWrapper<GtemplateTask>().eq("gtemplate_id", groupTemplate.getId())
-                                    .orderByAsc("seq"));
-                    if (gtemplateTaskList.size() > 0) {
-                        List<Task> taskList = new ArrayList<>();
-//                        List<TaskExecutor> taskExecutorList = new ArrayList<>();
-                        gtemplateTaskList.forEach(gt->{
-                            Task task = gt.toTask();
-                            task.setProjectId(item.getProjectId());
-                            task.setGroupId(group.getId());
-                            String sName = stages.stream().filter(s->s.getId().equals(gt.getTstagesId())).findFirst().get().getStagesName();
-                            Integer realStageId = batchList.stream().filter(bat->bat.getStagesName().equals(sName)).findFirst().get().getId();
-                            task.setStagesId(realStageId);
-                            task.setCreaterId(user.getId());
-                            task.setCreaterName(user.getName());
-                            task.setCreatorColor(user.getColor());
-//                            if(task.getTaskType()==1 && inchargerUser != null){
-//                                task.setExecutorId(inchargerUser.getId());
-//                                task.setExecutorName(inchargerUser.getName());
-//                                task.setExecutorColor(inchargerUser.getColor());
-//                            }
-
-                            taskList.add(task);
-                        });
-                        taskService.saveBatch(taskList);
-//                        taskList.forEach(tl->{
-//                            TaskExecutor taskExecutor=new TaskExecutor();
-//                            //当为里程碑任务时
-//                            if(tl.getTaskType()==1 && inchargerUser != null){
-//                                taskExecutor.setTaskId(tl.getId());
-//                                taskExecutor.setExecutorId(inchargerUser.getId());
-//                                taskExecutor.setExecutorName(inchargerUser.getName());
-//                                taskExecutor.setExecutorColor(inchargerUser.getColor());
-//                                taskExecutor.setProjectId(item.getProjectId());
-//                                taskExecutorList.add(taskExecutor);
-//                            }
-//                        });
-//                        taskExecutorService.saveBatch(taskExecutorList);
-                    }
-                }
-            }
+            //初始化任务分组
+            taskGroupService.initGroup(companyId, item.getProjectId(), user);
         }
         List<TaskGroup> list = taskGroupService.list(queryWrapper);
         list.forEach(l->{

+ 11 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/FinanceMonthlyWorktime.java

@@ -7,9 +7,15 @@ import com.baomidou.mybatisplus.annotation.TableId;
 import java.time.LocalDateTime;
 import com.baomidou.mybatisplus.annotation.TableField;
 import java.io.Serializable;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.ArrayList;
+import java.util.List;
 
 /**
  * <p>
@@ -68,10 +74,15 @@ public class FinanceMonthlyWorktime extends Model<FinanceMonthlyWorktime> {
     /**
      * 工单结算日期
      */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
     @TableField("timesheet_date")
     private LocalDate timesheetDate;
 
 
+    @TableField(exist = false)
+    List<FmwDetail> detailList = new ArrayList<>();
+
     @Override
     protected Serializable pkVal() {
         return this.id;

+ 8 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/Report.java

@@ -24,7 +24,7 @@ import org.springframework.format.annotation.DateTimeFormat;
  * </p>
  *
  * @author Seyason
- * @since 2025-04-13
+ * @since 2025-04-18
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -442,6 +442,13 @@ public class Report extends Model<Report> {
     private String extraField5;
 
 
+    /**
+     * 是否是其他部门协作工时
+     */
+    @TableField("is_assist")
+    private Boolean isAssist;
+
+
     @Override
     protected Serializable pkVal() {
         return this.id;

+ 7 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/TimeType.java

@@ -17,7 +17,7 @@ import lombok.experimental.Accessors;
  * </p>
  *
  * @author Seyason
- * @since 2025-04-14
+ * @since 2025-04-20
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -674,6 +674,12 @@ public class TimeType extends Model<TimeType> {
     @TableField("alert_audit_mode")
     private Integer alertAuditMode;
 
+    /**
+     * 部门负责人接收抄送提醒
+     */
+    @TableField("cc_dept_manager")
+    private Boolean ccDeptManager;
+
 
     @TableField(exist = false)
     private List<User> userList;

+ 6 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ReportMapper.java

@@ -257,4 +257,10 @@ public interface ReportMapper extends BaseMapper<Report> {
     List<UserRestTimeVO> getCompanyUserOverTimeHours(@Param("companyId") Integer companyId,@Param("userId") String userId);
 
     List<TisTimeVO> getTisTimeByDate(@Param("companyId") Integer companyId,@Param("date") String dateStr);
+
+    List<Report> getReportProjectGroupDetailList(@Param("companyId") Integer companyId,@Param("startDate") LocalDate startDate, @Param("endDate") LocalDate endDate, @Param("groupNameList") List<String> groupNameList);
+
+    List<Report> getReportProjectAssistTime(@Param("companyId") Integer companyId,@Param("startDate") LocalDate startDate, @Param("endDate") LocalDate endDate, @Param("groupNameList") List<String> groupNameList);
+
+
 }

+ 9 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/FinanceMonthlyWorktimeService.java

@@ -2,6 +2,7 @@ package com.management.platform.service;
 
 import com.management.platform.entity.FinanceMonthlyWorktime;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.management.platform.entity.FmwDetail;
 import com.management.platform.util.HttpRespMsg;
 
 import javax.servlet.http.HttpServletRequest;
@@ -17,4 +18,12 @@ import javax.servlet.http.HttpServletRequest;
 public interface FinanceMonthlyWorktimeService extends IService<FinanceMonthlyWorktime> {
 
     HttpRespMsg send(String fmwId, String timesheetDate, HttpServletRequest request);
+
+    HttpRespMsg getByMonth(Integer companyId, String ymonth, Integer reGenerate, HttpServletRequest request) throws Exception;
+
+    HttpRespMsg setTimesheetDate(Integer id, String timesheetDate, HttpServletRequest request);
+
+    HttpRespMsg changeWorktime(FmwDetail detail, HttpServletRequest request);
+
+    HttpRespMsg setStatusFinal(Integer id, HttpServletRequest request);
 }

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

@@ -22,4 +22,6 @@ public interface TaskGroupService extends IService<TaskGroup> {
     void saveGroupIncharger(TaskGroup taskGroup, User user);
 
     HttpRespMsg createFromTemplate(String templateJson, Integer projectId,String projectIds);
+
+    void initGroup(Integer companyId,Integer projectId, User user);
 }

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

@@ -259,6 +259,10 @@ public class DepartmentServiceImpl extends ServiceImpl<DepartmentMapper, Departm
                 //修改任务文件审核人
                 List<Integer> taskFileIds = taskFilesMapper.getTaskFilesByCreatorDeptId(departmentId);
                 if(CollectionUtils.isNotEmpty(taskFileIds)){
+                    System.out.println("managerId="+managerId);
+                    taskFileIds.forEach(id->{
+                        System.out.println(id);
+                    });
                     taskFilesMapper.update(null,new LambdaUpdateWrapper<TaskFiles>()
                             .set(TaskFiles::getChargeOneId,managerId)
                             .in(TaskFiles::getId,taskFileIds)

+ 269 - 8
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/FinanceMonthlyWorktimeServiceImpl.java

@@ -1,19 +1,21 @@
 package com.management.platform.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.management.platform.entity.FinanceMonthlyWorktime;
-import com.management.platform.entity.User;
+import com.management.platform.entity.*;
 import com.management.platform.entity.vo.TisTimeVO;
-import com.management.platform.mapper.FinanceMonthlyWorktimeMapper;
-import com.management.platform.mapper.FmwDetailMapper;
-import com.management.platform.mapper.UserMapper;
+import com.management.platform.mapper.*;
 import com.management.platform.service.FinanceMonthlyWorktimeService;
+import com.management.platform.service.FmwDetailService;
 import com.management.platform.task.DataCollectTask;
 import com.management.platform.util.HttpRespMsg;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.core.ParameterizedTypeReference;
 import org.springframework.http.*;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 import org.springframework.web.client.RestTemplate;
 
@@ -21,10 +23,10 @@ import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import java.time.LocalDate;
 import java.time.format.DateTimeFormatter;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.stream.Collectors;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
 
 /**
  * <p>
@@ -45,6 +47,19 @@ public class FinanceMonthlyWorktimeServiceImpl extends ServiceImpl<FinanceMonthl
 
     @Resource
     private UserMapper userMapper;
+    @Resource
+    private ReportMapper reportMapper;
+    @Resource
+    private DepartmentMapper departmentMapper;
+    @Resource
+    private TaskGroupMapper taskGroupMapper;
+    @Autowired
+    private ProjectMapper projectMapper;
+    @Autowired
+    private FmwDetailService fmwDetailService;
+    @Resource
+    private ErpOrderInfoMapper erpOrderInfoMapper;
+
     @Override
     public HttpRespMsg send(String fmwId, String timesheetDate, HttpServletRequest request) {
         HttpRespMsg httpRespMsg = new HttpRespMsg();
@@ -104,4 +119,250 @@ public class FinanceMonthlyWorktimeServiceImpl extends ServiceImpl<FinanceMonthl
 
         return httpRespMsg;
     }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public HttpRespMsg getByMonth(Integer companyId, String ymonth, Integer reGenerate, HttpServletRequest request) throws Exception {
+        //获取该月份的数据,如果没有自动生成
+        String token = request.getHeader("token");
+        User user = userMapper.selectById(token);
+        FinanceMonthlyWorktime financeMonthlyWorktime = financeMonthlyWorktimeMapper.selectOne(new LambdaQueryWrapper<FinanceMonthlyWorktime>().eq(FinanceMonthlyWorktime::getCompanyId, companyId).eq(FinanceMonthlyWorktime::getYmonth, ymonth));
+        Integer detailCount = 0;
+        if (financeMonthlyWorktime != null) {
+            if (reGenerate== 1) {
+                //删除明细数据
+                fmwDetailMapper.delete(new LambdaQueryWrapper<FmwDetail>().eq(FmwDetail::getFmwId, financeMonthlyWorktime.getId()));
+            } else {
+                detailCount = fmwDetailMapper.selectCount(new QueryWrapper<FmwDetail>().eq("fmw_id", financeMonthlyWorktime.getId()));
+            }
+        }
+        if(null == financeMonthlyWorktime || detailCount == 0){
+            if (null == financeMonthlyWorktime) {
+                //生成数据
+                financeMonthlyWorktime = new FinanceMonthlyWorktime();
+                financeMonthlyWorktime.setCompanyId(companyId);
+                financeMonthlyWorktime.setYmonth(ymonth);
+                financeMonthlyWorktime.setStatus(0);
+                //数据日期就是当前日期
+                financeMonthlyWorktime.setTimesheetDate(LocalDate.now());
+                financeMonthlyWorktime.setUserId(user.getId());
+                financeMonthlyWorktimeMapper.insert(financeMonthlyWorktime);
+            } else {
+                //更新数据日期为当前日期
+                financeMonthlyWorktime.setTimesheetDate(LocalDate.now());
+                financeMonthlyWorktime.setUserId(user.getId());
+                financeMonthlyWorktimeMapper.updateById(financeMonthlyWorktime);
+            }
+            //生成明细数据
+            //获取当月的第一天和最后一天
+            LocalDate firstDayOfMonth = LocalDate.parse(ymonth + "-01", DateTimeFormatter.ofPattern("yyyy-MM-dd"));
+            LocalDate lastDayOfMonth = firstDayOfMonth.withDayOfMonth(firstDayOfMonth.lengthOfMonth());
+            //查询日报数据
+            List<Department> departmentList = departmentMapper.selectList(new LambdaQueryWrapper<Department>().eq(Department::getCompanyId, user.getCompanyId()));
+            List<Project> projectList = projectMapper.selectList(new LambdaQueryWrapper<Project>().eq(Project::getCompanyId, user.getCompanyId()));
+            List<Project> publicProjectList = projectList.stream().filter(p -> p.getIsPublic() == 1).collect(Collectors.toList());
+            List<ErpOrderInfo> erpOrderInfoList = erpOrderInfoMapper.selectList(new LambdaQueryWrapper<ErpOrderInfo>());
+            List<User> userList = userMapper.selectList(new LambdaQueryWrapper<User>().select(User::getId, User::getName, User::getDepartmentId).eq(User::getCompanyId, user.getCompanyId()));
+            List<String> groupNameList = new ArrayList<>();
+            groupNameList.add("组装/维修工时");
+            groupNameList.add("调试工时");
+            groupNameList.add("等料工时");
+            List<Report> reportList = reportMapper.getReportProjectGroupDetailList(user.getCompanyId(), firstDayOfMonth, lastDayOfMonth, groupNameList);
+            List<Report> assistList = reportMapper.getReportProjectAssistTime(user.getCompanyId(), firstDayOfMonth, lastDayOfMonth, groupNameList);
+
+            System.out.println("reportSize==="+reportList.size());
+            List<FmwDetail> insertDataList = new ArrayList<>();
+            for (Report report : reportList) {
+                //在insertDataList中按照projectId, extraField4,extraField5进行匹配查找,有的话取出来,没有的话插入
+                Optional<FmwDetail> optional = insertDataList.stream().filter(f -> f.getProjectId().equals(report.getProjectId()) && f.getExtraField4().equals(report.getExtraField4()) && f.getExtraField5().equals(report.getExtraField5())).findFirst();
+                if (optional.isPresent()) {
+                    FmwDetail fmwDetail = optional.get();
+                    setFmwTime(fmwDetail, report);
+                } else {
+                    FmwDetail fmwDetail = new FmwDetail();
+                    fmwDetail.setMaintanceTime(0.0);
+                    fmwDetail.setDebugTime(0.0);
+                    fmwDetail.setWaitingTime(0.0);
+                    fmwDetail.setAssistTime(0.0);
+
+                    fmwDetail.setFmwId(financeMonthlyWorktime.getId());
+                    fmwDetail.setProjectId(report.getProjectId());
+                    projectList.stream().filter(p->p.getId().equals(report.getProjectId())).findFirst().ifPresent(project -> {
+                        fmwDetail.setProjectCode(project.getProjectCode());
+                    });
+                    fmwDetail.setExtraField4(report.getExtraField4());
+                    fmwDetail.setExtraField5(report.getExtraField5());
+                    fmwDetail.setDeptId(report.getDeptId());
+                    departmentList.stream().filter(d->d.getDepartmentId().equals(report.getDeptId())).findFirst().ifPresent(d->{
+                        fmwDetail.setDeptCode(d.getDeptCode());
+                        fmwDetail.setDeptName(d.getDepartmentName());
+                        //为提高可读性,从erpOrderInfo表中获取部门名称
+                        erpOrderInfoList.stream().filter(e->e.getDeptId().equals(d.getDeptCode())).findFirst().ifPresent(e->{
+                            fmwDetail.setDeptName(e.getDeptName());
+                        });
+                    });
+                    setFmwTime(fmwDetail, report);
+                    //从assistList中获取协作工时
+                    Optional<Report> assistItemOp = assistList.stream().filter(f -> f.getProjectId().equals(report.getProjectId()) && f.getExtraField4().equals(report.getExtraField4()) && f.getExtraField5().equals(report.getExtraField5())).findFirst();
+                    if (assistItemOp.isPresent()) {
+                        fmwDetail.setAssistTime(assistItemOp.get().getWorkingTime());
+                    }
+                    insertDataList.add(fmwDetail);
+                }
+            }
+            System.out.println("插入数据大小=="+insertDataList.size());
+
+            // 处理公共项目工时分摊
+            List<Integer> publicProjectIds = publicProjectList.stream()
+                    .map(Project::getId)
+                    .collect(Collectors.toList());
+
+            if (!publicProjectIds.isEmpty()) {
+                // 查询公共项目工时
+                //TODO: 需确认,员工填报公共项目工时的时候,会选择到工单吗?
+                List<Report> publicReportList = reportMapper.selectList(
+                        new LambdaQueryWrapper<Report>().select(Report::getCreatorId, Report::getDeptId, Report::getWorkingTime).eq(Report::getState, 1)
+                                .in(Report::getProjectId, publicProjectIds).between(Report::getCreateDate, firstDayOfMonth, lastDayOfMonth));
+                //按照人员所在的部门进行分组,汇总,如果公共项目没有工单,此步骤可以省略
+                publicReportList.forEach(report -> {
+                    User reportOwner = userList.stream().filter(u -> u.getId().equals(report.getCreatorId())).findFirst().orElse(null);
+                    if (reportOwner != null) {
+                        report.setDeptId(reportOwner.getDepartmentId());
+                    }
+                });
+                //分组,合计部门公共工时
+                Map<Integer, Double> map = publicReportList.stream().collect(Collectors.groupingBy(Report::getDeptId, Collectors.summingDouble(Report::getWorkingTime)));
+                //将map按照List形式重新组合
+                publicReportList = map.entrySet().stream()
+                        .map(e -> {
+                            Report report = new Report();
+                            report.setDeptId(e.getKey());
+                            report.setWorkingTime(e.getValue());
+                            return report;
+                        })
+                        .collect(Collectors.toList());
+                if (!publicReportList.isEmpty()) {
+                    //处理每个部门的公共项目工时分摊
+                    for (Report publicReportDeptItem : publicReportList) {
+                        Integer deptId = publicReportDeptItem.getDeptId();
+                        List<FmwDetail> deptAllReportList = insertDataList.stream().filter(r -> r.getDeptId().equals(deptId)).collect(Collectors.toList());
+                        double totalDeptTime = deptAllReportList.stream().reduce(0.0, (a, b) -> a + b.getMaintanceTime() + b.getDebugTime() + b.getWaitingTime(), Double::sum);
+                        System.out.println("处理公共工时分摊,总工时=="+totalDeptTime);
+                        if (totalDeptTime > 0) {
+                            //计算总工时: 用维修组装工时,调试工时和等料工时相加
+                            insertDataList.forEach(fmwDetail -> {
+                                //计算每一个项目的部门内部工时占比,按比例分摊公共工时
+                                if (fmwDetail.getDeptId().equals(deptId)) {
+                                    double curProjectTime = fmwDetail.getMaintanceTime() + fmwDetail.getDebugTime() + fmwDetail.getWaitingTime();
+                                    double assignTime = curProjectTime / totalDeptTime * publicReportDeptItem.getWorkingTime();
+                                    //理论上不会出现fmwDetail.getPublicTime()有值的情况,但是为了保险起见做个叠加计算吧
+                                    fmwDetail.setPublicTime(fmwDetail.getPublicTime() == null ? assignTime : fmwDetail.getPublicTime() + assignTime);
+                                }
+                            });
+                        } else {
+                            //该部门没有部门内部工时,按照填报部门找协作工时
+                            // 查找该部门的员工都协作了哪些部门
+                            List<User> deptUserList = userList.stream().filter(u -> u.getDepartmentId().equals(deptId)).collect(Collectors.toList());
+                            List<String> deptUserIds = deptUserList.stream().map(User::getId).collect(Collectors.toList());
+                            List<Report> assistDeptListByUser = reportMapper.selectList(new QueryWrapper<Report>().select("dept_id, sum(working_time) working_time").eq("is_assist", 1)
+                                    .in("creator_id", deptUserIds).between("create_date", firstDayOfMonth, lastDayOfMonth).groupBy("dept_id"));
+                            //按协作的工时占比来分配
+                            if (!assistDeptListByUser.isEmpty()) {
+                                double totalAssistTime = assistDeptListByUser.stream().mapToDouble(Report::getWorkingTime).sum();
+                                if (totalAssistTime > 0) {
+                                    for (Report assistDeptItem : assistDeptListByUser) {
+                                        //处理部门公共工时的分摊,先按协作的其他部门的占比,分到其他部门
+                                        double curAssistTime = assistDeptItem.getWorkingTime();
+                                        double assignToDeptTime = curAssistTime / totalAssistTime * publicReportDeptItem.getWorkingTime();
+                                        //按目标部门的部门内部工时占比进行二次分配
+                                        Integer assignToDeptId = assistDeptItem.getDeptId();
+                                        List<FmwDetail> targetDeptReportList = insertDataList.stream().filter(r -> r.getDeptId().equals(assignToDeptId)).collect(Collectors.toList());
+                                        double totalTargetDeptTime = targetDeptReportList.stream().reduce(0.0, (a, b) -> a + b.getMaintanceTime() + b.getDebugTime() + b.getWaitingTime(), Double::sum);
+                                        if (totalTargetDeptTime > 0) {
+                                            //计算总工时: 用维修组装工时,调试工时和等料工时相加
+                                            insertDataList.forEach(fmwDetail -> {
+                                                //计算每一个项目的部门内部工时占比,按比例分摊公共工时
+                                                if (fmwDetail.getDeptId().equals(assignToDeptId)) {
+                                                    double curProjectTime = fmwDetail.getMaintanceTime() + fmwDetail.getDebugTime() + fmwDetail.getWaitingTime();
+                                                    double assignTime = curProjectTime / totalTargetDeptTime * assignToDeptTime;
+                                                    //可能之前已经有其他部门的分摊过来了,需要叠加
+                                                    fmwDetail.setPublicTime(fmwDetail.getPublicTime() == null ? assignTime : fmwDetail.getPublicTime() +assignTime);
+                                                }
+                                            });
+                                        } else {
+                                            throw new Exception("存在目标部门没有内部工时,导致公共工时无法分摊:targetDeptId=="+assignToDeptId);
+                                        }
+                                    }
+                                }
+                            }
+
+                            List<FmwDetail> fmwDetails = insertDataList.stream().filter(fmwDetail -> fmwDetail.getDeptId().equals(deptId)).collect(Collectors.toList());
+                            double assistDeptTotalTime = fmwDetails.stream().reduce(0.0, (a, b) -> a + b.getMaintanceTime() + b.getDebugTime() + b.getWaitingTime(), Double::sum);
+                            if (assistDeptTotalTime > 0) {
+                                //计算总工时: 用维修组装工时,调试工时和等料工时相加
+                                insertDataList.forEach(fmwDetail -> {
+                                    //计算每一个项目的部门内部工时占比,按比例分摊公共工时
+                                    if (fmwDetail.getProjectId().equals(publicReportDeptItem.getProjectId())) {
+                                        double curProjectTime = fmwDetail.getMaintanceTime() + fmwDetail.getDebugTime() + fmwDetail.getWaitingTime();
+                                        double assignTime = curProjectTime / assistDeptTotalTime * publicReportDeptItem.getWorkingTime();
+                                        fmwDetail.setPublicTime(assignTime);
+                                    }
+                                });
+                            } else {
+                                throw new Exception("存在部门公共工时无法分配,来源deptId=="+deptId);
+                            }
+                        }
+                    }
+                }
+            }
+
+            if (insertDataList.size() > 0) {
+                fmwDetailService.saveBatch(insertDataList);
+            }
+        }
+        //查询数据
+        List<FmwDetail> details = fmwDetailMapper.selectList(new QueryWrapper<FmwDetail>().eq("fmw_id", financeMonthlyWorktime.getId()));
+        financeMonthlyWorktime.setDetailList(details);
+        HttpRespMsg msg = new HttpRespMsg();
+        msg.data = financeMonthlyWorktime;
+        return msg;
+    }
+
+    private void setFmwTime(FmwDetail fmwDetail, Report report) {
+        switch (report.getGroupName()) {
+            case "组装/维修工时":
+                fmwDetail.setMaintanceTime(report.getWorkingTime());
+                break;
+            case "调试工时":
+                fmwDetail.setDebugTime(report.getWorkingTime());
+                break;
+            case "等料工时":
+                fmwDetail.setWaitingTime(report.getWorkingTime());
+                break;
+        }
+    }
+
+    @Override
+    public HttpRespMsg setTimesheetDate(Integer id, String timesheetDate, HttpServletRequest request) {
+        FinanceMonthlyWorktime financeMonthlyWorktime = new FinanceMonthlyWorktime();
+        financeMonthlyWorktime.setId(id);
+        financeMonthlyWorktime.setTimesheetDate(LocalDate.parse(timesheetDate, DateTimeFormatter.ofPattern("yyyy-MM-dd")));
+        financeMonthlyWorktimeMapper.updateById(financeMonthlyWorktime);
+        return new HttpRespMsg();
+    }
+
+    @Override
+    public HttpRespMsg changeWorktime(FmwDetail detail, HttpServletRequest request) {
+        fmwDetailService.updateById(detail);
+        return new HttpRespMsg();
+    }
+
+    @Override
+    public HttpRespMsg setStatusFinal(Integer id, HttpServletRequest request) {
+        FinanceMonthlyWorktime financeMonthlyWorktime = new FinanceMonthlyWorktime();
+        financeMonthlyWorktime.setId(id);
+        financeMonthlyWorktime.setStatus(1);
+        financeMonthlyWorktimeMapper.updateById(financeMonthlyWorktime);
+        return new HttpRespMsg();
+    }
 }

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

@@ -1911,6 +1911,10 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                         projectSeparate.setId(id);
                         projectSeparateMapper.insert(projectSeparate);
                     }
+                    //项目管理专业版要自动生成任务分组
+                    if (company.getPackageProject() == 1) {
+                        taskGroupService.initGroup(companyId, id, user);
+                    }
                     OperationRecord operationRecord=new OperationRecord();
                     operationRecord.setProjectName(project.getProjectName());
                     operationRecord.setOperationTime(LocalDateTime.now());

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

@@ -70,6 +70,10 @@ import java.util.stream.Collectors;
  */
 @Service
 public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> implements ReportService {
+    @Value("${configEnv.isPrivateDeploy}")
+    private boolean isPrivateDeploy;
+    @Value("${privateDeployURL.pcUrl}")
+    private String pcUrl;
 //    @Resource
 //    AsyncTaskExecutor asyncTaskExecutor;//注入线程池对象
     private final static Executor executor = Executors.newFixedThreadPool(3);//启用多线程
@@ -1345,6 +1349,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                 //检查是否为企业微信用户
                 WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new LambdaQueryWrapper<WxCorpInfo>().eq(WxCorpInfo::getCompanyId, companyId));
                 if (wxCorpInfo != null) {
+                    List<String> auditorCorpwxUserids = new ArrayList<>();
                     for (Report report : reportList) {
                         String corpwxUserid = userMapper.selectById(report.getProjectAuditorId()).getCorpwxUserid();
                         //推送到企业微信
@@ -1365,17 +1370,45 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                             jsonObj.put("value","1");
                         }
                         dataJson.add(jsonObj);
-//                        if(isPrivateDeploy){
-//                            json.put("content","待审核数量: "+1+"\\n<a href=\\\"https://open.weixin.qq.com/connect/oauth2/authorize?appid=ww4e237fd6abb635af&redirect_uri="+pcUrl+"/api/corpWXAuth&response_type=code&scope=snsapi_base&state=0#wechat_redirect\\\">去审核</a>");
-//                        }else {
+                        if(isPrivateDeploy){
+                            json.put("content","待审核数量: "+1+"\\n<a href=\\\"https://open.weixin.qq.com/connect/oauth2/authorize?appid=ww4e237fd6abb635af&redirect_uri="+pcUrl+"/api/corpWXAuth&response_type=code&scope=snsapi_base&state=0#wechat_redirect\\\">去审核</a>");
+                        }else {
                             String templateId = timeType.getAlertType() == 4 ? "tty9TkCAAAtDDCqY796mGulF9c5Jmwng":"tty9TkCAAAuPvPjabDdQXGocnG0K24EQ";
                             json.put("template_id",templateId);
                             json.put("url","https://open.weixin.qq.com/connect/oauth2/authorize?appid=ww4e237fd6abb635af&redirect_uri=http://worktime.ttkuaiban.com/api/corpWXAuth&response_type=code&scope=snsapi_base&state=review#wechat_redirect");
                             json.put("content_item",dataJson);
-//                        }
+                        }
+                        auditorCorpwxUserids.add(corpwxUserid);
 //                        System.out.println("发送企业微信消息==用户:"+corpwxUserid+", "+json.toJSONString());
                         wxCorpInfoService.sendWXCorpTemplateMsg(wxCorpInfo, corpwxUserid, json);
                     }
+                    //如果开启了抄送给部门负责人,需要发送消息通知
+                    if (timeType.getCcDeptManager()) {
+                        User creator = userMapper.selectById(reportList.get(0).getCreatorId());
+                        if (creator.getDepartmentId() != null && creator.getDepartmentId() != 0) {
+                            Department department = departmentMapper.selectById(creator.getDepartmentId());
+                            //获取部门主要负责人和其他负责人
+                            List<String> managerIds = new ArrayList<>();
+                            if (department.getManagerId() != null) {
+                                managerIds.add(department.getManagerId());
+                            }
+                            List<DepartmentOtherManager> otherManagers = departmentOtherManagerMapper.selectList(new LambdaQueryWrapper<DepartmentOtherManager>().eq(DepartmentOtherManager::getDepartmentId, creator.getDepartmentId()));
+                            if (otherManagers.size() > 0) {
+                                managerIds.addAll(otherManagers.stream().map(DepartmentOtherManager::getOtherManagerId).collect(Collectors.toList()));
+                            }
+                            if (managerIds.size() > 0) {
+                                //获取部门负责人
+                                List<User> managers = userMapper.selectList(new QueryWrapper<User>().in("id", managerIds).eq("company_id", companyId));
+                                String managerUserIds = managers.stream().filter(m -> m.getCorpwxUserid() != null && !auditorCorpwxUserids.contains(m.getCorpwxUserid()))
+                                        .map(User::getCorpwxUserid).collect(Collectors.joining("|"));
+                                if (!StringUtils.isEmpty(managerUserIds)) {
+//                                System.out.println("发送企业微信消息==用户:"+managerUserIds+", "+"员工$userName="+creator.getCorpwxUserid()+"$提交了日报");
+                                    wxCorpInfoService.sendWXCorpMsg(wxCorpInfo, managerUserIds, "员工$userName="+creator.getCorpwxUserid()+"$提交了日报", null, WxCorpInfoServiceImpl.TEXT_CARD_MSG_REPORT_SUBMIT);
+                                }
+                            }
+
+                        }
+                    }
                 }
             }
         } else {
@@ -4811,7 +4844,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
         DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd");
         List<User> userList = userMapper.selectList(new LambdaQueryWrapper<User>().eq(User::getCompanyId, user.getCompanyId()));
         List<UserCustom> userCustomList = userCustomMapper.selectList(new LambdaQueryWrapper<UserCustom>().eq(UserCustom::getCompanyId, user.getCompanyId()));
-        List<UserFvTime> userFvTimeList = userFvTimeMapper.selectList(new LambdaQueryWrapper<UserFvTime>().between(UserFvTime::getWorkDate, startDate, endDate));
+        List<UserFvTime> userFvTimeList = userFvTimeMapper.selectList(new LambdaQueryWrapper<UserFvTime>().between(UserFvTime::getWorkDate, startDate, endDate).eq(UserFvTime::getCompanyId, user.getCompanyId()));
         List<Map<String, Object>> reportFillStatus = reportMapper.getReportFillStatus(startDate, endDate, userId);
         //针对景昱 5978 校验填报工时是否超过考勤
         if(user.getCompanyId().equals(5978)){

+ 55 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/TaskGroupServiceImpl.java

@@ -200,6 +200,61 @@ public class TaskGroupServiceImpl extends ServiceImpl<TaskGroupMapper, TaskGroup
         return msg;
     }
 
+    @Override
+    public void initGroup(Integer companyId, Integer projectId, User user) {
+        List<GroupTemplate> groupTemplates = groupTemplateMapper.selectList(new QueryWrapper<GroupTemplate>().eq("company_id", user.getCompanyId()).eq("cre_with_pro", true));
+        if (groupTemplates.size()==0){
+            //创建默认分组
+            TaskGroup group = new TaskGroup();
+            group.setProjectId(projectId);
+            //group.setName("项目阶段");
+            group.setName(MessageUtils.message("entry.projectStage"));
+            save(group);
+        }else{
+            for (GroupTemplate groupTemplate : groupTemplates) {
+                TaskGroup group = new TaskGroup();
+                group.setProjectId(projectId);
+                group.setName(groupTemplate.getName());
+                save(group);
+                //从模板创建任务列表
+                Project project = projectMapper.selectById(projectId);
+                String inchargerId = project.getInchargerId();
+                User inchargerUser = userMapper.selectById(inchargerId);
+                List<GroupTmpstages> stages = groupTmpstagesMapper.selectList(new QueryWrapper<GroupTmpstages>().eq("template_id", groupTemplate.getId()));
+                List<Stages> batchList = new ArrayList<>();
+                stages.forEach(s->{
+                    Stages stageItem = new Stages();
+                    stageItem.setGroupId(group.getId());
+                    stageItem.setStagesName(s.getStagesName());
+                    stageItem.setSequence(s.getSequence());
+                    stageItem.setProjectId(projectId);
+                    batchList.add(stageItem);
+                });
+                stagesService.saveBatch(batchList);
+                //阶段的任务,里程碑,风险
+                List<GtemplateTask> gtemplateTaskList = gtemplateTaskMapper.selectList(
+                        new QueryWrapper<GtemplateTask>().eq("gtemplate_id", groupTemplate.getId())
+                                .orderByAsc("seq"));
+                if (gtemplateTaskList.size() > 0) {
+                    List<Task> taskList = new ArrayList<>();
+                    gtemplateTaskList.forEach(gt->{
+                        Task task = gt.toTask();
+                        task.setProjectId(projectId);
+                        task.setGroupId(group.getId());
+                        String sName = stages.stream().filter(s->s.getId().equals(gt.getTstagesId())).findFirst().get().getStagesName();
+                        Integer realStageId = batchList.stream().filter(bat->bat.getStagesName().equals(sName)).findFirst().get().getId();
+                        task.setStagesId(realStageId);
+                        task.setCreaterId(user.getId());
+                        task.setCreaterName(user.getName());
+                        task.setCreatorColor(user.getColor());
+                        taskList.add(task);
+                    });
+                    taskService.saveBatch(taskList);
+                }
+            }
+        }
+    }
+
     @Override
     @Transactional
     public HttpRespMsg setTemplate(User user,setTemplate setTemplate){

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

@@ -2,7 +2,6 @@ package com.management.platform.service.impl;
 
 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.extension.service.impl.ServiceImpl;
 import com.fasterxml.jackson.databind.ObjectMapper;
@@ -101,6 +100,7 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
     public static final int TEXT_CARD_MSG_BUSTRIP_WAITING_AUDIT = 0;//出差待审核
     public static final int TEXT_CARD_MSG_BUSTRIP_AGREE = 1;//出差审核通过
     public static final int TEXT_CARD_MSG_BUSTRIP_DENY = 2;//出差审核驳回
+    public static final int TEXT_CARD_MSG_REPORT_SUBMIT = 3; //日报提交抄送提醒
     public static final int TEXT_CARD_MSG_REPORT_DENY = 10;//日报驳回
     public static final int TEXT_CARD_MSG_REPORT_AGREE = 11; //日报审核通过
     public static final int TEXT_CARD_MSG_REPORT_ABNOEMAL = 12;//日报驳回
@@ -376,6 +376,8 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
                     title = "任务文件被驳回";
                 } else if (msgType.equals(TEXT_CARD_MSG_TASK_FILE_CHECK)) {
                     title = "任务文件审核";
+                } else if (msgType.equals(TEXT_CARD_MSG_REPORT_SUBMIT)) {
+                    title = "日报提交提醒";
                 }
             } else {
                 jumpUrl = jumpUrl.replace("STATE", pageRouter);

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

@@ -2,7 +2,7 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
 <mapper namespace="com.management.platform.mapper.FmwDetailMapper">
-<!-- 通用查询映射结果 -->
+    <!-- 閫氱敤鏌ヨ�鏄犲皠缁撴灉 -->
     <resultMap id="BaseResultMap" type="com.management.platform.entity.FmwDetail">
         <id column="id" property="id" />
         <result column="fmw_id" property="fmwId" />
@@ -20,7 +20,7 @@
         <result column="public_time" property="publicTime" />
     </resultMap>
 
-    <!-- 通用查询结果列 -->
+    <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
         id, fmw_id, dept_id, dept_name, dept_code, project_id, project_code, extra_field4, extra_field5, maintance_time, debug_time, waiting_time, assist_time, public_time
     </sql>

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 27 - 3
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ReportMapper.xml


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

@@ -56,7 +56,7 @@
                   when 2 then charge_two_id = #{userId} and charge_two_status = 0
             end
     </select>
-    <select id="getTaskFilesByCreatorDeptId" resultType="com.management.platform.entity.TaskFiles">
+    <select id="getTaskFilesByCreatorDeptId" resultType="java.lang.Integer">
         select tf.id
         from task_files tf
                  left join user on tf.creator_id = user.id

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 2 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/TimeTypeMapper.xml


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

@@ -105,7 +105,7 @@ referer:
     - localhost
     - ttkuaiban.com
     - ops.ttkuaiban.com
-    - 47.101.180.183
+    - 1.94.62.58
     - mldworktime.ttkuaiban.com
 excludeUrls: /wxcorp/*,/wxcorp/*/*,/dingding/*,/error,/testClient,/corpWXAuth,/wx-corp-info/*,/clean/*,/innerRoles/*,/operation-record/*
 syncDDMembUrl: http://worktime.ttkuaiban.com/api/dingding/syncCorpMembs

+ 13 - 13
fhKeeper/formulahousekeeper/timesheet/src/views/settings/timetype.vue

@@ -263,24 +263,24 @@
                                 <el-radio :label="0" class="rala1">定时提醒</el-radio>
                             </el-radio-group>
                             <el-time-picker v-if="timeType.alertAuditMode == 0"
-                                    v-model="timeType.waitCheckAlertTime"
-                                    :placeholder="$t('checkRemindertime')"
-                                    style="width:150px;"
-                                    format="HH:mm"
-                                    value-format="HH:mm"
-                                    :picker-options="{
-                                    start: '08:00',
-                                    end: '23:30'
-                                    }">
-                                </el-time-picker>
-                                <span v-if="timeType.alertType == 4" style="color:#606266;margin-left:20px;">({{ $t('mei') }}
+                                v-model="timeType.waitCheckAlertTime"
+                                :placeholder="$t('checkRemindertime')"
+                                style="width:150px;"
+                                format="HH:mm"
+                                value-format="HH:mm"
+                                :picker-options="{
+                                start: '08:00',
+                                end: '23:30'
+                                }">
+                            </el-time-picker>
+                            <span v-if="timeType.alertType == 4" style="color:#606266;margin-left:20px;">({{ $t('mei') }}
                                 <el-select v-model="timeType.alertCheckDay" style="width:80px;">
                                     <el-option v-for="item in alertWeekDayRange" :label="item.label" :value="item.value" :key="item.value"></el-option>
-                                </el-select>
-                                {{ $t('tiXing') }})<span style="margin-left:20px;">{{ $t('remindertext') }}</span>
+                                </el-select>{{ $t('tiXing') }})<span style="margin-left:20px;">{{ $t('remindertext') }}</span>
                                 <el-input :placeholder="$t('peaseenterthe')" v-model="timeType.alertCheckMsg" clearable class="apu" maxlength="50"></el-input>
                                 <span style="color:orange;margin-left:10px;">{{ $t('keYong_0BiaoShiDaiShenHeTiaoShuLiRu_0JiangBeiTiHuanWei_10') }}</span>
                             </span>
+                            <el-checkbox v-model="timeType.ccDeptManager" v-if="timeType.alertAuditMode == 1" style="margin-left:10px;">部门负责人接收抄送提醒</el-checkbox>
                         </div>
 
                     </div>

BIN
fhKeeper/formulahousekeeper/webttkuaiban/src/main/resources/static/image/customerNew/demand.jpg