Selaa lähdekoodia

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

# Conflicts:
#	fhKeeper/formulahousekeeper/timesheet/src/views/project/projectInside.vue
seyason 3 vuotta sitten
vanhempi
commit
ee3358ef7f
26 muutettua tiedostoa jossa 614 lisäystä ja 140 poistoa
  1. 2 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/CompanyDingdingController.java
  2. 9 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/DingDingController.java
  3. 9 4
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectController.java
  4. 12 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/Project.java
  5. 7 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/TimeType.java
  6. 2 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/vo/GanttDataItem.java
  7. 2 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/UserMapper.java
  8. 3 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/CompanyDingdingService.java
  9. 3 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/DingDingService.java
  10. 5 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ProjectService.java
  11. 133 13
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/CompanyDingdingServiceImpl.java
  12. 3 4
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/DingDingServiceImpl.java
  13. 1 14
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/FinanceServiceImpl.java
  14. 161 20
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java
  15. 158 40
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java
  16. 62 7
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/task/TimingTask.java
  17. 2 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/util/CodeGenerator.java
  18. 2 2
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/application.yml
  19. 9 9
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectMapper.xml
  20. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ReportMapper.xml
  21. 2 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/TimeTypeMapper.xml
  22. 10 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/UserMapper.xml
  23. 1 1
      fhKeeper/formulahousekeeper/timesheet/src/views/project/projectInside.vue
  24. 2 2
      fhKeeper/formulahousekeeper/timesheet/src/views/project/project_gantt.vue
  25. 7 7
      fhKeeper/formulahousekeeper/timesheet_h5/src/router/index.js
  26. 6 6
      fhKeeper/formulahousekeeper/timesheet_h5/src/views/index/index.vue

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

@@ -31,8 +31,9 @@ public class CompanyDingdingController {
     @RequestMapping("/pushAlertMsg")
     public HttpRespMsg pushAlertMsg(String corpid, String userDingId) {
         CompanyDingding companyDingding = companyDingdingMapper.selectById(corpid);
-        companyDingdingService.sendDDMsg(companyDingding, userDingId, "请填写日报哦");
+        companyDingdingService.sendFillReportAlertMsg(companyDingding.getCompanyId(), 1339030842L, "填入日报哦", "040534176023851922");
         return new HttpRespMsg();
     }
+
 }
 

+ 9 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/DingDingController.java

@@ -16,10 +16,13 @@ import com.management.platform.util.*;
 import com.taobao.api.ApiException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.format.annotation.DateTimeFormat;
 import org.springframework.http.*;
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
 import java.util.Map;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
@@ -182,6 +185,9 @@ public class DingDingController {
                                     } catch (ApiException e) {
                                         e.printStackTrace();
                                     }
+                                } else if ("org_micro_app_restore".equals(syncAction)) {
+                                    String corpid = bizItem.getString("corp_id");
+                                    System.out.println("==Push 推送事件 app 工时管家恢复启用, corpid==="+corpid);
                                 }
                             }
                         }
