Kaynağa Gözat

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

ggooalice 2 yıl önce
ebeveyn
işleme
2ed562c032
15 değiştirilmiş dosya ile 351 ekleme ve 131 silme
  1. 26 11
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/AuthRedirectController.java
  2. 7 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectController.java
  3. 86 82
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/WeiXinCorpController.java
  4. 6 3
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/Department.java
  5. 3 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/WxCorpInfoService.java
  6. 18 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/DingDingServiceImpl.java
  7. 8 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java
  8. 53 18
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/WxCorpInfoServiceImpl.java
  9. 5 5
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/task/TimingTask.java
  10. 21 3
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/i18n/messages.properties
  11. 21 3
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/i18n/messages_en_US.properties
  12. 94 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/DepartmentMapper.xml
  13. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectMapper.xml
  14. 1 1
      fhKeeper/formulahousekeeper/timesheet/src/views/workReport/daily.vue
  15. 1 1
      fhKeeper/formulahousekeeper/timesheet_h5/src/views/edit/index.vue

+ 26 - 11
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/AuthRedirectController.java

@@ -9,6 +9,7 @@ import com.management.platform.mapper.SysConfigMapper;
 import com.management.platform.mapper.UserMapper;
 import com.management.platform.mapper.WxCorpInfoMapper;
 import com.management.platform.service.UserService;
+import com.management.platform.service.WxCorpInfoService;
 import com.management.platform.util.HttpRespMsg;
 import com.management.platform.util.MessageUtils;
 import com.management.platform.util.UserAgentUtils;
@@ -53,6 +54,9 @@ public class AuthRedirectController {
     WxCorpInfoMapper wxCorpInfoMapper;
     @Resource
     CompanyMapper companyMapper;
+    @Resource
+    WxCorpInfoService wxCorpInfoService;
+
 
     @RequestMapping("/corpWXAuth")
     public ModelAndView auth(String code, String state) {
@@ -90,17 +94,26 @@ public class AuthRedirectController {
             } else {
                 User curUser = userMapper.selectOne(new QueryWrapper<User>().eq("company_id", wxCorpInfo.getCompanyId()).eq("corpwx_userid", wxUserId));
                 if (curUser == null) {
-                    reqParam.put("errorMsg", MessageUtils.message("user.accountNoExist"));
-                } else if (curUser.getIsActive() == 1) {
-                    companyId = curUser.getCompanyId();
-                    reqParam.put("userId", curUser.getId());
-//                    HttpRespMsg httpRespMsg = userService.loginByUserId(curUser.getId(), request);
-//                    reqParam.put("userInfo", httpRespMsg.data);
+//                    reqParam.put("errorMsg", MessageUtils.message("user.accountNoExist"));
+                    //用户不存在,去生成该用户
+                    if (wxCorpInfo.getSaasSyncContact() == 1) {
+                        curUser = wxCorpInfoService.generateUserInfo(wxCorpInfo.getCompanyId(), openUserId);
+                    }
+                }
+                if (curUser != null) {
+                    if (curUser.getIsActive() == 1) {
+                        companyId = curUser.getCompanyId();
+                        reqParam.put("userId", curUser.getId());
+                    } else {
+                        //提示账号已停用
+                        //reqParam.put("errorMsg", "您的账号已停用,无法登录");
+                        reqParam.put("errorMsg", MessageUtils.message("user.inactive"));
+                    }
                 } else {
-                    //提示账号已停用
-                    //reqParam.put("errorMsg", "您的账号已停用,无法登录");
-                    reqParam.put("errorMsg", MessageUtils.message("user.inactive"));
+                    System.err.println("==生成企业微信User失败==");
+                    reqParam.put("errorMsg", MessageUtils.message("user.accountNoExist"));
                 }
+
             }
         }
         reqParam.put("hasTriedAutoLogin", 1);
@@ -120,9 +133,9 @@ public class AuthRedirectController {
             }
         }
         if (isMobile) {
-            redirecUrl = "https://mobworktime.ttkuaiban.com/#/" + router;
+            redirecUrl = "http://mobworktime.ttkuaiban.com/#/" + router;
         } else {
-            redirecUrl = "https://worktime.ttkuaiban.com/#/" + router;
+            redirecUrl = "http://worktime.ttkuaiban.com/#/" + router;
         }
         ModelAndView modelAndView = new ModelAndView(
                 new RedirectView(redirecUrl), reqParam);
@@ -131,6 +144,8 @@ public class AuthRedirectController {
     }
 
 
