啊鑫
2025-02-18 f91c09e452ce121a66755e8b6f133efeac4edead
钉钉获取人员的接口
已添加13个文件
已修改4个文件
984 ■■■■■ 文件已修改
src/main/java/com/gs/xky/config/DingTalkParam.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/gs/xky/config/DingTalkResponse.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/gs/xky/dto/EmployeeInfo.java 78 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/gs/xky/entity/MesStaff.java 125 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/gs/xky/entity/SysUser.java 211 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/gs/xky/mapper/MesStaffMapper.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/gs/xky/mapper/SysUserMapper.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/gs/xky/service/ApiService.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/gs/xky/service/Impl/MesStaffServiceImpl.java 238 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/gs/xky/service/Impl/SysUserServiceImpl.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/gs/xky/service/MesStaffService.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/gs/xky/service/SysUserService.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/gs/xky/service/XkyService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/gs/xky/task/ScheduledTasks.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/MesStaffMapper.xml 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/SysUserMapper.xml 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/test/java/com/gs/xky/XkyApplicationTests.java 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/gs/xky/config/DingTalkParam.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,50 @@
package com.gs.xky.config;
import cn.hutool.core.date.DateUtil;
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
import java.util.Date;
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
@JsonInclude(JsonInclude.Include.NON_EMPTY) // è¿™è¡Œä¼šæŽ’除掉所有值为 null çš„字段
public class DingTalkParam {
    private String AccessToken = "21AAA085-BE3A-4BB4-BFA4-1D0A8F973EAD";
    private String LogonInfo;
    public DingTalkParam(int flag) {
        Date now = new Date();
        // èŽ·å–ä¸‹ä¸€ä¸ªæ•´ç‚¹æ—¶é—´
        Date nextHour = getNextHour(now);
        String expiredDate = DateUtil.format(nextHour, "yyyy-MM-dd HH:mm:ss");
        String serviceCode = "getEmployeeListForMes";
        if (flag == 1) {
            serviceCode = "getEmployeeIncUpdateListForMes";
        }
//        String template = "Hello, %s! Your age is %d.";
        String template = "LoginName=sa&BusinessUnit=0&LogonRegion=zh-CN&ExpiredDate=%s&ServiceCode=%s";
        String result = String.format(template, expiredDate, serviceCode);
        this.LogonInfo = result;
    }
    private Date getNextHour(Date date) {
        // ä½¿ç”¨ Hutool æˆªæ–­åˆ°å½“前小时
        Date truncatedDate = DateUtil.beginOfHour(date);
        // æ·»åŠ ä¸€ä¸ªå°æ—¶
        return DateUtil.offsetHour(truncatedDate, 1);
    }
}
src/main/java/com/gs/xky/config/DingTalkResponse.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,29 @@
package com.gs.xky.config;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@Data
@AllArgsConstructor
@NoArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
public class DingTalkResponse<T> {
    @JsonProperty("Message")
    private String message;
    @JsonProperty("MessageID")
    private String messageID;
    @JsonProperty("IsSuccess")
    private String isSuccess;
    @JsonProperty("Data")
    private List<T> data;
}
src/main/java/com/gs/xky/dto/EmployeeInfo.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,78 @@
package com.gs.xky.dto;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
@Data
@NoArgsConstructor
@ToString
@AllArgsConstructor
public class EmployeeInfo {
    /**
     * å‘˜å·¥å”¯ä¸€æ ‡è¯†ç¬¦
     */
    @JsonProperty("PERSONID")
    private String personId;
    /**
     * å‘˜å·¥è´¦å·
     */
    @JsonProperty("EMPLOYEEID")
    private String employeeId;
    /**
     * å‘˜å·¥çœŸå®žå§“名
     */
    @JsonProperty("TRUENAME")
    private String trueName;
    /**
     * å²—位名称
     */
    @JsonProperty("NAMES")
    private String names;
    /**
     * æ˜¯å¦æ˜¯å…³é”®å²—位(1 æ˜¯ï¼Œ0 å¦ï¼‰
     */
    @JsonProperty("IS_CORE")
    private Integer isCore;
    /**
     * åœ¨èŒçŠ¶æ€
     */
    @JsonProperty("State")
    private String state;
    /**
     * å…¥èŒæ—¥æœŸ
     */
    @JsonProperty("ATTENDONDATE")
    private String attendOnDate;
    /**
     * ç¦»èŒæ—¥æœŸ
     */
    @JsonProperty("DIMISSIONDATE")
    private String dimissionDate;
    /**
     * ç›´å±žç»„织
     */
    @JsonProperty("UNITNAME")
    private String unitName;
    /**
     * å…¬å¸åç§°
     */
    @JsonProperty("CUNITNAME")
    private String cUnitName;
    @JsonProperty("laowugongsi")
    private String laowugongsi;
}
src/main/java/com/gs/xky/entity/MesStaff.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,125 @@
package com.gs.xky.entity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
 * å‘˜å·¥ä¿¡æ¯è¡¨
 *
 * @TableName MES_STAFF
 */
