Compare commits

...

2 Commits

21 changed files with 571 additions and 101 deletions

View File

@ -0,0 +1,23 @@
package com.coscoshipping.ebtp.system.attachment.client;
import com.chinaunicom.mall.ebtp.common.base.entity.BaseResponse;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
@FeignClient(value = "data-service-document-center",url = "http://10.242.31.158:8100/doc", fallbackFactory = DocumentServerFeignFallbackFactory.class)
//@FeignClient(value = "${mconfig.feign.name.document}", fallbackFactory = DocumentServerFeignFallbackFactory.class)
public interface DocumentServerFeignClient {
@GetMapping("api/data-service-document-center/outer/v1.0/files/getSecretKey")
BaseResponse<String> getSecretKey();
// @GetMapping(value ="api/data-service-document-center/outer/v1.0/files/getDownload")
@GetMapping(value = "api/data-service-document-center/outer/v1.0/files/getDownload")
feign.Response getDownload(@RequestParam String fileId, @RequestParam String documentSecretKey);
}

View File

@ -0,0 +1,32 @@
package com.coscoshipping.ebtp.system.attachment.client;
import cn.hutool.core.exceptions.ExceptionUtil;
import com.chinaunicom.mall.ebtp.common.base.entity.BaseResponse;
import feign.Response;
import feign.hystrix.FallbackFactory;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
@Component
@Slf4j
public class DocumentServerFeignFallbackFactory implements FallbackFactory<DocumentServerFeignClient> {
@Override
public DocumentServerFeignClient create(Throwable throwable) {
DocumentServerFeignClient back = new DocumentServerFeignClient() {
@Override
public BaseResponse<String> getSecretKey() {
return new BaseResponse<>();
}
@Override
public Response getDownload(String fileId, String documentSecretKey) {
log.info("文档中心异常,下载失败");
return null;
}
};
log.error(ExceptionUtil.stacktraceToString(throwable));
return back;
}
}

View File

@ -0,0 +1,58 @@
package com.coscoshipping.ebtp.system.attachment.controller;
import com.chinaunicom.ebtp.mall.cloud.attachment.sdk.api.AttachmentClient;
import com.chinaunicom.ebtp.mall.cloud.attachment.sdk.model.AttachmentEntity;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
@Slf4j
@RestController
@RequestMapping("/v1/attachment")
public class AttachmentOssController {
/* 附件工具 */
@Autowired
private AttachmentClient attachmentClient;
/**
* 使用对象Id查询附件信息
* pbr
*
* @param objectId
* @return org.springframework.http.ResponseEntity<java.util.Map < java.lang.String, java.lang.Object>>
* @author liuh
*/
@Operation(summary = "使用对象Id查询附件信息")
@GetMapping(value = "/find/oid/{oid}")
public ResponseEntity<Map<String, Object>> findByObjectId(
@Parameter(description = "对象Id") @PathVariable("oid") String objectId) {
// 查询cos中存储的指定对象明细
Optional<AttachmentEntity> op = attachmentClient.findByObjectId(objectId);
// 创建vo模型
Map<String, Object> result = new HashMap<String, Object>();
boolean esists = op.isPresent();
result.put("exists", esists);
if (esists) {
result.put("item", op.get());
}
return ResponseEntity.ok(result);
}
}

View File

