Преглед изворни кода

Merge remote-tracking branch 'origin/matser' into matser

ZhuJiaHao пре 8 месеци
родитељ
комит
86a05adf8d
16 измењених фајлова са 740 додато и 101 уклоњено
  1. 14 0
      ibps-api-root/modules/api-base/src/main/java/com/lc/ibps/api/base/context/CurrentContext.java
  2. 28 0
      ibps-base-root/modules/base-web/src/main/java/com/lc/ibps/base/web/context/AbstractContext.java
  3. 15 6
      ibps-base-root/modules/base-web/src/main/java/com/lc/ibps/base/web/context/ContextUtil.java
  4. 7 1
      ibps-common-root/modules/org-biz/src/main/java/com/lc/ibps/org/party/repository/PartyPositionRepository.java
  5. 15 0
      ibps-common-root/modules/org-biz/src/main/java/com/lc/ibps/org/party/repository/impl/PartyPositionRepositoryImpl.java
  6. 4 1
      ibps-oauth-root/modules/oauth-client-httpclient/src/main/java/com/lc/ibps/cloud/oauth/client/service/TokenVerify.java
  7. 4 0
      ibps-oauth-root/modules/oauth-server2-default/src/main/java/com/lc/ibps/cloud/oauth/server/provider/UserProvider.java
  8. 66 19
      ibps-provider-root/modules/provider-business/src/main/java/com/lc/ibps/business/service/impl/ReformServiceImpl.java
  9. 283 9
      ibps-provider-root/modules/provider-business/src/main/java/com/lc/ibps/components/sqlzdy/Service/SwdlServiceImpl.java
  10. 44 0
      ibps-provider-root/modules/provider-business/src/main/java/com/lc/ibps/hrm/control/PersonnelManagementController.java
  11. 18 0
      ibps-provider-root/modules/provider-business/src/main/java/com/lc/ibps/hrm/dao/PersonnelManagementDao.java
  12. 19 0
      ibps-provider-root/modules/provider-business/src/main/java/com/lc/ibps/hrm/service/PersonnelManagementService.java
  13. 102 0
      ibps-provider-root/modules/provider-business/src/main/java/com/lc/ibps/hrm/service/imple/PersonnelManagementServiceImpl.java
  14. 16 0
      ibps-provider-root/modules/provider-business/src/main/resources/com/lc/ibps/klimsibps/mapping/PersonnelManagementMapper.xml
  15. 11 44
      ibps-provider-root/modules/provider-business/src/main/resources/com/lc/ibps/klimsibps/mapping/UpdateDataTableMapper.xml
  16. 94 21
      ibps-provider-root/modules/provider-platform/src/main/java/com/lc/ibps/platform/plan/job/EquipmentMaintenancePlanJob.java

+ 14 - 0
ibps-api-root/modules/api-base/src/main/java/com/lc/ibps/api/base/context/CurrentContext.java