@TableName(value = "MES_STAFF")
@Data
@KeySequence(value = "SEQ_MES_STAFF", dbType = DbType.ORACLE)
public class MesStaff implements Serializable {
    @TableField(exist = false)
    private static final long serialVersionUID = 1L;
    /**
     * ID
     */
    @TableId
    private Long id;
    /**
     * å‘˜å·¥ç¼–码
     */
    private String staffNo;
    /**
     * å‘˜å·¥å§“名
     */
    private String staffName;
    /**
     * éƒ¨é—¨ç¼–码
     */
    private String departmentNo;
    /**
     * éƒ¨é—¨åç§°
     */
    private String departmentName;
    /**
     * å²—位编码
     */
    private String positionCode;
    /**
     * å²—位名称
     */
    private String positionName;
    /**
     * æ‰‹æœºå·
     */
    private String phoneNumber;
    /**
     * ä»»å²—开始日期
     */
    private Date startDate;
    /**
     * å¤‡æ³¨
     */
    private String remark;
    /**
     * åˆ›å»ºç»„织
     */
    private Long createOrg;
    /**
     * ä½¿ç”¨ç»„织
     */
    private String useOrg;
    /**
     * è‡ªå®šä¹‰å­—段3
     */
    private String remark3;
    /**
     * è‡ªå®šä¹‰å­—段4
     */
    private String remark4;
    /**
     * è‡ªå®šä¹‰å­—段5
     */
    private String remark5;
    /**
     * åˆ›å»ºäºº
     */
    private String createBy;
    /**
     * åˆ›å»ºæ—¶é—´
     */
    private Date createDate;
    /**
     * æ›´æ–°äºº
     */
    private String lastupdateBy;
    /**
     * æ›´æ–°æ—¶é—´
     */
    private Date lastupdateDate;
    /**
     * å¤‡æ³¨
     */
    private String memo;
    /**
     * ç”Ÿäº§çº¿
     */
    private String lineNo;
    /**
     * ç”Ÿäº§å‘˜å·¥æ ‡è¯†
     */
    private Long workMk;
    /**
     * æ˜¯å¦ç¦ç”¨
     */
    private String fforbidStatus;
    /**
     * ä¸šåŠ¡å‘˜ç±»åž‹
     */
    private String operatorType;
    /**
     * ç¦»èŒæ—¶é—´
     */
    private Date separationTime;
    /**
     * æ˜¯å¦æ˜¯å…³é”®å²—位 0:否,1:是
     */
    private String keyPosts;
}
src/main/java/com/gs/xky/entity/SysUser.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,211 @@
package com.gs.xky.entity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
 * @TableName SYS_USER
 */