@ -0,0 +1,74 @@
package com.coscoshipping.ebtp.system.attachment.controller;
import cn.hutool.core.util.IdUtil;
import com.coscoshipping.ebtp.system.attachment.entity.vo.SnowFlakerVO;
import io.swagger.v3.oas.annotations.Operation;
import org.apache.commons.lang3.RandomUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.SystemUtils;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestController;
import java.net.Inet4Address;
import java.net.UnknownHostException;
/**
* 业务id接口
*
* @author Ajaxfan
*/
@RestController
@RequestMapping("/v1/business")
public class AttachmentSnowflakerController {
private final static long WORKER_ID;
private final static long DATACENTER_ID;
static {
WORKER_ID = getWorkId();
DATACENTER_ID = getDataCenterId();
}
/**
* 派发新的业务Id
* pbr
*
* @param
* @return com.chinaunicom.mall.ebtp.attachment.entity.vo.SnowFlakerVO
* @author liuh
*/
@Operation(summary = "派发新的业务Id")
@GetMapping("/id")
@ResponseStatus(code = HttpStatus.OK)
public SnowFlakerVO snowFlakerId() {
return new SnowFlakerVO().setId(IdUtil.getSnowflake(WORKER_ID, DATACENTER_ID).nextIdStr());
}
private static Long getWorkId() {
try {
String hostAddress = Inet4Address.getLocalHost().getHostAddress();
int[] ints = StringUtils.toCodePoints(hostAddress);
int sums = 0;
for (int b : ints) {
sums += b;
}
return (long) (sums % 32);
} catch (UnknownHostException e) {
// 如果获取失败,则使用随机数备用
return RandomUtils.nextLong(0, 31);
}
}
private static Long getDataCenterId() {
int[] ints = StringUtils.toCodePoints(SystemUtils.getHostName());
int sums = 0;
for (int i : ints) {
sums += i;
}
return (long) (sums % 32);
}
}

View File

@ -0,0 +1,24 @@
package com.coscoshipping.ebtp.system.attachment.entity.dao;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.experimental.Accessors;
@Data
@TableName(value = "biz_oss_object_tbl")
@Accessors(chain = true)
public class OssObjectDao {
/* 对象ID */
@TableId
private String id;
/* 业务Id */
private String bid;
/* 文件名称 */
private String filename;
}

View File

@ -0,0 +1,12 @@
package com.coscoshipping.ebtp.system.attachment.entity.dto;
import lombok.Data;
import java.util.List;
@Data
public class OssFinderDTO {
private List<String> bidList;
}

View File

@ -0,0 +1,19 @@
package com.coscoshipping.ebtp.system.attachment.entity.po;
import lombok.Data;
import lombok.experimental.Accessors;
@Data
@Accessors(chain = true)
public class AttachmentPO {
/* 附件ID */
private String id;
/* 业务ID */
private String bid;
/* 附件名称 */
private String filename;
}

View File

@ -0,0 +1,32 @@
package com.coscoshipping.ebtp.system.attachment.entity.vo;
import lombok.Data;
import lombok.experimental.Accessors;
import java.util.Optional;
@Data
@Accessors(chain = true)
public class FeedbackMessageVO {
private Boolean success;
private String oid;
private String message;
public FeedbackMessageVO(String oid) {
this.success = Optional.ofNullable(oid).isPresent();
if (!this.success) {
this.message = "文档中心异常或无效的文件类型";
}
this.oid = oid;
}
public FeedbackMessageVO(Boolean success) {
if (!this.success) {
this.message = "文档中心异常或无效的文件类型";
}
this.success = success;
}
}

View File

@ -0,0 +1,12 @@
package com.coscoshipping.ebtp.system.attachment.entity.vo;
import lombok.Data;
import lombok.experimental.Accessors;
@Data
@Accessors(chain = true)
public class SnowFlakerVO {
private String id;
}

View File

@ -0,0 +1,27 @@
package com.coscoshipping.ebtp.system.attachment.entity.vo;
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Data;
import org.springframework.web.multipart.MultipartFile;
import javax.validation.constraints.NotNull;
@Data
public class UploadVO {
@NotNull(message = "业务id不嫩为空")
private String businessId;
/**
* 文件流
*/
@JsonIgnore
@NotNull(message = "附件不能为空")
private MultipartFile file;
/**
* bid下是否唯一
*/
private boolean only;
}

View File

@ -0,0 +1,13 @@
package com.coscoshipping.ebtp.system.attachment.handler;
import com.coscoshipping.ebtp.system.attachment.entity.dao.OssObjectDao;
import java.util.Optional;
@FunctionalInterface
public interface OssStorageHandler<T> {
Optional<OssObjectDao> save(T t);
}

