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;
/**
* 查询采样点。
*
*
前端传入的 {@code jiance_quyu_id} 为 lims_huanjing_quyu.f_id;
* lims_huanjing_caiyangdian 实际用 jiance_quyu 字段保存该区域主键。
*/
@Operation(summary = "查询采样点")
@GetMapping("/caiyangdian/list")
public R> 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> 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> 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 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 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 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 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 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 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 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));
}
}