@TableName(value = "SYS_USER")
@Data
@KeySequence(value = "BASEINFO", dbType = DbType.ORACLE)
public class SysUser implements Serializable {
    @TableField(exist = false)
    private static final long serialVersionUID = 1L;
    /**
     *
     */
    @TableId
    private String fid;
    /**
     *
     */
    private String fcode;
    /**
     *
     */
    private String fname;
    /**
     *
     */
    private String fpassword;
    /**
     *
     */
    private String fbranch;
    /**
     *
     */
    private String fplant;
    /**
     *
     */
    private String fsystem;
    /**
     *
     */
    private String freadonly;
    /**
     *
     */
    private String floginName;
    /**
     * éƒ¨é—¨
     */
    private String departmentid;
    /**
     * è§’色
     */
    private Long roleid;
    /**
     * ç­æ¬¡
     */
    private String expField1;
    /**
     * çº¿ä½“
     */
    private String expField2;
    /**
     * ç…§ç‰‡
     */
    private Object expField3;
    /**
     * è”系方式
     */
    private String expField4;
    /**
     * å›¾ç‰‡å
     */
    private String expField5;
    /**
     * 1为开发用户,0为一般操作用户
     */
    private Integer lever;
    /**
     *
     */
    private String createBy;
    /**
     *
     */
    private Date createDate;
    /**
     *
     */
    private Integer dev;
    /**
     *
     */
    private Integer tet;
    /**
     *
     */
    private Integer prd;
    /**
     * æ˜¯å¦ä¸ºç®¡ç†äººå‘˜
     */
    private Integer ismanager;
    /**
     * æ˜¯å¦ä¸ºé‡‡é›†äººå‘˜
     */
    private Integer isacq;
    /**
     *
     */
    private String expField6;
    /**
     * è½¦é—´ç¼–码
     */
    private String expField7;
    /**
     *
     */
    private String expField8;
    /**
     *
     */
    private String expField9;
    /**
     *
     */
    private String expFiel10;
    /**
     *
     */
    private String expFiel11;
    /**
     * è´¨é‡æ¨¡å—首件确认-原因分析责任人
     */
    private Integer qmUser;
    /**
     * æ˜¯å¦ä¸ºä¸´æ—¶ç”¨æˆ·
     */
    private Integer status;
    /**
     * 1为离职,0为正常员工
     */
    private Integer isdeparture;
    /**
     * å…¬å¸
     */
    private String fcompany;
    /**
     * æ˜¯å¦æœ‰åˆ é™¤ç‰¹æƒ
     */
    private Long delFlag;
    /**
     * æŽ¥æ”¶ç‰©æ–™æ˜¯å¦è¿›è¡Œæ£€æŸ¥
     */
    private Long checkFlag;
    /**
     *
     */
    private Long expFiel12;
    /**
     * å·¥åŽ‚
     */
    private String ffactory;
    /**
     *
     */
    private Date pswEditTime;
    /**
     * é¦–次登陆
     */
    private Integer firstLogin;
    /**
     * æœ‰æ•ˆæœŸ
     */
    private Date periodValidity;
    /**
     * å·¥åŽ‚
     */
    private String factory;
    /**
     *
     */
    private String company;
    /**
     *
     */
    private Date lastlogin;
    /**
     * æœ€åŽæ›´æ–°äºº
     */
    private String lastupdateBy;
    /**
     * æœ€åŽæ›´æ–°æ—¥æœŸ
     */
    private Date lastupdateDate;
    /**
     *
     */
    private Long sid;
    /**
     *
     */
    private String organizeId;
}
src/main/java/com/gs/xky/mapper/MesStaffMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
package com.gs.xky.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.gs.xky.entity.MesStaff;
/**
 * @author 28567
 * @description é’ˆå¯¹è¡¨ã€MES_STAFF(员工信息表)】的数据库操作Mapper
 * @createDate 2025-02-17 20:59:36
 * @Entity com.gs.xky.entity.MesStaff
 */
