package jnpf.elnController; import com.baomidou.mybatisplus.core.metadata.IPage; import io.swagger.v3.oas.annotations.tags.Tag; import jnpf.base.ActionResult; import jnpf.base.vo.PageListVO; import jnpf.base.vo.PaginationVO; import jnpf.elnEntity.formula.ElnFormulaForms; import jnpf.elnEntity.formula.ElnFormulaVos; import jnpf.elnFormula.FormulaFunction; import jnpf.elnService.formula.ElnFormulaCatalogService; import jnpf.elnService.formula.FormulaPreviewService; import jnpf.elnService.formula.FormulaValidationService; import lombok.RequiredArgsConstructor; import org.springframework.util.StringUtils; 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.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.List; @Tag(name = "ELN公式目录") @RestController @RequestMapping("/formulaCatalog") @RequiredArgsConstructor public class ElnFormulaCatalogController { private final ElnFormulaCatalogService catalogService; private final FormulaPreviewService previewService; @GetMapping public ActionResult> list(ElnFormulaForms.Query query) { if (query == null || query.getCurrentPage() < 1 || query.getPageSize() < 1) { return ActionResult.fail("分页参数必须大于 0"); } query.setKeyword(trim(query.getKeyword())); query.setBizEnabled(trim(query.getBizEnabled())); IPage page = catalogService.page(query); PageListVO result = new PageListVO<>(); result.setList(page.getRecords()); PaginationVO pagination = new PaginationVO(); pagination.setCurrentPage(page.getCurrent()); pagination.setPageSize(page.getSize()); pagination.setTotal(Math.toIntExact(page.getTotal())); result.setPagination(pagination); return ActionResult.success(result); } @PostMapping public ActionResult create( @RequestBody(required = false) ElnFormulaForms.Create form) { if (form == null) { return ActionResult.fail("公式信息不能为空"); } trimDefinition(form); trimRule(form); return ActionResult.success(catalogService.create(form)); } @PostMapping("/drafts") public ActionResult createDraft( @RequestBody(required = false) ElnFormulaForms.CreateDraft form) { if (form == null) { return ActionResult.fail("公式草稿信息不能为空"); } trimDefinition(form); trimParameters(form.getParameters()); return ActionResult.success(catalogService.createDraft(form)); } @GetMapping("/{id}") public ActionResult detail(@PathVariable("id") String id) { if (!StringUtils.hasText(id)) { return ActionResult.fail("公式 id 不能为空"); } return ActionResult.success(catalogService.detail(id.trim())); } @GetMapping("/{id}/templateReferences") public ActionResult> templateReferences( @PathVariable("id") String id, ElnFormulaForms.ReferenceQuery query) { if (!StringUtils.hasText(id) || query == null || query.getCurrentPage() < 1 || query.getPageSize() < 1) { return ActionResult.fail("公式 id 不能为空且分页参数必须大于 0"); } query.setKeyword(trim(query.getKeyword())); IPage page = catalogService.pageTemplateReferences(id.trim(), query); PageListVO result = new PageListVO<>(); result.setList(page.getRecords()); PaginationVO pagination = new PaginationVO(); pagination.setCurrentPage(page.getCurrent()); pagination.setPageSize(page.getSize()); pagination.setTotal(Math.toIntExact(page.getTotal())); result.setPagination(pagination); return ActionResult.success(result); } @PutMapping("/{id}") public ActionResult updateDefinition( @PathVariable("id") String id, @RequestBody(required = false) ElnFormulaForms.UpdateDefinition form) { if (!StringUtils.hasText(id) || form == null) { return ActionResult.fail("公式 id 和公式信息不能为空"); } trimDefinition(form); return ActionResult.success(catalogService.updateDefinition(id.trim(), form)); } @GetMapping("/functions") public ActionResult> functions() { return ActionResult.success(previewService.functions()); } @PostMapping("/validate") public ActionResult validate( @RequestBody(required = false) ElnFormulaForms.Validate form) { if (form == null) { return ActionResult.fail("公式校验内容不能为空"); } trimRule(form); return ActionResult.success(previewService.validate(form)); } @PostMapping("/preview") public ActionResult preview( @RequestBody(required = false) ElnFormulaForms.Preview form) { if (form == null) { return ActionResult.fail("公式试算内容不能为空"); } trimRule(form); return ActionResult.success(previewService.preview(form)); } @PostMapping("/{id}/versions") public ActionResult createVersion( @PathVariable("id") String id, @RequestBody(required = false) ElnFormulaForms.CreateVersion form) { if (!StringUtils.hasText(id) || form == null) { return ActionResult.fail("公式 id 和版本信息不能为空"); } form.setSourceVersionId(trim(form.getSourceVersionId())); return ActionResult.success(catalogService.createVersion(id.trim(), form)); } @PutMapping("/versions/{versionId}") public ActionResult updateVersion( @PathVariable("versionId") String versionId, @RequestBody(required = false) ElnFormulaForms.UpdateVersion form) { if (!StringUtils.hasText(versionId) || form == null) { return ActionResult.fail("公式版本 id 和版本信息不能为空"); } trimRule(form); return ActionResult.success(catalogService.updateDraft(versionId.trim(), form)); } @PostMapping("/versions/{versionId}/preRelease") public ActionResult preRelease(@PathVariable("versionId") String versionId) { if (!StringUtils.hasText(versionId)) { return ActionResult.fail("公式版本 id 不能为空"); } catalogService.preRelease(versionId.trim()); return ActionResult.success(); } @PostMapping("/versions/{versionId}/publish") public ActionResult publish(@PathVariable("versionId") String versionId) { if (!StringUtils.hasText(versionId)) { return ActionResult.fail("公式版本 id 不能为空"); } catalogService.publish(versionId.trim()); return ActionResult.success(); } @PostMapping("/versions/{versionId}/cancel") public ActionResult cancel( @PathVariable("versionId") String versionId, @RequestBody(required = false) ElnFormulaForms.Reason form) { if (!StringUtils.hasText(versionId) || !hasReason(form)) { return ActionResult.fail("公式版本 id 和操作原因不能为空"); } catalogService.cancel(versionId.trim(), form.getReason().trim()); return ActionResult.success(); } @PostMapping("/{id}/currentVersion") public ActionResult switchCurrent( @PathVariable("id") String id, @RequestBody(required = false) ElnFormulaForms.SwitchCurrent form) { if (!StringUtils.hasText(id) || form == null || !StringUtils.hasText(form.getVersionId()) || !StringUtils.hasText(form.getReason())) { return ActionResult.fail("公式 id、版本 id 和操作原因不能为空"); } catalogService.switchCurrent(id.trim(), form.getVersionId().trim(), form.getReason().trim()); return ActionResult.success(); } @PostMapping("/{id}/enable") public ActionResult enable(@PathVariable("id") String id, @RequestBody(required = false) ElnFormulaForms.Reason form) { return changeEnabled(id, form, true); } @PostMapping("/{id}/disable") public ActionResult disable(@PathVariable("id") String id, @RequestBody(required = false) ElnFormulaForms.Reason form) { return changeEnabled(id, form, false); } private ActionResult changeEnabled(String id, ElnFormulaForms.Reason form, boolean enabled) { if (!StringUtils.hasText(id) || !hasReason(form)) { return ActionResult.fail("公式 id 和操作原因不能为空"); } if (enabled) { catalogService.enable(id.trim(), form.getReason().trim()); } else { catalogService.disable(id.trim(), form.getReason().trim()); } return ActionResult.success(); } private static void trimDefinition(ElnFormulaForms.Create form) { form.setGongshiMingcheng(trim(form.getGongshiMingcheng())); form.setYewuYongtu(trim(form.getYewuYongtu())); form.setBeizhu(trim(form.getBeizhu())); } private static void trimDefinition(ElnFormulaForms.UpdateDefinition form) { form.setGongshiMingcheng(trim(form.getGongshiMingcheng())); form.setYewuYongtu(trim(form.getYewuYongtu())); form.setBeizhu(trim(form.getBeizhu())); } private static void trimDefinition(ElnFormulaForms.CreateDraft form) { form.setGongshiMingcheng(trim(form.getGongshiMingcheng())); form.setYewuYongtu(trim(form.getYewuYongtu())); form.setBeizhu(trim(form.getBeizhu())); } private static void trimRule(ElnFormulaForms.VersionRule form) { form.setBiaodashi(trim(form.getBiaodashi())); form.setJieguoLeixing(trim(form.getJieguoLeixing())); form.setXiuyueMoshi(trim(form.getXiuyueMoshi())); trimParameters(form.getParameters()); } private static void trimParameters(List parameters) { if (parameters == null) return; for (ElnFormulaForms.Parameter parameter : parameters) { if (parameter == null) { continue; } parameter.setId(trim(parameter.getId())); parameter.setCanshuBianma(trim(parameter.getCanshuBianma())); parameter.setCanshuMingcheng(trim(parameter.getCanshuMingcheng())); parameter.setShujuLeixing(trim(parameter.getShujuLeixing())); parameter.setDanwei(trim(parameter.getDanwei())); } } private static boolean hasReason(ElnFormulaForms.Reason form) { return form != null && StringUtils.hasText(form.getReason()); } private static String trim(String value) { return value == null ? null : value.trim(); } }