Browse Source

工时审核报告增加部门,加班统计增加项目编号和名称

seyason 3 years ago
parent
commit
4e479342ab
14 changed files with 242 additions and 41 deletions
  1. 7 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/CompanyDingdingController.java
  2. 10 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectController.java
  3. 0 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/TaskController.java
  4. 4 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/CompanyDingdingService.java
  5. 4 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ProjectService.java
  6. 88 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/CompanyDingdingServiceImpl.java
  7. 4 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/DingDingServiceImpl.java
  8. 72 4
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java
  9. 2 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java
  10. 17 13
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/TaskServiceImpl.java
  11. 26 18
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/WxCorpInfoServiceImpl.java
  12. 4 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectMapper.xml
  13. 2 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ReportMapper.xml
  14. 2 1
      fhKeeper/formulahousekeeper/timesheet/src/views/workReport/daily.vue

+ 7 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/CompanyDingdingController.java

@@ -31,7 +31,7 @@ public class CompanyDingdingController {
     @RequestMapping("/pushAlertMsg")
     public HttpRespMsg pushAlertMsg(String corpid, String userDingId) {
         CompanyDingding companyDingding = companyDingdingMapper.selectById(corpid);
-        companyDingdingService.sendFillReportAlertMsg(companyDingding.getCompanyId(), 1339030842L, "填入日报哦", "040534176023851922");
+        companyDingdingService.sendFillReportAlertMsg(companyDingding.getCompanyId(), companyDingding.getAgentId(), "填入日报哦", "040534176023851922");
         return new HttpRespMsg();
     }
 
@@ -42,5 +42,11 @@ public class CompanyDingdingController {
         return new HttpRespMsg();
     }
 
+    @RequestMapping("/sendOAMsg")
+    public HttpRespMsg sendOAMsg(String corpid, String userDingId) {
+        CompanyDingding companyDingding = companyDingdingMapper.selectById(corpid);
+        companyDingdingService.sendOAMsg(companyDingding, "040534176023851922", null);
+        return new HttpRespMsg();
+    }
 }
 

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

@@ -432,5 +432,15 @@ public class ProjectController {
         return projectService.exportBaseCostAndRealCost(request);
     }
 
+    //按照获取一批项目下的分组合集
+    @RequestMapping("/getProjectsGroups")
+    public HttpRespMsg getProjectsGroups(String projectIdArray) {
+        return projectService.getProjectsGroups(projectIdArray);
+    }
+
+    @RequestMapping("/batchAddMembToGroup")
+    public HttpRespMsg batchAddMembToGroup(String membIdArray, String groupIds) {
+        return projectService.batchAddMembToGroup(membIdArray, groupIds);
+    }
 }
 

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

@@ -299,7 +299,6 @@ public class TaskController {
                 project.setProgress(progress);
                 projectService.updateById(project);
             }
-
         }
         return msg;
     }

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

@@ -4,6 +4,8 @@ import com.management.platform.entity.CompanyDingding;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.management.platform.entity.WxCorpInfo;
 