+
+
     private HashMap getCompExpireInfo(Integer companyId) {
         Company company = companyMapper.selectById(companyId);
         int version = 1;

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

@@ -73,6 +73,8 @@ public class ProjectController {
     @Resource
     private UserMapper userMapper;
     @Resource
+    private WxCorpInfoMapper wxCorpInfoMapper;
+    @Resource
     private OperationRecordService operationRecordService;
     @RequestMapping("/testRead")
     public HttpRespMsg testRead(String jobId) {
@@ -665,6 +667,7 @@ public class ProjectController {
         HttpRespMsg msg = new HttpRespMsg();
         List<String> heads = new ArrayList<>();
         Company company = companyMapper.selectById(companyId);
+        WxCorpInfo wxCorpInfo=wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id",companyId));
         List<ProjectStage> projectStageList = projectStageMapper.selectList(new QueryWrapper<ProjectStage>().eq("company_id", company.getId()));
         List<ProviderCategory> providerCategoryList = providerCategoryMapper.selectList(new QueryWrapper<ProviderCategory>().eq("company_id", companyId));
         List<ProjectLevel> projectLevelList = projectLevelMapper.selectList(new QueryWrapper<ProjectLevel>().eq("company_id", companyId));
@@ -927,7 +930,8 @@ public class ProjectController {
                                 case "Participants":
                                     comment = drawing.createCellComment(anchor);
                                     // 输入批注信息
-                                    comment.setString(new HSSFRichTextString(MessageUtils.message("excel.manyPeople")));
+                                    comment.setString(
+                                            wxCorpInfo.getSaasSyncContact()!=1? new HSSFRichTextString(MessageUtils.message("excel.manyPeople")):new HSSFRichTextString(MessageUtils.message("excel.manyPeoplePlus")));
                                     cell.setCellComment(comment);
                                     break;
                                 case "项目经理":
@@ -935,7 +939,8 @@ public class ProjectController {
                                     comment = drawing.createCellComment(anchor);
                                     // 输入批注信息
                                     //comment.setString(new HSSFRichTextString("项目经理需存在于参与人中"));
-                                    comment.setString(new HSSFRichTextString(MessageUtils.message("excel.projectManager")));
+                                    comment.setString(
+                                            wxCorpInfo.getSaasSyncContact()!=1?new HSSFRichTextString(MessageUtils.message("excel.projectManager")):new HSSFRichTextString(MessageUtils.message("excel.projectManagerPlus")));
                                     cell.setCellComment(comment);
                                     break;
                                 case "开始日期":

+ 86 - 82
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/WeiXinCorpController.java

@@ -136,6 +136,8 @@ public class WeiXinCorpController {
     private SysRoleFunctionService sysRoleFunctionService;
     @Resource
     private UserService userService;
+    @Resource
+    private CompanyReportMapper companyReportMapper;
     @Autowired
     RestTemplate restTemplate;
     @Resource
@@ -501,48 +503,56 @@ public class WeiXinCorpController {
             WXBizMsgCrypt wxcpt = new WXBizMsgCrypt(token, encodingAesKey, corpId);
             String sMsg = wxcpt.DecryptMsg(sReqMsgSig, sReqTimeStamp, sReqNonce, requestBody);
             log.info("解密后===msg: " + sMsg);
-            org.json.JSONObject jsonObject = XML.toJSONObject(sMsg);
-            if(jsonObject.has("Event") && ("subscribe".equals(jsonObject.getString("Event")))){
-                //成员关注应用事件,发生在该企业已经开通应用的情况下。
-                System.out.println("成员关注应用事件!");
-                String corpWxUserId = jsonObject.getString("FromUserName");
-                WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectById(corpId);
-                if (wxCorpInfo != null) {
-                    //企业存在,生成对应的用户
-                    Integer companyId = wxCorpInfo.getCompanyId();
-                    JSONObject userObj = getUserInfo(getCorpAccessToken(wxCorpInfo), corpWxUserId);
-                    SysRole defaultRole = sysRoleMapper.selectOne(new QueryWrapper<SysRole>().eq("company_id", companyId).eq("is_default", 1));
+            org.json.JSONObject jsonObject = XML.toJSONObject(sMsg).getJSONObject("xml");
+            if(jsonObject.has("Event")){
+                String event = jsonObject.getString("Event");
+                System.out.println("Event=="+event);
+                if (("subscribe".equals(event))) {
+                    //成员关注应用事件,发生在该企业已经开通应用的情况下。
+                    System.out.println("成员关注应用事件!");
+                    String corpWxUserId = jsonObject.getString("FromUserName");
+                    WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectById(corpId);
+                    if (wxCorpInfo != null && wxCorpInfo.getSaasSyncContact() == 1) {
+                        //企业存在,生成对应的用户
+                        Integer companyId = wxCorpInfo.getCompanyId();
+                        User user = wxCorpInfoService.generateUserInfo(companyId, corpWxUserId);
+
+                        new Thread(() -> {
+                            //查询详情进行更新
+                            JSONObject userObj = null;
+                            try {
+                                userObj = getUserInfo(getCorpAccessToken(wxCorpInfo), corpWxUserId);
+                            } catch (Exception exception) {
+                                exception.printStackTrace();
+                            }
+                            System.out.println("关注时获取详情userObj=="+userObj);
+                            //成功获取到通讯录的个人详情
+                            String userId = userObj.getString("userid");
+                            String openUserId = userObj.getString("open_userid");
+                            User userUpdate = new User();
+                            userUpdate.setId(user.getId());
+                            userUpdate.setName(userObj.getString("name"))
+                                    .setPhone(userObj.getString("mobile"))
+                                    .setCorpwxUserid(openUserId)
+                                    .setCorpwxRealUserid(userId)
+                                    .setJobNumber(openUserId.equals(userId)?null:userId);
 
-                    //成功获取到通讯录的个人详情
-                    Long id = SnowFlake.nextId();
-                    //通过getUserInfo接口获取到的json key是小写的
-                    JSONArray department = userObj.getJSONArray("department");
-                    Integer curUserWXDeptid = getMaxDeptIdFromArray(department);
-                    Department sysDept = departmentMapper.selectOne(new QueryWrapper<Department>().eq("company_id", companyId).eq("corpwx_deptid", curUserWXDeptid));
-                    String userId = userObj.getString("userid");
-                    String openUserId = userObj.getString("open_userid");
-                    int cnt = userMapper.selectCount(new QueryWrapper<User>().eq("corpwx_userid", openUserId));
-                    if (cnt == 0) {
-                        //用户不存在
-                        User user = new User()
-                                .setId(id.toString())
-                                .setRoleId(defaultRole.getId())
-                                .setRoleName(defaultRole.getRolename())
-                                .setName(userObj.getString("name"))
-                                .setPhone(userObj.getString("mobile"))
-                                .setPassword(MD5Util.getPassword("000000"))
-                                .setCorpwxUserid(openUserId)
-                                .setCorpwxRealUserid(corpWxUserId)
-                                .setJobNumber(openUserId.equals(userId)?null:userId)
-                                .setColor(ColorUtil.randomColor())
-                                .setCompanyId(companyId);
-                        if (sysDept != null) {
-                            user.setDepartmentId(sysDept.getDepartmentId());
-                            List<Department> allDeptList = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id", companyId));
-                            user.setDepartmentCascade(convertDepartmentIdToCascade(user.getDepartmentId(), allDeptList));
-                        }
-                        userMapper.insert(user);
+                            //通过getUserInfo接口获取到的json key是小写的
+                            JSONArray department = userObj.getJSONArray("department");
+                            Integer curUserWXDeptid = getMaxDeptIdFromArray(department);
+                            Department sysDept = departmentMapper.selectOne(new QueryWrapper<Department>().eq("company_id", companyId).eq("corpwx_deptid", curUserWXDeptid));
+
+                            if (sysDept != null) {
+                                userUpdate.setDepartmentId(sysDept.getDepartmentId());
+                                List<Department> allDeptList = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id", companyId));
+                                userUpdate.setDepartmentCascade(convertDepartmentIdToCascade(user.getDepartmentId(), allDeptList));
+                            }
+                            userMapper.updateById(userUpdate);
+                            System.out.println("======关注时更新人员======");
+                        }).start();
                     }
+                } else if ("enter_agent".equals(event)) {
+
                 }
             }
         } catch (Exception e) {
@@ -550,11 +560,10 @@ public class WeiXinCorpController {
             // 解密失败,失败原因请查看异常
             e.printStackTrace();
         }
+        System.out.println("dataCallback POST立即返回");
         return "success";
     }
 
-
-
     //通用开发回调处理
     @RequestMapping(value = "/commonDevCallback", method = RequestMethod.GET)
     @ResponseBody
@@ -635,56 +644,35 @@ public class WeiXinCorpController {
                         WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectById(corpId);
                         if (wxCorpInfo != null) {
                             Integer companyId = wxCorpInfo.getCompanyId();
-                            SysRole defaultRole = sysRoleMapper.selectOne(new QueryWrapper<SysRole>().eq("company_id", companyId).eq("is_default", 1));
-
                             if (wxCorpInfo.getSaasSyncContact() == 1) {
-                                //直接通过企业微信通讯录同步
+                                //先插入表,不然前端用户立马点击进入应用会找不到人,
+                                User user = wxCorpInfoService.generateUserInfo(companyId, authUserId);
+                                //查询详情进行更新
                                 JSONObject userObj = getUserInfo(getCorpAccessToken(wxCorpInfo), authUserId);
                                 System.out.println("userObj=="+userObj);
                                 //成功获取到通讯录的个人详情
-                                Long id = SnowFlake.nextId();
-                                //通过getUserInfo接口获取到的json key是小写的
-                                JSONArray department = userObj.getJSONArray("department");
-                                Integer curUserWXDeptid = getMaxDeptIdFromArray(department);
-                                Department sysDept = departmentMapper.selectOne(new QueryWrapper<Department>().eq("company_id", companyId).eq("corpwx_deptid", curUserWXDeptid));
                                 String userId = userObj.getString("userid");
                                 String openUserId = userObj.getString("open_userid");
-                                User user = new User()
-                                        .setId(id.toString())
-                                        .setRoleId(defaultRole.getId())
-                                        .setRoleName(defaultRole.getRolename())
-                                        .setName(userObj.getString("name"))
+                                User userUpdate = new User();
+                                userUpdate.setId(user.getId());
+                                userUpdate.setName(userObj.getString("name"))
                                         .setPhone(userObj.getString("mobile"))
-                                        .setPassword(MD5Util.getPassword("000000"))
                                         .setCorpwxUserid(openUserId)
                                         .setCorpwxRealUserid(userId)
-                                        .setJobNumber(openUserId.equals(userId)?null:userId)
-                                        .setColor(ColorUtil.randomColor())
-                                        .setCompanyId(companyId);
+                                        .setJobNumber(openUserId.equals(userId)?null:userId);
+
+                                //通过getUserInfo接口获取到的json key是小写的
+                                JSONArray department = userObj.getJSONArray("department");
+                                Integer curUserWXDeptid = getMaxDeptIdFromArray(department);
+                                Department sysDept = departmentMapper.selectOne(new QueryWrapper<Department>().eq("company_id", companyId).eq("corpwx_deptid", curUserWXDeptid));
+
                                 if (sysDept != null) {
-                                    user.setDepartmentId(sysDept.getDepartmentId());
+                                    userUpdate.setDepartmentId(sysDept.getDepartmentId());
                                     List<Department> allDeptList = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id", companyId));
-                                    user.setDepartmentCascade(convertDepartmentIdToCascade(user.getDepartmentId(), allDeptList));
-                                }
-                                Integer employeeCnt = userMapper.selectCount(new QueryWrapper<User>().eq("company_id", companyId).eq("is_active",1));
-                                Company company = companyMapper.selectOne(new QueryWrapper<Company>().eq("id", companyId));
-                                ContactSyncLog contactSyncLog = new ContactSyncLog();
-                                contactSyncLog.setCompanyId(companyId);
-                                System.err.println("企业微信自动同步新增人员日志记录===============================");
-                                if (employeeCnt + 1 > company.getStaffCountMax()){
-                                    contactSyncLog.setResult(0);
-                                    //contactSyncLog.setMsg("公司人员已达上限,请联系客服提高人数上限。");
-                                    contactSyncLog.setMsg(MessageUtils.message("wx.employeeFull"));
-                                    System.err.println("日志信息:"+ contactSyncLog.toString());
-                                    contactSyncLogMapper.insert(contactSyncLog);
-                                }else {
-                                    userMapper.insert(user);
-                                    contactSyncLog.setResult(1);
-                                    //contactSyncLog.setMsg("同步成功");
-                                    contactSyncLog.setMsg(MessageUtils.message("wx.synSuccess"));
-                                    System.err.println("日志信息:"+ contactSyncLog.toString());
-                                    contactSyncLogMapper.insert(contactSyncLog);
+                                    userUpdate.setDepartmentCascade(convertDepartmentIdToCascade(user.getDepartmentId(), allDeptList));
                                 }
+                                userMapper.updateById(userUpdate);
+                                System.out.println("======更新人员======");
                             }
                         }
                     }
@@ -1422,6 +1410,14 @@ public class WeiXinCorpController {
                         projectAuditor.setAuditorName(user.getName());
                         projectAuditor.setProjectId(project.getId());
                         projectAuditorMapper.insert(projectAuditor);
+                        //todo: 生成项目报表服务默认条目
+                        Integer[] arrayInteger=new Integer[]{1,2,3,4,7};
+                        for (Integer integerItem : arrayInteger) {
+                            CompanyReport companyReport=new CompanyReport();
+                            companyReport.setCompanyId(company.getId());
+                            companyReport.setReportFormId(integerItem);
+                            companyReportMapper.insert(companyReport);
+                        }
                         //todo: 生成初始项目相关示例任务分组/任务阶段以及示例任务
                         TaskGroup taskGroup = new TaskGroup();
                         taskGroup.setProjectId(project.getId())
@@ -3346,6 +3342,14 @@ public class WeiXinCorpController {
                         setting.setCompanyId(company.getId());
                         projectBasecostSettingMapper.insert(setting);
                     }
+                    //todo: 生成项目报表服务默认条目
+                    Integer[] arrayInteger=new Integer[]{1,2,3,4,7};
+                    for (Integer integerItem : arrayInteger) {
+                        CompanyReport companyReport=new CompanyReport();
+                        companyReport.setCompanyId(company.getId());
+                        companyReport.setReportFormId(integerItem);
+                        companyReportMapper.insert(companyReport);
+                    }
                     String accessToken = getCorpConcactAccessToken(wxCorpInfo);
                     //获取组织架构 同步部门
                     String departmentInfoResp=wxCorpInfoService.getDepartmentInfoWithApplication(accessToken);
@@ -3452,7 +3456,7 @@ public class WeiXinCorpController {
                                 //跳过非激活状态的员工
                                 if (userInfoOb.getInteger("status") != 1) continue;
                                 String userName = String.valueOf(userInfoOb.get("name"));
-                                String phone = String.valueOf(userInfoOb.get("phone"));
+//                                String phone = String.valueOf(userInfoOb.get("phone"));
                                 String openUserid = userInfoOb.getString("open_userid");
                                 List<Integer> departments = (List<Integer>) userInfoOb.get("department");
                                 Integer deptId = departments.get(0);
@@ -3475,7 +3479,7 @@ public class WeiXinCorpController {
                                     .setName(userName)
                                     .setRoleName(role.getRolename())
                                     .setRoleId(role.getId())
-                                    .setPhone(phone)
+//                                    .setPhone(phone)
                                     .setCorpwxRealUserid(corpWxuserid)
                                     .setColor(ColorUtil.randomColor())
                                     .setPassword(MD5Util.getPassword("000000"))

+ 6 - 3
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/Department.java

@@ -1,5 +1,6 @@
 package com.management.platform.entity;
 
+import com.baomidou.mybatisplus.annotation.FieldStrategy;
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.extension.activerecord.Model;
 import com.baomidou.mybatisplus.annotation.TableId;
@@ -15,7 +16,7 @@ import lombok.experimental.Accessors;
  * </p>
  *
  * @author Seyason
- * @since 2022-11-28
+ * @since 2022-07-14
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -51,21 +52,23 @@ public class Department extends Model<Department> {
     /**
      * 部门负责人id
      */
-    @TableField("manager_id")
+    @TableField(value = "manager_id", updateStrategy = FieldStrategy.IGNORED)
     private String managerId;
 
     /**
      * 日报导入审核人
      */
-    @TableField("report_audit_userid")
+    @TableField(value = "report_audit_userid", updateStrategy = FieldStrategy.IGNORED)
     private String reportAuditUserid;
 
+
     /**
      * 企业微信的部门id
      */
     @TableField("corpwx_deptid")
     private Integer corpwxDeptid;
 
+
     /**
      * 企业微信部门的父部门id
      */

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

@@ -3,6 +3,7 @@ package com.management.platform.service;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.management.platform.entity.LeaveSheet;
+import com.management.platform.entity.User;
 import com.management.platform.entity.WxCorpInfo;
 import com.management.platform.util.HttpRespMsg;
 
@@ -52,4 +53,6 @@ public interface WxCorpInfoService extends IService<WxCorpInfo> {
     HttpRespMsg initSuperManager(String corpid, String name);
 
     String getUserInfoWithDepartment(String accessToken, Integer wxDeptid);
+
+    User generateUserInfo(Integer companyId, String corpwxOpenId);
 }

+ 18 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/DingDingServiceImpl.java

@@ -128,6 +128,8 @@ public class DingDingServiceImpl implements DingDingService {
     private DdCallbackMapper ddCallbackMapper;
     @Resource
     private ContactSyncLogMapper contactSyncLogMapper;
+    @Resource
+    private CompanyReportMapper companyReportMapper;
 
 
     @Value("${configEnv.isPrivateDeploy}")
@@ -182,6 +184,14 @@ public class DingDingServiceImpl implements DingDingService {
                     setting.setCompanyId(company.getId());
                     projectBasecostSettingMapper.insert(setting);
                 }
+                //todo: 生成项目报表服务默认条目
+                Integer[] arrayInteger=new Integer[]{1,2,3,4,7};
+                for (Integer integerItem : arrayInteger) {
+                    CompanyReport companyReport=new CompanyReport();
+                    companyReport.setCompanyId(company.getId());
+                    companyReport.setReportFormId(integerItem);
+                    companyReportMapper.insert(companyReport);
+                }
                 //生成费用报销默认条目
                 String[] expenseTypes = Constant.EXPENSE_TYPES;
                 List<String> commonly = new ArrayList<>();
@@ -298,6 +308,14 @@ public class DingDingServiceImpl implements DingDingService {
                 setting.setCompanyId(company.getId());
                 projectBasecostSettingMapper.insert(setting);
             }
+            //todo: 生成项目报表服务默认条目
+            Integer[] arrayInteger=new Integer[]{1,2,3,4,7};
+            for (Integer integerItem : arrayInteger) {
+                CompanyReport companyReport=new CompanyReport();
+                companyReport.setCompanyId(company.getId());
+                companyReport.setReportFormId(integerItem);
+                companyReportMapper.insert(companyReport);
+            }
         }
 
 

+ 8 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java

@@ -4492,7 +4492,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
 
     //递归获取企业微信所有上级部门字符串,格式:"上级部门/上级部门/部门"
     private String getWxDepartment(Department department) {
-        String depHierarchy = "$departmentName="+department.getCorpwxDeptid()+"$";
+        String depHierarchy = department.getCorpwxDeptid().toString();
         //搜到父部门进行添加
         if (department.getCorpwxDeptpid()==null || department.getCorpwxDeptpid()==1) {
             return depHierarchy;
@@ -6312,6 +6312,13 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
             start=null;
         }
         List<Map<String,Object>>  list=projectMapper.getWaitingReviewList(stateKey,user.getCompanyId(),userId,start,size,startDate,endDate,departmentId,deptIds);
+        WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", user.getCompanyId()));
+        for (Map<String, Object> map : list) {
+            if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                String wxDeptName = map.get("wxDeptId") == null ? "" : map.get("wxDeptId").toString();
+                map.put("departmentName",wxDeptName);
+            }
+        }
         long total=projectMapper.findCount(stateKey,user.getCompanyId(),userId,null,null,startDate,endDate,departmentId,deptIds);
         HashMap map=new HashMap();
         map.put("total",total);

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

@@ -122,6 +122,10 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
     TimeTypeMapper timeTypeMapper;
     @Resource
     SysRoleMapper sysRoleMapper;
+    @Resource
+    CompanyMapper companyMapper;
+    @Resource
+    ContactSyncLogMapper contactSyncLogMapper;
 
 
     //获取服务商provider_access_token
@@ -328,13 +332,6 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
             HttpHeaders headers = new HttpHeaders();
             ResponseEntity<byte[]> entity = restTemplate.exchange(url, HttpMethod.GET, new HttpEntity<>(headers), byte[].class);
             byte[] body = entity.getBody();
-            HttpHeaders respHeader = entity.getHeaders();
-            System.out.println("================开始处理文件==========body size=" + body.length);
-            System.out.println(respHeader.getContentType());
-            System.out.println(respHeader.getContentLength());
-            System.out.println(respHeader.getContentDisposition().getName());
-            ContentDisposition contentDisposition = respHeader.getContentDisposition();
-            System.out.println("文件名==" + contentDisposition.getFilename());
             //写入文件
             String fileName = mediaId + ".jpg";
             FileOutputStream fileOutputStream = new FileOutputStream(new File(path + fileName));
@@ -590,6 +587,49 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
         return result;
     }
 
+    @Override
+    public synchronized User generateUserInfo(Integer companyId, String corpwxOpenId) {
+        User find = userMapper.selectOne(new QueryWrapper<User>().eq("company_id", companyId).eq("corpwx_userid", corpwxOpenId));
+        if (find == null) {
+            SysRole defaultRole = sysRoleMapper.selectOne(new QueryWrapper<SysRole>().eq("company_id", companyId).eq("is_default", 1));
+            Long id = SnowFlake.nextId();
+            User user = new User()
+                    .setId(id.toString())
+                    .setRoleId(defaultRole.getId())
+                    .setRoleName(defaultRole.getRolename())
+                    .setName(corpwxOpenId)
+                    .setPassword(MD5Util.getPassword("000000"))
+                    .setCorpwxUserid(corpwxOpenId)
+                    .setColor(ColorUtil.randomColor())
+                    .setCompanyId(companyId);
+            Integer employeeCnt = userMapper.selectCount(new QueryWrapper<User>().eq("company_id", companyId).eq("is_active",1));
+            Company company = companyMapper.selectOne(new QueryWrapper<Company>().eq("id", companyId));
+            ContactSyncLog contactSyncLog = new ContactSyncLog();
+            contactSyncLog.setCompanyId(companyId);
+            System.err.println("企业微信自动同步新增人员日志记录===============================");
+            if (employeeCnt + 1 > company.getStaffCountMax()){
+                contactSyncLog.setResult(0);
+                //contactSyncLog.setMsg("公司人员已达上限,请联系客服提高人数上限。");
+                contactSyncLog.setMsg(MessageUtils.message("wx.employeeFull"));
+                System.err.println("日志信息:"+ contactSyncLog.toString());
+                contactSyncLogMapper.insert(contactSyncLog);
+                user.setIsActive(0);//先同步过来,但是停用
+                userMapper.insert(user);
+            }else {
+                userMapper.insert(user);
+                contactSyncLog.setResult(1);
+                //contactSyncLog.setMsg("同步成功");
+                contactSyncLog.setMsg(MessageUtils.message("wx.synSuccess"));
+                System.err.println("日志信息:"+ contactSyncLog.toString());
+                contactSyncLogMapper.insert(contactSyncLog);
+            }
+            System.out.println("插入人员成功");
+            find = user;
+        }
+        System.out.println("返回find == "+find);
+        return find;
+    }
+
 
     public void reqPunchRecord(WxCorpInfo corpInfo, long startTime, long endTime, Object[] objects, boolean showLog,String userId,LocalDate date)throws Exception {
         DateTimeFormatter mdFormat = DateTimeFormatter.ofPattern("yyyy/M/d");
@@ -652,16 +692,7 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
                     UserCorpwxTime userCorpwxTime=new UserCorpwxTime();
                     userCorpwxTime.setCorpwxUserid((String) objects[i]);
                     userCorpwxTime.setCompanyId(corpInfo.getCompanyId());
-                    for (Integer integer : upList) {
-                        if(objects[i].equals("woy9TkCAAArkpTq76GOJYsbYGgzk1g1w")){
-                            System.out.println("上班"+DateTimeUtil.getTimeFromSeconds(integer));
-                        }
-                    }
-                    for (Integer integer : downList) {
-                        if(objects[i].equals("woy9TkCAAArkpTq76GOJYsbYGgzk1g1w")){
-                            System.out.println("下班"+DateTimeUtil.getTimeFromSeconds(integer));
-                        }
-                    }
+
                     System.out.println(upList);
                     System.out.println(downList);
                     if(upList.isEmpty()||downList.isEmpty()){
@@ -685,7 +716,11 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
                     userCorpwxTime.setWeekDayTxt(DateTimeUtil.getWeekDayTxt(userCorpwxTime.getWeekDay()));
                     BigDecimal bigDecimal=new BigDecimal(Duration.between(LocalTime.parse(minTime,df).plusHours(8),LocalTime.parse(maxTime,df).plusHours(8)).toMinutes());
                     bigDecimal=bigDecimal.divide(BigDecimal.valueOf(60),0,BigDecimal.ROUND_HALF_UP).subtract(new BigDecimal(restTime));
-                    userCorpwxTime.setWorkHours(bigDecimal.doubleValue());
+                    double time = bigDecimal.doubleValue();
+                    if (time < 0) {
+                        time = 0;
+                    }
+                    userCorpwxTime.setWorkHours(time);
                     System.out.println(userCorpwxTime);
                     UserCorpwxTime item;
                     if(userId!=null){

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

@@ -215,7 +215,7 @@ public class TimingTask {
         List<LeaveSheet> leaveSheetList=new ArrayList<>();
         List<BusinessTrip> businessTripList=new ArrayList<>();
         //Todo: 获取打卡数据
-        HttpRespMsg workDataMsg = dockWithMLD.getResult("http://10.1.10.41:20170/api/cube/restful/interface/getModeDataPageList/getWorkData", jsonString);
+        HttpRespMsg workDataMsg = dockWithMLD.getResult("http://10.1.10.51:20175/api/cube/restful/interface/getModeDataPageList/getWorkData", jsonString);
         List<Map<String,Object>> workDataList= (List<Map<String, Object>>) workDataMsg.data;
         for (Map<String, Object> map : workDataList) {
             UserFvTime userFvTime=new UserFvTime();
@@ -246,10 +246,10 @@ public class TimingTask {
             userFvTimeService.saveOrUpdateBatch(userFvTimeList);
         }
         //Todo: 获取请假数据
-        HttpRespMsg leaveRecordMsg = dockWithMLD.getResult("http://10.1.10.41:20170/api/cube/restful/interface/getModeDataPageList/getLeaveRecord", jsonString);
+        HttpRespMsg leaveRecordMsg = dockWithMLD.getResult("http://10.1.10.51:20175/api/cube/restful/interface/getModeDataPageList/getLeaveRecord", jsonString);
         List<Map<String,Object>> leaveRecordList= (List<Map<String, Object>>) leaveRecordMsg.data;
         for (Map<String, Object> map : leaveRecordList) {
-            User user = userMapper.selectOne(new QueryWrapper<User>().eq("job_number", map.get("userId")));
+            User user = userMapper.selectOne(new QueryWrapper<User>().eq("job_number", map.get("rybh")));
             if(user==null){
                 continue;
             }
@@ -284,10 +284,10 @@ public class TimingTask {
             leaveSheetService.saveOrUpdateBatch(leaveSheetList);
         }
         //Todo: 获取出差数据
-        HttpRespMsg travelRecordMsg = dockWithMLD.getResult("http://10.1.10.41:20170/api/cube/restful/interface/getModeDataPageList/getTravelRecord", jsonString);
+        HttpRespMsg travelRecordMsg = dockWithMLD.getResult("http://10.1.10.51:20175/api/cube/restful/interface/getModeDataPageList/getTravelRecord", jsonString);
         List<Map<String,Object>> travelRecordList= (List<Map<String, Object>>) travelRecordMsg.data;
         for (Map<String, Object> map : travelRecordList) {
-            User user = userMapper.selectOne(new QueryWrapper<User>().eq("job_number", map.get("userId")));
+            User user = userMapper.selectOne(new QueryWrapper<User>().eq("job_number", map.get("rybh")));
             if(user==null){
                 continue;
             }

+ 21 - 3
fhKeeper/formulahousekeeper/management-platform/src/main/resources/i18n/messages.properties

@@ -536,8 +536,10 @@ fileName.leaveRemaining = 假期剩余表
 #excel
 excel.publicProject=是否为公共项目
 excel.projectName=项目名称必填
-excel.manyPeople=多个参与人使用中文逗号(,)隔开
-excel.projectManager=项目经理需存在于参与人中
+excel.manyPeople=多个参与人(“姓名/工号”)使用中文逗号(,)隔开
+excel.manyPeoplePlus=多个参与人(“工号”)使用中文逗号(,)隔开
+excel.projectManager=项目经理(“姓名/工号”)需存在于参与人中
+excel.projectManagerPlus=项目经理(“姓名/工号”)需存在于参与人中
 excel.projectCharge=负责人需存在于参与人中
 excel.dateFormat=日期格式:yyyy-MM-dd
 excel.forExample=例如: 2021-01-01
@@ -734,4 +736,20 @@ week.Wednesday=周三
 week.Thursday=周四
 week.Friday=周五
 week.Saturday=周六
-week.Sunday=周日
+week.Sunday=周日
+#合同
+contract.business= 买卖合同
+contract.gift= 赠与合同
+contract.lease= 租赁合同
+contract.loan= 借款合同
+contract.warehousing= 仓储合同
+contract.entrust= 委托合同
+contract.name = 合同名称
+contract.type = 合同类型
+contract.export = 合同_
+contract.addSuc = 添加成功
+contract.editSuc = 修改成功
+contract.operationSuc = 操作成功
+contract.numberRepeat = 合同编号已存在
+contract.typeNameEmpty = 合同类型名不可为空
+contract.typeNameRepeat = 合同类型名已存在

+ 21 - 3
fhKeeper/formulahousekeeper/management-platform/src/main/resources/i18n/messages_en_US.properties

@@ -536,8 +536,10 @@ fileName.leaveRemaining = Leave Remaining Table
 #excel
 excel.publicProject=Whether it is a public project
 excel.projectName=Project name is required
-excel.manyPeople=Multiple participants are separated by commas (,)
-excel.projectManager=The project manager must exist in the participants
+excel.manyPeople=Multiple participants ("name/jobNumber") are separated by commas (,)
+excel.manyPeoplePlus=Multiple participants ("jobNumber") are separated by commas (,)
+excel.projectManager=The project manager ("name/jobNumber") must exist in the participants
+excel.projectManagerPlus=The project manager ("jobNumber") must exist in the participants
 excel.projectCharge=The person in charge must exist in the participants
 excel.dateFormat=Date Format:yyyy-MM-dd
 excel.forExample=for example: 2021-01-01
@@ -734,4 +736,20 @@ week.Wednesday=Wednesday
 week.Thursday=Thursday
 week.Friday=Friday
 week.Saturday=Saturday
-week.Sunday=Sunday
+week.Sunday=Sunday
+#合同
+contract.business= business contract
+contract.gift= Gift contract
+contract.lease= Lease contract
+contract.loan= Loan contract
+contract.warehousing= Warehousing contract
+contract.entrust= Entrustment contract
+contract.name = name
+contract.type = type
+contract.export = contract_
+contract.addSuc = Successfully added
+contract.editSuc = Modification succeeded
+contract.operationSuc = Operation succeeded
+contract.numberRepeat = Contract No. already exists
+contract.typeNameEmpty = Contract type name cannot be empty
+contract.typeNameRepeat = Contract type name already exists

+ 94 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/DepartmentMapper.xml

@@ -18,5 +18,99 @@
     <sql id="Base_Column_List">
         department_id, department_name, superior_id, company_id, manager_id, report_audit_userid, corpwx_deptid, corpwx_deptpid
     </sql>
+    <!--根据部门获取成本-->
+    <select id="getCostByDepartment" resultType="java.util.Map">
+        SELECT SUM(b.working_time) AS time, SUM(b.cost) AS money
+        FROM report AS b
+        WHERE b.state = 1
+        <if test="departmentIds != null and departmentIds.size()>0">
+            AND b.dept_id IN
+            <foreach collection="departmentIds" item="departmentId" index="index" open="(" close=")" separator=",">
+                #{departmentId}
+            </foreach>
+        </if>
+        <if test="startDate != null and endDate != null">
+            AND b.create_date between #{startDate} and #{endDate}
+        </if>
+    </select>
 
+    <!--根据人员获取成本-->
+    <select id="getCostByUser" resultType="java.util.Map">
+        SELECT a.id as id, a.name AS user,a.corpwx_userid as corpwxUserId, a.job_number as jobNumber, c.project_name AS project, SUM(b.working_time) AS time, SUM(b.cost) AS
+        money
+        FROM user AS a
+        LEFT JOIN report AS b ON a.id = b.creator_id
+        LEFT JOIN project AS c ON b.project_id = c.id
+        WHERE b.state = 1
+        <if test="departmentIds != null and departmentIds.size()>0">
+            AND b.dept_id IN
+            <foreach collection="departmentIds" item="departmentId" index="index" open="(" close=")" separator=",">
+                #{departmentId}
+            </foreach>
+        </if>
+        <if test="userIds != null">
+            AND a.id IN
+            <foreach collection="userIds" item="userId" index="index" open="(" close=")" separator=",">
+                #{userId}
+            </foreach>
+        </if>
+        <if test="companyId != null">
+            AND a.company_id = #{companyId}
+        </if>
+        <if test="startDate != null and endDate != null">
+            AND b.create_date between #{startDate} and #{endDate}
+        </if>
+        GROUP BY b.project_id, a.id order by a.department_id
+    </select>
+
+    <!-- 根据人员获取自定义的日报数值 -->
+    <select id="getCustomDataByUser" resultType="java.util.Map">
+        SELECT a.id as id, a.name AS user,a.corpwx_userid as corpwxUserid, a.job_number as jobNumber,c.project_name AS project, IFNULL(SUM(b.custom_data),0) AS cost
+        FROM user AS a
+        LEFT JOIN report AS b ON a.id = b.creator_id
+        LEFT JOIN project AS c ON b.project_id = c.id
+        WHERE b.state = 1
+        <if test="departmentIds != null">
+            AND a.department_id IN
+            <foreach collection="departmentIds" item="departmentId" index="index" open="(" close=")" separator=",">
+                #{departmentId}
+            </foreach>
+        </if>
+        <if test="userIds != null">
+            AND a.id IN
+            <foreach collection="userIds" item="userId" index="index" open="(" close=")" separator=",">
+                #{userId}
+            </foreach>
+        </if>
+        <if test="companyId != null">
+            AND a.company_id = #{companyId}
+        </if>
+        <if test="startDate != null and endDate != null">
+            AND b.create_date between #{startDate} and #{endDate}
+        </if>
+        GROUP BY b.project_id, a.id
+        having IFNULL(SUM(b.custom_data),0) > 0
+    </select>
+    <!-- 根据部门获取自定义的日报数值 -->
+    <select id="getDeptCustomDataStatistic" resultType="java.util.Map">
+        SELECT a.department_id as id, a.department_name AS department, c.project_name AS project, IFNULL(SUM(b.custom_data),0) AS cost
+        FROM department AS a
+        LEFT JOIN report AS b ON a.department_id = b.dept_id
+        LEFT JOIN project AS c ON b.project_id = c.id
+        WHERE b.state = 1
+        <if test="companyId!=null">
+            AND a.company_id =#{companyId}
+        </if>
+        <if test="departmentIds != null">
+            AND a.department_id IN
+            <foreach collection="departmentIds" item="departmentId" index="index" open="(" close=")" separator=",">
+                #{departmentId}
+            </foreach>
+        </if>
+        <if test="startDate!=null and endDate!=null">
+            AND b.create_date between #{startDate} and #{endDate}
+        </if>
+        GROUP BY b.project_id, a.department_id
+        having IFNULL(SUM(b.custom_data),0) > 0
+    </select>
 </mapper>

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

@@ -848,7 +848,7 @@
     <select id="getWaitingReviewList" resultType="java.util.Map">
         <choose>
             <when test="stateKey==0">
-                SELECT 	dept_manager.name as userName,`user`.corpwx_userid as corpwxUserId,department.department_name as departmentName,COUNT(1) as num
+                SELECT 	dept_manager.name as userName,`user`.corpwx_userid as corpwxUserId,department.department_name as departmentName,department.corpwx_deptid as wxDeptId,COUNT(1) as num
                 FROM report AS a
                 left join user on user.id = a.creator_id
                 JOIN project AS b ON a.project_id=b.id

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

@@ -356,7 +356,7 @@
                         <!--批量填报和批量代填不显示考勤记录-->
                         <span v-if="!isBatch && (user.timeType.syncDingding==1 || user.timeType.syncCorpwxTime==1)&&!workForm.time" >{{$t('other.noAttendanceRecord')}}</span>
                         <el-button type="default" style="margin-left:5px;" size="mini" :loading="syncTimeLoading" 
-                        v-if="!isBatch && user.timeType.syncCorpwxTime==1 && (workForm.createDate == today || !workForm.time || workForm.time.workHours == 0)" icon="el-icon-refresh" 
+                        v-if="!isBatch && user.timeType.syncCorpwxTime==1 && (workForm.createDate == today || !workForm.time || workForm.time.workHours <= 0)" icon="el-icon-refresh" 
                                 @click="refreshWXCardTime(workForm.createDate)"></el-button>
                     </el-form-item>
                     <!-- 000000 -->

+ 1 - 1
fhKeeper/formulahousekeeper/timesheet_h5/src/views/edit/index.vue

@@ -19,7 +19,7 @@
                     </div>
                 </template>
                 <template #right-icon>
-                    <van-button icon="replay" native-type="button" type="default" size="mini" style="height:0.6rem;padding:0 0.16667rem;" :loading="cardRefLoading" loading-size="0.26667rem" @click.stop.native="cardtimeRefresh(form.createDate)" v-if="user.timeType.syncCorpwxTime==1 && (form.createDate == today || !report.time || report.time.workHours == 0) && (user.timeType.syncDingding == 1 || user.timeType.syncCorpwxTime == 1)"></van-button>
+                    <van-button icon="replay" native-type="button" type="default" size="mini" style="height:0.6rem;padding:0 0.16667rem;" :loading="cardRefLoading" loading-size="0.26667rem" @click.stop.native="cardtimeRefresh(form.createDate)" v-if="user.timeType.syncCorpwxTime==1 && (form.createDate == today || !report.time || report.time.workHours <= 0) && (user.timeType.syncDingding == 1 || user.timeType.syncCorpwxTime == 1)"></van-button>
                 </template>
             </van-cell>
                 <!-- <div v-if="report.time" class="attendanceRecord">