Merge remote-tracking branch 'origin/master'

liweidong
绫Umbrella 1 month ago
commit 06c3f0f11c
  1. 2
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/basic/pojo/entity/BsAssignEntity.java
  2. 1
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/basic/pojo/vo/BsAssignVO.java
  3. 4
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/pojo/entity/LiquidTankTaskCopy.java
  4. 12
      blade-service-api/blade-scheduling-api/src/main/java/org/springblade/scheduling/feign/IWorkOrderClient.java
  5. 11
      blade-service-api/blade-scheduling-api/src/main/java/org/springblade/scheduling/feign/IWorkOrderClientFallback.java
  6. 115
      blade-service/blade-desk/src/main/java/org/springblade/desk/basic/controller/BsAssignController.java
  7. 26
      blade-service/blade-desk/src/main/java/org/springblade/desk/basic/mapper/AssignMapper.xml
  8. 2
      blade-service/blade-desk/src/main/java/org/springblade/desk/basic/mapper/BsAssignMapper.java
  9. 231
      blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/impl/BsAssignServiceImpl.java
  10. 91
      blade-service/blade-desk/src/main/java/org/springblade/desk/quality/controller/LiquidTankController.java
  11. 53
      blade-service/blade-desk/src/main/java/org/springblade/desk/quality/controller/LiquidTankTaskCopyController.java
  12. 6
      blade-service/blade-desk/src/main/java/org/springblade/desk/quality/mapper/ReviewSheetMapper.xml
  13. 2
      blade-service/blade-desk/src/main/java/org/springblade/desk/quality/service/impl/LiquidTankTaskCopyServiceImpl.java
  14. 2
      blade-service/blade-desk/src/main/java/org/springblade/desk/quality/service/impl/LiquidTankTaskServiceImpl.java
  15. 279
      blade-service/blade-desk/src/main/java/org/springblade/desk/quality/util/FullMergeExcelUtil.java
  16. BIN
      blade-service/blade-desk/src/main/resources/Excel/QA/槽液信息.xls
  17. 22
      blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/feign/WorkOrderClient.java

@ -74,7 +74,7 @@ public class BsAssignEntity extends BaseEntity {
* 生产标识id * 生产标识id
*/ */
@Schema(description = "生产标识id") @Schema(description = "生产标识id")
private BigDecimal prodMarkId; private String prodMarkId;
/** /**
* 单面积上限 * 单面积上限
*/ */

@ -45,5 +45,6 @@ public class BsAssignVO extends BsAssignEntity {
private String areaName; private String areaName;
private String limitAreaName; private String limitAreaName;
private String createUserName;
} }

@ -531,5 +531,9 @@ public class LiquidTankTaskCopy extends BaseEntity {
@Schema(description = "有效期") @Schema(description = "有效期")
private LocalDate validDate; private LocalDate validDate;
@Schema(description = "药品添加人签名")
private String drugAddUserSign;
@Schema(description = "药品监督人签名")
private String drugSuUserSign;
} }

