Merge branch 'feature/REQ-3136' into 'master'

Feature/req 3136

See merge request universal/infrastructure/backend/riven!60
This commit is contained in:
周敏 2024-10-31 10:21:47 +00:00
commit 194b057d95
16 changed files with 565 additions and 11 deletions

View File

@ -6,14 +6,13 @@
<parent>
<groupId>cn.axzo</groupId>
<artifactId>riven</artifactId>
<version>2.0.0-SNAPSHOT</version>
<version>${revision}</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>integration-test</artifactId>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

View File

@ -0,0 +1,12 @@
###
POST localhost:8080/api/thirdPart/listProjectPeople
Accept: application/json
Content-Type: application/json
Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpblR5cGUiOiJsb2dpbiIsImxvZ2luSWQiOiJOVF9PTVNfV0VCOjkwMDA0MDAzMjIiLCJyblN0ciI6IndWbXF6d1VYWG5sZ2lHRm1MRmpHVXdzdGVac0xrbkpnIn0.fapfkozDj51dA2lFmCmIkv7ZFaLVOFGzn6OAyvndW1c
{
"thirdCode": "taizhou",
"thirdProjectId": "Jh0Cj4e%2BJhtDDYYdhmkV0flbxjUPOZXzS4z%2BAXKMf%2B8=",
"thirdUniquePersonIds": [],
"needThirdPerson": true
}

View File

@ -2,17 +2,22 @@ package cn.axzo.riven.client.feign;
import cn.axzo.framework.domain.web.result.ApiResult;
import cn.axzo.riven.client.common.enums.ThirdCodeEnum;
import cn.axzo.riven.client.req.ListDeptReq;
import cn.axzo.riven.client.req.ListThirdProjectPeopleReq;
import cn.axzo.riven.client.res.ThirdPartPersonRes;
import cn.axzo.riven.client.res.ThirdPartUserRes;
import cn.axzo.riven.client.res.ThirdPartyDeptTreeRes;
import cn.axzo.riven.client.res.ThirdPartyDeptUserTreeRes;
import cn.axzo.riven.client.res.ThirdProjectPersonRes;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import javax.validation.Valid;
import java.util.List;
import java.util.Set;
/**
@ -24,12 +29,19 @@ public interface ThirdPartPersonApi {
/**
* 通过安心筑人员账号和三方类型获取三方人员信息
*
* @param personId 安心筑人员ID
* @param thirdCode 三方类型枚举值
* @return
*/
@GetMapping("/api/thirdPart/getPerson")
ApiResult<ThirdPartPersonRes> getThirdPartPerson(@RequestParam("personId")Long personId,@RequestParam("thirdCode") ThirdCodeEnum thirdCode);
ApiResult<ThirdPartPersonRes> getThirdPartPerson(@RequestParam("personId") Long personId, @RequestParam("thirdCode") ThirdCodeEnum thirdCode);
/**
* 查询三方项目用户
* @param param
* @return
*/
@PostMapping("/api/thirdPart/listProjectPeople")
ApiResult<List<ThirdProjectPersonRes>> listThirdProjectPeople(@RequestBody @Valid ListThirdProjectPeopleReq param);
}

View File

@ -0,0 +1,22 @@
package cn.axzo.riven.client.feign;
import cn.axzo.framework.domain.web.result.ApiResult;
import cn.axzo.riven.client.req.ThirdProjectReq;
import cn.axzo.riven.client.res.ThirdProjectResp;
import java.util.List;
import javax.validation.Valid;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
/**
* @author syl
* @date 2024/10/24
*/
@FeignClient(name = "riven", url = "${axzo.service.riven:http://riven:8080}")
public interface ThirdProjectApi {
@PostMapping("/api/third/queryProject")
ApiResult<List<ThirdProjectResp>> queryThirdProject(@RequestBody @Valid ThirdProjectReq req);
}

View File

@ -0,0 +1,34 @@
package cn.axzo.riven.client.req;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.validation.constraints.NotBlank;
import java.io.Serializable;
import java.util.Set;
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class ListThirdProjectPeopleReq implements Serializable {
/**
* 三方名称code
*/
@NotBlank(message = "thirdCode不能为空")
private String thirdCode;
/**
* '三方项目编号'
*/
@NotBlank(message = "thirdProjectId不能为空")
private String thirdProjectId;
/**
* 三方人员唯一ID
*/
private Set<String> thirdUniquePersonIds;
private Boolean needThirdPerson;
}

View File

@ -0,0 +1,25 @@
package cn.axzo.riven.client.req;
import cn.axzo.riven.client.common.enums.ThirdCodeEnum;
import javax.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author syl
* @date 2024/10/24
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class ThirdProjectReq {
/**
* 第三方编码code
*/
@NotNull(message = "第三方编码不能为空")
private ThirdCodeEnum thirdCode;
}

