Ver código fonte

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

ggooalice 2 anos atrás
pai
commit
a5a0fbf86a

+ 97 - 73
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/WeiXinCorpController.java

@@ -364,7 +364,50 @@ 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));
 
+                    //成功获取到通讯录的个人详情
+                    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);
+                    }
+                }
+            }
         } catch (Exception e) {
             // TODO
             // 解密失败,失败原因请查看异常
@@ -492,7 +535,6 @@ public class WeiXinCorpController {
             WXBizMsgCrypt wxcpt = new WXBizMsgCrypt(token, encodingAesKey, suitId);
             String sMsg = wxcpt.DecryptMsg(sReqMsgSig, sReqTimeStamp, sReqNonce, requestBody);
             log.info("解密后===msg: " + sMsg);
-            // TODO: 解析出明文xml标签的内容进行处理
             org.json.JSONObject jsonObject = XML.toJSONObject(sMsg);
             log.info("json=="+jsonObject.toString());
             jsonObject = jsonObject.getJSONObject("xml");
@@ -506,50 +548,7 @@ public class WeiXinCorpController {
                 }
             }
 
-            if(jsonObject.has("Event") && ("subscribe".equals(jsonObject.getString("Event")))){
-                //成员关注应用事件,发生在该企业已经开通应用的情况下。
-                System.out.println("成员关注应用事件!");
-                String corpId = jsonObject.getString("ToUserName");
-                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));
 
-                    //成功获取到通讯录的个人详情
-                    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);
-                        }
-                    }
-                }
-            }
             if (jsonObject.has("AuthCode")) {
                 //企业授权通知
                 String authCode = jsonObject.getString("AuthCode");
@@ -629,8 +628,8 @@ public class WeiXinCorpController {
                             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);
                         }
