package com.ruoyi.inspect.service.impl; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONUtil; import com.alibaba.excel.EasyExcel; import com.alibaba.excel.ExcelWriter; import com.alibaba.excel.write.metadata.WriteSheet; import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.basic.mapper.IfsInventoryQuantityMapper; import com.ruoyi.basic.mapper.StandardProductListMapper; import com.ruoyi.basic.pojo.IfsInventoryQuantity; import com.ruoyi.basic.pojo.StandardProductList; import com.ruoyi.basic.pojo.StructureTestObject; import com.ruoyi.common.constant.InsOrderTypeConstants; import com.ruoyi.common.core.domain.entity.User; import com.ruoyi.common.numgen.NumberGenerator; import com.ruoyi.common.utils.*; import com.ruoyi.common.utils.api.IfsApiUtils; import com.ruoyi.framework.exception.ErrorException; import com.ruoyi.inspect.dto.*; import com.ruoyi.inspect.mapper.*; import com.ruoyi.inspect.pojo.*; import com.ruoyi.inspect.service.InsOrderService; import com.ruoyi.inspect.service.InsOrderStateService; import com.ruoyi.inspect.service.InsProductService; import com.ruoyi.inspect.service.InsSampleService; import com.ruoyi.inspect.vo.InsOrderPrintingVo; import com.ruoyi.performance.pojo.AuxiliaryOutputWorkingHoursTemporary; import com.ruoyi.performance.service.AuxiliaryOutputWorkingHoursTemporaryService; import com.ruoyi.system.mapper.UserMapper; import lombok.AllArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.math.BigDecimal; import java.net.URLEncoder; import java.text.SimpleDateFormat; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.Month; import java.time.format.DateTimeFormatter; import java.util.*; import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; /** * @author gaoaoy * @description 针对表【ins_order(检验下单)】的数据库操作Service实现 * @createDate 2024-03-12 16:17:55 */ @Service @AllArgsConstructor public class InsOrderServiceImpl extends ServiceImpl implements InsOrderService { private InsOrderMapper insOrderMapper; private InsSampleService insSampleService; private InsSampleMapper insSampleMapper; private InsProductService insProductService; private InsProductMapper insProductMapper; private InsSampleUserMapper insSampleUserMapper; private InsOrderStateService insOrderStateService; private UserMapper userMapper; private IfsInventoryQuantityMapper ifsInventoryQuantityMapper; private final NumberGenerator numberGenerator; private InsReportMapper insReportMapper; private InsUnqualifiedRetestProductMapper insUnqualifiedRetestProductMapper; private IfsApiUtils ifsApiUtils; private SpotCheckQuarterItemMapper spotCheckQuarterItemMapper; private StandardProductListMapper standardProductListMapper; private AuxiliaryOutputWorkingHoursTemporaryService auxiliaryOutputWorkingHoursTemporaryService; //获取检验下单数据 @Override public IPage selectInsOrderParameter(IPage page, SampleOrderDto sampleOrderDto) { //todo: 只看我判断全部,个人,组织的权限 String laboratory = null; // 判断是否是全部 String isOrderAll = null; if (sampleOrderDto.getState() != null && sampleOrderDto.getState() == -2) { isOrderAll = "1"; sampleOrderDto.setState(null); } return insOrderMapper.selectInsOrderPage(page, QueryWrappers.queryWrappers(sampleOrderDto), laboratory, isOrderAll); } /** * 分配检验人 * * @return */ @Override @Transactional(rollbackFor = Exception.class) public int upInsOrder(Integer orderId, Integer sampleId, String appointed, Integer userId, String sonLaboratory) { InsOrder insOrder = new InsOrder(); insOrder.setId(orderId); insOrder.setAppointed(StringUtils.isNotEmpty(appointed) ? LocalDate.parse(appointed) : null); insOrder.setSendTime(LocalDateTime.now()); insOrderMapper.updateById(insOrder); List insSamples = insSampleMapper.selectList(Wrappers.lambdaQuery().eq(InsSample::getInsOrderId, orderId)); List ids = insSamples.stream().map(InsSample::getId).collect(Collectors.toList()); List insProducts = insProductMapper.selectList(Wrappers.lambdaQuery() .in(InsProduct::getInsSampleId, ids) .eq(InsProduct::getState, 1) .select(InsProduct::getSonLaboratory).groupBy(InsProduct::getSonLaboratory)); // 批量添加检验任务状态表 List insOrderStateList = insProducts.stream().map(insProduct -> { InsOrderState insOrderState = new InsOrderState(); insOrderState.setInsOrderId(orderId); try { insOrderState.setLaboratory(insProduct.getSonLaboratory()); } catch (NullPointerException e) { throw new ErrorException("该检验单有未维护实验室的检验项目"); } insOrderState.setInsState(0); return insOrderState; }).collect(Collectors.toList()); insOrderStateService.saveBatch(insOrderStateList); if (userId != null) { InsSampleUser insSampleUser = new InsSampleUser(); insSampleUser.setState(0); insSampleUser.setUserId(userId); insSampleUser.setInsSampleId(orderId); insSampleUser.setSonLaboratory(sonLaboratory); insSampleUserMapper.insert(insSampleUser); } // 判断订单有没有绑定抽样计划 InsOrder order = insOrderMapper.selectById(orderId); if (order.getQuarterItemId() != null) { // 需要添加下发时间到抽样时间, 取样人员就是检测人 SpotCheckQuarterItem spotCheckQuarterItem = spotCheckQuarterItemMapper.selectById(order.getQuarterItemId()); spotCheckQuarterItem.setSpotCheckTime(order.getSendTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))); User user = userMapper.selectById(userId); spotCheckQuarterItem.setSamplingUser(user.getName()); spotCheckQuarterItemMapper.updateById(spotCheckQuarterItem); } // 创建工时暂存 // 缓存样品id, 编号map // addWorkingHoursTemporary(userId, insSamples, ids, order); return 1; } /** * 创建工时暂存 * @param userId * @param insSamples * @param ids * @param order */ private void addWorkingHoursTemporary(Integer userId, List insSamples, List ids, InsOrder order) { Map sampleMap = insSamples.stream().collect(Collectors.toMap(InsSample::getId, InsSample::getSampleCode)); List insProductList = insProductMapper.selectList(Wrappers.lambdaQuery() .in(InsProduct::getInsSampleId, ids) .eq(InsProduct::getState, 1)); List outputWorkingHours = insProductList.stream().map(insProduct -> { AuxiliaryOutputWorkingHoursTemporary auxiliaryOutputWorkingHours = new AuxiliaryOutputWorkingHoursTemporary(); auxiliaryOutputWorkingHours.setInspectionItemClass(insProduct.getInspectionItemClass());//检测项分类 auxiliaryOutputWorkingHours.setInspectionItem(insProduct.getInspectionItem());//检测父项 auxiliaryOutputWorkingHours.setInspectionItemSubclass(insProduct.getInspectionItemSubclass());//检测子项 auxiliaryOutputWorkingHours.setSample(sampleMap.get(insProduct.getInsSampleId()));//样品编号 auxiliaryOutputWorkingHours.setOrderId(order.getId());//订单id auxiliaryOutputWorkingHours.setOrderNo(order.getEntrustCode());//非加班委托单号 auxiliaryOutputWorkingHours.setWorkTime(insProduct.getManHour());//非加班工时 auxiliaryOutputWorkingHours.setAmount(1);//非加班数量 auxiliaryOutputWorkingHours.setOutputWorkTime((ObjectUtils.isNotEmpty(auxiliaryOutputWorkingHours.getOvertimeWorkTime()) ? auxiliaryOutputWorkingHours.getOvertimeWorkTime() : BigDecimal.ZERO).add(ObjectUtils.isNotEmpty(auxiliaryOutputWorkingHours.getWorkTime()) ? auxiliaryOutputWorkingHours.getWorkTime() : BigDecimal.ZERO));//产量工时 auxiliaryOutputWorkingHours.setManHourGroup(insProduct.getManHourGroup());//工时分组 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); DateTimeFormatter formatters = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); auxiliaryOutputWorkingHours.setDateTime(LocalDateTime.now().toLocalDate().atStartOfDay().format(formatters));//日期 LocalDateTime localDateTime = LocalDateTime.now(); DateTime parse = DateUtil.parse(localDateTime.format(formatter)); auxiliaryOutputWorkingHours.setWeekDay(getWeek(localDateTime.format(formatters)));//星期 auxiliaryOutputWorkingHours.setWeek(String.valueOf(DateUtil.weekOfYear(DateUtil.offsetDay(parse, 1))));//周次 auxiliaryOutputWorkingHours.setCheck(userId);//检测人 auxiliaryOutputWorkingHours.setPrice(insProduct.getPrice());//单价 auxiliaryOutputWorkingHours.setSampleId(insProduct.getInsSampleId());//样品id auxiliaryOutputWorkingHours.setInsProductId(insProduct.getId());//检验项id return auxiliaryOutputWorkingHours; }).collect(Collectors.toList()); auxiliaryOutputWorkingHoursTemporaryService.saveBatch(outputWorkingHours); } public static String getWeek(String dayStr) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); try { Date date = sdf.parse(dayStr); Calendar calendar = Calendar.getInstance(); calendar.setTime(date); int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK); int day = calendar.get(Calendar.DAY_OF_MONTH); return getWeekDay(dayOfWeek); } catch (Exception e) { e.printStackTrace(); } return null; } public static String getWeekDay(int dayOfWeek) { switch (dayOfWeek) { case Calendar.MONDAY: return "周一"; case Calendar.TUESDAY: return "周二"; case Calendar.WEDNESDAY: return "周三"; case Calendar.THURSDAY: return "周四"; case Calendar.FRIDAY: return "周五"; case Calendar.SATURDAY: return "周六"; case Calendar.SUNDAY: return "周日"; default: return "未知"; } } @Override @Transactional(rollbackFor = Exception.class) public int addInsOrder(List list, InsOrder insOrder) { // todo: 下单判断抽样计划的唯一性 if (insOrder.getQuarterItemId() != null) { Long quarterItemCount = insOrderMapper.selectCount(Wrappers.lambdaQuery() .eq(InsOrder::getQuarterItemId, insOrder.getQuarterItemId()) .notIn(InsOrder::getState, -1 ,2 ,3)); if (quarterItemCount > 0) { throw new ErrorException("该抽样计划已被绑定过"); } } insOrder.setState(0); LocalDate appointed = insOrder.getAppointed(); insOrderMapper.insert(insOrder); // 主表 list.forEach(a -> { a.setId(null); a.setInsOrderId(insOrder.getId()); insSampleMapper.insert(a); if (ObjectUtil.isNotEmpty(a.getInsProduct())) { // 判断是否填写待检项数量 if (a.getQuantity() != null) { List ip2 = new ArrayList<>(); for (Integer i = 1; i <= a.getQuantity(); i++) { // 重新拷贝 创建新对象 AtomicInteger atomicInteger = new AtomicInteger(i); List insProducts = a.getInsProduct().stream().map(insProduct -> { insProduct.setRawMaterialTag(String.valueOf(atomicInteger.get())); InsProduct product = new InsProduct(); BeanUtils.copyProperties(insProduct, product); return product; }).collect(Collectors.toList()); ip2.addAll(insProducts); } addInsProductMethod(a.getId(), ip2); } else { addInsProductMethod(a.getId(), a.getInsProduct()); } } // 判断是否有电缆配置 if (ObjectUtil.isNotEmpty(a.getInsulating())) { // 判断是否有辅助线芯 if (ObjectUtil.isNotEmpty(a.getAuxiliaryWireCore())) { if (a.getAuxiliaryWireCore().getInsProduct().stream().filter(insProduct -> insProduct.getState() == 1).count() != a.getInsulating().getInsProduct().stream().filter(insProduct -> insProduct.getState() == 1).count()) { throw new ErrorException("电缆配置辅助线芯检验项数量不统一, 请检查"); } } List ip2 = new ArrayList<>(); for (String s : a.getInsulating().getNum()) { // 重新拷贝 创建新对象 List insProducts = a.getInsulating().getInsProduct().stream().map(insProduct -> { insProduct.setCableTag(s); InsProduct product = new InsProduct(); BeanUtils.copyProperties(insProduct, product); return product; }).collect(Collectors.toList()); ip2.addAll(insProducts); } for (InsProduct product : ip2) { product.setStandardMethodListId(a.getInsulating().getStandardMethodListId()); } addInsProductMethod(a.getId(), ip2); } // 判断是否有辅助线芯 if (ObjectUtil.isNotEmpty(a.getAuxiliaryWireCore())) { List ip2 = new ArrayList<>(); for (String s : a.getAuxiliaryWireCore().getNum()) { // 重新拷贝 创建新对象 List insProducts = a.getAuxiliaryWireCore().getInsProduct().stream().map(insProduct -> { insProduct.setCableTag(s); InsProduct product = new InsProduct(); BeanUtils.copyProperties(insProduct, product); return product; }).collect(Collectors.toList()); ip2.addAll(insProducts); } for (InsProduct product : ip2) { product.setStandardMethodListId(a.getAuxiliaryWireCore().getStandardMethodListId()); } addInsProductMethod(a.getId(), ip2); } // 子样品配置 if (ObjectUtil.isNotEmpty(a.getChildSampleList())) { for (SampleProductDto b : a.getChildSampleList()) { for (int i = 0; i < b.getNum(); i++) { b.setId(null); b.setInsOrderId(insOrder.getId()); b.setParentId(a.getId()); insSampleMapper.insert(b); if (ObjectUtil.isNotEmpty(b.getInsProduct())) { addInsProductMethod(b.getId(), b.getInsProduct()); } } } } }); //是否为原材料下单 if (insOrder.getTypeSource() != null && insOrder.getTypeSource().equals(1)) { // 原材料下单: 委托人就是报检人, 生产单位就是供应商单位 IfsInventoryQuantity ifsInventoryQuantity = ifsInventoryQuantityMapper.selectById(insOrder.getIfsInventoryId()); Integer declareUserId = ifsInventoryQuantity.getDeclareUserId(); User user = userMapper.selectById(declareUserId); if (user == null) { throw new ErrorException("缺少报检人信息"); } // 供应商名称 insOrder.setProduction(ifsInventoryQuantity.getSupplierName()); insOrder.setProductionEn(""); // 委托人名称 insOrder.setPrepareUserId(user.getId()); insOrder.setPrepareUser(user.getName()); insOrder.setPrepareUserEn(user.getNameEn()); insOrder.setPhone(user.getPhone()); insOrder.setState(1); Long count1 = insOrderMapper.selectCount(Wrappers.lambdaQuery() .eq(InsOrder::getIfsInventoryId, insOrder.getIfsInventoryId()) .ne(InsOrder::getState, -1) .eq(InsOrder::getOrderType, InsOrderTypeConstants.ENTER_THE_FACTORY) .ne(InsOrder::getId, insOrder.getId())); // 判断之前是否有进厂检验 if (count1 == 0) { ifsInventoryQuantityMapper.update(null, new LambdaUpdateWrapper().set(IfsInventoryQuantity::getState, 1) .eq(IfsInventoryQuantity::getId, insOrder.getIfsInventoryId())); } // 判断结束状态修改合格状态 if (ifsInventoryQuantity.getIsFinish().equals(0)) { ifsInventoryQuantityMapper.update(null, Wrappers.lambdaUpdate() .eq(IfsInventoryQuantity::getId, insOrder.getIfsInventoryId()) .set(IfsInventoryQuantity::getInspectStatus, 0)); } // 审核检验单 upInsOrderOfState(insOrder); // 分配检验人 upInsOrder(insOrder.getId(), null, appointed != null ? appointed.toString() : null, SecurityUtils.getUserId().intValue(), "原材料"); // 根据零件号判断是否是辅材 boolean isRaw = false; StructureTestObject productObject = insOrderMapper.selectProductByPartNo(ifsInventoryQuantity.getPartNo()); // 查询产品 if (productObject != null && StrUtil.isNotBlank(productObject.getObjectType()) && productObject.getObjectType().equals("1")) { isRaw = true; } else { // 查询对象 StructureTestObject testObject = insOrderMapper.selectByPartNo(ifsInventoryQuantity.getPartNo()); if (testObject != null && StrUtil.isNotBlank(testObject.getObjectType()) && testObject.getObjectType().equals("1")) { isRaw = true; } } if (isRaw) { // 获取当前季度的开始时间和结束时间 LocalDateTime now = LocalDateTime.now(); // 获取当前月份 int month = now.getMonthValue(); // 确定当前季度的开始月份 int startMonth = (month - 1) / 3 * 3 + 1; // 构造季度的开始时间 LocalDateTime startOfQuarter = LocalDateTime.of(now.getYear(), Month.of(startMonth), 1, 0, 0); // 计算下一个季度的开始时间 LocalDateTime startOfNextQuarter = startOfQuarter.plusMonths(3); // 计算当前季度的结束时间 LocalDateTime endOfQuarter = startOfNextQuarter.minusSeconds(1); // 根据下单的规格型号判断是否为季度首次出现 Integer count = ifsInventoryQuantityMapper.selectIsFirst(insOrder.getPartDetail(), ifsInventoryQuantity.getSupplierName(), startOfNextQuarter, endOfQuarter); if(count == 0) { ifsInventoryQuantity.setIsFirst(1); ifsInventoryQuantityMapper.update(null, Wrappers.lambdaUpdate() .eq(IfsInventoryQuantity::getId, insOrder.getIfsInventoryId()) .set(IfsInventoryQuantity::getIsFirst, 1)); } } } return insOrder.getId(); } /** * 添加检验项 * @param sampleId * @param productList */ private void addInsProductMethod(Integer sampleId, List productList) { for (InsProduct product : productList) { if (product.getState() == 1) { product.setId(null); product.setCreateTime(null); product.setCreateUser(null); product.setUpdateTime(null); product.setUpdateUser(null); product.setInsSampleId(sampleId); if (product.getInspectionItemSubclass() == null) { product.setInspectionItemSubclass(""); } if (StringUtils.isBlank(product.getAsk()) || StringUtils.isBlank(product.getTell())) { throw new ErrorException("有检验项的要求值或要求描述为空, 请先去标准库配置要求值或要求描述"); } if (StringUtils.isBlank(product.getSonLaboratory())) { throw new ErrorException("有检验项的的子实验室为绑定, 请先绑定子实验室"); } insProductMapper.insert(product); } } } @Override public Map getInsOrder(Integer id) { Map map = new HashMap<>(); InsOrder insOrder = insOrderMapper.selectById(id); List list; // 判断是否是进厂报告免检 if (insOrder.getIsExemption().equals(1)) { list = insSampleMapper.selectExemptionByOrderId(id); } else { list = insSampleMapper.selectSampleProductListByOrderId2(id); } Map map1 = insSampleMapper.selectInsOrder(id); map.put("insOrder", insOrder); map.put("sampleProduct", list); map.put("insOrderTemplate", map1); return map; } /** * 审核检验单 * @param insOrder * @return */ @Override public int upInsOrderOfState(InsOrder insOrder) { insOrder.setExamineTime(LocalDateTime.now()); if (insOrder.getState() == 1) { //审核通过才会生成委托编号 // todo: 检验类型编号 InsOrder order = this.getById(insOrder.getId()); String code = ""; switch (order.getOrderType()) { case InsOrderTypeConstants.SPOT_CHECK: code = "C"; break; case InsOrderTypeConstants.CUSTOMER_ORDERED: code = "W"; break; case InsOrderTypeConstants.ENTER_THE_FACTORY: case InsOrderTypeConstants.QUARTERLY_TEST: code = "Y"; break; } // 生成编号 String no = numberGenerator.generateNumberWithPrefix(3, "JCZX/NS-" + code + LimsDateUtil.resetDate(LocalDateTime.now()), InsOrder::getEntrustCode); // 判断是否是季度检验, 是季度检验取消原材料季度检验下单 if (InsOrderTypeConstants.QUARTERLY_TEST.equals(order.getOrderType())) { ifsInventoryQuantityMapper.update(null, Wrappers.lambdaUpdate() .eq(IfsInventoryQuantity::getId, order.getIfsInventoryId()) .set(IfsInventoryQuantity::getIsQuarter, 0)); // 查询是否有过进厂检验, 有获取里面的编号 InsOrder order1 = insOrderMapper.selectOne(Wrappers.lambdaQuery() .eq(InsOrder::getIfsInventoryId, order.getIfsInventoryId()) .ne(InsOrder::getState, -1) .eq(InsOrder::getOrderType, InsOrderTypeConstants.ENTER_THE_FACTORY)); if (order1 != null) { no = order1.getEntrustCode(); } } int count = 1; // 查询样品表 List insSamples = insSampleMapper.selectList(Wrappers.lambdaQuery() .eq(InsSample::getInsOrderId, insOrder.getId())); for (InsSample insSample : insSamples) { if (StringUtils.isBlank(insSample.getSampleCode())) { // 如果只有一个样品就不需要拼接数字 if (insSamples.size() != 1) { insSample.setSampleCode(no + "-" + count); count++; } else { insSample.setSampleCode(no); } } } insSampleService.updateBatchById(insSamples); insOrder.setEntrustCode(no); } return insOrderMapper.updateById(insOrder); } @Override public Map getInsOrderAndSample(Integer id, String laboratory) { Map map = new HashMap<>(); InsOrder insOrder = insOrderMapper.selectById(id); List list = insSampleMapper.getInsOrderAndSample(id, laboratory); map.put("insOrder", insOrder); map.put("sampleProduct", list); //查询所有记录模版去重 List> list2 = insOrderMapper.selectReportModelByOrderId(id, laboratory); map.put("reportModel", list2); return map; } @Override public IPage selectSampleAndProductByOrderId(IPage page, SampleProductDto2 sampleProductDto) { IPage productDto2IPage = insOrderMapper.selectSampleAndProductByOrderId(page, QueryWrappers.queryWrappers(sampleProductDto) .orderByAsc("sample_code") .orderByAsc("cable_tag") .orderByAsc("sort"), sampleProductDto.getId()); return productDto2IPage; } @Override public int updateStatus(Integer id) { return insOrderMapper.updateStatus(id); } /** * 获取ifs库存信息 * @param * @return */ @Override public void getIfsOrder() { HashMap map = new HashMap<>(); map.put("LOCATION_NO","1302"); map.put("STATE_DB","To be Inspected"); List> inventory = ifsApiUtils.getInventory(JSONUtil.toJsonStr(map)); if(inventory.size() == 0) { return; } // 进行保存 for (Map map1 : inventory) { DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); // 时间格式化 IfsInventoryQuantity ifsInventoryQuantity = new IfsInventoryQuantity(); ifsInventoryQuantity.setContract(map1.get("CONTRACT") == null ? "" : map1.get("CONTRACT").toString()); // 域 ifsInventoryQuantity.setPartNo(map1.get("PART_NO") == null ? "" : map1.get("PART_NO").toString() ); // 零件号 ifsInventoryQuantity.setPartDesc(map1.get("PART_DESC") == null ? "" : map1.get("PART_DESC").toString()); // 零件描述 ifsInventoryQuantity.setOrderNo(map1.get("ORDER_NO") == null ? "" : map1.get("ORDER_NO").toString()); // 订单号 ifsInventoryQuantity.setLineNo(map1.get("LINE_NO") == null ? "" : map1.get("LINE_NO").toString()); // 行号 ifsInventoryQuantity.setReleaseNo(map1.get("RELEASE_NO") == null ? "" : map1.get("RELEASE_NO").toString()); // 下达号 ifsInventoryQuantity.setReceiptNo(Integer.parseInt(map1.get("RECEIPT_NO") == null ? "" : map1.get("RECEIPT_NO").toString())); // 接收号 ifsInventoryQuantity.setStatus(map1.get("STATE") == null ? "" : map1.get("STATE").toString()); // 状态描述 ifsInventoryQuantity.setStatusDb(map1.get("STATE_DB") == null ? "" : map1.get("STATE_DB").toString()); // 状态 if(map1.get("QTY_ARRIVED") != null) { ifsInventoryQuantity.setQtyArrived(new BigDecimal(map1.get("QTY_ARRIVED").toString())); // 抵达的采购数量 } if(map1.get("QTY_INSPECTED") != null) { ifsInventoryQuantity.setQtyInspected(new BigDecimal(map1.get("QTY_INSPECTED").toString())); // 已检验的购买数量 } if(map1.get("QTY_TO_INSPECT") != null) { ifsInventoryQuantity.setQtyToInspect(new BigDecimal(map1.get("QTY_TO_INSPECT").toString())); // 要检验的采购数量 } if(map1.get("INV_QTY_IN_STORE") != null) { ifsInventoryQuantity.setInvQtyInStore(new BigDecimal(map1.get("INV_QTY_IN_STORE").toString())); // 抵达的库存数量 } if(map1.get("PUR_QTY_IN_STORE") != null) { ifsInventoryQuantity.setPurQtyInStore(new BigDecimal( map1.get("PUR_QTY_IN_STORE").toString())); // 抵达的采购数量 } ifsInventoryQuantity.setSupplierId(map1.get("SUPPLIER_ID") == null ? "" : map1.get("SUPPLIER_ID").toString()); // 供应商ID ifsInventoryQuantity.setSupplierName(map1.get("SUPPLIER_NAME") == null ? "" : map1.get("SUPPLIER_NAME").toString()); // 供应商名称 ifsInventoryQuantity.setConfigurationId(map1.get("CONFIGURATION_ID") == null ? "" : map1.get("CONFIGURATION_ID").toString()); // 配置标识 ifsInventoryQuantity.setLotBatchNo(map1.get("LOT_BATCH_NO") == null ? "" : map1.get("LOT_BATCH_NO").toString()); // 批次号 ifsInventoryQuantity.setUpdateBatchNo(map1.get("LOT_BATCH_NO") == null ? "" : map1.get("LOT_BATCH_NO").toString()); // 批次号 ifsInventoryQuantity.setWaivDevRejNo(map1.get("WAIV_DEV_REJ_NO") == null ? "" : map1.get("WAIV_DEV_REJ_NO").toString()); // WDR号 ifsInventoryQuantity.setActivitySeq(map1.get("ACTIVITY_SEQ") == null ? null : Integer.parseInt(map1.get("ACTIVITY_SEQ").toString())); // 活动序列 ifsInventoryQuantity.setSerialNo(map1.get("SERIAL_NO") == null ? "" : map1.get("SERIAL_NO").toString()); // 序列号 ifsInventoryQuantity.setLocationNo(map1.get("LOCATION_NO") == null ? "" : map1.get("LOCATION_NO").toString()); // 库位号 ifsInventoryQuantity.setEngChgLevel(map1.get("ENG_CHG_LEVEL") == null ? "" : map1.get("ENG_CHG_LEVEL").toString()); // 版本号 ifsInventoryQuantity.setReceiver(map1.get("RECEIVER") == null ? "" : map1.get("RECEIVER").toString()); // 接收人 ifsInventoryQuantity.setReceiverName(map1.get("RECEIVER_NAME") == null ? "" : map1.get("RECEIVER_NAME").toString()); // 接收人名称 ifsInventoryQuantity.setBuyerCode(map1.get("BUYER_CODE") == null ? "" : map1.get("BUYER_CODE").toString()); // 采购员 ifsInventoryQuantity.setBuyerName(map1.get("BUYER_NAME") == null ? "" : map1.get("BUYER_NAME").toString()); // 采购员名称 if(map1.get("ARRIVE_DATE") != null) { ifsInventoryQuantity.setArriveDate(LocalDateTime.parse(map1.get("ARRIVE_DATE").toString(),dateTimeFormatter)); // 实际到货日期 } if(map1.get("DELIVERY_DATE") != null) { ifsInventoryQuantity.setDeliveryDate(LocalDateTime.parse(map1.get("DELIVERY_DATE").toString(),dateTimeFormatter)); // 实际交货日期 } if(map1.get("PRODUCT_DATE") != null) { ifsInventoryQuantity.setProductDate(LocalDateTime.parse(map1.get("PRODUCT_DATE").toString(),dateTimeFormatter)); // 生产日期 } if(map1.get("INVALID_DATE") != null) { ifsInventoryQuantity.setInvalidDate(LocalDateTime.parse(map1.get("INVALID_DATE").toString(),dateTimeFormatter)); // 失效日期 } if(map1.get("APPROVED_DATE") != null) { ifsInventoryQuantity.setApprovedDate(LocalDateTime.parse(map1.get("APPROVED_DATE").toString(),dateTimeFormatter)); // 审批日期 } ifsInventoryQuantity.setReqCeater(map1.get("REQ_CEATER") == null ? "" : map1.get("REQ_CEATER").toString()); // 采购申请创建人 ifsInventoryQuantity.setReqCeaterName(map1.get("REQ_CEATER_NAME") == null ? "" : map1.get("REQ_CEATER_NAME").toString()); // 采购申请创建人名称 ifsInventoryQuantity.setLineRemarks(map1.get("LINE_REMARKS") == null ? "" : map1.get("LINE_REMARKS").toString()); // 采购订单行备注 ifsInventoryQuantity.setBuyUnitMeas(map1.get("BUY_UNIT_MEAS") == null ? "" : map1.get("BUY_UNIT_MEAS").toString()); // 采购单位 ifsInventoryQuantity.setReceiverDate(LocalDateTime.now()); // 接收日期 ifsInventoryQuantity.setIsSource(1); ifsInventoryQuantity.setState(0); Long count = ifsInventoryQuantityMapper.selectCount(new LambdaQueryWrapper() .eq(IfsInventoryQuantity::getOrderNo, ifsInventoryQuantity.getOrderNo()) .eq(IfsInventoryQuantity::getLineNo, ifsInventoryQuantity.getLineNo()) .eq(IfsInventoryQuantity::getReleaseNo, ifsInventoryQuantity.getReleaseNo()) .eq(IfsInventoryQuantity::getReceiptNo, ifsInventoryQuantity.getReceiptNo()) .eq(IfsInventoryQuantity::getLocationNo, ifsInventoryQuantity.getLocationNo()) .eq(IfsInventoryQuantity::getLotBatchNo, ifsInventoryQuantity.getLotBatchNo()) .eq(IfsInventoryQuantity::getSerialNo, ifsInventoryQuantity.getSerialNo()) .eq(IfsInventoryQuantity::getEngChgLevel, ifsInventoryQuantity.getEngChgLevel()) .eq(IfsInventoryQuantity::getWaivDevRejNo, ifsInventoryQuantity.getWaivDevRejNo()) .eq(IfsInventoryQuantity::getActivitySeq, ifsInventoryQuantity.getActivitySeq()) ); if(count == 0) { ifsInventoryQuantity.setIsFirst(0); // 查询产业链检测数据 String industryChainAttrFields = IndustryChainUtils.getIndustryChainAttrFields(ifsInventoryQuantity.getOrderNo(), ifsInventoryQuantity.getLineNo(), ifsInventoryQuantity.getReleaseNo()); ifsInventoryQuantity.setIndustryChain(industryChainAttrFields); ifsInventoryQuantityMapper.insert(ifsInventoryQuantity); } } } /** * id是原材料的id * * 修改订单单号 * @param insOrder */ @Override @Transactional(rollbackFor = Exception.class) public void updateEntrustCode(InsOrder insOrder) { // 判断当前订单是否生成了报告, 生成了报告不能修改单号 List insOrders = insOrderMapper.selectList(Wrappers.lambdaQuery() .eq(InsOrder::getIfsInventoryId, insOrder.getId()) .ne(InsOrder::getState, -1)); List insOrderIds = insOrders.stream().map(InsOrder::getId).collect(Collectors.toList()); Long count = insReportMapper.selectCount(Wrappers.lambdaQuery() .in(InsReport::getInsOrderId, insOrderIds)); if (count > 0 ) { throw new ErrorException("当前订单已经生成了报告不能修改编号"); } Long count1 = insOrderMapper.selectCount(Wrappers.lambdaQuery() .eq(InsOrder::getEntrustCode, insOrder.getEntrustCode()) .ne(InsOrder::getIfsInventoryId, insOrder.getId()) .ne(InsOrder::getInsState, -1)); if (count1 > 0) { throw new ErrorException("该编号重复"); } //修改报告的编号 insOrderMapper.update(null, Wrappers.lambdaUpdate() .eq(InsOrder::getIfsInventoryId, insOrder.getId()) .set(InsOrder::getEntrustCode, insOrder.getEntrustCode())); // 修改样品的编号 // 查询所有的样品 List insSamples = insSampleMapper.selectList(Wrappers.lambdaQuery() .in(InsSample::getInsOrderId, insOrderIds)); for (InsSample insSample : insSamples) { String sampleCode = insSample.getSampleCode(); String updateCode = insOrder.getEntrustCode(); // 查找最后一个'-'的位置 int lastDashIndex = sampleCode.lastIndexOf('-'); if (lastDashIndex != -1) { int secondLastDashIndex = sampleCode.lastIndexOf('-', lastDashIndex - 1); // 处理最后一个'-'前的部分 if (secondLastDashIndex != -1) { // 处理最后一个'-'及之后的部分 String afterLastDash = sampleCode.substring(lastDashIndex); updateCode = updateCode + afterLastDash; } } insSampleMapper.update(null, Wrappers.lambdaUpdate() .eq(InsSample::getId, insSample.getId()) .set(InsSample::getSampleCode, updateCode)); } } @Override public List getRetestResult(Integer insProductId) { return insUnqualifiedRetestProductMapper.selectList(Wrappers.lambdaQuery() .eq(InsUnqualifiedRetestProduct::getInsProductId, insProductId)); } /** * 修改采购订单接收状态, 避免回滚 * @param id */ @Transactional public void updateIfsInventoryQuantity(Integer id) { ifsInventoryQuantityMapper.update(null, Wrappers.lambdaUpdate() .set(IfsInventoryQuantity::getIsRegister, 1) .eq(IfsInventoryQuantity::getId, id)); } /** * 新增铜单丝下单 * @param list * @param insOrder * @return */ @Override public int addRawCopperOrder(List list, CopperInsOrderDto insOrder) { insOrder.setState(1); insOrder.setTypeSource(1); LocalDate appointed = insOrder.getAppointed(); insOrderMapper.insert(insOrder); // 主表 list.forEach(a -> { a.setId(null); a.setInsOrderId(insOrder.getId()); insSampleMapper.insert(a); if (ObjectUtil.isNotEmpty(a.getInsProduct())) { // 判断是否填写待检项数量 if (a.getQuantity() != null) { List ip2 = new ArrayList<>(); for (Integer i = 1; i <= a.getQuantity(); i++) { // 重新拷贝 创建新对象 AtomicInteger atomicInteger = new AtomicInteger(i); List insProducts = a.getInsProduct().stream().map(insProduct -> { insProduct.setRawMaterialTag(String.valueOf(atomicInteger.get())); InsProduct product = new InsProduct(); BeanUtils.copyProperties(insProduct, product); return product; }).collect(Collectors.toList()); ip2.addAll(insProducts); } addInsProductMethod(a.getId(), ip2); } else { addInsProductMethod(a.getId(), a.getInsProduct()); } } if (ObjectUtil.isNotEmpty(a.getChildSampleList())) { for (SampleProductDto b : a.getChildSampleList()) { for (int i = 0; i < b.getNum(); i++) { b.setId(null); b.setInsOrderId(insOrder.getId()); b.setParentId(a.getId()); insSampleMapper.insert(b); if (ObjectUtil.isNotEmpty(b.getInsProduct())) { addInsProductMethod(b.getId(), b.getInsProduct()); } } } } }); // 添加原材料信息 IfsInventoryQuantity ifsInventoryQuantity = new IfsInventoryQuantity(); // 基本信息 ifsInventoryQuantity.setIsSource(0); ifsInventoryQuantity.setIsInspect(1); ifsInventoryQuantity.setState(1); ifsInventoryQuantity.setIsFinish(0); ifsInventoryQuantity.setIsCopper(1); ifsInventoryQuantity.setIsQuarter(0); ifsInventoryQuantity.setInspectStatus(0); ifsInventoryQuantity.setQtyArrived(insOrder.getQtyArrived()); ifsInventoryQuantity.setBuyUnitMeas(insOrder.getBuyUnitMeas()); ifsInventoryQuantity.setSupplierName(insOrder.getSupplierName()); ifsInventoryQuantity.setUpdateBatchNo(insOrder.getUpdateBatchNo()); ifsInventoryQuantity.setDeclareDate(insOrder.getDeclareDate()); ifsInventoryQuantityMapper.insert(ifsInventoryQuantity); insOrder.setIfsInventoryId(ifsInventoryQuantity.getId()); insOrder.setState(1); upInsOrderOfState(insOrder); upInsOrder(insOrder.getId(), null, appointed != null ? appointed.toString() : null, SecurityUtils.getUserId().intValue(), "原材料"); return insOrder.getId(); } /** * 修改委托下单编号 * @param insOrder */ @Override public void updateOrderEntrustCode(InsOrder insOrder) { // 判断当前订单是否生成了报告, 生成了报告不能修改单号 Long count = insReportMapper.selectCount(Wrappers.lambdaQuery() .eq(InsReport::getInsOrderId, insOrder.getId())); if (count > 0 ) { throw new ErrorException("当前订单已经生成了报告不能修改编号"); } Long count1 = insOrderMapper.selectCount(Wrappers.lambdaQuery() .eq(InsOrder::getEntrustCode, insOrder.getEntrustCode())); if (count1 > 0) { throw new ErrorException("该编号重复"); } //修改报告的编号 insOrderMapper.update(null, Wrappers.lambdaUpdate() .eq(InsOrder::getId, insOrder.getId()) .set(InsOrder::getEntrustCode, insOrder.getEntrustCode())); // 修改样品的编号 // 查询所有的样品 List insSamples = insSampleMapper.selectList(Wrappers.lambdaQuery() .eq(InsSample::getInsOrderId, insOrder.getId())); for (InsSample insSample : insSamples) { String sampleCode = insSample.getSampleCode(); String updateCode = insOrder.getEntrustCode(); // 查找最后一个'-'的位置 int lastDashIndex = sampleCode.lastIndexOf('-'); if (lastDashIndex != -1) { int secondLastDashIndex = sampleCode.lastIndexOf('-', lastDashIndex - 1); // 处理最后一个'-'前的部分 if (secondLastDashIndex != -1) { // 处理最后一个'-'及之后的部分 String afterLastDash = sampleCode.substring(lastDashIndex); updateCode = updateCode + afterLastDash; } } insSampleMapper.update(null, Wrappers.lambdaUpdate() .eq(InsSample::getId, insSample.getId()) .set(InsSample::getSampleCode, updateCode)); } } /** * 修改检验下单内容 * @param insOrderUpdateDto * @return */ @Override @Transactional(rollbackFor = Exception.class) public Boolean updateInsOrder(InsOrderUpdateDto insOrderUpdateDto) { // 修改订单 insOrderUpdateDto.getInsOrder().setState(0); insOrderUpdateDto.getInsOrder().setTell(""); insOrderMapper.updateById(insOrderUpdateDto.getInsOrder()); // 修改检验项 for (SampleProductDto sampleProductDto : insOrderUpdateDto.getSampleProduct()) { insProductService.updateBatchById(sampleProductDto.getInsProduct()); } return true; } /** * 成品标签打印 * @param ids * @return */ @Override public List labelOrderPrinting(List ids) { return insOrderMapper.labelOrderPrinting(ids); } /** * 根据样品id查询检验项树 * @param insSampleId * @return */ @Override public List getProductTreeBySampleId(Integer insSampleId) { // 查询第一个检验项获取检验项树 InsProduct insProduct = insProductMapper.selectOne(Wrappers.lambdaQuery() .eq(InsProduct::getInsSampleId, insSampleId) .last("limit 1")); String tree = insProduct.getFactory() + " - " + insProduct.getLaboratory() + " - " + insProduct.getSampleType() + " - " + insProduct.getSample() + " - " + insProduct.getModel(); // 查询标准树 List standardProductLists = standardProductListMapper.selectList(Wrappers.lambdaQuery() .eq(StandardProductList::getStandardMethodListId, insProduct.getStandardMethodListId()) .eq(StandardProductList::getTree, tree) .orderByAsc(StandardProductList::getSort)); for (StandardProductList standardProductList : standardProductLists) { standardProductList.setId(null); } return standardProductLists; } /** * 添加遗漏的检验项 * @param omitOrderProductDto * @return */ @Override public boolean addOmitOrderProduct(OmitOrderProductDto omitOrderProductDto) { if (omitOrderProductDto.getInsSampleId() == null) { throw new ErrorException("缺少样品Id"); } for (InsProduct product : omitOrderProductDto.getInsProductBindingList()) { if (product.getState() == 1) { product.setId(null); product.setCreateTime(null); product.setCreateUser(null); product.setUpdateTime(null); product.setUpdateUser(null); product.setSection(null); product.setInsSampleId(omitOrderProductDto.getInsSampleId()); if (StringUtils.isBlank(product.getCableTag())) { product.setCableTag(null); } if (product.getInspectionItemSubclass() == null) { product.setInspectionItemSubclass(""); } if (StringUtils.isBlank(product.getAsk()) || StringUtils.isBlank(product.getTell())) { throw new ErrorException("有检验项的要求值或要求描述为空, 请填写要求值或要求描述"); } insProductMapper.insert(product); } } return true; } /** * 成品检验单导出 * @param sampleOrderDto * @param response */ @Override public void rawAllInsOrderExport(SampleOrderDto sampleOrderDto, HttpServletResponse response) { List sampleOrderDtoList = new ArrayList<>(); if (StringUtils.isNotBlank(sampleOrderDto.getIds())) { List orderIds = StrUtil.split(sampleOrderDto.getIds(), ","); sampleOrderDtoList = insOrderMapper.getInsOrderExportByIds(orderIds); } else { String laboratory = null; // 判断是否是全部 String isOrderAll = null; if (sampleOrderDto.getState() != null && sampleOrderDto.getState() == -2) { isOrderAll = "1"; sampleOrderDto.setState(null); } sampleOrderDto.setIds(null); sampleOrderDtoList = insOrderMapper.rawAllInsOrderExport(QueryWrappers.queryWrappers(sampleOrderDto), laboratory, isOrderAll); } // 判断是否是不合格, 不合格查询不合格项 for (SampleOrderDto orderDto : sampleOrderDtoList) { if (orderDto.getInsResult() != null && orderDto.getInsResult() == 0){ // 查询不合格项 List unqualifiedList = insProductMapper.selectUnqualifiedList(orderDto.getId()); orderDto.setUnqualifiedItem(CollUtil.join(unqualifiedList, ",")); } orderDto.setCreateTimeString(orderDto.getCreateTime() == null ? "" : orderDto.getCreateTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); } response.setContentType("application/vnd.ms-excel"); response.setCharacterEncoding("UTF-8"); try { // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系 String fileName = URLEncoder.encode("委托检测信息导出", "UTF-8"); response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx"); //新建ExcelWriter ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()).build(); //获取sheet0对象 WriteSheet mainSheet = EasyExcel.writerSheet(0, "委托检测信息导出").head(SampleOrderDto.class).build(); //向sheet0写入数据 传入空list这样只导出表头 excelWriter.write(sampleOrderDtoList, mainSheet); //关闭流 excelWriter.finish(); } catch (IOException e) { throw new RuntimeException("导出失败"); } } /** * 修改样品型号 * @param insSample */ @Override public void updateSampleModel(InsSample insSample) { // 判断当前订单是否生成了报告, 生成了报告不能修改单号 Long count = insReportMapper.selectCount(Wrappers.lambdaQuery() .eq(InsReport::getInsOrderId, insSample.getInsOrderId())); if (count > 0 ) { throw new ErrorException("当前订单已经生成了报告不能修改编号"); } insSampleService.update(Wrappers.lambdaUpdate() .eq(InsSample::getId, insSample.getId()) .set(InsSample::getModel, insSample.getModel())); } }