parent
b1b4d0018b
commit
9496586193
@ -1,144 +0,0 @@
|
||||
package cn.iocoder.yudao.module.camera.controller.admin.cameraio;
|
||||
|
||||
import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
|
||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageParam;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
||||
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
|
||||
import cn.iocoder.yudao.module.camera.controller.admin.cameraio.vo.CameraIoPageReqVO;
|
||||
import cn.iocoder.yudao.module.camera.controller.admin.cameraio.vo.CameraIoRespVO;
|
||||
import cn.iocoder.yudao.module.camera.controller.admin.cameraio.vo.CameraIoSaveReqVO;
|
||||
import cn.iocoder.yudao.module.camera.dal.dataobject.camera.CameraDO;
|
||||
import cn.iocoder.yudao.module.camera.dal.dataobject.cameraio.CameraIoDO;
|
||||
import cn.iocoder.yudao.module.camera.lib.camera.CameraModFactory;
|
||||
import cn.iocoder.yudao.module.camera.service.camera.CameraService;
|
||||
import cn.iocoder.yudao.module.camera.service.cameraio.CameraIoService;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.Parameter;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import jakarta.annotation.Resource;
|
||||
import jakarta.servlet.http.HttpServletResponse;
|
||||
import jakarta.validation.Valid;
|
||||
import org.springframework.security.access.prepost.PreAuthorize;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.List;
|
||||
|
||||
import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
|
||||
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
||||
|
||||
@Tag(name = "管理后台 - 相机预置点位")
|
||||
@RestController
|
||||
@RequestMapping("/admin-api/camera/camera-io")
|
||||
@Validated
|
||||
public class CameraIoController {
|
||||
|
||||
@Resource
|
||||
private CameraIoService cameraIoService;
|
||||
|
||||
@Resource
|
||||
private CameraModFactory cameraModFactory;
|
||||
|
||||
|
||||
@Resource
|
||||
private CameraService cameraService;
|
||||
|
||||
@PostMapping("/create")
|
||||
@Operation(summary = "创建相机预置点位")
|
||||
@PreAuthorize("@ss.hasPermission('camera:camera-io:create')")
|
||||
public CommonResult<Integer> createCameraIo(@Valid @RequestBody CameraIoSaveReqVO createReqVO) {
|
||||
List<CameraIoDO> list = cameraIoService.list(new QueryWrapper<CameraIoDO>()
|
||||
.eq("camera_id", createReqVO.getCameraId()));
|
||||
Integer ptzId = list.stream().map(CameraIoDO::getPtzId).max(Integer::compareTo).orElse(0)+1;
|
||||
createReqVO.setPtzId(ptzId);
|
||||
int i= cameraIoService.createCameraIo(createReqVO);
|
||||
CameraDO cameraIoDO = cameraService.getById(createReqVO.getCameraId());
|
||||
cameraModFactory.get(cameraIoDO.getType()).ptz(createReqVO.getPtzId(),createReqVO.getName(),createReqVO.getCameraId());
|
||||
|
||||
return success(i);
|
||||
}
|
||||
|
||||
@PostMapping("/callPtz")
|
||||
@Operation(summary = "调用预置点位")
|
||||
@PreAuthorize("@ss.hasPermission('camera:camera-io:callPtz')")
|
||||
public CommonResult<Integer> callPtz(@Valid @RequestBody CameraIoSaveReqVO createReqVO) {
|
||||
|
||||
CameraDO cameraIoDO = cameraService.getById(createReqVO.getCameraId());
|
||||
cameraModFactory.get(cameraIoDO.getType()).toPtz(createReqVO.getPtzId(),createReqVO.getCameraId());
|
||||
return success(cameraIoService.createCameraIo(createReqVO));
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建或覆盖相机预置点位 必须穿ptzId
|
||||
* @param createReqVO
|
||||
* @return
|
||||
*/
|
||||
@PostMapping("/overwritePtz")
|
||||
@Operation(summary = "创建或覆盖相机预置点位")
|
||||
@PreAuthorize("@ss.hasPermission('camera:camera-io:overwritePtz')")
|
||||
public CommonResult<Integer> overwritePtz(@Valid @RequestBody CameraIoSaveReqVO createReqVO) {
|
||||
CameraDO cameraIoDO = cameraService.getById(createReqVO.getCameraId());
|
||||
cameraModFactory.get(cameraIoDO.getType()).ptz(createReqVO.getPtzId(),createReqVO.getName(),createReqVO.getCameraId());
|
||||
return success(cameraIoService.createCameraIo(createReqVO));
|
||||
}
|
||||
|
||||
@GetMapping("/list")
|
||||
@Operation(summary = "获得相机预置点位分页")
|
||||
@PreAuthorize("@ss.hasPermission('camera:camera-io:query')")
|
||||
public CommonResult<List<CameraIoRespVO>> list(@Valid CameraIoPageReqVO pageReqVO) {
|
||||
List<CameraIoDO> pageResult = cameraIoService.list(new QueryWrapper<CameraIoDO>().eq("camera_id", pageReqVO.getCameraId()).orderByAsc("id"));
|
||||
return success(BeanUtils.toBean(pageResult, CameraIoRespVO.class));
|
||||
}
|
||||
|
||||
@DeleteMapping("/delete")
|
||||
@Operation(summary = "删除相机预置点位")
|
||||
@Parameter(name = "id", description = "编号", required = true)
|
||||
@PreAuthorize("@ss.hasPermission('camera:camera-io:delete')")
|
||||
public CommonResult<Boolean> deleteCameraIo(@RequestParam("id") Integer id) {
|
||||
cameraIoService.deleteCameraIo(id);
|
||||
return success(true);
|
||||
}
|
||||
@PutMapping("/update")
|
||||
@Operation(summary = "更新相机预置点位")
|
||||
@PreAuthorize("@ss.hasPermission('camera:camera-io:update')")
|
||||
public CommonResult<Boolean> updateCameraIo(@Valid @RequestBody CameraIoSaveReqVO updateReqVO) {
|
||||
cameraIoService.updateCameraIo(updateReqVO);
|
||||
return success(true);
|
||||
}
|
||||
|
||||
|
||||
@GetMapping("/get")
|
||||
@Operation(summary = "获得相机预置点位")
|
||||
@Parameter(name = "id", description = "编号", required = true, example = "1024")
|
||||
@PreAuthorize("@ss.hasPermission('camera:camera-io:query')")
|
||||
public CommonResult<CameraIoRespVO> getCameraIo(@RequestParam("id") Integer id) {
|
||||
CameraIoDO cameraIo = cameraIoService.getCameraIo(id);
|
||||
return success(BeanUtils.toBean(cameraIo, CameraIoRespVO.class));
|
||||
}
|
||||
|
||||
@GetMapping("/page")
|
||||
@Operation(summary = "获得相机预置点位分页")
|
||||
@PreAuthorize("@ss.hasPermission('camera:camera-io:query')")
|
||||
public CommonResult<PageResult<CameraIoRespVO>> getCameraIoPage(@Valid CameraIoPageReqVO pageReqVO) {
|
||||
PageResult<CameraIoDO> pageResult = cameraIoService.getCameraIoPage(pageReqVO);
|
||||
return success(BeanUtils.toBean(pageResult, CameraIoRespVO.class));
|
||||
}
|
||||
|
||||
@GetMapping("/export-excel")
|
||||
@Operation(summary = "导出相机预置点位 Excel")
|
||||
@PreAuthorize("@ss.hasPermission('camera:camera-io:export')")
|
||||
@ApiAccessLog(operateType = EXPORT)
|
||||
public void exportCameraIoExcel(@Valid CameraIoPageReqVO pageReqVO,
|
||||
HttpServletResponse response) throws IOException {
|
||||
pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
|
||||
List<CameraIoDO> list = cameraIoService.getCameraIoPage(pageReqVO).getList();
|
||||
// 导出 Excel
|
||||
ExcelUtils.write(response, "相机预置点位.xls", "数据", CameraIoRespVO.class,
|
||||
BeanUtils.toBean(list, CameraIoRespVO.class));
|
||||
}
|
||||
|
||||
}
|
||||
@ -1,18 +0,0 @@
|
||||
package cn.iocoder.yudao.module.camera.service.camera;
|
||||
|
||||
import cn.iocoder.yudao.module.camera.framework.netty.NettyClient;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.springframework.context.annotation.Import;
|
||||
|
||||
/**
|
||||
* {@link CameraServiceImpl} 的单元测试类
|
||||
*
|
||||
* @author 芋道源码
|
||||
*/
|
||||
@Import(NettyClient.class)
|
||||
public class CameraServiceImplTest{
|
||||
@Test
|
||||
public void testCreateCamera_success() {
|
||||
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,70 @@
|
||||
package cn.iocoder.yudao.module.camera.controller.admin.Hik3D;
|
||||
|
||||
import cn.iocoder.yudao.module.camera.dal.entity.HikPythonEntity;
|
||||
import cn.iocoder.yudao.module.camera.service.Hik3D.HikFlaskApiService;
|
||||
import cn.iocoder.yudao.module.camera.service.checklog.CheckLogService;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import jakarta.annotation.Resource;
|
||||
import jakarta.annotation.security.PermitAll;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
@Tag(name = "管理后台 - hik3D识别")
|
||||
@RestController
|
||||
@RequestMapping("/logistics/Hik3DController")
|
||||
@Validated
|
||||
public class Hik3DController {
|
||||
@Resource
|
||||
HikFlaskApiService hikFlaskApiService;
|
||||
|
||||
@Resource
|
||||
private CheckLogService checkLogService;
|
||||
|
||||
@PostMapping("/updateConfig")
|
||||
@Operation(summary = "updateConfig")
|
||||
@ResponseBody
|
||||
@PermitAll
|
||||
public HikPythonEntity updateConfig(){
|
||||
String baseUrl = "http://127.0.0.1:5000";
|
||||
try {
|
||||
return hikFlaskApiService.updateConfig(baseUrl);
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@PostMapping("/addTemplate")
|
||||
@Operation(summary = "updateConfig")
|
||||
@ResponseBody
|
||||
@PermitAll
|
||||
public HikPythonEntity addTemplate(@RequestBody HikPythonEntity hikPythonEntity){
|
||||
String baseUrl = "http://127.0.0.1:5000";
|
||||
try {
|
||||
return hikFlaskApiService.addTemplate(hikPythonEntity.getType(), hikPythonEntity,baseUrl);
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
@PostMapping("/picComputeAll")
|
||||
@Operation(summary = "picComputeAll")
|
||||
@ResponseBody
|
||||
@PermitAll
|
||||
public HikPythonEntity picComputeAll(@RequestBody HikPythonEntity hikPythonEntity){
|
||||
String baseUrl = "http://127.0.0.1:5000";
|
||||
try {
|
||||
return hikFlaskApiService.picComputeAll(hikPythonEntity.getType(),baseUrl);
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
@ -0,0 +1,22 @@
|
||||
package cn.iocoder.yudao.module.camera.dal.entity;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@Data
|
||||
public class HikPythonEntity {
|
||||
private String type;
|
||||
private String sn;
|
||||
private Integer direction;
|
||||
private String width;
|
||||
private String length;
|
||||
private Integer height;
|
||||
private Integer min_area;
|
||||
private Boolean lack;
|
||||
// 是否有缺
|
||||
private Integer tolerance;
|
||||
private String status;
|
||||
private List<String> colors;
|
||||
|
||||
}
|
||||
@ -0,0 +1,81 @@
|
||||
package cn.iocoder.yudao.module.camera.service.sensorgun;
|
||||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.io.*;
|
||||
import java.net.InetSocketAddress;
|
||||
import java.net.Socket;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
|
||||
@Slf4j
|
||||
public class CognexSocket {
|
||||
|
||||
private static final Logger tcpLogger = LoggerFactory.getLogger("sick");
|
||||
public static String readOCR(String ip,int port){
|
||||
Socket socket = new Socket();
|
||||
String code = "NOREAD";
|
||||
OutputStream os = null;
|
||||
InputStream is = null;
|
||||
try {
|
||||
socket.connect(new InetSocketAddress(ip,port),3000);
|
||||
os = socket.getOutputStream();
|
||||
is = socket.getInputStream();
|
||||
int i = 0;
|
||||
while ("NOREAD".equals(code) && i <= 4){
|
||||
writeCmd(os);
|
||||
code = read(is);
|
||||
tcpLogger.info("count:{},ip:{},code:{}",i,ip,code);
|
||||
if(code!= null){
|
||||
code = code.replace("\\n","");
|
||||
}
|
||||
i++;
|
||||
}
|
||||
} catch (IOException e) {
|
||||
tcpLogger.error("sick time out,ip:{},info:{}",ip,e);
|
||||
log.error("sick time out,ip:{},info:{}",ip,e);
|
||||
}finally {
|
||||
if(os != null){
|
||||
try {
|
||||
os.close();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
if(is != null){
|
||||
try {
|
||||
is.close();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
try {
|
||||
socket.close();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
return code;
|
||||
}
|
||||
}
|
||||
|
||||
private static void writeCmd(OutputStream os) throws IOException {
|
||||
String startCmd = "+";
|
||||
byte[]bytes = startCmd.getBytes(StandardCharsets.UTF_8);
|
||||
os.write(bytes);
|
||||
try {
|
||||
Thread.sleep(300);
|
||||
} catch (InterruptedException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
startCmd = "-";
|
||||
bytes = startCmd.getBytes(StandardCharsets.UTF_8);
|
||||
os.write(bytes);
|
||||
}
|
||||
|
||||
private static String read(InputStream inStream) throws IOException {
|
||||
BufferedReader bd = new BufferedReader(new InputStreamReader(inStream));
|
||||
return bd.readLine();
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,83 @@
|
||||
package cn.iocoder.yudao.module.camera.service.sensorgun;
|
||||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.io.*;
|
||||
import java.net.InetSocketAddress;
|
||||
import java.net.Socket;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
|
||||
/**
|
||||
* sick扫码枪
|
||||
*/
|
||||
@Slf4j
|
||||
public class SickSocket {
|
||||
|
||||
private static final Logger tcpLogger = LoggerFactory.getLogger("sick");
|
||||
public static void main(String[] args) {
|
||||
String code = readOCR("192.168.8.236", 2002);
|
||||
System.out.println(code);
|
||||
}
|
||||
|
||||
public static String readOCR(String ip,int port){
|
||||
Socket socket = new Socket();
|
||||
String code = "NoRead";
|
||||
OutputStream os = null;
|
||||
InputStream is = null;
|
||||
try {
|
||||
socket.connect(new InetSocketAddress(ip,port),3000);
|
||||
socket.setSoTimeout(3000);
|
||||
os = socket.getOutputStream();
|
||||
is = socket.getInputStream();
|
||||
int i = 0;
|
||||
while ("NoRead".equals(code) && i <= 4){
|
||||
writeCmd(os);
|
||||
code = read(is);
|
||||
tcpLogger.info("count:{},ip:{},code:{}",i,ip,code);
|
||||
if(code!= null){
|
||||
code = code.replace("\\n","");
|
||||
}
|
||||
i++;
|
||||
}
|
||||
} catch (IOException e) {
|
||||
tcpLogger.error("sick time out,ip:{},info:{}",ip,e);
|
||||
log.error("sick time out,ip:{},info:{}",ip,e);
|
||||
}finally {
|
||||
if(os != null){
|
||||
try {
|
||||
os.close();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
if(is != null){
|
||||
try {
|
||||
is.close();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
try {
|
||||
socket.close();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
return code;
|
||||
}
|
||||
}
|
||||
|
||||
private static void writeCmd(OutputStream os) throws IOException {
|
||||
String startCmd = "start";
|
||||
byte[]bytes = startCmd.getBytes(StandardCharsets.UTF_8);
|
||||
os.write(bytes);
|
||||
}
|
||||
|
||||
private static String read(InputStream inStream) throws IOException {
|
||||
BufferedReader bd = new BufferedReader(new InputStreamReader(inStream));
|
||||
return bd.readLine();
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,13 @@
|
||||
package cn.iocoder.yudao.module.camera.service.streamingMedia;
|
||||
|
||||
import cn.iocoder.yudao.module.camera.dal.dataobject.camera.CameraDO;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public interface ZLMediaKitService {
|
||||
String startRecord(String app, String stream);
|
||||
void stopRecord(String app, String stream);
|
||||
void addRtspProxy(CameraDO camera, String zlmApiUrl, String zlmApiSecret);
|
||||
void zlmConf( List<CameraDO> list);
|
||||
void deleteRecordDirectory(String app, String stream, String period);
|
||||
}
|
||||
@ -1,352 +0,0 @@
|
||||
package cn.iocoder.yudao.module.system.service.dict;
|
||||
|
||||
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils;
|
||||
import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
|
||||
import cn.iocoder.yudao.module.system.controller.admin.dict.vo.data.DictDataPageReqVO;
|
||||
import cn.iocoder.yudao.module.system.controller.admin.dict.vo.data.DictDataSaveReqVO;
|
||||
import cn.iocoder.yudao.module.system.dal.dataobject.dict.DictDataDO;
|
||||
import cn.iocoder.yudao.module.system.dal.dataobject.dict.DictTypeDO;
|
||||
import cn.iocoder.yudao.module.system.dal.mysql.dict.DictDataMapper;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.springframework.boot.test.mock.mockito.MockBean;
|
||||
import org.springframework.context.annotation.Import;
|
||||
|
||||
import jakarta.annotation.Resource;
|
||||
import java.util.List;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.cloneIgnoreId;
|
||||
import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals;
|
||||
import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException;
|
||||
import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*;
|
||||
import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*;
|
||||
import static java.util.Collections.singletonList;
|
||||
import static org.junit.jupiter.api.Assertions.*;
|
||||
import static org.mockito.ArgumentMatchers.eq;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
@Import(DictDataServiceImpl.class)
|
||||
public class DictDataServiceImplTest extends BaseDbUnitTest {
|
||||
|
||||
@Resource
|
||||
private DictDataServiceImpl dictDataService;
|
||||
|
||||
@Resource
|
||||
private DictDataMapper dictDataMapper;
|
||||
@MockBean
|
||||
private DictTypeService dictTypeService;
|
||||
|
||||
@Test
|
||||
public void testGetDictDataList() {
|
||||
// mock 数据
|
||||
DictDataDO dictDataDO01 = randomDictDataDO().setDictType("yunai").setSort(2)
|
||||
.setStatus(CommonStatusEnum.ENABLE.getStatus());
|
||||
dictDataMapper.insert(dictDataDO01);
|
||||
DictDataDO dictDataDO02 = randomDictDataDO().setDictType("yunai").setSort(1)
|
||||
.setStatus(CommonStatusEnum.ENABLE.getStatus());
|
||||
dictDataMapper.insert(dictDataDO02);
|
||||
DictDataDO dictDataDO03 = randomDictDataDO().setDictType("yunai").setSort(3)
|
||||
.setStatus(CommonStatusEnum.DISABLE.getStatus());
|
||||
dictDataMapper.insert(dictDataDO03);
|
||||
DictDataDO dictDataDO04 = randomDictDataDO().setDictType("yunai2").setSort(3)
|
||||
.setStatus(CommonStatusEnum.DISABLE.getStatus());
|
||||
dictDataMapper.insert(dictDataDO04);
|
||||
// 准备参数
|
||||
Integer status = CommonStatusEnum.ENABLE.getStatus();
|
||||
String dictType = "yunai";
|
||||
|
||||
// 调用
|
||||
List<DictDataDO> dictDataDOList = dictDataService.getDictDataList(status, dictType);
|
||||
// 断言
|
||||
assertEquals(2, dictDataDOList.size());
|
||||
assertPojoEquals(dictDataDO02, dictDataDOList.get(0));
|
||||
assertPojoEquals(dictDataDO01, dictDataDOList.get(1));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetDictDataPage() {
|
||||
// mock 数据
|
||||
DictDataDO dbDictData = randomPojo(DictDataDO.class, o -> { // 等会查询到
|
||||
o.setLabel("芋艿");
|
||||
o.setDictType("yunai");
|
||||
o.setStatus(CommonStatusEnum.ENABLE.getStatus());
|
||||
});
|
||||
dictDataMapper.insert(dbDictData);
|
||||
// 测试 label 不匹配
|
||||
dictDataMapper.insert(cloneIgnoreId(dbDictData, o -> o.setLabel("艿")));
|
||||
// 测试 dictType 不匹配
|
||||
dictDataMapper.insert(cloneIgnoreId(dbDictData, o -> o.setDictType("nai")));
|
||||
// 测试 status 不匹配
|
||||
dictDataMapper.insert(cloneIgnoreId(dbDictData, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus())));
|
||||
// 准备参数
|
||||
DictDataPageReqVO reqVO = new DictDataPageReqVO();
|
||||
reqVO.setLabel("芋");
|
||||
reqVO.setDictType("yunai");
|
||||
reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus());
|
||||
|
||||
// 调用
|
||||
PageResult<DictDataDO> pageResult = dictDataService.getDictDataPage(reqVO);
|
||||
// 断言
|
||||
assertEquals(1, pageResult.getTotal());
|
||||
assertEquals(1, pageResult.getList().size());
|
||||
assertPojoEquals(dbDictData, pageResult.getList().get(0));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetDictData() {
|
||||
// mock 数据
|
||||
DictDataDO dbDictData = randomDictDataDO();
|
||||
dictDataMapper.insert(dbDictData);
|
||||
// 准备参数
|
||||
Long id = dbDictData.getId();
|
||||
|
||||
// 调用
|
||||
DictDataDO dictData = dictDataService.getDictData(id);
|
||||
// 断言
|
||||
assertPojoEquals(dbDictData, dictData);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCreateDictData_success() {
|
||||
// 准备参数
|
||||
DictDataSaveReqVO reqVO = randomPojo(DictDataSaveReqVO.class,
|
||||
o -> o.setStatus(randomCommonStatus()))
|
||||
.setId(null); // 防止 id 被赋值
|
||||
// mock 方法
|
||||
when(dictTypeService.getDictType(eq(reqVO.getDictType()))).thenReturn(randomDictTypeDO(reqVO.getDictType()));
|
||||
|
||||
// 调用
|
||||
Long dictDataId = dictDataService.createDictData(reqVO);
|
||||
// 断言
|
||||
assertNotNull(dictDataId);
|
||||
// 校验记录的属性是否正确
|
||||
DictDataDO dictData = dictDataMapper.selectById(dictDataId);
|
||||
assertPojoEquals(reqVO, dictData, "id");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testUpdateDictData_success() {
|
||||
// mock 数据
|
||||
DictDataDO dbDictData = randomDictDataDO();
|
||||
dictDataMapper.insert(dbDictData);// @Sql: 先插入出一条存在的数据
|
||||
// 准备参数
|
||||
DictDataSaveReqVO reqVO = randomPojo(DictDataSaveReqVO.class, o -> {
|
||||
o.setId(dbDictData.getId()); // 设置更新的 ID
|
||||
o.setStatus(randomCommonStatus());
|
||||
});
|
||||
// mock 方法,字典类型
|
||||
when(dictTypeService.getDictType(eq(reqVO.getDictType()))).thenReturn(randomDictTypeDO(reqVO.getDictType()));
|
||||
|
||||
// 调用
|
||||
dictDataService.updateDictData(reqVO);
|
||||
// 校验是否更新正确
|
||||
DictDataDO dictData = dictDataMapper.selectById(reqVO.getId()); // 获取最新的
|
||||
assertPojoEquals(reqVO, dictData);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDeleteDictData_success() {
|
||||
// mock 数据
|
||||
DictDataDO dbDictData = randomDictDataDO();
|
||||
dictDataMapper.insert(dbDictData);// @Sql: 先插入出一条存在的数据
|
||||
// 准备参数
|
||||
Long id = dbDictData.getId();
|
||||
|
||||
// 调用
|
||||
dictDataService.deleteDictData(id);
|
||||
// 校验数据不存在了
|
||||
assertNull(dictDataMapper.selectById(id));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testValidateDictDataExists_success() {
|
||||
// mock 数据
|
||||
DictDataDO dbDictData = randomDictDataDO();
|
||||
dictDataMapper.insert(dbDictData);// @Sql: 先插入出一条存在的数据
|
||||
|
||||
// 调用成功
|
||||
dictDataService.validateDictDataExists(dbDictData.getId());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testValidateDictDataExists_notExists() {
|
||||
assertServiceException(() -> dictDataService.validateDictDataExists(randomLongId()), DICT_DATA_NOT_EXISTS);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testValidateDictTypeExists_success() {
|
||||
// mock 方法,数据类型被禁用
|
||||
String type = randomString();
|
||||
when(dictTypeService.getDictType(eq(type))).thenReturn(randomDictTypeDO(type));
|
||||
|
||||
// 调用, 成功
|
||||
dictDataService.validateDictTypeExists(type);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testValidateDictTypeExists_notExists() {
|
||||
assertServiceException(() -> dictDataService.validateDictTypeExists(randomString()), DICT_TYPE_NOT_EXISTS);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testValidateDictTypeExists_notEnable() {
|
||||
// mock 方法,数据类型被禁用
|
||||
String dictType = randomString();
|
||||
when(dictTypeService.getDictType(eq(dictType))).thenReturn(
|
||||
randomPojo(DictTypeDO.class, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus())));
|
||||
|
||||
// 调用, 并断言异常
|
||||
assertServiceException(() -> dictDataService.validateDictTypeExists(dictType), DICT_TYPE_NOT_ENABLE);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testValidateDictDataValueUnique_success() {
|
||||
// 调用,成功
|
||||
dictDataService.validateDictDataValueUnique(randomLongId(), randomString(), randomString());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testValidateDictDataValueUnique_valueDuplicateForCreate() {
|
||||
// 准备参数
|
||||
String dictType = randomString();
|
||||
String value = randomString();
|
||||
// mock 数据
|
||||
dictDataMapper.insert(randomDictDataDO(o -> {
|
||||
o.setDictType(dictType);
|
||||
o.setValue(value);
|
||||
}));
|
||||
|
||||
// 调用,校验异常
|
||||
assertServiceException(() -> dictDataService.validateDictDataValueUnique(null, dictType, value),
|
||||
DICT_DATA_VALUE_DUPLICATE);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testValidateDictDataValueUnique_valueDuplicateForUpdate() {
|
||||
// 准备参数
|
||||
Long id = randomLongId();
|
||||
String dictType = randomString();
|
||||
String value = randomString();
|
||||
// mock 数据
|
||||
dictDataMapper.insert(randomDictDataDO(o -> {
|
||||
o.setDictType(dictType);
|
||||
o.setValue(value);
|
||||
}));
|
||||
|
||||
// 调用,校验异常
|
||||
assertServiceException(() -> dictDataService.validateDictDataValueUnique(id, dictType, value),
|
||||
DICT_DATA_VALUE_DUPLICATE);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetDictDataCountByDictType() {
|
||||
// mock 数据
|
||||
dictDataMapper.insert(randomDictDataDO(o -> o.setDictType("yunai")));
|
||||
dictDataMapper.insert(randomDictDataDO(o -> o.setDictType("tudou")));
|
||||
dictDataMapper.insert(randomDictDataDO(o -> o.setDictType("yunai")));
|
||||
// 准备参数
|
||||
String dictType = "yunai";
|
||||
|
||||
// 调用
|
||||
long count = dictDataService.getDictDataCountByDictType(dictType);
|
||||
// 校验
|
||||
assertEquals(2L, count);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testValidateDictDataList_success() {
|
||||
// mock 数据
|
||||
DictDataDO dictDataDO = randomDictDataDO().setStatus(CommonStatusEnum.ENABLE.getStatus());
|
||||
dictDataMapper.insert(dictDataDO);
|
||||
// 准备参数
|
||||
String dictType = dictDataDO.getDictType();
|
||||
List<String> values = singletonList(dictDataDO.getValue());
|
||||
|
||||
// 调用,无需断言
|
||||
dictDataService.validateDictDataList(dictType, values);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testValidateDictDataList_notFound() {
|
||||
// 准备参数
|
||||
String dictType = randomString();
|
||||
List<String> values = singletonList(randomString());
|
||||
|
||||
// 调用, 并断言异常
|
||||
assertServiceException(() -> dictDataService.validateDictDataList(dictType, values), DICT_DATA_NOT_EXISTS);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testValidateDictDataList_notEnable() {
|
||||
// mock 数据
|
||||
DictDataDO dictDataDO = randomDictDataDO().setStatus(CommonStatusEnum.DISABLE.getStatus());
|
||||
dictDataMapper.insert(dictDataDO);
|
||||
// 准备参数
|
||||
String dictType = dictDataDO.getDictType();
|
||||
List<String> values = singletonList(dictDataDO.getValue());
|
||||
|
||||
// 调用, 并断言异常
|
||||
assertServiceException(() -> dictDataService.validateDictDataList(dictType, values),
|
||||
DICT_DATA_NOT_ENABLE, dictDataDO.getLabel());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetDictData_dictType() {
|
||||
// mock 数据
|
||||
DictDataDO dictDataDO = randomDictDataDO().setDictType("yunai").setValue("1");
|
||||
dictDataMapper.insert(dictDataDO);
|
||||
DictDataDO dictDataDO02 = randomDictDataDO().setDictType("yunai").setValue("2");
|
||||
dictDataMapper.insert(dictDataDO02);
|
||||
// 准备参数
|
||||
String dictType = "yunai";
|
||||
String value = "1";
|
||||
|
||||
// 调用
|
||||
DictDataDO dbDictData = dictDataService.getDictData(dictType, value);
|
||||
// 断言
|
||||
assertEquals(dictDataDO, dbDictData);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testParseDictData() {
|
||||
// mock 数据
|
||||
DictDataDO dictDataDO = randomDictDataDO().setDictType("yunai").setLabel("1");
|
||||
dictDataMapper.insert(dictDataDO);
|
||||
DictDataDO dictDataDO02 = randomDictDataDO().setDictType("yunai").setLabel("2");
|
||||
dictDataMapper.insert(dictDataDO02);
|
||||
// 准备参数
|
||||
String dictType = "yunai";
|
||||
String label = "1";
|
||||
|
||||
// 调用
|
||||
DictDataDO dbDictData = dictDataService.parseDictData(dictType, label);
|
||||
// 断言
|
||||
assertEquals(dictDataDO, dbDictData);
|
||||
}
|
||||
|
||||
// ========== 随机对象 ==========
|
||||
|
||||
@SafeVarargs
|
||||
private static DictDataDO randomDictDataDO(Consumer<DictDataDO>... consumers) {
|
||||
Consumer<DictDataDO> consumer = (o) -> {
|
||||
o.setStatus(randomCommonStatus()); // 保证 status 的范围
|
||||
};
|
||||
return randomPojo(DictDataDO.class, ArrayUtils.append(consumer, consumers));
|
||||
}
|
||||
|
||||
/**
|
||||
* 生成一个有效的字典类型
|
||||
*
|
||||
* @param type 字典类型
|
||||
* @return DictTypeDO 对象
|
||||
*/
|
||||
private static DictTypeDO randomDictTypeDO(String type) {
|
||||
return randomPojo(DictTypeDO.class, o -> {
|
||||
o.setType(type);
|
||||
o.setStatus(CommonStatusEnum.ENABLE.getStatus()); // 保证 status 是开启
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
Loading…
Reference in New Issue