View File

@ -0,0 +1,27 @@
package cn.axzo.riven.client.res;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author syl
* @date 2024/10/24
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class TaiZhouThirdProjectExtDto {
/**
* 考勤供应商登记编号
*/
private String bagsBH;
/**
* 项目数据指纹
*/
private String dataNumber;
}

View File

@ -0,0 +1,73 @@
package cn.axzo.riven.client.res;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.Date;
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class ThirdPersonRes implements Serializable {
private Long id;
/**
* 三方名称code
*/
private String thirdCode;
/**
* 三方人员唯一ID
*/
private String thirdUniquePersonId;
/**
* 三方人员姓名
*/
private String thirdPersonName;
/**
* 三方人员手机号
*/
private String thirdPersonPhone;
/**
* 三方人员身份证照片
*/
private String thirdPersonPhoto;
/**
* 身份证签发单位
*/
private String thirdAuthority;
/**
* 三方身份证号
*/
private String thirdIdNumber;
/**
* 三方人脸照片
*/
private String thirdPersonFaceUrl;
/**
* 三方性别
*/
private String thirdSex;
/**
* 安心筑人员ID,安心筑唯一识别码
*/
private Long personId;
private String thirdExt;
private Long isDelete = 0L;
private Date createAt;
private Date updateAt;
}

View File

@ -0,0 +1,85 @@
package cn.axzo.riven.client.res;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class ThirdProjectPersonRes {
private Long id;
/**
* 三方名称code
*/
private String thirdCode;
/**
* '三方项目编号'
*/
private String thirdProjectId;
/**
* 三方人员唯一ID
*/
private String thirdUniquePersonId;
/**
* 三方人员工号ID
*/
private String thirdWorkerId;
/**
* 三方工人类型
*/
private String thirdWorkType;
/**
* 三方所属班组
*/
private String thirdTeamId;
/**
* 三方所属班组名称
*/
private String thirdTeamName;
/**
* 三方班组ID
*/
private String thirdWorkId;
/**
* 三方部门ID
*/
private String thirdDepartmentId;
/**
* 三方岗位名称
*/
private String thirdPostName;
/**
* 最后一次同步时间
*/
private Date lastSyncAt;
private Long workspaceId;
/**
* 三方ext,扩展域等等,工种信息等等
*/
private String thirdExt;
private Long isDelete = 0L;
private Date createAt;
private Date updateAt;
/**
* 需要指定 needThirdPerson = true
*/
private ThirdPersonRes thirdPersonRes;
}

View File

@ -0,0 +1,59 @@
package cn.axzo.riven.client.res;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author syl
* @date 2024/10/24
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class ThirdProjectResp {
/**
* 三方名称code
*/
private String thirdCode;
/**
* 三方项目编号
*/
private String thirdProjectId;
/**
* 三方项目名称
*/
private String thirdProjectName;
/**
* 同步策略0不创建人员1创建普通员工2创建管理员3创建普通员工+管理员
*/
private String syncType;
/**
* 三方单位统一社会信用代码
*/
private String uniformSocialCreditCode;
/**
* 三方建设单位名称
*/
private String thirdProjectConstructionUnit;
/**
* 三方扩展域
* 每个三方对应扩展域不同
*/
private String thirdProjectExt;
/**
* 泰州项目扩展配置
*/
private TaiZhouThirdProjectExtDto taiZhouThirdProjectExt;
}

View File