View File

@ -0,0 +1,63 @@
package com.coscoshipping.ebtp.system.attachment.handler.impl;
import com.chinaunicom.ebtp.mall.cloud.attachment.sdk.api.AttachmentClient;
import com.chinaunicom.ebtp.mall.cloud.attachment.sdk.model.UploadObject;
import com.coscoshipping.ebtp.system.attachment.entity.dao.OssObjectDao;
import com.coscoshipping.ebtp.system.attachment.entity.vo.UploadVO;
import com.coscoshipping.ebtp.system.attachment.handler.OssStorageHandler;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.Assert;
import org.springframework.web.multipart.MultipartFile;
import java.util.Optional;
/**
* 文件对象存储到OSS
*
* @author Ajaxfan
*/
@Slf4j
@Component
public class OssStorageHandlerImpl implements OssStorageHandler<UploadVO> {
/* 附件工具 */
private @Autowired
AttachmentClient attachmentClient;
@Override
public Optional<OssObjectDao> save(UploadVO vo) {
return Optional.of(vo).map(this::pushObjectToOss);
}
/**
* 对象推入到 OSS
*
* @param vo
* @return
*/
private OssObjectDao pushObjectToOss(UploadVO vo) {
try {
MultipartFile multipartFile = vo.getFile();
Assert.notNull(multipartFile, "无效的附件");
String businessId = vo.getBusinessId();
Assert.notNull(businessId, "业务id不能为空");
String filename = multipartFile.getOriginalFilename();
// 资源上传, 需要提供业务ID和待上传文件对象
Optional<UploadObject> op = attachmentClient.upload(businessId, filename, multipartFile.getBytes(), vo.isOnly());
// 检验结果的有效性
if (op.isPresent()) {
return new OssObjectDao().setId(op.get().getId()).setFilename(filename).setBid(businessId);
}
} catch (Exception e) {
log.error(e.getMessage());
}
return null;
}
}

View File

