package com.java110.user.cmd.property; import com.alibaba.fastjson.JSONObject; import com.java110.core.annotation.Java110Cmd; import com.java110.core.context.ICmdDataFlowContext; import com.java110.core.event.cmd.Cmd; import com.java110.core.event.cmd.CmdEvent; import com.java110.user.dao.property.IAttendanceRecordV1ServiceDao; import com.java110.utils.exception.CmdException; import com.java110.vo.ResultVo; import org.springframework.beans.factory.annotation.Autowired; import java.text.ParseException; import java.util.*; /** * 查询今日考勤明细,无视权限,查询系统中所有员工(所有有打卡记录的用户) */ @Java110Cmd(serviceCode = "property.queryTodayAttendanceDetail") public class QueryTodayAttendanceDetailCmd extends Cmd { @Autowired private IAttendanceRecordV1ServiceDao attendanceRecordV1ServiceDao; @Override public void validate(CmdEvent event, ICmdDataFlowContext context, JSONObject reqJson) throws CmdException, ParseException { } @Override public void doCmd(CmdEvent event, ICmdDataFlowContext context, JSONObject reqJson) throws CmdException, ParseException { String today = getToday(reqJson); // 1. 查全系统所有员工(有过打卡记录的用户) List allUsers = attendanceRecordV1ServiceDao.queryAllAttendanceUsers(new HashMap<>()); // 2. 查今日打卡记录 Map recordParams = new HashMap<>(); recordParams.put("startTime", today + " 00:00:00"); recordParams.put("endTime", today + " 23:59:59"); List records = attendanceRecordV1ServiceDao.queryAttendanceRecords(recordParams); // 3. 按 userId 分组今日打卡记录 Map punchMap = new LinkedHashMap<>(); for (Map r : records) { String uid = (String) r.get("user_id"); String type = (String) r.get("punch_type"); punchMap.putIfAbsent(uid, new HashMap()); Map pd = punchMap.get(uid); pd.put("staffId", uid); pd.put("staffName", r.get("user_name")); if ("ON".equals(type) && pd.get("onTime") == null) pd.put("onTime", r.get("punch_time")); if ("OFF".equals(type)) pd.put("offTime", r.get("punch_time")); } // 4. 构建全系统员工→store映射 Map userStoreMap = new HashMap<>(); for (Map u : allUsers) { userStoreMap.put((String) u.get("user_id"), (String) u.get("store_name")); } // 5. 构建结果 Set seen = new HashSet<>(); List result = new ArrayList<>(); for (Map.Entry e : punchMap.entrySet()) { Map data = e.getValue(); data.put("storeName", userStoreMap.getOrDefault(e.getKey(), "")); result.add(buildTask(data)); seen.add(e.getKey()); } for (Map u : allUsers) { String uid = (String) u.get("user_id"); if (!seen.contains(uid)) { Map m = new HashMap(); m.put("staffId", uid); m.put("staffName", u.get("user_name")); m.put("storeName", u.get("store_name")); m.put("onTime", null); m.put("offTime", null); result.add(buildTask(m)); } } context.setResponseEntity(ResultVo.createResponseEntity(result.size(), result.size(), result)); } private Map buildTask(Map data) { Map task = new HashMap(); task.put("taskId", UUID.randomUUID().toString()); task.put("staffId", data.get("staffId")); task.put("staffName", data.getOrDefault("staffName", "")); task.put("storeName", data.getOrDefault("storeName", "")); boolean hasOn = data.get("onTime") != null; task.put("state", hasOn ? "30000" : "10000"); List details = new ArrayList<>(); if (hasOn) { Map d = new HashMap(); d.put("specCd", "1001"); d.put("checkTime", String.valueOf(data.get("onTime"))); details.add(d); } if (data.get("offTime") != null) { Map d = new HashMap(); d.put("specCd", "2002"); d.put("checkTime", String.valueOf(data.get("offTime"))); details.add(d); } task.put("attendanceClassesTaskDetails", details); return task; } private String getToday(JSONObject reqJson) { String date = reqJson.getString("date"); if (date != null && !date.isEmpty()) return date; java.time.LocalDate now = java.time.LocalDate.now(); return now.toString(); } }