@ -3,10 +3,13 @@ package org.springblade.scheduling.feign;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import org.springblade.core.tool.api.R; import org.springblade.core.tool.api.R;
import org.springblade.scheduling.config.NoRetryFeignConfig; import org.springblade.scheduling.config.NoRetryFeignConfig;
import org.springblade.scheduling.pojo.entity.QualityGradeEntity;
import org.springblade.scheduling.pojo.vo.GlassCakeOrderPageQuery; import org.springblade.scheduling.pojo.vo.GlassCakeOrderPageQuery;
import org.springblade.scheduling.pojo.vo.WorkOrderVO; import org.springblade.scheduling.pojo.vo.WorkOrderVO;
import org.springframework.cloud.openfeign.FeignClient; import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
/** /**
* TODO功能描述 * TODO功能描述
@ -29,6 +32,10 @@ public interface IWorkOrderClient {
String GLASS_CAKE_ORDER = API_PREFIX + "/glassCakeOrderPage"; String GLASS_CAKE_ORDER = API_PREFIX + "/glassCakeOrderPage";
String GLASS_CAKE_QUALITY = API_PREFIX + "/getById";
String GLASS_CAKE_QUALITY_NAME = API_PREFIX + "/getByName";
/** /**
* 排产 * 排产
* *
@ -41,4 +48,9 @@ public interface IWorkOrderClient {
@GetMapping(GLASS_CAKE_ORDER) @GetMapping(GLASS_CAKE_ORDER)
R<IPage<WorkOrderVO>> selectGlassCakeOrderPage(GlassCakeOrderPageQuery glassCakeOrderPageQuery); R<IPage<WorkOrderVO>> selectGlassCakeOrderPage(GlassCakeOrderPageQuery glassCakeOrderPageQuery);
@PostMapping(GLASS_CAKE_QUALITY)
R<QualityGradeEntity> getById(@RequestBody Long id);
@PostMapping(GLASS_CAKE_QUALITY_NAME)
R<QualityGradeEntity> getByName(@RequestBody String name);
} }

@ -28,6 +28,7 @@ package org.springblade.scheduling.feign;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import org.springblade.core.mp.support.Query; import org.springblade.core.mp.support.Query;
import org.springblade.core.tool.api.R; import org.springblade.core.tool.api.R;
import org.springblade.scheduling.pojo.entity.QualityGradeEntity;
import org.springblade.scheduling.pojo.vo.GlassCakeOrderPageQuery; import org.springblade.scheduling.pojo.vo.GlassCakeOrderPageQuery;
import org.springblade.scheduling.pojo.vo.WorkOrderVO; import org.springblade.scheduling.pojo.vo.WorkOrderVO;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@ -54,4 +55,14 @@ public class IWorkOrderClientFallback implements IWorkOrderClient {
public R<IPage<WorkOrderVO>> selectGlassCakeOrderPage(GlassCakeOrderPageQuery glassCakeOrderPageQuery) { public R<IPage<WorkOrderVO>> selectGlassCakeOrderPage(GlassCakeOrderPageQuery glassCakeOrderPageQuery) {
return R.fail("获取玻璃饼订单失败"); return R.fail("获取玻璃饼订单失败");
} }
@Override
public R<QualityGradeEntity> getById(Long id) {
return null;
}
@Override
public R<QualityGradeEntity> getByName(String name) {
return null;
}
} }

@ -34,6 +34,9 @@ import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.Valid; import jakarta.validation.Valid;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.extern.slf4j.Slf4j;
import org.springblade.core.boot.ctrl.BladeController; import org.springblade.core.boot.ctrl.BladeController;
import org.springblade.core.excel.util.ExcelUtil; import org.springblade.core.excel.util.ExcelUtil;
import org.springblade.core.mp.support.Condition; import org.springblade.core.mp.support.Condition;
@ -56,6 +59,8 @@ import org.springblade.desk.basic.util.ExcelExtUtil;
import org.springblade.desk.basic.wrapper.BsAssignWrapper; import org.springblade.desk.basic.wrapper.BsAssignWrapper;
import org.springblade.scheduling.pojo.entity.CraftAbilityEntity; import org.springblade.scheduling.pojo.entity.CraftAbilityEntity;
import org.springblade.system.cache.DictCache; import org.springblade.system.cache.DictCache;
import org.springblade.system.feign.IUserClient;
import org.springblade.system.pojo.entity.User;
import org.springframework.core.io.Resource; import org.springframework.core.io.Resource;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
@ -65,6 +70,8 @@ import java.math.BigDecimal;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.stream.Collectors;
/** /**
* 分派规则维护 控制器 * 分派规则维护 控制器
* *
@ -75,6 +82,9 @@ import java.util.Map;
@AllArgsConstructor @AllArgsConstructor
@RequestMapping("/bsAssign") @RequestMapping("/bsAssign")
@Tag(name = "分派规则维护", description = "分派规则维护接口") @Tag(name = "分派规则维护", description = "分派规则维护接口")
@Data
@EqualsAndHashCode(callSuper = true)
@Slf4j
public class BsAssignController extends BladeController { public class BsAssignController extends BladeController {
private final IBsAssignService bsAssignService; private final IBsAssignService bsAssignService;
@ -82,6 +92,8 @@ public class BsAssignController extends BladeController {
private final IOemService service; private final IOemService service;
@jakarta.annotation.Resource @jakarta.annotation.Resource
private IWorkCenterService centerService; private IWorkCenterService centerService;
@jakarta.annotation.Resource
private IUserClient iUserClient;
/** /**
* 分派规则维护 详情 * 分派规则维护 详情
*/ */
@ -115,7 +127,12 @@ public class BsAssignController extends BladeController {
for(BsAssignVO vo:list){ for(BsAssignVO vo:list){
vo.setAreaName(vo.getLowArea()+"~"+vo.getUpArea()); vo.setAreaName(vo.getLowArea()+"~"+vo.getUpArea());
vo.setLimitAreaName(vo.getSingleDownArea()+"~"+vo.getSingleUpArea()); vo.setLimitAreaName(vo.getSingleDownArea()+"~"+vo.getSingleUpArea());
R<User> user = iUserClient.userInfoById(vo.getCreateUser());
vo.setCreateUserName(user.getData().getRealName());
} }
pages.getRecords()
.stream()
.collect(Collectors.toList());
return R.data(pages); return R.data(pages);
} }
@ -149,6 +166,104 @@ public class BsAssignController extends BladeController {
@ApiOperationSupport(order = 5) @ApiOperationSupport(order = 5)
@Operation(summary = "修改", description = "传入bsAssign") @Operation(summary = "修改", description = "传入bsAssign")
public R update(@Valid @RequestBody BsAssignEntity bsAssign) { public R update(@Valid @RequestBody BsAssignEntity bsAssign) {
List<BsAssignEntity> list = bsAssignService.list();
List<BsAssignEntity> traversedList = new ArrayList<>();
// 获取当前数据的单面积上限
BigDecimal currentUpperArea = bsAssign.getUpArea();
// 获取当前数据的单面积下限
BigDecimal currentLowArea = bsAssign.getLowArea();
//单批面积上限
BigDecimal singleUpArea = bsAssign.getSingleUpArea();
//单批面积下限
BigDecimal singleLowArea = bsAssign.getSingleDownArea();
Long currentCraftId = bsAssign.getCraftAbilityId();
for(BsAssignEntity entity:list){
if(entity.getId() == bsAssign.getId()){
continue;
}
// 检查当前数据的上限是否在已遍历数据的任意区间内
for (BsAssignEntity traversed : traversedList) {
BigDecimal traversedLowerArea = traversed.getLowArea();
BigDecimal traversedUpperArea = traversed.getUpArea();
//单批面积上限
BigDecimal traversedSingleUpArea = traversed.getSingleUpArea();
//单批面积下限
BigDecimal traversedSingleLowArea = traversed.getSingleDownArea();
Long traversedCraftId = traversed.getCraftAbilityId();
if(currentCraftId.equals(traversedCraftId)){
// 核心判断:当前上限 是否在 已遍历数据的[下限, 上限]区间内
if((currentLowArea.compareTo(traversedLowerArea)==1 && currentLowArea.compareTo(traversedUpperArea)==-1)
|| (currentUpperArea.compareTo(traversedLowerArea)==1 && currentUpperArea.compareTo(traversedUpperArea)==-1)){
return R.fail("单面积上下限已存在,请检查数据");
}
if(currentLowArea.compareTo(traversedLowerArea)<=0
&& (currentUpperArea.compareTo(traversedLowerArea)>=0 && currentUpperArea.compareTo(traversedUpperArea)<=0)){
return R.fail("单面积上下限已存在,请检查数据");
}
if((currentLowArea.compareTo(traversedLowerArea)>=0 && currentLowArea.compareTo(traversedUpperArea)<=0)
&& currentUpperArea.compareTo(traversedUpperArea)>=0){
return R.fail("单面积上下限已存在,请检查数据");
}
if(currentLowArea.compareTo(traversedLowerArea)<=0
&& currentUpperArea.compareTo(traversedUpperArea)>=0){
return R.fail("单面积上下限已存在,请检查数据");
}
if(currentLowArea.compareTo(traversedLowerArea)==0
&& currentUpperArea.compareTo(traversedUpperArea)==0){
return R.fail("单面积上下限已存在,请检查数据");
}
if((singleLowArea.compareTo(traversedSingleLowArea)==1 && singleLowArea.compareTo(traversedSingleUpArea)==-1) ||
(singleUpArea.compareTo(traversedSingleLowArea)==1 && singleUpArea.compareTo(traversedSingleUpArea)==-1)){
return R.fail("单批面积上下限已存在,请检查数据");
}
if(singleLowArea.compareTo(traversedSingleLowArea)<=0
&& (singleUpArea.compareTo(traversedSingleLowArea)>=0 && singleUpArea.compareTo(traversedSingleUpArea)<=0)){
return R.fail("单批面积上下限已存在,请检查数据");
}
if((singleLowArea.compareTo(traversedSingleLowArea)>=0 && currentLowArea.compareTo(traversedSingleUpArea)<=0)
&& singleUpArea.compareTo(traversedSingleUpArea)>=0){
return R.fail("单批面积上下限已存在,请检查数据");
}
if(singleLowArea.compareTo(traversedSingleLowArea)<=0
&& singleUpArea.compareTo(traversedSingleUpArea)>=0){
return R.fail("单批面积上下限已存在,请检查数据");
}
if(singleLowArea.compareTo(traversedSingleLowArea)==0 &&
singleUpArea.compareTo(traversedSingleUpArea)==0){
return R.fail("单批面积上下限已存在,请检查数据");
}
}
// if(singleUpArea.compareTo(traversedSingleLowArea)>=0 && singleUpArea.compareTo(traversedSingleUpArea)<=0){
// return R.fail("单批面积上限已存在,请检查数据");
// }
}
// 未匹配,将当前数据加入已遍历集合,继续下一条
traversedList.add(entity);
System.out.println("未匹配到已遍历区间,将当前数据加入已遍历集合");
}
return R.status(bsAssignService.updateById(bsAssign)); return R.status(bsAssignService.updateById(bsAssign));
} }

@ -31,8 +31,32 @@
</resultMap> </resultMap>
<select id="selectBsAssignPage" resultMap="bsAssignResultMap"> <select id="selectBsAssignPage" resultType="org.springblade.desk.basic.pojo.vo.BsAssignVO">
select * from BS_ASSIGN where is_deleted = 0 select * from BS_ASSIGN where is_deleted = 0
<if test="bsAssign.craftAbilityId != null and bsAssign.craftAbilityId != ''">
AND craft_ability_id = #{bsAssign.craftAbilityId}
</if>
<if test="bsAssign.partCode != null and bsAssign.partCode != ''">
AND part_code LIKE CONCAT('%', CONCAT(#{bsAssign.partCode}, '%'))
</if>
<if test="bsAssign.limitType != null and bsAssign.limitType != ''">
AND limit_type = #{bsAssign.limitType}
</if>
<if test="bsAssign.pointType != null and bsAssign.pointType != ''">
AND point_type = #{bsAssign.pointType}
</if>
<if test="bsAssign.oemId != null ">
AND oem_id = #{bsAssign.oemId}
</if>
<if test="bsAssign.centerId != null ">
AND center_id = #{bsAssign.centerId}
</if>
</select> </select>

@ -51,7 +51,7 @@ public interface BsAssignMapper extends BaseMapper<BsAssignEntity> {
* @param bsAssign 查询参数 * @param bsAssign 查询参数
* @return List<BsAssignVO> * @return List<BsAssignVO>
*/ */
List<BsAssignVO> selectBsAssignPage(IPage page, BsAssignVO bsAssign); List<BsAssignVO> selectBsAssignPage(IPage page, @Param("bsAssign") BsAssignVO bsAssign);
/** /**

@ -42,13 +42,17 @@ import org.springblade.desk.basic.service.IBsAssignService;
import org.springblade.desk.basic.service.ICraftAbilityService; import org.springblade.desk.basic.service.ICraftAbilityService;
import org.springblade.desk.basic.service.IOemService; import org.springblade.desk.basic.service.IOemService;
import org.springblade.desk.basic.service.IWorkCenterService; import org.springblade.desk.basic.service.IWorkCenterService;
import org.springblade.scheduling.feign.IWorkOrderClient;
import org.springblade.scheduling.pojo.entity.CraftAbilityEntity; import org.springblade.scheduling.pojo.entity.CraftAbilityEntity;
import org.springblade.scheduling.pojo.entity.QualityGradeEntity;
import org.springblade.system.cache.DictCache; import org.springblade.system.cache.DictCache;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.stream.Collectors;
/** /**
* 分派规则维护 服务实现类 * 分派规则维护 服务实现类
@ -64,6 +68,8 @@ public class BsAssignServiceImpl extends BaseServiceImpl<BsAssignMapper, BsAssig
private IOemService service; private IOemService service;
@Resource @Resource
private IWorkCenterService centerService; private IWorkCenterService centerService;
@Resource
private IWorkOrderClient iWorkOrderClient;
@Override @Override
public IPage<BsAssignVO> selectBsAssignPage(IPage<BsAssignVO> page, BsAssignVO bsAssign) { public IPage<BsAssignVO> selectBsAssignPage(IPage<BsAssignVO> page, BsAssignVO bsAssign) {
return page.setRecords(baseMapper.selectBsAssignPage(page, bsAssign)); return page.setRecords(baseMapper.selectBsAssignPage(page, bsAssign));
@ -86,6 +92,17 @@ public class BsAssignServiceImpl extends BaseServiceImpl<BsAssignMapper, BsAssig
if(singleUpArea.compareTo(singleLowArea) < 0){ if(singleUpArea.compareTo(singleLowArea) < 0){
return R.fail("单批面积上限不能小于单批面积下限"); return R.fail("单批面积上限不能小于单批面积下限");
} }
String prodMarkId = current.getProdMarkId();
List<String> names = new ArrayList<>();
List<String> prodMarkIds = Arrays.asList(prodMarkId.split(","));
for (String prodMarkId1 : prodMarkIds){
R<QualityGradeEntity> entity = iWorkOrderClient.getById(Long.parseLong(prodMarkId1));
names.add(entity.getData().getQualityGrade());
}
String str = names.stream().collect(Collectors.joining(","));
current.setProdMark(str);
} }
@ -106,6 +123,7 @@ public class BsAssignServiceImpl extends BaseServiceImpl<BsAssignMapper, BsAssig
BigDecimal singleUpArea = current.getSingleUpArea(); BigDecimal singleUpArea = current.getSingleUpArea();
//单批面积下限 //单批面积下限
BigDecimal singleLowArea = current.getSingleDownArea(); BigDecimal singleLowArea = current.getSingleDownArea();
Long currentCraftId = current.getCraftAbilityId();
// 检查当前数据的上限是否在已遍历数据的任意区间内 // 检查当前数据的上限是否在已遍历数据的任意区间内
for (BsAssignEntity traversed : traversedList) { for (BsAssignEntity traversed : traversedList) {
@ -116,56 +134,63 @@ public class BsAssignServiceImpl extends BaseServiceImpl<BsAssignMapper, BsAssig
BigDecimal traversedSingleUpArea = traversed.getSingleUpArea(); BigDecimal traversedSingleUpArea = traversed.getSingleUpArea();
//单批面积下限 //单批面积下限
BigDecimal traversedSingleLowArea = traversed.getSingleDownArea(); BigDecimal traversedSingleLowArea = traversed.getSingleDownArea();
// 核心判断:当前上限 是否在 已遍历数据的[下限, 上限]区间内
if((currentLowArea.compareTo(traversedLowerArea)==1 && currentLowArea.compareTo(traversedUpperArea)==-1)
|| (currentUpperArea.compareTo(traversedLowerArea)==1 && currentUpperArea.compareTo(traversedUpperArea)==-1)){
return R.fail("单面积上下限已存在,请检查数据");
}
if(currentLowArea.compareTo(traversedLowerArea)<=0
&& (currentUpperArea.compareTo(traversedLowerArea)>=0 && currentUpperArea.compareTo(traversedUpperArea)<=0)){
return R.fail("单面积上下限已存在,请检查数据");
}
if((currentLowArea.compareTo(traversedLowerArea)>=0 && currentLowArea.compareTo(traversedUpperArea)<=0)
&& currentUpperArea.compareTo(traversedUpperArea)>=0){
return R.fail("单面积上下限已存在,请检查数据");
}
if(currentLowArea.compareTo(traversedLowerArea)<=0
&& currentUpperArea.compareTo(traversedUpperArea)>=0){
return R.fail("单面积上下限已存在,请检查数据");
}
if(currentLowArea.compareTo(traversedLowerArea)==0
&& currentUpperArea.compareTo(traversedUpperArea)==0){
return R.fail("单面积上下限已存在,请检查数据");
}
if((singleLowArea.compareTo(traversedSingleLowArea)==1 && singleLowArea.compareTo(traversedSingleUpArea)==-1) ||
(singleUpArea.compareTo(traversedSingleLowArea)==1 && singleUpArea.compareTo(traversedSingleUpArea)==-1)){
return R.fail("单批面积上下限已存在,请检查数据");
}
if(singleLowArea.compareTo(traversedSingleLowArea)<=0 Long traversedCraftId = traversed.getCraftAbilityId();
&& (singleUpArea.compareTo(traversedSingleLowArea)>=0 && singleUpArea.compareTo(traversedSingleUpArea)<=0)){
return R.fail("单批面积上下限已存在,请检查数据"); if(currentCraftId.equals(traversedCraftId)){
// 核心判断:当前上限 是否在 已遍历数据的[下限, 上限]区间内
if((currentLowArea.compareTo(traversedLowerArea)==1 && currentLowArea.compareTo(traversedUpperArea)==-1)
|| (currentUpperArea.compareTo(traversedLowerArea)==1 && currentUpperArea.compareTo(traversedUpperArea)==-1)){
return R.fail("单面积上下限已存在,请检查数据");
}
if(currentLowArea.compareTo(traversedLowerArea)<=0
&& (currentUpperArea.compareTo(traversedLowerArea)>=0 && currentUpperArea.compareTo(traversedUpperArea)<=0)){
return R.fail("单面积上下限已存在,请检查数据");
}
if((currentLowArea.compareTo(traversedLowerArea)>=0 && currentLowArea.compareTo(traversedUpperArea)<=0)
&& currentUpperArea.compareTo(traversedUpperArea)>=0){
return R.fail("单面积上下限已存在,请检查数据");
}
if(currentLowArea.compareTo(traversedLowerArea)<=0
&& currentUpperArea.compareTo(traversedUpperArea)>=0){
return R.fail("单面积上下限已存在,请检查数据");
}
if(currentLowArea.compareTo(traversedLowerArea)==0
&& currentUpperArea.compareTo(traversedUpperArea)==0){
return R.fail("单面积上下限已存在,请检查数据");
}
if((singleLowArea.compareTo(traversedSingleLowArea)==1 && singleLowArea.compareTo(traversedSingleUpArea)==-1) ||
(singleUpArea.compareTo(traversedSingleLowArea)==1 && singleUpArea.compareTo(traversedSingleUpArea)==-1)){
return R.fail("单批面积上下限已存在,请检查数据");
}
if(singleLowArea.compareTo(traversedSingleLowArea)<=0
&& (singleUpArea.compareTo(traversedSingleLowArea)>=0 && singleUpArea.compareTo(traversedSingleUpArea)<=0)){
return R.fail("单批面积上下限已存在,请检查数据");
}
if((singleLowArea.compareTo(traversedSingleLowArea)>=0 && currentLowArea.compareTo(traversedSingleUpArea)<=0)
&& singleUpArea.compareTo(traversedSingleUpArea)>=0){
return R.fail("单批面积上下限已存在,请检查数据");
}
if(singleLowArea.compareTo(traversedSingleLowArea)<=0
&& singleUpArea.compareTo(traversedSingleUpArea)>=0){
return R.fail("单批面积上下限已存在,请检查数据");
}
if(singleLowArea.compareTo(traversedSingleLowArea)==0 &&
singleUpArea.compareTo(traversedSingleUpArea)==0){
return R.fail("单批面积上下限已存在,请检查数据");
}
} }
if((singleLowArea.compareTo(traversedSingleLowArea)>=0 && currentLowArea.compareTo(traversedSingleUpArea)<=0)
&& singleUpArea.compareTo(traversedSingleUpArea)>=0){
return R.fail("单批面积上下限已存在,请检查数据");
}
if(singleLowArea.compareTo(traversedSingleLowArea)<=0
&& singleUpArea.compareTo(traversedSingleUpArea)>=0){
return R.fail("单批面积上下限已存在,请检查数据");
}
if(singleLowArea.compareTo(traversedSingleLowArea)==0 &&
singleUpArea.compareTo(traversedSingleUpArea)==0){
return R.fail("单批面积上下限已存在,请检查数据");
}
// if(singleUpArea.compareTo(traversedSingleLowArea)>=0 && singleUpArea.compareTo(traversedSingleUpArea)<=0){ // if(singleUpArea.compareTo(traversedSingleLowArea)>=0 && singleUpArea.compareTo(traversedSingleUpArea)<=0){
// return R.fail("单批面积上限已存在,请检查数据"); // return R.fail("单批面积上限已存在,请检查数据");
@ -236,6 +261,17 @@ public class BsAssignServiceImpl extends BaseServiceImpl<BsAssignMapper, BsAssig
notice.setCenterId(oems.get(0).getId()); notice.setCenterId(oems.get(0).getId());
} }
String prodmark = noticeExcel.getProdMark();
List<String> strs = Arrays.asList(prodmark.split(","));
List<String> ids = new ArrayList<>();
for(String str : strs){
R<QualityGradeEntity> entity = iWorkOrderClient.getByName(str);
ids.add(entity.getData().getId().toString());
}
String str = ids.stream().collect(Collectors.joining(","));
notice.setProdMarkId(str);
//指定类型 //指定类型
String category = DictCache.getKey("AssignPoint", noticeExcel.getPointTypeName()); String category = DictCache.getKey("AssignPoint", noticeExcel.getPointTypeName());
notice.setPointType(category); notice.setPointType(category);
@ -263,6 +299,8 @@ public class BsAssignServiceImpl extends BaseServiceImpl<BsAssignMapper, BsAssig
//单批面积下限 //单批面积下限
BigDecimal singleLowArea = current.getSingleDownArea(); BigDecimal singleLowArea = current.getSingleDownArea();
Long currentCraftId = current.getCraftAbilityId();
// 检查当前数据的上限是否在已遍历数据的任意区间内 // 检查当前数据的上限是否在已遍历数据的任意区间内
for (BsAssignEntity traversed : traversedList) { for (BsAssignEntity traversed : traversedList) {
BigDecimal traversedLowerArea = traversed.getLowArea(); BigDecimal traversedLowerArea = traversed.getLowArea();
@ -272,56 +310,67 @@ public class BsAssignServiceImpl extends BaseServiceImpl<BsAssignMapper, BsAssig
BigDecimal traversedSingleUpArea = traversed.getSingleUpArea(); BigDecimal traversedSingleUpArea = traversed.getSingleUpArea();
//单批面积下限 //单批面积下限
BigDecimal traversedSingleLowArea = traversed.getSingleDownArea(); BigDecimal traversedSingleLowArea = traversed.getSingleDownArea();
// 核心判断:当前上限 是否在 已遍历数据的[下限, 上限]区间内
if((currentLowArea.compareTo(traversedLowerArea)==1 && currentLowArea.compareTo(traversedUpperArea)==-1)
|| (currentUpperArea.compareTo(traversedLowerArea)==1 && currentUpperArea.compareTo(traversedUpperArea)==-1)){
return R.fail("单面积上下限已存在,请检查数据");
}
if(currentLowArea.compareTo(traversedLowerArea)<=0
&& (currentUpperArea.compareTo(traversedLowerArea)>=0 && currentUpperArea.compareTo(traversedUpperArea)<=0)){
return R.fail("单面积上下限已存在,请检查数据");
}
if((currentLowArea.compareTo(traversedLowerArea)>=0 && currentLowArea.compareTo(traversedUpperArea)<=0)
&& currentUpperArea.compareTo(traversedUpperArea)>=0){
return R.fail("单面积上下限已存在,请检查数据");
}
if(currentLowArea.compareTo(traversedLowerArea)<=0
&& currentUpperArea.compareTo(traversedUpperArea)>=0){
return R.fail("单面积上下限已存在,请检查数据");
}
if(currentLowArea.compareTo(traversedLowerArea)==0 Long traversedCraftId = traversed.getCraftAbilityId();
&& currentUpperArea.compareTo(traversedUpperArea)==0){
return R.fail("单面积上下限已存在,请检查数据"); if(currentCraftId.equals(traversedCraftId)){
// 核心判断:当前上限 是否在 已遍历数据的[下限, 上限]区间内
if((currentLowArea.compareTo(traversedLowerArea)==1 && currentLowArea.compareTo(traversedUpperArea)==-1)
|| (currentUpperArea.compareTo(traversedLowerArea)==1 && currentUpperArea.compareTo(traversedUpperArea)==-1)){
return R.fail("单面积上下限已存在,请检查数据");
}
if(currentLowArea.compareTo(traversedLowerArea)<=0
&& (currentUpperArea.compareTo(traversedLowerArea)>=0 && currentUpperArea.compareTo(traversedUpperArea)<=0)){
return R.fail("单面积上下限已存在,请检查数据");
}
if((currentLowArea.compareTo(traversedLowerArea)>=0 && currentLowArea.compareTo(traversedUpperArea)<=0)
&& currentUpperArea.compareTo(traversedUpperArea)>=0){
return R.fail("单面积上下限已存在,请检查数据");
}
if(currentLowArea.compareTo(traversedLowerArea)<=0
&& currentUpperArea.compareTo(traversedUpperArea)>=0){
return R.fail("单面积上下限已存在,请检查数据");
}
if(currentLowArea.compareTo(traversedLowerArea)==0
&& currentUpperArea.compareTo(traversedUpperArea)==0){
return R.fail("单面积上下限已存在,请检查数据");
}
if((singleLowArea.compareTo(traversedSingleLowArea)==1 && singleLowArea.compareTo(traversedSingleUpArea)==-1) ||
(singleUpArea.compareTo(traversedSingleLowArea)==1 && singleUpArea.compareTo(traversedSingleUpArea)==-1)){
return R.fail("单批面积上下限已存在,请检查数据");
}
if(singleLowArea.compareTo(traversedSingleLowArea)<=0
&& (singleUpArea.compareTo(traversedSingleLowArea)>=0 && singleUpArea.compareTo(traversedSingleUpArea)<=0)){
return R.fail("单批面积上下限已存在,请检查数据");
}
if((singleLowArea.compareTo(traversedSingleLowArea)>=0 && currentLowArea.compareTo(traversedSingleUpArea)<=0)
&& singleUpArea.compareTo(traversedSingleUpArea)>=0){
return R.fail("单批面积上下限已存在,请检查数据");
}
if(singleLowArea.compareTo(traversedSingleLowArea)<=0
&& singleUpArea.compareTo(traversedSingleUpArea)>=0){
return R.fail("单批面积上下限已存在,请检查数据");
}
if(singleLowArea.compareTo(traversedSingleLowArea)==0 &&
singleUpArea.compareTo(traversedSingleUpArea)==0){
return R.fail("单批面积上下限已存在,请检查数据");
}
} }
if((singleLowArea.compareTo(traversedSingleLowArea)==1 && singleLowArea.compareTo(traversedSingleUpArea)==-1) ||
(singleUpArea.compareTo(traversedSingleLowArea)==1 && singleUpArea.compareTo(traversedSingleUpArea)==-1)){
return R.fail("单批面积上下限已存在,请检查数据");
}
if(singleLowArea.compareTo(traversedSingleLowArea)<=0
&& (singleUpArea.compareTo(traversedSingleLowArea)>=0 && singleUpArea.compareTo(traversedSingleUpArea)<=0)){
return R.fail("单批面积上下限已存在,请检查数据");
}
if((singleLowArea.compareTo(traversedSingleLowArea)>=0 && currentLowArea.compareTo(traversedSingleUpArea)<=0)
&& singleUpArea.compareTo(traversedSingleUpArea)>=0){
return R.fail("单批面积上下限已存在,请检查数据");
}
if(singleLowArea.compareTo(traversedSingleLowArea)<=0
&& singleUpArea.compareTo(traversedSingleUpArea)>=0){
return R.fail("单批面积上下限已存在,请检查数据");
}
if(singleLowArea.compareTo(traversedSingleLowArea)==0 && // if(singleUpArea.compareTo(traversedSingleLowArea)>=0 && singleUpArea.compareTo(traversedSingleUpArea)<=0){
singleUpArea.compareTo(traversedSingleUpArea)==0){ // return R.fail("单批面积上限已存在,请检查数据");
return R.fail("单批面积上下限已存在,请检查数据"); // }
}
} }
// 未匹配,将当前数据加入已遍历集合,继续下一条 // 未匹配,将当前数据加入已遍历集合,继续下一条
traversedList.add(current); traversedList.add(current);

@ -25,10 +25,10 @@ import org.springblade.core.tool.utils.BeanUtil;
import org.springblade.core.tool.utils.DateUtil; import org.springblade.core.tool.utils.DateUtil;
import org.springblade.core.tool.utils.Func; import org.springblade.core.tool.utils.Func;
import org.springblade.desk.basic.excel.TeamSetExcel; import org.springblade.desk.basic.excel.TeamSetExcel;
import org.springblade.desk.basic.pojo.entity.Shifts; import org.springblade.desk.basic.pojo.entity.*;
import org.springblade.desk.basic.pojo.entity.TeamSet; import org.springblade.desk.basic.service.IFormulaService;
import org.springblade.desk.basic.pojo.entity.WorkCenter; import org.springblade.desk.basic.service.ITeamSetService;
import org.springblade.desk.basic.pojo.entity.WorkTank; import org.springblade.desk.basic.service.IWorkCenterService;
import org.springblade.desk.basic.service.IWorkTankService; import org.springblade.desk.basic.service.IWorkTankService;
import org.springblade.desk.basic.util.ExcelExtUtil; import org.springblade.desk.basic.util.ExcelExtUtil;
import org.springblade.desk.quality.constant.QAModuleConst; import org.springblade.desk.quality.constant.QAModuleConst;
@ -37,6 +37,7 @@ import org.springblade.desk.quality.pojo.entity.LiquidTank;
import org.springblade.desk.quality.pojo.vo.LiquidTankVO; import org.springblade.desk.quality.pojo.vo.LiquidTankVO;
import org.springblade.desk.quality.service.ILiquidTankService; import org.springblade.desk.quality.service.ILiquidTankService;
import org.springblade.desk.quality.wrapper.LiquidTankWrapper; import org.springblade.desk.quality.wrapper.LiquidTankWrapper;
import org.springblade.system.feign.IUserClient;
import org.springblade.system.pojo.entity.User; import org.springblade.system.pojo.entity.User;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
@ -67,6 +68,15 @@ public class LiquidTankController extends BladeController {
@Resource @Resource
private IWorkTankService tankService; private IWorkTankService tankService;
@Resource
private IWorkCenterService centerService;
@Resource
private IFormulaService formulaService;
@Resource
private IUserClient iUserClient;
@Resource
private ITeamSetService teamService;
/** /**
* [槽液] 详情 * [槽液] 详情
*/ */
@ -262,8 +272,8 @@ public class LiquidTankController extends BladeController {
@Operation(summary = "下载Excel模板", description = "") @Operation(summary = "下载Excel模板", description = "")
public ResponseEntity<org.springframework.core.io.Resource> downloadExcelTemplate() { public ResponseEntity<org.springframework.core.io.Resource> downloadExcelTemplate() {
return ExcelExtUtil.downloadXlsTemplate( return ExcelExtUtil.downloadXlsTemplate(
"Excel/QA/ImportTemplate-CycleTestItem.xls", "Excel/QA/槽液信息.xls",
"导入模版-周期试验项目.xls"); "导入模版-槽液信息.xls");
} }
/** /**
@ -278,34 +288,61 @@ public class LiquidTankController extends BladeController {
list.forEach(noticeExcel -> { list.forEach(noticeExcel -> {
LiquidTank notice = BeanUtil.copy(noticeExcel, LiquidTank.class); LiquidTank notice = BeanUtil.copy(noticeExcel, LiquidTank.class);
//工作中心
QueryWrapper<WorkCenter> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("WC_NAME",noticeExcel.getWorkCenterName());
List<WorkCenter> centers = centerService.list(queryWrapper);
if(null != centers && centers.size() > 0){
notice.setWorkCenterId(centers.get(0).getId());
}
// List<User> userPlanners = iUserClient.listByNameNolike(noticeExcel.getPlannerName()); //作业槽
// if(null != userPlanners && userPlanners.size() > 0){ QueryWrapper<WorkTank> queryWrappertank = new QueryWrapper<>();
// notice.setPlanner(userPlanners.get(0).getId()); queryWrappertank.eq("NAME",noticeExcel.getWorkTankName());
// } List<WorkTank> tanks = tankService.list(queryWrappertank);
// if(null != tanks && tanks.size() > 0){
// List<User> userDispatchers = iUserClient.listByNameNolike(noticeExcel.getDispatcherName()); notice.setWorkTankId(tanks.get(0).getId());
// if(null != userDispatchers && userDispatchers.size() > 0){ }
// notice.setDispatcher(userDispatchers.get(0).getId()); //加药量计算公式
// } QueryWrapper<Formula> queryWrapperformulaadd = new QueryWrapper<>();
// queryWrapperformulaadd.eq("NAME",noticeExcel.getAddDrugFormulaName());
// List<User> userLeaders = iUserClient.listByNameNolike(noticeExcel.getTeamLeaderName()); queryWrapperformulaadd.eq("FORMULA_TYPE","1");
// if(null != userLeaders && userLeaders.size() > 0){ List<Formula> adds = formulaService.list(queryWrapperformulaadd);
// notice.setTeamLeader(userLeaders.get(0).getId()); if(null != adds && adds.size() > 0){
// } notice.setAddDrugFormulaId(adds.get(0).getId());
// }
// QueryWrapper<Shifts> queryWrapper = new QueryWrapper<>();
// queryWrapper.eq("name",noticeExcel.getCsName());
// List<Shifts> shifts = shiftService.list(queryWrapper);
// if(null != shifts && shifts.size() > 0){
// notice.setCsId(shifts.get(0).getId());
// }
//添加后理论值计算公式
QueryWrapper<Formula> queryWrapperformulaafter = new QueryWrapper<>();
queryWrapperformulaafter.eq("NAME",noticeExcel.getAfterTheoryFormulaName());
queryWrapperformulaafter.eq("FORMULA_TYPE","2");
List<Formula> afters = formulaService.list(queryWrapperformulaafter);
if(null != afters && afters.size() > 0){
notice.setAfterTheoryFormulaId(afters.get(0).getId());
}
//化验人
List<User> tests = iUserClient.listByNameNolike(noticeExcel.getTestUserName());
if(null != tests && tests.size() > 0){
notice.setTestUserId(tests.get(0).getId());
}
//工艺主管
List<User> process = iUserClient.listByNameNolike(noticeExcel.getProcessUserName());
if(null != process && process.size() > 0){
notice.setProcessUserId(process.get(0).getId());
}
//班组
QueryWrapper<TeamSet> queryWrapperteam = new QueryWrapper<>();
queryWrapperteam.eq("TS_NAME",noticeExcel.getTeamName());
List<TeamSet> teams = teamService.list(queryWrapperteam);
if(null != teams && teams.size() > 0){
notice.setTeamId(teams.get(0).getId());
}
noticeList.add(notice); noticeList.add(notice);
}); });
return R.status(service.saveBatch(noticeList)); return R.status(service.saveBatch(noticeList));
} }
@PostMapping("/updateUserBat") @PostMapping("/updateUserBat")
@ApiOperationSupport(order = 61) @ApiOperationSupport(order = 61)
@Operation(summary = "批量设置", description = "传入ids") @Operation(summary = "批量设置", description = "传入ids")

@ -31,14 +31,17 @@ import org.springblade.desk.basic.constant.BaseRequest;
import org.springblade.desk.quality.constant.LiquidTankTaskConst; import org.springblade.desk.quality.constant.LiquidTankTaskConst;
import org.springblade.desk.quality.constant.QAModuleConst; import org.springblade.desk.quality.constant.QAModuleConst;
import org.springblade.desk.quality.excel.LiquidTankTaskCopyExcel; import org.springblade.desk.quality.excel.LiquidTankTaskCopyExcel;
import org.springblade.desk.quality.pojo.entity.LiquidTank; import org.springblade.desk.quality.pojo.entity.*;
import org.springblade.desk.quality.pojo.entity.LiquidTankTask; import org.springblade.desk.quality.pojo.vo.LiquidTankReportDetailVO;
import org.springblade.desk.quality.pojo.entity.LiquidTankTaskCopy;
import org.springblade.desk.quality.pojo.vo.LiquidTankTaskCopyVO; import org.springblade.desk.quality.pojo.vo.LiquidTankTaskCopyVO;
import org.springblade.desk.quality.pojo.vo.LiquidTankWaveDrawVO; import org.springblade.desk.quality.pojo.vo.LiquidTankWaveDrawVO;
import org.springblade.desk.quality.pojo.vo.LiquidTankWaveDrawSingleVO; import org.springblade.desk.quality.pojo.vo.LiquidTankWaveDrawSingleVO;
import org.springblade.desk.quality.service.ILiquidTankReportConfigService;
import org.springblade.desk.quality.service.ILiquidTankReportService;
import org.springblade.desk.quality.service.ILiquidTankService; import org.springblade.desk.quality.service.ILiquidTankService;
import org.springblade.desk.quality.service.ILiquidTankTaskCopyService; import org.springblade.desk.quality.service.ILiquidTankTaskCopyService;
import org.springblade.desk.quality.util.FullMergeExcelUtil;
import org.springblade.desk.quality.wrapper.LiquidTankReportDetailWrapper;
import org.springblade.desk.quality.wrapper.LiquidTankTaskCopyWrapper; import org.springblade.desk.quality.wrapper.LiquidTankTaskCopyWrapper;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
@ -344,6 +347,50 @@ public class LiquidTankTaskCopyController extends BladeController {
"[槽液检测任务复制]数据表", list, LiquidTankTaskCopyExcel.class); "[槽液检测任务复制]数据表", list, LiquidTankTaskCopyExcel.class);
} }
@Resource
private ILiquidTankReportService reportService;
@Resource
private ILiquidTankReportConfigService configService;
@GetMapping("/exportData")
@ApiOperationSupport(order = 70)
@Operation(summary = "导出Excel", description = "传入LiquidTankTaskCopy")
public void exportData(Long id,
HttpServletResponse response) {
LiquidTankReport report = reportService.getById(id);
List<LiquidTankTaskCopyVO> list = service.getListByLiquidTankReportId(report.getId());
Long centerId = list.get(0).getWorkCenterId();
QueryWrapper<LiquidTankReportConfig> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("WC_ID",centerId);
List<LiquidTankReportConfig> rule = configService.list(queryWrapper);
String name = "";
if(null != rule && rule.size() > 0){
name = rule.get(0).getNamePrefix();
}
try {
FullMergeExcelUtil.exportUserExcel(
response,
"槽液检测报告",
name,
new String[]{"取样时间", "温度(℃)", "槽号", "体积(L)", "分析项目", "规范下限(g/L)", "目标下限(g/L)",
"添加点(g/L)", "目标值(g/L)","目标上限(g/L)","规范上限(g/L)","化验频率","化验值(g/L)",
"药品计算公式","药品添加量","药品批次号","药品监督员签名","药品添加人签名","调整后化验值(g/L)",
"是否合格","有效期","超出规范极限调整后的结果","槽液清理记录","控制规范"},
list,
new int[]{0}
);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/** /**
* [槽液检测任务复制] 下载Excel模板 * [槽液检测任务复制] 下载Excel模板
*/ */

@ -74,7 +74,7 @@
-- 车间订单 wo -- 车间订单 wo
LEFT JOIN MES_WORK_ORDER wo ON rs.WO_ID = wo.ID LEFT JOIN MES_WORK_ORDER wo ON rs.WO_ID = wo.ID
-- 外协厂商 oem -- 外协厂商 oem
LEFT JOIN BA_OEM oem ON wp.OC_ID = oem.ID LEFT JOIN BS_OEM oem ON wp.OC_ID = oem.ID
WHERE ( WHERE (
rs.IS_DELETED = 0 rs.IS_DELETED = 0
-- AND wp.IS_DELETED = 0 -- AND wp.IS_DELETED = 0
@ -150,7 +150,7 @@
-- 车间订单 wo -- 车间订单 wo
LEFT JOIN MES_WORK_ORDER wo ON rs.WO_ID = wo.ID LEFT JOIN MES_WORK_ORDER wo ON rs.WO_ID = wo.ID
-- 外协厂商 oem -- 外协厂商 oem
LEFT JOIN BA_OEM oem ON wp.OC_ID = oem.ID LEFT JOIN BS_OEM oem ON wp.OC_ID = oem.ID
WHERE ( WHERE (
rs.IS_DELETED = 0 rs.IS_DELETED = 0
-- AND wp.IS_DELETED = 0 -- AND wp.IS_DELETED = 0
@ -208,7 +208,7 @@
-- 车间订单 wo -- 车间订单 wo
LEFT JOIN MES_WORK_ORDER wo ON rs.WO_ID = wo.ID LEFT JOIN MES_WORK_ORDER wo ON rs.WO_ID = wo.ID
-- 外协厂商 oem -- 外协厂商 oem
LEFT JOIN BA_OEM oem ON wp.OC_ID = oem.ID LEFT JOIN BS_OEM oem ON wp.OC_ID = oem.ID
WHERE ( WHERE (
rs.IS_DELETED = 0 rs.IS_DELETED = 0
-- AND wp.IS_DELETED = 0 -- AND wp.IS_DELETED = 0

@ -163,7 +163,7 @@ public class LiquidTankTaskCopyServiceImpl extends BaseServiceImpl<LiquidTankTas
Long taskId = relOne.getLiquidTankTaskId(); Long taskId = relOne.getLiquidTankTaskId();
LiquidTankTaskCopy copy = getById(taskId); LiquidTankTaskCopy copy = getById(taskId);
LiquidTankTaskCopyVO copyVO = LiquidTankTaskCopyWrapper.build().entityVO(copy); LiquidTankTaskCopyVO copyVO = LiquidTankTaskCopyWrapper.build().entityVO(copy);
setVOValue(copyVO); // setVOValue(copyVO);
copyList.add(copyVO); copyList.add(copyVO);
} }
return copyList; return copyList;

@ -149,7 +149,7 @@ public class LiquidTankTaskServiceImpl extends BaseServiceImpl<LiquidTankTaskMap
// task = basicChangeStatus(task.getId(), LiquidTankTaskConst.S_PENDING_REVIEW); // task = basicChangeStatus(task.getId(), LiquidTankTaskConst.S_PENDING_REVIEW);
// todo:计算加药量,通过公式 公式尚未实现 公式计算的 需加药量。 // todo:计算加药量,通过公式 公式尚未实现 公式计算的 需加药量。
// task.setAddUnit(1000); // task.setAddUnit(1000);
task.setNeedAddValue(1000.0); // task.setNeedAddValue(1000.0);
// 首次化验时间 要用户填写 // 首次化验时间 要用户填写
// 首次填报时间 // 首次填报时间
task.setFirstFillDate(LocalDateTime.now()); task.setFirstFillDate(LocalDateTime.now());

@ -0,0 +1,279 @@
package org.springblade.desk.quality.util;
import jakarta.servlet.http.HttpServletResponse;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springblade.desk.dashboard.utils.DateUtils;
import org.springblade.desk.quality.pojo.vo.LiquidTankTaskCopyVO;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.Map;
public class FullMergeExcelUtil {
/**
* 导出带合并标头+数据合并的ExcelUser实体类版本
* @param response 响应对象
* @param fileName 导出文件名
* @param mergeTitle 合并标头的大标题
* @param columnTitles 列标题数组["部门","用户ID","用户名","年龄","手机号"]
* @param userList 用户实体类列表
* @param mergeColumnIndexes 需要合并的列索引[0]表示合并部门列
* @throws Exception 异常
*/
public static void exportUserExcel(HttpServletResponse response, String fileName,
String mergeTitle, String[] columnTitles,
List<LiquidTankTaskCopyVO> userList, int[] mergeColumnIndexes) throws Exception {
// 1. 创建工作簿和工作表
Workbook workbook = new XSSFWorkbook();
Sheet sheet = workbook.createSheet("数据报表");
// 设置列宽
for (int i = 0; i < columnTitles.length; i++) {
sheet.autoSizeColumn(i);
sheet.setColumnWidth(i, Math.max(sheet.getColumnWidth(i), 2000));
}
// -------------------------- 第一步:创建合并标头 --------------------------
Row mergeTitleRow = sheet.createRow(0);
mergeTitleRow.setHeightInPoints(30);
Cell mergeTitleCell = mergeTitleRow.createCell(0);
mergeTitleCell.setCellValue(mergeTitle);
CellStyle mergeTitleStyle = createStyle(workbook, true, (short) 16, HorizontalAlignment.CENTER);
mergeTitleCell.setCellStyle(mergeTitleStyle);
sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, columnTitles.length - 1));
// -------------------------- 第二步:创建列标题 --------------------------
Row columnTitleRow = sheet.createRow(1);
columnTitleRow.setHeightInPoints(20);
CellStyle columnTitleStyle = createStyle(workbook, true, (short) 12, HorizontalAlignment.CENTER);
for (int i = 0; i < columnTitles.length; i++) {
Cell cell = columnTitleRow.createCell(i);
cell.setCellValue(columnTitles[i]);
cell.setCellStyle(columnTitleStyle);
sheet.autoSizeColumn(i);
}
// -------------------------- 第三步:填充User实体数据 --------------------------
int dataStartRow = 2;
CellStyle dataStyle = createStyle(workbook, false, (short) 12, HorizontalAlignment.CENTER);
for (int i = 0; i < userList.size(); i++) {
Row dataRow = sheet.createRow(dataStartRow + i);
dataRow.setHeightInPoints(20);
LiquidTankTaskCopyVO user = userList.get(i);
// 手动映射:列索引 → User字段(与columnTitles一一对应)
// 取样时间
int a = 0;
Cell cell0 = dataRow.createCell(a);
cell0.setCellStyle(dataStyle);
cell0.setCellValue(user.getSampleDate());
//温度
int b = 1;
Cell cell1 = dataRow.createCell(b);
cell1.setCellStyle(dataStyle);
cell1.setCellValue(user.getTemperatureActual());
//槽号
int c = 2;
Cell cell2 = dataRow.createCell(c);
// cell2.setCellStyle(dataStyle);
cell2.setCellValue(user.getWorkTankName() == null ? "" : user.getWorkTankName());
//体积(L)
int d = 3;
Cell cell3 = dataRow.createCell(d);
// cell3.setCellStyle(dataStyle);
cell3.setCellValue(user.getVolume() == null ? 0 : user.getVolume());
//分析项目
Cell cell4 = dataRow.createCell(4);
cell4.setCellStyle(dataStyle);
cell4.setCellValue(user.getTestElement() == null ? "" : user.getTestElement());
//规范下限(g/L)
Cell cell5 = dataRow.createCell(5);
cell5.setCellStyle(dataStyle);
cell5.setCellValue(user.getNormValueMin() == null ? 0 : user.getNormValueMin());
//目标下限(g/L)
Cell cell6 = dataRow.createCell(6);
cell6.setCellStyle(dataStyle);
cell6.setCellValue(user.getTargetValueMin() == null ? 0 : user.getTargetValueMin());
//添加点(g/L)
Cell cell7 = dataRow.createCell(7);
cell7.setCellStyle(dataStyle);
cell7.setCellValue(user.getFillingLocation() == null ? 0 : user.getFillingLocation());
//目标值(g/L)
Cell cell8 = dataRow.createCell(8);
cell8.setCellStyle(dataStyle);
cell8.setCellValue(user.getTargetValue() == null ? 0 : user.getTargetValue());
//目标上限(g/L)
Cell cell9 = dataRow.createCell(9);
cell9.setCellStyle(dataStyle);
cell9.setCellValue(user.getTargetValueMax() == null ? 0 : user.getTargetValueMax());
//规范上限(g/L)
Cell cell10 = dataRow.createCell(10);
cell10.setCellStyle(dataStyle);
cell10.setCellValue(user.getNormValueMax() == null ? 0 : user.getNormValueMax());
//化验频率
Cell cell11 = dataRow.createCell(11);
cell11.setCellStyle(dataStyle);
cell11.setCellValue(user.getTestFrequency() == null ? "" : user.getTestFrequency());
//化验值(g/L)
Cell cell12 = dataRow.createCell(12);
cell12.setCellStyle(dataStyle);
cell12.setCellValue(user.getFirstTestValue() == null ? 0 : user.getFirstTestValue());
//药品计算公式
Cell cell13 = dataRow.createCell(13);
cell13.setCellStyle(dataStyle);
cell13.setCellValue(user.getReportFormulaContent() == null ? "" : user.getReportFormulaContent());
//药品添加量
Cell cell14 = dataRow.createCell(14);
cell14.setCellStyle(dataStyle);
cell14.setCellValue(user.getActualAddValue() == null ? 0 : user.getActualAddValue());
//药品批次号
Cell cell15 = dataRow.createCell(15);
cell15.setCellStyle(dataStyle);
cell15.setCellValue(user.getDrugBatCode() == null ? "" : user.getDrugBatCode());
//药品监督员签名
Cell cell16 = dataRow.createCell(16);
cell16.setCellStyle(dataStyle);
cell16.setCellValue(user.getDrugSuUserSign()== null ? "" : user.getDrugSuUserSign());
//药品添加人签名
Cell cell17 = dataRow.createCell(17);
cell17.setCellStyle(dataStyle);
cell17.setCellValue(user.getDrugAddUserSign()== null ? "" : user.getDrugAddUserSign());
//调整后化验值(g/L)
Cell cell18 = dataRow.createCell(18);
cell18.setCellStyle(dataStyle);
cell18.setCellValue(user.getRepeatTestValue()== null ? 0 : user.getRepeatTestValue());
//1\合格 2、不合格
Cell cell19 = dataRow.createCell(19);
cell19.setCellStyle(dataStyle);
cell19.setCellValue(user.getQualified()== null ? 0 : user.getQualified());
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
//有效期
Cell cell20 = dataRow.createCell(20);
cell20.setCellStyle(dataStyle);
cell20.setCellValue(user.getValidDate().format(formatter));
//超出规范极限调整后的结果
Cell cell21 = dataRow.createCell(21);
cell21.setCellStyle(dataStyle);
cell21.setCellValue(user.getOutRangeResult()==null ? "" : user.getOutRangeResult());
//槽液清理记录
Cell cell22 = dataRow.createCell(22);
cell22.setCellStyle(dataStyle);
cell22.setCellValue(user.getClearRecord()==null ? "" : user.getClearRecord());
//控制规范
Cell cell23 = dataRow.createCell(23);
cell23.setCellStyle(dataStyle);
cell23.setCellValue(user.getNorm()==null ? "" : user.getNorm());
}
// -------------------------- 第四步:合并数据列相同值 --------------------------
// if (mergeColumnIndexes != null && mergeColumnIndexes.length > 0 && userList.size() > 0) {
// for (int colIndex : mergeColumnIndexes) {
// if (colIndex < 0 || colIndex >= columnTitles.length) {
// continue;
// }
// mergeSameValueCells(sheet, dataStartRow, dataStartRow + userList.size() - 1, colIndex);
// }
// }
// -------------------------- 第五步:响应头和文件输出 --------------------------
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.setCharacterEncoding("UTF-8");
String encodeFileName = URLEncoder.encode(fileName, "UTF-8").replaceAll("\\+", "%20");
response.setHeader("Content-Disposition", "attachment;filename*=UTF-8''" + encodeFileName + ".xlsx");
OutputStream outputStream = response.getOutputStream();
workbook.write(outputStream);
outputStream.flush();
outputStream.close();
workbook.close();
}
/**
* 合并指定列连续相同值的单元格逻辑不变
*/
private static void mergeSameValueCells(Sheet sheet, int startRow, int endRow, int colIndex) {
int mergeStartRow = startRow;
for (int rowIndex = startRow + 1; rowIndex <= endRow; rowIndex++) {
String currentValue = getCellValue(sheet.getRow(rowIndex).getCell(colIndex));
String prevValue = getCellValue(sheet.getRow(rowIndex - 1).getCell(colIndex));
if (!currentValue.equals(prevValue)) {
if (mergeStartRow < rowIndex - 1) {
sheet.addMergedRegion(new CellRangeAddress(mergeStartRow, rowIndex - 1, colIndex, colIndex));
}
mergeStartRow = rowIndex;
}
if (rowIndex == endRow && mergeStartRow <= endRow) {
sheet.addMergedRegion(new CellRangeAddress(mergeStartRow, endRow, colIndex, colIndex));
}
}
}
/**
* 获取单元格字符串值逻辑不变
*/
private static String getCellValue(Cell cell) {
if (cell == null) {
return "";
}
switch (cell.getCellType()) {
case STRING:
return cell.getStringCellValue().trim();
case NUMERIC:
return String.valueOf(cell.getNumericCellValue()).trim();
case BOOLEAN:
return String.valueOf(cell.getBooleanCellValue()).trim();
case FORMULA:
return cell.getCellFormula().trim();
default:
return "";
}
}
/**
* 创建样式逻辑不变
*/
private static CellStyle createStyle(Workbook workbook, boolean isBold, short fontSize, HorizontalAlignment alignment) {
CellStyle style = workbook.createCellStyle();
Font font = workbook.createFont();
font.setBold(isBold);
font.setFontName("宋体");
font.setFontHeightInPoints(fontSize);
style.setFont(font);
style.setAlignment(alignment);
style.setVerticalAlignment(VerticalAlignment.CENTER);
style.setBorderTop(BorderStyle.THIN);
style.setBorderBottom(BorderStyle.THIN);
style.setBorderLeft(BorderStyle.THIN);
style.setBorderRight(BorderStyle.THIN);
return style;
}
}

@ -26,6 +26,7 @@
package org.springblade.scheduling.scheduling.feign; package org.springblade.scheduling.scheduling.feign;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import io.swagger.v3.oas.annotations.Hidden; import io.swagger.v3.oas.annotations.Hidden;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
@ -37,14 +38,17 @@ import org.springblade.core.tenant.annotation.NonDS;
import org.springblade.core.tool.api.R; import org.springblade.core.tool.api.R;
import org.springblade.core.tool.utils.DateUtil; import org.springblade.core.tool.utils.DateUtil;
import org.springblade.scheduling.feign.IWorkOrderClient; import org.springblade.scheduling.feign.IWorkOrderClient;
import org.springblade.scheduling.pojo.entity.QualityGradeEntity;
import org.springblade.scheduling.pojo.vo.GlassCakeOrderPageQuery; import org.springblade.scheduling.pojo.vo.GlassCakeOrderPageQuery;
import org.springblade.scheduling.pojo.vo.WorkOrderVO; import org.springblade.scheduling.pojo.vo.WorkOrderVO;
import org.springblade.scheduling.scheduling.service.IEquipResourceService; import org.springblade.scheduling.scheduling.service.IEquipResourceService;
import org.springblade.scheduling.scheduling.service.IPersonResourceService; import org.springblade.scheduling.scheduling.service.IPersonResourceService;
import org.springblade.scheduling.scheduling.service.IQualityGradeService;
import org.springblade.scheduling.scheduling.service.IWorkOrderService; import org.springblade.scheduling.scheduling.service.IWorkOrderService;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import java.util.Date; import java.util.Date;
import java.util.List;
/** /**
@ -64,7 +68,7 @@ public class WorkOrderClient implements IWorkOrderClient {
private final IPersonResourceService personResourceService; private final IPersonResourceService personResourceService;
private final IEquipResourceService equipResourceService; private final IEquipResourceService equipResourceService;
private final IQualityGradeService qualityGradeService;
@Override @Override
public R<Void> scheduling() { public R<Void> scheduling() {
@ -91,4 +95,20 @@ public class WorkOrderClient implements IWorkOrderClient {
WorkOrderVO workOrder = new WorkOrderVO(); WorkOrderVO workOrder = new WorkOrderVO();
return R.data(workOrderService.selectGlassCakeOrderPage(Condition.getPage(query), workOrder)); return R.data(workOrderService.selectGlassCakeOrderPage(Condition.getPage(query), workOrder));
} }
@Override
public R<QualityGradeEntity> getById(Long id) {
QualityGradeEntity entity = qualityGradeService.getById( id);
return R.data(entity);
}
@Override
public R<QualityGradeEntity> getByName(String name) {
QueryWrapper<QualityGradeEntity> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("quality_grade",name);
List<QualityGradeEntity> list = qualityGradeService.list(queryWrapper);
if(null != list || list.size() > 0){
return R.data(list.get(0));
}
return R.data(new QualityGradeEntity());
}
} }

Loading…
Cancel
Save