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)); } }