Przeglądaj źródła

浙江小遛睿人事算薪人员同步

hxx 4 miesięcy temu
rodzic
commit
5b821332ba

+ 88 - 0
mjava-xiaoliu/pom.xml

@@ -0,0 +1,88 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <groupId>com.malk</groupId>
+    <artifactId>mjava-xiaoliu</artifactId>
+    <version>0.0.1-SNAPSHOT</version>
+    <name>mjava-xiaoliu</name>
+    <description>mjava-xiaoliu</description>
+    <properties>
+        <java.version>1.8</java.version>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+        <spring-boot.version>2.6.13</spring-boot.version>
+    </properties>
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.malk</groupId>
+            <artifactId>base</artifactId>
+            <version>1.3</version>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+    </dependencies>
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-dependencies</artifactId>
+                <version>${spring-boot.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+
+    <build>
+        <finalName>xiaoliu</finalName>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>3.8.1</version>
+                <configuration>
+                    <source>1.8</source>
+                    <target>1.8</target>
+                    <encoding>UTF-8</encoding>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <version>${spring-boot.version}</version>
+                <configuration>
+                    <mainClass>com.malk.xiaoliu.MjavaXiaoliuApplication</mainClass>
+<!--                    <skip>true</skip>-->
+                </configuration>
+                <executions>
+                    <execution>
+                        <id>repackage</id>
+                        <goals>
+                            <goal>repackage</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

+ 15 - 0
mjava-xiaoliu/src/main/java/com/malk/xiaoliu/MjavaXiaoliuApplication.java

@@ -0,0 +1,15 @@
+package com.malk.xiaoliu;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.scheduling.annotation.EnableScheduling;
+
+@SpringBootApplication(scanBasePackages = {"com.malk"})
+@EnableScheduling
+public class MjavaXiaoliuApplication {
+
+    public static void main(String[] args) {
+        SpringApplication.run(MjavaXiaoliuApplication.class, args);
+    }
+
+}

+ 28 - 0
mjava-xiaoliu/src/main/java/com/malk/xiaoliu/controller/personController.java

@@ -0,0 +1,28 @@
+package com.malk.xiaoliu.controller;
+
+import com.malk.xiaoliu.service.personService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 功能:
+ * 作者:hanxue
+ * 日期:2026/5/7 17:32
+ */
+@RequestMapping("/hr")
+@RestController
+@Slf4j
+public class personController {
+    @Autowired
+    private personService personservice;
+    @Scheduled(cron = "0 0 21 * * ?")
+    @PostMapping("/syncPerson")
+    public void syncPerson(){
+        log.info("同步人员信息");
+        personservice.syncPerson("1","根组织");
+    }
+}

+ 157 - 0
mjava-xiaoliu/src/main/java/com/malk/xiaoliu/service/Impl/personServiceImpl.java

@@ -0,0 +1,157 @@
+package com.malk.xiaoliu.service.Impl;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.malk.server.aliwork.YDConf;
+import com.malk.server.aliwork.YDParam;
+import com.malk.server.aliwork.YDSearch;
+import com.malk.service.aliwork.YDClient;
+import com.malk.utils.UtilHttp;
+import com.malk.utils.UtilMap;
+import com.malk.utils.UtilToken;
+import com.malk.xiaoliu.service.personService;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.checkerframework.checker.units.qual.A;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+import org.springframework.stereotype.Service;
+
+import java.util.*;
+
+/**
+ * 功能:
+ * 作者:hanxue
+ * 日期:2026/5/7 17:33
+ */
+@Slf4j
+@Service
+public class personServiceImpl implements personService {
+    @Autowired
+    private YDClient ydClient;
+    @Value("${rhr.client_id}")
+    private String clientId;
+    @Value("${rhr.client_secret}")
+    private String clientSecret;
+    @Value("${rhr.corpId}")
+    private String corpId;
+    @Value("${rhr.scope}")
+    private String scope;
+    @Value("${rhr.host}")
+    private String host;
+
+    @Override
+    public void syncPerson(String orgId, String orgName) {
+        log.info("开始同步人员的部门名为:{},部门编号为:{}", orgName, orgId);
+//        获取该部门下面所有人员
+//        /open/api/v1/employee/list
+        Map employeeBody = new HashMap();
+        employeeBody.put("employeeStatus", "working");
+        List orgIds = new ArrayList();
+        orgIds.add(orgId);
+        employeeBody.put("orgIds",orgIds);
+        List<Map> employeeList = callRhrApi("/open/api/v1/employee/list",employeeBody);
+        if(employeeList.size()>0){
+        log.info("该部门中在职员工数量为:{}", employeeList.size());
+        List<String> validValues = Arrays.asList("保底计件两者就高", "固定加计件提成", "全面计件");
+        for (Map employeeItem : employeeList) {
+            if(employeeItem.containsKey("field_emp_sele_009") && validValues.contains(UtilMap.getString(employeeItem, "field_emp_sele_009"))){
+                log.info("计薪员工姓名为:{}", UtilMap.getString(employeeItem, "name"));
+//                符合条件推送宜搭
+                Map yidaDormdata = new HashMap();
+//                员工姓名
+                yidaDormdata.put("textField_mo15j8ga",UtilMap.getString(employeeItem,"name"));
+//                手机号
+                yidaDormdata.put("textField_mo15j8gb",UtilMap.getString(employeeItem,"mobileNumber"));
+//                身份证号
+                yidaDormdata.put("textField_mo87l3gr",UtilMap.getString(employeeItem,"idNumber"));
+////                围栏
+//                yidaDormdata.put("textField_mo15j8gd",UtilMap.getString(employeeItem,"idNumber"));
+////                站点
+//                yidaDormdata.put("textField_mo15j8ge",UtilMap.getString(employeeItem,"idNumber"));
+//                职位
+                yidaDormdata.put("textField_mo15j8gf",UtilMap.getString(employeeItem,"jobTitle"));
+//                任职状态
+                yidaDormdata.put("textField_mo15j8gg",UtilMap.getString(employeeItem,"employeeType"));
+//                计薪方式
+                yidaDormdata.put("textField_mowlu94w",UtilMap.getString(employeeItem,"field_emp_sele_009"));
+                ydClient.operateData(YDParam.builder()
+                        .formUuid("FORM-EB1B4529794044CF920C8745AE7B4DAAMBHR")
+                        .searchCondition(JSONObject.toJSONString(Arrays.asList(
+                                new YDSearch("textField_mo87l3gr",UtilMap.getString(employeeItem,"idNumber"), "textField_mo87l3gr",
+                                        YDSearch.Type.TEXT_FIELD, YDSearch.Operator.EQ)
+                        )))
+                        .useLatestVersion(true)
+                        .formDataJson(JSONObject.toJSONString(yidaDormdata))
+                        .build(), YDConf.FORM_OPERATION.upsert);
+            }
+        }
+    }else{
+            log.info("该部门中在职员工数量为:{}", employeeList.size());
+    }
+//        获取子部门进行递归
+        Map deptBody = new HashMap();
+        List parentOrgIds = new ArrayList();
+        parentOrgIds.add(orgId);
+        deptBody.put("parentOrgIdList",parentOrgIds);
+        List<Map> childOrgList = callRhrApi("/open/api/v1/org/getOrgChildList",deptBody);
+        for (Map childOrgItem : childOrgList) {
+            String orgChildId = UtilMap.getString(childOrgItem, "orgId");
+            Map orgDetail=UtilMap.getMap(childOrgItem,"dataMap");
+            String orgChildName = UtilMap.getString(orgDetail, "name");
+//            log.info("开始同步部门的部门名为:{},部门编号为:{}", orgChildName, orgChildId);
+            syncPerson(orgChildId, orgChildName);
+        }
+    }
+
+//    调用睿人事接口方法
+    public List<Map> callRhrApi(String url, Map body) {
+        String token = getAccessToken();
+        Map headers = new HashMap();
+        headers.put("Authorization", "Bearer " + token);
+        body.put("corpId", corpId);
+        int page = 1;
+        int pageSize = 100;
+        body.put("page", page);
+        body.put("pageSize", pageSize);
+        List<Map> apiResList = new ArrayList();
+        List<Map> resDataItems= new ArrayList();
+        int totalCount=0;
+        do {
+            String response = UtilHttp.doPost(host + url, headers, null, body);
+            Map resData = JSONObject.parseObject(response, Map.class);
+            Map resDataList = UtilMap.getMap(resData, "data");
+            resDataItems = UtilMap.getList(resDataList, "list");
+            totalCount = UtilMap.getInt(resDataList, "total");
+            if (resDataItems.size() > 0) {
+                apiResList.addAll(resDataItems);
+            }
+            page++;  // 准备查询下一页
+        } while (resDataItems.size() > 0 && totalCount > (page - 1) * pageSize);
+        return apiResList;
+    }
+    //    getAccessToken
+    public String getAccessToken()  {
+        String accessToken =UtilToken.get("invalid-token");
+        if (StringUtils.isNotBlank(accessToken)) return accessToken;
+        Map params = new HashMap();
+        params.put("client_id", clientId);
+        params.put("client_secret", clientSecret);
+        params.put("scope", scope);
+        params.put("grant_type", "client_credentials");
+        try {
+            String oauToken =  UtilHttp.doPost(host+"/oauth2/token", null, params,(Map)null);
+            Map tokenMap = JSONObject.parseObject(oauToken.toString(), Map.class);
+            accessToken = UtilMap.getString(tokenMap, "access_token");
+            Long timeout = UtilMap.getLong(tokenMap, "expires_in");
+            UtilToken.put("invalid-token", accessToken, timeout * 1000L);
+            return accessToken;
+        }catch (Exception e){
+            log.error("获取accessToken失败",e);
+            throw new RuntimeException("获取 access_token 失败: " + e.getMessage(), e);
+        }
+    }
+}

+ 5 - 0
mjava-xiaoliu/src/main/java/com/malk/xiaoliu/service/personService.java

@@ -0,0 +1,5 @@
+package com.malk.xiaoliu.service;
+
+public interface personService {
+    void syncPerson(String orgId,String orgName);
+}

Plik diff jest za duży
+ 46 - 0
mjava-xiaoliu/src/main/resources/application-dev.yml


Plik diff jest za duży
+ 43 - 0
mjava-xiaoliu/src/main/resources/application-prod.yml


+ 15 - 0
mjava-xiaoliu/src/main/resources/application.yml

@@ -0,0 +1,15 @@
+spring:
+  profiles:
+    active: dev
+  servlet:
+    multipart:
+      max-file-size: 100MB
+      max-request-size: 100MB
+  http:
+    enabled: false
+
+#  configuration:
+#    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
+  global-config:
+    db-config:
+      id-type: auto

+ 61 - 0
mjava-xiaoliu/src/main/resources/logback-spring.xml

@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration debug="false" scan="false" scanPeriod="60 seconds">
+    <springProperty scope="context" name="LOG_HOME" source="logging.path" defaultValue="/home/server/log/"/>
+    <property name="FileNamePattern" value="${LOG_HOME}%d{yyyyMM}/%d{dd}"/>
+
+    <!-- 定义控制台输出 -->
+    <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
+        <layout class="ch.qos.logback.classic.PatternLayout">
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} - [%thread] - %-5level - %logger{50} - %msg%n</pattern>
+        </layout>
+    </appender>
+
+    <appender name="appLogAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <!-- 指定日志文件的名称 -->
+        <!--<file>${FileNamePattern}/info.log</file>-->
+
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <fileNamePattern>${FileNamePattern}/info-%i.log</fileNamePattern>
+            <MaxHistory>30</MaxHistory>
+            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <MaxFileSize>30MB</MaxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+        </rollingPolicy>
+
+        <layout class="ch.qos.logback.classic.PatternLayout">
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [ %thread ] - [ %-5level ] [ %logger{50} : %line ] - %msg%n</pattern>
+        </layout>
+    </appender>
+
+    <appender name="SIFT" class="ch.qos.logback.classic.sift.SiftingAppender">
+        <discriminator>
+            <Key>processid</Key>
+            <DefaultValue>sys</DefaultValue>
+        </discriminator>
+        <sift>
+            <appender name="FILE-${processid}"
+                      class="ch.qos.logback.core.rolling.RollingFileAppender">
+                <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+                    <FileNamePattern>
+                        ${FileNamePattern}/${processid}.log
+                    </FileNamePattern>
+                </rollingPolicy>
+                <layout class="ch.qos.logback.classic.PatternLayout">
+                    <Pattern>
+                        %d{yyyyMMdd:HH:mm:ss.SSS} [%thread] %-5level %msg%n
+                    </Pattern>
+                </layout>
+            </appender>
+        </sift>
+    </appender>
+
+
+    <!-- 日志输出级别 -->
+    <logger name="org.springframework" level="debug"  additivity="false"/>
+    <logger name="com.malk.connecter" level="debug"/>
+    <root level="INFO">
+        <appender-ref ref="stdout"/>
+        <appender-ref ref="appLogAppender"/>
+        <appender-ref ref="SIFT"/>
+    </root>
+</configuration>

+ 18 - 0
mjava-xiaoliu/src/test/java/com/malk/xiaoliu/MjavaXiaoliuApplicationTests.java

@@ -0,0 +1,18 @@
+package com.malk.xiaoliu;
+
+import com.malk.xiaoliu.service.Impl.personServiceImpl;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+
+@SpringBootTest
+class MjavaXiaoliuApplicationTests {
+
+    @Autowired
+    private personServiceImpl personService;
+//    @Test
+//    void contextLoads() {
+//        personService.syncPerson("1","根组织");
+//    }
+
+}