public interface MesStaffMapper extends BaseMapper<MesStaff> {
    long getNextVal();
    int updateStaff();
    int deleteStaff();
}
src/main/java/com/gs/xky/mapper/SysUserMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,18 @@
package com.gs.xky.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.gs.xky.entity.SysUser;
/**
 * @author 28567
 * @description é’ˆå¯¹è¡¨ã€SYS_USER】的数据库操作Mapper
 * @createDate 2025-02-17 21:00:07
 * @Entity com.gs.xky.entity.SysUser
 */
public interface SysUserMapper extends BaseMapper<SysUser> {
}
src/main/java/com/gs/xky/service/ApiService.java
@@ -1,12 +1,17 @@
package com.gs.xky.service;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.gs.xky.config.ApiResponse;
import com.gs.xky.config.DingTalkParam;
import com.gs.xky.config.DingTalkResponse;
import com.gs.xky.config.XkyCommonParam;
import okhttp3.*;
import org.springframework.stereotype.Service;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.concurrent.TimeUnit;
@Service
@@ -14,11 +19,18 @@
    private final OkHttpClient client;
    private final ObjectMapper objectMapper;
    public ApiService() {
        this.client = new OkHttpClient.Builder().connectTimeout(90, TimeUnit.SECONDS) // Set connection timeout
                .readTimeout(90, TimeUnit.SECONDS)    // Set read timeout
                .build();
        this.objectMapper = new ObjectMapper();
        objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd"));
        objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
    }
    public <T> ApiResponse<T> sendListRequest(XkyCommonParam requestBody, Class<T> responseType, String url) throws IOException {
@@ -55,4 +67,40 @@
        // Optionally set other fields like list or total
        return errorResponse;
    }
    public <T> DingTalkResponse<T> sendListRequest(DingTalkParam requestBody, Class<T> responseType, String url) throws IOException {
        // è®¾ç½®è¯·æ±‚体的媒体类型为 application/json
        MediaType mediaType = MediaType.parse("application/json");
        // å°† ApiCommonParam å¯¹è±¡è½¬æ¢ä¸º JSON å­—符串
        String jsonBody = objectMapper.writeValueAsString(requestBody);
        // åˆ›å»ºè¯·æ±‚体
        RequestBody body = RequestBody.create(mediaType, jsonBody);
        Request request = new Request.Builder()
                .url(url)
                .method("POST", body)
                .addHeader("Content-Type", "application/json")
                .addHeader("Accept", "*/*")
                .addHeader("Connection", "keep-alive")
                .build();
        try (Response response = client.newCall(request).execute()) {
            if (response.isSuccessful()) {
                return objectMapper.readValue(response.body().string(), objectMapper.getTypeFactory().constructParametricType(DingTalkResponse.class, responseType));
            } else {
                return handleErrorResponse1(response);
            }
        }
    }
    private <T> DingTalkResponse<T> handleErrorResponse1(Response response) throws IOException {
        DingTalkResponse<T> errorResponse = new DingTalkResponse<>();
        errorResponse.setIsSuccess(String.valueOf(response.code()));
//        errorResponse.setError(response.message());
        // Optionally set other fields like list or total
        return errorResponse;
    }
}
src/main/java/com/gs/xky/service/Impl/MesStaffServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,238 @@
package com.gs.xky.service.Impl;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.gs.xky.dto.EmployeeInfo;
import com.gs.xky.entity.MesStaff;
import com.gs.xky.entity.SysUser;
import com.gs.xky.mapper.MesStaffMapper;
import com.gs.xky.service.MesStaffService;
import com.gs.xky.service.SysUserService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
/**
 * @author 28567
 * @description é’ˆå¯¹è¡¨ã€MES_STAFF(员工信息表)】的数据库操作Service实现
 * @createDate 2025-02-17 20:59:36
 */
