Compare commits

...

12 Commits

Author SHA1 Message Date
ls
9a44d4361f update 2025-12-01 18:16:28 +08:00
ls
5a643045f0 update 2025-12-01 17:44:01 +08:00
ls
5e528175b8 update 2025-12-01 14:52:17 +08:00
ls
5360e0da9e update 2025-12-01 14:46:58 +08:00
ls
c4ffd9c0fc update 2025-11-30 18:45:50 +08:00
ls
f73cad7f65 update 2025-11-30 18:01:22 +08:00
ls
e323b34f1e update 2025-11-29 13:08:15 +08:00
ls
e621a36bad update 2025-11-29 13:04:09 +08:00
ls
4f216a9482 update 2025-08-19 19:08:08 +08:00
ls
3d7967d593 update 2025-08-06 23:33:37 +08:00
ls
c795636ea4 update 2025-08-06 23:29:20 +08:00
ls
93fb02eb92 update 2025-08-06 23:16:44 +08:00
41 changed files with 31081 additions and 15120 deletions

21
.fleet/run.json Normal file
View File

@@ -0,0 +1,21 @@
{
"configurations": [
{
"type": "spring-boot",
"name": "PhysicalApplication",
"mainClass": "org.jeecg.PhysicalApplication",
"module": "physical-launcher",
"options": ["-XX:TieredStopAtLevel=1", "-Dspring.output.ansi.enabled=always", "-Dcom.sun.management.jmxremote", "-Dspring.jmx.enabled=true", "-Dspring.liveBeansView.mbeanDomain", "-Dspring.application.admin.enabled=true", "-Dmanagement.endpoints.jmx.exposure.include=*", "-Dfile.encoding=UTF-8", "-Dsun.stdout.encoding=UTF-8", "-Dsun.stderr.encoding=UTF-8"],
"activeProfiles": [""],
"workingDir": "$PROJECT_DIR$",
"dependsOn": ["Build"]
},
{
"type": "jps-build",
"name": "Build",
"module": "physical-launcher",
"includeTests": false
}
]
}

1
.gitignore vendored
View File

@@ -14,5 +14,6 @@ os_del_doc.cmd
.svn
derby.log
/scripts/downloaded_files/
/scripts/downloaded_files_old/
.DS_Store
/__pycache__/