@ -0,0 +1,54 @@
package cn.axzo.riven;
import lombok.extern.log4j.Log4j2;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.ApplicationContext;
import org.springframework.core.env.Environment;
/**
*
*/
//@SpringBootApplication(scanBasePackages = "cn.axzo")
@EnableFeignClients(basePackages = {"cn.axzo"})
@Log4j2
public class RivenTestApplication {
public static void main(String[] args) throws Exception {
System.setProperty("spring.profiles.active", "test");
System.setProperty("NACOS_HOST", "https://test-nacos.axzo.cn");
System.setProperty("NACOS_NAMESPACE_ID", "f3c0f0d2-bac4-4498-bee7-9c3636b3afdf");
System.setProperty("CUSTOM_ENV", "test");
System.setProperty("NACOS_PORT", "443");
System.setProperty("spring.redis.port", "6379");
System.setProperty("spring.redis.host", "172.16.2.149");
System.setProperty("spring.datasource.url", "jdbc:mysql://172.16.2.143:3306/pudge?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&useSSL=true&verifyServerCertificate=false");
System.setProperty("rocketmq.name-server", "172.16.2.82:9876");
SpringApplication application = new SpringApplication(RivenTestApplication.class);
ApplicationContext applicationContext = application.run(args);
Environment env = applicationContext.getEnvironment();
log.info(
"--------------------------------------------------------------------------------------------------------------------\n" +
"Application 【{}】 is running on 【{}】 environment!\n" +
"Api Local: \thttp://127.0.0.1:{}\n" +
"Mysql: \t{}\t username:{}\n" +
"Redis: \t{}:{}\t database:{}\n" +
"RabbitMQ: \t{}\t username:{}",
env.getProperty("spring.application.name"),
env.getProperty("spring.profiles.active"),
env.getProperty("server.port"),
env.getProperty("spring.datasource.url"),
env.getProperty("spring.datasource.username"),
env.getProperty("spring.redis.host"),
env.getProperty("spring.redis.port"),
env.getProperty("spring.redis.database"),
env.getProperty("spring.rabbitmq.addresses"),
env.getProperty("spring.rabbitmq.username") +
"\n----------------------------------------------------------");
}
}

View File

@ -0,0 +1,39 @@
package cn.axzo.riven.third.api;
import cn.axzo.framework.domain.web.result.ApiResult;
import cn.axzo.riven.client.common.enums.ThirdCodeEnum;
import cn.axzo.riven.client.feign.ThirdProjectApi;
import cn.axzo.riven.client.req.ThirdProjectReq;
import cn.axzo.riven.client.res.ThirdProjectResp;
import cn.axzo.riven.third.mapstruct.ThirdProjectConverter;
import cn.axzo.riven.third.taizhou.entity.TaiZhouProject;
import cn.axzo.riven.third.taizhou.service.TaiZhouService;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RestController;
/**
* @author syl
* @date 2024/10/24
*/
@Slf4j
@RestController
public class ThirdProjectApiImpl implements ThirdProjectApi {
@Autowired
private TaiZhouService taiZhouService;
@Override
public ApiResult<List<ThirdProjectResp>> queryThirdProject(ThirdProjectReq req) {
// 目前仅对接泰州所以这里仅支持泰州项目查询
if (!Objects.equals(ThirdCodeEnum.TAI_ZHOU, req.getThirdCode())) {
return ApiResult.ok(new ArrayList<>());
}
List<TaiZhouProject> taiZhouProjectList = taiZhouService.queryThirdProjectForTaiZhou();
List<ThirdProjectResp> result = ThirdProjectConverter.INSTANCE.convertFromProjects(taiZhouProjectList);
return ApiResult.ok(result);
}
}

View File