@Service
@RequiredArgsConstructor
@Transactional(rollbackFor = Exception.class)
public class MesStaffServiceImpl extends ServiceImpl<MesStaffMapper, MesStaff> implements MesStaffService {
    private final SysUserService sysUserService;
    private final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    @Override
    public boolean SaveStaff(List<EmployeeInfo> employeeInfos) {
        List<SysUser> sysUsers = new ArrayList<>();
        List<MesStaff> mesStaffs = new ArrayList<>();
        for (EmployeeInfo employeeInfo : employeeInfos) {
            MesStaff mesStaff = getMesStaff(employeeInfo);
            SysUser user = getUser(employeeInfo, mesStaff.getId());
            sysUsers.add(user);
            mesStaffs.add(mesStaff);
        }
        // æ‰¹é‡æ’入或更新
        return batchInsert(sysUsers, mesStaffs);
    }
    private MesStaff getMesStaff(EmployeeInfo employeeInfo) {
        MesStaff mesStaff = new MesStaff();
        LambdaQueryWrapper<MesStaff> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(MesStaff::getRemark4, employeeInfo.getPersonId());
        MesStaff one = getOne(wrapper, false);
        if (one != null) {
            mesStaff.setId(one.getId());
        }
        mesStaff.setStaffNo(employeeInfo.getEmployeeId());
        mesStaff.setStaffName(employeeInfo.getTrueName());
        mesStaff.setPositionCode(employeeInfo.getNames());
        mesStaff.setKeyPosts("否");
        if (employeeInfo.getIsCore() != null && employeeInfo.getIsCore() == 1) {
            mesStaff.setKeyPosts("是");
        }
        // å¤„理日期字段
        try {
            if (StrUtil.isNotEmpty(employeeInfo.getAttendOnDate())) {
                Date startDate = sdf.parse(employeeInfo.getAttendOnDate());
                mesStaff.setStartDate(startDate);
            }
            if (StrUtil.isNotEmpty(employeeInfo.getDimissionDate())) {
                Date separationTime = sdf.parse(employeeInfo.getDimissionDate());
                mesStaff.setSeparationTime(separationTime);
            }
        } catch (ParseException e) {
            throw new RuntimeException("日期格式不正确", e);
        }
        // èµ‹å€¼å…¶ä»–信息
//        mesStaff.setFforbidStatus("1");
//        if ("离职".equals(employeeInfo.getState()) || "退休".equals(employeeInfo.getState())) {
//            mesStaff.setFforbidStatus("0");
//        }
        mesStaff.setFforbidStatus(employeeInfo.getState());
        mesStaff.setDepartmentName(employeeInfo.getUnitName());
        mesStaff.setRemark(StrUtil.isNotEmpty(employeeInfo.getLaowugongsi()) ? "派遣工" : "正式工");
        mesStaff.setRemark3(employeeInfo.getCUnitName());
        mesStaff.setRemark4(employeeInfo.getPersonId());
        return mesStaff;
    }
    private SysUser getUser(EmployeeInfo staff, Long id) {
        SysUser sysUser = new SysUser();
        LambdaQueryWrapper<SysUser> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(SysUser::getFcode, staff.getEmployeeId()).eq(SysUser::getFname, staff.getTrueName());
        SysUser one = sysUserService.getOne(wrapper, false);
        if (one == null) {
            // æ˜ å°„员工ID
            sysUser.setSid(id);
        } else {
            sysUser.setSid(one.getSid());
            sysUser.setFid(one.getFid());
        }
        // æ˜ å°„员工编号
        sysUser.setFcode(staff.getEmployeeId());
        // æ˜ å°„员工姓名
        sysUser.setFname(staff.getTrueName());
        // è®¾ç½®åˆå§‹å¯†ç 
        sysUser.setFpassword("8+()./,");
        // è®¾ç½®æƒé™çº§åˆ«
        sysUser.setLever(0);
        // è®¾ç½®å…¬å¸ä»£ç 
        sysUser.setFcompany("1000");
        // è®¾ç½®å·¥åŽ‚ä»£ç 
        sysUser.setFfactory("1000");
        // è®¾ç½®åˆ é™¤æ ‡å¿—
        sysUser.setDelFlag(0L);
        // è®¾ç½®è®¾å¤‡ç›¸å…³æ ‡å¿—
        sysUser.setDev(0);
        // è®¾ç½®æµ‹è¯•相关标志
        sysUser.setTet(0);
        // è®¾ç½®ç”Ÿäº§ç›¸å…³æ ‡å¿—
        sysUser.setPrd(1);
        // è®¾ç½®ç®¡ç†æ ‡å¿—
        sysUser.setIsmanager(0);
        // è®¾ç½®æ”¶è´­æ ‡å¿—
        sysUser.setIsacq(0);
        // è®¾ç½®æ‰©å±•字段
        sysUser.setExpField9("1020");
        // è®¾ç½®è´¨é‡æ£€æµ‹ç”¨æˆ·æ ‡å¿—
        sysUser.setQmUser(0);
        // è®¾ç½®ç”¨æˆ·çŠ¶æ€
        sysUser.setStatus(0);
        // è®¾ç½®ç¦»èŒæ ‡å¿—
        sysUser.setIsdeparture(0);
        // è®¾ç½®æ£€æŸ¥æ ‡å¿—
        sysUser.setCheckFlag(0L);
        // è®¾ç½®æ‰©å±•字段12
        sysUser.setExpFiel12(0L);
        // è®¾ç½®é¦–次登录标志
        sysUser.setFirstLogin(0);
        // è®¾ç½®åˆ›å»ºæ—¥æœŸ
        sysUser.setCreateDate(new Date());
        // è®¾ç½®å¯†ç ä¿®æ”¹æ—¶é—´
        sysUser.setPswEditTime(new Date());
        return sysUser;
    }
    private boolean batchInsert(List<SysUser> sysUsers, List<MesStaff> mesStaffs) {
        // æ‰¹é‡æ£€æŸ¥ SysUser æ˜¯å¦å­˜åœ¨
        List<Long> sysUserSids = sysUsers.stream().map(SysUser::getSid).collect(Collectors.toList());
        LambdaQueryWrapper<SysUser> wrapper = new LambdaQueryWrapper<>();
        wrapper.in(SysUser::getSid, sysUserSids);
        List<SysUser> existingUsers = sysUserService.list(wrapper);
        // åˆ†ç¦»éœ€è¦æ’入的新用户
        List<SysUser> newUserList = sysUsers.stream().filter(user -> existingUsers.stream().noneMatch(e -> e.getSid().equals(user.getSid()))).collect(Collectors.toList());
        // æ‰¹é‡æ’入新用户
        if (!newUserList.isEmpty()) {
            sysUserService.saveBatch(newUserList);
        }
        // æ‰¹é‡åˆ é™¤æ—§çš„ MesStaff è®°å½•
        //baseMapper.deleteStaff();
        // æ‰¹é‡æ’入新的 MesStaff è®°å½•
        if (!mesStaffs.isEmpty()) {
            saveBatch(mesStaffs);
        }
        //baseMapper.updateStaff();
        return true;
    }
    @Override
    public boolean UpdateStaff(List<EmployeeInfo> employeeInfos) {
        List<SysUser> sysUsers = new ArrayList<>();
        List<MesStaff> mesStaffs = new ArrayList<>();
        for (EmployeeInfo employeeInfo : employeeInfos) {
            MesStaff mesStaff = getMesStaff(employeeInfo);
            SysUser user = getUser(employeeInfo, mesStaff.getId());
            sysUsers.add(user);
            mesStaffs.add(mesStaff);
        }
        // æ‰¹é‡æ’入或更新
        boolean b = saveOrUpdateBatch(mesStaffs) && sysUserService.saveOrUpdateBatch(sysUsers);
        baseMapper.updateStaff();
        return b;
    }
}
src/main/java/com/gs/xky/service/Impl/SysUserServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,22 @@
package com.gs.xky.service.Impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.gs.xky.entity.SysUser;
import com.gs.xky.mapper.SysUserMapper;
import com.gs.xky.service.SysUserService;
import org.springframework.stereotype.Service;
/**
 * @author 28567
 * @description é’ˆå¯¹è¡¨ã€SYS_USER】的数据库操作Service实现
 * @createDate 2025-02-17 21:00:07
 */
