分派规则实现导入保存功能

master
pangyang 2 months ago
parent aa595b0cfa
commit 41a8175d7d
  1. 3
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/basic/pojo/entity/BsAssignEntity.java
  2. 3
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/pojo/vo/LiquidTankTaskVO.java
  3. 55
      blade-service/blade-desk/src/main/java/org/springblade/desk/basic/controller/BsAssignController.java
  4. 5
      blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/IBsAssignService.java
  5. 246
      blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/impl/BsAssignServiceImpl.java
  6. 2
      blade-service/blade-desk/src/main/java/org/springblade/desk/quality/controller/LiquidTankTaskController.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;

@ -77,6 +77,9 @@ public class LiquidTankTaskVO extends LiquidTankTask {
@Schema(description = "药品计算公式(报告) 加药量[计算公式] 公式内容")
private String reportFormulaContent;
//加药量计算公式
private String addFormulaContent;
@Schema(description = "药品计算公式(报告) 理论值加药量[计算公式] 公式内容")
private String afterFormulaContent;

@ -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<BsAssignEntity> 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<BsAssignEntity> noticeList = new ArrayList<>();
List<BsAssignExcel> list = ExcelUtil.read(file, BsAssignExcel.class);
list.forEach(noticeExcel -> {
BsAssignEntity notice = BeanUtil.copy(noticeExcel, BsAssignEntity.class);
//工艺能力
QueryWrapper<CraftAbilityEntity> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("CA_NAME",noticeExcel.getCraftAbility());
List<CraftAbilityEntity> crafs = craftAbilityService.list(queryWrapper);
if(null != crafs && crafs.size() > 0){
notice.setCraftAbilityId(crafs.get(0).getId());
}
//外协厂商
QueryWrapper<Oem> queryWrapperoem = new QueryWrapper<>();
queryWrapperoem.eq("OC_NAME",noticeExcel.getOemName());
List<Oem> oems = service.list(queryWrapperoem);
if(null != oems && oems.size() > 0){
notice.setOemId(oems.get(0).getId());
}
//作业中心
QueryWrapper<WorkCenter> queryWrappercenter = new QueryWrapper<>();
queryWrappercenter.eq("WC_NAME",noticeExcel.getOemName());
List<WorkCenter> 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<BsAssignExcel> listexcel = ExcelUtil.read(file, BsAssignExcel.class);
R result = bsAssignService.importExcel(listexcel);
return result;
}
}

@ -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<BsAssignEntity> {
*/
IPage<BsAssignVO> selectBsAssignPage(IPage<BsAssignVO> page, BsAssignVO bsAssign);
public R saveBat(List<BsAssignEntity> addList);
public R importExcel(List<BsAssignExcel> addList);
/**
* 导出数据

@ -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<BsAssignMapper, BsAssignEntity> implements IBsAssignService {
@Resource
private ICraftAbilityService craftAbilityService;
@Resource
private IOemService service;
@Resource
private IWorkCenterService centerService;
@Override
public IPage<BsAssignVO> selectBsAssignPage(IPage<BsAssignVO> page, BsAssignVO bsAssign) {
return page.setRecords(baseMapper.selectBsAssignPage(page, bsAssign));
}
@Override
public R saveBat(List<BsAssignEntity> 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<BsAssignEntity> all = new ArrayList<>();
List<BsAssignEntity> list = this.list();
all.addAll(list);
all.addAll(addList);
boolean foundMatch = false;
// 2. 存储已遍历过的数据(用于区间匹配)
List<BsAssignEntity> 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<BsAssignExcel> listexcel) {
List<BsAssignEntity> 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<CraftAbilityEntity> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("CA_NAME",noticeExcel.getCraftAbility());
List<CraftAbilityEntity> crafs = craftAbilityService.list(queryWrapper);
if(null != crafs && crafs.size() > 0){
notice.setCraftAbilityId(crafs.get(0).getId());
}
//外协厂商
QueryWrapper<Oem> queryWrapperoem = new QueryWrapper<>();
queryWrapperoem.eq("OC_NAME",noticeExcel.getOemName());
List<Oem> oems = service.list(queryWrapperoem);
if(null != oems && oems.size() > 0){
notice.setOemId(oems.get(0).getId());
}
//作业中心
QueryWrapper<WorkCenter> queryWrappercenter = new QueryWrapper<>();
queryWrappercenter.eq("WC_NAME",noticeExcel.getOemName());
List<WorkCenter> 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<BsAssignEntity> all = new ArrayList<>();
List<BsAssignEntity> list = this.list();
all.addAll(list);
all.addAll(noticeList);
boolean foundMatch = false;
// 2. 存储已遍历过的数据(用于区间匹配)
List<BsAssignEntity> 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<BsAssignExcel> exportBsAssign(Wrapper<BsAssignEntity> queryWrapper) {

@ -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());

Loading…
Cancel
Save