@ -59,17 +59,14 @@ public class DictProjectController{
/**
* 查询字典数据
* @param parentCode 字典父类code
* @param toParentCode 字典父类对应的父类code
* 查询字典数据支持通过dictProject对象的code和parentType属性查询详情或列表
* @param dictProject 查询条件
* @return 返回结果
*/
@ApiOperation("查询数据集合")
@ApiOperation("查询数据集合(支持详情查询)")
@GetMapping("/getDictList")
public BaseResponse<List<DictProject>> getDictList(@ApiParam(value = "字典父类code", required = true)String parentCode,
@ApiParam(value = "字典父类对应的父类code", required = true)String toParentCode){
return BaseResponse.success(dictProjectService.getDictList(parentCode,toParentCode));
public BaseResponse<List<DictProject>> getDictList(DictProject dictProject) {
return BaseResponse.success(dictProjectService.selectDictList(dictProject));
}
/**

View File

@ -13,6 +13,7 @@
<result column="default_flag" jdbcType="VARCHAR" property="defaultFlag"/>
<result column="order_flag" jdbcType="INTEGER" property="orderFlag"/>
<result column="description" jdbcType="VARCHAR" property="description"/>
<result column="en_name" jdbcType="VARCHAR" property="enName"/>
</resultMap>
<select id="selectMaxId">
select max(id) from dict_project

View File

@ -83,6 +83,12 @@ public class DictProject implements Serializable {
@ApiModelProperty(value = "描述")
private String description;
/**
* 英文名称
*/
@ApiModelProperty(value = "英文名称")
private String enName;
/**
* 字典子项
*/

View File

@ -51,4 +51,16 @@ public class DictRegion implements Serializable {
@ApiModelProperty(value = "缩写")
private String ab;
/**
* ID路径逗号分隔
*/
@ApiModelProperty(value = "ID路径逗号分隔")
private String path;
/**
* 名称路径,逗号分隔
*/
@ApiModelProperty(value = "名称路径,逗号分隔")
private String pathName;
}

View File

@ -30,7 +30,7 @@ public interface IDictProjectService extends IBaseService<DictProject>{
List<DictProject> getDictList(String parentCode, String toParentCode);
/**
* 查询所有字典
* 查询所有字典支持传code和parentType时返回详情否则返回列表
* @param dictProject
* @return
*/

View File

@ -1,9 +1,10 @@
package com.coscoshipping.ebtp.system.dict.service.impl;
import cn.hutool.core.collection.ListUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.chinaunicom.mall.ebtp.common.base.service.impl.BaseServiceImpl;
import com.coscoshipping.ebtp.system.dict.dao.DictProjectMapper;
import com.coscoshipping.ebtp.system.dict.entity.DictProject;
import com.coscoshipping.ebtp.system.dict.service.IDictProjectService;
@ -74,7 +75,14 @@ public class DictProjectServiceImpl extends BaseServiceImpl<DictProjectMapper, D
*/
@Override
public List<DictProject> selectDictList(DictProject dictProject) {
return this.list(mapper.getCustomQueryWrapper(dictProject).orderByAsc(DictProject::getOrderFlag));
if (dictProject != null && dictProject.getCode() != null && dictProject.getParentType() != null) {
return this.list(Wrappers.<DictProject>lambdaQuery()
.eq(DictProject::getCode, dictProject.getCode())
.eq(DictProject::getParentType, dictProject.getParentType())
.last("limit 1"));
}
return ListUtil.empty();
}
@Override

View File

@ -13,9 +13,11 @@ import org.springframework.web.bind.annotation.RestController;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import javax.annotation.Resource;
import javax.validation.Valid;
import java.util.List;
import com.coscoshipping.ebtp.system.user.entity.SysUser;
import com.coscoshipping.ebtp.system.user.service.SysUserService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@ -24,114 +26,112 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@RestController
@Api(value = "门户用户表")
@RequestMapping("/v1/sysuser")
public class SysUserController{
public class SysUserController {
@Resource
private SysUserService iSysUserService;
@Resource
private SysUserService iSysUserService;
/**
* 插入新数据
*
* @param sysUser
*
* @return
*/
@ApiOperation("插入新数据")
@PostMapping("/insert")
public BaseResponse<Boolean> insert(@ApiParam(value = "对象数据", required = true) @RequestBody @Valid SysUserVO sysUser){
/**
* 插入新数据
*
* @param sysUser
* @return
*/
@ApiOperation("插入新数据")
@PostMapping("/insert")
public BaseResponse<Boolean> insert(@ApiParam(value = "对象数据", required = true) @RequestBody @Valid SysUserVO sysUser) {
Boolean i = iSysUserService.insertByVo(sysUser);
Boolean i = iSysUserService.insertByVo(sysUser);
return BaseResponse.success(i);
}
return BaseResponse.success(i);
}
/**
* 修改数据
*
* @param sysUser
*
* @return
*/
@ApiOperation("修改数据")
@PostMapping("/update")
public BaseResponse<Boolean> update(@ApiParam(value = "对象数据", required = true) @RequestBody SysUser sysUser){
/**
* 修改数据
*
* @param sysUser
* @return
*/
@ApiOperation("修改数据")
@PostMapping("/update")
public BaseResponse<Boolean> update(@ApiParam(value = "对象数据", required = true) @RequestBody SysUser sysUser) {
Boolean i = iSysUserService.updateById(sysUser);
Boolean i = iSysUserService.updateById(sysUser);
return BaseResponse.success(i);
}
return BaseResponse.success(i);
}
/**
* 查询数据
*
* @param id
*
* @return
*/
@ApiOperation("根据id查询数据")
@GetMapping("/{id}")
public BaseResponse<SysUser> get(@ApiParam(value = "主键id", required = true) @PathVariable String id){
/**
* 查询数据
*
* @param id
* @return
*/
@ApiOperation("根据id查询数据")
@GetMapping("/{id}")
public BaseResponse<SysUser> get(@ApiParam(value = "主键id", required = true) @PathVariable String id) {
SysUser sysUser = iSysUserService.getById(id);
SysUser sysUser = iSysUserService.getById(id);
return BaseResponse.success(sysUser);
}
return BaseResponse.success(sysUser);
}
/**
* 删除数据
* @param id 主键id
* @return BaseResponse<Boolean>
* @author dino
* @date 2020/10/21 14:56
*/
@ApiOperation(value = "delete",notes = "删除数据")
@GetMapping("/del/{id}")
public BaseResponse<Boolean> delete(@ApiParam(value = "主键id", required = true) @PathVariable Long id) {
Boolean i = iSysUserService.removeById(id);
return BaseResponse.success(i);
}
/**
* 删除数据
*
* @param id 主键id
* @return BaseResponse<Boolean>
* @author dino
* @date 2020/10/21 14:56
*/
@ApiOperation(value = "delete", notes = "删除数据")
@GetMapping("/del/{id}")
public BaseResponse<Boolean> delete(@ApiParam(value = "主键id", required = true) @PathVariable Long id) {
Boolean i = iSysUserService.removeById(id);
return BaseResponse.success(i);
}
/**
* 查询数据
*
* @param param
* @return
*/
@ApiOperation("查询列表数据")
@GetMapping("/list")
public BaseResponse<List<SysUser>> list(@ApiParam(value = "查询对象数据", required = false) SysUser param) {
//查询
LambdaQueryWrapper<SysUser> query = Wrappers.lambdaQuery(param);
List<SysUser> list = iSysUserService.list(query);
//异常处理
//RespsExceptionEnum.FRAME_EXCEPTION_DEMO_NOT_FIND.customValid(list.isEmpty());
return BaseResponse.success(list);
}
/**
* 查询数据
*
* @param param
* @return
*/
@ApiOperation("查询列表数据")
@GetMapping("/list")
public BaseResponse<List<SysUser>> list(@ApiParam(value = "查询对象数据", required = false) SysUser param) {
//查询
LambdaQueryWrapper<SysUser> query = Wrappers.lambdaQuery(param);
List<SysUser> list = iSysUserService.list(query);
//异常处理
//RespsExceptionEnum.FRAME_EXCEPTION_DEMO_NOT_FIND.customValid(list.isEmpty());
return BaseResponse.success(list);
}
/**
* 查询分页数据
*
* @param sysUserVO 分页信息
*
* @return 返回结果
*/
@ApiOperation("查询分页数据")
@PostMapping("/getPage")
public BaseResponse<IPage<SysUser>> getPage(@ApiParam(value = "对象数据", required = true) @RequestBody SysUserVO sysUserVO){
/**
* 查询分页数据
*
* @param sysUserVO 分页信息
* @return 返回结果
*/
@ApiOperation("查询分页数据")
@PostMapping("/getPage")
public BaseResponse<IPage<SysUser>> getPage(@ApiParam(value = "对象数据", required = true) @RequestBody SysUserVO sysUserVO) {
return BaseResponse.success(iSysUserService.getPage(sysUserVO));
}
return BaseResponse.success(iSysUserService.getPage(sysUserVO));
}
@ApiOperation("查询内部用户数据")
@PostMapping("/innerUserInfo")
public BaseResponse<SysInnerUserInfo> getInnerUserInfo(@RequestParam String employeeNumber){
@ApiOperation("查询内部用户数据")
@PostMapping("/innerUserInfo")
public BaseResponse<SysInnerUserInfo> getInnerUserInfo(@RequestParam String employeeNumber) {
return BaseResponse.success(iSysUserService.getInnerUserInfo(employeeNumber));
return BaseResponse.success(iSysUserService.getInnerUserInfo(employeeNumber));
}
}
/**
* 根据用户ID集合查询所有用户信息
*
* @param ids 用户ID集合
* @return 用户信息列表
*/
@ -141,4 +141,16 @@ public class SysUserController{
List<SysUser> users = iSysUserService.getUsersByIds(ids);
return BaseResponse.success(users);
}
/**
* 根据用户ID查询本单位下所有用户分页数据
*
* @param sysUserVO 分页及查询条件
* @return 分页用户数据
*/
@ApiOperation("根据用户ID查询本单位下所有用户分页数据")
@PostMapping("/getPageByUserCompany")
public BaseResponse<IPage<SysUser>> getPageByUserCompany(@ApiParam(value = "分页及查询条件", required = true) @RequestBody SysUserVO sysUserVO) {
return BaseResponse.success(iSysUserService.getPageByUserCompany(sysUserVO));
}
}

View File

@ -11,13 +11,14 @@ import java.util.List;
/**
* 对数据表 sys_user 操作的 service
* @author yss
*
* @author yss
*/
public interface SysUserService extends IBaseService<SysUser>{
public interface SysUserService extends IBaseService<SysUser> {
/**
* 角色分页
*
* @param sysUserVO 标段信息
* @return 返回结果
*/
@ -28,6 +29,7 @@ public interface SysUserService extends IBaseService<SysUser>{
Boolean updateByVo(SysUserVO vo);
/**
* 通过角色ID删除角色
*
@ -40,8 +42,17 @@ public interface SysUserService extends IBaseService<SysUser>{
/**
* 根据用户ID集合查询所有用户信息
*
* @param ids 用户ID集合
* @return 用户信息列表
*/
List<SysUser> getUsersByIds(List<String> ids);
/**
* 根据用户ID查询本单位下所有用户分页数据
*
* @param sysUserVO 分页及查询条件
* @return 分页用户数据
*/
IPage<SysUser> getPageByUserCompany(SysUserVO sysUserVO);
}

View File

@ -25,6 +25,7 @@ import com.coscoshipping.ebtp.system.user.service.SysUserService;
import java.time.LocalDateTime;
import java.util.List;
import java.util.stream.Collectors;
/**
* 对数据表 sys_user 操作的 serviceImpl
@ -88,6 +89,39 @@ public class SysUserServiceImpl extends BaseServiceImpl<SysUserMapper, SysUser>
return userList;
}
@Override
public IPage<SysUser> getPageByUserCompany( SysUserVO sysUserVO) {
String userId = sysUserVO.getUserId();
// 1. 通过userId查找用户
SysUser user = this.getById(userId);
if (user == null) {
return new Page<>();
}
// 2. 查找用户所在公司
SysOrg company = sysOrgService.getCompanyByOrgId(user.getOrgId());
if (company == null || company.getOrgId() == null) {
return new Page<>();
}
// 3. 查找所有下级部门(含自身)
SysOrg queryOrg = new SysOrg();
queryOrg.setOrgId(company.getOrgId());
List<SysOrg> orgList = sysOrgService.queryOrgWithChildren(queryOrg);
if (orgList == null || orgList.isEmpty()) {
return new Page<>();
}
List<String> orgIds = orgList.stream().map(SysOrg::getOrgId).collect(Collectors.toList());
// 4. 分页查所有这些orgId下的用户
LambdaQueryWrapper<SysUser> userQuery = buildQueryWrapper(sysUserVO);
userQuery.in(SysUser::getOrgId, orgIds);
if (null == sysUserVO.getBasePageRequest()) {
sysUserVO.setBasePageRequest(new BasePageRequest());
}
IPage<SysUser> result = new Page<>(sysUserVO.getBasePageRequest().getPageNo(), sysUserVO.getBasePageRequest().getPageSize());
result = this.page(result, userQuery);
result.getRecords().forEach(u -> u.setPassword(null));
return result;
}
/**
* 保存前的数据校验
*/