@Service
public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser>
        implements SysUserService {
}
src/main/java/com/gs/xky/service/MesStaffService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
package com.gs.xky.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.gs.xky.dto.EmployeeInfo;
import com.gs.xky.entity.MesStaff;
import java.util.List;
/**
 * @author 28567
 * @description é’ˆå¯¹è¡¨ã€MES_STAFF(员工信息表)】的数据库操作Service
 * @createDate 2025-02-17 20:59:36
 */
public interface MesStaffService extends IService<MesStaff> {
    boolean SaveStaff(List<EmployeeInfo> employeeInfos);
    boolean UpdateStaff(List<EmployeeInfo> employeeInfos);
}
src/main/java/com/gs/xky/service/SysUserService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,13 @@
package com.gs.xky.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.gs.xky.entity.SysUser;
/**
 * @author 28567
 * @description é’ˆå¯¹è¡¨ã€SYS_USER】的数据库操作Service
 * @createDate 2025-02-17 21:00:07
 */
public interface SysUserService extends IService<SysUser> {
}
src/main/java/com/gs/xky/service/XkyService.java
@@ -44,7 +44,7 @@
        XkyCommonParam param = XkyCommonParam.GetInit();
        // è®¡ç®—五分钟前的时间戳
        long startDate = currentTimeMillis - (6 * 60 * 1000); // 5 åˆ†é’Ÿ = 5 * 60 * 1000 æ¯«ç§’
        long startDate = currentTimeMillis - (20 * 60 * 1000); // 5 åˆ†é’Ÿ = 5 * 60 * 1000 æ¯«ç§’
        // åˆ›å»º BodyParam å¯¹è±¡å¹¶èµ‹å€¼
        BodyParam bodyParam = new BodyParam();