@@ -73,6 +73,18 @@ public interface CurrentContext {
 	 * @return String
 	 */
 	String getCurrentUserId();
+
+	/**
+	 * 获取ipcc表配置字段
+	 * @return String
+	 */
+	String getSetting();
+
+	/**
+	 * 设置ipcc表配置字段
+	 * @return String
+	 */
+	void setSetting(String setting);
 	
 	/**
 	 * 获取当前执行人account
@@ -255,6 +267,8 @@ public interface CurrentContext {
 		public static final String CONTEXT_CLIENT_ID = "context.client.id";
 		
 		public static final String CONTEXT_VAR = "context.var";
+
+		public static final String CONTEXT_SETTING ="context.setting";
 	}
 
 }

+ 28 - 0
ibps-base-root/modules/base-web/src/main/java/com/lc/ibps/base/web/context/AbstractContext.java

@@ -1,9 +1,12 @@
 package com.lc.ibps.base.web.context;
 
+import java.util.List;
 import java.util.Locale;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 
+import com.lc.ibps.base.core.util.AppUtil;
+import com.lc.ibps.base.framework.table.ICommonDao;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -23,6 +26,31 @@ public abstract class AbstractContext implements CurrentContext {
 	 * 当前上下文副本
 	 */
 	private static final ThreadLocal<Map<String, Object>> contextLocal = new InheritableThreadLocal<Map<String, Object>>();
+
+	private ICommonDao<?> commonDao = AppUtil.getBean(ICommonDao.class);
+
+	@Override
+	public String getSetting() {
+		if(getContextLocal().get(CurrentContext.Keys.CONTEXT_SETTING) != null){
+			String setting =(String) getContextLocal().get(Keys.CONTEXT_SETTING);
+			return setting;
+		}
+		String sql = "select id_,setting from t_ipcc where id_ = '1'";
+		List<Map<String, Object>> list = (List<Map<String, Object>>) commonDao.query(sql);
+		String toString = "";
+		if(list.size()>0 && BeanUtils.isNotEmpty(list.get(0).get("setting"))){
+			toString = list.get(0).get("setting").toString();
+		}
+		return toString;
+	}
+
+	@Override
+	public void setSetting(String setting) {
+		if(BeanUtils.isEmpty(setting)){
+			return;
+		}
+		getContextLocal().put(CurrentContext.Keys.CONTEXT_SETTING, setting);
+	}
 	
 	private Map<String, Object> getContextLocal() {
 		Map<String, Object> contextLocalMap = null;

+ 15 - 6
ibps-base-root/modules/base-web/src/main/java/com/lc/ibps/base/web/context/ContextUtil.java

@@ -60,7 +60,7 @@ public class ContextUtil {
 	/**
 	 * 获取当前令牌
 	 * 
-	 * @param accessToken
+	 * @param
 	 */
 	public static String getCurrentAccessToken() {
 		return contextUtil.currentContext.getCurrentAccessToken();
@@ -69,7 +69,7 @@ public class ContextUtil {
 	/**
 	 * 获取当前clientId
 	 * 
-	 * @param clientId
+	 * @param
 	 * @since 3.1.2
 	 */
 	public static String getCurrentClientId() {
@@ -94,7 +94,16 @@ public class ContextUtil {
 	public static String getCurrentUserId() {
 		return contextUtil.currentContext.getCurrentUserId();
 	}
-	
+
+
+	public static String getSetting() {
+		return contextUtil.currentContext.getSetting();
+	}
+
+	public static void  setSetting(String setting) {
+		contextUtil.currentContext.setSetting(setting);
+	}
+
 	/**
 	 * 当前用户账号
 	 *
@@ -251,7 +260,7 @@ public class ContextUtil {
 	/**
 	 * 设置当前执行人租户IDs
 	 * 
-	 * @param tenantId
+	 * @param
 	 */
 	public static void setCurrentTenantIds(String tenantIds) {
 		contextUtil.currentContext.setCurrentTenantIds(tenantIds);
@@ -279,7 +288,7 @@ public class ContextUtil {
 	/**
 	 * 设置当前组织
 	 * 
-	 * @param user
+	 * @param
 	 */
 	public static void setCurrentOrg(PartyEntity org) {
 		contextUtil.currentContext.setCurrentOrg(org);
@@ -288,7 +297,7 @@ public class ContextUtil {
 	/**
 	 * 设置当前主岗位
 	 * 
-	 * @param user
+	 * @param
 	 */
 	public static void setCurrentPosition(PartyEntity position) {
 		contextUtil.currentContext.setCurrentPosition(position);

+ 7 - 1
ibps-common-root/modules/org-biz/src/main/java/com/lc/ibps/org/party/repository/PartyPositionRepository.java

@@ -143,7 +143,13 @@ public interface PartyPositionRepository extends IRepository<String, PartyPositi
 	 * @return 
 	 */
 	List<PartyPositionPo> findByUserId(String userId);
-	
+
+
+	/**
+	 * 查ipcc表
+	 */
+	String finSetting();
+
 	/**
 	 * 根據用戶Id查詢主崗位
 	 * @param userId

+ 15 - 0
ibps-common-root/modules/org-biz/src/main/java/com/lc/ibps/org/party/repository/impl/PartyPositionRepositoryImpl.java

@@ -2,9 +2,11 @@ package com.lc.ibps.org.party.repository.impl;
 
 import java.util.Arrays;
 import java.util.List;
+import java.util.Map;
 
 import javax.annotation.Resource;
 
+import com.lc.ibps.base.framework.table.ICommonDao;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Repository;
 
@@ -47,6 +49,8 @@ public class PartyPositionRepositoryImpl extends AbstractRepository<String, Part
 	@Lazy
 	@Resource
 	private PartyEntityRepository partyEntityRepository;
+
+	private ICommonDao<?> commonDao = AppUtil.getBean(ICommonDao.class);
 	
 	@Override
 	public PartyPosition newInstance() {
@@ -195,6 +199,17 @@ public class PartyPositionRepositoryImpl extends AbstractRepository<String, Part
 		return findByIds(posIds);
 	}
 
+	@Override
+	public String finSetting() {
+		String sql = "select id_,setting from t_ipcc where id_ = '1'";
+		List<Map<String, Object>> list = (List<Map<String, Object>>) commonDao.query(sql);
+		String toString = "";
+		if(list.size()>0 && BeanUtils.isNotEmpty(list.get(0).get("setting"))){
+			toString = list.get(0).get("setting").toString();
+		}
+		return toString;
+		}
+
 	@Override
 	public PartyPositionPo findMainPostByUserId(String userId) {
         PartyPositionPo partyPositionPo = partyPositionQueryDao.getByKey("findIdsByUserId", 

+ 4 - 1
ibps-oauth-root/modules/oauth-client-httpclient/src/main/java/com/lc/ibps/cloud/oauth/client/service/TokenVerify.java

@@ -92,7 +92,10 @@ public class TokenVerify implements ITokenVerify {
 		Map<String, Object> data = result.getData();
 		if(StateEnum.SUCCESS.getCode() == result.getState() && BeanUtils.isNotEmpty(data)) {
 			logger.debug("set current data {}", data);
-			
+
+			String setting = BeanUtils.isNotEmpty(data.get("setting")) ? data.get("setting").toString(): "";
+			ContextUtil.setSetting(setting);
+
 			PartyUserPo user = PartyUserPo.fromJsonString(JacksonUtil.toJsonString(data.get("user")));
 			ContextUtil.setCurrentUser(user);
 			

+ 4 - 0
ibps-oauth-root/modules/oauth-server2-default/src/main/java/com/lc/ibps/cloud/oauth/server/provider/UserProvider.java

@@ -834,6 +834,10 @@ public class UserProvider extends BaseProvider implements IUserService {
 					}
 				}
 				PartyEmployeePo employee = getEmploye(user.getUserId());
+				//查ipcc表
+				String setting = partyPositionRepository.finSetting();
+				data.put("setting",setting); //全局配置信息
+
 				data.put("employee", employee);
 				
 				PartyOrgPo org = getOrg(employee);

+ 66 - 19
ibps-provider-root/modules/provider-business/src/main/java/com/lc/ibps/business/service/impl/ReformServiceImpl.java

@@ -268,34 +268,81 @@ public class ReformServiceImpl implements ReformService {
                 .map(Optional::get)
                 .collect(Collectors.toList());
         //重新排序,数据量超过一万可能耗时长一点,超过十万或许有性能问题
-        sortData(order,mergedList);
+        sortData(order.trim(),mergedList);
         Map<String, Object> map = paginate(mergedList, pageNo , limit);
         result.setVariables(map);
         return result;
     }
 
-    private void sortData(String order,List<Map<String, Object>> mergedList) {
+    private void sortData(String order, List<Map<String, Object>> mergedList) {
         if (BeanUtils.isNotEmpty(order)) {
             boolean isDescending = order.contains("DESC");
-            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");//发布时间格式必须是2025-05-02,不然排序失败
-            mergedList.sort((m1, m2) -> {
-                try {
-                    String dateStr1 = (String) m1.get("fa_bu_shi_jian_");
-                    String dateStr2 = (String) m2.get("fa_bu_shi_jian_");
-
-                    Date date1 = dateStr1 != null ? sdf.parse(dateStr1) : null;
-                    Date date2 = dateStr2 != null ? sdf.parse(dateStr2) : null;
-
-                    if (date1 == null && date2 == null) return 0;
-                    if (date1 == null) return 1;  // null 排最后
-                    if (date2 == null) return -1; // null 排最后
-
-                    return isDescending ? date2.compareTo(date1) : date1.compareTo(date2);
-                } catch (ParseException e) {
-                    return 0;
+
+            if (order.startsWith("FA_FANG_SHI_JIAN")) {
+                // 按发布时间排序
+                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+                mergedList.sort((m1, m2) -> {
+                    try {
+                        String dateStr1 = (String) m1.get("fa_bu_shi_jian_");
+                        String dateStr2 = (String) m2.get("fa_bu_shi_jian_");
+
+                        Date date1 = dateStr1 != null ? sdf.parse(dateStr1) : null;
+                        Date date2 = dateStr2 != null ? sdf.parse(dateStr2) : null;
+
+                        if (date1 == null && date2 == null) return 0;
+                        if (date1 == null) return isDescending ? -1 : 1;  // null 排最后
+                        if (date2 == null) return isDescending ? 1 : -1; // null 排最后
+
+                        return isDescending ? date2.compareTo(date1) : date1.compareTo(date2);
+                    } catch (ParseException e) {
+                        return 0;
+                    }
+                });
+            } else if (order.startsWith("WEN_JIAN_BIAN_HAO")) {
+                // 按文件编号排序
+                mergedList.sort((m1, m2) -> {
+                    String code1 = (String) m1.get("wen_jian_bian_hao");
+                    String code2 = (String) m2.get("wen_jian_bian_hao");
+
+                    if (code1 == null && code2 == null) return 0;
+                    if (code1 == null) return isDescending ? -1 : 1;  // null 排最后
+                    if (code2 == null) return isDescending ? 1 : -1; // null 排最后
+
+                    // 使用自然排序比较器
+                    Comparator<String> naturalComparator = Comparator.naturalOrder();
+                    Comparator<String> comparator = isDescending ? naturalComparator.reversed() : naturalComparator;
+
+                    // 如果包含数字部分,使用自然排序
+                    return compareNatural(code1, code2, isDescending);
+                });
+            }
+        }
+    }
+    private int compareNatural(String a, String b, boolean descending) {
+        // 实现一个简单的自然排序比较
+        String[] parts1 = a.split("(?<=\\D)(?=\\d)|(?<=\\d)(?=\\D)");
+        String[] parts2 = b.split("(?<=\\D)(?=\\d)|(?<=\\d)(?=\\D)");
+
+        int length = Math.min(parts1.length, parts2.length);
+        for (int i = 0; i < length; i++) {
+            String part1 = parts1[i];
+            String part2 = parts2[i];
+
+            if (part1.matches("\\d+") && part2.matches("\\d+")) {
+                int num1 = Integer.parseInt(part1);
+                int num2 = Integer.parseInt(part2);
+                if (num1 != num2) {
+                    return descending ? Integer.compare(num2, num1) : Integer.compare(num1, num2);
                 }
-            });
+            } else {
+                int cmp = part1.compareTo(part2);
+                if (cmp != 0) {
+                    return descending ? -cmp : cmp;
+                }
+            }
         }
+        return descending ? Integer.compare(parts2.length, parts1.length)
+                : Integer.compare(parts1.length, parts2.length);
     }
 
     public static Map<String, Object> paginate(List<Map<String, Object>> dataList, int currentPage, int pageSize) {

+ 283 - 9
ibps-provider-root/modules/provider-business/src/main/java/com/lc/ibps/components/sqlzdy/Service/SwdlServiceImpl.java

@@ -18,7 +18,6 @@ import com.lc.ibps.cloud.provider.GenericProvider;
 import com.lc.ibps.org.api.IPartyPositionService;
 import com.lc.ibps.org.party.persistence.entity.PartyPositionPo;
 import com.lc.ibps.sysdata.dao.UpdateDataTableDao;
-import com.lc.ibps.untils.JsonUtil;
 import io.swagger.annotations.ApiParam;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -26,10 +25,10 @@ import org.springframework.stereotype.Service;
 import org.springframework.web.bind.annotation.RequestBody;
 
 import javax.annotation.Resource;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.time.format.DateTimeFormatter;
+import java.util.*;
+import java.time.LocalDate;
+import java.util.stream.Collectors;
 
 /**
  * @title: xiexh
@@ -38,6 +37,10 @@ import java.util.Map;
 @Service
 @Slf4j
 public class SwdlServiceImpl extends GenericProvider implements SwdlService {
+    private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+    private static final String REST_SHIFT = "休息";
+    private static final String NORMAL_STATUS = "正常";
+    private static final String ABNORMAL_STATUS = "异常";
 
     @Autowired
     UpdateDataTableDao  updateDataTableDao;
@@ -189,7 +192,6 @@ public class SwdlServiceImpl extends GenericProvider implements SwdlService {
             int limit = Integer.parseInt(map.get("limit").toString());
             int startPage = limit*(pageNo-1);
             map.put("startPage",startPage);
-
             Map paramMap= getAttendanceMap(map);
             List<Map<String,Object>> list = updateDataTableDao.selectAttendanceData(paramMap);
             int totalCount = updateDataTableDao.selectAttendanceDataCount(paramMap);
@@ -218,10 +220,17 @@ public class SwdlServiceImpl extends GenericProvider implements SwdlService {
 
             Map paramMap= getAttendanceMap(map);
             List<Map<String,Object>> list = updateDataTableDao.selectAttendance2Data(paramMap);
-            int totalCount = updateDataTableDao.selectAttendance2DataCount(paramMap);
-            APIPageList<Map<String,Object>> pageList = getAPIPageList(list);
+           // int totalCount = updateDataTableDao.selectAttendance2DataCount(paramMap);
+            List<Map<String, Object>> data = calculateAttendance(list);
+            data = data.stream()
+                    .sorted(Comparator.comparing(map2 -> (String) map2.get("user_id_")))
+                    .collect(Collectors.toList());
+            //分页
+            int toIndex = Math.min(startPage + limit, data.size());
+            List<Map<String, Object>> pageData = getPageList(data, startPage, toIndex);
+            APIPageList<Map<String,Object>> pageList = getAPIPageList(pageData);
             APIPageResult pageResult = new APIPageResult();
-            pageResult.setTotalCount(totalCount);
+            pageResult.setTotalCount(data.size());
             pageResult.setLimit(limit);
             pageResult.setPage(pageNo);
             pageList.setPageResult(pageResult);
@@ -231,6 +240,17 @@ public class SwdlServiceImpl extends GenericProvider implements SwdlService {
         }
         return result;
     }
+
+    private List<Map<String, Object>> getPageList(List<Map<String, Object>> data, int fromIndex, int toIndex) {
+        //防止越界(如 pageNo 太大)
+        if (fromIndex >= data.size()) {
+            fromIndex = 0;
+            toIndex = 0;
+        }
+        List<Map<String, Object>> pagedList = data.subList(fromIndex, toIndex);
+        return pagedList;
+    }
+
     @Override
     public APIResult queryClassAdjustmentList(
             @ApiParam(name = "request", value = "传入查询请求map对象", required = true)
@@ -641,4 +661,258 @@ public class SwdlServiceImpl extends GenericProvider implements SwdlService {
         }
         return stringObjectHashMap;
     }
+    public List<Map<String, Object>> calculateAttendance(List<Map<String, Object>> attendanceRecords) {
+        // 获取当前系统日期
+        String systemDate = LocalDate.now().format(DATE_FORMATTER);
+
+        // 按用户ID分组
+        Map<String, List<Map<String, Object>>> recordsByUser = new HashMap<>();
+        for (Map<String, Object> record : attendanceRecords) {
+            String userId = (String) record.get("user_id_");
+            recordsByUser.computeIfAbsent(userId, k -> new ArrayList<>()).add(record);
+        }
+
+        // 存储每个用户的统计结果(改为List)
+        List<Map<String, Object>> resultList = new ArrayList<>();
+
+        // 遍历每个用户的考勤记录
+        for (Map.Entry<String, List<Map<String, Object>>> userEntry : recordsByUser.entrySet()) {
+            String userId = userEntry.getKey();
+            List<Map<String, Object>> userRecords = userEntry.getValue();
+
+            // 初始化统计指标
+            Map<String, Object> userStats = initUserStats(userRecords);
+            userStats.put("user_id_", userId); // 添加用户ID到结果中
+
+            // 按日期分组
+            Map<String, List<Map<String, Object>>> recordsByDate = new HashMap<>();
+            for (Map<String, Object> record : userRecords) {
+                String date = (String) record.get("ri_qi_");
+                recordsByDate.computeIfAbsent(date, k -> new ArrayList<>()).add(record);
+            }
+
+            // 统计每个日期的数据
+            for (Map.Entry<String, List<Map<String, Object>>> dateEntry : recordsByDate.entrySet()) {//统计天数
+                String date = dateEntry.getKey();
+                List<Map<String, Object>> dateRecords = dateEntry.getValue();//某个日期下的多个班次数据,同时存在早班,晚班等
+
+                boolean isRestDay = false;
+                boolean hasAttendance = false;
+                boolean isNormalDay = true;
+                boolean isAbnormalDay = false;
+                boolean isAbsenteeism = false;//改天是否存在旷工班次
+
+                boolean existAttendanceDay = false;// 非休息班次标记,当天只有有一个非休息班次就统计为true
+                // 比较当前记录日期与系统日期
+                int dateCompare = date.compareTo(systemDate);
+                //应出勤天数过滤,一天需要出勤多个班次只统计为一天
+                Map shouldAttendance = new HashMap<String,Object>();
+                for (Map<String, Object> record : dateRecords) {//统计次数放里面
+                    String shiftName = BeanUtils.isNotEmpty("ban_ci_ming_") ? (String) record.get("ban_ci_ming_") : "";
+                    String status1 = BeanUtils.isNotEmpty("zhuang_tai_1_") ? (String) record.get("zhuang_tai_1_") : "";
+                    String status2 = BeanUtils.isNotEmpty("zhuang_tai_2_") ? (String) record.get("zhuang_tai_2_") : "";
+                    String checkIn1 = BeanUtils.isNotEmpty("da_ka_shi_jian_1_") ? (String) record.get("da_ka_shi_jian_1_") : "";
+                    String checkIn2 = BeanUtils.isNotEmpty("da_ka_shi_jian_2_") ? (String) record.get("da_ka_shi_jian_2_") : "";
+                    String attendanceStatus = BeanUtils.isNotEmpty("kao_qin_zhuang_ta") ? (String) record.get("kao_qin_zhuang_ta") : "";
+                    String lateDuration ="";
+                    String shiftDuration = "";
+                    String workDuration ="";
+                    if(BeanUtils.isNotEmpty(record.get("chi_dao_shi_chang"))){
+                         lateDuration = record.get("chi_dao_shi_chang").toString();
+                    }
+                    if(BeanUtils.isNotEmpty(record.get("ban_ci_shi_chang_"))){
+                        shiftDuration = record.get("ban_ci_shi_chang_").toString();
+                    }
+                    if(BeanUtils.isNotEmpty(record.get("gong_zuo_shi_chan"))){
+                        workDuration = record.get("gong_zuo_shi_chan").toString();
+                    }
+
+                    // 1. 应出勤天数统计(多个班次只有一个不是休息就算应出勤)
+                    if (!REST_SHIFT.equals(shiftName) && !shouldAttendance.containsKey(date)) {
+                        increment(userStats, "ying_chu_qin_tian_shu", 1);
+                        shouldAttendance.put(date,1);
+                        existAttendanceDay = true;
+                    }
+
+                    // 2. 休息天数统计
+                    if (REST_SHIFT.equals(shiftName)) {
+                       // increment(userStats, "xiu_xi_tian_shu", 1);
+                        isRestDay = true;
+                        continue; // 休息日不参与其他统计
+                    }
+
+                    // 3. 实际出勤天数统计(有打卡记录)
+                    if ((checkIn1 != null && !checkIn1.isEmpty()) ||
+                            (checkIn2 != null && !checkIn2.isEmpty())) {
+                        hasAttendance = true;
+                    }
+
+                    // 4. 异常次数统计(不再把旷工统计到异常里面,只有异常统计为异常)
+                    if (dateCompare <= 0) { // 只统计今天及之前的记录
+                        if (dateCompare < 0) {
+                            // 历史日期
+                            //if (status1 == null || status1.isEmpty() || ABNORMAL_STATUS.equals(status1)) {
+                            if (ABNORMAL_STATUS.equals(status1)) {
+                                increment(userStats, "yi_chang_ci_shu", 1);
+                            }
+                            //if (status2 == null || status2.isEmpty() || ABNORMAL_STATUS.equals(status2)) {
+                            if (ABNORMAL_STATUS.equals(status2)) {
+                                increment(userStats, "yi_chang_ci_shu", 1);
+                            }
+                        } else {
+                            // 当天日期
+                            if (ABNORMAL_STATUS.equals(status1)) {
+                                increment(userStats, "yi_chang_ci_shu", 1);
+                            }
+                            if (ABNORMAL_STATUS.equals(status2)) {
+                                increment(userStats, "yi_chang_ci_shu", 1);
+                            }
+                        }
+                    }
+
+                    // 5. 迟到次数统计-上班异常算迟到,提前下班也算迟到(迟到/早退)
+                    if (ABNORMAL_STATUS.equals(status1)) {
+                        increment(userStats, "chi_dao_ci_shu", 1);
+                    }
+                    if (ABNORMAL_STATUS.equals(status2)) {
+                        increment(userStats, "chi_dao_ci_shu", 1);
+                    }
+
+                    // 6. 迟到时长统计
+                    if (lateDuration != null && !lateDuration.isEmpty()) {
+                        try {
+                            double duration = Double.parseDouble(lateDuration);
+                            addTo(userStats, "chi_dao_shi_chang", duration);
+                        } catch (NumberFormatException e) {
+                            // 忽略格式错误
+                        }
+                    }
+
+                    // 7. 旷工次数统计(只统计历史日期)
+                    if (dateCompare < 0) {
+                        if (checkIn1 == null || checkIn1.isEmpty()) {
+                            increment(userStats, "kuang_gong_ci_shu", 1);
+                            isAbsenteeism = true;
+                        }
+                        if (checkIn2 == null || checkIn2.isEmpty()) {
+                            increment(userStats, "kuang_gong_ci_shu", 1);
+                            isAbsenteeism = true;
+                        }
+                    }
+
+                    // 8. 班次时长统计,标准工作时长
+                    if (shiftDuration != null && !shiftDuration.isEmpty()) {
+                        try {
+                            //double duration = Double.parseDouble(shiftDuration)/60;
+                            double duration = Math.round(Double.parseDouble(shiftDuration)/60);
+                            addTo(userStats, "ban_ci_shi_chang", duration);
+                        } catch (NumberFormatException e) {
+                            // 忽略格式错误
+                        }
+                    }
+
+                    // 9. 实际工作时长统计
+                    if (workDuration != null && !workDuration.isEmpty()) {
+                        try {
+                           // double duration = Double.parseDouble(workDuration)/60;
+                            double duration = Math.round(Double.parseDouble(shiftDuration)/60);
+                            addTo(userStats, "gong_zuo_shi_chang", duration);
+                        } catch (NumberFormatException e) {
+                            // 忽略格式错误
+                        }
+                    }
+
+                    // 10. 正常/异常天数判断
+                    if (dateCompare <= 0) { // 只统计今天及之前的记录
+                        if (dateCompare < 0) {
+                            // 历史日期
+                            if (!NORMAL_STATUS.equals(attendanceStatus)) {
+                                isNormalDay = false;
+                                isAbnormalDay = true;
+                            }
+                        } else {
+                            // 当天日期
+                            if (ABNORMAL_STATUS.equals(status1) || ABNORMAL_STATUS.equals(status2)) {
+                                isNormalDay = false;
+                                isAbnormalDay = true;
+                            }
+                        }
+                    }
+
+                }
+                //(当天不存在正常出勤的班次才能统计为休息)
+                if(!existAttendanceDay && isRestDay){
+                    isRestDay = true;
+                }else{
+                    isRestDay = false;
+                }
+
+                // 休息天数统计
+                if (isRestDay) {
+                    increment(userStats, "xiu_xi_tian_shu", 1);
+                    continue;
+                }
+                // 实际出勤天数统计(按日期)
+                if (!isRestDay && hasAttendance) {
+                    increment(userStats, "shi_ji_chu_qin_tian_shu", 1);
+                }
+
+                // 正常天数统计(按日期)
+                if (!isRestDay && isNormalDay && dateCompare <= 0) {
+                    increment(userStats, "zheng_chang_tian_shu", 1);
+                }
+
+                // 异常天数统计(按日期)
+                if (!isRestDay && isAbnormalDay && dateCompare <= 0) {
+                    increment(userStats, "yi_chang_tian_shu", 1);
+                }
+
+               /* //旷工天数
+                if(!isRestDay && existAttendanceDay && isAbsenteeism && dateCompare < 0){
+                    increment(userStats, "kuang_gong_tian_shu", 1);
+                }*/
+            }
+            //异常次数需要包含旷工次数,异常天数也需要包含旷工天数
+            int numkgcs = (Integer) userStats.get("kuang_gong_ci_shu");
+            int numyccs = (Integer) userStats.get("yi_chang_ci_shu");
+            int yiChangCiShu = (numkgcs + numyccs);
+            userStats.put("yi_chang_ci_shu",yiChangCiShu);
+            //String yiChangTianShu = userStats.get("yi_chang_tian_shu").toString() + userStats.get("kuang_gong_tian_shu").toString();
+            //userStats.put("yi_chang_tian_shu",yiChangTianShu);
+            // 将用户统计结果添加到List中
+            resultList.add(userStats);
+        }
+
+        return resultList;
+    }
+
+    private Map<String, Object> initUserStats(List<Map<String, Object>> userRecords) {
+        Map<String, Object> stats = new HashMap<>();
+        stats.put("yi_chang_ci_shu", 0);
+        stats.put("chi_dao_ci_shu", 0);
+        stats.put("chi_dao_shi_chang", 0.0);
+        stats.put("kuang_gong_ci_shu", 0);
+        stats.put("ban_ci_shi_chang", 0.0);
+        stats.put("gong_zuo_shi_chang", 0.0);
+        stats.put("ying_chu_qin_tian_shu", 0);
+        stats.put("shi_ji_chu_qin_tian_shu", 0);
+        stats.put("xiu_xi_tian_shu", 0);
+        stats.put("zheng_chang_tian_shu", 0);
+        stats.put("yi_chang_tian_shu", 0);
+        stats.put("user_name_",userRecords.get(0).get("user_name_"));
+        stats.put("pos_name_",userRecords.get(0).get("pos_name_"));
+        stats.put("gong_hao_",userRecords.get(0).get("gong_hao_"));
+        stats.put("kuang_gong_tian_shu", 0);
+        return stats;
+    }
+
+    private void increment(Map<String, Object> stats, String key, int amount) {
+        int current = (int) stats.getOrDefault(key, 0);
+        stats.put(key, current + amount);
+    }
+
+    private void addTo(Map<String, Object> stats, String key, double amount) {
+        double current = (double) stats.getOrDefault(key, 0.0);
+        stats.put(key, current + amount);
+    }
 }

+ 44 - 0
ibps-provider-root/modules/provider-business/src/main/java/com/lc/ibps/hrm/control/PersonnelManagementController.java

@@ -0,0 +1,44 @@
+package com.lc.ibps.hrm.control;
+
+import com.lc.ibps.api.base.constants.StateEnum;
+import com.lc.ibps.base.core.util.I18nUtil;
+import com.lc.ibps.cloud.entity.APIResult;
+import com.lc.ibps.cloud.provider.GenericProvider;
+import com.lc.ibps.hrm.service.PersonnelManagementService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.Map;
+
+/**
+ * @title: xiexh
+ * @date 2025/08/11 14:37
+ */
+@Slf4j
+@Api(tags = "人员管理模块")
+@RequestMapping("/PersonnelManagement")
+@RestController
+public class PersonnelManagementController extends GenericProvider {
+    @Autowired
+    PersonnelManagementService personnelManagementService;
+
+
+    @ApiOperation("人员档案卡岗位快照")
+    @PostMapping("/dept/snapshot")
+    APIResult queryData(@RequestBody(required = true) Map<String,Object> map) throws Exception{
+        APIResult result = new APIResult<>();
+        try {
+            result = personnelManagementService.queryDeptSnapshot(map);
+        } catch (Exception e) {
+            setExceptionResult(result, StateEnum.ILLEGAL_REQUEST.getCode(), I18nUtil.getMessage(StateEnum.ILLEGAL_REQUEST.getCode() + ""), e);
+        }
+        return result;
+
+    }
+}

+ 18 - 0
ibps-provider-root/modules/provider-business/src/main/java/com/lc/ibps/hrm/dao/PersonnelManagementDao.java

@@ -0,0 +1,18 @@
+package com.lc.ibps.hrm.dao;
+
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @title: 人员管理
+ * @date 2025/08/11 14:37
+ */
+@Mapper
+public interface PersonnelManagementDao {
+
+    List<Map<String, Object>> querySnapshoot(@Param("map") Map<String, Object> map);
+
+}

+ 19 - 0
ibps-provider-root/modules/provider-business/src/main/java/com/lc/ibps/hrm/service/PersonnelManagementService.java

@@ -0,0 +1,19 @@
+package com.lc.ibps.hrm.service;
+
+import com.lc.ibps.cloud.entity.APIResult;
+import org.springframework.web.bind.annotation.RequestBody;
+
+import java.util.Map;
+
+/**
+ * @title: xiexh
+ * @date 2025/08/11 14:37
+ */
+public interface PersonnelManagementService {
+
+    /**
+     * 分页查询接口
+     */
+    APIResult<Object> queryDeptSnapshot(@RequestBody(required = true) Map<String,Object> map)throws Exception ;
+
+}

+ 102 - 0
ibps-provider-root/modules/provider-business/src/main/java/com/lc/ibps/hrm/service/imple/PersonnelManagementServiceImpl.java

@@ -0,0 +1,102 @@
+package com.lc.ibps.hrm.service.imple;
+
+import com.lc.ibps.api.base.constants.StateEnum;
+import com.lc.ibps.base.core.constants.StringPool;
+import com.lc.ibps.base.core.util.AppUtil;
+import com.lc.ibps.base.core.util.BeanUtils;
+import com.lc.ibps.base.core.util.I18nUtil;
+import com.lc.ibps.base.framework.table.ICommonDao;
+import com.lc.ibps.base.web.context.ContextUtil;
+import com.lc.ibps.cloud.entity.APIPageList;
+import com.lc.ibps.cloud.entity.APIPageResult;
+import com.lc.ibps.cloud.entity.APIResult;
+import com.lc.ibps.cloud.provider.GenericProvider;
+import com.lc.ibps.hrm.dao.PersonnelManagementDao;
+import com.lc.ibps.hrm.service.PersonnelManagementService;
+import com.lc.ibps.org.api.IPartyPositionService;
+import com.lc.ibps.org.party.persistence.entity.PartyPositionPo;
+import com.lc.ibps.sysdata.dao.UpdateDataTableDao;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @title: xiexh
+ * @date 2025/08/11 14:37
+ */
+@Service
+@Slf4j
+public class PersonnelManagementServiceImpl extends GenericProvider implements PersonnelManagementService {
+
+    @Autowired
+    PersonnelManagementDao personnelManagementDao;
+    @Autowired
+    UpdateDataTableDao updateDataTableDao;
+    @Resource
+    private ICommonDao<?> commonDao;
+
+    @Override
+    public APIResult<Object> queryDeptSnapshot(Map<String, Object> map) throws Exception {
+        APIResult<Object> result = new APIResult<>();
+        try {
+            int pageNo = Integer.parseInt(map.get("pageNo").toString());
+            int limit = Integer.parseInt(map.get("limit").toString());
+            int startPage = limit*(pageNo-1);
+            map.put("startPage",startPage);
+            Map mapDeal = getMapV2(map);
+            List<Map<String,Object>> list = personnelManagementDao.querySnapshoot(mapDeal);
+            APIPageList<Map<String,Object>> pageList = getAPIPageList(list);
+            APIPageResult pageResult = new APIPageResult();
+            pageResult.setTotalCount(1);
+            pageResult.setLimit(limit);
+            pageResult.setPage(pageNo);
+            pageList.setPageResult(pageResult);
+            result.setData(pageList);
+        } catch (Exception e) {
+            setExceptionResult(result, StateEnum.ERROR_FORM_BO.getCode(), I18nUtil.getMessage(StateEnum.ERROR_FORM_BO.getCode()+""), e);
+        }
+        return result;
+    }
+
+    private Map getMapV2(Map<String, Object> map) {
+            HashMap<String, Object> stringObjectHashMap = new HashMap<>();
+
+            if (BeanUtils.isNotEmpty(map)) {
+                stringObjectHashMap.put("pageNo", map.get("pageNo"));
+                stringObjectHashMap.put("limit", map.get("limit"));
+                stringObjectHashMap.put("startPage", map.get("startPage"));
+                stringObjectHashMap.put("locationId", getDiDian());
+                if(BeanUtils.isNotEmpty(map.get("param"))){
+                    Map param = (Map) map.get("param");
+                    if(BeanUtils.isNotEmpty(param.get("gangWei"))){
+                        // 将逗号分隔的字符串拆分为List
+                        String gangweiStr= (String) param.get("gangWei");
+                        List<String> gangweiList = Arrays.asList(gangweiStr.trim().split("\\s*,\\s*"));
+                        stringObjectHashMap.put("gangWei",gangweiList);
+                    }
+                }
+            }
+            return stringObjectHashMap;
+
+    }
+
+    //获取当前用户地点,前端可以不用传
+    private String getDiDian() {
+        IPartyPositionService partyPositionService = AppUtil.getBean(IPartyPositionService.class);
+        APIResult<List<PartyPositionPo>> result = partyPositionService.findByUserId(ContextUtil.getCurrentUserId());
+        String diDian ="";
+        try {
+            diDian = result.getData().get(0).getPath().split(StringPool.BACK_SLASH + StringPool.DOT)[1];
+        }catch (Exception ex){
+            log.error("Can't get didian information",ex);
+            return null;
+        }
+        return diDian;
+    }
+}

+ 16 - 0
ibps-provider-root/modules/provider-business/src/main/resources/com/lc/ibps/klimsibps/mapping/PersonnelManagementMapper.xml

@@ -0,0 +1,16 @@
+<?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.lc.ibps.hrm.dao.PersonnelManagementDao">
+
+    <select id="querySnapshoot" parameterType="java.util.Map" resultType="java.util.Map">
+      select
+             TRIM(BOTH ',' FROM GROUP_CONCAT(DISTINCT kuai_zhao_ SEPARATOR ',')) AS kuai_zhao_combined
+         from  t_gltxgwsms
+         where
+        <foreach item="id" index="index" collection="map.gangWei" open="(" separator="OR" close=")">
+            gang_wei_ LIKE CONCAT('%', #{id}, '%')
+        </foreach>
+        ORDER BY CREATE_TIME_ DESC
+    </select>
+
+</mapper>

+ 11 - 44
ibps-provider-root/modules/provider-business/src/main/resources/com/lc/ibps/klimsibps/mapping/UpdateDataTableMapper.xml

@@ -611,7 +611,12 @@
     </select>
     <select id="selectAttendanceDataCount" resultType="java.lang.Integer" parameterType="java.util.Map">
         SELECT
-        COUNT( DISTINCT USER_ID_ )
+        COUNT(*) as totalCount
+        FROM
+        (
+        SELECT
+        USER_ID_,
+        ri_qi_
         FROM
         v_attendance_statistics
         <where>
@@ -629,6 +634,10 @@
                 AND FIND_IN_SET(yong_hu_id_, #{map.yongHuId})
             </if>
         </where>
+        GROUP BY
+        USER_ID_,
+        ri_qi_
+        ) as T1
     </select>
     <select id="selectClassAdjustmentList" resultType="java.util.Map" parameterType="java.util.Map">
         SELECT
@@ -761,46 +770,7 @@
     </select>
     <select id="selectAttendance2Data" resultType="java.util.Map" parameterType="java.util.Map">
         SELECT
-        (
-        SELECT
-        COUNT( DISTINCT USER_ID_ )
-        FROM
-        v_attendance_statistics
-        <where>
-            di_dian_ = #{map.locationId}
-            <if test="@o.Ognl@isNotEmpty(map.buMen)">
-                AND bu_men_ like CONCAT('%', #{map.buMen}, '%')
-            </if>
-            <if test="@o.Ognl@isNotEmpty(map.startDate)">
-                AND ri_qi_ >= #{map.startDate}
-            </if>
-            <if test="@o.Ognl@isNotEmpty(map.endDate)">
-                AND ri_qi_ <![CDATA[ <= ]]> #{map.endDate}
-            </if>
-            <if test="@o.Ognl@isNotEmpty(map.yongHuId)">
-                AND FIND_IN_SET(yong_hu_id_, #{map.yongHuId})
-            </if>
-            <if test="@o.Ognl@isNotEmpty(map.gongHao)">
-                AND gong_hao_ = #{map.gongHao}
-            </if>
-        </where>
-        ) AS total_count,
-        USER_ID_,
-        ri_qi_,
-        user_name_,
-        pos_name_,
-        gong_hao_,
-        COUNT( ri_qi_ ) AS ying_chu_qin_shu,
-        SUM( CASE WHEN ( da_ka_shi_jian_1_ IS NULL OR da_ka_shi_jian_1_ = '' ) AND ( da_ka_shi_jian_2_ IS NULL OR da_ka_shi_jian_2_ = '' ) THEN 1 ELSE 0 END ) AS xiu_xi_shu,
-        COUNT( ri_qi_ ) - SUM( CASE WHEN ( da_ka_shi_jian_1_ IS NULL OR da_ka_shi_jian_1_ = '' ) AND ( da_ka_shi_jian_2_ IS NULL OR da_ka_shi_jian_2_ = '' ) THEN 1 ELSE 0 END ) AS shi_ji_chu_qin_shu,
-        SUM( kao_qin_zhuang_ta ) AS zheng_chang_shu,
-        SUM( CASE WHEN kao_qin_zhuang_ta = '异常' OR kao_qin_zhuang_ta IS NULL OR kao_qin_zhuang_ta = '' THEN 1 ELSE 0 END ) AS yi_chang_shu,
-        ROUND( SUM( ban_ci_shi_chang_ ) / 60.0, 2 ) AS total_ban_ci_shi_chang,
-        ROUND( SUM( gong_zuo_shi_chan ) / 60.0, 2 ) AS total_gong_zuo_shi_chan,
-        SUM( CASE WHEN zhuang_tai_1_ = '异常' OR zhuang_tai_2_ = '异常' THEN 1 ELSE 0 END ) AS chi_dao_ci_shu,
-        SUM( chi_dao_shi_chang ) AS total_chi_dao_shi_chang,
-        SUM( CASE WHEN zhuang_tai_1_ IS NULL OR zhuang_tai_1_ = '' THEN 1 ELSE 0 END ) + SUM( CASE WHEN zhuang_tai_2_ IS NULL OR zhuang_tai_2_ = '' THEN 1 ELSE 0 END ) AS kuang_gong_ci_shu,
-        SUM( CASE WHEN zhuang_tai_1_ = '异常' THEN 1 ELSE 0 END ) + SUM( CASE WHEN zhuang_tai_2_ = '异常' THEN 1 ELSE 0 END ) + SUM( CASE WHEN zhuang_tai_1_ IS NULL OR zhuang_tai_1_ = '' THEN 1 ELSE 0 END ) + SUM( CASE WHEN zhuang_tai_2_ IS NULL OR zhuang_tai_2_ = '' THEN 1 ELSE 0 END ) AS yi_chang_he_ji
+          *
         FROM
         v_attendance_statistics
         <where>
@@ -821,11 +791,8 @@
                 AND gong_hao_ = #{map.gongHao}
             </if>
         </where>
-        GROUP BY
-        USER_ID_
         ORDER BY
         USER_ID_
-        limit ${map.startPage},${map.limit}
     </select>
     <select id="selectAttendance2DataCount" resultType="java.lang.Integer" parameterType="java.util.Map">
         SELECT

+ 94 - 21
ibps-provider-root/modules/provider-platform/src/main/java/com/lc/ibps/platform/plan/job/EquipmentMaintenancePlanJob.java

@@ -25,6 +25,7 @@ import java.time.LocalDate;
 import java.time.format.DateTimeFormatter;
 import java.time.format.DateTimeParseException;
 import java.util.*;
+import java.util.stream.Collectors;
 
 public class EquipmentMaintenancePlanJob  extends AbstractJob {
 
@@ -201,7 +202,9 @@ public class EquipmentMaintenancePlanJob  extends AbstractJob {
             String heChaXiaoZhun = StringUtil.defaultString(eqMap.get("he_cha_xiao_zhun_").toString(),"");
             String chuChangRiQi = StringUtil.defaultString(eqMap.get("chu_chang_ri_qi_").toString(),"");
             int year;
+            String str = "一年";
             LocalDate createDate;
+            ArrayList<String> pushuser = new ArrayList<>();
             try{
                 year = Integer.parseInt(heChaXiaoZhun);
                 createDate = LocalDate.parse(chuChangRiQi, formatter);
@@ -209,31 +212,86 @@ public class EquipmentMaintenancePlanJob  extends AbstractJob {
                 // logger.warn("出厂日期或使用年限格式错误,无法转换!设备id_:{},出厂日期:{}, 使用年限:{}",sourceId,chuChangRiQi,heChaXiaoZhun);
                 continue;
             }
-            LocalDate futureDate = createDate.plusYears(year);
+            LocalDate futureDate = createDate.plusYears(year - 1);//原来的逻辑错误,提前一年应该是到期日的前一年
+            LocalDate futureDate2 = createDate.plusMonths(year * 12 - 1);
+            if("深圳恒生医院".equals(getSetting())){
+                futureDate = futureDate2 ;
+                str = "一个月";
+            }
             LocalDate currDate = LocalDate.now();
+
+            String guanLiRen = StringUtil.defaultString(eqMap.get("guan_li_ren_").toString(),"");
+            changeMessagePushUser(guanLiRen,pushuser);
+            if(pushuser.isEmpty()){
+                //当保管人所在的所有组都没有专业组组长的时候推送给保管者
+                pushuser.add(guanLiRen);
+                //过滤掉重复数据
+                pushuser.stream()
+                        .distinct()
+                        .collect(Collectors.toList());
+            }
+
             // 比较 出厂日期 加上N年后是否小于等于 当前日期
             if (futureDate.isBefore(currDate) || futureDate.isEqual(currDate)) {
-                Map<String, Object> rili = commonDao.queryOne("select id_ from ibps_party_user_calendar where type_='EQUIP_OVERDUE' and data_info_='t_sbdj' and data_source_id_='"+sourceId+"' limit 1");
-                // 已经 添加过的日程不再提醒
-                if (BeanUtils.isEmpty(rili)){
-                    String guanLiRen = StringUtil.defaultString(eqMap.get("guan_li_ren_").toString(),"");
-                    String yuanSheBeiBian = StringUtil.defaultString(eqMap.get("yuan_she_bei_bian").toString(),"");
-                    String sheBeiMingCheng = StringUtil.defaultString(eqMap.get("she_bei_ming_cheng_").toString(),"");
+                for(String zhanghao : pushuser){
+                    Map<String, Object> rili = commonDao.queryOne("select id_ from ibps_party_user_calendar where type_='EQUIP_OVERDUE' and data_info_='t_sbdj' and data_source_id_='"+sourceId+"' and user_id_ = '"+zhanghao+"' limit 1");
+                    // 已经 添加过的日程不再提醒
+                    if (BeanUtils.isEmpty(rili)){
+                        String yuanSheBeiBian = StringUtil.defaultString(eqMap.get("yuan_she_bei_bian").toString(),"");
+                        String sheBeiMingCheng = StringUtil.defaultString(eqMap.get("she_bei_ming_cheng_").toString(),"");
 
-                    PartyUserCalendarPo calendarPo = new PartyUserCalendarPo();
-                    calendarPo.setDataSourceId(sourceId);
-                    calendarPo.setDataInfo("t_sbdj");
-                    calendarPo.setUserId(guanLiRen);
-                    calendarPo.setTitle("设备使用到期预提醒");
-                    calendarPo.setContent("根据出厂日期和使用年限计算得知,\n设备:【"+yuanSheBeiBian +" "+ sheBeiMingCheng + "】 已达最大使用年限或将在一年后到期。\n出厂日期:"+chuChangRiQi+"。\n使用年限:"+heChaXiaoZhun+"年。");
-                    calendarPo.setStartTime(new SimpleDateFormat("yyyy-MM-dd").format(new Date()));
-                    calendarPo.setEndTime(new SimpleDateFormat("yyyy-MM-dd").format(new Date()));
-                    calendarPo.setEmergencyState("2");
-                    calendarPo.setId(UniqueIdUtil.getId());
-                    calendarPo.setCreateBy("1");
-                    calendarPo.setType("EQUIP_OVERDUE");
-                    calendarDao.create(calendarPo);
-                    logger.warn("设备到期提醒"+yuanSheBeiBian +":" + sheBeiMingCheng);
+                        PartyUserCalendarPo calendarPo = new PartyUserCalendarPo();
+                        calendarPo.setDataSourceId(sourceId);
+                        calendarPo.setDataInfo("t_sbdj");
+                        //calendarPo.setUserId(guanLiRen);
+                        calendarPo.setUserId(zhanghao);
+                        calendarPo.setTitle("设备使用到期预提醒");
+                        calendarPo.setContent("根据出厂日期和使用年限计算得知,\n设备:【"+yuanSheBeiBian +" "+ sheBeiMingCheng + "】 已达最大使用年限或将在"+str+"后到期。\n出厂日期:"+chuChangRiQi+"。\n使用年限:"+heChaXiaoZhun+"年。");
+                        calendarPo.setStartTime(new SimpleDateFormat("yyyy-MM-dd").format(new Date()));
+                        calendarPo.setEndTime(new SimpleDateFormat("yyyy-MM-dd").format(new Date()));
+                        calendarPo.setEmergencyState("2");
+                        calendarPo.setId(UniqueIdUtil.getId());
+                        calendarPo.setCreateBy("1");
+                        calendarPo.setType("EQUIP_OVERDUE");
+                        calendarDao.create(calendarPo);
+                        logger.warn("设备到期提醒"+yuanSheBeiBian +":" + sheBeiMingCheng);
+                    }
+                }
+            }
+        }
+    }
+
+    private void changeMessagePushUser(String guanLiRen,List<String> pushuser) {
+        String sql = "select id_,positions_ from IBPS_PARTY_EMPLOYEE WHERE ID_='"+guanLiRen+"' limit 1";
+        List<Map<String, Object>> positions = (List<Map<String, Object>>) commonDao.query(sql);
+        if(BeanUtils.isEmpty(positions)){
+            logger.warn("设备保管人:"+guanLiRen+"查询不到用户信息");
+            return;
+        }
+        Map<String, Object> positionMap = positions.get(0);
+        if(BeanUtils.isNotEmpty(positionMap.get("positions_"))){
+            String position = positionMap.get("positions_").toString().trim();
+            String positionsStr = convertToSqlInFormat(position);
+            String groupSql = "select id_,name_,depth_ from ibps_party_entity where DEPTH_>=4 and id_ in "+positionsStr;//DEPTH_为4以上的是组 1.0 获取用户所在部门类型为组的数据
+            List<Map<String, Object>> entity = (List<Map<String, Object>>) commonDao.query(groupSql);
+            if(BeanUtils.isEmpty(entity) || entity.size()<1){
+                logger.warn("设备保管人:"+guanLiRen+"查询不到用户所属组信息");
+                return;
+            }
+            for(Map groupInfo :entity){
+                String roleIdSql = "select id_ from ibps_party_entity where PARTY_ALIAS_='zhsfzr' limit 1";//专业组组长角色
+                List<Map<String, Object>> role = (List<Map<String, Object>>) commonDao.query(roleIdSql);
+                String roleId = role.get(0).get("id_").toString().trim();
+                String group = (String) groupInfo.get("id_");
+                //获取和设备保管人一个组并且是专业组组长的用户
+                String teamLeaderSql = "SELECT id_,name_,status_,positions_,job_ FROM IBPS_PARTY_EMPLOYEE WHERE STATUS_='actived' and POSITIONS_ LIKE '%"+group.trim()+"%' AND JOB_ LIKE '%"+roleId+"%';";
+                List<Map<String, Object>> userList = (List<Map<String, Object>>) commonDao.query(teamLeaderSql);
+                if(BeanUtils.isEmpty(userList) || userList.size()<1){
+                    logger.warn("设备保管人:"+guanLiRen+"所属组为【"+group+"】,该组下不存在专业组组长");
+                    continue;
+                }
+                for(Map user :userList){
+                    pushuser.add(user.get("id_").toString());
                 }
             }
         }
@@ -259,4 +317,19 @@ public class EquipmentMaintenancePlanJob  extends AbstractJob {
         }
     }
 
+    public String getSetting() {
+        String sql = "select id_,dan_wei_ming_chen from t_ipcc where id_ = '1'";
+        List<Map<String, Object>> list = (List<Map<String, Object>>) commonDao.query(sql);
+        String danWeiMingChen = "";
+        if(list.size()>0 && BeanUtils.isNotEmpty(list.get(0).get("dan_wei_ming_chen"))){
+            danWeiMingChen = list.get(0).get("dan_wei_ming_chen").toString();
+        }
+        return danWeiMingChen;
+    }
+    public String convertToSqlInFormat(String input) {
+        String[] parts = input.split(",");
+        String quoted = String.join("','", parts); // 用 ',' 连接
+        return "('" + quoted + "')"; // 首尾加括号和引号
+    }
+
 }