Ver código fonte

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

ggooalice 2 anos atrás
pai
commit
a61c096ffb
23 arquivos alterados com 613 adições e 70 exclusões
  1. 50 8
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectController.java
  2. 21 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectSeparateController.java
  3. 12 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProviderInfoController.java
  4. 23 18
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/WeiXinCorpController.java
  5. 3 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/Project.java
  6. 82 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/ProjectSeparate.java
  7. 4 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/User.java
  8. 7 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/WxCorpInfo.java
  9. 3 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ProjectMapper.java
  10. 16 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ProjectSeparateMapper.java
  11. 16 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ProjectSeparateService.java
  12. 4 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ProjectService.java
  13. 20 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectSeparateServiceImpl.java
  14. 196 32
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java
  15. 55 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectMapper.xml
  16. 21 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectSeparateMapper.xml
  17. 2 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/WxCorpInfoMapper.xml
  18. 2 0
      fhKeeper/formulahousekeeper/timesheet/src/permissions.js
  19. 1 0
      fhKeeper/formulahousekeeper/timesheet/src/views/centerManage/centerManage.vue
  20. 1 1
      fhKeeper/formulahousekeeper/timesheet/src/views/leave/list.vue
  21. 1 1
      fhKeeper/formulahousekeeper/timesheet/src/views/project/cost.vue
  22. 60 2
      fhKeeper/formulahousekeeper/timesheet/src/views/project/list.vue
  23. 13 2
      fhKeeper/formulahousekeeper/timesheet/src/views/team/index.vue

+ 50 - 8
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectController.java

@@ -3,10 +3,7 @@ package com.management.platform.controller;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.management.platform.entity.*;
-import com.management.platform.mapper.CompanyMapper;
-import com.management.platform.mapper.ProjectLevelMapper;
-import com.management.platform.mapper.ProviderCategoryMapper;
-import com.management.platform.mapper.TimeTypeMapper;
+import com.management.platform.mapper.*;
 import com.management.platform.service.ProjectService;
 import com.management.platform.util.HttpRespMsg;
 import org.apache.poi.hssf.usermodel.*;