BIN
output.zip Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
output/沟通记录表.pdf Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -60,6 +60,7 @@ public class SsrfFileTypeFilter {
//压缩文件
FILE_TYPE_WHITE_LIST.add("zip");
FILE_TYPE_WHITE_LIST.add("log");
FILE_TYPE_WHITE_LIST.add("rar");
FILE_TYPE_WHITE_LIST.add("7z");
FILE_TYPE_WHITE_LIST.add("tar");

File diff suppressed because one or more lines are too long

View File

@@ -17,6 +17,16 @@
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-undertow</artifactId>
</dependency>
<dependency>
<groupId>org.jeecgframework.boot</groupId>

View File

@@ -168,7 +168,7 @@ spring:
datasource:
master:
# url: jdbc:mysql://127.0.0.1:3306/physical-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
url: jdbc:mysql://47.102.126.67:23306/physical-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
url: jdbc:mysql://47.102.126.67:23306/physical-boot-prod?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
username: root
password: urwTocIA1f395t
driver-class-name: com.mysql.cj.jdbc.Driver

View File

@@ -40,11 +40,11 @@ import java.util.List;
@Slf4j
public class DocumentLibraryController extends JeecgController<DocumentLibrary, IDocumentLibraryService> {
@Autowired
private IDocumentLibraryService documentLibraryService;
private IDocumentLibraryService documentLibraryService;
@Autowired
private IDocumentFavoritesService documentFavoritesService;
private IDocumentFavoritesService documentFavoritesService;
@Autowired
private ISysUserService userService;
private ISysUserService userService;
@Autowired
private IDocumentVisitHistoryService documentVisitHistoryService;
@@ -152,10 +152,14 @@ public class DocumentLibraryController extends JeecgController<DocumentLibrary,
@RequiresPermissions("library:document_library:edit")
@RequestMapping(value = "/edit", method = {RequestMethod.PUT, RequestMethod.POST})
public Result<String> edit(@RequestBody DocumentLibrary documentLibrary, HttpServletRequest request) {
documentLibraryService.updateById(documentLibrary);
String username = JwtUtil.getUserNameByToken(request);
SysUser userByName = userService.getUserByName(username);
DocumentLibrary byId = documentLibraryService.getById(documentLibrary.getId());
if (StringUtils.equals(byId.getCreateBy(), "admin") && !StringUtils.equals(userByName.getUsername(), "admin")) {
return Result.OK("您无权编辑 Admin 的知识库!");
}
documentLibraryService.updateById(documentLibrary);
if (StringUtils.equals(documentLibrary.getType(), "DOCUMENT")) {
DocumentVisitHistory his = documentVisitHistoryService.findByUserAndDocId(userByName.getId(), documentLibrary.getId());
his.setDocumentId(documentLibrary.getId());

View File

@@ -45,12 +45,12 @@ public class ExperimentAnnealProcessController extends JeecgController<Experimen
private ISysUserService userService;
@Autowired
private IExperimentService experimentService;
private IExperimentService experimentService;
@Autowired
private IExperimentLogService experimentLogService;
@Autowired
private IExperimentSampleInfoService experimentSampleInfoService;
private IExperimentSampleInfoService experimentSampleInfoService;
@Autowired
private IExperimentDeviationConditionService experimentDeviationConditionService;
@Autowired
@@ -100,19 +100,22 @@ public class ExperimentAnnealProcessController extends JeecgController<Experimen
if (Objects.isNull(dbExperiment)) {
return Result.error("试验数据不存在!");
}
if (StringUtils.equals(dbExperiment.getStatus(), ExperimentStatus.COMPLETED) || StringUtils.equals(dbExperiment.getStatus(),
ExperimentStatus.REVIEWED)) {
return Result.error("试验状态:[" + dbExperiment.getStatus() + "]不能进行修改!");
String username = JwtUtil.getUserNameByToken(request);
SysUser userByName = userService.getUserByName(username);
// 超级管理不用判断状态和修改状态,只修改数据。 20250511 邓春
if (!"admin".equals(userByName.getUsername())) {
if (StringUtils.equals(dbExperiment.getStatus(), ExperimentStatus.COMPLETED) || StringUtils.equals(dbExperiment.getStatus(),
ExperimentStatus.REVIEWED)) {
return Result.error("试验状态:[" + dbExperiment.getStatus() + "]不能进行修改!");
}
}
experimentService.changeStatus(experimentId, ExperimentStatus.PROGRESSING);
experimentAnnealProcessService.saveWithDetails(experimentAnnealProcess,"add");
experimentAnnealProcessService.saveWithDetails(experimentAnnealProcess, "add");
ExperimentLog experimentLog = new ExperimentLog();
experimentLog.setExperimentId(experimentId);
experimentLog.setLogContent("添加退火过程");
String username = JwtUtil.getUserNameByToken(request);
SysUser userByName = userService.getUserByName(username);
experimentLog.setCreateBy(userByName.getRealname());
experimentLogService.save(experimentLog);
@@ -139,19 +142,22 @@ public class ExperimentAnnealProcessController extends JeecgController<Experimen
if (Objects.isNull(dbExperiment)) {
return Result.error("试验数据不存在!");
}
if (StringUtils.equals(dbExperiment.getStatus(), ExperimentStatus.COMPLETED) || StringUtils.equals(dbExperiment.getStatus(),
ExperimentStatus.REVIEWED)) {
return Result.error("试验状态:[" + dbExperiment.getStatus() + "]不能进行修改!");
String username = JwtUtil.getUserNameByToken(request);
SysUser userByName = userService.getUserByName(username);
// 超级管理不用判断状态和修改状态,只修改数据。 20250511 邓春
if (!"admin".equals(userByName.getUsername())) {
if (StringUtils.equals(dbExperiment.getStatus(), ExperimentStatus.COMPLETED) || StringUtils.equals(dbExperiment.getStatus(),
ExperimentStatus.REVIEWED)) {
return Result.error("试验状态:[" + dbExperiment.getStatus() + "]不能进行修改!");
}
}
experimentService.changeStatus(experimentId, ExperimentStatus.PROGRESSING);
experimentAnnealProcessService.saveWithDetails(experimentAnnealProcess,"edit");
experimentAnnealProcessService.saveWithDetails(experimentAnnealProcess, "edit");
ExperimentLog experimentLog = new ExperimentLog();
experimentLog.setExperimentId(experimentId);
experimentLog.setLogContent("编辑退火过程");
String username = JwtUtil.getUserNameByToken(request);
SysUser userByName = userService.getUserByName(username);
experimentLog.setCreateBy(userByName.getRealname());
experimentLogService.save(experimentLog);
return Result.OK("编辑成功!");
@@ -177,15 +183,18 @@ public class ExperimentAnnealProcessController extends JeecgController<Experimen
if (Objects.isNull(dbExperiment)) {
return Result.error("试验数据不存在!");
}
if (StringUtils.equals(dbExperiment.getStatus(), ExperimentStatus.COMPLETED) || StringUtils.equals(dbExperiment.getStatus(),
ExperimentStatus.REVIEWED)) {
return Result.error("试验状态:[" + dbExperiment.getStatus() + "]不能进行修改!");
String username = JwtUtil.getUserNameByToken(request);
SysUser userByName = userService.getUserByName(username);
// 超级管理不用判断状态和修改状态,只修改数据。 20250511 邓春
if (!"admin".equals(userByName.getUsername())) {
if (StringUtils.equals(dbExperiment.getStatus(), ExperimentStatus.COMPLETED) || StringUtils.equals(dbExperiment.getStatus(),
ExperimentStatus.REVIEWED)) {
return Result.error("试验状态:[" + dbExperiment.getStatus() + "]不能进行修改!");
}
}
ExperimentLog experimentLog = new ExperimentLog();
experimentLog.setExperimentId(experimentId);
experimentLog.setLogContent("删除退火过程");
String username = JwtUtil.getUserNameByToken(request);
SysUser userByName = userService.getUserByName(username);
experimentLog.setCreateBy(userByName.getRealname());
experimentLogService.save(experimentLog);

View File

@@ -171,6 +171,13 @@ public class ExperimentController extends JeecgController<Experiment, IExperimen
if (!StringUtils.startsWith(experimentNo, "KC")) {
return Result.error("实验编号格式不正确!");
}
if (StringUtils.isBlank(experiment.getId())) {
Experiment dbExp = experimentService.getByExperimentNo(experimentNo);
if (Objects.isNull(dbExp)) {
return Result.error("实验数据不正确!");
}
experiment.setId(dbExp.getId());
}
//校验试验的基本信息
String result = validateSampleInfos(experiment);
if (StringUtils.isNotBlank(result)) {
@@ -257,6 +264,10 @@ public class ExperimentController extends JeecgController<Experiment, IExperimen
return Result.error("实验状态不正确!");
}
}*/
Experiment dbExp = experimentService.getByExperimentNo(experimentNo);
if (Objects.nonNull(dbExp) && StringUtils.isBlank(experiment.getId())) {
experiment.setId(dbExp.getId());
}
experiment.setStatus(ExperimentStatus.STAGING);
experimentService.saveWithDetail(experiment);

View File

@@ -80,8 +80,10 @@ public class ExperimentDeviationConditionController
if (StringUtils.contains(sampleId, ",")) {
for (String id : sampleId.split(",")) {
ExperimentDeviationCondition cloned = ObjectUtils.clone(experimentDeviationCondition);
cloned.setSampleId(id);
experimentDeviationConditionService.save(experimentDeviationCondition);
if (ObjectUtils.isNotEmpty(cloned)) {
cloned.setSampleId(id);
experimentDeviationConditionService.save(cloned);
}
}
} else {
experimentDeviationConditionService.save(experimentDeviationCondition);
@@ -106,8 +108,10 @@ public class ExperimentDeviationConditionController
if (StringUtils.contains(sampleId, ",")) {
for (String id : sampleId.split(",")) {
ExperimentDeviationCondition cloned = ObjectUtils.clone(experimentDeviationCondition);
cloned.setSampleId(id);
experimentDeviationConditionService.saveOrUpdate(experimentDeviationCondition);
if (ObjectUtils.isNotEmpty(cloned)) {
cloned.setSampleId(id);
experimentDeviationConditionService.saveOrUpdate(cloned);
}
}
} else {
experimentDeviationConditionService.updateById(experimentDeviationCondition);

View File

@@ -45,7 +45,7 @@ public class ExperimentRadiationProcessController extends JeecgController<Experi
@Autowired
private IExperimentLogService experimentLogService;
@Autowired
private ISysUserService userService;
private ISysUserService userService;
@Autowired
private IExperimentService experimentService;
@@ -96,9 +96,14 @@ public class ExperimentRadiationProcessController extends JeecgController<Experi
if (Objects.isNull(dbExperiment)) {
return Result.error("试验数据不存在!");
}
if (StringUtils.equals(dbExperiment.getStatus(), ExperimentStatus.COMPLETED) || StringUtils.equals(dbExperiment.getStatus(),
ExperimentStatus.REVIEWED)) {
return Result.error("试验状态:[" + dbExperiment.getStatus() + "]不能进行修改!");
String username = JwtUtil.getUserNameByToken(request);
SysUser userByName = userService.getUserByName(username);
// 超级管理不用判断状态和修改状态,只修改数据。 20250511 邓春
if (!"admin".equals(userByName.getUsername())) {
if (StringUtils.equals(dbExperiment.getStatus(), ExperimentStatus.COMPLETED) || StringUtils.equals(dbExperiment.getStatus(),
ExperimentStatus.REVIEWED)) {
return Result.error("试验状态:[" + dbExperiment.getStatus() + "]不能进行修改!");
}
}
experimentRadiationProcess.setId(null);
@@ -109,8 +114,6 @@ public class ExperimentRadiationProcessController extends JeecgController<Experi
ExperimentLog experimentLog = new ExperimentLog();
experimentLog.setExperimentId(experimentId);
experimentLog.setLogContent("添加辐照过程");
String username = JwtUtil.getUserNameByToken(request);
SysUser userByName = userService.getUserByName(username);
experimentLog.setCreateBy(userByName.getRealname());
experimentLogService.save(experimentLog);
@@ -137,9 +140,14 @@ public class ExperimentRadiationProcessController extends JeecgController<Experi
if (Objects.isNull(dbExperiment)) {
return Result.error("试验数据不存在!");
}
if (StringUtils.equals(dbExperiment.getStatus(), ExperimentStatus.COMPLETED) || StringUtils.equals(dbExperiment.getStatus(),
ExperimentStatus.REVIEWED)) {
return Result.error("试验状态:[" + dbExperiment.getStatus() + "]不能进行修改!");
String username = JwtUtil.getUserNameByToken(request);
SysUser userByName = userService.getUserByName(username);
// 超级管理不用判断状态和修改状态,只修改数据。 20250511 邓春
if (!"admin".equals(userByName.getUsername())) {
if (StringUtils.equals(dbExperiment.getStatus(), ExperimentStatus.COMPLETED) || StringUtils.equals(dbExperiment.getStatus(),
ExperimentStatus.REVIEWED)) {
return Result.error("试验状态:[" + dbExperiment.getStatus() + "]不能进行修改!");
}
}
experimentService.changeStatus(experimentId, ExperimentStatus.PROGRESSING);
experimentRadiationProcessService.saveOrUpdate(experimentRadiationProcess);
@@ -149,8 +157,6 @@ public class ExperimentRadiationProcessController extends JeecgController<Experi
ExperimentLog experimentLog = new ExperimentLog();
experimentLog.setExperimentId(experimentId);
experimentLog.setLogContent("编辑辐照过程");
String username = JwtUtil.getUserNameByToken(request);
SysUser userByName = userService.getUserByName(username);
experimentLog.setCreateBy(userByName.getRealname());
experimentLogService.save(experimentLog);
@@ -177,15 +183,18 @@ public class ExperimentRadiationProcessController extends JeecgController<Experi
if (Objects.isNull(dbExperiment)) {
return Result.error("试验数据不存在!");
}
if (StringUtils.equals(dbExperiment.getStatus(), ExperimentStatus.COMPLETED) || StringUtils.equals(dbExperiment.getStatus(),
ExperimentStatus.REVIEWED)) {
return Result.error("试验状态:[" + dbExperiment.getStatus() + "]不能进行修改!");
String username = JwtUtil.getUserNameByToken(request);
SysUser userByName = userService.getUserByName(username);
// 超级管理不用判断状态和修改状态,只修改数据。 20250511 邓春
if (!"admin".equals(userByName.getUsername())) {
if (StringUtils.equals(dbExperiment.getStatus(), ExperimentStatus.COMPLETED) || StringUtils.equals(dbExperiment.getStatus(),
ExperimentStatus.REVIEWED)) {
return Result.error("试验状态:[" + dbExperiment.getStatus() + "]不能进行修改!");
}
}
ExperimentLog experimentLog = new ExperimentLog();
experimentLog.setExperimentId(experimentId);
experimentLog.setLogContent("删除辐照过程");
String username = JwtUtil.getUserNameByToken(request);
SysUser userByName = userService.getUserByName(username);
experimentLog.setCreateBy(userByName.getRealname());
experimentLogService.save(experimentLog);
experimentRadiationProcessService.removeById(id);

View File

@@ -94,10 +94,14 @@ public class ExperimentTestProcessController extends JeecgController<ExperimentT
Experiment dbExperiment = experimentService.getById(experimentId);
if (Objects.isNull(dbExperiment)) {
return Result.error("试验数据不存在!");
}
}String username = JwtUtil.getUserNameByToken(request);
SysUser userByName = userService.getUserByName(username);
// 超级管理不用判断状态和修改状态,只修改数据。 20250511 邓春
if (!"admin".equals(userByName.getUsername())) {
if (StringUtils.equals(dbExperiment.getStatus(), ExperimentStatus.COMPLETED)||StringUtils.equals(dbExperiment.getStatus(), ExperimentStatus.REVIEWED)) {
return Result.error("试验状态:[" + dbExperiment.getStatus() + "]不能进行修改!");
}
}
experimentTestProcess.setId(null);
experimentService.changeStatus(experimentId, ExperimentStatus.PROGRESSING);
@@ -107,8 +111,6 @@ public class ExperimentTestProcessController extends JeecgController<ExperimentT
ExperimentLog experimentLog = new ExperimentLog();
experimentLog.setExperimentId(experimentTestProcess.getExperimentId());
experimentLog.setLogContent("添加测试过程");
String username = JwtUtil.getUserNameByToken(request);
SysUser userByName = userService.getUserByName(username);
experimentLog.setCreateBy(userByName.getRealname());
experimentLogService.save(experimentLog);
@@ -134,10 +136,14 @@ public class ExperimentTestProcessController extends JeecgController<ExperimentT
Experiment dbExperiment = experimentService.getById(experimentId);
if (Objects.isNull(dbExperiment)) {
return Result.error("试验数据不存在!");
}
}String username = JwtUtil.getUserNameByToken(request);
SysUser userByName = userService.getUserByName(username);
// 超级管理不用判断状态和修改状态,只修改数据。 20250511 邓春
if (!"admin".equals(userByName.getUsername())) {
if (StringUtils.equals(dbExperiment.getStatus(), ExperimentStatus.COMPLETED)||StringUtils.equals(dbExperiment.getStatus(), ExperimentStatus.REVIEWED)) {
return Result.error("试验状态:[" + dbExperiment.getStatus() + "]不能进行修改!");
}
}
experimentService.changeStatus(experimentId, ExperimentStatus.PROGRESSING);
@@ -146,8 +152,6 @@ public class ExperimentTestProcessController extends JeecgController<ExperimentT
ExperimentLog experimentLog = new ExperimentLog();
experimentLog.setExperimentId(experimentId);
experimentLog.setLogContent("编辑测试过程");
String username = JwtUtil.getUserNameByToken(request);
SysUser userByName = userService.getUserByName(username);
experimentLog.setCreateBy(userByName.getRealname());
experimentLogService.save(experimentLog);
@@ -174,15 +178,17 @@ public class ExperimentTestProcessController extends JeecgController<ExperimentT
Experiment dbExperiment = experimentService.getById(experimentId);
if (Objects.isNull(dbExperiment)) {
return Result.error("试验数据不存在!");
}
}String username = JwtUtil.getUserNameByToken(request);
SysUser userByName = userService.getUserByName(username);
// 超级管理不用判断状态和修改状态,只修改数据。 20250511 邓春
if (!"admin".equals(userByName.getUsername())) {
if (StringUtils.equals(dbExperiment.getStatus(), ExperimentStatus.COMPLETED)||StringUtils.equals(dbExperiment.getStatus(), ExperimentStatus.REVIEWED)) {
return Result.error("试验状态:[" + dbExperiment.getStatus() + "]不能进行修改!");
}
}
ExperimentLog experimentLog = new ExperimentLog();
experimentLog.setExperimentId(experimentId);
experimentLog.setLogContent("删除测试过程");
String username = JwtUtil.getUserNameByToken(request);
SysUser userByName = userService.getUserByName(username);
experimentLog.setCreateBy(userByName.getRealname());
experimentLogService.save(experimentLog);

View File

@@ -44,7 +44,7 @@ public class ExperimentUserController extends JeecgController<ExperimentUser, IE
@Autowired
private IExperimentLogService experimentLogService;
@Autowired
private ISysUserService userService;
private ISysUserService userService;
@Autowired
private IExperimentService experimentService;
@@ -91,15 +91,18 @@ public class ExperimentUserController extends JeecgController<ExperimentUser, IE
if (Objects.isNull(dbExperiment)) {
return Result.error("试验数据不存在!");
}
if (StringUtils.equals(dbExperiment.getStatus(), ExperimentStatus.COMPLETED)) {
return Result.error("试验状态:[" + dbExperiment.getStatus() + "]不能进行修改!");
String username = JwtUtil.getUserNameByToken(request);
SysUser userByName = userService.getUserByName(username);
// 超级管理不用判断状态和修改状态,只修改数据。 20250511 邓春
if (!"admin".equals(userByName.getUsername())) {
if (StringUtils.equals(dbExperiment.getStatus(), ExperimentStatus.COMPLETED)) {
return Result.error("试验状态:[" + dbExperiment.getStatus() + "]不能进行修改!");
}
}
experimentUserService.save(experimentUser);
ExperimentLog experimentLog = new ExperimentLog();
experimentLog.setExperimentId(experimentUser.getExperimentId());
experimentLog.setLogContent("添加试验人员");
String username = JwtUtil.getUserNameByToken(request);
SysUser userByName = userService.getUserByName(username);
experimentLog.setCreateBy(userByName.getRealname());
experimentLogService.save(experimentLog);
return Result.OK("添加成功!");
@@ -110,6 +113,9 @@ public class ExperimentUserController extends JeecgController<ExperimentUser, IE
@RequiresPermissions("database:experiment_user:add")
@PostMapping(value = "/batchAdd")
public Result<String> batchAdd(@RequestBody List<ExperimentUser> experimentUserList, HttpServletRequest request) {
String username = JwtUtil.getUserNameByToken(request);
SysUser userByName = userService.getUserByName(username);
for (ExperimentUser v : experimentUserList) {
String experimentId = v.getExperimentId();
if (StringUtils.isBlank(experimentId)) {
@@ -120,16 +126,18 @@ public class ExperimentUserController extends JeecgController<ExperimentUser, IE
if (Objects.isNull(dbExperiment)) {
return Result.error("试验数据不存在!");
}
if (StringUtils.equals(dbExperiment.getStatus(), ExperimentStatus.COMPLETED)) {
return Result.error("试验状态:[" + dbExperiment.getStatus() + "]不能进行修改!");
// 超级管理不用判断状态和修改状态,只修改数据。 20250511 邓春
if (!"admin".equals(userByName.getUsername())) {
if (StringUtils.equals(dbExperiment.getStatus(), ExperimentStatus.COMPLETED)) {
return Result.error("试验状态:[" + dbExperiment.getStatus() + "]不能进行修改!");
}
}
experimentUserService.save(v);
}
ExperimentLog experimentLog = new ExperimentLog();
experimentLog.setExperimentId(experimentUserList.get(0).getExperimentId());
experimentLog.setLogContent("添加试验人员");
String username = JwtUtil.getUserNameByToken(request);
SysUser userByName = userService.getUserByName(username);
experimentLog.setCreateBy(userByName.getRealname());
experimentLogService.save(experimentLog);
return Result.OK("添加成功!");
@@ -157,14 +165,17 @@ public class ExperimentUserController extends JeecgController<ExperimentUser, IE
if (Objects.isNull(dbExperiment)) {
return Result.error("试验数据不存在!");
}
if (StringUtils.equals(dbExperiment.getStatus(), ExperimentStatus.COMPLETED)) {
return Result.error("试验状态:[" + dbExperiment.getStatus() + "]不能进行修改!");
String username = JwtUtil.getUserNameByToken(request);
SysUser userByName = userService.getUserByName(username);
// 超级管理不用判断状态和修改状态,只修改数据。 20250511 邓春
if (!"admin".equals(userByName.getUsername())) {
if (StringUtils.equals(dbExperiment.getStatus(), ExperimentStatus.COMPLETED)) {
return Result.error("试验状态:[" + dbExperiment.getStatus() + "]不能进行修改!");
}
}
ExperimentLog experimentLog = new ExperimentLog();
experimentLog.setExperimentId(byId.getExperimentId());
experimentLog.setLogContent("编辑试验人员");
String username = JwtUtil.getUserNameByToken(request);
SysUser userByName = userService.getUserByName(username);
experimentLog.setCreateBy(userByName.getRealname());
experimentLogService.save(experimentLog);
return Result.OK("编辑成功!");
@@ -191,14 +202,17 @@ public class ExperimentUserController extends JeecgController<ExperimentUser, IE
if (Objects.isNull(dbExperiment)) {
return Result.error("试验数据不存在!");
}
if (StringUtils.equals(dbExperiment.getStatus(), ExperimentStatus.COMPLETED)) {
return Result.error("试验状态:[" + dbExperiment.getStatus() + "]不能进行修改!");
String username = JwtUtil.getUserNameByToken(request);
SysUser userByName = userService.getUserByName(username);
// 超级管理不用判断状态和修改状态,只修改数据。 20250511 邓春
if (!"admin".equals(userByName.getUsername())) {
if (StringUtils.equals(dbExperiment.getStatus(), ExperimentStatus.COMPLETED)) {
return Result.error("试验状态:[" + dbExperiment.getStatus() + "]不能进行修改!");
}
}
ExperimentLog experimentLog = new ExperimentLog();
experimentLog.setExperimentId(experimentId);
experimentLog.setLogContent("删除试验人员");
String username = JwtUtil.getUserNameByToken(request);
SysUser userByName = userService.getUserByName(username);
experimentLog.setCreateBy(userByName.getRealname());
experimentLogService.save(experimentLog);
experimentUserService.removeById(id);

View File

@@ -92,13 +92,14 @@ public class ExperimentSampleInfo implements Serializable {
/**
* 生产厂家
*/
@Schema(description = "生产厂家ID")
private String sampleManufacturer;
@Schema(description = "生产厂家")
@Excel(name = "生产厂家", width = 15)
private String sampleManufacturer;
//
@Schema(description = "生产厂家名称")
@TableField(exist = false)
private String sampleManufacturerName;
// @Schema(description = "生产厂家名称")
// @TableField(exist = false)
// private String sampleManufacturerName;
/**
* 图片
*/

View File

@@ -146,4 +146,11 @@ public class HistoricalDatabase implements Serializable {
@Excel(name = "附件", width = 15)
@Schema(description = "附件")
private String fileUrl;
/**
* 描述
*/
@Excel(name = "描述", width = 15)
@Schema(description = "描述")
private String description;
}

View File

@@ -142,7 +142,12 @@ public class LocalDatabase implements Serializable {
@Schema(description = "样品型号")
private String sampleModel;
/**
* 描述
*/
@Excel(name = "描述", width = 15)
@Schema(description = "描述")
private String description;
@TableField(exist = false)
private List<ExperimentReviewDTO> ExperimentReviewList;

View File

@@ -71,10 +71,7 @@
</foreach>
</if>
</where>
<if test="loginUser.postText != null and loginUser.postText != ''">
order by ${loginUser.postText}
</if>
order by e.experiment_no desc
</select>
</mapper>

View File

@@ -18,6 +18,7 @@ public interface IExperimentService extends IService<Experiment> {
void fetchExperimentDetail(Experiment experiment);
Experiment copy(Experiment oldExperiment);
Experiment getByExperimentNo(String experimentNo);
void changeStatus(String experimentId, String status);

View File

@@ -25,7 +25,7 @@ import java.util.Optional;
public class ExperimentSampleInfoServiceImpl extends ServiceImpl<ExperimentSampleInfoMapper, ExperimentSampleInfo>
implements IExperimentSampleInfoService {
@Autowired
private IClientService clientService;
private IClientService clientService;
@Override
public ExperimentSampleInfo getById(Serializable id) {
@@ -35,7 +35,6 @@ public class ExperimentSampleInfoServiceImpl extends ServiceImpl<ExperimentSampl
}
private void assembleDetails(ExperimentSampleInfo sampleInfo) {
if (ObjUtil.isNull(sampleInfo)) {
return;
@@ -43,7 +42,7 @@ public class ExperimentSampleInfoServiceImpl extends ServiceImpl<ExperimentSampl
String sampleManufacturerId = sampleInfo.getSampleManufacturer();
if (StringUtils.isNotBlank(sampleManufacturerId)) {
Client byId = clientService.getById(sampleManufacturerId);
sampleInfo.setSampleManufacturerName(Optional.ofNullable(byId).map(v -> v.getName()).orElse(sampleManufacturerId));
sampleInfo.setSampleManufacturer(Optional.ofNullable(byId).map(v -> v.getName()).orElse(sampleManufacturerId));
}
}

View File

@@ -243,6 +243,11 @@ public class ExperimentServiceImpl extends ServiceImpl<ExperimentMapper, Experim
}
@Override
public Experiment getByExperimentNo(String experimentNo) {
return getOne(new LambdaQueryWrapper<Experiment>().eq(Experiment::getExperimentNo, experimentNo), false);
}
@Override
public void changeStatus(String experimentId, String status) {
Experiment dbData = getById(experimentId);

View File

@@ -4,6 +4,7 @@ from datetime import datetime
from datetime import timedelta
import mysql.connector
import pandas as pd
from minio import Minio
from minio.error import S3Error
@@ -21,13 +22,13 @@ db_config = {
# minio 配置
minio_client = Minio(
"127.0.0.1:9000", # MinIO服务器地址或IP
"47.102.126.67:29000", # MinIO服务器地址或IP
# "192.168.50.100:29000", # MinIO服务器地址或IP
access_key="root", # 替换为你的Access Key
secret_key="12345678", # 替换为你的Secret Key
secret_key="FeF4qA6uQBHeRd", # 替换为你的Secret Key
secure=False # 如果使用的是http则为False
)
bucket_name = 'physical'
bucket_name = 'physical2'
def get_md5(input_string):
@@ -54,7 +55,7 @@ def save_to_db_import_record(connection,data):
cursor = connection.cursor()
try:
"""保存数据到 MySQL 数据库"""
insert_query = """INSERT INTO `nasa_data_record` (`id`, `create_by`, `create_time`, `update_by`, `update_time`, `sys_org_code`, `device_type`, `device_name`, `device_mode`, `device_function`, `device_batch`, `manufacturer`, `experiment_date`, `data_source`, `experiment_user`, `total_count`, `file_list`,`origin_data`)
insert_query = """INSERT INTO `nasa_data_record` (`id`, `create_by`, `create_time`, `update_by`, `update_time`, `sys_org_code`, `device_type`, `device_name`, `device_mode`, `device_function`, `device_batch`, `manufacturer`, `experiment_date`, `data_source`, `experiment_user`, `total_count_nasa`, `file_list`,`origin_data`)
VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s);"""
cursor.execute(insert_query, data)
connection.commit()

15919
scripts/nasa.json Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -1,4 +1,4 @@
import csv
import json
import os
import re
import time
@@ -6,11 +6,14 @@ from datetime import datetime
import mysql.connector
import requests
import pandas as pd
from common import db_config, upload_to_minio, save_to_db_import_record, get_md5
# https://nepp.nasa.gov/radhome/dev/parts.cfc?method=getParts
# https://nepp.nasa.gov/radhome/raddatabase/raddatabase.html
# 定义 API URL
api_url = 'https://radhome.gsfc.nasa.gov/radhome/dev/parts.cfc?method=getParts'
api_url = 'https://nepp.nasa.gov/radhome/dev/parts.cfc?method=getParts'
# 设置请求头
headers = {
@@ -37,7 +40,7 @@ data = {
os.makedirs('downloaded_files', exist_ok=True)
# 文件前缀
file_prefix = 'https://radhome.gsfc.nasa.gov/radhome/papers/'
file_prefix = 'https://nepp.nasa.gov/radhome/papers/'
# CSV 表头
csv_header = [
@@ -66,7 +69,7 @@ csv_header = [
def scrape():
nasa1_connection = mysql.connector.connect(**db_config)
try:
# 发送请求
# 发送请求
response = requests.post(api_url, headers=headers, data=data)
response.raise_for_status() # 检查请求是否成功
@@ -88,119 +91,118 @@ def scrape():
folder_path = os.path.join('downloaded_files', part_number)
os.makedirs(folder_path, exist_ok=True)
# 创建 CSV 文件
csv_file_path = os.path.join(folder_path, 'data.csv')
with open(csv_file_path, 'w', newline='', encoding='utf-8') as csv_file:
csv_writer = csv.writer(csv_file)
csv_writer.writerow(csv_header) # 写入表头
# 填写 CSV 数据
csv_row = [
"", # 序号
"", # 试验对象类型
row[3], # 试验开始日期
"", # 试验结束日期
"", # 试验对象名称
row[1], # 试验对象型号
"", # 试验对象数量
row[6], # 试验性质
"", # 试验目的
"", # 装置名称
"", # 数据提供单位
"", # 试验委托单位
"", # 失效判据
"", # 失效数量
"", # 试验结果描述
"", # 成果
"", # 来源项目名称
"", # 来源项目类型
"", # 分类
"", # 元器件名称
"", # 元器件型号
"", # 元器件批号
row[2], # 生产单位
"", # 是否国产
"", # 元器件成熟度
"", # 晶圆材料
"", # 晶圆批号
"", # 封装材料
"", # 封装技术
"", # 是否倒装
"", # 制造工艺
"", # 工艺特征尺寸
"", # 工艺平台
"", # 工艺代号
"", # 工艺版本
"", # 质量等级
"", # 加固措施
"", # 工作原理
"", # 供货能力
"", # 应用经历
"", # 规范手册
"", # 器件图片
"", # 电子系统分类
"", # 电子系统名称
"", # 电子系统型号
"", # 生产单位
"", # 电子系统功能
"", # 电子系统加固措施
"", # 电子系统图片
"", # 材料名称
"", # 材料型号
"", # 材料组分
"", # 材料用途
"", # 材料生产单位
"", # 材料物理结构
"", # 材料使用经历
"", # 辐照试验大纲
"", # 大纲审核专家类别
"", # 辐照试验所依据的标准规范
"", # 试验步骤(过程)描述
"", # 辐照过程是否加电
"", # 直流偏置条件描述
"", # 交流偏置条件描述
"", # 时钟频率
"", # 测试图形
"", # 其他偏置条件
"", # 辐照偏置原理图
"", # 测试方式
"", # 测试原理图
"", # 试验用仪器名称
"", # 试验用仪器型号
"", # 试验用仪器生产厂家
"", # 试验用仪器检定证书
"", # 试验用软件名称
"", # 试验用软件开发单位
"", # 试验用软件版本号
"", # 试验现场照片
"", # 测试人员姓名
"", # 测试人员单位
"", # 测试人员电话
"", # 装置运行人员
"", # 第三方人员
"", # 第三方人员单位
"", # 第三方人员电话
"", # 其他需要说明的事项
"", # 是否采用铅铝屏蔽
"", # 剂量率
"", # 总剂量
"", # 剂量等效材料
"", # 试验对象编号
"", # 测试参数名称
"", # 测试参数单位
"", # 测试参数结果
"", # 是否为加速试验后数据
"", # 是否为退火数据
"", # 退火温度
"", # 退火时间
"", # 原始数据
"", # 数据处理方法
"", # 其他需要说明的事项
]
# 写入 CSV 行
csv_writer.writerow(csv_row)
# 创建 DataFrame 并保存为 Excel 文件
xlsx_file_path = os.path.join(folder_path, 'data.xlsx')
# 填写数据
data_row = [
"", # 序号
"", # 试验对象类型
row[3], # 试验开始日期
"", # 试验结束日期
"", # 试验对象名称
row[1], # 试验对象型号
"", # 试验对象数量
row[6], # 试验性质
"", # 试验目的
"", # 装置名称
"", # 数据提供单位
"", # 试验委托单位
"", # 失效判据
"", # 失效数量
"", # 试验结果描述
"", # 成果
"", # 来源项目名称
"", # 来源项目类型
"", # 分类
"", # 元器件名称
"", # 元器件型号
"", # 元器件批号
row[2], # 生产单位
"", # 是否国产
"", # 元器件成熟度
"", # 晶圆材料
"", # 晶圆批号
"", # 封装材料
"", # 封装技术
"", # 是否倒装
"", # 制造工艺
"", # 工艺特征尺寸
"", # 工艺平台
"", # 工艺代号
"", # 工艺版本
"", # 质量等级
"", # 加固措施
"", # 工作原理
"", # 供货能力
"", # 应用经历
"", # 规范手册
"", # 器件图片
"", # 电子系统分类
"", # 电子系统名称
"", # 电子系统型号
"", # 生产单位
"", # 电子系统功能
"", # 电子系统加固措施
"", # 电子系统图片
"", # 材料名称
"", # 材料型号
"", # 材料组分
"", # 材料用途
"", # 材料生产单位
"", # 材料物理结构
"", # 材料使用经历
"", # 辐照试验大纲
"", # 大纲审核专家类别
"", # 辐照试验所依据的标准规范
"", # 试验步骤(过程)描述
"", # 辐照过程是否加电
"", # 直流偏置条件描述
"", # 交流偏置条件描述
"", # 时钟频率
"", # 测试图形
"", # 其他偏置条件
"", # 辐照偏置原理图
"", # 测试方式
"", # 测试原理图
"", # 试验用仪器名称
"", # 试验用仪器型号
"", # 试验用仪器生产厂家
"", # 试验用仪器检定证书
"", # 试验用软件名称
"", # 试验用软件开发单位
"", # 试验用软件版本号
"", # 试验现场照片
"", # 测试人员姓名
"", # 测试人员单位
"", # 测试人员电话
"", # 装置运行人员
"", # 第三方人员
"", # 第三方人员单位
"", # 第三方人员电话
"", # 其他需要说明的事项
"", # 是否采用铅铝屏蔽
"", # 剂量率
"", # 总剂量
"", # 剂量等效材料
"", # 试验对象编号
"", # 测试参数名称
"", # 测试参数单位
"", # 测试参数结果
"", # 是否为加速试验后数据
"", # 是否为退火数据
"", # 退火温度
"", # 退火时间
"", # 原始数据
"", # 数据处理方法
"", # 其他需要说明的事项
]
# 创建 DataFrame
df = pd.DataFrame([data_row], columns=csv_header)
df.to_excel(xlsx_file_path, index=False)
# 已直接创建了 Excel 文件,不需要再转换
# 下载文件
for file_name in file_links:
file_name = file_name.strip() # 去除空格
@@ -248,3 +250,5 @@ def scrape():
# 输出数据
# for row in json_data['ROWS']:
# print(row)
scrape()

View File

@@ -1,10 +1,10 @@
import csv
import os
from datetime import datetime
import mysql.connector
import requests
from lxml import html
import pandas as pd
from common import db_config, upload_to_minio, save_to_db_import_record, get_md5
@@ -66,118 +66,116 @@ def scrape():
folder_path = os.path.join('downloaded_files', part_number)
os.makedirs(folder_path, exist_ok=True)
# 创建 CSV 文件
csv_file_path = os.path.join(folder_path, 'data.csv')
with open(csv_file_path, 'w', newline='', encoding='utf-8') as csv_file:
csv_writer = csv.writer(csv_file)
csv_writer.writerow(csv_header) # 写入表头
# 填写 CSV 数据
csv_row = [
"", # 序号
"", # 试验对象类型
columns[8].text_content().strip(), # 试验开始日期
"", # 试验结束日期
"", # 试验对象名称
columns[2].text_content().strip(), # 试验对象型号
"", # 试验对象数量
columns[4].text_content().strip(), # 试验性质
"", # 试验目的
"", # 装置名称
"", # 数据提供单位
"", # 试验委托单位
"", # 失效判据
"", # 失效数量
"", # 试验结果描述
"", # 成果
"", # 来源项目名称
"", # 来源项目类型
"", # 分类
"", # 元器件名称
"", # 元器件型号
"", # 元器件批号
columns[5].text_content().strip(), # 生产单位
"", # 是否国产
"", # 元器件成熟度
"", # 晶圆材料
"", # 晶圆批号
"", # 封装材料
"", # 封装技术
"", # 是否倒装
"", # 制造工艺
"", # 工艺特征尺寸
"", # 工艺平台
"", # 工艺代号
"", # 工艺版本
"", # 质量等级
"", # 加固措施
"", # 工作原理
"", # 供货能力
"", # 应用经历
"", # 规范手册
"", # 器件图片
"", # 电子系统分类
"", # 电子系统名称
"", # 电子系统型号
"", # 生产单位
"", # 电子系统功能
"", # 电子系统加固措施
"", # 电子系统图片
"", # 材料名称
"", # 材料型号
"", # 材料组分
"", # 材料用途
"", # 材料生产单位
"", # 材料物理结构
"", # 材料使用经历
"", # 辐照试验大纲
"", # 大纲审核专家类别
"", # 辐照试验所依据的标准规范
"", # 试验步骤(过程)描述
"", # 辐照过程是否加电
"", # 直流偏置条件描述
"", # 交流偏置条件描述
"", # 时钟频率
"", # 测试图形
"", # 其他偏置条件
"", # 辐照偏置原理图
"", # 测试方式
"", # 测试原理图
"", # 试验用仪器名称
"", # 试验用仪器型号
"", # 试验用仪器生产厂家
"", # 试验用仪器检定证书
"", # 试验用软件名称
"", # 试验用软件开发单位
"", # 试验用软件版本号
"", # 试验现场照片
"", # 测试人员姓名
"", # 测试人员单位
"", # 测试人员电话
"", # 装置运行人员
"", # 第三方人员
"", # 第三方人员单位
"", # 第三方人员电话
"", # 其他需要说明的事项
"", # 是否采用铅铝屏蔽
"", # 剂量率
"", # 总剂量
"", # 剂量等效材料
"", # 试验对象编号
"", # 测试参数名称
"", # 测试参数单位
"", # 测试参数结果
"", # 是否为加速试验后数据
"", # 是否为退火数据
"", # 退火温度
"", # 退火时间
"", # 原始数据
"", # 数据处理方法
"", # 其他需要说明的事项
]
# 写入 CSV 行
csv_writer.writerow(csv_row)
# 创建 DataFrame 并保存为 Excel 文件
xlsx_file_path = os.path.join(folder_path, 'data.xlsx')
# 填写数据
data_row = [
"", # 序号
"", # 试验对象类型
columns[8].text_content().strip(), # 试验开始日期
"", # 试验结束日期
"", # 试验对象名称
columns[2].text_content().strip(), # 试验对象型号
"", # 试验对象数量
columns[4].text_content().strip(), # 试验性质
"", # 试验目的
"", # 装置名称
"", # 数据提供单位
"", # 试验委托单位
"", # 失效判据
"", # 失效数量
"", # 试验结果描述
"", # 成果
"", # 来源项目名称
"", # 来源项目类型
"", # 分类
"", # 元器件名称
"", # 元器件型号
"", # 元器件批号
columns[5].text_content().strip(), # 生产单位
"", # 是否国产
"", # 元器件成熟度
"", # 晶圆材料
"", # 晶圆批号
"", # 封装材料
"", # 封装技术
"", # 是否倒装
"", # 制造工艺
"", # 工艺特征尺寸
"", # 工艺平台
"", # 工艺代号
"", # 工艺版本
"", # 质量等级
"", # 加固措施
"", # 工作原理
"", # 供货能力
"", # 应用经历
"", # 规范手册
"", # 器件图片
"", # 电子系统分类
"", # 电子系统名称
"", # 电子系统型号
"", # 生产单位
"", # 电子系统功能
"", # 电子系统加固措施
"", # 电子系统图片
"", # 材料名称
"", # 材料型号
"", # 材料组分
"", # 材料用途
"", # 材料生产单位
"", # 材料物理结构
"", # 材料使用经历
"", # 辐照试验大纲
"", # 大纲审核专家类别
"", # 辐照试验所依据的标准规范
"", # 试验步骤(过程)描述
"", # 辐照过程是否加电
"", # 直流偏置条件描述
"", # 交流偏置条件描述
"", # 时钟频率
"", # 测试图形
"", # 其他偏置条件
"", # 辐照偏置原理图
"", # 测试方式
"", # 测试原理图
"", # 试验用仪器名称
"", # 试验用仪器型号
"", # 试验用仪器生产厂家
"", # 试验用仪器检定证书
"", # 试验用软件名称
"", # 试验用软件开发单位
"", # 试验用软件版本号
"", # 试验现场照片
"", # 测试人员姓名
"", # 测试人员单位
"", # 测试人员电话
"", # 装置运行人员
"", # 第三方人员
"", # 第三方人员单位
"", # 第三方人员电话
"", # 其他需要说明的事项
"", # 是否采用铅铝屏蔽
"", # 剂量率
"", # 总剂量
"", # 剂量等效材料
"", # 试验对象编号
"", # 测试参数名称
"", # 测试参数单位
"", # 测试参数结果
"", # 是否为加速试验后数据
"", # 是否为退火数据
"", # 退火温度
"", # 退火时间
"", # 原始数据
"", # 数据处理方法
"", # 其他需要说明的事项
]
# 创建 DataFrame
df = pd.DataFrame([data_row], columns=csv_header)
df.to_excel(xlsx_file_path, index=False)
try:
# 下载文件

218
scripts/nasa2.pyx Normal file
View File

@@ -0,0 +1,218 @@
import os
from datetime import datetime
import mysql.connector
import requests
from lxml import html
import pandas as pd
from common import db_config, upload_to_minio, save_to_db_import_record, get_md5
# 定义页面 URL
url = 'https://radhome.gsfc.nasa.gov/radhome/papers/TIDPart.html'
# 创建文件夹以保存文件
os.makedirs('downloaded_files', exist_ok=True)
# CSV 表头
csv_header = [
"序号", "试验对象类型", "试验开始日期", "试验结束日期", "试验对象名称", "试验对象型号",
"试验对象数量", "试验性质", "试验目的", "装置名称", "数据提供单位", "试验委托单位",
"失效判据", "失效数量", "试验结果描述", "成果", "来源项目名称", "来源项目类型",
"分类", "元器件名称", "元器件型号", "元器件批号", "生产单位", "是否国产",
"元器件成熟度", "晶圆材料", "晶圆批号", "封装材料", "封装技术", "是否倒装",
"制造工艺", "工艺特征尺寸", "工艺平台", "工艺代号", "工艺版本", "质量等级",
"加固措施", "工作原理", "供货能力", "应用经历", "规范手册", "器件图片",
"电子系统分类", "电子系统名称", "电子系统型号", "生产单位", "电子系统功能",
"电子系统加固措施", "电子系统图片", "材料名称", "材料型号", "材料组分",
"材料用途", "材料生产单位", "材料物理结构", "材料使用经历", "辐照试验大纲",
"大纲审核专家类别", "辐照试验所依据的标准规范", "试验步骤(过程)描述", "辐照过程是否加电",
"直流偏置条件描述", "交流偏置条件描述", "时钟频率", "测试图形", "其他偏置条件",
"辐照偏置原理图", "测试方式", "测试原理图", "试验用仪器名称", "试验用仪器型号",
"试验用仪器生产厂家", "试验用仪器检定证书", "试验用软件名称", "试验用软件开发单位",
"试验用软件版本号", "试验现场照片", "测试人员姓名", "测试人员单位", "测试人员电话",
"装置运行人员", "第三方人员", "第三方人员单位", "第三方人员电话", "其他需要说明的事项",
"是否采用铅铝屏蔽", "剂量率", "总剂量", "剂量等效材料", "试验对象编号", "测试参数名称",
"测试参数单位", "测试参数结果", "是否为加速试验后数据", "是否为退火数据",
"退火温度", "退火时间", "原始数据", "数据处理方法", "其他需要说明的事项"
]
def scrape():
nasa2_connection = mysql.connector.connect(**db_config)
try:
# 发送请求
response = requests.get(url)
response.raise_for_status()
# 使用 lxml 解析 HTML
tree = html.fromstring(response.text)
# 找到目标表格
table = tree.xpath('/html/body/table[3]')[0] # 获取第一个表格
# 遍历表格行,跳过表头
for row in table.xpath('.//tr')[1:]: # 跳过表头
columns = row.xpath('.//td')
if len(columns) < 8:
continue # 跳过不完整的行
table_id= get_md5('NASA-' + columns[0].text_content().strip())
part_number =table_id # columns[2].text_content().strip() # 第三列 Part Number
file_link_tag = columns[7].xpath('//a') # 第八列的 <a> 标签
# 获取文件名和下载链接
file_url = 'https://radhome.gsfc.nasa.gov/' + file_link_tag[0].get('href')
# 创建目录
folder_path = os.path.join('downloaded_files', part_number)
os.makedirs(folder_path, exist_ok=True)
# 创建 DataFrame 并保存为 Excel 文件
xlsx_file_path = os.path.join(folder_path, 'data.xlsx')
# 填写数据
data_row = [
"", # 序号
"", # 试验对象类型
columns[8].text_content().strip(), # 试验开始日期
"", # 试验结束日期
"", # 试验对象名称
columns[2].text_content().strip(), # 试验对象型号
"", # 试验对象数量
columns[4].text_content().strip(), # 试验性质
"", # 试验目的
"", # 装置名称
"", # 数据提供单位
"", # 试验委托单位
"", # 失效判据
"", # 失效数量
"", # 试验结果描述
"", # 成果
"", # 来源项目名称
"", # 来源项目类型
"", # 分类
"", # 元器件名称
"", # 元器件型号
"", # 元器件批号
columns[5].text_content().strip(), # 生产单位
"", # 是否国产
"", # 元器件成熟度
"", # 晶圆材料
"", # 晶圆批号
"", # 封装材料
"", # 封装技术
"", # 是否倒装
"", # 制造工艺
"", # 工艺特征尺寸
"", # 工艺平台
"", # 工艺代号
"", # 工艺版本
"", # 质量等级
"", # 加固措施
"", # 工作原理
"", # 供货能力
"", # 应用经历
"", # 规范手册
"", # 器件图片
"", # 电子系统分类
"", # 电子系统名称
"", # 电子系统型号
"", # 生产单位
"", # 电子系统功能
"", # 电子系统加固措施
"", # 电子系统图片
"", # 材料名称
"", # 材料型号
"", # 材料组分
"", # 材料用途
"", # 材料生产单位
"", # 材料物理结构
"", # 材料使用经历
"", # 辐照试验大纲
"", # 大纲审核专家类别
"", # 辐照试验所依据的标准规范
"", # 试验步骤(过程)描述
"", # 辐照过程是否加电
"", # 直流偏置条件描述
"", # 交流偏置条件描述
"", # 时钟频率
"", # 测试图形
"", # 其他偏置条件
"", # 辐照偏置原理图
"", # 测试方式
"", # 测试原理图
"", # 试验用仪器名称
"", # 试验用仪器型号
"", # 试验用仪器生产厂家
"", # 试验用仪器检定证书
"", # 试验用软件名称
"", # 试验用软件开发单位
"", # 试验用软件版本号
"", # 试验现场照片
"", # 测试人员姓名
"", # 测试人员单位
"", # 测试人员电话
"", # 装置运行人员
"", # 第三方人员
"", # 第三方人员单位
"", # 第三方人员电话
"", # 其他需要说明的事项
"", # 是否采用铅铝屏蔽
"", # 剂量率
"", # 总剂量
"", # 剂量等效材料
"", # 试验对象编号
"", # 测试参数名称
"", # 测试参数单位
"", # 测试参数结果
"", # 是否为加速试验后数据
"", # 是否为退火数据
"", # 退火温度
"", # 退火时间
"", # 原始数据
"", # 数据处理方法
"", # 其他需要说明的事项
]
# 创建 DataFrame
df = pd.DataFrame([data_row], columns=csv_header)
df.to_excel(xlsx_file_path, index=False)
try:
# 下载文件
file_response = requests.get(file_url)
file_response.raise_for_status()
# 保存文件
file_path = os.path.join(folder_path, os.path.basename(file_url))
with open(file_path, 'wb') as file:
file.write(file_response.content)
print(f"NASA2 Download file: {file_path}")
except requests.RequestException as e:
print(f"NASA2 Download file error: {file_url}error: {e}")
upload_ids = upload_to_minio(nasa2_connection, folder_path, 'NASA')
device_type = columns[4].text_content().strip()
device_name = columns[2].text_content().strip()
device_mode = columns[2].text_content().strip()
device_function = columns[3].text_content().strip()
device_batch = None
manufacturer = None
experiment_date = columns[8].text_content().strip()
origin_data = ','.join([c.text_content().strip() for c in columns])
data_db = [table_id, 'Crawler', datetime.now(), None, None, None,
device_type,
device_name, device_mode,
device_function,
device_batch, manufacturer,
experiment_date,
'NASA', None, None, str(upload_ids),origin_data
]
save_to_db_import_record(nasa2_connection, data_db)
except Exception as e:
print(f"error: {e}")
finally:
# 关闭游标和连接
nasa2_connection.close()
# 输出数据
# for row in table.xpath('.//tr')[1:]:
# columns = row.xpath('.//td')
# print([col.text_content().strip() for col in columns]) # 打印每一行的数据

File diff suppressed because it is too large Load Diff

205
scripts/xx.json Normal file
View File

@@ -0,0 +1,205 @@
{
"ROWS": [
[
"XC4VFX60",
"Virtex IV FPGA 90<39>m CMOS",
"Xilinx",
"10/26/2006;IUCF07MAR;2007JUL",
"M102606_XC4VFX60.pdf;T021607_XC4VFX60.pdf;nsrec07_W27_SEE.pdf;IU032707_XC4VFX60.pdf;nsrec08_W3_SEE.pdf;G07JUL_XC4VFX60_TID.pdf;nsrec08_W2_TID.pdf",
"TID; SEE; SEFI",
"90<39>m CMOS"
],
[
"XC4VLX25",
"Virtex IV FPGA",
"Xilinx",
"TAMU07AUG;IUCF07AUG;IUCF07OCT",
"I032706_LX25_V2.pdf;nsrec08_W3_SEE.pdf",
"SEE;SEL",
"90nm CMOS"
],
[
"XC5VLX30T-1FFG665GU",
"Virtex V FPGA",
"Xilinx",
"TAMU09SEPT;UCD09JUN;IU09AUG",
"D062209_XCVLX30T_na.pdf;nsrec2010_W8_SEE.pdf",
"SEE;SEL;SEU",
"65nm CMOS"
],
[
"XC6SLX16",
"FPGA",
"Xilinx",
"IU10MAR",
"NEPP_DTRA_04062010_Berg.pdf;nsrec2011_W6_SEE.pdf",
"SEE;SEL;SEU",
"45nm CMOS"
],
[
"XC7K325T Kintex7",
"FPGA",
"Xilinx",
"4/5/2014;6/5/2014;12/16/2014;4/10/2015;8/12/2015;2016OctNRL",
"https://nepp.nasa.gov/files/27025/2015-561-OBryan-Final-Paper-NEPPweb-NSREC2015DW-TN36350.pdf;https://nepp.nasa.gov/files/27964/NEPP-CP-2015-Berg-Presentation-SEE-MAPLD-TN23543.pdf;https://nepp.nasa.gov/files/28030/NEPP-CP-2015-Berg-Pres-NEPP-ETW-TN24313.pdf;https://nepp.nasa.gov/files/28239/NEPP-CP-2016-OBryan-Paper-NSREC-SEE-DW-TN35503.pdf;https://nepp.nasa.gov/workshops/etw2016/talks/14TUE/20160614-1330-FPGA-2016-561-Berg-Final-Pres-NEPP-ETW-FPGA_TN32953_v3.pdf;https://nepp.nasa.gov/files/28073/NEPP-CP-2016-Berg-Pres-MRQW-TN29375.pdf;https://nepp.nasa.gov/files/28290/NEPP-CP-2016-Berg-Pres-SEE-MAPLD-Mitigation-TN32695.pdf",
"SEU",
"CMOS"
],
[
"XC7K325T-1FBG900 Kintex K7",
"FPGA",
"Xilinx",
"2016Oct-Nov",
"https://nepp.nasa.gov/files/29000/NEPP-CP-2017-OBryan-NSREC-SEE-DW-Paper-TN44942.pdf;https://nepp.nasa.gov/workshops/etw2017/talks/26-JUN-MON/1100%20-%20ETW_BERG_FPGA_SEU_TESTING_2017_EDAA.pdf;https://nepp.nasa.gov/files/28706/NEPP-CP-2017-Berg-SEE-MAPLD-FPGA-Presentation-TN42793.pdf;https://nepp.nasa.gov/files/28339/NEPP-CP-2016-Berg-Presentation-RADECS-TN35422.pdf;https://nepp.nasa.gov/files/28343/NEPP-CP-2016-Berg-Paper-RADECS-Proc-TN35827.pdf",
"SEU;SEL",
"28nm planar"
],
[
"XCKU040-1LFFVA1156I Kintex-UltraScale",
"FPGA",
"Xilinx",
"10/1/2016(TAMU); 3/1/2017(TAMU); 3/22/2017(TAMU); 12/6/2017(TAMU); 2017(Chicago); 4/29/2018(MGH); 5/1/2018(TAMU); 11/18/2019(LBNL)",
"https://nepp.nasa.gov/docs/tasks/051-Compendium-SEE-TID-DD/NEPP-CP-2019-Topper-NSREC-Paper-TID-SEE-DD-Compendium-NSREC-TN70538.pdf;CP-2018-OBryan-NSREC-SEE-DW-Paper-20205001490.pdf;https://nepp.nasa.gov/files/29000/NEPP-CP-2017-OBryan-NSREC-SEE-DW-Paper-TN44942.pdf;https://nepp.nasa.gov/files/29516/NEPP-TR-2017-Berg-15-061-XCKU040-2FFVA1156-Kintex-UltraScale-TN45195.pdf",
"SEE;SEU;SEFI;SEL",
"20nm CMOS"
],
[
"XCKU040-2FFVA1156E Kintex-UltraScale",
"FPGA",
"Xilinx",
"11/18/2019",
"2020-Topper-NSREC-TID-SEE-Compendium-DW-Paper-20205007136.pdf;https://nepp.nasa.gov/docs/tasks/041-FPGA/NEPP-TR-2019-Berg-TR-15-061-Xilinx-XCKU040-2FFVA1156E-KintexUltraScale-LBNL-2019Nov18-20205007765.pdf",
"SEE",
"FPGA"
],
[
"XFM-5050-UV",
"AlGaN 280 nm LED",
"Luminus",
"2023Aug(UDC)",
"2024-OBryan-NSREC-DW-Compendium-Paper-20240008405.pdf",
"DD",
"Photonics"
],
[
"XPA-II",
"ASIC",
"AMIS",
"VdG2008AUG",
"tid/VdG08AUG_XPAII.pdf;nsrec09_W13_TID.pdf",
"TID",
"0.18µm CMOS"
],
[
"XQR4036XL",
"FPGA",
"Xilinx",
"9/6/1998",
"http://www.klabs.org/richcontent/fpga_content/Xilinx/SEE_Test_XR4036XL.pdf",
"SEE",
"FPGA"
],
[
"XQV5FX70T",
"FPGA",
"Xilinx",
"12/16/2014",
"https://nepp.nasa.gov/files/27025/2015-561-OBryan-Final-Paper-NEPPweb-NSREC2015DW-TN36350.pdf;https://nepp.nasa.gov/files/27964/NEPP-CP-2015-Berg-Presentation-SEE-MAPLD-TN23543.pdf;https://nepp.nasa.gov/files/28030/NEPP-CP-2015-Berg-Pres-NEPP-ETW-TN24313.pdf",
"SEE",
"CMOS"
],
[
"XQVR300",
"FPGA",
"Xilinx",
"10/28/2000",
"http://rk.gsfc.nasa.gov/richcontent/papers/Xilinx/Xilinx_NSREC2000.pdf",
"TID;SEL;SEU",
"FPGA"
],
[
"Xilinx SIRF Test Transistors",
"Test Transistors",
"Xilinx",
"VdG2008JUN",
"tid/VdG08JUN_Xilinx_SIRF.pdf;nsrec09_W13_TID.pdf",
"TID",
"Transistor"
],
[
"ZQ04031",
"32kx8 SRAM",
"Elmo/Hitachi",
"11/7/1991",
"tid/PPM-91-702.pdf",
"TID",
"Memory"
],
[
"ZT-6500",
"CPCI Pentium Processor",
"Ziatech",
"9/1/1997",
"NSREC99.pdf",
"SEE",
"Board"
],
[
"ZYNQ XC7Z020-1CLG400C",
"FPGA and ARM Processor on TUL PYNQ-Z2 Board",
"Xilinx",
"8/19/2023(MGH)",
"2024-OBryan-NSREC-DW-Compendium-Paper-20240008405.pdf;https://nepp.nasa.gov/docs/tasks/065-GPU-Devices/NEPP-NASA-TM-20-004-Xilinx-ZYNQ-XC7Z020-1CLG400C-SEE-Test-Report-MGH-2023Aug-20230013162.pdf",
"SEE",
"CMOS"
],
[
"i3-5005U Broadwell 5th Gen Core™",
"Processor",
"Intel",
"2015MGH;TRIUMF;HUPTI;Scripps;2015AugTAMU;2015DecTAMU;2016MayTAMU",
"https://nepp.nasa.gov/files/28239/NEPP-CP-2016-OBryan-Paper-NSREC-SEE-DW-TN35503.pdf;https://nepp.nasa.gov/files/28007/NEPP-CP-2015-Szabo-Paper-DW-TN24989.pdf",
"Proton Facility Evaluation",
"14nm Gen 5 CMOS and FinFET"
],
[
"i3-6100 Skylake 6th Gen Core™",
"Processor",
"Intel",
"2015Dec",
"https://nepp.nasa.gov/files/28239/NEPP-CP-2016-OBryan-Paper-NSREC-SEE-DW-TN35503.pdf",
"Proton Facility Evaluation",
"14nm Gen 6 CMOS and FinFET"
],
[
"i3-6100T Skylake 6th Gen Core™",
"Processor",
"Intel",
"2016MayTAMU;2016MayScripps",
"https://nepp.nasa.gov/files/28239/NEPP-CP-2016-OBryan-Paper-NSREC-SEE-DW-TN35503.pdf",
"Proton Facility Evaluation",
"14nm Gen 6 CMOS and FinFET"
],
[
"i5-6600K Skylake 6th Gen Core™",
"Processor",
"Intel",
"2015NovTRIUMF",
"https://nepp.nasa.gov/files/28239/NEPP-CP-2016-OBryan-Paper-NSREC-SEE-DW-TN35503.pdf",
"Proton Facility Evaluation",
"14nm Gen 6 CMOS and FinFET"
],
[
"v1202b",
"CPU",
"AMD",
"5/28/2022",
"https://nepp.nasa.gov/docs/tasks/051-Compendium-SEE-TID-DD/NEPP-CP-2023-OBryan-Paper-NSREC-DW-Compendium-SEE-TID-20230009904.pdf;https://nepp.nasa.gov/docs/tasks/065-GPU-Devices/2022-Wyrwas-NASA-TM-20-005-AMD-v1202b-SoC-Proton-Test-Report-20230000488.pdf",
"SEE",
"CMOS"
]
],
"PAGE": 1,
"TOTAL": 1,
"RECORDS": 1768
}