@@ -191,7 +197,9 @@ public class DingDingController {
 
             // 5. 返回success的加密数据
             Map<String, String> successMap = callbackCrypto.getEncryptedMap("success");
-            System.out.println("给钉钉返回数据了:"+successMap);
+            LocalDateTime now = LocalDateTime.now();
+            DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");
+            System.out.println(dtf.format(now)+" 给钉钉返回数据了:"+successMap);
             return successMap;
         } catch (DingCallbackCrypto.DingTalkEncryptException e) {
             e.printStackTrace();

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

@@ -52,8 +52,8 @@ public class ProjectController {
     @RequestMapping("/getProjectPage")
     public HttpRespMsg getProjectPage(@RequestParam Integer pageIndex, @RequestParam Integer pageSize, String keyword,
                                       @RequestParam(required = false, defaultValue = "1") Integer searchField,
-                                      Integer status) {
-        return projectService.getProjectPage(pageIndex, pageSize, keyword,searchField, status, request);
+                                      Integer status, Integer category) {
+        return projectService.getProjectPage(pageIndex, pageSize, keyword,searchField, status, category, request);
     }
 
     /**
@@ -76,11 +76,12 @@ public class ProjectController {
                                    String associateDegrees,
                                    String associateDegreeNames,
                                    Integer taskGpIncharge,
-                                   String auditUserIds
+                                   String auditUserIds,
+                                   Integer category
                                    ) {
         return projectService.editProject(id, name, code, userId, inchargerId, isPublic, planStartDate, planEndDate, level, contractAmount,
                 projectBaseCostData,
-                 budget,customerId,chosenLeaders, associateDegrees, associateDegreeNames, taskGpIncharge,auditUserIds, request);
+                 budget,customerId,chosenLeaders, associateDegrees, associateDegreeNames, taskGpIncharge,auditUserIds, category, request);
     }
 
     @RequestMapping("/adjustBase")
@@ -377,5 +378,9 @@ public class ProjectController {
         return projectService.exportData(request);
     }
 
+    @RequestMapping("/getMyUsers")
+    public HttpRespMsg getMyUsers() {
+        return projectService.getMyUsers(request);
+    }
 }
 

+ 12 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/Project.java

@@ -21,7 +21,7 @@ import org.springframework.format.annotation.DateTimeFormat;
  * </p>
  *
  * @author Seyason
- * @since 2022-03-03
+ * @since 2022-03-24
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -238,6 +238,17 @@ public class Project extends Model<Project> {
 
     @TableField(exist = false)
     private List<ProjectAuditor> auditorList;
+    /**
+     * 分类id
+     */
+    @TableField("category")
+    private Integer category;
+
+    /**
+     * 分类名称
+     */
+    @TableField("category_name")
+    private String categoryName;
 
 
     @Override

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

@@ -15,7 +15,7 @@ import lombok.experimental.Accessors;
  * </p>
  *
  * @author Seyason
- * @since 2022-03-09
+ * @since 2022-03-22
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -144,6 +144,12 @@ public class TimeType extends Model<TimeType> {
     @TableField("custom_data_name")
     private String customDataName;
 
+    /**
+     * 财务成本导入是否需要审核
+     */
+    @TableField("finance_audit")
+    private Integer financeAudit;
+
 
     @Override
     protected Serializable pkVal() {

+ 2 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/vo/GanttDataItem.java

@@ -12,10 +12,11 @@ public class GanttDataItem {
     public String userId;
     public String text;
     public Integer duration;
-    public double planHours;
     @JsonFormat(pattern = "yyyy-MM-dd")
     public Date start_date;
     @JsonFormat(pattern = "yyyy-MM-dd")
     public Date end_date;
     public String parent;
+    public Integer projectId;
+    public String render;
 }

+ 2 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/UserMapper.java

@@ -33,6 +33,8 @@ public interface UserMapper extends BaseMapper<User> {
 
     List<Map<String, Object>> getPushUserList(@Param("companyId") Integer companyId);
 
+    List<Map<String, Object>> getPushDingdingUserList(@Param("alertTime") String alertTime);
+
     List<Map<String, Object>> getProjectPushUserList(@Param("projectId") Integer projectId);
 
 }

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

@@ -14,5 +14,7 @@ import com.management.platform.entity.WxCorpInfo;
  */
 public interface CompanyDingdingService extends IService<CompanyDingding> {
 
-    public void sendDDMsg(CompanyDingding corpInfo, String corpUserid, String msg);
+    public void sendFillReportAlertMsg(Integer companyId, Long agentId, String msg, String useridList);
+
+    public void sendRejectReportMsg(Integer companyId, String date, String projectNames, String reason, String auditorName, String useridList);
 }

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

@@ -1,5 +1,6 @@
 package com.management.platform.service;
 
+import com.management.platform.entity.CompanyDingding;
 import com.management.platform.util.HttpRespMsg;
 import com.taobao.api.ApiException;
 
@@ -21,4 +22,6 @@ public interface DingDingService {
     HttpRespMsg getUnActiveCorp();
 
     HttpRespMsg reAuthCorp(String corpid);
+
+
 }

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

@@ -19,7 +19,8 @@ import java.time.LocalDate;
 public interface ProjectService extends IService<Project> {
     HttpRespMsg getProjectList(HttpServletRequest request);
 
-    HttpRespMsg getProjectPage(Integer pageIndex, Integer pageSize, String keyword, Integer searchField, Integer status, HttpServletRequest request);
+    HttpRespMsg getProjectPage(Integer pageIndex, Integer pageSize, String keyword, Integer searchField,
+                               Integer status, Integer category, HttpServletRequest request);
 
     HttpRespMsg editProject(Integer id, String name, String code, String[] userIds, String inchargerId,
                             Integer isPublic,
@@ -35,6 +36,7 @@ public interface ProjectService extends IService<Project> {
                             String associateDegreeNames,
                             Integer taskGpIncharge,
                             String auditUserIds,
+                            Integer category,
                             HttpServletRequest request);
 
     HttpRespMsg deleteProject(Integer id, Integer force);
@@ -102,4 +104,6 @@ public interface ProjectService extends IService<Project> {
     HttpRespMsg getCustomDataSum(String startDate, String endDate, String userId, HttpServletRequest request);
 
     HttpRespMsg exportCustomDataSum(String startDate, String endDate, Integer projectId, String userId, HttpServletRequest request);
+
+    HttpRespMsg getMyUsers(HttpServletRequest request);
 }

+ 133 - 13
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/CompanyDingdingServiceImpl.java

@@ -1,16 +1,30 @@
 package com.management.platform.service.impl;
 
+import com.alibaba.fastjson.JSONObject;
+import com.aliyun.dingtalkoauth2_1_0.models.GetCorpAccessTokenRequest;
+import com.aliyun.dingtalkoauth2_1_0.models.GetCorpAccessTokenResponse;
+import com.aliyun.tea.TeaException;
+import com.aliyun.teaopenapi.models.Config;
+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.OapiMessageCorpconversationSendbytemplateRequest;
+import com.dingtalk.api.request.OapiServiceGetSuiteTokenRequest;
 import com.dingtalk.api.response.OapiMessageCorpconversationSendbytemplateResponse;
+import com.dingtalk.api.response.OapiServiceGetSuiteTokenResponse;
 import com.management.platform.entity.CompanyDingding;
+import com.management.platform.entity.SysConfig;
 import com.management.platform.mapper.CompanyDingdingMapper;
+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.stereotype.Service;
 
+import javax.annotation.Resource;
+import java.time.LocalDateTime;
+
 /**
  * <p>
  *  服务实现类
@@ -22,22 +36,128 @@ import org.springframework.stereotype.Service;
 @Service
 public class CompanyDingdingServiceImpl extends ServiceImpl<CompanyDingdingMapper, CompanyDingding> implements CompanyDingdingService {
     public static final String TEMPLATE_FILL_REPORT_ALERT = "c7c073b9be2a4ae8a988473715a27ad3";
+
+    //漏填消息提醒
+    public static final String TEMPLATE_ALERT_REPORT = "1be1d93884c84beab4744f323e85bcd8";
+    //驳回消息提醒模板
+    public static final String TEMPLATE_REJECT_REPORT = "62a3cb7230734fe0824f776f5cee5a7a";
+
+
+    @Resource
+    private SysConfigMapper sysConfigMapper;
+
     @Override
-    public void sendDDMsg(CompanyDingding corpInfo, String corpUserid, String msg) {
+    public void sendFillReportAlertMsg(Integer companyId, Long agentId, String msg, String useridList) {
+        DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/message/corpconversation/sendbytemplate");
+        OapiMessageCorpconversationSendbytemplateRequest req = new OapiMessageCorpconversationSendbytemplateRequest();
+        System.out.println("发送AlertMsg=="+msg+", agentId="+agentId);
+        CompanyDingding dingding = getOne(new QueryWrapper<CompanyDingding>().eq("company_id", companyId));
+        req.setAgentId(agentId);
+//        req.setDeptIdList("421897262");
+        req.setUseridList(useridList);
+        req.setTemplateId(TEMPLATE_ALERT_REPORT);
+        req.setData("{\"msg\":\""+msg+"\"}");
+        OapiMessageCorpconversationSendbytemplateResponse rsp = null;
         try {
-            System.out.println("===========推送钉钉消息===========");
-            DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/message/corpconversation/sendbytemplate");
-            OapiMessageCorpconversationSendbytemplateRequest req = new OapiMessageCorpconversationSendbytemplateRequest();
-            req.setAgentId(corpInfo.getAgentId());
-            req.setUseridList(corpUserid);
-//            req.setDeptIdList("421897262");
-            req.setTemplateId(TEMPLATE_FILL_REPORT_ALERT);
-            req.setData("{\"msg\":\""+msg+"\"}");
-            OapiMessageCorpconversationSendbytemplateResponse rsp = client.execute(req, corpInfo.getAccessToken());
-            System.out.println(rsp.getBody());
-        } catch (Exception e) {
+            rsp = client.execute(req, getCorpAccessToken(dingding));
+        } catch (ApiException e) {
+            e.printStackTrace();
+        } catch (Exception exception) {
+            exception.printStackTrace();
+        }
+        System.out.println(rsp.getBody());
+    }
+
+    @Override
+    public void sendRejectReportMsg(Integer companyId, String date, String projectNames, String reason, String auditorName, String useridList) {
+        DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/message/corpconversation/sendbytemplate");
+        OapiMessageCorpconversationSendbytemplateRequest req = new OapiMessageCorpconversationSendbytemplateRequest();
+        CompanyDingding dingding = getOne(new QueryWrapper<CompanyDingding>().eq("company_id", companyId));
+        req.setAgentId(dingding.getAgentId());
+        req.setUseridList(useridList);
+        req.setTemplateId(TEMPLATE_REJECT_REPORT);
+        JSONObject json = new JSONObject();
+        json.put("createDate", date);
+        json.put("project", projectNames);
+        json.put("reason", reason);
+        json.put("auditUser", auditorName);
+        req.setData(json.toJSONString());
+        OapiMessageCorpconversationSendbytemplateResponse rsp = null;
+        try {
+            rsp = client.execute(req, getCorpAccessToken(dingding));
+        } catch (ApiException e) {
             e.printStackTrace();
-            System.err.println(e.getMessage());
+        } 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");
+            OapiServiceGetSuiteTokenRequest req = new OapiServiceGetSuiteTokenRequest();
+            req.setSuiteKey(DingDingServiceImpl.suiteKey);
+            req.setSuiteSecret(DingDingServiceImpl.suiteSecret);
+            SysConfig config = sysConfigMapper.selectOne(new QueryWrapper<SysConfig>().eq("param_key", "dingding_suite_ticket"));
+            String suiteTicket = config.getParamValue();
+            System.out.println("查询到suiteTicket==" + suiteTicket);
+            req.setSuiteTicket(suiteTicket);
+            OapiServiceGetSuiteTokenResponse rsp = client.execute(req);
+            System.out.println(rsp.getBody());
+            JSONObject obj = JSONObject.parseObject(rsp.getBody());
+            if (obj.getIntValue("errcode") == 0) {
+                DingDingServiceImpl.SUITE_ACCESS_TOKEN = obj.getString("suite_access_token");
+                DingDingServiceImpl.suiteTokenExpireTime = System.currentTimeMillis() + obj.getIntValue("expires_in")*1000;
+            }
+        }
+        return DingDingServiceImpl.SUITE_ACCESS_TOKEN;
+    }
+
+
+
+    //获取授权企业的accessToken
+    public String getCorpAccessToken(CompanyDingding dingding) throws Exception {
+        //先去数据库查询,看看有么有过期
+        String accessToken = null;
+        if (dingding.getExpireTime().isBefore(LocalDateTime.now())) {
+            //过期了,重新获取
+            SysConfig configParam = sysConfigMapper.selectOne(new QueryWrapper<SysConfig>().eq("param_key", "dingding_suite_ticket"));
+            String suiteTicket = configParam.getParamValue();
+            System.out.println("查询到suiteTicket==" + suiteTicket);
+
+            Config config = new Config();
+            config.protocol = "https";
+            config.regionId = "central";
+            com.aliyun.dingtalkoauth2_1_0.Client client = new com.aliyun.dingtalkoauth2_1_0.Client(config);
+            GetCorpAccessTokenRequest getCorpAccessTokenRequest = new GetCorpAccessTokenRequest()
+                    .setSuiteKey(DingDingServiceImpl.suiteKey)
+                    .setSuiteSecret(DingDingServiceImpl.suiteSecret)
+                    .setAuthCorpId(dingding.getCorpid())
+                    .setSuiteTicket(suiteTicket);
+            try {
+                GetCorpAccessTokenResponse corpAccessToken = client.getCorpAccessToken(getCorpAccessTokenRequest);
+                String token = corpAccessToken.getBody().accessToken;
+                LocalDateTime newExpDate = LocalDateTime.now().plusSeconds(corpAccessToken.getBody().getExpireIn());
+                dingding.setAccessToken(token);
+                dingding.setExpireTime(newExpDate);
+                updateById(dingding);
+            } catch (TeaException err) {
+                if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
+                    // err 中含有 code 和 message 属性,可帮助开发定位问题
+                    System.err.println(err.code+": " +err.message);
+                }
+                return null;
+            } catch (Exception _err) {
+                TeaException err = new TeaException(_err.getMessage(), _err);
+                if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
+                    // err 中含有 code 和 message 属性,可帮助开发定位问题
+                    System.err.println(err.code+": " +err.message);
+                }
+                return null;
+            }
         }
+        accessToken = dingding.getAccessToken();
+        return accessToken;
     }
 }

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

@@ -44,9 +44,8 @@ public class DingDingServiceImpl implements DingDingService {
     long appId = 71020L;
     String token = "cf776d62c5fb3508b5d8c2cbb9f3df0c";
     String aesKey = "ktmbamhymjsf60ndwp6n81mnu92847oynsgj9e0zr9v";
-    String suiteKey = "suitejwoq9dw4bxv4stdb";
-    String suiteSecret = "o-TWFLkFe8YbJsa_025JOj_JEWydP5GR3eigt1Yn1rtx5dTcryTJiSA6KEih3Bi4";
-
+    public static String suiteKey = "suitejwoq9dw4bxv4stdb";
+    public static String suiteSecret = "o-TWFLkFe8YbJsa_025JOj_JEWydP5GR3eigt1Yn1rtx5dTcryTJiSA6KEih3Bi4";
 
     public static String SUITE_ACCESS_TOKEN = null;
     public static long suiteTokenExpireTime = 0L;
@@ -278,7 +277,6 @@ public class DingDingServiceImpl implements DingDingService {
 
     //获取授权企业的accessToken
     private OapiServiceGetCorpTokenResponse getAuthCorpAccessToken(String corpid, String suiteTicket) throws ApiException {
-        CompanyDingding dingding = companyDingdingMapper.selectById(corpid);
         DefaultDingTalkClient client= new DefaultDingTalkClient("https://oapi.dingtalk.com/service/get_corp_token");
         OapiServiceGetCorpTokenRequest req= new OapiServiceGetCorpTokenRequest();
         req.setAuthCorpid(corpid);
@@ -838,6 +836,7 @@ public class DingDingServiceImpl implements DingDingService {
 
     }
 
+
     public void activateSuite(String authCorpid, String tmpAuthCode) throws ApiException {
         DingTalkClient client= new DefaultDingTalkClient("https://oapi.dingtalk.com/service/activate_suite?suite_access_token=" + getDDSuiteAccessToken());
         OapiServiceActivateSuiteRequest req= new OapiServiceActivateSuiteRequest();

+ 1 - 14
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/FinanceServiceImpl.java

@@ -183,34 +183,21 @@ public class FinanceServiceImpl extends ServiceImpl<FinanceMapper, Finance> impl
                 Cell injuryCell = row.getCell(7);
 
                 nameCell.setCellType(CellType.STRING);
-                salaryCell.setCellType(CellType.STRING);
-                bonusCell.setCellType(CellType.STRING);
-                allowanceCell.setCellType(CellType.STRING);
-                inOldCell.setCellType(CellType.STRING);
-                inMedicalCell.setCellType(CellType.STRING);
-                inJobCell.setCellType(CellType.STRING);
+
                 String name = nameCell.getStringCellValue().trim().replaceAll("\\u00a0", "");
                 Finance finance = new Finance();
-
                 if (name.equals("姓名") && rowIndex == 0) {
                     continue;
                 }
                 Cell houseFundCell = row.getCell(8);
-//                Cell otherCell = row.getCell(9);
                 Cell field1 = cusColList.size() > 0?row.getCell(9):null;
                 Cell field2 = cusColList.size() > 1?row.getCell(10):null;
                 Cell field3 = cusColList.size() > 2?row.getCell(11):null;
 
-
-
-                houseFundCell.setCellType(CellType.STRING);
-//                if (otherCell != null)otherCell.setCellType(CellType.STRING);
                 if (field1 != null)field1.setCellType(CellType.STRING);
                 if (field2 != null)field2.setCellType(CellType.STRING);
                 if (field3 != null)field3.setCellType(CellType.STRING);
 
-
-
                 finance.setCompanyId(companyId);
                 finance.setName(name);
 

+ 161 - 20
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java

@@ -98,6 +98,10 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
     ProjectAuditorMapper projectAuditorMapper;
     @Resource
     ProjectAuditorService projectAuditorService;
+    @Resource
+    DepartmentMapper departmentMapper;
+    @Resource
+    ProjectCategoryMapper projectCategoryMapper;
 
     @Resource
     private HttpServletResponse response;
@@ -127,7 +131,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
     //分页获取项目列表
     @Override
     public HttpRespMsg getProjectPage(Integer pageIndex, Integer pageSize, String keyword, Integer searchField,
-                                      Integer status, HttpServletRequest request) {
+                                      Integer status, Integer category, HttpServletRequest request) {
         HttpRespMsg httpRespMsg = new HttpRespMsg();
         try {
             //通过公司id获取该公司所有的项目列表
@@ -135,7 +139,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
             Integer companyId = user.getCompanyId();
             //判断用户的角色,如果是管理员和负责人,查看全部的。如果是普通员工,只能是看到参与的项目
             QueryWrapper<Project> queryWrapper = null;
-            if (user.getRole() == 0 || user.getRole() == 5) {
+            if (user.getRole() == 0) {
                 //普通员工
                 List<Participation> pList = participationMapper.selectList(new QueryWrapper<Participation>().eq("user_id", user.getId()));
                 List<Integer> projectIds = new ArrayList<>();
@@ -161,6 +165,9 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
             if (status != null && status != 0) {
                 queryWrapper.eq("status", status);
             }
+            if (category != null) {
+                queryWrapper.eq("category", category);
+            }
             IPage<Project> projectIPage = projectMapper.selectPage(new Page<>(pageIndex, pageSize),
                     queryWrapper);
             List<Project> projectList = projectIPage.getRecords();
@@ -206,6 +213,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                                    String associateDegreeNames,
                                    Integer taskGpIncharge,
                                    String auditUserIds,
+                                   Integer category,
                                    HttpServletRequest request) {
         HttpRespMsg httpRespMsg = new HttpRespMsg();
         User user = userMapper.selectById(request.getHeader("Token"));
@@ -259,8 +267,14 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                             .setAssociateDegrees(associateDegrees)
                             .setAssociateDegreeNames(associateDegreeNames)
                             .setCustomerId(customerId)
-                            .setTaskGpIncharge(taskGpIncharge)
-                            ;
+                            .setTaskGpIncharge(taskGpIncharge);
+                    if (category != null) {
+                        ProjectCategory projectCategory = projectCategoryMapper.selectById(category);
+                        if (projectCategory != null) {
+                            project.setCategory(category);
+                            project.setCategoryName(projectCategory.getName());
+                        }
+                    }
                     if (!StringUtils.isEmpty(planStartDate)) {
                         project.setPlanStartDate(LocalDate.parse(planStartDate));
                     }
@@ -320,6 +334,13 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                         .setAssociateDegreeNames(associateDegreeNames)
                         .setCustomerId(customerId)
                         .setTaskGpIncharge(taskGpIncharge);
+                if (category != null) {
+                    ProjectCategory projectCategory = projectCategoryMapper.selectById(category);
+                    if (projectCategory != null) {
+                        p.setCategory(category);
+                        p.setCategoryName(projectCategory.getName());
+                    }
+                }
                 if (!StringUtils.isEmpty(planStartDate)) {
                     p.setPlanStartDate(LocalDate.parse(planStartDate));
                 }
@@ -1371,7 +1392,21 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         }
         HttpRespMsg msg = new HttpRespMsg();
         List<GanttDataItem> itemList = new ArrayList<>();
+
         List<Integer> projectIds = null;
+        if (targetProjectId != null) {
+            projectIds = new ArrayList<>();
+            projectIds.add(targetProjectId);
+        } else {
+            if (user.getRole() == 0) {
+                //普通员工只看自己相关的
+                List<Participation> participationList
+                        = participationMapper.selectList(new QueryWrapper<Participation>().in("user_id", userIds));
+                projectIds = participationList.stream().map(Participation::getProjectId).collect(Collectors.toList());
+            } else {
+                projectIds = null;//查看全部的
+            }
+        }
         List<Map> ganttData = null;
         if (userIds.size() > 0) {
             if (type == 0) {
@@ -1379,35 +1414,78 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                 ganttData = projectMapper.getTaskPlanByMemb(userIds, startDate ,endDate, user.getCompanyId());
             } else {
                 ganttData = projectMapper.getTaskPlanByProject(projectIds, startDate ,endDate, user.getCompanyId());
-
             }
-//            List<Map> ganttData = projectMapper.getTaskPlanByMemb(userIds, user.getCompanyId());
-            String lastUserId = null;
+            String lastItemId = null;
 
-            GanttDataItem lastUserItem = null;
+            GanttDataItem lastParentItem = null;
 
             for (int i=0;i<ganttData.size(); i++) {
                 Map map = ganttData.get(i);
                 String userId = (String) map.get("user_id");
                 Date start_date = (Date) map.get("start_date");
                 Date end_date = (Date) map.get("end_date");
+                String projectId = ""+ (Integer) map.get("id");
+                String taskId = ""+ (Integer) map.get("task_id");
 
-                lastUserItem = new GanttDataItem();
+                GanttDataItem curItem = new GanttDataItem();;
                 if (type == 0) {
-                    lastUserItem.text = (String) map.get("name");
+                    if (!userId.equals(lastItemId)) {
+                        //抽取父级对象,人员名称
+                        GanttDataItem parent = new GanttDataItem();
+                        parent.id = userId;
+                        parent.userId = (String) map.get("user_id");
+                        parent.text = (String) map.get("name");
+                        parent.render = "split";
+                        parent.start_date = start_date;
+                        parent.end_date = end_date;
+                        parent.duration = 0;
+                        itemList.add(parent);
+                        lastItemId = userId;
+                        lastParentItem = parent;
+                    }
+
+                    curItem.id = taskId;
+                    curItem.userId = (String) map.get("user_id");
+                    curItem.text = (String) map.get("project_name")+"/"+(String)map.get("task_name");
+                    curItem.start_date = start_date;
+                    curItem.end_date = end_date;
+                    curItem.duration = (Integer)map.get("duration");
+                    curItem.parent = lastItemId;
+                    itemList.add(curItem);
+                    lastItemId = userId;
                 } else {
-                    lastUserItem.text = (String) map.get("project_name");
+                    if (!projectId.equals(lastItemId)) {
+                        //抽取父级对象,项目名称
+                        GanttDataItem parent = new GanttDataItem();
+                        parent.id = projectId;
+                        parent.userId = (String) map.get("user_id");
+                        parent.text = (String) map.get("project_name");
+                        parent.render = "split";
+                        parent.start_date = start_date;
+                        parent.end_date = end_date;
+                        parent.duration = 0;
+                        itemList.add(parent);
+                        lastItemId = projectId;
+                        lastParentItem = parent;
+                    }
+                    curItem.id = projectId+"_"+taskId;
+                    curItem.userId = (String) map.get("user_id");
+                    curItem.text = (String) map.get("name")+"/"+(String)map.get("task_name");
+                    curItem.start_date = start_date;
+                    curItem.end_date = end_date;
+                    curItem.duration = (Integer)map.get("duration");
+                    curItem.parent = lastItemId;
+                    itemList.add(curItem);
+                    lastItemId = projectId;
                 }
-
-                lastUserItem.id = userId;
-                lastUserItem.userId = (String) map.get("user_id");
-                lastUserItem.start_date = start_date;
-                lastUserItem.end_date = end_date;
-                if (end_date != null && start_date != null) {
-                    lastUserItem.duration = (int)(end_date.getTime() - start_date.getTime())/(24*3600*1000);
+                //校正父对象
+                if (curItem.start_date.compareTo(lastParentItem.start_date) < 0) {
+                    lastParentItem.start_date = curItem.start_date;
                 }
-
-                itemList.add(lastUserItem);
+                if (curItem.end_date.compareTo(lastParentItem.end_date) > 0) {
+                    lastParentItem.end_date = curItem.end_date;
+                }
+                lastParentItem.duration = lastParentItem.duration + curItem.duration;
             }
         }
 
@@ -1895,4 +1973,67 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         }
         return httpRespMsg;
     }
+
+    @Override
+    public HttpRespMsg getMyUsers(HttpServletRequest request) {
+        //获取我管理的用户
+        User user = userMapper.selectById(request.getHeader("TOKEN"));
+        List<User> userList = new ArrayList<>();
+        if (user.getRole() == 1 || user.getRole() == 2 || user.getRole() == 6) {
+            //管理员
+            userList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", user.getCompanyId()).eq("is_active", 1));
+        } else {
+            List<Integer> deptIds = new ArrayList<>();
+            deptIds.add(-1);
+            if (user.getManageDeptId() != null) {
+                //获取管理的部门的人员列表
+                List<Department> allDepts = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id", user.getCompanyId()));
+                List<Department> myDepts = allDepts.stream().filter(item->item.getManagerId() != null && item.getManagerId().equals(user.getId())).collect(Collectors.toList());
+                List<Department> finalDepts = new ArrayList<>();
+                for (Department dept: myDepts) {
+                    List<Department> subDeptList = getSubDepts(dept, allDepts);
+                    finalDepts.addAll(subDeptList);
+                    finalDepts.add(dept);
+                }
+                deptIds = finalDepts.stream().map(Department::getDepartmentId).collect(Collectors.toList());
+            }
+            //再看看有没有项目相关的人员
+            List<Project> projectList = projectMapper.selectList(
+                    new QueryWrapper<Project>().eq("incharger_id", user.getId()).eq("status", 1));
+            List<String> userIds = new ArrayList<>();
+            userIds.add("0");
+            if (projectList.size() > 0) {
+                List<Integer> proIds = projectList.stream().map(Project::getId).collect(Collectors.toList());
+                List<Participation> pList = participationMapper.selectList(new QueryWrapper<Participation>().in("project_id", proIds));
+                userIds = pList.stream().map(Participation::getUserId).collect(Collectors.toList());
+            }
+            QueryWrapper<User> queryWrapper = new QueryWrapper<User>();
+            queryWrapper.in("department_id", deptIds).or().in("id", userIds);
+            userList = userMapper.selectList(queryWrapper);
+        }
+        List<User> finalUserList = new ArrayList<>();
+        userList.forEach(u->{
+            User i = new User();
+            i.setId(u.getId());
+            i.setName(u.getName());
+            finalUserList.add(i);
+        });
+        HttpRespMsg msg = new HttpRespMsg();
+        msg.data = finalUserList;
+        return msg;
+    }
+
+
+    private List<Department> getSubDepts(Department dp, List<Department> list) {
+        List<Department> collect = list.stream().filter(l -> dp.getDepartmentId().equals(l.getSuperiorId())).collect(Collectors.toList());;
+        List<Department> allList = new ArrayList<>();
+        allList.addAll(collect);
+        if (collect.size() > 0) {
+            collect.forEach(c->{
+                allList.addAll(getSubDepts(c, list));
+            });
+        }
+        return allList;
+    }
+
 }

+ 158 - 40
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java

@@ -14,6 +14,7 @@ import com.management.platform.entity.vo.WorktimeItem;
 import com.management.platform.mapper.*;
 import com.management.platform.service.*;
 import com.management.platform.util.ExcelUtil;
+import com.management.platform.util.FileUtil;
 import com.management.platform.util.HttpRespMsg;
 import com.management.platform.util.ListUtil;
 import me.chanjar.weixin.mp.api.WxMpInMemoryConfigStorage;
@@ -90,6 +91,8 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
     @Resource
     WxCorpInfoService wxCorpInfoService;
     @Resource
+    CompanyDingdingMapper companyDingdingMapper;
+    @Resource
     WxCorpInfoMapper wxCorpInfoMapper;
     @Resource
     private InformationServiceImpl informationService;
@@ -114,6 +117,8 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
     @Resource
     private ProjectMapper projectMapper;
     @Resource
+    private CompanyDingdingService companyDingdingService;
+    @Resource
     private InformationMapper informationMapper;
     @Resource
     private TimeTypeMapper timeTypeMapper;
@@ -135,6 +140,14 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
     private UserSalaryService userSalaryService;
     @Resource
     private AuditWorkflowTimeSettingMapper auditWorkflowTimeSettingMapper;
+    @Resource
+    private ReportAlogMembdateService reportAlogMembdateService;
+    @Resource
+    private ReportImportLogMapper reportImportLogMapper;
+    @Resource
+    private ReportAuditLogMapper reportAuditLogMapper;
+    @Resource
+    private ReportAlogMembdateMapper reportAlogMembdateMapper;
 
     @Value(value = "${upload.path}")
     private String path;
@@ -916,7 +929,9 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                     }
                 }
             } else {
-                String creatorId = reportMapper.selectById(ids.get(0)).getCreatorId();
+                Report oneReport = reportMapper.selectById(ids.get(0));
+                int oldState = oneReport.getState();
+                String creatorId = oneReport.getCreatorId();
                 User auditTargetUser = userMapper.selectById(creatorId);
                 List<AuditWorkflowTimeSetting> settings = auditWorkflowTimeSettingMapper.selectList(
                         new QueryWrapper<AuditWorkflowTimeSetting>().eq("dept_id", auditTargetUser.getDepartmentId())
@@ -997,8 +1012,25 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                         }
                     }
                 }
+
+                //对导入审核,添加记录
+                if (oldState == -1) {
+                    ReportAuditLog log = new ReportAuditLog();
+                    log.setAuditChannel(0);//导入审核
+                    log.setCompanyId(company.getId());
+                    log.setResult("通过");
+                    log.setUserId(user.getId());
+                    log.setUserName(user.getName());
+                    reportAuditLogMapper.insert(log);
+                    //员工的日期
+                    ReportAlogMembdate membdate = new ReportAlogMembdate();
+                    membdate.setRlogId(log.getId());
+                    membdate.setCreateDate(oneReport.getCreateDate());
+                    membdate.setUserId(oneReport.getCreatorId());
+                    membdate.setUserName(userMapper.selectById(oneReport.getCreatorId()).getName());
+                    reportAlogMembdateMapper.insert(membdate);
+                }
             }
-            
         } catch (NullPointerException e) {
             httpRespMsg.setError("验证失败");
             e.printStackTrace();
@@ -1132,6 +1164,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                 reason = "-";
             }
             Report oneReport = reportMapper.selectById(ids.get(0));
+            int oldState = oneReport.getState();
             if (company.getPackageEngineering() == 1) {
                 //检查是否有专业进度待审核
                 List<ReportProfessionProgress> list = reportProfessionProgressService.list(new QueryWrapper<ReportProfessionProgress>().in("report_id", ids).eq("audit_state", 0));
@@ -1140,7 +1173,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                         httpRespMsg.setError("只有专业审核全部通过才可操作");
                         return httpRespMsg;
                     } else {
-                        Report report = reportMapper.selectById(ids.get(0));
+                        Report report = oneReport;
                         //部门待审核,部门审核驳回
                         if (report.getDepartmentAuditState() == 0) {
                             report = new Report();
@@ -1196,9 +1229,32 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
 
             informationMapper.insert(new Information().setType(0).setContent(date).setUserId(fillUserId).setMsg(str));
 
+            //对导入审核,添加记录
+            if (oldState == -1) {
+                ReportAuditLog log = new ReportAuditLog();
+                log.setAuditChannel(0);//导入审核
+                log.setCompanyId(company.getId());
+                log.setResult("驳回"+(StringUtils.isEmpty(reason)?"":"("+reason+")"));
+                log.setUserId(user.getId());
+                log.setUserName(user.getName());
+                reportAuditLogMapper.insert(log);
+                //员工的日期
+                ReportAlogMembdate membdate = new ReportAlogMembdate();
+                membdate.setRlogId(log.getId());
+                membdate.setCreateDate(oneReport.getCreateDate());
+                membdate.setUserId(oneReport.getCreatorId());
+                membdate.setUserName(userMapper.selectById(oneReport.getCreatorId()).getName());
+                reportAlogMembdateMapper.insert(membdate);
+            }
+
             //发送企业微信通知消息
             User reporter = userMapper.selectById(fillUserId);
             String corpwxUserid = reporter.getCorpwxUserid();
+            //先判断钉钉
+            if (reporter.getDingdingUserid() != null) {
+                projectMapper.selectById(oneReport.getProjectId()).getProjectName();
+                companyDingdingService.sendRejectReportMsg(reporter.getCompanyId(), date, pNames, reason, user.getName(), reporter.getDingdingUserid());
+            }
             if (corpwxUserid != null) {
                 WxCorpInfo info = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", company.getId()));
                 wxCorpInfoService.sendWXCorpMsg(info, corpwxUserid, str);
@@ -1396,14 +1452,21 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             List<AuditWorkflowTimeSetting> settings = auditWorkflowTimeSettingMapper.selectList(
                     new QueryWrapper<AuditWorkflowTimeSetting>().eq("company_id", company.getId())
                             .orderByAsc("seq"));
-
+            Report oneReport = reportMapper.selectById(ids.get(0));
+            int oldState = oneReport.getState();
+            List<User> allUsers = null;
+            List<Report> allReports = null;
             if (settings.size() == 0) {
                 //公司没有自定义流程,直接进行项目经理审核
                 reportMapper.update(new Report().setState(1),
                         new QueryWrapper<Report>().in("id", ids));
+                if (oldState == -1) {
+                    allUsers = userMapper.selectList(new QueryWrapper<User>().eq("company_id", company.getId()));
+                    allReports = reportMapper.selectList(new QueryWrapper<Report>().in("id", ids));
+                }
             } else {
-                List<User> allUsers = userMapper.selectList(new QueryWrapper<User>().eq("company_id", company.getId()));
-                List<Report> allReports = reportMapper.selectList(new QueryWrapper<Report>().in("id", ids));
+                allUsers = userMapper.selectList(new QueryWrapper<User>().eq("company_id", company.getId()));
+                allReports = reportMapper.selectList(new QueryWrapper<Report>().in("id", ids));
                 List<Department> allDepts = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id", company.getId()));
                 //ids是来自不同人不同日期的报告id
                 List<Report> updateReportList = new ArrayList<Report>();
@@ -1509,6 +1572,38 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                 }
             }
 
+            if (oldState == -1) {
+                //需要进行审核记录保存
+                ReportAuditLog log = new ReportAuditLog();
+                log.setAuditChannel(0);//导入审核
+                log.setCompanyId(company.getId());
+                log.setResult("批量通过");
+                log.setUserId(user.getId());
+                log.setUserName(user.getName());
+                reportAuditLogMapper.insert(log);
+                //当前所有员工的日期
+                List<ReportAlogMembdate> membList = new ArrayList<>();
+                for (Report r : allReports) {
+                    LocalDate date = r.getCreateDate();
+                    String creatorId = r.getCreatorId();
+                    if (!membList.stream().anyMatch(m->m.getCreateDate().isEqual(date) && m.getUserId().equals(creatorId))) {
+                        //没有的话,存进去
+                        ReportAlogMembdate membdate = new ReportAlogMembdate();
+                        membdate.setRlogId(log.getId());
+                        membdate.setCreateDate(date);
+                        membdate.setUserId(creatorId);
+                        Optional<User> oneUser = allUsers.stream().filter(a->a.getId().equals(creatorId)).findFirst();
+                        if (oneUser.isPresent()) {
+                            membdate.setUserName(oneUser.get().getName());
+                        }
+                        membList.add(membdate);
+
+                    }
+                }
+                if (membList.size() > 0) {
+                    reportAlogMembdateService.saveBatch(membList);
+                }
+            }
 //            //直接进行项目经理审核
 //            reportMapper.update(new Report().setState(1),
 //                    new QueryWrapper<Report>().in("id", ids));
@@ -1567,6 +1662,41 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                 }
             }
         }
+        Report oneReport = reportMapper.selectById(ids.get(0));
+        int oldState = oneReport.getState();
+        if (oldState == -1) {
+            //需要进行审核记录保存
+            ReportAuditLog log = new ReportAuditLog();
+            log.setAuditChannel(0);//导入审核
+            log.setCompanyId(company.getId());
+            log.setResult("批量驳回");
+            log.setUserId(user.getId());
+            log.setUserName(user.getName());
+            reportAuditLogMapper.insert(log);
+            List<Report> allReports = reportMapper.selectList(new QueryWrapper<Report>().in("id", ids));
+            List<User> allUsers = userMapper.selectList(new QueryWrapper<User>().eq("company_id", company.getId()));
+            //当前所有员工的日期
+            List<ReportAlogMembdate> membList = new ArrayList<>();
+            for (Report r : allReports) {
+                LocalDate date = r.getCreateDate();
+                String creatorId = r.getCreatorId();
+                if (!membList.stream().anyMatch(m->m.getCreateDate().isEqual(date) && m.getUserId().equals(creatorId))) {
+                    //没有的话,存进去
+                    ReportAlogMembdate membdate = new ReportAlogMembdate();
+                    membdate.setRlogId(log.getId());
+                    membdate.setCreateDate(date);
+                    membdate.setUserId(creatorId);
+                    Optional<User> oneUser = allUsers.stream().filter(a->a.getId().equals(creatorId)).findFirst();
+                    if (oneUser.isPresent()) {
+                        membdate.setUserName(oneUser.get().getName());
+                    }
+                    membList.add(membdate);
+                }
+            }
+            if (membList.size() > 0) {
+                reportAlogMembdateService.saveBatch(membList);
+            }
+        }
         //直接进行项目经理审核驳回
         reportMapper.update(new Report().setState(2),
                 new QueryWrapper<Report>().in("id", ListUtil.convertIdsArrayToList(reportIds)));
@@ -2089,48 +2219,35 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                 }
             }
 
-            //先删除老数据, 修改为批处理
-            long t1 = System.currentTimeMillis();
-
-//            DateTimeFormatter standFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd");
-//            HashMap<String, Object> dataMap = new HashMap<>();
-//            for (Report r : reportList) {
-//                //组合一下人员
-//                String date = standFormat.format(r.getCreateDate());
-//                if (dataMap.containsKey(date)) {
-//                    List<String> userList = (List)dataMap.get(date);
-//                    userList.add(r.getCreatorId());
-//                } else {
-//                    List<String> newList = new ArrayList<>();
-//                    newList.add(r.getCreatorId());
-//                    dataMap.put(date, newList);
-//                }
-//            }
-//            LambdaQueryWrapper<Report> queryWrapper = new QueryWrapper<Report>().lambda();
-//            Iterator<String> it = dataMap.keySet().iterator();
-//
-//            while (it.hasNext()) {
-//                String key = it.next();
-//                List<String> userList = (List)dataMap.get(key);
-//                //非审核通过的才能删除
-//                queryWrapper.or(wrapper->wrapper.eq(Report::getCompanyId, companyId).eq(Report::getCreateDate, key).in(Report::getCreatorId, userList).ne(Report::getState, 1));
-//            }
-//            System.out.println(queryWrapper.getSqlSegment()+", "+queryWrapper.getSqlSelect()+", " + queryWrapper.getCustomSqlSegment());
             if (reportList.size() > 0) {
                 reportMapper.deleteUserSameDayReport(companyId, reportList);
-                long t2 = System.currentTimeMillis();
-                System.out.println("删除耗时:" + (t2-t1));
                 //存储
                 reportService.saveBatch(reportList);
-                long t3 = System.currentTimeMillis();
-                System.out.println("插入耗时:"+ (t3-t2));
                 msg.data = dataCount;
+                //保存导入记录
+                String originName = fileName;
+                //定义一个独立的文件夹
+                String importFolder = "report_import";
+                File dir = new File(path, importFolder);
+                if (!dir.exists()) {
+                    dir.mkdir();
+                }
+
+                System.out.println("fileName=="+originName);
+                String[] names = originName.split("\\.");
+                String destFileName = names[0] + "_"+System.currentTimeMillis()+"."+names[1];
+                File destFile = new File(dir, destFileName);
+                FileUtils.copyFile(file, destFile);
+                ReportImportLog log = new ReportImportLog();
+                log.setCompanyId(user.getCompanyId());
+                log.setFileName(originName);
+                log.setServerName(importFolder+"/"+destFileName);
+                log.setUserId(user.getId());
+                log.setUserName(user.getName());
+                reportImportLogMapper.insert(log);
             } else {
                 msg.setError("工时数据不能为空");
             }
-
-//            msg.setError("接口维护中...");
-
         } catch (IOException e) {
             e.printStackTrace();
             msg.setError("文件处理出错");
@@ -2140,6 +2257,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             msg.setError("数据格式有误或存在空数据 导入失败");
             return msg;
         } catch (Exception e) {
+            e.printStackTrace();
             msg.setError("发生其他错误:"+e.getMessage());
             return msg;
         } finally {

+ 62 - 7
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/task/TimingTask.java

@@ -8,11 +8,9 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.management.platform.constant.Constant;
 import com.management.platform.entity.*;
 import com.management.platform.mapper.*;
+import com.management.platform.service.CompanyDingdingService;
 import com.management.platform.service.WxCorpInfoService;
-import com.management.platform.util.AuthService;
-import com.management.platform.util.CheckPicUtil;
-import com.management.platform.util.RedisUtil;
-import com.management.platform.util.WorkDayCalculateUtils;
+import com.management.platform.util.*;
 import me.chanjar.weixin.mp.api.WxMpInMemoryConfigStorage;
 import me.chanjar.weixin.mp.api.WxMpService;
 import me.chanjar.weixin.mp.api.impl.WxMpServiceImpl;
@@ -69,6 +67,8 @@ public class TimingTask {
     private String path;
     @Resource
     private ProjectMapper projectMapper;
+    @Resource
+    private CompanyDingdingService companyDingdingService;
 
     //检查项目到期,距离到期时间3天内的,每天提醒
     @Scheduled(cron = "0 0 10 ? * *")
@@ -176,19 +176,74 @@ public class TimingTask {
                 //发送推送提醒
                 List<Map<String, Object>> userList = userMapper.getPushUserList(t.getCompanyId());
                 List<WxCorpInfo> cpList = wxCorpInfoMapper.selectList(new QueryWrapper<WxCorpInfo>().eq("company_id", t.getCompanyId()));
-
+                List<String> dingdingUserIdList = new ArrayList<>();
                 userList.forEach(u->{
                     if (u.get("corpwxUserid") != null) {
                         //推送到企业微信
                         String corpUid = (String) u.get("corpwxUserid");
                         wxCorpInfoService.sendWXCorpMsg(cpList.get(0), corpUid, t.getAlertMsg());
-                    } else {
+                    } else if (u.get("wxOpenid") != null) {
                         push(u, t.getAlertMsg());
                     }
-
                 });
             }
         });
+
+        List<Map<String, Object>> dingdingUserList = userMapper.getPushDingdingUserList(str);
+        System.out.println("=============查询钉钉推送未填提醒的人员列表=====, size=" + dingdingUserList.size());
+
+        //钉钉平台的用批量发送, 每分钟5000个
+        int minuteSize = 5000;
+        int minuteTimes = dingdingUserList.size()/minuteSize + (dingdingUserList.size()%minuteSize==0?0:1);
+        for (int m = 0; m < minuteTimes; m++) {
+            int startIndex = m*minuteSize;
+            int endIndex = (m+1)*minuteSize;
+            if (endIndex > dingdingUserList.size()) {
+                endIndex = dingdingUserList.size();
+            }
+            final List<Map<String, Object>> curUserList = dingdingUserList.subList(startIndex, endIndex);
+            final int curm = m;
+            //调用新的线程发送
+            new Thread(() -> {
+                if (curm > 0) {
+                    try {
+                        //每间隔60秒发送一次
+                        System.out.println("开始间隔了60秒===");
+                        Thread.currentThread().sleep(60000);
+                    } catch (InterruptedException e) {
+                        e.printStackTrace();
+                    }
+                }
+                System.out.println("发送钉钉漏填提醒:" + LocalDateTime.now().toString() + ", size=" + curUserList.size());
+                //按照company组装,同一个company批量发送,最大不超过1000
+                Integer companyId = null;
+                Long agentId = null;
+                String alertMsg = null;
+                List<String> dingUid = new ArrayList<>();
+                int count = 0;
+                for (int i=0;i<curUserList.size(); i++) {
+                    count++;
+                    Map<String, Object> item = curUserList.get(i);
+                    Integer curCompanyId = (Integer)item.get("companyId");
+                    dingUid.add((String)item.get("dingdingUserid"));
+                    if (companyId == null) {
+                        companyId = curCompanyId;
+                        agentId = companyDingdingService.getOne(new QueryWrapper<CompanyDingding>().eq("company_id", companyId)).getAgentId();
+                        alertMsg = timeTypeMapper.selectById(companyId).getAlertMsg();
+                    }
+
+                    if (i == curUserList.size() -1 || curCompanyId.intValue() != (int)curUserList.get(i+1).get("companyId")
+                                || count == 1000) {
+                        String idStr = dingUid.stream().collect(Collectors.joining(","));
+                        System.out.println("发送给==="+idStr);
+                        companyDingdingService.sendFillReportAlertMsg(companyId, agentId, alertMsg, idStr);
+                        count = 0;
+                        companyId = null;
+                        dingUid.clear();
+                    }
+                }
+            }).start();
+        }
     }
     //推送项目即将逾期通知
     public void pushProjectNotify(String wxOpenid, String projectName, int days, String endDate) {

+ 2 - 2
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/util/CodeGenerator.java

@@ -92,11 +92,11 @@ public class CodeGenerator {
 
         // 数据源配置
         DataSourceConfig dsc = new DataSourceConfig();
-        dsc.setUrl("jdbc:mysql://47.100.37.243:7644/man_dev?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8");
+        dsc.setUrl("jdbc:mysql://47.101.180.183:3306/man_dev?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8");
 //        dsc.setSchemaName("public");
         dsc.setDriverName("com.mysql.cj.jdbc.Driver");
         dsc.setUsername("root");
-        dsc.setPassword("Ziyu20141026!@@");
+        dsc.setPassword("HuoshiDB@2022");
         mpg.setDataSource(dsc);
 
         // 包配置

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

@@ -14,9 +14,9 @@ spring:
       location: C:/upload/
   datasource:
     driver-class-name: com.mysql.cj.jdbc.Driver
-    url: jdbc:mysql://47.100.37.243:7644/man_dev?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&rewriteBatchedStatements=true
+    url: jdbc:mysql://47.101.180.183:3306/man_dev?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&rewriteBatchedStatements=true
     username: root
-    password: Ziyu20141026!@@
+    password: HuoshiDB@2022
     hikari:
       maximum-pool-size: 10
       minimum-idle: 3

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

@@ -35,11 +35,13 @@
         <result column="associate_degrees" property="associateDegrees" />
         <result column="associate_degree_names" property="associateDegreeNames" />
         <result column="task_gp_incharge" property="taskGpIncharge" />
+        <result column="category" property="category" />
+        <result column="category_name" property="categoryName" />
     </resultMap>
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        id, project_name, company_id, project_code, incharger_id, plan_start_date, plan_end_date, progress, level, status, finish_date, creator_id, creator_name, create_date, contract_amount, budget, base_man, base_outsourcing, base_risk1, base_risk2, base_fee, fee_normal, fee_travel, fee_outsourcing, fee_man, customer_id, customer_name, is_public, associate_degrees, associate_degree_names, task_gp_incharge
+        id, project_name, company_id, project_code, incharger_id, plan_start_date, plan_end_date, progress, level, status, finish_date, creator_id, creator_name, create_date, contract_amount, budget, base_man, base_outsourcing, base_risk1, base_risk2, base_fee, fee_normal, fee_travel, fee_outsourcing, fee_man, customer_id, customer_name, is_public, associate_degrees, associate_degree_names, task_gp_incharge, category, category_name
     </sql>
 
 
@@ -183,7 +185,7 @@
     <!-- 获取人员在日报填写的自定义数值 -->
     <select id="getProjectCusDataSumItem" resultType="java.util.Map">
         SELECT b.id as creatorId,project.project_code as projectCode, project.project_name as projectName,
-            b.name,department.department_name as departmentName, IFNULL(SUM(a.custom_data),0) AS cost
+        b.name,department.department_name as departmentName, IFNULL(SUM(a.custom_data),0) AS cost
         FROM report AS a
         JOIN user AS b ON a.creator_id = b.id
         left join department on department.department_id = b.department_id
@@ -306,9 +308,8 @@
     </select>
 
     <select id="getTaskPlanByMemb" resultType="java.util.Map">
-        SELECT user.`id` as user_id, user.`name`,project.id, project.`project_name`,task.id, task.name,
-            IFNULL(task.`start_date`, task.end_date) as start_date, task.`end_date`,
-        TIMESTAMPDIFF(DAY,task.`start_date`, task.`end_date`) AS duration, task.plan_hours FROM user
+        SELECT user.`id` as user_id, user.`name`,project.id, project.`project_name`,task.id as task_id, task.name as task_name,
+        IFNULL(task.`start_date`, task.end_date) as start_date, task.`end_date`, task.plan_hours as duration FROM user
         LEFT JOIN task ON user.id = task.`executor_id`
         LEFT JOIN project ON project.`id` = task.`project_id`
         WHERE user.`id` IN
@@ -323,12 +324,11 @@
 
 
     <select id="getTaskPlanByProject" resultType="java.util.Map">
-        SELECT user.id as user_id, user.`name`,project.id, project.`project_name`,task.id, task.name,
-        IFNULL(task.`start_date`, task.end_date) as start_date, task.`end_date`,
-        TIMESTAMPDIFF(DAY,task.`start_date`, task.`end_date`) AS duration, task.plan_hours FROM project
+        SELECT user.id as user_id, user.`name`,project.id, project.`project_name`,task.id as task_id, task.name as task_name,
+        IFNULL(task.`start_date`, task.end_date) as start_date, task.`end_date`, task.plan_hours as duration FROM project
         LEFT JOIN task ON task.project_id = project.id
         LEFT JOIN user ON user.`id` = task.`executor_id`
-        WHERE 1=1
+        WHERE project.company_id = #{companyId}
         <if test="projectIds != null">
             and project.`id` IN
             <foreach collection="projectIds" close=")" open="(" separator="," index="" item="item">

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

@@ -425,7 +425,7 @@
     </select>
 
     <select id="getRealProjectTime" resultType="java.util.Map">
-        SELECT project.id as projectId, project.project_code as projectCode, project.project_name as project,report.creator_id AS creatorId,sum(working_time) as workingTime, SUM(cost) as cost
+        SELECT project.id as projectId, project.project_code as projectCode, IFNULL(project.project_name,'未知') as project,report.creator_id AS creatorId,sum(working_time) as workingTime, SUM(cost) as cost
         FROM report
         left join project on project.id = report.project_id
         WHERE report.creator_id IN

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

@@ -24,11 +24,12 @@
         <result column="report_workflow" property="reportWorkflow" />
         <result column="custom_data_active" property="customDataActive" />
         <result column="custom_data_name" property="customDataName" />
+        <result column="finance_audit" property="financeAudit" />
     </resultMap>
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        company_id, allday, am, pm, month_days, hour_cost_input_type, type, pay_overtime, alert_time, multi_worktime, fix_monthcost, fill_months, custom_degree_active, custom_degree_name, alert_msg, sync_corpwx_time, need_dept_audit, report_workflow, custom_data_active, custom_data_name
+        company_id, allday, am, pm, month_days, hour_cost_input_type, type, pay_overtime, alert_time, multi_worktime, fix_monthcost, fill_months, custom_degree_active, custom_degree_name, alert_msg, sync_corpwx_time, need_dept_audit, report_workflow, custom_data_active, custom_data_name, finance_audit
     </sql>
 
 </mapper>

+ 10 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/UserMapper.xml

@@ -125,6 +125,16 @@
         AND a.is_active = 1
         AND NOT EXISTS(SELECT 1 FROM report WHERE report.`creator_id` = a.id AND report.`create_date` = DATE_FORMAT(NOW(), '%Y-%m-%d'))
     </select>
+
+
+    <select id="getPushDingdingUserList" resultType="java.util.Map">
+        SELECT a.company_id as companyId, a.dingding_userid as dingdingUserid
+        FROM user AS a left join time_type on time_type.company_id = a.company_id
+        WHERE a.dingding_userid is not null and time_type.alert_time = #{alertTime}
+        AND a.is_active = 1
+        AND NOT EXISTS(SELECT 1 FROM report WHERE report.`creator_id` = a.id AND report.`create_date` = DATE_FORMAT(NOW(), '%Y-%m-%d'))
+        order by a.company_id
+    </select>
     <!--获取项目的参与人的推送id -->
     <select id="getProjectPushUserList" resultType="java.util.Map">
         SELECT a.id, a.wx_openid as wxOpenid, a.corpwx_userid as corpwxUserid

+ 1 - 1
fhKeeper/formulahousekeeper/timesheet/src/views/project/projectInside.vue

@@ -613,7 +613,7 @@
                         <el-input v-model="templateForm.name" placeholder="请输入模板名称" maxlength="12"
                             show-word-limit clearable></el-input>
                             <!-- <div>
-                                <span>同时保存</span>
+                                <span style="margin-right:20px">同时保存</span>
                                 <el-checkbox v-model="templateForm.saveTask" label="任务"></el-checkbox>
                                 <el-checkbox v-model="templateForm.saveRisk" label="风险"></el-checkbox>
                                 <el-checkbox v-model="templateForm.saveMileStone" label="里程碑"></el-checkbox>

+ 2 - 2
fhKeeper/formulahousekeeper/timesheet/src/views/project/project_gantt.vue

@@ -26,7 +26,7 @@
       </div>
       <div class="head_select">
         <span>{{(this.radio1 == "按人员查看" ? "人员" : "项目")}}</span>
-      <el-select clearable v-model="valuex" placeholder="请选择" size="small" style="margin-left:9px;width:200px" @change="optupdata()">
+      <el-select clearable filterable v-model="valuex" placeholder="请选择" size="small" style="margin-left:9px;width:200px" @change="optupdata()">
         <el-option
           v-for="item in screenList"
           :key="item.id"
@@ -185,7 +185,7 @@ export default {
 
       getList() {
         let getlistcs = {}
-        if (this.valuex != null){
+        if (this.valuex != null && this.valuex != ''){
           if (!this.reqpar1) {
             getlistcs = {type : 0 , startDate : this.reqpar2[0] , endDate : this.reqpar2[1], userId : this.valuex}
           }else{

+ 7 - 7
fhKeeper/formulahousekeeper/timesheet_h5/src/router/index.js

@@ -123,13 +123,13 @@ const router = new Router({
         },
         component: () => import("@/views/test/list")
     },
-    {
-        path: "/timetool",
-        meta: {
-            title: "自动计时"
-        },
-        component: () => import("@/views/timetool/timetool")
-    },
+    // {
+    //     path: "/timetool",
+    //     meta: {
+    //         title: "自动计时"
+    //     },
+    //     component: () => import("@/views/timetool/timetool")
+    // },
     {
         path: "/my",
         component: () => import("@/views/my/index"),

+ 6 - 6
fhKeeper/formulahousekeeper/timesheet_h5/src/views/index/index.vue

@@ -169,12 +169,12 @@
             if (localStorage.userInfo != null) {
                 this.getAccountInfo();
             }
-            this.routers.push({
-                                name: '自动计时',
-                                url: '/timetool',
-                                icon: 'clock-o',
-                                info: this.unreadNum
-                            });
+            // this.routers.push({
+            //                     name: '自动计时',
+            //                     url: '/timetool',
+            //                     icon: 'clock-o',
+            //                     info: this.unreadNum
+            //                 });
             this.getMessage();
             this.bindIfNessary();
             if (localStorage.userInfo != null) {