@@ -55,6 +52,8 @@ public class ProjectController {
     private TimeTypeMapper timeTypeMapper;
     @Resource
     private ProjectLevelMapper projectLevelMapper;
+    @Resource
+    private ProjectStageMapper projectStageMapper;
 
     /**
      * 获取我参与的全部项目的负责人列表
@@ -125,12 +124,13 @@ public class ProjectController {
                                    String projectDesc,
                                    Integer projectMainId,
                                    String providerIds,
-                                   String providerNames
+                                   String providerNames,
+                                   ProjectSeparate projectSeparate
                                    ) {
         return projectService.editProject(id, name, code, userId, inchargerId, isPublic, planStartDate, planEndDate, level, contractAmount,
                 projectBaseCostData,
                  budget,customerId,chosenLeaders, associateDegrees, associateDegreeNames,
-                taskGpIncharge,auditUserIds, category, projectDesc,projectMainId, providerIds, providerNames, request);
+                taskGpIncharge,auditUserIds, category, projectDesc,projectMainId, providerIds, providerNames, request,projectSeparate);
     }
 
     @RequestMapping("/adjustBase")
@@ -582,6 +582,7 @@ public class ProjectController {
         HttpRespMsg msg = new HttpRespMsg();
         List<String> heads = new ArrayList<>();
         Company company = companyMapper.selectById(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));
         List<String> collect = providerCategoryList.stream().distinct().map(pc -> pc.getProviderCategoryName()).collect(Collectors.toList());
@@ -590,6 +591,9 @@ public class ProjectController {
             heads.add("主项目");
         }
         heads.add("项目编号");
+        if(company.getId()==936){
+            heads.add("合同编号");
+        }
         if(timeType.getMainProjectState()!=1){
             heads.add("项目分类");
         }
@@ -612,6 +616,15 @@ public class ProjectController {
         heads.add("开始日期");
         heads.add("截止日期");
         heads.add("合同金额");
+        if(company.getId()==936){
+            heads.add("质保开始时间");
+            heads.add("质保截止时间");
+            heads.add("项目类别");
+            heads.add("所属大区");
+            heads.add("所属BU");
+            heads.add("项目状态");
+            heads.add("项目阶段");
+        }
         List<List<String>> allList = new ArrayList<>();
         allList.add(heads);
         String title = company.getCompanyName()+"_项目导入模板";
@@ -804,7 +817,36 @@ public class ProjectController {
                                             "例如: 2021-01-01"));
                                     cell.setCellComment(comment);
                                     break;
-
+                                case "项目状态":
+                                    // 加载下拉列表内容
+                                    textList= new String[]{"全部", "进行中", "已完成", "已撤销", "暂停"};
+                                    constraint = DVConstraint
+                                            .createExplicitListConstraint(textList);
+                                    // 设置数据有效性加载在哪个单元格上,四个参数分别是:起始行、终止行、起始列、终止列
+                                    regions = new CellRangeAddressList(1,
+                                            1000, i, i);
+                                    // 数据有效性对象
+                                    data_validation_list = new HSSFDataValidation(
+                                            regions, constraint);
+                                    sheet.addValidationData(data_validation_list);
+                                    break;
+                                case "项目阶段":
+                                    // 加载下拉列表内容
+                                    List<String> list = projectStageList.stream().map(pc -> pc.getProjectStageName()).collect(Collectors.toList());
+                                    textList= new String[list.size()];
+                                    for (int i1 = 0; i1 < list.size(); i1++) {
+                                        textList[i1]=list.get(i1);
+                                    }
+                                    constraint = DVConstraint
+                                            .createExplicitListConstraint(textList);
+                                    // 设置数据有效性加载在哪个单元格上,四个参数分别是:起始行、终止行、起始列、终止列
+                                    regions = new CellRangeAddressList(1,
+                                            1000, i, i);
+                                    // 数据有效性对象
+                                    data_validation_list = new HSSFDataValidation(
+                                            regions, constraint);
+                                    sheet.addValidationData(data_validation_list);
+                                    break;
                             }
                         }else {
                             cell.setCellStyle(cellStyle);
@@ -853,7 +895,7 @@ public class ProjectController {
     }
     @RequestMapping("/getTimeCostByGroup")
     public HttpRespMsg getTimeCostByGroup(String startDate,String endDate,Integer pageIndex,Integer pageSize,Integer groupId,Integer projectId){
-        return projectService.getTimeCostByGroup(startDate,endDate,pageIndex,pageSize,groupId,projectId);
+        return projectService.getTimeCostByGroup(startDate,endDate,pageIndex,pageSize,groupId,projectId,request);
     }
 }
 

+ 21 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectSeparateController.java

@@ -0,0 +1,21 @@
+package com.management.platform.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-07-29
+ */
+@RestController
+@RequestMapping("/project-separate")
+public class ProjectSeparateController {
+
+}
+

+ 12 - 2
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProviderInfoController.java

@@ -178,14 +178,24 @@ public class ProviderInfoController {
 
 
     @RequestMapping("/list")
-    public HttpRespMsg list(@RequestParam Integer pageIndex, @RequestParam Integer pageSize, String keyword) {
+    public HttpRespMsg list(@RequestParam Integer pageIndex, @RequestParam Integer pageSize, String keyword, String sortProp, Integer sortOrder) {
         HttpRespMsg msg = new HttpRespMsg();
         String token = request.getHeader("TOKEN");
         User user = userMapper.selectById(token);
-        QueryWrapper<ProviderInfo> queryWrapper = new QueryWrapper<ProviderInfo>().eq("company_id", user.getCompanyId()).orderByDesc("id");
+        QueryWrapper<ProviderInfo> queryWrapper = new QueryWrapper<ProviderInfo>().eq("company_id", user.getCompanyId());
         if (!StringUtils.isEmpty(keyword)) {
             queryWrapper.like("provider_name", keyword);
         }
+        if (StringUtils.isEmpty(sortProp)) {
+            queryWrapper.orderByDesc("id");
+        } else {
+            if (sortOrder == 0) {
+                //降序
+                queryWrapper.orderByDesc(sortProp);
+            } else {
+                queryWrapper.orderByAsc(sortProp);
+            }
+        }
         IPage<ProviderInfo> projectIPage = providerInfoMapper.selectPage(new Page<>(pageIndex, pageSize),
                 queryWrapper);
         List<ProviderInfo> list = projectIPage.getRecords();

+ 23 - 18
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/WeiXinCorpController.java

@@ -33,10 +33,11 @@ import java.util.stream.Collectors;
 @Slf4j
 public class WeiXinCorpController {
     //中转的服务器获取部门详情
-    public static final String TRANSMIT_SERVER_GET_DEPTDETAIL = "http://47.101.180.183:10010/wxcorp/getCorpDeptDetail?accessToken=ACCESS_TOKEN&deptId=DEPTID";
-    public static final String TRANSMIT_SERVER_GET_DEPTMEMBDETAIL = "http://47.101.180.183:10010/wxcorp/getDeptUserDetail?accessToken=ACCESS_TOKEN&deptId=DEPTID";
-    public static final String TRANSMIT_SERVER_GET_CONTACT_TOKEN = "http://47.101.180.183:10010/wxcorp/getCorpConcactAccessToken?corpid=CORPID&contactSecret=CONTACT_SECRET";
-    public static final String TRANSMIT_SERVER_GET_USERDETAIL = "http://47.101.180.183:10010/wxcorp/getUserInfoFromTranServer?accessToken=ACCESS_TOKEN&userId=USERID&deptId=DEPTID";
+    public static final String TRANSMIT_SERVER_STR = "SERVER_IP_PORT";
+    public static final String TRANSMIT_SERVER_GET_DEPTDETAIL = "http://SERVER_IP_PORT/wxcorp/getCorpDeptDetail?accessToken=ACCESS_TOKEN&deptId=DEPTID";
+    public static final String TRANSMIT_SERVER_GET_DEPTMEMBDETAIL = "http://SERVER_IP_PORT/wxcorp/getDeptUserDetail?accessToken=ACCESS_TOKEN&deptId=DEPTID";
+    public static final String TRANSMIT_SERVER_GET_CONTACT_TOKEN = "http://SERVER_IP_PORT/wxcorp/getCorpConcactAccessToken?corpid=CORPID&contactSecret=CONTACT_SECRET";
+    public static final String TRANSMIT_SERVER_GET_USERDETAIL = "http://SERVER_IP_PORT/wxcorp/getUserInfoFromTranServer?accessToken=ACCESS_TOKEN&userId=USERID&deptId=DEPTID";
 
     public static final String POST_CONVERT_USERID = "https://qyapi.weixin.qq.com/cgi-bin/batch/userid_to_openuserid?access_token=ACCESS_TOKEN";
 
@@ -377,7 +378,7 @@ public class WeiXinCorpController {
                         String curCorpAccessToken = getCorpAccessToken(wxCorpInfo);
                         org.json.JSONArray departmentArray = jsonObject.getJSONArray("department");
                         Integer curUserWXDeptid = departmentArray.getInt(departmentArray.length() - 1);
-                        JSONObject userObj = remoteGetUserDetail(remoteCorpConcactAccessToken, corpWxUserId, curUserWXDeptid, curCorpAccessToken);
+                        JSONObject userObj = remoteGetUserDetail(wxCorpInfo, remoteCorpConcactAccessToken, corpWxUserId, curUserWXDeptid, curCorpAccessToken);
                         if (userObj != null) {
                             //成功获取到通讯录的个人详情
                             Long id = SnowFlake.nextId();
@@ -432,7 +433,7 @@ public class WeiXinCorpController {
                             System.out.println("部门未变更,不处理");
                         }
                         if (curUserWXDeptid != 0) {
-                            JSONObject userObj = remoteGetUserDetail(remoteCorpConcactAccessToken, corpWxUserId, curUserWXDeptid, curCorpAccessToken);
+                            JSONObject userObj = remoteGetUserDetail(wxCorpInfo, remoteCorpConcactAccessToken, corpWxUserId, curUserWXDeptid, curCorpAccessToken);
                             if (userObj != null) {
                                 //成功获取到通讯录的个人详情
                                 JSONArray department = userObj.getJSONArray("department");
@@ -480,7 +481,7 @@ public class WeiXinCorpController {
                         department.setCompanyId(companyId);
                         department.setCorpwxDeptid(deptId);
                         department.setCorpwxDeptpid(parentDeptId);
-                        JSONObject deptJson = remoteGetDeptDetail(remoteCorpConcactAccessToken, deptId);
+                        JSONObject deptJson = remoteGetDeptDetail(wxCorpInfo, remoteCorpConcactAccessToken, deptId);
                         if (deptJson != null) {
                             //成功获取到了
                             String name = deptJson.getString("name");
@@ -514,7 +515,7 @@ public class WeiXinCorpController {
                             //发生了部门名称变化
                             System.out.println("部门名称变化了,请处理==企业微信部门id="+deptId);
                             String remoteCorpConcactAccessToken = getRemoteCorpConcactAccessToken(wxCorpInfo);
-                            String url = TRANSMIT_SERVER_GET_DEPTDETAIL.replace("ACCESS_TOKEN", remoteCorpConcactAccessToken).replace("DEPTID", ""+deptId);
+                            String url = TRANSMIT_SERVER_GET_DEPTDETAIL.replace(TRANSMIT_SERVER_STR, wxCorpInfo.getContactServer()).replace("ACCESS_TOKEN", remoteCorpConcactAccessToken).replace("DEPTID", ""+deptId);
                             String result = restTemplate.getForObject(url, String.class);
                             System.out.println("部门返回数据:"+result);
                             JSONObject resultObj = JSONObject.parseObject(JSONObject.parseObject(result).getString("data"));
@@ -1324,6 +1325,7 @@ public class WeiXinCorpController {
             int deptId = deptObjJSONArray.getJSONObject(i).getIntValue("id");
 
             JSONArray userList = getDeptUserSimple(curCorpAccessToken, deptId);
+            System.out.println("该部门下用户数量:"+userList.size());
             for (int m=0;m<userList.size(); m++) {
                 JSONObject userJson = userList.getJSONObject(m);
                 String curUserid = userJson.getString("userid");
@@ -1343,6 +1345,9 @@ public class WeiXinCorpController {
                 //检查用户是否已经存在
                 if (userMapper.selectCount(new QueryWrapper<User>().eq("corpwx_userid", curUserid).eq("company_id", companyId)) == 0) {
                     userMapper.insert(user);
+                } else {
+                    User curUser = userMapper.selectOne(new QueryWrapper<User>().eq("corpwx_userid", curUserid).eq("company_id", companyId));
+                    System.out.println("找到用户:"+curUser.getName()+", 部门:"+departmentMapper.selectById(curUser.getDepartmentId()).getDepartmentName());
                 }
             }
         }
@@ -1465,7 +1470,7 @@ public class WeiXinCorpController {
             //获取远程的带姓名的详情,通过企业通讯录的token获取
             JSONArray remoteUnAUserList = null;
             if (unAssignedUserList.size() > 0) {
-                remoteUnAUserList = remoteGetDeptUserDetail(corpContactAccessToken, companyRootDeptId);
+                remoteUnAUserList = remoteGetDeptUserDetail(wxCorpInfo, corpContactAccessToken, companyRootDeptId);
                 //做id转化
                 List<String> userIds = new ArrayList<>();
                 for (int i=0;i<remoteUnAUserList.size(); i++) {
@@ -1564,7 +1569,7 @@ public class WeiXinCorpController {
             department.setCorpwxDeptid(cutDeptJson.getInteger("id"));
             department.setCorpwxDeptpid(cutDeptJson.getInteger("parentid"));
             System.out.println("开始远程获取部门详情=====");
-            String url = TRANSMIT_SERVER_GET_DEPTDETAIL.replace("ACCESS_TOKEN", corpContactAccessToken).replace("DEPTID", ""+deptId);
+            String url = TRANSMIT_SERVER_GET_DEPTDETAIL.replace(TRANSMIT_SERVER_STR, wxCorpInfo.getContactServer()).replace("ACCESS_TOKEN", corpContactAccessToken).replace("DEPTID", ""+deptId);
             String result = restTemplate.getForObject(url, String.class);
             System.out.println("部门返回数据:"+result);
             JSONObject resultObj = JSONObject.parseObject(JSONObject.parseObject(result).getString("data"));
@@ -1621,7 +1626,7 @@ public class WeiXinCorpController {
                 JSONArray userList = getDeptUserInfo(curCorpAccessToken, deptId);
                 JSONArray remoteDeptUserList = null;
                 if (userList.size() > 0) {
-                    remoteDeptUserList = remoteGetDeptUserDetail(corpContactAccessToken, deptId);
+                    remoteDeptUserList = remoteGetDeptUserDetail(wxCorpInfo, corpContactAccessToken, deptId);
                     //做id转化
                     List<String> userIds = new ArrayList<>();
                     for (int p=0;p<remoteDeptUserList.size(); p++) {
@@ -2034,8 +2039,8 @@ public class WeiXinCorpController {
         return new HttpRespMsg();
     }
 
-    private JSONObject remoteGetDeptDetail(String accessToken, int deptId) {
-        String url = TRANSMIT_SERVER_GET_DEPTDETAIL.replace("ACCESS_TOKEN", accessToken).replace("DEPTID", ""+deptId);
+    private JSONObject remoteGetDeptDetail(WxCorpInfo wxCorpInfo, String accessToken, int deptId) {
+        String url = TRANSMIT_SERVER_GET_DEPTDETAIL.replace(TRANSMIT_SERVER_STR, wxCorpInfo.getContactServer()).replace("ACCESS_TOKEN", accessToken).replace("DEPTID", ""+deptId);
         String result = restTemplate.getForObject(url, String.class);
         System.out.println("部门返回数据:"+result);
         JSONObject resultObj = JSONObject.parseObject(JSONObject.parseObject(result).getString("data"));
@@ -2048,15 +2053,15 @@ public class WeiXinCorpController {
         }
     }
 
-    private JSONArray remoteGetDeptUserDetail(String accessToken, int deptId) {
-        String url = TRANSMIT_SERVER_GET_DEPTMEMBDETAIL.replace("ACCESS_TOKEN", accessToken).replace("DEPTID", ""+deptId);
+    private JSONArray remoteGetDeptUserDetail(WxCorpInfo wxCorpInfo, String accessToken, int deptId) {
+        String url = TRANSMIT_SERVER_GET_DEPTMEMBDETAIL.replace(TRANSMIT_SERVER_STR, wxCorpInfo.getContactServer()).replace("ACCESS_TOKEN", accessToken).replace("DEPTID", ""+deptId);
         String result = restTemplate.getForObject(url, String.class);
         System.out.println("远程部门人员详情:"+result);
         JSONArray obj = JSONObject.parseArray(JSONObject.parseObject(result).getString("data"));
         return obj;
     }
 
-    private JSONObject remoteGetUserDetail(String accessToken, String userId, Integer deptId, String curCorpAccessToken) {
+    private JSONObject remoteGetUserDetail(WxCorpInfo wxCorpInfo, String accessToken, String userId, Integer deptId, String curCorpAccessToken) {
 //        String url = TRANSMIT_SERVER_GET_USERDETAIL.replace("ACCESS_TOKEN", accessToken).replace("USERID", userId)
 //                        .replace("DEPTID", deptId+"");
 //        System.out.println("请求URL="+url);
@@ -2064,7 +2069,7 @@ public class WeiXinCorpController {
 //        System.out.println("远程人员详情:"+result);
 //        JSONObject obj = JSONObject.parseObject(JSONObject.parseObject(result).getString("data"));
 //        return obj;
-        JSONArray remoteDeptUserList = remoteGetDeptUserDetail(accessToken, deptId);
+        JSONArray remoteDeptUserList = remoteGetDeptUserDetail(wxCorpInfo, accessToken, deptId);
         //做id转化
         List<String> userIds = new ArrayList<>();
         for (int i=0;i<remoteDeptUserList.size(); i++) {
@@ -2095,7 +2100,7 @@ public class WeiXinCorpController {
 
     //通过中转服务器,调用通讯录的accessToken
     private String getRemoteCorpConcactAccessToken(WxCorpInfo corpInfo) throws Exception {
-        String url = TRANSMIT_SERVER_GET_CONTACT_TOKEN.replace("CORPID", corpInfo.getCorpid()).replace("CONTACT_SECRET", corpInfo.getContactSecret());
+        String url = TRANSMIT_SERVER_GET_CONTACT_TOKEN.replace(TRANSMIT_SERVER_STR, corpInfo.getContactServer()).replace("CORPID", corpInfo.getCorpid()).replace("CONTACT_SECRET", corpInfo.getContactSecret());
         String result = restTemplate.getForObject(url, String.class);
         System.out.println("远程获取Contact AccessToken:"+result);
         JSONObject obj = JSONObject.parseObject(result);

+ 3 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/Project.java

@@ -288,6 +288,9 @@ public class Project extends Model<Project> {
     @TableField("current_stage_name")
     private String currentStageName;
 
+    @TableField(exist = false)
+    ProjectSeparate projectSeparate;
+
 
     @Override
     protected Serializable pkVal() {

+ 82 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/ProjectSeparate.java

@@ -0,0 +1,82 @@
+package com.management.platform.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.time.LocalDate;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-07-29
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class ProjectSeparate extends Model<ProjectSeparate> {
+
+    private static final long serialVersionUID=1L;
+
+    /**
+     * 项目id
+     */
+    @TableField("id")
+    private Integer id;
+
+    /**
+     * 合同编号
+     */
+    @TableField("contract_code")
+    private String contractCode;
+
+    /**
+     * 质保开始时间
+     */
+    @TableField("warranty_start_date")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private LocalDate warrantyStartDate;
+
+    /**
+     * 质保截止时间
+
+     */
+    @TableField("warranty_end_date")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private LocalDate warrantyEndDate;
+
+    /**
+     * 自主项目类别
+     */
+    @TableField("project_category_sub")
+    private String projectCategorySub;
+
+    /**
+     * 所属大区
+     */
+    @TableField("region")
+    private String region;
+
+    /**
+     * 所属BU
+     */
+    @TableField("bu")
+    private String bu;
+
+
+    @Override
+    protected Serializable pkVal() {
+        return null;
+    }
+
+}

+ 4 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/User.java

@@ -3,6 +3,7 @@ package com.management.platform.entity;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
@@ -170,6 +171,8 @@ public class User extends Model<User> {
     /**
      * 入职日期
      */
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd")
     @TableField("induction_date")
     private LocalDate inductionDate;
 
@@ -177,6 +180,7 @@ public class User extends Model<User> {
      * 离职日期
      */
     @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd")
     @TableField("inactive_date")
     private LocalDate inactiveDate;
 

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

@@ -15,7 +15,7 @@ import lombok.experimental.Accessors;
  * </p>
  *
  * @author Seyason
- * @since 2022-06-28
+ * @since 2022-07-28
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -87,6 +87,12 @@ public class WxCorpInfo extends Model<WxCorpInfo> {
     @TableField("contact_secret")
     private String contactSecret;
 
+    /**
+     * 企业通讯录服务器ip和端口
+     */
+    @TableField("contact_server")
+    private String contactServer;
+
 
     @Override
     protected Serializable pkVal() {

+ 3 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ProjectMapper.java

@@ -112,4 +112,7 @@ public interface ProjectMapper extends BaseMapper<Project> {
 
     List<Map<String, Object>> getCostByGroup(String startDate, String endDate, Integer projectId);
 
+    List<Map<String, Object>> selectWithGroup(Integer companyId, String startDate, String endDate, Integer startIndex, Integer endIndex, Integer projectId, List<Integer> inchagerIds, Integer groupId);
+
+    long selectCountWithGroup(Integer companyId, String startDate, String endDate, Integer startIndex, Integer endIndex, Integer projectId, List<Integer> inchagerIds, Integer groupId);
 }

+ 16 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ProjectSeparateMapper.java

@@ -0,0 +1,16 @@
+package com.management.platform.mapper;
+
+import com.management.platform.entity.ProjectSeparate;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-07-29
+ */
+public interface ProjectSeparateMapper extends BaseMapper<ProjectSeparate> {
+
+}

+ 16 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ProjectSeparateService.java

@@ -0,0 +1,16 @@
+package com.management.platform.service;
+
+import com.management.platform.entity.ProjectSeparate;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-07-29
+ */
+public interface ProjectSeparateService extends IService<ProjectSeparate> {
+
+}

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

@@ -2,6 +2,7 @@ package com.management.platform.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.management.platform.entity.Project;
+import com.management.platform.entity.ProjectSeparate;
 import com.management.platform.util.HttpRespMsg;
 import org.springframework.web.multipart.MultipartFile;
 
@@ -41,7 +42,8 @@ public interface ProjectService extends IService<Project> {
                             Integer projectMainId,
                             String providerIds,
                             String providerNames,
-                            HttpServletRequest request);
+                            HttpServletRequest request,
+                            ProjectSeparate projectSeparate);
 
     HttpRespMsg deleteProject(Integer id, Integer force);
 
@@ -163,5 +165,5 @@ public interface ProjectService extends IService<Project> {
 
     HttpRespMsg getCostByGroup(String startDate, String endDate, Integer id, HttpServletRequest request);
 
-    HttpRespMsg getTimeCostByGroup(String startDate, String endDate, Integer pageIndex, Integer pageSize, Integer groupId, Integer projectId);
+    HttpRespMsg getTimeCostByGroup(String startDate, String endDate, Integer pageIndex, Integer pageSize, Integer groupId, Integer projectId,HttpServletRequest request);
 }

+ 20 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectSeparateServiceImpl.java

@@ -0,0 +1,20 @@
+package com.management.platform.service.impl;
+
+import com.management.platform.entity.ProjectSeparate;
+import com.management.platform.mapper.ProjectSeparateMapper;
+import com.management.platform.service.ProjectSeparateService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-07-29
+ */
+@Service
+public class ProjectSeparateServiceImpl extends ServiceImpl<ProjectSeparateMapper, ProjectSeparate> implements ProjectSeparateService {
+
+}

+ 196 - 32
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java

@@ -144,6 +144,10 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
     DepartmentOtherManagerMapper departmentOtherManagerMapper;
     @Resource
     ContractModifyRecordMapper contractModifyRecordMapper;
+    @Resource
+    ProjectSeparateMapper projectSeparateMapper;
+    @Resource
+    ProjectStageMapper projectStageMapper;
 
     @Resource
     private HttpServletResponse response;
@@ -252,6 +256,8 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
             List<ProjectMain> projectMainList = projectMainMapper.selectList(new QueryWrapper<ProjectMain>().eq("company_id", companyId));
             List<ProjectLevel> projectLevelList = projectLevelMapper.selectList(new QueryWrapper<ProjectLevel>().eq("company_id", companyId));
             TimeType timeType = timeTypeMapper.selectById(companyId);
+            List<Integer> projectIds = projectList.stream().distinct().map(pl -> pl.getId()).collect(Collectors.toList());
+            List<ProjectSeparate> projectSeparateList = projectSeparateMapper.selectList(new QueryWrapper<ProjectSeparate>().in("id", projectIds));
             List<ProjectVO> list = new ArrayList<>();
             for (Project project : projectList) {
                 ProjectVO projectVO = new ProjectVO();
@@ -307,6 +313,12 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                     }
                     projectVO.setProviderInfoList(mapList);
                 }
+                if(companyId==936){
+                    Optional<ProjectSeparate> first1 = projectSeparateList.stream().filter(ps -> ps.getId().equals(project.getId())).findFirst();
+                    if(first1.isPresent()){
+                        projectVO.setProjectSeparate(first1.get());
+                    }
+                }
                 list.add(projectVO);
             }
             List<String> stringList = providerCategoryList.stream().distinct().map(ProviderCategory::getProviderCategoryName).collect(Collectors.toList());
@@ -346,7 +358,8 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                                    Integer projectMainId,
                                    String providerIds,
                                    String providerNames,
-                                   HttpServletRequest request) {
+                                   HttpServletRequest request,
+                                   ProjectSeparate projectSeparate) {
         HttpRespMsg httpRespMsg = new HttpRespMsg();
         User user = userMapper.selectById(request.getHeader("Token"));
         Integer companyId = user.getCompanyId();
@@ -447,6 +460,10 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                         }
                     }
                     id = project.getId();
+                    if(companyId==936){
+                        projectSeparate.setId(id);
+                        projectSeparateMapper.insert(projectSeparate);
+                    }
                 }
             }
         } else {
@@ -481,6 +498,16 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                         p.setCategoryName(projectCategory.getName());
                     }
                 }
+                if(companyId==936){
+                    ProjectSeparate separate = projectSeparateMapper.selectById(id);
+                    projectSeparate.setId(id);
+                    if(separate!=null){
+                        projectSeparateMapper.updateById(projectSeparate);
+                    }else {
+                        projectSeparateMapper.insert(projectSeparate);
+                    }
+
+                }
                 if (!StringUtils.isEmpty(planStartDate)) {
                     p.setPlanStartDate(LocalDate.parse(planStartDate));
                 }
@@ -495,6 +522,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                 if (projectMapper.updateById(p) == 0) {
                     httpRespMsg.setError("操作失败");
                 } else {
+
                     if (customerId == null) {
                         //去掉客户
                         projectMapper.removeProjectCustomer(id);
@@ -1515,8 +1543,8 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         User user = userMapper.selectById(request.getHeader("Token"));
         Integer companyId = user.getCompanyId();
         List<Project> projectList = projectMapper.selectList(new QueryWrapper<Project>().eq("company_id", companyId));
-        List<SysRichFunction> functionAllList = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "全部项目任务报表");
-        List<SysRichFunction> functionInchargeList = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "负责项目任务报表");
+        List<SysRichFunction> functionAllList = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "全部项目成本报表");
+        List<SysRichFunction> functionInchargeList = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "负责项目成本报表");
         //判断查看权限
         List<Integer> inchagerIds=null;
         if(functionAllList.size()==0){
@@ -1600,8 +1628,8 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         User user = userMapper.selectById(request.getHeader("Token"));
         Integer companyId = user.getCompanyId();
         List<Project> projectList = projectMapper.selectList(new QueryWrapper<Project>().eq("company_id", companyId));
-        List<SysRichFunction> functionAllList = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "全部项目任务报表");
-        List<SysRichFunction> functionInchargeList = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "负责项目任务报表");
+        List<SysRichFunction> functionAllList = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "全部项目收支平衡表");
+        List<SysRichFunction> functionInchargeList = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "负责项目收支平衡表");
         //判断查看权限
         List<Integer> inchagerIds=null;
         if(functionAllList.size()==0){
@@ -2151,8 +2179,8 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         int endIndex = pageSize*pageIndex;
         HttpRespMsg msg = new HttpRespMsg();
         List<Project> projectList = projectMapper.selectList(new QueryWrapper<Project>().eq("company_id", companyId));
-        List<SysRichFunction> functionAllList = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "全部项目任务报表");
-        List<SysRichFunction> functionInchargeList = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "负责项目任务报表");
+        List<SysRichFunction> functionAllList = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "全部项目阶段工时表");
+        List<SysRichFunction> functionInchargeList = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "负责项目阶段工时表");
         //判断查看权限
         List<Integer> inchagerIds=null;
         if(functionAllList.size()==0){
@@ -2636,6 +2664,8 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                 //获取主项目
                 List<ProjectMain> projectMainList = projectMainMapper.selectList(new QueryWrapper<ProjectMain>().eq("company_id", user.getCompanyId()));
                 List<ProjectLevel> projectLevelList = projectLevelMapper.selectList(new QueryWrapper<ProjectLevel>().eq("company_id", user.getCompanyId()));
+                //获取项目阶段
+                List<ProjectStage> projectStageList = projectStageMapper.selectList(new QueryWrapper<ProjectStage>().eq("company_id", company.getId()));
                 TimeType timeType = timeTypeMapper.selectById(company.getId());
                 List<Project> projectList = new ArrayList<Project>();
                 //由于第一行需要指明列对应的标题
@@ -2669,6 +2699,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                     HSSFCell subNameCell=null;
                     HSSFCell mainNameCell=null;
                     HSSFCell codeCell=null;
+                    HSSFCell contractCell=null;
                     HSSFCell isPublicCell=null;
                     HSSFCell nameCell=null;
                     HSSFCell participatorCell=null;
@@ -2679,18 +2710,30 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                     HSSFCell endDateCell=null;
                     HSSFCell amountCell=null;
                     HSSFCell categoryCell=null;
+                    HSSFCell warrantyStartDateCell=null;
+                    HSSFCell warrantyEndDateCell=null;
+                    HSSFCell projectCategorySubCell=null;
+                    HSSFCell regionCell=null;
+                    HSSFCell buCell=null;
+                    HSSFCell stateCell=null;
+                    HSSFCell stageCell=null;
                     int i=0;
                     int k=0;
+                    int c=0;
                     if(timeType.getMainProjectState()==1){
                         mainNameCell = row.getCell(0);
                         codeCell = row.getCell(1);
-                        isPublicCell = row.getCell(2);
-                        nameCell = row.getCell(3);
-                        participatorCell = row.getCell(4);
-                        inchargerCell = row.getCell(5);
-                        levelCell = row.getCell(6);
+                        if(company.getId()==936){
+                            contractCell=row.getCell(2);
+                            c++;
+                        }
+                        isPublicCell = row.getCell(2+c);
+                        nameCell = row.getCell(3+c);
+                        participatorCell = row.getCell(4+c);
+                        inchargerCell = row.getCell(5+c);
+                        levelCell = row.getCell(6+c);
                         if(company.getPackageCustomer()==1){
-                            customerCell=row.getCell(7);
+                            customerCell=row.getCell(7+c);
                             i++;
                         }
                         if(company.getPackageProvider()==1){
@@ -2700,21 +2743,33 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                                 }
                             }
                         }
-                        startDateCell = row.getCell(7+i+k);
-                        endDateCell = row.getCell(8+i+k);
-                        amountCell = row.getCell(9+i+k);
+                        startDateCell = row.getCell(7+i+k+c);
+                        endDateCell = row.getCell(8+i+k+c);
+                        amountCell = row.getCell(9+i+k+c);
+                        if(company.getId()==936){
+                            warrantyEndDateCell=row.getCell(10+i+k+c);
+                            warrantyStartDateCell=row.getCell(11+i+k+c);
+                            projectCategorySubCell=row.getCell(12+i+k+c);
+                            regionCell=row.getCell(13+i+k+c);
+                            buCell=row.getCell(14+i+k+c);
+                            stateCell=row.getCell(15+i+k+c);
+                            stageCell=row.getCell(16+i+k+c);
+                        }
                     }else {
                         codeCell = row.getCell(0);
-                        categoryCell = row.getCell(1);
-                        isPublicCell = row.getCell(2);
-                        nameCell = row.getCell(3);
-                        subNameCell = row.getCell(4);
-                        participatorCell = row.getCell(5);
-                        inchargerCell = row.getCell(6);
-                        levelCell = row.getCell(7);
-                        customerCell=null;
+                        if(company.getId()==936){
+                            contractCell=row.getCell(1);
+                            c++;
+                        }
+                        categoryCell = row.getCell(1+c);
+                        isPublicCell = row.getCell(2+c);
+                        nameCell = row.getCell(3+c);
+                        subNameCell = row.getCell(4+c);
+                        participatorCell = row.getCell(5+c);
+                        inchargerCell = row.getCell(6+c);
+                        levelCell = row.getCell(7+c);
                         if(company.getPackageCustomer()==1){
-                            customerCell=row.getCell(8);
+                            customerCell=row.getCell(8+c);
                             i++;
                         }
                         if(company.getPackageProvider()==1){
@@ -2724,9 +2779,18 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                                 }
                             }
                         }
-                        startDateCell = row.getCell(8+i+k);
-                        endDateCell = row.getCell(9+i+k);
-                        amountCell = row.getCell(10+i+k);
+                        startDateCell = row.getCell(8+i+k+c);
+                        endDateCell = row.getCell(9+i+k+c);
+                        amountCell = row.getCell(10+i+k+c);
+                        if(company.getId()==936){
+                            warrantyEndDateCell=row.getCell(11+i+k+c);
+                            warrantyStartDateCell=row.getCell(12+i+k+c);
+                            projectCategorySubCell=row.getCell(13+i+k+c);
+                            regionCell=row.getCell(14+i+k+c);
+                            buCell=row.getCell(15+i+k+c);
+                            stateCell=row.getCell(16+i+k+c);
+                            stageCell=row.getCell(17+i+k+c);
+                        }
                     }
                     if (codeCell != null)codeCell.setCellType(CellType.STRING);
                     if (nameCell != null)nameCell.setCellType(CellType.STRING);
@@ -2741,6 +2805,14 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                     /*if (startDateCell != null)startDateCell.setCellType(CellType.NUMERIC);
                     if (endDateCell != null)endDateCell.setCellType(CellType.NUMERIC);*/
                     if (amountCell != null)amountCell.setCellType(CellType.STRING);
+                    if (contractCell != null)amountCell.setCellType(CellType.STRING);
+                    /*if (warrantyStartDateCell != null)amountCell.setCellType(CellType.STRING);
+                    if (warrantyEndDateCell != null)amountCell.setCellType(CellType.STRING);*/
+                    if (projectCategorySubCell != null)amountCell.setCellType(CellType.STRING);
+                    if (regionCell != null)amountCell.setCellType(CellType.STRING);
+                    if (buCell != null)amountCell.setCellType(CellType.STRING);
+                    if (stateCell != null)amountCell.setCellType(CellType.STRING);
+                    if (stageCell != null)amountCell.setCellType(CellType.STRING);
                     if (nameCell == null) {//项目名称为空的直接跳过
                         throw new Exception("项目名称不能为空");
                     }
@@ -2809,6 +2881,37 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                             project.setLevel(projectLevelMap.get(levelStr));
                         }
                     }
+                    //处理威派格 项目相关数据
+                    if(company.getId()==936){
+                        if(StringUtils.isEmpty(stateCell)&&stateCell!=null){
+                            switch (stateCell.getStringCellValue()){
+                                case "全部":
+                                    project.setStatus(0);
+                                break;
+                                case "进行中":
+                                    project.setStatus(1);
+                                    break;
+                                case "已完成":
+                                    project.setStatus(2);
+                                    break;
+                                case "已撤销":
+                                    project.setStatus(3);
+                                    break;
+                                case "暂停":
+                                    project.setStatus(4);
+                                    break;
+                            }
+                        }
+                        if(StringUtils.isEmpty(stageCell)&&stageCell!=null){
+                            HSSFCell finalStageCell = stageCell;
+                            Optional<ProjectStage> first = projectStageList.stream().filter(ps -> ps.getProjectStageName().equals(finalStageCell.getStringCellValue())).findFirst();
+                            if(first.isPresent()){
+                                project.setCurrentStageId(first.get().getId());
+                                project.setCurrentStageName(first.get().getProjectStageName());
+                            }
+
+                        }
+                    }
                     if(customerCell!=null){
                         String cellStringCellValue = customerCell.getStringCellValue();
                         if(!StringUtils.isEmpty(cellStringCellValue)){
@@ -2932,6 +3035,32 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                         projectAuditor.setProjectId(project.getId());
                         projectAuditorMapper.insert(projectAuditor);
                     }
+                    Integer id = project.getId();
+                    //处理威派格 垂直分表项目数据数据
+                    if(company.getId()==936){
+                        ProjectSeparate projectSeparate=new ProjectSeparate();
+                        projectSeparate.setId(id);
+                        if (warrantyStartDateCell !=null && !StringUtils.isEmpty(warrantyStartDateCell.getDateCellValue())) {
+                            projectSeparate.setWarrantyStartDate(LocalDate.parse(sdf.format(warrantyStartDateCell.getDateCellValue()), DateTimeFormatter.ofPattern("yyyy-MM-dd")));
+                        }
+                        if (warrantyEndDateCell !=null && warrantyEndDateCell.getCellTypeEnum() == CellType.NUMERIC && !StringUtils.isEmpty(warrantyEndDateCell.getDateCellValue())) {
+                            projectSeparate.setWarrantyEndDate(LocalDate.parse(sdf.format(warrantyEndDateCell.getDateCellValue()), DateTimeFormatter.ofPattern("yyyy-MM-dd")));
+                        }
+
+                        if (contractCell != null && !StringUtils.isEmpty(contractCell.getStringCellValue())) {
+                            projectSeparate.setContractCode(contractCell.getStringCellValue());
+                        }
+                        if (regionCell != null && !StringUtils.isEmpty(regionCell.getStringCellValue())) {
+                            projectSeparate.setRegion(regionCell.getStringCellValue());
+                        }
+                        if (buCell != null && !StringUtils.isEmpty(buCell.getStringCellValue())) {
+                            projectSeparate.setBu(buCell.getStringCellValue());
+                        }
+                        if (projectCategorySubCell != null && !StringUtils.isEmpty(projectCategorySubCell.getStringCellValue())) {
+                            projectSeparate.setProjectCategorySub(projectCategorySubCell.getStringCellValue());
+                        }
+                        projectSeparateMapper.insert(projectSeparate);
+                    }
                     importCount++;
                     //参与人
                     if (participatorCell != null) {
@@ -4125,8 +4254,8 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         User targetUser= userMapper.selectById(request.getHeader("token"));
         TimeType timeType = timeTypeMapper.selectById(targetUser.getCompanyId());
         Integer timeliness = timeType.getTimeliness();
-        List<SysRichFunction> functionAllList = sysFunctionMapper.getRoleFunctions(targetUser.getRoleId(), "全公司工时分配");
-        List<SysRichFunction> functionDeptList = sysFunctionMapper.getRoleFunctions(targetUser.getRoleId(), "负责部门工时分配");
+        List<SysRichFunction> functionAllList = sysFunctionMapper.getRoleFunctions(targetUser.getRoleId(), "全公司填报及时率");
+        List<SysRichFunction> functionDeptList = sysFunctionMapper.getRoleFunctions(targetUser.getRoleId(), "负责部门填报及时率");
         List<Integer> deptIds=null;
         List<Department> allDepartmentList=departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id",targetUser.getCompanyId()));
         List<Department> userDepartmentList = departmentMapper.selectList(new QueryWrapper<Department>().eq("manager_id", targetUser.getId()).eq("company_id",targetUser.getCompanyId()));
@@ -4659,8 +4788,43 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
     }
 
     @Override
-    public HttpRespMsg getTimeCostByGroup(String startDate, String endDate, Integer pageIndex, Integer pageSize, Integer groupId, Integer projectId) {
-        return null;
+    public HttpRespMsg getTimeCostByGroup(String startDate, String endDate, Integer pageIndex, Integer pageSize, Integer groupId, Integer projectId,HttpServletRequest request) {
+        String token = request.getHeader("TOKEN");
+        User user = userMapper.selectById(token);
+        Integer companyId = user.getCompanyId();
+        Integer startIndex = (pageIndex-1)*pageSize;
+        Integer endIndex = pageSize*pageIndex;
+        HttpRespMsg msg = new HttpRespMsg();
+        List<Project> projectList = projectMapper.selectList(new QueryWrapper<Project>().eq("company_id", companyId));
+        List<SysRichFunction> functionAllList = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "全部任务分组工时");
+        List<SysRichFunction> functionInchargeList = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "负责项目任务分组工时");
+        //判断查看权限
+        List<Integer> inchagerIds=null;
+        if(functionAllList.size()==0){
+            inchagerIds=new ArrayList<>();
+            if(functionInchargeList.size()>0){
+                List<Project> list = projectList.stream().filter(pl -> (pl.getInchargerId()==null?0:pl.getInchargerId()).equals(user.getId())).collect(Collectors.toList());
+                if(list!=null){
+                    List<Integer> collect = list.stream().map(li -> li.getId()).collect(Collectors.toList());
+                    inchagerIds.addAll(collect);
+                }
+            }else {
+                inchagerIds.add(-1);
+            }
+        }
+        List<Map<String,Object>> record;
+        long total;
+        if(pageIndex!=null&&pageSize!=null){
+            record = projectMapper.selectWithGroup(companyId,startDate,endDate, startIndex, endIndex, projectId,inchagerIds,groupId);
+        }else {
+            record=projectMapper.selectWithGroup(companyId,startDate,endDate, null, null, projectId,inchagerIds,groupId);
+        }
+        total =projectMapper.selectCountWithGroup(companyId,startDate,endDate, null, null, projectId,inchagerIds,groupId);
+        HashMap<String, Object> map = new HashMap<>();
+        map.put("records", record);
+        map.put("total", total);
+        msg.data = map;
+        return msg;
     }
 
 

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

@@ -878,4 +878,59 @@
         group by us.id
         order  by us.department_id)as total
     </select>
+    <select id="selectWithGroup" resultType="java.util.Map">
+        select SUM(a.working_time) as workingTime,IFNULL(b.name,'未分组') as groupName ,c.project_name as projectName,c.project_code as projectCode
+        from report a
+        left join task_group b on a.group_id=b.id
+        left join project c on a.project_id=c.id
+        where c.company_id=#{companyId} and a.state=1
+        <if test="startDate!=null and endDate!=null">
+            and a.create_date &gt;=#{startDate} and a.create_date &lt;=#{endDate}
+        </if>
+        <if test="projectId!=null">
+            and c.id=#{projectId}
+        </if>
+        <if test="inchagerIds!=null and inchagerIds.size()>0">
+            and c.id in
+            <foreach collection="inchagerIds" open="(" separator="," close=")" item="item">
+                #{item}
+            </foreach>
+        </if>
+        <if test="groupId!=null">
+            and a.group_id=#{groupId}
+        </if>
+        group by b.id
+        order by c.id
+        <if test="startIndex!=null and endIndex!=null">
+            limit #{startIndex},#{endIndex}
+        </if>
+    </select>
+    <select id="selectCountWithGroup" resultType="java.lang.Long">
+        select count(1) from(
+        select SUM(a.working_time) as workingTime,IFNULL(b.name,'未分组') as groupName ,c.project_name as projectName,c.project_code as projectCode
+        from report a
+        left join task_group b on a.group_id=b.id
+        left join project c on a.project_id=c.id
+        where c.company_id=#{companyId} and a.state=1
+        <if test="startDate!=null and endDate!=null">
+            and a.create_date &gt;=#{startDate} and a.create_date &lt;=#{endDate}
+        </if>
+        <if test="projectId!=null">
+            and c.id=#{projectId}
+        </if>
+        <if test="inchagerIds!=null and inchagerIds.size()>0">
+            and c.id in
+            <foreach collection="inchagerIds" open="(" separator="," close=")" item="item">
+                #{item}
+            </foreach>
+        </if>
+        <if test="groupId!=null">
+            and a.group_id=#{groupId}
+        </if>
+        group by b.id
+        order by c.id
+        <if test="startIndex!=null and endIndex!=null">
+            limit #{startIndex},#{endIndex}
+        </if>) as total
+    </select>
 </mapper>

+ 21 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectSeparateMapper.xml

@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.management.platform.mapper.ProjectSeparateMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.management.platform.entity.ProjectSeparate">
+        <result column="id" property="id" />
+        <result column="contract_code" property="contractCode" />
+        <result column="warranty_start_date" property="warrantyStartDate" />
+        <result column="warranty_end_date" property="warrantyEndDate" />
+        <result column="project_category_sub" property="projectCategorySub" />
+        <result column="region" property="region" />
+        <result column="bu" property="bu" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, contract_code, warranty_start_date, warranty_end_date, project_category_sub, region, bu
+    </sql>
+
+</mapper>

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

@@ -18,11 +18,12 @@
         <result column="company_id" property="companyId" />
         <result column="agentid" property="agentid" />
         <result column="contact_secret" property="contactSecret" />
+        <result column="contact_server" property="contactServer" />
     </resultMap>
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        corpid, corp_name, corp_full_name, corp_scale, corp_industry, corp_sub_industry, location, access_token, expire_time, permanent_code, auth_username, company_id, agentid, contact_secret
+        corpid, corp_name, corp_full_name, corp_scale, corp_industry, corp_sub_industry, location, access_token, expire_time, permanent_code, auth_username, company_id, agentid, contact_secret, contact_server
     </sql>
 
 </mapper>

+ 2 - 0
fhKeeper/formulahousekeeper/timesheet/src/permissions.js

@@ -89,6 +89,7 @@ const StringUtil = {
         // 工时成本统计
         countHours: false, // 查看工时统计 //
         countCost: false, // 查看成本统计 //
+        countPersonnel: false, // 查看人员数据 //
 
         // 项目报告审核
         projectReportReview: false, // 审核全员日报 //
@@ -172,6 +173,7 @@ const StringUtil = {
         arr[i] == '项目阶段管理' ? obj.projectPhase = true : ''
         arr[i] == '全公司工时统计' ? obj.reportPersonnel = true : ''
         arr[i] == '负责部门工时统计' ? obj.reportResponsible = true : ''
+        arr[i] == '查看人员数据' ? obj.countPersonnel = true : ''
     }
 
     return obj

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

@@ -26,6 +26,7 @@
                 <template slot-scope="scope">{{scope.row.projectNum + '个'}}</template>
             </el-table-column>
             <el-table-column prop="projects" label="相关项目" min-width="180" show-overflow-tooltip></el-table-column>
+            <el-table-column prop="rmark" label="备注" min-width="180" show-overflow-tooltip></el-table-column>
             <el-table-column label="操作" width="170">
                 <template slot-scope="scope" >
                     <el-button size="small" type="primary" @click="addNewSubProject(scope.row)">编辑</el-button>

+ 1 - 1
fhKeeper/formulahousekeeper/timesheet/src/views/leave/list.vue

@@ -210,7 +210,7 @@
             </div>
           </div>
             <el-table v-loading="loading" :data="tableData" style="width: 100%" height="94%">
-                <el-table-column prop="ownerName" :label="'请假人12' + page" min-width="120" fixed="left"></el-table-column>
+                <el-table-column prop="ownerName" :label="'请假人'" min-width="120" fixed="left"></el-table-column>
                 <el-table-column prop="tel" label="电话" min-width="120"></el-table-column>
                 <el-table-column prop="leaveType" label="请假类型" min-width="120">
                   <template slot-scope="scope">

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

@@ -33,7 +33,7 @@
                 <el-radio-button label="主项目" v-if="user.timeType.mainProjectState"></el-radio-button>
                 <el-radio-button label="项目分类"></el-radio-button>
                 <el-radio-button label="部门"></el-radio-button>
-                <el-radio-button label="人员"></el-radio-button>
+                <el-radio-button label="人员" v-if="permissions.countPersonnel"></el-radio-button>
                 <el-radio-button :label="namess" v-if="jichu.customDegreeActive == 1"></el-radio-button>
             </el-radio-group>
 

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

@@ -74,7 +74,7 @@
                                 </el-upload>
                             </el-dropdown-item>
                             <el-dropdown-item v-if="permissions.projectImport">
-                                <el-link type="primary" :underline="false" @click="downloadmb" v-if="user.company.packageCustomer == 1 || user.company.packageProvider == 1 || user.timeType.mainProjectState == 1">模板下载</el-link>
+                                <el-link type="primary" :underline="false" @click="downloadmb" v-if="user.company.packageCustomer == 1 || user.company.packageProvider == 1 || user.timeType.mainProjectState == 1 || user.companyId == '936'">模板下载</el-link>
                                 <el-link type="primary" :underline="false" href="./upload/项目导入模板.xlsx" download="项目导入模板.xlsx" v-else>模板下载</el-link>
                             </el-dropdown-item>
                             <el-dropdown-item v-if="permissions.projectExport">
@@ -400,7 +400,37 @@
                      placeholder="选择日期"></el-date-picker>
                 </el-form-item>
 
-                
+                <!-- 单个公司的固定字段 -->
+                <div v-if="user.companyId == '936'">
+                <el-form-item label="合同编号" >
+                    <el-input v-model="addForm.contractCode" placeholder="请输入合同编号" clearable></el-input>
+                </el-form-item>
+                <el-form-item label="质保开始时间">
+                    <el-date-picker v-model="addForm.warrantyStartDate" 
+                     :editable="false" style="width:32%;" 
+                     format="yyyy-MM-dd" 
+                     value-format="yyyy-MM-dd"
+                     :clearable="false" type="date" 
+                     placeholder="选择日期"></el-date-picker>
+
+                     <span style="margin-left:63px;margin-right:10px;" >质保截止时间</span>
+                    <el-date-picker v-model="addForm.warrantyEndDate" style="width:33%;"
+                     :editable="false" 
+                     format="yyyy-MM-dd" 
+                     value-format="yyyy-MM-dd"
+                     :clearable="false" type="date" 
+                     placeholder="选择日期"></el-date-picker>
+                </el-form-item>
+                <el-form-item label="自主项目类别" >
+                    <el-input v-model="addForm.projectCategorySub" placeholder="请输入自主项目类别" clearable></el-input>
+                </el-form-item>
+                <el-form-item label="所属大区" >
+                    <el-input v-model="addForm.region" placeholder="请输入 所属大区" clearable></el-input>
+                </el-form-item>
+                <el-form-item label="所属BU" >
+                    <el-input v-model="addForm.bu" placeholder="所属BU" clearable></el-input>
+                </el-form-item>
+                </div>
                 <!-- 项目基线 -->
                 <div style="margin: 10px 0 30px 0;min-height:200px;" v-if="user.company.packageProject == 1">
                     <el-tabs v-model="activeName" @tab-click="handleClick">
@@ -2847,6 +2877,14 @@ a {
                         creatorId: this.user.id,
                         projectMainId: ''
                     }
+                    if(this.user.companyId == '936') {
+                        this.$set(this.addForm, 'contractCode', '')
+                        this.$set(this.addForm, 'warrantyStartDate', '')
+                        this.$set(this.addForm, 'warrantyEndDate', '')
+                        this.$set(this.addForm, 'projectCategorySub', '')
+                        this.$set(this.addForm, 'region', '')
+                        this.$set(this.addForm, 'bu', '')
+                    }
                     this.projectBaseCostData = [];
                     this.auseList = [];
                     for (var m=0;m<this.baseCostItemList.length; m++) {
@@ -2893,6 +2931,16 @@ a {
                         creatorId: item.creatorId
                     }
 
+                    // 判断公司id是否等于936
+                    if(this.user.companyId == '936') {
+                        this.$set(this.addForm, 'contractCode', item.projectSeparate.contractCode)
+                        this.$set(this.addForm, 'warrantyStartDate', item.projectSeparate.warrantyStartDate)
+                        this.$set(this.addForm, 'warrantyEndDate', item.projectSeparate.warrantyEndDate)
+                        this.$set(this.addForm, 'projectCategorySub', item.projectSeparate.projectCategorySub)
+                        this.$set(this.addForm, 'region', item.projectSeparate.region)
+                        this.$set(this.addForm, 'bu', item.projectSeparate.bu)
+                    }
+
                     // 判断是否有供应商
                     if(this.user.company.packageProvider) {
                         // this.addForm.supplierId = item.providerIds.split(',')
@@ -3153,6 +3201,16 @@ a {
                             formData.append("providerIds", this.addForm.supplierId.toString());
                         }
 
+                        // 判断公司id是否等于 936
+                        if(this.user.companyId == '936') {
+                             formData.append("contractCode", this.addForm.contractCode);
+                             formData.append("warrantyStartDate", this.addForm.warrantyStartDate);
+                             formData.append("warrantyEndDate", this.addForm.warrantyEndDate);
+                             formData.append("projectCategorySub", this.addForm.projectCategorySub);
+                             formData.append("region", this.addForm.region);
+                             formData.append("bu", this.addForm.bu);
+                        }
+
                         // formData.append("associateDegreeNames", listName)
                         // console.log("addform",this.addForm);
                         // return

+ 13 - 2
fhKeeper/formulahousekeeper/timesheet/src/views/team/index.vue

@@ -576,7 +576,7 @@
             </p>
         </el-dialog>
         <el-dialog title="同步企业微信通讯录" v-if="showSyncCWDialog" :visible.sync="showSyncCWDialog" customClass="customWidth" width="500px">
-            <p>填写企业微信通讯录Secret 
+            <p>1. 填写企业微信通讯录Secret 
                 <el-popover placement="top" width="1200" trigger="hover">
                     <div class="imgFlex">
                         <div><img src="../../assets/image/Step1.jpg" style="width: 380px"/> <p><b>第一步:进入管理后台</b></p> </div>
@@ -589,6 +589,15 @@
             <p>
             <el-input v-model="contactSecret" style="width:380px;" :disabled="!editSecret"/><el-button @click="editSecret?saveContactSecret():editSecret=true;" >{{editSecret?'保存':'修改'}}</el-button>
             </p>
+            <p v-if="contactServer == null">
+            2. 联系客户配置同步服务器
+
+            </p>
+            <p v-if="contactServer == null" style="text-align:center;">
+            <img
+                style="width: 120px; height: 120px"
+                src="../../assets/image/code.jpg" />
+            </p>
             <p style="display: flex;justify-content: center;padding-bottom:1em;">
                 <el-button type="primary" :underline="false" :loading="importingData" :disabled="!canSync" @click="startCorpWxImport">开始同步</el-button>
             </p>
@@ -663,6 +672,7 @@ export default {
       canSync: false,
       corpid: null,
       contactSecret: null,
+      contactServer: null,
       showSyncCWDialog: false,
       permissions: JSON.parse(sessionStorage.getItem("permissions")),
       handleSelectionZzjgshow: false,
@@ -981,7 +991,8 @@ export default {
         (res) => {
           if (res.code == "ok") {
             this.contactSecret = res.data.contactSecret;
-            if (this.contactSecret) {
+            this.contactServer = res.data.contactServer;
+            if (this.contactSecret && this.contactServer) {
               this.canSync = true;
             } else {
               this.editSecret = true;