+import java.util.HashMap;
+
 /**
  * <p>
  *  服务类
@@ -28,4 +30,6 @@ public interface CompanyDingdingService extends IService<CompanyDingding> {
 
 
     public void sendFinishMileStoneMsg(CompanyDingding dingding, String useridList, String taskName, String project);
+
+    public void sendOAMsg(CompanyDingding dingding, String useridList, HashMap map);
 }

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

@@ -121,4 +121,8 @@ public interface ProjectService extends IService<Project> {
     HttpRespMsg getBaseCostAndRealCost(Integer pageIndex, Integer pageSize, HttpServletRequest request);
 
     HttpRespMsg exportBaseCostAndRealCost(HttpServletRequest request);
+
+    HttpRespMsg getProjectsGroups(String projectIdArray);
+
+    HttpRespMsg batchAddMembToGroup(String membIdArray, String groupIds);
 }

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

@@ -9,8 +9,10 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.dingtalk.api.DefaultDingTalkClient;
 import com.dingtalk.api.DingTalkClient;
 import com.dingtalk.api.request.OapiGettokenRequest;
+import com.dingtalk.api.request.OapiMessageCorpconversationAsyncsendV2Request;
 import com.dingtalk.api.request.OapiMessageCorpconversationSendbytemplateRequest;
 import com.dingtalk.api.request.OapiServiceGetSuiteTokenRequest;
+import com.dingtalk.api.response.OapiMessageCorpconversationAsyncsendV2Response;
 import com.dingtalk.api.response.OapiMessageCorpconversationSendbytemplateResponse;
 import com.dingtalk.api.response.OapiServiceGetSuiteTokenResponse;
 import com.management.platform.entity.CompanyDingding;
@@ -20,10 +22,12 @@ import com.management.platform.mapper.SysConfigMapper;
 import com.management.platform.service.CompanyDingdingService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.taobao.api.ApiException;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
 import java.time.LocalDateTime;
+import java.util.HashMap;
 
 /**
  * <p>
@@ -54,6 +58,8 @@ public class CompanyDingdingServiceImpl extends ServiceImpl<CompanyDingdingMappe
 
     @Resource
     private SysConfigMapper sysConfigMapper;
+    @Value("${dingding.appId}")
+    private long appId;//钉钉第三方应用的appId
 
     @Override
     public void sendFillReportAlertMsg(Integer companyId, Long agentId, String msg, String useridList) {
@@ -65,7 +71,11 @@ public class CompanyDingdingServiceImpl extends ServiceImpl<CompanyDingdingMappe
 //        req.setDeptIdList("421897262");
         req.setUseridList(useridList);
         req.setTemplateId(TEMPLATE_ALERT_REPORT);
-        req.setData("{\"msg\":\""+msg+"\"}");
+        JSONObject json = new JSONObject();
+        json.put("APPID", appId);
+        json.put("CORPID", dingding.getCorpid());
+        json.put("msg", msg);
+        req.setData(json.toJSONString());
         OapiMessageCorpconversationSendbytemplateResponse rsp = null;
         try {
             rsp = client.execute(req, getCorpAccessToken(dingding));
@@ -90,6 +100,8 @@ public class CompanyDingdingServiceImpl extends ServiceImpl<CompanyDingdingMappe
         json.put("project", projectNames);
         json.put("reason", reason);
         json.put("auditUser", auditorName);
+        json.put("APPID", appId);
+        json.put("CORPID", dingding.getCorpid());
         req.setData(json.toJSONString());
         OapiMessageCorpconversationSendbytemplateResponse rsp = null;
         try {
@@ -116,6 +128,8 @@ public class CompanyDingdingServiceImpl extends ServiceImpl<CompanyDingdingMappe
         json.put("employeeName", "张辉");
         json.put("deptName", "质量部");
         json.put("date", "2022-03-29");
+        json.put("APPID", appId);
+        json.put("CORPID", dingding.getCorpid());
         req.setData(json.toJSONString());
         OapiMessageCorpconversationSendbytemplateResponse rsp = null;
         try {
@@ -139,6 +153,8 @@ public class CompanyDingdingServiceImpl extends ServiceImpl<CompanyDingdingMappe
         req.setTemplateId(TEMPLATE_REPORT_WAITING_APPLY);
         JSONObject json = new JSONObject();
         json.put("auditNum", ""+auditNum);
+        json.put("APPID", appId);
+        json.put("CORPID", dingding.getCorpid());
         req.setData(json.toJSONString());
         OapiMessageCorpconversationSendbytemplateResponse rsp = null;
         try {
@@ -159,6 +175,10 @@ public class CompanyDingdingServiceImpl extends ServiceImpl<CompanyDingdingMappe
         req.setAgentId(agentId);
         req.setUseridList(useridList);
         req.setTemplateId(TEMPLATE_BUSTRIP_SETTING);
+        JSONObject json = new JSONObject();
+        json.put("APPID", appId);
+        json.put("CORPID", dingding.getCorpid());
+        req.setData(json.toJSONString());
         OapiMessageCorpconversationSendbytemplateResponse rsp = null;
         try {
             rsp = client.execute(req, getCorpAccessToken(dingding));
@@ -183,6 +203,8 @@ public class CompanyDingdingServiceImpl extends ServiceImpl<CompanyDingdingMappe
                 JSONObject json = new JSONObject();
                 json.put("name", ""+title);
                 json.put("endDate", ""+endDate);
+                json.put("APPID", appId);
+                json.put("CORPID", dingding.getCorpid());
                 req.setData(json.toJSONString());
 
                 OapiMessageCorpconversationSendbytemplateResponse rsp = null;
@@ -209,6 +231,8 @@ public class CompanyDingdingServiceImpl extends ServiceImpl<CompanyDingdingMappe
         JSONObject json = new JSONObject();
         json.put("taskName", taskName);
         json.put("project", project);
+        json.put("APPID", appId);
+        json.put("CORPID", dingding.getCorpid());
         req.setData(json.toJSONString());
         OapiMessageCorpconversationSendbytemplateResponse rsp = null;
         try {
@@ -221,6 +245,69 @@ public class CompanyDingdingServiceImpl extends ServiceImpl<CompanyDingdingMappe
         System.out.println(rsp.getBody());
     }
 
+    @Override
+    public void sendOAMsg(CompanyDingding dingding, String useridList, HashMap map) {
+        DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/message/corpconversation/asyncsend_v2");
+        OapiMessageCorpconversationAsyncsendV2Request request = new OapiMessageCorpconversationAsyncsendV2Request();
+        request.setAgentId(dingding.getAgentId());
+        request.setUseridList(useridList);
+        request.setToAllUser(false);
+
+        OapiMessageCorpconversationAsyncsendV2Request.Msg msg = new OapiMessageCorpconversationAsyncsendV2Request.Msg();
+//        msg.setMsgtype("text");
+//        msg.setText(new OapiMessageCorpconversationAsyncsendV2Request.Text());
+//        msg.getText().setContent("test123");
+//        request.setMsg(msg);
+//
+//        msg.setMsgtype("image");
+//        msg.setImage(new OapiMessageCorpconversationAsyncsendV2Request.Image());
+//        msg.getImage().setMediaId("@lADOdvRYes0CbM0CbA");
+//        request.setMsg(msg);
+//
+//        msg.setMsgtype("file");
+//        msg.setFile(new OapiMessageCorpconversationAsyncsendV2Request.File());
+//        msg.getFile().setMediaId("@lADOdvRYes0CbM0CbA");
+//        request.setMsg(msg);
+//
+//        msg.setMsgtype("link");
+//        msg.setLink(new OapiMessageCorpconversationAsyncsendV2Request.Link());
+//        msg.getLink().setTitle("test");
+//        msg.getLink().setText("test");
+//        msg.getLink().setMessageUrl("test");
+//        msg.getLink().setPicUrl("test");
+//        request.setMsg(msg);
+//
+//        msg.setMsgtype("markdown");
+//        msg.setMarkdown(new OapiMessageCorpconversationAsyncsendV2Request.Markdown());
+//        msg.getMarkdown().setText("##### text");
+//        msg.getMarkdown().setTitle("### Title");
+//        request.setMsg(msg);
+
+        msg.setOa(new OapiMessageCorpconversationAsyncsendV2Request.OA());
+        msg.getOa().setHead(new OapiMessageCorpconversationAsyncsendV2Request.Head());
+        msg.getOa().getHead().setText("这里是标题");
+        msg.getOa().setBody(new OapiMessageCorpconversationAsyncsendV2Request.Body());
+        msg.getOa().getBody().setContent("这里是内容");
+        msg.setMsgtype("oa");
+        msg.getOa().setMessageUrl("dingtalk://dingtalkclient/action/openapp?corpid=="+dingding.getCorpid()+"&container_type=work_platform&app_id="+appId+"&redirect_type=jump&redirect_url=https%3A%2F%2Fworktime.ttkuaiban.com%2F%3Fcorpid%3D%24CORPID%24");
+        request.setMsg(msg);
+
+//        msg.setActionCard(new OapiMessageCorpconversationAsyncsendV2Request.ActionCard());
+//        msg.getActionCard().setTitle("xxx123411111");
+//        msg.getActionCard().setMarkdown("### 测试123111");
+//        msg.getActionCard().setSingleTitle("测试测试");
+//        msg.getActionCard().setSingleUrl("https://www.dingtalk.com");
+//        msg.setMsgtype("action_card");
+//        request.setMsg(msg);
+        OapiMessageCorpconversationAsyncsendV2Response rsp = null;
+        try {
+            rsp = client.execute(request, getCorpAccessToken(dingding));
+        } catch (Exception exception) {
+            exception.printStackTrace();
+        }
+        System.out.println(rsp.getBody());
+    }
+
     private String getDDSuiteAccessToken() throws ApiException {
         if (DingDingServiceImpl.SUITE_ACCESS_TOKEN == null || DingDingServiceImpl.suiteTokenExpireTime < System.currentTimeMillis()) {
             DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/service/get_suite_token");

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

@@ -45,7 +45,7 @@ public class DingDingServiceImpl implements DingDingService {
     private final Logger bizLogger = LoggerFactory.getLogger(getClass());
     public static final DateTimeFormatter timeDtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
     public static final DateTimeFormatter mmDtf = DateTimeFormatter.ofPattern("HH:mm");
-    long appId = 71020L;
+//    public static long appId = 71020L;
     String token = "cf776d62c5fb3508b5d8c2cbb9f3df0c";
     String aesKey = "ktmbamhymjsf60ndwp6n81mnu92847oynsgj9e0zr9v";
     public static String suiteKey = "suitejwoq9dw4bxv4stdb";
@@ -114,6 +114,9 @@ public class DingDingServiceImpl implements DingDingService {
 
     @Value("${configEnv.isPrivateDeploy}")
     private boolean isPrivateDeploy;//企业内部应用,私有化部署的情况
+    @Value("${dingding.appId}")
+    private long appId;//钉钉第三方应用的appId
+
     @Override
     @Async
     public void corpAuth(String corpid, String corpName, String authUserId, Long agentId) throws ApiException {

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

@@ -9,10 +9,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.management.platform.entity.*;
 import com.management.platform.entity.vo.*;
 import com.management.platform.mapper.*;
-import com.management.platform.service.ProjectAuditorService;
-import com.management.platform.service.ProjectNotifyUserService;
-import com.management.platform.service.ProjectService;
-import com.management.platform.service.SysFunctionService;
+import com.management.platform.service.*;
 import com.management.platform.util.ExcelUtil;
 import com.management.platform.util.HttpRespMsg;
 import com.management.platform.util.ListUtil;
@@ -57,6 +54,10 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
     @Resource
     private ProjectNotifyUserService projectNotifyUserService;
     @Resource
+    private GroupParticipatorMapper groupParticipatorMapper;
+    @Resource
+    private GroupParticipatorService groupParticipatorService;
+    @Resource
     private ProjectMapper projectMapper;
     @Resource
     private SysRoleFunctionMapper sysRoleFunctionMapper;
@@ -71,6 +72,8 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
     @Resource
     private ParticipationMapper participationMapper;
     @Resource
+    private ParticipationService participationService;
+    @Resource
     private FinanceProjectsMapper financeProjectsMapper;
     @Resource
     private ProjectTimerMapper projectTimerMapper;
@@ -2432,6 +2435,71 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         return httpRespMsg;
     }
 
+    @Override
+    public HttpRespMsg getProjectsGroups(String projectIdArray) {
+        List<Integer> ids = JSONArray.parseArray(projectIdArray, Integer.class);
+        List<TaskGroup> taskGroups = taskGroupMapper.selectList(new QueryWrapper<TaskGroup>().in("project_id", ids));
+        Map<String, List<TaskGroup>> collect = taskGroups.stream().collect(Collectors.groupingBy(TaskGroup::getName));
+        Iterator<String> iterator = collect.keySet().iterator();
+        List<HashMap> result = new ArrayList<>();
+        while (iterator.hasNext()) {
+            String name = iterator.next();
+            List<TaskGroup> taskGroups1 = collect.get(name);
+            List<Integer> groupIds = taskGroups1.stream().map(TaskGroup::getId).collect(Collectors.toList());
+            HashMap mapItem = new HashMap();
+            mapItem.put("name", name);
+            mapItem.put("groupIds", groupIds);
+            result.add(mapItem);
+        }
+        HttpRespMsg msg = new HttpRespMsg();
+        msg.data = result;
+        return msg;
+    }
+
+    @Override
+    public HttpRespMsg batchAddMembToGroup(String membIdArray, String groupIds) {
+        List<String> membArray = JSONArray.parseArray(membIdArray, String.class);
+        List<Integer> groupArray = JSONArray.parseArray(groupIds, Integer.class);
+        List<GroupParticipator> gpList = groupParticipatorMapper.selectList(new QueryWrapper<GroupParticipator>().in("group_id", groupArray));
+        List<GroupParticipator> addToGpList = new ArrayList<>();
+        for (Integer groupId : groupArray) {
+            for (String memb : membArray) {
+                if (!gpList.stream().anyMatch(gp->gp.getGroupId().equals(groupId) && memb.equals(gp.getUserId()))) {
+                    //不存在的加上
+                    GroupParticipator participator = new GroupParticipator();
+                    participator.setGroupId(groupId);
+                    participator.setUserId(memb);
+                    addToGpList.add(participator);
+                }
+            }
+        }
+        if (addToGpList.size() > 0) {
+            //本次有新增的
+            groupParticipatorService.saveBatch(addToGpList);
+            //给项目增加参与人
+            List<Integer> collect = addToGpList.stream().map(GroupParticipator::getGroupId).collect(Collectors.toList());
+            List<TaskGroup> taskGroups = taskGroupMapper.selectList(new QueryWrapper<TaskGroup>().in("id", collect));
+            List<Integer> projectIds = taskGroups.stream().map(TaskGroup::getProjectId).collect(Collectors.toList());
+            List<Participation> participationList = participationMapper.selectList(new QueryWrapper<Participation>().in("project_id", projectIds));
+            List<Participation> addPartiToProject = new ArrayList<>();
+            for (Integer proId : projectIds) {
+                for (String memb : membArray) {
+                    if (!participationList.stream().anyMatch(part->part.getProjectId().equals(proId) && part.getUserId().equals(memb))) {
+                        Participation p = new Participation();
+                        p.setUserId(memb);
+                        p.setProjectId(proId);
+                        addPartiToProject.add(p);
+                    }
+                }
+            }
+            if (addPartiToProject.size() > 0) {
+                participationService.saveBatch(addPartiToProject);
+            }
+        }
+
+        return new HttpRespMsg();
+    }
+
 
     private List<Department> getSubDepts(Department dp, List<Department> list) {
         List<Department> collect = list.stream().filter(l -> dp.getDepartmentId().equals(l.getSuperiorId())).collect(Collectors.toList());;

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

@@ -877,6 +877,8 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                 map2.put("state", list2.get(0).get("state"));
                 map2.put("auditDeptName", list2.get(0).get("auditDeptName"));
                 map2.put("isDeptAudit", list2.get(0).get("isDeptAudit"));
+                //增加填报人所属部门
+                map2.put("departmentName", list2.get(0).get("departmentName"));
             }
 
             //设置照片显示

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

@@ -508,20 +508,24 @@ public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements Ta
 
     @Override
     public void notifyMileStoneFinish(Integer companyId, List<Integer> taskIdList) {
-        List<CompanyDingding> dingdingList = companyDingdingMapper.selectList(new QueryWrapper<CompanyDingding>().eq("company_id", companyId));
-        //钉钉注册的公司
-        if (dingdingList.size() > 0) {
-            CompanyDingding dingding = dingdingList.get(0);
-            List<Task> taskList = taskMapper.selectList(new QueryWrapper<Task>().in("id", taskIdList).eq("task_type", 1));
-            for (Task task : taskList) {
-                Project project = projectMapper.selectById(task.getProjectId());
-                List<Participation> participationList = participationMapper.selectList(new QueryWrapper<Participation>().eq("project_id", task.getProjectId()));
-                List<User> partUserList = userMapper.selectList(new QueryWrapper<User>().in("id", participationList.stream().map(Participation::getUserId).collect(Collectors.toList())));
-                String useridList = partUserList.stream().map(User::getDingdingUserid).collect(Collectors.joining(","));
-                companyDingdingService.sendFinishMileStoneMsg(dingding, useridList, task.getName(), project.getProjectName());
+        new Thread() {
+            public void run() {
+                List<CompanyDingding> dingdingList = companyDingdingMapper.selectList(new QueryWrapper<CompanyDingding>().eq("company_id", companyId));
+                //钉钉注册的公司
+                if (dingdingList.size() > 0) {
+                    CompanyDingding dingding = dingdingList.get(0);
+                    List<Task> taskList = taskMapper.selectList(new QueryWrapper<Task>().in("id", taskIdList).eq("task_type", 1));
+                    for (Task task : taskList) {
+                        Project project = projectMapper.selectById(task.getProjectId());
+                        List<Participation> participationList = participationMapper.selectList(new QueryWrapper<Participation>().eq("project_id", task.getProjectId()));
+                        List<User> partUserList = userMapper.selectList(new QueryWrapper<User>().in("id", participationList.stream().map(Participation::getUserId).collect(Collectors.toList())));
+                        String useridList = partUserList.stream().map(User::getDingdingUserid).collect(Collectors.joining(","));
+                        companyDingdingService.sendFinishMileStoneMsg(dingding, useridList, task.getName(), project.getProjectName());
+                    }
+                }
+                //TODO: 企业微信注册的公司
             }
-        }
-        //TODO: 企业微信注册的公司
+        }.start();
     }
 
 }

+ 26 - 18
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/WxCorpInfoServiceImpl.java

@@ -307,6 +307,14 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
                     String curUserid = base_info.getString("acctid");
                     String name = base_info.getString("name");
                     Long time = base_info.getLong("date");
+                    JSONArray workRules = base_info.getJSONObject("rule_info").getJSONArray("checkintime");
+                    //获取上下午的考勤打卡规则
+                    String baseMorningStart = DateTimeUtil.getTimeFromSeconds(workRules.getJSONObject(0).getIntValue("work_sec"));
+                    String baseMorningEnd = DateTimeUtil.getTimeFromSeconds(workRules.getJSONObject(0).getIntValue("off_work_sec"));
+                    String baseAfternoonStart = DateTimeUtil.getTimeFromSeconds(workRules.getJSONObject(1).getIntValue("work_sec"));
+                    String baseAfternoonEnd = DateTimeUtil.getTimeFromSeconds(workRules.getJSONObject(1).getIntValue("off_work_sec"));
+                    int restTime = workRules.getJSONObject(1).getIntValue("work_sec") - workRules.getJSONObject(0).getIntValue("off_work_sec");
+
                     LocalDate localDate = LocalDateTime.ofInstant(Instant.ofEpochSecond(time), ZoneId.systemDefault()).toLocalDate();
                     UserCorpwxTime ct = new UserCorpwxTime();
                     ct.setCompanyId(corpInfo.getCompanyId());
@@ -346,7 +354,6 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
                                 boolean isOldFormat = false;
                                 if (s.length < 5) {
                                     isOldFormat = true;
-                                    System.out.println("======aaa========"+string);
                                     for (String it : s) {
                                         System.out.println(it);
                                     }
@@ -364,40 +371,40 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
                                     //请假在一天内
                                     if (leaveEnd.equals("下午")) {
                                         if (leaveStart.equals("上午")) {
-                                            leaveEnd = "18:00";//上午和下午都请假,算全天
-                                            leaveStart = "09:00";
+                                            leaveEnd = baseAfternoonEnd;//上午和下午都请假,算全天
+                                            leaveStart = baseMorningStart;
                                         } else {
                                             leaveStart = "14:00";
-                                            leaveEnd = "18:00";//请假的下班打卡时间,算上午结束的时间
+                                            leaveEnd = baseAfternoonEnd;//请假的下班打卡时间,算上午结束的时间
                                         }
                                     } else if (leaveEnd.equals("上午")){
                                         //上午请假
-                                        leaveEnd = "14:00";
-                                        leaveStart = "09:00";
+                                        leaveEnd = baseMorningEnd;
+                                        leaveStart = baseMorningStart;
                                     }
                                 } else {
                                     if (showLog)System.out.println("跨天请假@@@@");
                                     if (showLog)System.out.println("当天=="+localDate+", sDate=" + sDate+", 比较="+(localDate.isEqual(sDate)));
                                     //跨天请假
                                     if (localDate.isEqual(sDate)) {
-                                        //当前日期就是最后一天,需判断上下午半天请假的情况
+                                        //当前日期一天,需判断上下午半天请假的情况
                                         if (leaveStart.equals("上午")) {
-                                            leaveEnd = "18:00";//上午开始请假的算全天
-                                            leaveStart = "09:00";
+                                            leaveStart = baseMorningStart;
                                         } else {
-                                            leaveStart = "14:00";
-                                            leaveEnd = "18:00";//下午开始请假的,算半天
+                                            leaveStart = baseAfternoonStart;
                                         }
+                                        //跨天请假的第一天,结束时间默认为18:00
+                                        leaveEnd = baseAfternoonEnd;//上午开始请假的算全天
                                     } else if (localDate.isEqual(eDate)) {
                                         //当前日期就是最后一天,需判断上下午半天请假的情况
                                         if (leaveEnd.equals("下午")) {
-                                            leaveEnd = "18:00";//请假到最后一天的下午,就算是全天
-                                            leaveStart = "09:00";
+                                            leaveEnd = baseAfternoonEnd;//请假到最后一天的下午,就算是全天
                                         } else if (leaveEnd.equals("上午")){
                                             //上午请假
-                                            leaveEnd = "14:00";
-                                            leaveStart = "09:00";
+                                            leaveEnd = baseMorningEnd;
                                         }
+                                        //跨天请假的最后一天,开始时间默认为9:00
+                                        leaveStart = baseMorningStart;
                                     } else {
                                         //中间日期就是全天
                                         leaveEnd = "00:00";
@@ -406,7 +413,7 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
                                     }
                                 }
 
-                                //获取外出的最早的开始时间和最晚的结束时间最为当天考勤的最早和最晚时间
+                                //获取请假最早的开始时间和最晚的结束时间最为当天考勤的最早和最晚时间
                                 if (ct.getStartTime().equals("00:00") || ct.getStartTime().compareTo(leaveStart) > 0) {
                                     ct.setStartTime(leaveStart);
                                     needRecaculate = true;
@@ -442,9 +449,10 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
                     //时间有变化,需要重新计算
                     if (needRecaculate) {
                         timeDelta = DateTimeUtil.getHoursFromSeconds(DateTimeUtil.getSecondsFromTime(ct.getEndTime()) - DateTimeUtil.getSecondsFromTime(ct.getStartTime()));
-                        if (ct.getEndTime().compareTo("13:30") >= 0) {
+                        //超过下午上班的开始时间,需要减去午休的时间
+                        if (ct.getEndTime().compareTo(baseAfternoonStart) >= 0) {
                             //重新计算打卡工时时,需要减去中间午休时间
-                            timeDelta -= 1.0;
+                            timeDelta -= restTime;
                         }
                     } else {
                         timeDelta = ct.getCardTime();

+ 4 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectMapper.xml

@@ -344,7 +344,9 @@
     <select id="getOvertimeList" resultType="java.util.Map">
         SELECT report.`creator_id` AS userId, user.`name` AS username, SUM(report.`working_time`) AS workingTime,
         IFNULL(SUM(report.`overtime_hours`),0) AS overtimeHours,
+        group_concat(distinct(project.project_code)) as projectCode,
         IFNULL(SUM(report.overtime_cost), 0) AS cost FROM report LEFT JOIN user ON user.id = report.`creator_id`
+        left join project on project.id = report.project_id
         WHERE report.is_overtime = 1
         and report.`state` = 1
         AND report.`create_date` BETWEEN #{startDate} and #{endDate}
@@ -362,7 +364,9 @@
     <select id="getOvertimeDetail" resultType="java.util.Map">
         SELECT date_format(report.`create_date`, '%Y-%m-%d') AS createDate, report.`creator_id` AS userId, user.`name` AS username, SUM(report.`working_time`) AS workingTime,
         IFNULL(SUM(report.`overtime_hours`), 0) AS overtimeHours,
+        project.project_name as projectName,project.project_code as projectCode,
         IFNULL(SUM(report.overtime_cost), 0) AS cost FROM report LEFT JOIN user ON user.id = report.`creator_id`
+        left join project on project.id = report.project_id
         WHERE report.is_overtime = 1
         and report.`state` = 1
         AND report.`create_date` BETWEEN #{startDate} and #{endDate}

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

@@ -239,7 +239,7 @@
     <select id="getAuditReportList" resultType="java.util.Map">
         SELECT a.id, user.id as userId, user.name, DATE_FORMAT(a.create_date, '%Y-%m-%d') as date, a.project_id as projectId, b.project_name AS project, a.working_time AS time, a.content, a.state, a.time_type as timeType,
         a.cost, a.report_time_type as reportTimeType, a.start_time as startTime,
-        a.end_time as endTime, b.incharger_id as inchargerId,
+        a.end_time as endTime, b.incharger_id as inchargerId,dept.department_name as departmentName,
         a.creator_id as creatorId, d.name as subProjectName,a.task_id as taskId, task.name as taskName, a.is_overtime as isOvertime,a.progress as progress,
         a.department_audit_state as departmentAuditState, a.stage, a.pic_str as picStr, multi_worktime as multiWorktime
         , reject_reason as rejectReason, reject_username as rejectUsername, reject_userid as rejectUserid, degree_id as degree_id,report_extra_degree.name as degreeName,
@@ -252,6 +252,7 @@
         left join task on task.id = a.task_id
         left join report_extra_degree on report_extra_degree.id = a.degree_id
         left join department on department.department_id = a.audit_deptid
+        left join department dept on dept.department_id = a.dept_id
         left join task_group on task_group.id = a.group_id
         left join user u on u.id = a.project_auditor_id
         WHERE a.company_id = #{companyId}

+ 2 - 1
fhKeeper/formulahousekeeper/timesheet/src/views/workReport/daily.vue

@@ -404,10 +404,11 @@
                     </el-form-item>
                     <!--项目管理专业版模式下,项目下的近期执行的任务 -->
                     <el-form-item label="相关任务" :prop="'domains.' + index + '.taskId'" v-if="user.company.packageProject==1" >
-                        <el-select v-model="domain.taskId" placeholder="请选择" style="width:100%;" filterable="true" 
+                        <el-select v-model="domain.taskId" placeholder="请选择" style="width:75%;margin-right:7%" filterable="true" 
                         :disabled="workForm.domains.length==0?true:(workForm.domains[index].state>=2?false:true)">
                             <el-option v-for="item in domain.taskList" :key="item.taskId" :label="item.taskName" :value="item.taskId"></el-option>
                         </el-select>
+                        <el-checkbox v-model="domain.taskFinish" v-if="domain.taskId != undefined">已完成</el-checkbox>
                     </el-form-item>
                     <el-form-item :label="user.companyId==781?'具体内容与结果':'工作事项'" :prop="'domains.' + index + '.content'" >
                         <el-input v-model="domain.content" type="textarea" :rows="4" placeholder="请填写" clearable