package jnpf.limsController;
|
|
import io.swagger.v3.oas.annotations.Operation;
|
import io.swagger.v3.oas.annotations.tags.Tag;
|
import jnpf.exception.DataException;
|
import jnpf.limsEntity.LimsHuanjingCaiyangdianVo;
|
import jnpf.limsEntity.LimsHuanjingJianceActionParam;
|
import jnpf.limsEntity.LimsHuanjingJianceKanbanItemVo;
|
import jnpf.limsEntity.LimsHuanjingJianceKanbanRowVo;
|
import jnpf.limsEntity.LimsHuanjingJianceQushiDataVo;
|
import jnpf.limsEntity.LimsHuanjingJianceQushiParam;
|
import jnpf.limsEntity.LimsHuanjingJianceQuyangParam;
|
import jnpf.limsEntity.LimsHuanjingJianceJiluEntity;
|
import jnpf.limsEntity.LimsSignEntity;
|
import jnpf.limsEntity.LimsSignUsageTarget;
|
import jnpf.limsEntity.SignOpType;
|
import jnpf.limsService.LimsHuanjingJianceService;
|
import jnpf.limsService.LimsSignService;
|
import jnpf.util.R;
|
import lombok.extern.slf4j.Slf4j;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.format.annotation.DateTimeFormat;
|
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.util.StringUtils;
|
import org.springframework.web.bind.annotation.DeleteMapping;
|
import org.springframework.web.bind.annotation.GetMapping;
|
import org.springframework.web.bind.annotation.PathVariable;
|
import org.springframework.web.bind.annotation.PostMapping;
|
import org.springframework.web.bind.annotation.RequestBody;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
import org.springframework.web.bind.annotation.RequestParam;
|
import org.springframework.web.bind.annotation.RestController;
|
|
import java.time.LocalDate;
|
import java.time.LocalTime;
|
import java.time.ZoneId;
|
import java.time.format.DateTimeParseException;
|
import java.util.ArrayList;
|
import java.util.Collections;
|
import java.util.Date;
|
import java.util.List;
|
|
@Slf4j
|
@Tag(name = "lims环境监测接口", description = "环境监测采样点 / 计划操作")
|
@RestController
|
@RequestMapping("/lims/biz/huanjing/jiance")
|
public class LimsHuanjingJianceController {
|
|
@Autowired
|
private LimsHuanjingJianceService limsHuanjingJianceService;
|
@Autowired
|
private LimsSignService limsSignService;
|
|
/**
|
* 查询采样点。
|
*
|
* <p>前端传入的 {@code jiance_quyu_id} 为 lims_huanjing_quyu.f_id;
|
* lims_huanjing_caiyangdian 实际用 jiance_quyu 字段保存该区域主键。
|
*/
|
@Operation(summary = "查询采样点")
|
@GetMapping("/caiyangdian/list")
|
public R<List<LimsHuanjingCaiyangdianVo>> listCaiyangdian(
|
@RequestParam("jiance_quyu_id") String jianceQuyuId,
|
@RequestParam(value = "jiejing_jibie", required = false) String jiejingJibie) {
|
if (!StringUtils.hasText(jianceQuyuId)) {
|
return R.error("检测区域ID不能为空");
|
}
|
|
String jibie = StringUtils.hasText(jiejingJibie) ? jiejingJibie.trim() : null;
|
return R.success(limsHuanjingJianceService.listCaiyangdian(jianceQuyuId.trim(), jibie));
|
}
|
|
/**
|
* 环境监测计划看板行。
|
*/
|
@Operation(summary = "环境监测计划看板行")
|
@GetMapping("/kanban/rows")
|
public R<List<LimsHuanjingJianceKanbanRowVo>> listKanbanRows(
|
@RequestParam(value = "jiance_quyu", required = false) String jianceQuyu,
|
@RequestParam(value = "weizhi_bianhao", required = false) String weizhiBianhao,
|
@RequestParam(value = "jiejing_jibie", required = false) String jiejingJibie) {
|
return R.success(limsHuanjingJianceService.listKanbanRows(
|
trimToNull(jianceQuyu),
|
trimToNull(weizhiBianhao),
|
trimToNull(jiejingJibie)));
|
}
|
|
/**
|
* 环境监测计划看板日历项。
|
*/
|
@Operation(summary = "环境监测计划看板日历项")
|
@GetMapping("/kanban/items")
|
public R<List<LimsHuanjingJianceKanbanItemVo>> listKanbanItems(
|
@RequestParam("start_date") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate startDate,
|
@RequestParam("end_date") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate endDate,
|
@RequestParam(value = "jiance_quyu", required = false) String jianceQuyu,
|
@RequestParam(value = "weizhi_bianhao", required = false) String weizhiBianhao,
|
@RequestParam(value = "jiejing_jibie", required = false) String jiejingJibie) {
|
if (startDate == null || endDate == null) {
|
return R.error("日期范围不能为空");
|
}
|
if (startDate.isAfter(endDate)) {
|
return R.error("开始日期不能大于结束日期");
|
}
|
|
ZoneId zoneId = ZoneId.systemDefault();
|
Date start = Date.from(startDate.atStartOfDay(zoneId).toInstant());
|
Date end = Date.from(endDate.atTime(LocalTime.MAX).atZone(zoneId).toInstant());
|
return R.success(limsHuanjingJianceService.listKanbanItems(
|
start,
|
end,
|
trimToNull(jianceQuyu),
|
trimToNull(weizhiBianhao),
|
trimToNull(jiejingJibie)));
|
}
|
|
/**
|
* 删除环境监测计划看板记录子项。
|
*/
|
@Operation(summary = "删除环境监测计划看板记录子项")
|
@DeleteMapping("/kanban/zixiang/{id}")
|
public R<String> deleteKanbanZixiang(@PathVariable("id") String id) {
|
if (!StringUtils.hasText(id)) {
|
return R.error("记录子项ID不能为空");
|
}
|
try {
|
int affected = limsHuanjingJianceService.deleteKanbanZixiang(id.trim());
|
if (affected <= 0) {
|
return R.error("环境监测记录子项不存在");
|
}
|
return R.success("删除成功");
|
} catch (DataException e) {
|
return R.error(e.getMessage());
|
}
|
}
|
|
/**
|
* 环境监测趋势分析数据。
|
*/
|
@Operation(summary = "环境监测趋势分析数据")
|
@PostMapping("/qushi/data")
|
public R<LimsHuanjingJianceQushiDataVo> getQushiData(@RequestBody LimsHuanjingJianceQushiParam param) {
|
if (param == null) {
|
return R.error("请求参数不能为空");
|
}
|
if (!StringUtils.hasText(param.getStartDate()) || !StringUtils.hasText(param.getEndDate())) {
|
return R.error("日期范围不能为空");
|
}
|
if (!StringUtils.hasText(param.getJianceQuyu())) {
|
return R.error("区域不能为空");
|
}
|
if (!StringUtils.hasText(param.getJiejingJibie())) {
|
return R.error("洁净级别不能为空");
|
}
|
if (!StringUtils.hasText(param.getWeizhiBianhao())) {
|
return R.error("房间编号不能为空");
|
}
|
if (!StringUtils.hasText(param.getJiancePinci())) {
|
return R.error("监测频次不能为空");
|
}
|
if (param.getJianceXiangmu() == null || param.getJianceXiangmu().isEmpty()) {
|
return R.error("监测项目不能为空");
|
}
|
if (!StringUtils.hasText(param.getJianceZhuangtai())) {
|
return R.error("监测状态不能为空");
|
}
|
|
LocalDate startDate;
|
LocalDate endDate;
|
try {
|
startDate = LocalDate.parse(param.getStartDate().trim());
|
endDate = LocalDate.parse(param.getEndDate().trim());
|
} catch (DateTimeParseException e) {
|
return R.error("日期格式不正确");
|
}
|
if (startDate.isAfter(endDate)) {
|
return R.error("开始日期不能大于结束日期");
|
}
|
|
List<String> jianceXiangmu = new ArrayList<>();
|
for (String item : param.getJianceXiangmu()) {
|
if (StringUtils.hasText(item)) {
|
jianceXiangmu.add(item.trim());
|
}
|
}
|
if (jianceXiangmu.isEmpty()) {
|
return R.error("监测项目不能为空");
|
}
|
|
ZoneId zoneId = ZoneId.systemDefault();
|
Date start = Date.from(startDate.atStartOfDay(zoneId).toInstant());
|
Date end = Date.from(endDate.atTime(LocalTime.MAX).atZone(zoneId).toInstant());
|
return R.success(limsHuanjingJianceService.listQushiData(
|
start,
|
end,
|
param.getJianceQuyu().trim(),
|
param.getJiejingJibie().trim(),
|
param.getWeizhiBianhao().trim(),
|
param.getJiancePinci().trim(),
|
jianceXiangmu,
|
param.getJianceZhuangtai().trim()));
|
}
|
|
/**
|
* 环境监测计划操作。
|
*/
|
@Operation(summary = "环境监测计划操作")
|
@PostMapping("/jihua/action")
|
public R<String> jianceJihuaAction(@RequestBody LimsHuanjingJianceActionParam param) {
|
if (param == null) {
|
return R.error("请求参数不能为空");
|
}
|
|
String action = param.getAction();
|
String flowId = param.getFlowId();
|
String taskId = param.getTaskId();
|
|
if (!StringUtils.hasText(action)) {
|
return R.error("缺少 action");
|
}
|
action = action.trim();
|
if (!StringUtils.hasText(flowId)) {
|
return R.error("流程id(flow_id)不能为空");
|
}
|
if (!StringUtils.hasText(taskId)) {
|
return R.error("流程任务id(task_id)不能为空");
|
}
|
|
switch (action) {
|
case "accept":
|
int affected = limsHuanjingJianceService.acceptJianceJihua(flowId.trim(), taskId.trim());
|
if (affected <= 0) {
|
return R.error("环境监测计划数据不存在");
|
}
|
return R.success("启用成功");
|
case "terminate":
|
int terminated = limsHuanjingJianceService.terminateJianceJihua(flowId.trim(), taskId.trim());
|
if (terminated <= 0) {
|
return R.error("环境监测计划数据不存在");
|
}
|
return R.success("终止成功");
|
default:
|
return R.error("不支持的操作: " + action);
|
}
|
}
|
|
/**
|
* 环境监测报告操作。
|
*/
|
@Operation(summary = "环境监测报告操作")
|
@PostMapping("/baogao/action")
|
public R<String> baogaoAction(@RequestBody LimsHuanjingJianceActionParam param) {
|
if (param == null) {
|
return R.error("请求参数不能为空");
|
}
|
|
String action = param.getAction();
|
String flowId = param.getFlowId();
|
String taskId = param.getTaskId();
|
|
if (!StringUtils.hasText(action)) {
|
return R.error("缺少 action");
|
}
|
action = action.trim();
|
if (!StringUtils.hasText(flowId)) {
|
return R.error("流程id(flow_id)不能为空");
|
}
|
if (!StringUtils.hasText(taskId)) {
|
return R.error("流程任务id(task_id)不能为空");
|
}
|
if (!"submit".equals(action) && !"accept".equals(action) && !"reject".equals(action)) {
|
return R.error("不支持的操作: " + action);
|
}
|
|
int affected = limsHuanjingJianceService.baogaoAction(flowId.trim(), taskId.trim(), action);
|
if (affected <= 0) {
|
return R.error("环境监测报告数据不存在");
|
}
|
return R.success("操作成功");
|
}
|
|
/**
|
* 环境监测记录取样。
|
*/
|
@Transactional(rollbackFor = Exception.class)
|
@Operation(summary = "环境监测记录取样")
|
@PostMapping("/jilu/quyang")
|
public R<String> quyangJilu(@RequestBody LimsHuanjingJianceQuyangParam param) {
|
if (param == null) {
|
return R.error("请求参数不能为空");
|
}
|
if (!StringUtils.hasText(param.getJiluId())) {
|
return R.error("环境监测记录ID不能为空");
|
}
|
if (!StringUtils.hasText(param.getBizSign())) {
|
return R.error("请添加电子签名");
|
}
|
|
String jiluId = param.getJiluId().trim();
|
String bizSign = param.getBizSign().trim();
|
LimsHuanjingJianceJiluEntity jilu = limsHuanjingJianceService.findJiluById(jiluId);
|
if (jilu == null) {
|
return R.error("环境监测记录数据不存在");
|
}
|
LimsSignEntity sign;
|
try {
|
sign = limsSignService.requireValidSign(
|
bizSign, SignOpType.HUANJING_QUYANG, jiluId);
|
} catch (DataException e) {
|
return R.error(e.getMessage());
|
}
|
int affected = limsHuanjingJianceService.quyangJilu(jiluId, bizSign);
|
if (affected <= 0) {
|
return R.error("环境监测记录数据不存在");
|
}
|
recordHuanjingSignUsage(sign, SignOpType.HUANJING_QUYANG, jilu);
|
return R.success("取样成功");
|
}
|
|
/**
|
* 环境监测记录终止取样。
|
*/
|
@Transactional(rollbackFor = Exception.class)
|
@Operation(summary = "环境监测记录终止取样")
|
@PostMapping("/jilu/quyang/terminate")
|
public R<String> terminateQuyangJilu(@RequestBody LimsHuanjingJianceQuyangParam param) {
|
if (param == null) {
|
return R.error("请求参数不能为空");
|
}
|
if (!StringUtils.hasText(param.getJiluId())) {
|
return R.error("环境监测记录ID不能为空");
|
}
|
if (!StringUtils.hasText(param.getBizSign())) {
|
return R.error("请添加电子签名");
|
}
|
|
String jiluId = param.getJiluId().trim();
|
String bizSign = param.getBizSign().trim();
|
LimsHuanjingJianceJiluEntity jilu = limsHuanjingJianceService.findJiluById(jiluId);
|
if (jilu == null) {
|
return R.error("环境监测记录数据不存在");
|
}
|
LimsSignEntity sign;
|
try {
|
sign = limsSignService.requireValidSign(
|
bizSign, SignOpType.HUANJING_QUYANG_TERMINATE, jiluId);
|
} catch (DataException e) {
|
return R.error(e.getMessage());
|
}
|
int affected = limsHuanjingJianceService.terminateQuyangJilu(jiluId, bizSign);
|
if (affected <= 0) {
|
return R.error("环境监测记录数据不存在");
|
}
|
recordHuanjingSignUsage(sign, SignOpType.HUANJING_QUYANG_TERMINATE, jilu);
|
return R.success("终止取样成功");
|
}
|
|
private String trimToNull(String value) {
|
return StringUtils.hasText(value) ? value.trim() : null;
|
}
|
|
private void recordHuanjingSignUsage(LimsSignEntity sign,
|
SignOpType opType,
|
LimsHuanjingJianceJiluEntity jilu) {
|
String bizCode = StringUtils.hasText(jilu.getJihuaMingcheng())
|
? jilu.getJihuaMingcheng().trim()
|
: (StringUtils.hasText(jilu.getJihuaId()) ? jilu.getJihuaId().trim() : jilu.getId());
|
LimsSignUsageTarget target = LimsSignUsageTarget.builder()
|
.targetTable("lims_huanjing_jiance_jilu")
|
.targetId(jilu.getId())
|
.bizType("HUANJING_JIANCE")
|
.bizModule("LIMS-环境监测")
|
.bizCode(bizCode)
|
.build();
|
limsSignService.recordSignUsage(sign, opType,
|
Collections.singletonList(jilu.getId()), Collections.singletonList(target));
|
}
|
}
|