diff --git a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/basic/pojo/entity/BsAssignEntity.java b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/basic/pojo/entity/BsAssignEntity.java index 6cc07621..4e741f0a 100644 --- a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/basic/pojo/entity/BsAssignEntity.java +++ b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/basic/pojo/entity/BsAssignEntity.java @@ -29,6 +29,7 @@ import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; +import org.springblade.core.mp.base.BaseEntity; import org.springblade.core.tenant.mp.TenantEntity; import java.io.Serial; @@ -44,7 +45,7 @@ import java.math.BigDecimal; @TableName("BS_ASSIGN") @Schema(description = "BsAssign对象") @EqualsAndHashCode(callSuper = true) -public class BsAssignEntity extends TenantEntity { +public class BsAssignEntity extends BaseEntity { @Serial private static final long serialVersionUID = 1L; diff --git a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/pojo/vo/LiquidTankTaskVO.java b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/pojo/vo/LiquidTankTaskVO.java index 0e40800d..e07659a4 100644 --- a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/pojo/vo/LiquidTankTaskVO.java +++ b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/pojo/vo/LiquidTankTaskVO.java @@ -77,6 +77,9 @@ public class LiquidTankTaskVO extends LiquidTankTask { @Schema(description = "药品计算公式(报告) 加药量[计算公式] 公式内容") private String reportFormulaContent; + //加药量计算公式 + private String addFormulaContent; + @Schema(description = "药品计算公式(报告) 理论值加药量[计算公式] 公式内容") private String afterFormulaContent; diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/controller/BsAssignController.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/controller/BsAssignController.java index 1278fa03..df75f5ac 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/controller/BsAssignController.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/controller/BsAssignController.java @@ -61,6 +61,7 @@ import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; +import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -131,10 +132,8 @@ public class BsAssignController extends BladeController { @ApiOperationSupport(order = 31) @Operation(summary = "新增批量", description = "BsAssignEntity List") public R saveBat(@Valid @RequestBody List addList) { -// addList.forEach(one -> { -// one.setId(null); -// }); - return R.status(bsAssignService.saveOrUpdateBatch(addList)); + R result = bsAssignService.saveBat(addList); + return result; } @@ -199,46 +198,14 @@ public class BsAssignController extends BladeController { @ApiOperationSupport(order = 72) @Operation(summary = "导入Excel", description = "MultipartFile") public R importExcel(@RequestParam("file") MultipartFile file) { - List noticeList = new ArrayList<>(); - List list = ExcelUtil.read(file, BsAssignExcel.class); - list.forEach(noticeExcel -> { - - BsAssignEntity notice = BeanUtil.copy(noticeExcel, BsAssignEntity.class); - - //工艺能力 - QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.eq("CA_NAME",noticeExcel.getCraftAbility()); - List crafs = craftAbilityService.list(queryWrapper); - if(null != crafs && crafs.size() > 0){ - notice.setCraftAbilityId(crafs.get(0).getId()); - } - - - //外协厂商 - QueryWrapper queryWrapperoem = new QueryWrapper<>(); - queryWrapperoem.eq("OC_NAME",noticeExcel.getOemName()); - List oems = service.list(queryWrapperoem); - if(null != oems && oems.size() > 0){ - notice.setOemId(oems.get(0).getId()); - } - - //作业中心 - QueryWrapper queryWrappercenter = new QueryWrapper<>(); - queryWrappercenter.eq("WC_NAME",noticeExcel.getOemName()); - List centers = centerService.list(queryWrappercenter); - if(null != centers && centers.size() > 0){ - notice.setCenterId(oems.get(0).getId()); - } - - //指定类型 - String category = DictCache.getKey("AssignPoint", noticeExcel.getPointTypeName()); - notice.setPointType(category); - //限制类型 - String categorylimit = DictCache.getKey("AssignLimit", noticeExcel.getLimitTypeName()); - notice.setLimitType(categorylimit); - noticeList.add(notice); - }); - return R.data(bsAssignService.saveBatch(noticeList)); + + List listexcel = ExcelUtil.read(file, BsAssignExcel.class); + + R result = bsAssignService.importExcel(listexcel); + return result; + + + } } diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/IBsAssignService.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/IBsAssignService.java index aea2cca8..d0da5f53 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/IBsAssignService.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/IBsAssignService.java @@ -27,10 +27,13 @@ package org.springblade.desk.basic.service; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.metadata.IPage; +import jakarta.validation.Valid; import org.springblade.core.mp.base.BaseService; +import org.springblade.core.tool.api.R; import org.springblade.desk.basic.excel.BsAssignExcel; import org.springblade.desk.basic.pojo.entity.BsAssignEntity; import org.springblade.desk.basic.pojo.vo.BsAssignVO; +import org.springframework.web.bind.annotation.RequestBody; import java.util.List; @@ -51,6 +54,8 @@ public interface IBsAssignService extends BaseService { */ IPage selectBsAssignPage(IPage page, BsAssignVO bsAssign); + public R saveBat(List addList); + public R importExcel(List addList); /** * 导出数据 diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/impl/BsAssignServiceImpl.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/impl/BsAssignServiceImpl.java index 78ef9784..d361b948 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/impl/BsAssignServiceImpl.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/impl/BsAssignServiceImpl.java @@ -26,15 +26,28 @@ package org.springblade.desk.basic.service.impl; import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; +import jakarta.annotation.Resource; import org.springblade.core.mp.base.BaseServiceImpl; +import org.springblade.core.tool.api.R; +import org.springblade.core.tool.utils.BeanUtil; import org.springblade.desk.basic.excel.BsAssignExcel; import org.springblade.desk.basic.mapper.BsAssignMapper; import org.springblade.desk.basic.pojo.entity.BsAssignEntity; +import org.springblade.desk.basic.pojo.entity.Oem; +import org.springblade.desk.basic.pojo.entity.WorkCenter; import org.springblade.desk.basic.pojo.vo.BsAssignVO; import org.springblade.desk.basic.service.IBsAssignService; +import org.springblade.desk.basic.service.ICraftAbilityService; +import org.springblade.desk.basic.service.IOemService; +import org.springblade.desk.basic.service.IWorkCenterService; +import org.springblade.scheduling.pojo.entity.CraftAbilityEntity; +import org.springblade.system.cache.DictCache; import org.springframework.stereotype.Service; +import java.math.BigDecimal; +import java.util.ArrayList; import java.util.List; /** @@ -45,12 +58,243 @@ import java.util.List; */ @Service public class BsAssignServiceImpl extends BaseServiceImpl implements IBsAssignService { - + @Resource + private ICraftAbilityService craftAbilityService; + @Resource + private IOemService service; + @Resource + private IWorkCenterService centerService; @Override public IPage selectBsAssignPage(IPage page, BsAssignVO bsAssign) { return page.setRecords(baseMapper.selectBsAssignPage(page, bsAssign)); } + @Override + public R saveBat(List addList) { + for (BsAssignEntity current : addList) { + // 获取当前数据的单面积上限 + BigDecimal currentUpperArea = current.getUpArea(); + // 获取当前数据的单面积下限 + BigDecimal currentLowArea = current.getLowArea(); + //单批面积上限 + BigDecimal singleUpArea = current.getSingleUpArea(); + //单批面积下限 + BigDecimal singleLowArea = current.getSingleDownArea(); + if(currentUpperArea.compareTo(currentLowArea) < 0){ + return R.fail("单面积上限不能小于单面积下限"); + } + if(singleUpArea.compareTo(singleLowArea) < 0){ + return R.fail("单批面积上限不能小于单批面积下限"); + } + } + + + List all = new ArrayList<>(); + + List list = this.list(); + all.addAll(list); + all.addAll(addList); + boolean foundMatch = false; + // 2. 存储已遍历过的数据(用于区间匹配) + List traversedList = new ArrayList<>(); + for (BsAssignEntity current : all) { + // 获取当前数据的单面积上限 + BigDecimal currentUpperArea = current.getUpArea(); + // 获取当前数据的单面积下限 + BigDecimal currentLowArea = current.getLowArea(); + //单批面积上限 + BigDecimal singleUpArea = current.getSingleUpArea(); + //单批面积下限 + BigDecimal singleLowArea = current.getSingleDownArea(); + + // 检查当前数据的上限是否在已遍历数据的任意区间内 + for (BsAssignEntity traversed : traversedList) { + BigDecimal traversedLowerArea = traversed.getLowArea(); + BigDecimal traversedUpperArea = traversed.getUpArea(); + + //单批面积上限 + BigDecimal traversedSingleUpArea = traversed.getSingleUpArea(); + //单批面积下限 + BigDecimal traversedSingleLowArea = traversed.getSingleDownArea(); + // 核心判断:当前上限 是否在 已遍历数据的[下限, 上限]区间内 + if((currentLowArea.compareTo(traversedLowerArea)>=0 && currentLowArea.compareTo(traversedUpperArea)<=0) + && (currentUpperArea.compareTo(traversedLowerArea)>=0 && currentUpperArea.compareTo(traversedUpperArea)<=0)){ +// if (currentUpperArea >= traversedLowerArea && currentUpperArea <= traversedUpperArea) { +// System.out.printf( +// "触发退出条件!当前数据%s的上限%.1f,落在已遍历数据%s的区间[%.1f, %.1f]内%n", +// current.getId(), currentUpperArea, traversed.getId(), traversedLowerArea, traversedUpperArea +// ); +// foundLowMatch = true; + // 跳出内层循环 +// break; + return R.fail("单面积上下限已存在,请检查数据"); + } + +// if(currentUpperArea.compareTo(traversedLowerArea)>=0 && currentUpperArea.compareTo(traversedUpperArea)<=0){ +// return R.fail("单面积上限已存在,请检查数据"); +// } + + if((singleLowArea.compareTo(traversedSingleLowArea)>=0 && singleLowArea.compareTo(traversedSingleUpArea)<=0) && + (singleUpArea.compareTo(traversedSingleLowArea)>=0 && singleUpArea.compareTo(traversedSingleUpArea)<=0)){ + +// foundLowMatch = true; + // 跳出内层循环 +// break; + return R.fail("单批面积上下限已存在,请检查数据"); + } + +// if(singleUpArea.compareTo(traversedSingleLowArea)>=0 && singleUpArea.compareTo(traversedSingleUpArea)<=0){ +// return R.fail("单批面积上限已存在,请检查数据"); +// } + } + // 未匹配,将当前数据加入已遍历集合,继续下一条 + traversedList.add(current); + System.out.println("未匹配到已遍历区间,将当前数据加入已遍历集合"); + } + + // 4. 遍历完成后的结果提示 + if (!foundMatch) { + System.out.println("\n遍历完成,未发现任何数据的上限落在之前遍历数据的上下限区间内"); + return R.status(saveBatch(addList)); + } + +// addList.forEach(one -> { +// one.setId(null); +// }); + return R.status(true); + } + + @Override + public R importExcel(List listexcel) { + List noticeList = new ArrayList<>(); + for (BsAssignExcel current : listexcel) { + // 获取当前数据的单面积上限 + BigDecimal currentUpperArea = current.getUpArea(); + // 获取当前数据的单面积下限 + BigDecimal currentLowArea = current.getLowArea(); + //单批面积上限 + BigDecimal singleUpArea = current.getSingleUpArea(); + //单批面积下限 + BigDecimal singleLowArea = current.getSingleDownArea(); + if(currentUpperArea.compareTo(currentLowArea) < 0){ + return R.fail("单面积上限不能小于单面积下限"); + } + if(singleUpArea.compareTo(singleLowArea) < 0){ + return R.fail("单批面积上限不能小于单批面积下限"); + } + } + listexcel.forEach(noticeExcel -> { + + BsAssignEntity notice = BeanUtil.copy(noticeExcel, BsAssignEntity.class); + + //工艺能力 + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("CA_NAME",noticeExcel.getCraftAbility()); + List crafs = craftAbilityService.list(queryWrapper); + if(null != crafs && crafs.size() > 0){ + notice.setCraftAbilityId(crafs.get(0).getId()); + } + + + //外协厂商 + QueryWrapper queryWrapperoem = new QueryWrapper<>(); + queryWrapperoem.eq("OC_NAME",noticeExcel.getOemName()); + List oems = service.list(queryWrapperoem); + if(null != oems && oems.size() > 0){ + notice.setOemId(oems.get(0).getId()); + } + + //作业中心 + QueryWrapper queryWrappercenter = new QueryWrapper<>(); + queryWrappercenter.eq("WC_NAME",noticeExcel.getOemName()); + List centers = centerService.list(queryWrappercenter); + if(null != centers && centers.size() > 0){ + notice.setCenterId(oems.get(0).getId()); + } + + //指定类型 + String category = DictCache.getKey("AssignPoint", noticeExcel.getPointTypeName()); + notice.setPointType(category); + //限制类型 + String categorylimit = DictCache.getKey("AssignLimit", noticeExcel.getLimitTypeName()); + notice.setLimitType(categorylimit); + noticeList.add(notice); + }); + + List all = new ArrayList<>(); + + List list = this.list(); + all.addAll(list); + all.addAll(noticeList); + boolean foundMatch = false; + // 2. 存储已遍历过的数据(用于区间匹配) + List traversedList = new ArrayList<>(); + for (BsAssignEntity current : all) { + // 获取当前数据的单面积上限 + BigDecimal currentUpperArea = current.getUpArea(); + // 获取当前数据的单面积下限 + BigDecimal currentLowArea = current.getLowArea(); + //单批面积上限 + BigDecimal singleUpArea = current.getSingleUpArea(); + //单批面积下限 + BigDecimal singleLowArea = current.getSingleDownArea(); + + // 检查当前数据的上限是否在已遍历数据的任意区间内 + for (BsAssignEntity traversed : traversedList) { + BigDecimal traversedLowerArea = traversed.getLowArea(); + BigDecimal traversedUpperArea = traversed.getUpArea(); + + //单批面积上限 + BigDecimal traversedSingleUpArea = traversed.getSingleUpArea(); + //单批面积下限 + BigDecimal traversedSingleLowArea = traversed.getSingleDownArea(); + // 核心判断:当前上限 是否在 已遍历数据的[下限, 上限]区间内 + if((currentLowArea.compareTo(traversedLowerArea)>=0 && currentLowArea.compareTo(traversedUpperArea)<=0) + && (currentUpperArea.compareTo(traversedLowerArea)>=0 && currentUpperArea.compareTo(traversedUpperArea)<=0)){ +// if (currentUpperArea >= traversedLowerArea && currentUpperArea <= traversedUpperArea) { +// System.out.printf( +// "触发退出条件!当前数据%s的上限%.1f,落在已遍历数据%s的区间[%.1f, %.1f]内%n", +// current.getId(), currentUpperArea, traversed.getId(), traversedLowerArea, traversedUpperArea +// ); +// foundLowMatch = true; + // 跳出内层循环 +// break; + return R.fail("单面积上下限已存在,请检查数据"); + } + +// if(currentUpperArea.compareTo(traversedLowerArea)>=0 && currentUpperArea.compareTo(traversedUpperArea)<=0){ +// return R.fail("单面积上限已存在,请检查数据"); +// } + + if((singleLowArea.compareTo(traversedSingleLowArea)>=0 && singleLowArea.compareTo(traversedSingleUpArea)<=0) && + (singleUpArea.compareTo(traversedSingleLowArea)>=0 && singleUpArea.compareTo(traversedSingleUpArea)<=0)){ + +// foundLowMatch = true; + // 跳出内层循环 +// break; + return R.fail("单批面积上下限已存在,请检查数据"); + } + +// if(singleUpArea.compareTo(traversedSingleLowArea)>=0 && singleUpArea.compareTo(traversedSingleUpArea)<=0){ +// return R.fail("单批面积上限已存在,请检查数据"); +// } + } + // 未匹配,将当前数据加入已遍历集合,继续下一条 + traversedList.add(current); + System.out.println("未匹配到已遍历区间,将当前数据加入已遍历集合"); + } + + // 4. 遍历完成后的结果提示 + if (!foundMatch) { + System.out.println("\n遍历完成,未发现任何数据的上限落在之前遍历数据的上下限区间内"); + return R.data(saveBatch(noticeList)); + } + + + + return R.data(null); + } + @Override public List exportBsAssign(Wrapper queryWrapper) { diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/quality/controller/LiquidTankTaskController.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/quality/controller/LiquidTankTaskController.java index 5c4d5fc7..bb963075 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/quality/controller/LiquidTankTaskController.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/quality/controller/LiquidTankTaskController.java @@ -171,7 +171,7 @@ public class LiquidTankTaskController extends BladeController { LiquidTank tank = taskService.getById(one.getLiquidTankId()); Formula detail = formualaService.getById(tank.getAddDrugFormulaId()); if(null != detail){ - one.setReportFormulaContent(detail.getContent()); + one.setAddFormulaContent(detail.getContent()); } Formula detailAfter = formualaService.getById(tank.getAfterTheoryFormulaId());