@ -1,14 +1,34 @@
package cn.axzo.riven.third.controller;
import cn.axzo.basics.common.constant.enums.TableIsDeleteEnum;
import cn.axzo.framework.domain.web.result.ApiResult;
import cn.axzo.riven.client.common.enums.ThirdCodeEnum;
import cn.axzo.riven.client.feign.ThirdPartPersonApi;
import cn.axzo.riven.client.req.ListThirdProjectPeopleReq;
import cn.axzo.riven.client.res.ThirdPartPersonRes;
import cn.axzo.riven.client.res.ThirdPersonRes;
import cn.axzo.riven.client.res.ThirdProjectPersonRes;
import cn.axzo.riven.third.dao.ThirdPersonDao;
import cn.axzo.riven.third.dao.ThirdProjectDao;
import cn.axzo.riven.third.dao.ThirdProjectPersonDao;
import cn.axzo.riven.third.entity.ThirdPerson;
import cn.axzo.riven.third.entity.ThirdProject;
import cn.axzo.riven.third.entity.ThirdProjectPerson;
import cn.axzo.riven.third.service.ThirdPersonService;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.BooleanUtil;
import cn.hutool.core.util.StrUtil;
import com.google.common.collect.ImmutableList;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
* @author zhongpeng
* @date 2024/8/9 18:10
@ -18,12 +38,66 @@ import org.springframework.web.bind.annotation.RestController;
public class ThirdPartPersonController implements ThirdPartPersonApi {
private final ThirdPersonService thirdPersonService;
private final ThirdProjectPersonDao thirdProjectPersonDao;
private final ThirdPersonDao thirdPersonDao;
private final ThirdProjectDao thirdProjectDao;
@Override
public ApiResult<ThirdPartPersonRes> getThirdPartPerson(Long personId, ThirdCodeEnum thirdCode) {
ThirdPartPersonRes thirdPartPersonRes = thirdPersonService.getThirdPartPerson(personId,thirdCode);
ThirdPartPersonRes thirdPartPersonRes = thirdPersonService.getThirdPartPerson(personId, thirdCode);
return ApiResult.ok(thirdPartPersonRes);
}
@Override
public ApiResult<List<ThirdProjectPersonRes>> listThirdProjectPeople(ListThirdProjectPeopleReq param) {
ThirdProject thirdProject = thirdProjectDao.lambdaQuery().eq(ThirdProject::getThirdCode, param.getThirdCode())
.eq(ThirdProject::getThirdProjectId, param.getThirdProjectId())
.eq(ThirdProject::getIsDelete, TableIsDeleteEnum.NORMAL.value)
.one();
if (thirdProject == null){
return ApiResult.ok(ImmutableList.of());
}
List<ThirdProjectPersonRes> result = thirdProjectPersonDao.lambdaQuery()
.eq(ThirdProjectPerson::getThirdCode, param.getThirdCode())
.eq(ThirdProjectPerson::getThirdProjectId, param.getThirdProjectId())
.in(CollUtil.isNotEmpty(param.getThirdUniquePersonIds()), ThirdProjectPerson::getThirdUniquePersonId, param.getThirdUniquePersonIds())
.eq(ThirdProjectPerson::getIsDelete, TableIsDeleteEnum.NORMAL.value)
.list()
.stream().map(e -> {
ThirdProjectPersonRes res = BeanUtil.toBean(e, ThirdProjectPersonRes.class);
res.setWorkspaceId(thirdProject.normalizedExt().getWorkspaceId());
return res;
})
.collect(Collectors.toList());
assembleThirdPersonIfNeed(result, param);
return ApiResult.ok(result);
}
private void assembleThirdPersonIfNeed(List<ThirdProjectPersonRes> result, ListThirdProjectPeopleReq param) {
if (result.isEmpty()) {
return;
}
if (!BooleanUtil.isTrue(param.getNeedThirdPerson())) {
return;
}
Set<String> thirdPersonIds = result.stream()
.map(ThirdProjectPersonRes::getThirdUniquePersonId)
.filter(StrUtil::isNotBlank)
.collect(Collectors.toSet());
if (thirdPersonIds.isEmpty()) {
return;
}
Map<String, ThirdPerson> thirdPersonMap = thirdPersonDao.lambdaQuery()
.eq(ThirdPerson::getThirdCode, param.getThirdCode())
.in(ThirdPerson::getThirdUniquePersonId, thirdPersonIds)
.eq(ThirdPerson::getIsDelete, TableIsDeleteEnum.NORMAL.value)
.list().stream()
.collect(Collectors.toMap(ThirdPerson::getThirdUniquePersonId, Function.identity()));
result.forEach(t -> {
ThirdPerson thirdPerson = thirdPersonMap.get(t.getThirdUniquePersonId());
t.setThirdPersonRes(thirdPerson == null ? null : BeanUtil.toBean(thirdPerson, ThirdPersonRes.class));
});
}
}

View File

@ -1,6 +1,10 @@
package cn.axzo.riven.third.entity;
import cn.axzo.framework.data.mybatisplus.model.BaseEntity;
import cn.axzo.riven.third.taizhou.entity.TaiZhouThirdProjectExt;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Getter;
import lombok.Setter;
@ -49,4 +53,9 @@ public class ThirdProject extends BaseEntity<ThirdProject> {
*/
private String thirdProjectExt;
public TaiZhouThirdProjectExt normalizedExt() {
return StrUtil.isBlank(thirdProjectExt) ? new TaiZhouThirdProjectExt()
: JSON.parseObject(thirdProjectExt, TaiZhouThirdProjectExt.class);
}
}

View File

@ -0,0 +1,26 @@
package cn.axzo.riven.third.mapstruct;
import cn.axzo.riven.client.res.ThirdProjectResp;
import cn.axzo.riven.third.taizhou.entity.TaiZhouProject;
import java.util.List;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Mappings;
import org.mapstruct.factory.Mappers;
/**
* @author syl
* @date 2024/10/24
*/
@Mapper(builder = @org.mapstruct.Builder(disableBuilder = true))
public interface ThirdProjectConverter {
ThirdProjectConverter INSTANCE = Mappers.getMapper(ThirdProjectConverter.class);
@Mappings({
@Mapping(source = "taiZhouThirdProjectExt", target = "taiZhouThirdProjectExt"),
})
ThirdProjectResp map(TaiZhouProject project);
List<ThirdProjectResp> convertFromProjects(List<TaiZhouProject> req);
}

View File

@ -22,5 +22,9 @@ public class TaiZhouThirdProjectExt implements Serializable {
*/
private String dataNumber;
/**
* 对应安心筑项目id
*/
private Long workspaceId;
}