|
@@ -7589,4 +7589,304 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
|
|
msg.setData(responseData);
|
|
msg.setData(responseData);
|
|
return msg;
|
|
return msg;
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public HttpRespMsg getUserTimeCostByThird(String json) {
|
|
|
|
+ HttpRespMsg httpRespMsg=new HttpRespMsg();
|
|
|
|
+ DateFormat timeDf = new SimpleDateFormat("yyyy-MM-dd");
|
|
|
|
+ JSONObject requestData = JSONObject.parseObject(json);
|
|
|
|
+ if(requestData.get("header")==null){
|
|
|
|
+ httpRespMsg.setError("Request Parameter Parsing Error,Unable to find 'header'");
|
|
|
|
+ return httpRespMsg;
|
|
|
|
+ }
|
|
|
|
+ JSONObject requestHeader = JSONObject.parseObject(String.valueOf(requestData.get("header")));
|
|
|
|
+ if(requestData.get("memberQuery")==null){
|
|
|
|
+ httpRespMsg.setError("Request Parameter Parsing Error,Unable to find 'memberQuery'");
|
|
|
|
+ return httpRespMsg;
|
|
|
|
+ }
|
|
|
|
+ JSONObject memberQueryQuery = JSONObject.parseObject(String.valueOf(requestData.get("memberQuery")));
|
|
|
|
+ if(requestHeader.get("token")==null){
|
|
|
|
+ httpRespMsg.setError("Request Parameter Parsing Error,Unable to find 'token'");
|
|
|
|
+ return httpRespMsg;
|
|
|
|
+ }
|
|
|
|
+ String requestToken = String.valueOf(requestHeader.get("token"));
|
|
|
|
+ List<ThirdPartyInterface> thirdPartyInterfaces = thirdPartyInterfaceMapper.selectList(new QueryWrapper<ThirdPartyInterface>().eq("token", requestToken));
|
|
|
|
+ if(thirdPartyInterfaces.size()<=0){
|
|
|
|
+ httpRespMsg.setError("Validation failed,'token' is Error");
|
|
|
|
+ return httpRespMsg;
|
|
|
|
+ }
|
|
|
|
+ Integer companyId = thirdPartyInterfaces.get(0).getCompanyId();
|
|
|
|
+ Company company = companyMapper.selectById(companyId);
|
|
|
|
+ if(LocalDateTime.now().isAfter(thirdPartyInterfaces.get(0).getExpireTime())){
|
|
|
|
+ httpRespMsg.setError("'token' is Expire");
|
|
|
|
+ return httpRespMsg;
|
|
|
|
+ }
|
|
|
|
+ if(memberQueryQuery.get("personnelId")==null&&memberQueryQuery.get("organizationId")==null){
|
|
|
|
+ httpRespMsg.setError("Request Parameter Parsing Error,Unable to find 'personnelId' or 'organizationId',There must be a non empty parameter");
|
|
|
|
+ return httpRespMsg;
|
|
|
|
+ }
|
|
|
|
+ if(memberQueryQuery.get("startDate")==null||memberQueryQuery.get("endDate")==null){
|
|
|
|
+ httpRespMsg.setError("The date range cannot be empty");
|
|
|
|
+ return httpRespMsg;
|
|
|
|
+ }
|
|
|
|
+ String startDate = String.valueOf(memberQueryQuery.get("startDate"));
|
|
|
|
+ String endDate = String.valueOf(memberQueryQuery.get("endDate"));
|
|
|
|
+ DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
|
|
|
|
+ LocalDate start = LocalDate.parse(startDate, dateTimeFormatter);
|
|
|
|
+ LocalDate end = LocalDate.parse(endDate, dateTimeFormatter);
|
|
|
|
+ if (start.until(end, ChronoUnit.DAYS) > 365) {
|
|
|
|
+ httpRespMsg.setError("The time interval shall not exceed one year");
|
|
|
|
+ return httpRespMsg;
|
|
|
|
+ }
|
|
|
|
+ String userId =null;
|
|
|
|
+ String departmentId =null;
|
|
|
|
+ Integer stateKey =0;
|
|
|
|
+ if(memberQueryQuery.get("personnelId")!=null){
|
|
|
|
+ userId = String.valueOf(memberQueryQuery.get("personnelId"));
|
|
|
|
+ User user = userMapper.selectOne(new LambdaQueryWrapper<User>().eq(User::getJobNumber, userId));
|
|
|
|
+ if(user!=null){
|
|
|
|
+ userId=user.getId();
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ if(memberQueryQuery.get("organizationId")!=null){
|
|
|
|
+ departmentId = String.valueOf(memberQueryQuery.get("organizationId"));
|
|
|
|
+ Department department = departmentMapper.selectOne(new LambdaQueryWrapper<Department>().eq(Department::getCorpwxDeptid, departmentId).or().eq(Department::getDepartmentId, departmentId));
|
|
|
|
+ if(department!=null){
|
|
|
|
+ departmentId = String.valueOf(department.getDepartmentId());
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+ if(memberQueryQuery.get("stateKey")!=null){
|
|
|
|
+ stateKey = Integer.valueOf(String.valueOf(memberQueryQuery.get("stateKey")));
|
|
|
|
+ }
|
|
|
|
+ Map<String,Object> responseData=new HashMap<>();
|
|
|
|
+ //检查模式,是否是一个项目多个工作事项的情况
|
|
|
|
+ TimeType timeType = timeTypeMapper.selectOne(new QueryWrapper<TimeType>().eq("company_id",companyId));
|
|
|
|
+ WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", companyId));
|
|
|
|
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
|
|
|
|
+ List<Map<String,Object>> dataList=new ArrayList<>();
|
|
|
|
+
|
|
|
|
+ List<HashMap<String, Object>> allReportByDate = null;
|
|
|
|
+
|
|
|
|
+ //获取部门的所有子部门
|
|
|
|
+ List<Department> departments = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id",companyId));
|
|
|
|
+ List<Integer> branchDepartment = null;
|
|
|
|
+ if(departmentId != null){
|
|
|
|
+ branchDepartment = departmentService.getBranchDepartment(Integer.valueOf(departmentId),departments);
|
|
|
|
+ }
|
|
|
|
+ //看公司所有人的
|
|
|
|
+ if (timeType.getShowFillauditTime() == 1) {
|
|
|
|
+ allReportByDate = reportMapper.getAllReportByDateWithReportLog(startDate, companyId, userId, endDate, null,stateKey,branchDepartment);
|
|
|
|
+ } else {
|
|
|
|
+ allReportByDate = reportMapper.getAllReportByDate(startDate,companyId, userId, endDate, null,stateKey,branchDepartment);
|
|
|
|
+ }
|
|
|
|
+ if (timeType.getMultiWorktime() == 1) {
|
|
|
|
+ java.text.DecimalFormat df = new java.text.DecimalFormat("#0.00");
|
|
|
|
+ //重新处理一下数据,把工作时间和工作事项移出来
|
|
|
|
+ List<HashMap<String, Object>> dealDataList = new ArrayList<HashMap<String, Object>>();
|
|
|
|
+ for (HashMap<String, Object> map : allReportByDate) {
|
|
|
|
+ if ((Integer)map.get("multiWorktime") == 1) {
|
|
|
|
+ String data = (String)map.get("content");
|
|
|
|
+ Integer isOvertime = (Integer) map.get("isOvertime");
|
|
|
|
+ JSONArray array = JSONArray.parseArray(data);
|
|
|
|
+ if (array != null) {
|
|
|
|
+ for (int i=0;i<array.size(); i++) {
|
|
|
|
+ JSONObject obj = array.getJSONObject(i);
|
|
|
|
+ WorktimeItem worktimeItem = JSONObject.toJavaObject(obj, WorktimeItem.class);
|
|
|
|
+ HashMap<String, Object> newMap = new HashMap<>();
|
|
|
|
+ newMap.putAll(map);
|
|
|
|
+ newMap.put("startTime", worktimeItem.getStartTime());
|
|
|
|
+ newMap.put("endTime", worktimeItem.getEndTime());
|
|
|
|
+ newMap.put("content", worktimeItem.getContent());
|
|
|
|
+ newMap.put("duration", df.format(worktimeItem.getTime()));
|
|
|
|
+ //第一条填充加班
|
|
|
|
+ if (isOvertime == 1 && i == 0) {
|
|
|
|
+ newMap.put("isOvertime", 1);
|
|
|
|
+ newMap.put("overtimeHours", map.get("overtimeHours"));
|
|
|
|
+ } else {
|
|
|
|
+ newMap.put("isOvertime", 0);
|
|
|
|
+ }
|
|
|
|
+ dealDataList.add(newMap);
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ HashMap<String, Object> newMap = new HashMap<>();
|
|
|
|
+ newMap.putAll(map);
|
|
|
|
+ newMap.put("startTime", "");
|
|
|
|
+ newMap.put("endTime", "");
|
|
|
|
+ newMap.put("content", "");
|
|
|
|
+ dealDataList.add(newMap);
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ dealDataList.add(map);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ allReportByDate = dealDataList;
|
|
|
|
+ }
|
|
|
|
+ DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
|
|
|
|
+ DecimalFormat df = new DecimalFormat("#0.0");
|
|
|
|
+ int offsetSeconds = 0;
|
|
|
|
+ if (company.getIsInternational() == 1) {
|
|
|
|
+ //国际化版本
|
|
|
|
+ LocaleInformation locale = localeInformationMapper.selectById(companyId);
|
|
|
|
+ TimeZone curZone = TimeZone.getTimeZone(locale.getTimezone());
|
|
|
|
+ offsetSeconds = (curZone.getRawOffset() - TimeZone.getTimeZone("GMT+8").getRawOffset())/1000;
|
|
|
|
+ //时区转换,默认数据库存的是GMT+8
|
|
|
|
+ for (Map<String, Object> map : allReportByDate) {
|
|
|
|
+ String createTime = sdf.format((Date)map.get("time"));
|
|
|
|
+ LocalDateTime time = LocalDateTime.parse(createTime, dtf);
|
|
|
|
+ time = time.plusSeconds(offsetSeconds);
|
|
|
|
+ map.put("time", DateTimeUtil.localDateTimeToDate(time));
|
|
|
|
+
|
|
|
|
+ //审核时间
|
|
|
|
+ if(map.get("projectAuditTime") != null){
|
|
|
|
+ String projectAuditTime = sdf.format((Date)map.get("projectAuditTime"));
|
|
|
|
+ LocalDateTime auditTime = LocalDateTime.parse(projectAuditTime, dtf);
|
|
|
|
+ auditTime = auditTime.plusSeconds(offsetSeconds);
|
|
|
|
+ map.put("projectAuditTime", DateTimeUtil.localDateTimeToDate(auditTime));
|
|
|
|
+ }else map.put("projectAuditTime","");
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ List<User> userList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", companyId));
|
|
|
|
+ long t1 = System.currentTimeMillis();
|
|
|
|
+ DateTimeFormatter dft = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
|
|
|
|
+ for (Map<String, Object> map : allReportByDate) {
|
|
|
|
+ Map<String,Object> item=new HashMap<>();
|
|
|
|
+ item.put("jobNumber",(String) map.get("jobNumber"));
|
|
|
|
+ Department dept = null;
|
|
|
|
+ for (Department department : departments) {
|
|
|
|
+ if (map.containsKey("departmentId") && department.getDepartmentId().toString().equals(map.get("departmentId").toString())){
|
|
|
|
+ dept = department;
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ item.put("userName",(String) map.get("name"));
|
|
|
|
+ item.put("departmentName",departmentService.getSupDepartment(dept,departments));
|
|
|
|
+ item.put("departmentId",dept.getCorpwxDeptid());
|
|
|
|
+ item.put("projectCode",(String) map.get("projectCode"));
|
|
|
|
+ item.put("projectName",(String) map.get("project"));
|
|
|
|
+ item.put("categoryName",(String) map.get("categoryName"));
|
|
|
|
+ if(timeType.getMainProjectState()==1){
|
|
|
|
+ item.put("projectMainName",(String) map.get("projectMainName"));
|
|
|
|
+ }else {
|
|
|
|
+ item.put("subProjectName",(String) map.get("subProjectName"));
|
|
|
|
+ item.put("subProjectCode",(String) map.get("subProjectCode"));
|
|
|
|
+ }
|
|
|
|
+ if (company.getPackageProject() == 1) {
|
|
|
|
+ item.put("taskName",(String) map.get("taskName"));
|
|
|
|
+ }
|
|
|
|
+ item.put("createDate",new SimpleDateFormat("yyyy-MM-dd")
|
|
|
|
+ .format((java.sql.Date) map.get("createDate")));
|
|
|
|
+ item.put("duration",map.get("duration").toString());
|
|
|
|
+ if (timeType.getMultiWorktime() == 1) {
|
|
|
|
+ if ((Integer)map.get("multiWorktime") == 1) {
|
|
|
|
+ item.put("multiWorktime",map.get("startTime").toString()+"-"+map.get("endTime").toString());
|
|
|
|
+ } else {
|
|
|
|
+ item.put("multiWorktime","");
|
|
|
|
+ }
|
|
|
|
+ //加班情况
|
|
|
|
+ int isOverTime = (Integer) map.get("isOvertime");
|
|
|
|
+ item.put("overtimeHours",isOverTime==1?(df.format((double)map.get("overtimeHours"))):"-");
|
|
|
|
+ }
|
|
|
|
+ if (timeType.getMultiWorktime() == 0) {
|
|
|
|
+ int isOverTime = (Integer) map.get("isOvertime");
|
|
|
|
+ item.put("overtimeHours",isOverTime==1?(df.format((double)map.get("overtimeHours"))):"-");
|
|
|
|
+ }
|
|
|
|
+ //项目管理专业版,需要显示任务分组和投入阶段
|
|
|
|
+ if (company.getPackageProject() == 1) {
|
|
|
|
+ item.put("groupName",map.get("groupName") != null? map.get("groupName").toString():"");
|
|
|
|
+ item.put("stage",map.get("stage") != null?map.get("stage").toString():"");
|
|
|
|
+ }
|
|
|
|
+ if (timeType.getShowFillauditTime() == 1) {
|
|
|
|
+ item.put("time",sdf.format((Date)map.get("time")));
|
|
|
|
+ item.put("projectAuditorName",(String)map.get("projectAuditorName"));
|
|
|
|
+ //分组审核通过或者项目审核通过都显示
|
|
|
|
+ if (map.get("projectAuditTime") != null && ((Integer)map.get("projectAuditState") == 1 || (Integer)map.get("groupAuditState") == 1)) {
|
|
|
|
+ item.put("projectAuditTime",sdf.format((Date)map.get("projectAuditTime")));
|
|
|
|
+ } else {
|
|
|
|
+ item.put("projectAuditTime","");
|
|
|
|
+ }
|
|
|
|
+ StringBuilder sb = new StringBuilder();
|
|
|
|
+ boolean isFirst = true;
|
|
|
|
+ String logMsg = (String)map.get("logMsg");
|
|
|
|
+ if (logMsg != null) {
|
|
|
|
+ String[] logMsgs = logMsg.split("❤");
|
|
|
|
+ for (String msgItem : logMsgs) {
|
|
|
|
+ String[] splitItems = msgItem.split("@");
|
|
|
|
+ //operator_id@operate_date@msg
|
|
|
|
+ String operateDateStr = splitItems[1];
|
|
|
|
+ LocalDateTime operateDate = LocalDateTime.parse(operateDateStr, dtf);
|
|
|
|
+ ReportLogDetail audit = new ReportLogDetail();
|
|
|
|
+ audit.setOperatorId(splitItems[0]);
|
|
|
|
+ audit.setOperateDate(operateDate);
|
|
|
|
+ audit.setMsg(splitItems[2]);
|
|
|
|
+
|
|
|
|
+ if (company.getIsInternational() == 1) {
|
|
|
|
+ operateDate = operateDate.plusSeconds(offsetSeconds);
|
|
|
|
+ }
|
|
|
|
+ String time = dtf.format(operateDate);
|
|
|
|
+ String msg= "";
|
|
|
|
+ msg = time+" " + audit.getMsg();
|
|
|
|
+ if (!isFirst) {
|
|
|
|
+ sb.append("->");
|
|
|
|
+ } else {
|
|
|
|
+ isFirst = false;
|
|
|
|
+ }
|
|
|
|
+ sb.append(msg);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ item.put("reviewProcess",sb.toString());
|
|
|
|
+ }
|
|
|
|
+ item.put("content",(String) map.get("content"));
|
|
|
|
+ if(stateKey==1){
|
|
|
|
+ Integer state = (Integer) map.get("state");
|
|
|
|
+ switch (state){
|
|
|
|
+ //case 0:row.createCell(index).setCellValue("待审核");
|
|
|
|
+ case 0:item.put("state",MessageUtils.message("stages.reviewed"));
|
|
|
|
+ break;
|
|
|
|
+ //case 1:row.createCell(index).setCellValue("已通过");
|
|
|
|
+ case 1:item.put("state",MessageUtils.message("stages.passed"));
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ //审核流程状态
|
|
|
|
+ Integer packageEngineering = company.getPackageEngineering();
|
|
|
|
+ if (packageEngineering.equals(0)){
|
|
|
|
+ if(String.valueOf(map.get("state")).equals("1")){
|
|
|
|
+ item.put("reviewProcessState","——");
|
|
|
|
+ }else if (String.valueOf(map.get("state")).equals("-1")){
|
|
|
|
+ item.put("reviewProcessState","导入待审核");
|
|
|
|
+ } else {
|
|
|
|
+ //部门审核
|
|
|
|
+ if(String.valueOf(map.get("isDeptAudit")).equals("1")){
|
|
|
|
+ String deptAuditorId = map.get("deptAuditorName")+"";
|
|
|
|
+ String departmentName = map.get("departmentName") + "";
|
|
|
|
+ for (User userItem : userList) {
|
|
|
|
+ if (userItem.getId().equals(deptAuditorId)){
|
|
|
|
+ if(timeType.getReportAuditType()==4){
|
|
|
|
+ departmentName = map.get("buDepartmentName") + "";
|
|
|
|
+ item.put("reviewProcessState","待项目所属BU[" + departmentName + "](" + userItem.getName() + ")审核");
|
|
|
|
+ }else {
|
|
|
|
+ item.put("reviewProcessState","待" + departmentName + "(" + userItem.getName() + ")审核");
|
|
|
|
+ }
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+ }else {
|
|
|
|
+ //项目审核或分组审核
|
|
|
|
+ if (String.valueOf(map.get("projectAuditState")).equals("0") || String.valueOf(map.get("groupAuditState")).equals("0")){
|
|
|
|
+ String projectAuditorName = map.get("projectAuditorName")+"";
|
|
|
|
+ String projectAuditorId = map.get("projectAuditorId")+"";
|
|
|
|
+ item.put("reviewProcessState","待项目审核人" + "(" + projectAuditorName + ")审核");
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ dataList.add(item);
|
|
|
|
+ }
|
|
|
|
+ responseData.put("userTimeCostArray",dataList);
|
|
|
|
+ httpRespMsg.setData(responseData);
|
|
|
|
+ return httpRespMsg;
|
|
|
|
+ }
|
|
}
|
|
}
|