src/main/java/com/gs/xky/task/ScheduledTasks.java
@@ -1,18 +1,30 @@
package com.gs.xky.task;
import cn.hutool.core.collection.ListUtil;
import com.gs.xky.config.DingTalkParam;
import com.gs.xky.config.DingTalkResponse;
import com.gs.xky.dto.EmployeeInfo;
import com.gs.xky.service.ApiService;
import com.gs.xky.service.MesStaffService;
import com.gs.xky.service.XkyService;
import lombok.RequiredArgsConstructor;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.io.IOException;
import java.util.List;
import java.util.stream.Collectors;
@Component
@RequiredArgsConstructor
public class ScheduledTasks {
    private final XkyService xkyService;
    private final ApiService apiService;
    private final MesStaffService staffService;
    /**
     * æ¯äº”分钟执行一次
@@ -27,4 +39,19 @@
    public void getDeviceRealTimeData() throws IOException {
        xkyService.GetSaveDetail();
    }
    @Scheduled(cron = "0 0 0/1 * * ?")
    public void getDinTalkData() throws IOException {
        DingTalkParam dingTalkParam = new DingTalkParam(1);
        DingTalkResponse<EmployeeInfo> employeeInfoDingTalkResponse = apiService.sendListRequest(dingTalkParam, EmployeeInfo.class, "http://192.168.1.64/eHR/eHRExternalService/Service.ashx");
        List<EmployeeInfo> collect = employeeInfoDingTalkResponse.getData().stream().filter(s -> "造梦者(浙江)科技有限公司".equals(s.getCUnitName())).collect(Collectors.toList());
        System.out.println(collect.size());
        List<List<EmployeeInfo>> partition = ListUtil.partition(collect, 100);
        partition.forEach(staffService::UpdateStaff);
    }
}
src/main/resources/mapper/MesStaffMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,22 @@
<?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.gs.xky.mapper.MesStaffMapper">
    <update id="updateStaff">
        update SYS_USER a
        set SID = (select ID from MES_STAFF where STAFF_NO = a.FCODE and STAFF_NAME = a.FNAME)
        where 1 = 1
    </update>
    <delete id="deleteStaff">
        delete
        from MES_STAFF
        where 1 = 1
    </delete>
    <select id="getNextVal" resultType="java.lang.Long">
        select SEQ_MES_STAFF.NextVal
        from dual
    </select>
</mapper>
src/main/resources/mapper/SysUserMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,7 @@
<?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.gs.xky.mapper.SysUserMapper">
</mapper>
src/test/java/com/gs/xky/XkyApplicationTests.java
@@ -1,18 +1,20 @@
package com.gs.xky;
import cn.hutool.core.collection.ListUtil;
import com.alibaba.fastjson2.JSON;
import com.gs.xky.config.ApiResponse;
import com.gs.xky.config.BodyParam;
import com.gs.xky.config.DataAcquisitionConfiguration;
import com.gs.xky.config.XkyCommonParam;
import com.gs.xky.config.*;
import com.gs.xky.dto.EmployeeInfo;
import com.gs.xky.dto.XkyDetail;
import com.gs.xky.service.ApiService;
import com.gs.xky.service.MesStaffService;
import com.gs.xky.service.XkyService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.io.IOException;
import java.util.List;
import java.util.stream.Collectors;
@SpringBootTest
class XkyApplicationTests {
@@ -23,6 +25,9 @@
    @Autowired
    private ApiService apiService;
    @Autowired
    private MesStaffService staffService;
    @Test
    void contextLoads() throws IOException {
@@ -47,4 +52,42 @@
        System.out.println(JSON.toJSONString(noList.getData()));
    }
    @Test
    void cs1() throws IOException {
        DingTalkParam dingTalkParam = new DingTalkParam();
        DingTalkResponse<EmployeeInfo> employeeInfoDingTalkResponse = apiService.sendListRequest(dingTalkParam, EmployeeInfo.class, "http://192.168.1.64/eHR/eHRExternalService/Service.ashx");
        //造梦者(浙江)科技有限公司 cUnitName
        //http://192.168.1.64/eHR
        List<EmployeeInfo> collect = employeeInfoDingTalkResponse.getData().stream().filter(s -> "造梦者(浙江)科技有限公司".equals(s.getCUnitName())).collect(Collectors.toList());
        System.out.println(collect.size());
        List<List<EmployeeInfo>> partition = ListUtil.partition(collect, 500);
        partition.forEach(list -> {
            staffService.SaveStaff(list);
        });
    }
    @Test
    void cs2() throws IOException {
        DingTalkParam dingTalkParam = new DingTalkParam(1);
        DingTalkResponse<EmployeeInfo> employeeInfoDingTalkResponse = apiService.sendListRequest(dingTalkParam, EmployeeInfo.class, "http://192.168.1.64/eHR/eHRExternalService/Service.ashx");
        //造梦者(浙江)科技有限公司 cUnitName
        //http://192.168.1.64/eHR
        List<EmployeeInfo> collect = employeeInfoDingTalkResponse.getData().stream().filter(s -> "造梦者(浙江)科技有限公司".equals(s.getCUnitName())).collect(Collectors.toList());
        System.out.println(collect.size());
        List<List<EmployeeInfo>> partition = ListUtil.partition(collect, 100);
        partition.forEach(list -> {
            staffService.UpdateStaff(list);
        });
    }
}