+                        userMapper.insert(user);
                     } else if (!StringUtils.isEmpty(wxCorpInfo.getContactSecret()) && !StringUtils.isEmpty(wxCorpInfo.getContactServer())) {
                         //通过通讯录secret获取到员工姓名;这是从内部通讯录的
                         String remoteCorpConcactAccessToken = getRemoteCorpConcactAccessToken(wxCorpInfo);
@@ -2701,7 +2700,7 @@ public class WeiXinCorpController {
     }
 
     private boolean saveOrderAndUpCompany(org.json.JSONObject jsonObject) throws Exception {
-        System.err.println("+++++++++++++++++++"+"订单回调时间"+"++++++++++++++++++++++");
+        System.err.println("+++++++++++++++++++"+"订单回调开始"+"++++++++++++++++++++++");
         String infoType = jsonObject.getString("InfoType");
         String suiteAccessToken = getSuiteAccessToken();
         HttpHeaders headers = new HttpHeaders();
@@ -2713,18 +2712,19 @@ public class WeiXinCorpController {
         if ("change_editon".equals(infoType)){
             String url = "https://qyapi.weixin.qq.com/cgi-bin/service/get_auth_info?suite_access_token="+suiteAccessToken;
             String paidCorpId = jsonObject.getString("PaidCorpId");
-            WxCorpInfo corpid = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("corpid", paidCorpId));
-            Company company = companyMapper.selectById(corpid.getCompanyId());
+            WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("corpid", paidCorpId));
+            Company company = companyMapper.selectById(wxCorpInfo.getCompanyId());
             JSONObject map = new JSONObject();
             map.put("auth_corpid",corpId);
-            map.put("permanent_code",corpid.getPermanentCode());
+            map.put("permanent_code",wxCorpInfo.getPermanentCode());
             HttpEntity<JSONObject> detailEntity = new HttpEntity<>(map, headers);
             ResponseEntity<String> detailResponseEntity = restTemplate.postForEntity(url, detailEntity, String.class);
             JSONObject json = JSONObject.parseObject(detailResponseEntity.getBody());
-            if (json.getInteger("errcode")==0){
-                String editionName = json.getString("edition_name");
+            if (json.containsKey("auth_corp_info")){
+                String editionName = json.getString("edition_id");
                 switch (editionName){
-                    case "工时基础版":
+                    //基础版
+                    case "sp17da4a6e6f2a91f8":
                         company.setPackageProject(0);
                         company.setPackageOa(0);
                         company.setPackageExpense(0);
@@ -2732,7 +2732,8 @@ public class WeiXinCorpController {
                         company.setPackageEngineering(0);
                         company.setPackageProvider(0);
                         break;
-                    case "项目管理专业版":
+                        //专业版
+                    case "sp4a30d92ede178afd":
                         company.setPackageProject(1);//项目协作平台
                         company.setPackageOa(0);//OA平台;请假,出差等
                         company.setPackageExpense(1);//费用报销
@@ -2740,7 +2741,8 @@ public class WeiXinCorpController {
                         company.setPackageEngineering(0);//工程专业
                         company.setPackageProvider(0);//供应商模块
                         break;
-                    case "建筑工程管理专业版":
+                        //建筑版
+                    case "spd04f1b0582a0fe19":
                         company.setPackageProject(1);//项目协作平台
                         company.setPackageOa(0);//OA平台;请假,出差等
                         company.setPackageExpense(1);//费用报销
@@ -2748,7 +2750,8 @@ public class WeiXinCorpController {
                         company.setPackageEngineering(1);//工程专业
                         company.setPackageProvider(0);//供应商模块
                         break;
-                    case "企业办公旗舰版":
+                        //旗舰版
+                    case "sp69f71e42798c7f55":
                         company.setPackageProject(1);//项目协作平台
                         company.setPackageOa(1);//OA平台;请假,出差等
                         company.setPackageExpense(1);//费用报销
@@ -2764,48 +2767,62 @@ public class WeiXinCorpController {
             }
         }else {
             String orderId = "";
-            if (jsonObject.getString("OrderId")!=null){
+            if (jsonObject.has("OrderId")){
                 orderId = jsonObject.getString("OrderId");
             }else {
                 orderId = jsonObject.getString("NewOrderId");
             }
             WxOrder wxOrder = new WxOrder();
-            String detailUrl = " https://qyapi.weixin.qq.com/cgi-bin/service/get_order?suite_access_token=" + suiteAccessToken;
+            String detailUrl = "https://qyapi.weixin.qq.com/cgi-bin/service/get_order?suite_access_token=" + suiteAccessToken;
             JSONObject detailMap = new JSONObject();
             detailMap.put("orderid",orderId);
             HttpEntity<JSONObject> detailEntity = new HttpEntity<>(detailMap, headers);
             ResponseEntity<String> detailResponseEntity = restTemplate.postForEntity(detailUrl, detailEntity, String.class);
             String body = detailResponseEntity.getBody();
+            System.out.println("+++++++++++++++++++++++++++++++++++++++订单详情信息!");
+            System.out.println(body);
             JSONObject orderDetail = JSONObject.parseObject(body);
             if (orderDetail.getInteger("errcode")==0){
                 wxOrder.setOrderid(orderDetail.getString("orderid"));
                 wxOrder.setOrderStatus(orderDetail.getInteger("order_status"));
                 wxOrder.setOrderType(orderDetail.getInteger("order_type"));
                 wxOrder.setPaidCorpid(orderDetail.getString("paid_corpid"));
-                wxOrder.setOperatorId(orderDetail.getString("operator_id"));
+                if (orderDetail.containsKey("operator_id")){
+                    wxOrder.setOperatorId(orderDetail.getString("operator_id"));
+                }
                 wxOrder.setSuiteid(orderDetail.getString("suiteid"));
-                wxOrder.setAppid(orderDetail.getString("appid"));
+                if (orderDetail.containsKey("appid")){
+                    wxOrder.setAppid(orderDetail.getString("appid"));
+                }
                 wxOrder.setEditionId(orderDetail.getString("edition_id"));
                 wxOrder.setEditionName(orderDetail.getString("edition_name"));
-                wxOrder.setPrice(orderDetail.getDouble("price"));
+                wxOrder.setPrice(orderDetail.getInteger("price"));
                 wxOrder.setUserCount(orderDetail.getInteger("user_count"));
                 wxOrder.setOrderPeriod(orderDetail.getInteger("order_period"));
-                LocalDateTime order_time =LocalDateTime.ofEpochSecond(orderDetail.getLong("order_time")/1000,0,ZoneOffset.ofHours(8));
+                LocalDateTime order_time =LocalDateTime.ofEpochSecond(orderDetail.getLong("order_time"),0,ZoneOffset.ofHours(8));
                 wxOrder.setOrderTime(order_time);
-                LocalDateTime paid_time =LocalDateTime.ofEpochSecond(orderDetail.getLong("paid_time")/1000,0,ZoneOffset.ofHours(8));
-                wxOrder.setPaidTime(paid_time);
-                LocalDateTime begin_time =LocalDateTime.ofEpochSecond(orderDetail.getLong("begin_time")/1000,0,ZoneOffset.ofHours(8));
-                wxOrder.setBeginTime(begin_time);
-                LocalDateTime end_time =LocalDateTime.ofEpochSecond(orderDetail.getLong("end_time")/1000,0,ZoneOffset.ofHours(8));
-                wxOrder.setEndTime(end_time);
+                if (orderDetail.getLong("paid_time")!=0){
+                    LocalDateTime paid_time =LocalDateTime.ofEpochSecond(orderDetail.getLong("paid_time"),0,ZoneOffset.ofHours(8));
+                    wxOrder.setPaidTime(paid_time);
+                }
+                if (orderDetail.getLong("begin_time")!=0){
+                    LocalDateTime begin_time =LocalDateTime.ofEpochSecond(orderDetail.getLong("begin_time"),0,ZoneOffset.ofHours(8));
+                    wxOrder.setBeginTime(begin_time);
+                }
+                if (orderDetail.getLong("end_time")!=0){
+                    LocalDateTime end_time =LocalDateTime.ofEpochSecond(orderDetail.getLong("end_time"),0,ZoneOffset.ofHours(8));
+                    wxOrder.setEndTime(end_time);
+                }
                 wxOrder.setOrderFrom(orderDetail.getInteger("order_from"));
                 wxOrder.setOperatorCorpid(orderDetail.getString("operator_corpid"));
-                wxOrder.setServiceShareAmount(orderDetail.getString("service_share_amount"));
-                wxOrder.setPlatformShareAmount(orderDetail.getString("platform_share_amount"));
-                wxOrder.setDealerShareAmount(orderDetail.getString("dealer_share_amount"));
-                JSONObject dealer_corp_info = orderDetail.getJSONObject("dealer_corp_info");
-                wxOrder.setDealerCorpid(dealer_corp_info.getString("corpid"));
-                wxOrder.setDealerCorpName(dealer_corp_info.getString("corp_name"));
+                wxOrder.setServiceShareAmount(orderDetail.getInteger("service_share_amount"));
+                wxOrder.setPlatformShareAmount(orderDetail.getInteger("platform_share_amount"));
+                wxOrder.setDealerShareAmount(orderDetail.getInteger("dealer_share_amount"));
+                if (orderDetail.containsKey("dealer_corp_info")){
+                    JSONObject dealer_corp_info = orderDetail.getJSONObject("dealer_corp_info");
+                    wxOrder.setDealerCorpid(dealer_corp_info.getString("corpid"));
+                    wxOrder.setDealerCorpName(dealer_corp_info.getString("corp_name"));
+                }
                 //获取该公司对象
                 WxCorpInfo corpid = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("corpid", wxOrder.getPaidCorpid()));
                 Company company = companyMapper.selectById(corpid.getCompanyId());
@@ -2869,4 +2886,11 @@ public class WeiXinCorpController {
         }
         return msg;
     }
+
+    @RequestMapping("/testMsg")
+    public HttpRespMsg testMsg() {
+        String str = "<xml><ToUserName><![CDATA[wpy9TkCAAAFDNLcpmWNM2fMegkAbjr5Q]]></ToUserName><FromUserName><![CDATA[woy9TkCAAA2g_nfDHQxJ_ipomMs9rMCQ]]></FromUserName><CreateTime>1667874192</CreateTime><MsgType><![CDATA[event]]></MsgType><AgentID>1000057</AgentID><Event><![CDATA[subscribe]]></Event></xml>";
+
+        return new HttpRespMsg();
+    }
 }

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

@@ -17,4 +17,6 @@ import java.util.Map;
 public interface BusinessTripMapper extends BaseMapper<BusinessTrip> {
 
     public List<BusinessTrip> summaryData(String keyword, String startDate, String endDate, Integer companyId);
+
+    List<Map<String,Object>> selectBusiness(String startDate, String endDate,String deptId);
 }

+ 18 - 3
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java

@@ -22,6 +22,7 @@ import org.apache.http.impl.client.CloseableHttpClient;
 import org.apache.http.impl.client.HttpClients;
 import org.apache.http.message.BasicNameValuePair;
 import org.apache.http.util.EntityUtils;
+import org.apache.ibatis.annotations.Select;
 import org.apache.poi.EncryptedDocumentException;
 import org.apache.poi.hssf.usermodel.HSSFCell;
 import org.apache.poi.hssf.usermodel.HSSFRow;
@@ -7677,17 +7678,31 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
             total = maps.size();
         }
         WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", user.getCompanyId()));
+        System.err.println(resultList.toString());
         if (resultList.size() > 0){
             for (Map<String, Object> stringObjectMap : resultList) {
-                Department department = departmentMapper.selectById(stringObjectMap.get("departmentId").toString());
-                if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                Department department = departmentMapper.selectById(stringObjectMap.get("deptId").toString());
+                if ("0".equals(stringObjectMap.get("deptId").toString())){
+                    stringObjectMap.put("deptName","未分配");
+                }else if (wxCorpInfo!=null && wxCorpInfo.getSaasSyncContact()==1 && department != null){
                     stringObjectMap.put("deptName",getWxDepartment(department));
                 }else {
                     stringObjectMap.put("deptName",getSupDepartment(department));
                 }
+                stringObjectMap.put("deptHeadCount",stringObjectMap.get("deptHeadCount")==null?0:stringObjectMap.get("deptHeadCount"));
                 stringObjectMap.put("projectCount",stringObjectMap.get("projectCount")==null?0:stringObjectMap.get("projectCount"));
-                stringObjectMap.put("tripCount",stringObjectMap.get("tripCount")==null?0:stringObjectMap.get("tripCount"));
+                stringObjectMap.put("centerCount",stringObjectMap.get("centerCount")==null?0:stringObjectMap.get("centerCount"));
                 stringObjectMap.put("peopleCount",stringObjectMap.get("peopleCount")==null?0:stringObjectMap.get("peopleCount"));
+                if (StringUtils.isEmpty(startDate) && StringUtils.isEmpty(endDate)){
+                    List<Map<String,Object>> businessTrips = businessTripMapper.selectBusiness(null, null,stringObjectMap.get("deptId").toString());
+                    Integer dayCount = businessTrips.stream().collect(Collectors.summingInt((b) -> (int)b.get("dayCount")));
+                    stringObjectMap.put("tripCount",dayCount==null?0:dayCount);
+                }else{
+                    List<Map<String,Object>> businessTrips = businessTripMapper.selectBusiness(startDate,endDate,stringObjectMap.get("deptId").toString());
+                    for (Map<String, Object> businessTrip : businessTrips) {
+
+                    }
+                }
             }
         }
         HashMap<String, Object> result = new HashMap<>();

+ 14 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/BusinessTripMapper.xml

@@ -45,4 +45,18 @@
         and business_trip.company_id = #{companyId}
         group by owner_id
     </select>
+
+    <select id="selectBusiness" resultType="java.util.Map">
+        SELECT `user`.department_id deptId,start_date startDate,end_date endDate,day_count dayCount
+        FROM business_trip
+        LEFT JOIN `user`
+        on business_trip.owner_id = `user`.id
+        WHERE STATUS = 0
+        <if test="deptId!=null and deptId!=''">
+            and user.department_id = #{deptId}
+        </if>
+        <if test="startDate!=null and startDate!='' and endDate!=null and endDate!=''">
+            and business_trip.startDate &lt;= #{endDate} and business_trip.endDate >= #{startDate}
+        </if>
+    </select>
 </mapper>

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

@@ -1283,58 +1283,40 @@
 
     <!--    分页查询部门参与项目情况-->
     <select id="selectDeptPartInProjects" resultType="java.util.Map">
-        SELECT department.department_id AS departmentId,
-        department.department_name AS deptName,
-        u.projectCount,
-        u.peopleCount,
-        t.trip AS tripCount
-        from department
-        left JOIN (
-        SELECT `user`.department_id AS departmentId,
-        COUNT(DISTINCT(project.id)) AS projectCount,
-        COUNT(`user`.id) AS peopleCount
-        from  `user`
-        LEFT JOIN participation ON `user`.id = participation.user_id
-        LEFT JOIN project ON project.id = participation.project_id
-        WHERE user.company_id = #{companyId}
-        and project.id is not null
-        <if test="branchDepartment!=null and branchDepartment.size()>0">
-            and user.department_id in
-            <foreach collection="branchDepartment" open="(" close=")" separator="," item="item">
-                #{item}
-            </foreach>
-        </if>
-        <if test="deptIds!=null and deptIds.size()>0">
-            and user.department_id in
-            <foreach collection="deptIds" open="(" item="item" close=")" separator=",">
-                #{item}
-            </foreach>
-        </if>
-        <if test="startDate!= null and startDate!= ''" >
-            and project.create_date &gt;= #{startDate}
-        </if>
-        <if test="endDate!= null and endDate!= ''">
-            and project.create_date &lt;= #{endDate}
-        </if>
-        GROUP BY `user`.department_id
-        ) u ON department.department_id = u.departmentId
-        left join (
-            SELECT u.deptId AS deptId,SUM(tripCount) AS trip
-            FROM (
-            SELECT `user`.department_id AS deptId,SUM(day_count) AS tripCount from business_trip
-            LEFT JOIN `user` ON business_trip.owner_id = `user`.id
-            where STATUS  = 0
-            AND user.company_id = #{companyId}
-            <if test="endDate!= null and endDate!= ''" >
-                and business_trip.start_date &lt;=#{endDate}
+        SELECT department.department_id deptId,
+        department_name deptName,
+        COUNT(`user`.id) deptHeadCount,
+        pro.projectCount projectCount,
+        pro.centerCount centerCount,
+        pcon.peopleCount peopleCount
+        FROM department
+        LEFT JOIN `user`
+        ON `user`.department_id = department.department_id
+        LEFT JOIN (
+            SELECT report.dept_id,COUNT(DISTINCT(report.project_id)) projectCount,
+            COUNT(DISTINCT(r.degree_id)) centerCount
+            FROM report
+            LEFT JOIN report r
+            ON report.id = r.id AND r.degree_id != -1
+            WHERE report.state = 1
+            <if test="startDate!= null and startDate!= '' and endDate!=  null and endDate!= ''" >
+                And report.create_date BETWEEN #{startDate} AND #{endDate}
             </if>
-            <if test="startDate!= null and startDate!= ''">
-                and business_trip.end_date &gt;= #{startDate}
+            GROUP BY report.dept_id
+        ) pro
+        ON pro.dept_id = department.department_id
+        LEFT JOIN (
+            SELECT dept_id,sum(p.con) peopleCount
+            FROM (
+            SELECT dept_id,count(DISTINCT project_id)con FROM report
+            WHERE report.state = 1
+            <if test="startDate!= null and startDate!= '' and endDate!=  null and endDate!= ''" >
+                And report.create_date BETWEEN #{startDate} AND #{endDate}
             </if>
-            GROUP BY `user`.id
-            ) u
-            GROUP BY u.deptId
-        ) t on t.deptId = department.department_id
+            GROUP BY report.creator_id,report.dept_id
+        ) p  GROUP BY p.dept_id
+        ) pcon
+        ON pcon.dept_id = department.department_id
         WHERE department.company_id = #{companyId}
         <if test="branchDepartment!=null and branchDepartment.size()>0">
             and department.department_id in
@@ -1348,7 +1330,8 @@
                 #{item}
             </foreach>
         </if>
-        ORDER BY u.projectCount,u.peopleCount
+        GROUP BY department.department_id,projectCount,centerCount,peopleCount
+        ORDER BY projectCount
         <if test="size!=null and start!=null">
             limit #{start},#{size}
         </if>

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

@@ -243,7 +243,7 @@
     <!--根据员工id,日期获取当天全部报告信息-->
     <select id="getReportByDate" resultType="java.util.Map">
         SELECT a.id, a.project_id as projectId,b.project_name AS project, a.working_time AS time, a.content, a.state, a.time_type as timeType, a.cost, a.report_time_type as reportTimeType, a.start_time as startTime,
-        a.end_time as endTime, b.incharger_id as inchargerId,
+        a.end_time as endTime, b.incharger_id as inchargerId,b.project_code as projectCode,
         a.creator_id as creatorId, d.name as subProjectName,a.task_id as taskId, task.name as taskName, a.is_overtime as isOvertime,a.progress as progress,
         a.department_audit_state as departmentAuditState, a.stage, a.pic_str as picStr, multi_worktime as multiWorktime
         , reject_reason as rejectReason, reject_username as rejectUsername, reject_userid as rejectUserid, degree_id as degree_id,report_extra_degree.name as degreeName,
@@ -379,7 +379,7 @@
     <select id="getUserReportByDate" resultType="java.util.Map">
         SELECT a.id, b.project_name AS project, a.working_time AS time, a.content, a.state, a.time_type as timeType, a.creator_id as creatorId, a.cost, a.report_time_type as reportTimeType, a.start_time as startTime,
         a.end_time as endTime, d.name as subProjectName,a.task_id as taskId, task.name as taskName,
-        b.incharger_id as inchargerId,
+        b.incharger_id as inchargerId,b.project_code as projectCode,
         a.is_overtime as isOvertime,a.progress as progress,
         a.department_audit_state as departmentAuditState, a.stage, a.pic_str as picStr, multi_worktime as multiWorktime
         , reject_reason as rejectReason, reject_username as rejectUsername, reject_userid as rejectUserid, degree_id as degree_id,report_extra_degree.name as degreeName,

+ 13 - 12
fhKeeper/formulahousekeeper/timesheet/config/index.js

@@ -1,19 +1,20 @@
 var path = require('path')
 
 //  var ip = '127.0.0.1'
-// var ip = '47.101.180.183'
-// var ip = '192.168.10.6'
-// var ip = '192.168.2.6'
+var ip = '47.101.180.183'
+// var ip = '47.100.37.243'
+// var ip = '192.168.2.31'
+// var ip = '192.168.2.20'
 
-var os = require('os'), ip = '', ifaces = os.networkInterfaces() // 获取本机ip
-for (var i in ifaces) {
-    for (var j in ifaces[i]) {
-        var val = ifaces[i][j]
-        if (val.family === 'IPv4' && val.address !== '127.0.0.1') {
-            ip = val.address
-        }
-    }
-}
+// var os = require('os'), ip = '', ifaces = os.networkInterfaces() // 获取本机ip
+// for (var i in ifaces) {
+//     for (var j in ifaces[i]) {
+//         var val = ifaces[i][j]
+//         if (val.family === 'IPv4' && val.address !== '127.0.0.1') {
+//             ip = val.address
+//         }
+//     }
+// }
 // 1196735749
 module.exports = {
   build: {

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

@@ -79,6 +79,9 @@
     :stafforpro="radio1"
     :valueDate="valueDate"
     :key="updatakey1"></gantt>
+    <!-- <vueGantt v-if="isDataLoaded" ref="ganttTable1" :stafforpro="radio1"
+    :valueDate="valueDate"
+    :key="updatakey1" :tasks="tasks"></vueGantt> -->
 
   <div class="demand-container" v-if="!isDataLoaded">
     <el-table height="90%" :loading="demandListLoading" :data="demandList">
@@ -176,11 +179,12 @@
 <script>
 import { error } from 'dingtalk-jsapi';
 import Gantt from './gantt.vue';
+import vueGantt from './vueGantt.vue'
 
 export default {
   name: 'project_gantt',
   props: {},
-  components: {Gantt},
+  components: {Gantt, vueGantt},
   data() {
     return {
       taskType: '',

+ 243 - 0
fhKeeper/formulahousekeeper/timesheet/src/views/project/vueGantt.vue

@@ -0,0 +1,243 @@
+<template>
+  <div>
+     <el-table :data="treeDataList" height="490px" row-key="id" show-overflow-tooltip :cell-style="TableCellStyle" size="mini" :span-method="arraySpanMethod" style="width: 100%;margin-bottom: 20px;" border default-expand-all :tree-config="{children: 'children', expandAll: true}" :tree-props="{children: 'children', hasChildren: 'hasChildren'}">
+        <el-table-column prop="text" label="姓名" width="240" fixed="left"></el-table-column>
+        <el-table-column :label="item.name" v-for="(item, index) in headerData" :key="index">
+            <el-table-column :label="items" v-for="items, idx in item.children" :key="idx" width="160px">
+              <template slot-scope="scope">
+                <div>
+                  {{scope.row.end_date | dataValue(scope.column, scope.row)}}
+                </div>
+              </template>
+            </el-table-column>
+        </el-table-column>
+     </el-table>
+  </div>
+</template>
+
+<script>
+export default {
+  props: {
+    stafforpro: {
+        type: [String, Array, Object],
+        default: false
+    },
+    valueDate:{
+        type: [String, Array, Object],
+        default: false
+    },
+    updatakey1:{
+        type: [String, Array, Object],
+        default: false
+    },
+    tasks: {
+        type: Array,
+        default: []
+    }
+  },
+  components: {},
+  data() {
+    return {
+      tableData: [{
+          id: 1,
+          date: '2016-05-02',
+          name: '王小虎',
+          address: '上海市普陀区金沙江路 1518 弄'
+        }, {
+          id: 2,
+          date: '2016-05-04',
+          name: '王小虎',
+          address: '上海市普陀区金沙江路 1517 弄'
+        }, {
+          id: 3,
+          date: '2016-05-01',
+          name: '王小虎',
+          address: '上海市普陀区金沙江路 1519 弄',
+          children: [{
+              id: 31,
+              date: '2016-05-01',
+              name: '王小虎',
+              address: '上海市普陀区金沙江路 1519 弄'
+            }, {
+              id: 32,
+              date: '2016-05-01',
+              name: '王小虎',
+              address: '上海市普陀区金沙江路 1519 弄'
+          }]
+        }, {
+          id: 4,
+          date: '2016-05-03',
+          name: '王小虎',
+          address: '上海市普陀区金沙江路 1516 弄'
+        }],
+        tableData1: [{
+          id: 1,
+          date: '2016-05-02',
+          name: '王小虎',
+          address: '上海市普陀区金沙江路 1518 弄'
+        }, {
+          id: 2,
+          date: '2016-05-04',
+          name: '王小虎',
+          address: '上海市普陀区金沙江路 1517 弄'
+        }, {
+          id: 3,
+          date: '2016-05-01',
+          name: '王小虎',
+          address: '上海市普陀区金沙江路 1519 弄',
+          hasChildren: true
+        }, {
+          id: 4,
+          date: '2016-05-03',
+          name: '王小虎',
+          address: '上海市普陀区金沙江路 1516 弄'
+        }],
+        initialMonth: '', // 开始月份
+        headerData: [], // 表头数据
+        treeDataList: []
+    };
+  },
+  filters: {
+    dataValue: function (endDate, item, value) {
+      if(endDate) {
+        let biaoto = item.label
+        if(biaoto >= value.start_date && biaoto < endDate) {
+          return value.text
+        }
+      }
+    }
+  },
+  computed: {},
+  watch: {},
+  created() {},
+  mounted() {
+    console.log(this.stafforpro)
+    console.log(this.valueDate)
+    console.log(this.updatakey1)
+    console.log(this.tasks)
+    let dataList = []
+    let allDataList = []
+    let star = this.valueDate[0].split('-')
+    let end = this.valueDate[1].split('-')
+    this.initialMonth = star[0] + '-' + star[1]
+    dataList = this.getYearAndMonth(star[0] + '-' + star[1], end[0] + '-' + end[1])
+    allDataList = this.getdiffdate(this.valueDate[0], this.valueDate[1])
+    this.combination(dataList, allDataList)
+    this.treeDataList = this.integrationTree(this.tasks.data)
+  },
+  methods: {
+    // 截取两个日期的月份数
+     getYearAndMonth(start, end) {
+      console.log(start, end)
+      let monthList = [];
+      let starts = start.split('-');
+      let ends = end.split('-');
+      let staYear = parseInt(starts[0]);
+      let staMon = parseInt(starts[1]);
+      let endYear = parseInt(ends[0]);
+      let endMon = parseInt(ends[1]);
+      while (staYear <= endYear) {
+        if (staYear === endYear) {
+          while (staMon < endMon) {
+            staMon++;
+            var str = staYear + '-'+(staMon >= 10 ? staMon : '0' + staMon);
+            monthList.push(str);
+          }
+          staYear++;
+        } else {
+          staMon++;
+          if (staMon > 12) {
+            staMon = 1;
+            staYear++;
+          }
+          let str = staYear + '-'+(staMon >= 10 ? staMon : '0' + staMon);
+          monthList.push(str);
+        }
+      }
+      return monthList;
+    },
+    // 获取所有期间的日期
+    getdiffdate(stime,etime){
+      var diffdate = new Array();
+      var i=0;
+      while(stime<=etime){
+          diffdate[i] = stime;
+          var stime_ts = new Date(stime).getTime();
+          var next_date = stime_ts + (24*60*60*1000);
+          var next_dates_y = new Date(next_date).getFullYear()+'-';
+          var next_dates_m = (new Date(next_date).getMonth()+1 < 10)?'0'+(new Date(next_date).getMonth()+1)+'-':(new Date(next_date).getMonth()+1)+'-';
+          var next_dates_d = (new Date(next_date).getDate() < 10)?'0'+new Date(next_date).getDate():new Date(next_date).getDate();
+          stime = next_dates_y+next_dates_m+next_dates_d;
+          i++;
+      }
+      return diffdate
+    },
+    // 计算组合月份和日期
+    combination(month, data) {
+      let monthStr = [this.initialMonth, ...month]
+      let arrList = []
+      for(let i in monthStr) {
+        let obj = {}
+        obj.name = monthStr[i]
+        obj.children = []
+        for(let j in data) {
+          if(data[j].indexOf(monthStr[i]) != '-1') {
+            obj.children.push(data[j])
+          }
+        }
+        arrList.push(obj)
+      }
+      this.headerData = arrList
+      console.log(this.headerData)
+    },
+    // 接收的数据整合成树形结构
+    integrationTree(data) {
+       let treeData = []
+       if(!Array.isArray(data)) {
+           return treeData
+       }
+       data.forEach(item => {
+           delete item.children;
+       });
+       let map = {};
+       data.forEach(item => {
+        if(item.text == '杨峰') {
+          console.log(item)
+        }
+           map[item.id] = item;
+       });
+       data.forEach(item => {
+           let parent = map[item.parent];
+           if(parent) {
+               (parent.children || (parent.children = [])).push(item);
+           } else {
+               treeData.push(item);
+           }
+       });
+       return treeData;
+    },
+    arraySpanMethod({ row, column, rowIndex, columnIndex }) {
+        if (rowIndex == 4) {
+          if (columnIndex == 4) {
+            return [1, 5];
+          } else if (columnIndex === 1) {
+            return [0, 0];
+          }
+        }
+    },
+    // 设置每一个单元格的样式
+    TableCellStyle(row) {
+      if(row.row.color) {
+        let biaoto = row.column.label
+        if(biaoto >= row.row.start_date && biaoto < row.row.end_date) {
+          console.log('进来了')
+          return 'background-color: '+ row.row.color +' !important;'
+        }
+      }
+    }
+  },
+};
+</script>
+
+<style>
+</style>

+ 9 - 6
fhKeeper/formulahousekeeper/timesheet/src/views/team/index.vue

@@ -220,8 +220,9 @@
                     <template slot-scope="scope">
                         <el-button size="mini" type="default" v-if="scope.row.roleName == $t('role.superAdministrator') && user.id == scope.row.id" @click="transferRole(scope.row)">{{ $t('transfer') }}</el-button>
                         <el-button size="mini" type="default" v-if="scope.row.roleName != $t('role.superAdministrator')" @click="resetPwd(scope.row)">{{ $t('reset') }}</el-button>
-                        <el-button size="mini" type="primary" v-if="scope.row.roleName != $t('role.superAdministrator')" @click="openInsertDialog(scope.row)">{{ $t('bian-ji') }}</el-button>
-                        <el-button size="mini" type="primary" v-if="scope.row.roleName == $t('role.superAdministrator')" @click="openInsertDialog1(scope.row)">{{ $t('bian-ji') }}</el-button>
+                        <!-- <el-button size="mini" type="primary" v-if="scope.row.roleName != $t('role.superAdministrator')" @click="openInsertDialog(scope.row)">{{ $t('bian-ji') }}</el-button> -->
+                        <el-button size="mini" type="primary" @click="openInsertDialog(scope.row, scope.row.roleName)">{{ $t('bian-ji') }}</el-button>
+                        <!-- <el-button size="mini" type="primary" v-if="scope.row.roleName == $t('role.superAdministrator')" @click="openInsertDialog1(scope.row)">{{ $t('bian-ji') }}</el-button> -->
                         <!-- <el-button size="mini" type="danger"  v-if="scope.row.roleName != $t('role.superAdministrator')" @click="deleteUser(scope.row)">删除</el-button> -->
                         <el-button size="mini" type="default" v-if="scope.row.roleName != $t('role.superAdministrator') && scope.row.isActive==1" @click="showDeactiveDialog(scope.row)">{{ $t('ting-yong') }}</el-button>
                         <el-button size="mini" type="success" v-if="scope.row.roleName != $t('role.superAdministrator') && scope.row.isActive==0" @click="setActive(scope.row, 1)">{{ $t('enable') }}</el-button>
@@ -330,7 +331,7 @@
         </el-dialog>
 
         <!-- 新增/编辑人员的Dialog -->
-        <el-dialog :title="title" :visible.sync="dialogVisible" width="550px" :top="'7.5vh'">
+        <el-dialog :title="title" :visible.sync="dialogVisible" width="580px" :top="'7.5vh'">
             <div style="height: 62vh;overflow: auto;">
               <el-form ref="form12" :model="insertForm" :rules="rules" label-width="80px">
                   <el-form-item :label="$t('lable.name')" prop="name">
@@ -376,7 +377,7 @@
                           </el-option>
                       </el-select>
                   </el-form-item> -->
-                  <el-form-item :label="$t('jiao-se')" prop="roleId">
+                  <el-form-item :label="$t('jiao-se')" prop="roleId" v-if="roleNameFlg != $t('role.superAdministrator')">
                       <el-select v-model="insertForm.roleId" :placeholder="$t('defaultText.pleaseChoose')" style="width: 100%">
                           <el-option v-for="item in acquireRoleList" :label="item.rolename" :value="item.id" :key="item.name">
                               <span style="float: left">{{item.rolename}}</span>
@@ -759,6 +760,7 @@ export default {
   },
   data() {
     return {
+      roleNameFlg: '',
       syncHistoryReport: true,
       ymonth: null,
       importingSalaryData: false,
@@ -2183,9 +2185,10 @@ export default {
     },
 
     // 新增、编辑人员
-    openInsertDialog(row) {
+    openInsertDialog(row, roleNameFlg) {
+      this.roleNameFlg = roleNameFlg
       if (row != null) {
-        var list = JSON.parse(JSON.stringify(row)),
+          var list = JSON.parse(JSON.stringify(row)),
           arr = [],
           array = [];
         if (list.departmentCascade != "0" && list.departmentCascade != null) {

+ 50 - 41
fhKeeper/formulahousekeeper/timesheet_h5/src/components/Footer.vue

@@ -1,30 +1,32 @@
 <template>
-    <ul class="footer flex jc-sa w100pc fixed bott0 bg-fff aic footer">
-        <li class="item">
-            <router-link to="/index" class="flex2 aic f20 yellow" active-class="active">
-                <i class="icon-home iconfont f18 text"></i>
-                <p class="mt-5 f12 text">首页</p>
-            </router-link>
-        </li>
-        <li class="item" v-if="reportsCompany || this.user.manageDeptId != 0 || reportsDept">
-            <router-link to="/count" class="flex2 aic f20 text" active-class="active">
-                <van-icon class="text" name="bar-chart-o" />
-                <p class="mt-5 text f12">填报统计</p>
-            </router-link>
-        </li>
-        <li class="item" v-if="cost">
-            <router-link to="/cost" class="flex2 aic f20 text" active-class="active">
-                <van-icon class="text" name="after-sale" />
-                <p class="mt-5 text f12">成本统计</p>
-            </router-link>
-        </li>
-        <li class="item">
-            <router-link to="/my" class="flex2 aic f20 text" active-class="active">
-                <van-icon class="text" name="user-o"></van-icon>
-                <p class="mt-5 text f12">我的</p>
-            </router-link>
-        </li>
-  </ul>
+    <div>
+        <ul class="footer flex jc-sa w100pc fixed bott0 bg-fff aic footer">
+            <li class="item">
+                <router-link to="/index" class="flex2 aic f20 yellow" active-class="active">
+                    <i class="icon-home iconfont f18 text"></i>
+                    <p class="mt-5 f12 text">首页</p>
+                </router-link>
+            </li>
+            <li class="item" v-if="reportsCompany || this.user.manageDeptId != 0 || reportsDept">
+                <router-link to="/count" class="flex2 aic f20 text" active-class="active">
+                    <van-icon class="text" name="bar-chart-o" />
+                    <p class="mt-5 text f12">填报统计</p>
+                </router-link>
+            </li>
+            <li class="item" v-if="cost">
+                <router-link to="/cost" class="flex2 aic f20 text" active-class="active">
+                    <van-icon class="text" name="after-sale" />
+                    <p class="mt-5 text f12">成本统计</p>
+                </router-link>
+            </li>
+            <li class="item">
+                <router-link to="/my" class="flex2 aic f20 text" active-class="active">
+                    <van-icon class="text" name="user-o"></van-icon>
+                    <p class="mt-5 text f12">我的</p>
+                </router-link>
+            </li>
+    </ul>
+  </div>
 </template>
 
 <script>
@@ -38,23 +40,29 @@
             }
         },
         mounted() {
-            this.reportsCompany = false
-            this.reportsDept = false
-            this.cost = false
-            for(let i in this.user.functionList){
-                if(this.user.functionList[i].name == '查看全公司工时'){
-                    this.reportsCompany = true
-                }
-                if(this.user.functionList[i].name == '查看本部门工时'){
-                    this.reportsDept = true
+            this.dealWith()
+        },
+        methods: {
+            dealWith() {
+                this.user = JSON.parse(localStorage.userInfo)
+                this.reportsCompany = false
+                this.reportsDept = false
+                this.cost = false
+                for(let i in this.user.functionList){
+                    if(this.user.functionList[i].name == '查看全公司工时'){
+                        this.reportsCompany = true
+                    }
+                    if(this.user.functionList[i].name == '查看本部门工时'){
+                        this.reportsDept = true
+                    }
                 }
-            }
-            for(let i in this.user.moduleList){
-                if(this.user.moduleList[i].name == '工时成本统计'){
-                    this.cost = true
+                for(let i in this.user.moduleList){
+                    if(this.user.moduleList[i].name == '工时成本统计'){
+                        this.cost = true
+                    }
                 }
             }
-        },
+        }
     };
 </script>
 
@@ -65,7 +73,8 @@
         position: fixed;
         bottom: 0;
         width: 100%;
-        bottom: 0;
+        left: 0;
+        z-index: 10;
         .text {
             color: #797d82;
         }

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

@@ -18,7 +18,7 @@
             体验报表统计等更多功能,尽在PC端<br>
             网页用户访问http://worktime.ttkuaiban.com,钉钉用户直接从钉钉PC端进入工时管家
         </div>
-        <Footer page="index"></Footer>
+        <Footer ref="child" :key="key"></Footer>
     </div>
 </template>
 <script>
@@ -37,6 +37,7 @@
                     // require('../../assets/img/index/banner_3.png'),
                 ],
                 routers: [],
+                key: 0
             };
         },
         created() {
@@ -222,8 +223,11 @@
                     } else {
                         localStorage.userInfo = JSON.stringify(res.data);
                         this.user = res.data;
+                        this.$refs.child.dealWith()
+                        this.key++
                         this.getModule()
                         this.getMessage();
+                        this.$forceUpdate()
                         // this.bindIfNessary();
                     } 
                 }).catch(err=> {