From fa29836d30700431aaf058fd01d4b5c1587a207a Mon Sep 17 00:00:00 2001 From: jiang Date: Wed, 10 Dec 2025 09:10:19 +0800 Subject: [PATCH] =?UTF-8?q?=E9=97=AE=E9=A2=98=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/DevChangeServiceImpl.java | 2 +- .../device/domain/EquipmentImportDTO.java | 23 +-- .../material/device/mapper/DevInfoMapper.java | 3 + .../order/service/impl/OrderServiceImpl.java | 33 ++-- .../material/scrap/domain/ToBeScrap.java | 1 + .../bonus/material/utils/CenterExcelUtil.java | 150 ++++++++++++++++++ .../material/devchange/DevChangeMapper.xml | 2 + .../material/devchange/MaDevInfoMapper.xml | 41 +++-- .../devchange/MaDevRetireWarningMapper.xml | 14 ++ .../mapper/material/device/DevInfoMapper.xml | 7 + .../mapper/material/device/DevMergeMapper.xml | 1 + .../mapper/material/scrap/ScrapMapper.xml | 91 ++++++++--- 12 files changed, 306 insertions(+), 62 deletions(-) create mode 100644 bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/utils/CenterExcelUtil.java diff --git a/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/devchange/service/DevChangeServiceImpl.java b/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/devchange/service/DevChangeServiceImpl.java index 83e46b8..3119332 100644 --- a/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/devchange/service/DevChangeServiceImpl.java +++ b/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/devchange/service/DevChangeServiceImpl.java @@ -337,7 +337,7 @@ public class DevChangeServiceImpl implements DevChangeService { } // 编码重复 String devCode = details.getDevCode(); - if (StringUtils.isNotBlank(devCode) && devCodeSet.contains(devCode)) { + if (!devCode.equals("/") && StringUtils.isNotBlank(devCode) && devCodeSet.contains(devCode)) { return AjaxResult.error("添加的列表中设备编号存在重复:" + devCode); } else if (StringUtils.isNotBlank(devCode)) { devCodeSet.add(devCode); diff --git a/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/device/domain/EquipmentImportDTO.java b/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/device/domain/EquipmentImportDTO.java index 634aeec..deba796 100644 --- a/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/device/domain/EquipmentImportDTO.java +++ b/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/device/domain/EquipmentImportDTO.java @@ -3,6 +3,7 @@ package com.bonus.material.device.domain; import com.bonus.common.core.annotation.Excel; import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; +import org.apache.poi.ss.usermodel.HorizontalAlignment; import javax.validation.constraints.DecimalMin; import javax.validation.constraints.Min; @@ -14,45 +15,45 @@ import java.util.Date; @Data public class EquipmentImportDTO { - @Excel(name = "装备类目", sort = 1, combo = {}) + @Excel(name = "装备类目", sort = 1, combo = {}, align = HorizontalAlignment.CENTER ) @NotBlank(message = "专业不能为空") private String profession; - @Excel(name = "装备名称", sort = 2) + @Excel(name = "装备名称", sort = 2, align = HorizontalAlignment.CENTER) @NotBlank(message = "装备名称不能为空") private String equipmentName; - @Excel(name = "规格型号", sort = 3) + @Excel(name = "规格型号", sort = 3, align = HorizontalAlignment.CENTER) private String specification; - @Excel(name = "资产原值", sort = 4) + @Excel(name = "资产原值", sort = 4, align = HorizontalAlignment.CENTER) @DecimalMin(value = "0.00", message = "资产原值不能小于0") private BigDecimal originalValue; - @Excel(name = "生产厂家", sort = 5, combo = {}) + @Excel(name = "生产厂家", sort = 5, combo = {}, align = HorizontalAlignment.CENTER) private String manufacturer; - @Excel(name = "生产日期", sort = 6, dateFormat = "yyyy-MM-dd") + @Excel(name = "生产日期", sort = 6, dateFormat = "yyyy-MM-dd", align = HorizontalAlignment.CENTER) @JsonFormat(pattern = "yyyy-MM-dd") private Date productionDate; - @Excel(name = "下次维保日期", sort = 7, dateFormat = "yyyy-MM-dd") + @Excel(name = "下次维保日期", sort = 7, dateFormat = "yyyy-MM-dd", align = HorizontalAlignment.CENTER) @JsonFormat(pattern = "yyyy-MM-dd") private Date nextMaintenanceDate; - @Excel(name = "装备原始编码", sort = 8) + @Excel(name = "装备原始编码", sort = 8, align = HorizontalAlignment.CENTER) @NotBlank(message = "装备原始编码不能为空") private String originalCode; - @Excel(name = "最大使用年限", sort = 9) + @Excel(name = "最大使用年限", sort = 9, align = HorizontalAlignment.CENTER) @Min(value = 0, message = "最大使用年限不能小于0") private Integer maxServiceYears; - @Excel(name = "计数单位", sort = 10, combo = {}) + @Excel(name = "计数单位", sort = 10, combo = {}, align = HorizontalAlignment.CENTER) @NotBlank(message = "计数单位不能为空") private String unit; - @Excel(name = "采购日期", sort = 11, dateFormat = "yyyy-MM-dd") + @Excel(name = "采购日期", sort = 11, dateFormat = "yyyy-MM-dd", align = HorizontalAlignment.CENTER) @JsonFormat(pattern = "yyyy-MM-dd") private Date purchaseDate; } diff --git a/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/device/mapper/DevInfoMapper.java b/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/device/mapper/DevInfoMapper.java index 4334dc8..2433c5d 100644 --- a/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/device/mapper/DevInfoMapper.java +++ b/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/device/mapper/DevInfoMapper.java @@ -14,6 +14,7 @@ import com.bonus.material.device.domain.vo.LeaseVo; import com.bonus.material.largeScreen.entity.DevInfoReq; import com.bonus.material.largeScreen.entity.LeaseInfo; import com.bonus.material.largeScreen.entity.RentInfo; +import io.swagger.models.auth.In; import org.apache.ibatis.annotations.Param; import java.math.BigDecimal; @@ -322,5 +323,7 @@ public interface DevInfoMapper { int getProjectNUm(); DevInfoVo selectToolByMaId(Long maId); + + DevInfo getMaStatusByToolId(@Param("id") Long id, @Param("num") Integer num); } diff --git a/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/order/service/impl/OrderServiceImpl.java b/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/order/service/impl/OrderServiceImpl.java index c3893b0..2159276 100644 --- a/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/order/service/impl/OrderServiceImpl.java +++ b/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/order/service/impl/OrderServiceImpl.java @@ -107,7 +107,12 @@ public class OrderServiceImpl implements OrderService { DevInfo maInfo; for (OrderDetailDto orderDetailDto : orderDetailDtos) { // 先判断要租赁的设备状态是否正常 - maInfo = devInfoMapper.getMaStatusByMaId(Long.valueOf(orderDetailDto.getMaId())); + if (orderDetailDto.getDevType().equals("0")) { + maInfo = devInfoMapper.getMaStatusByMaId(Long.valueOf(orderDetailDto.getMaId())); + } else { + maInfo = devInfoMapper.getMaStatusByToolId(Long.valueOf(orderDetailDto.getMaId()), orderDetailDto.getNum()); + } + if (maInfo == null || maInfo.getMaStatus() == null) { throw new RuntimeException("设备信息异常"); } @@ -138,19 +143,19 @@ public class OrderServiceImpl implements OrderService { orderMapper.insertOrderDetail(orderDetailDto); } } - TmTask tmTask = new TmTask(); - tmTask.setTaskType(TmTaskTypeEnum.TM_TASK_ORDER.getTaskTypeId()); - tmTask.setTaskStatus(OrderStatusEnum.TO_ORDER_PLACED.getStatus()); - tmTask.setCode(code); - tmTask.setCreateBy(SecurityUtils.getLoginUser().getUsername()); - tmTask.setCreateTime(DateUtils.getNowDate()); - tmTask.setBuyerCompanyId(Optional.ofNullable(SecurityUtils.getLoginUser().getSysUser().getCompanyId()).orElse(SecurityUtils.getLoginUser().getSysUser().getDeptId())); - if (!CollectionUtils.isEmpty(orderDetailDtos)) { - DevInfoVo devInfoVo = devInfoMapper.selectDevInfoByMaId(Long.valueOf(orderDetailDtos.get(0).getMaId())); - tmTask.setSellerCompanyId(Long.valueOf(devInfoVo.getCompanyId())); - } - tmTask.setNoticeCompanyId(tmTask.getSellerCompanyId()); - tmTaskMapper.insertSelective(tmTask); +// TmTask tmTask = new TmTask(); +// tmTask.setTaskType(TmTaskTypeEnum.TM_TASK_ORDER.getTaskTypeId()); +// tmTask.setTaskStatus(OrderStatusEnum.TO_ORDER_PLACED.getStatus()); +// tmTask.setCode(code); +// tmTask.setCreateBy(SecurityUtils.getLoginUser().getUsername()); +// tmTask.setCreateTime(DateUtils.getNowDate()); +// tmTask.setBuyerCompanyId(Optional.ofNullable(SecurityUtils.getLoginUser().getSysUser().getCompanyId()).orElse(SecurityUtils.getLoginUser().getSysUser().getDeptId())); +// if (!CollectionUtils.isEmpty(orderDetailDtos)) { +// DevInfoVo devInfoVo = devInfoMapper.selectDevInfoByMaId(Long.valueOf(orderDetailDtos.get(0).getMaId())); +// tmTask.setSellerCompanyId(Long.valueOf(devInfoVo.getCompanyId())); +// } +// tmTask.setNoticeCompanyId(tmTask.getSellerCompanyId()); +// tmTaskMapper.insertSelective(tmTask); } return j; } diff --git a/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/scrap/domain/ToBeScrap.java b/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/scrap/domain/ToBeScrap.java index 03d4cca..a346208 100644 --- a/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/scrap/domain/ToBeScrap.java +++ b/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/scrap/domain/ToBeScrap.java @@ -176,4 +176,5 @@ public class ToBeScrap { @ApiModelProperty(value = "所属公司id") private Long companyId; + } diff --git a/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/utils/CenterExcelUtil.java b/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/utils/CenterExcelUtil.java new file mode 100644 index 0000000..d6c433e --- /dev/null +++ b/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/utils/CenterExcelUtil.java @@ -0,0 +1,150 @@ +package com.bonus.material.utils; + +import com.bonus.common.core.annotation.Excel; +import com.bonus.common.core.utils.poi.ExcelUtil; +import org.apache.poi.ss.usermodel.*; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; + +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpServletResponseWrapper; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.lang.reflect.Field; + +/** + * 自定义的 ExcelUtil,全表所有单元格都水平居中 + * 通过后处理方式,在生成Excel后修改所有单元格样式 + */ +public class CenterExcelUtil extends ExcelUtil { + + public CenterExcelUtil(Class clazz) { + super(clazz); + } + + /** + * 重写导入模板导出方法 - 主要方法 + */ + @Override + public void importTemplateExcel(HttpServletResponse response, String sheetName, String title) { + try { + // 1. 将Excel写入到字节数组(而不是直接写入响应) + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + HttpServletResponse tempResponse = createTempResponse(baos); + + // 2. 调用父类方法生成模板 + super.importTemplateExcel(tempResponse, sheetName, title); + + // 3. 获取生成的Excel字节数组 + byte[] excelBytes = baos.toByteArray(); + + // 4. 应用居中样式 + byte[] centeredExcelBytes = applyCenterStyle(excelBytes); + + // 5. 设置响应头并写入处理后的Excel + setupResponseHeaders(response, sheetName); + response.getOutputStream().write(centeredExcelBytes); + response.getOutputStream().flush(); + + } catch (Exception e) { + throw new RuntimeException("导出Excel模板失败", e); + } + } + + /** + * 创建临时响应对象,用于捕获Excel字节数据 + */ + private HttpServletResponse createTempResponse(ByteArrayOutputStream baos) throws IOException { + return new HttpServletResponseWrapper(null) { + @Override + public javax.servlet.ServletOutputStream getOutputStream() { + return new javax.servlet.ServletOutputStream() { + @Override + public void write(int b) { + baos.write(b); + } + + @Override + public boolean isReady() { + return true; + } + + @Override + public void setWriteListener(javax.servlet.WriteListener writeListener) { + // 空实现 + } + }; + } + }; + } + + /** + * 应用居中样式到所有单元格 + */ + private byte[] applyCenterStyle(byte[] excelBytes) throws IOException { + try (ByteArrayInputStream bais = new ByteArrayInputStream(excelBytes); + Workbook workbook = WorkbookFactory.create(bais); + ByteArrayOutputStream baos = new ByteArrayOutputStream()) { + + // 遍历所有工作表 + for (int i = 0; i < workbook.getNumberOfSheets(); i++) { + Sheet sheet = workbook.getSheetAt(i); + if (sheet == null) continue; + + // 遍历所有存在的行 + for (int rowIndex = sheet.getFirstRowNum(); rowIndex <= sheet.getLastRowNum(); rowIndex++) { + Row row = sheet.getRow(rowIndex); + if (row == null) continue; + + // 遍历所有存在的单元格 + for (int cellIndex = row.getFirstCellNum(); cellIndex <= row.getLastCellNum(); cellIndex++) { + Cell cell = row.getCell(cellIndex); + if (cell == null) continue; + + // 设置单元格居中 + setCellCenterStyle(workbook, cell); + } + } + } + + workbook.write(baos); + return baos.toByteArray(); + } + } + + /** + * 设置单元格居中样式 + */ + private void setCellCenterStyle(Workbook workbook, Cell cell) { + // 获取当前样式 + CellStyle currentStyle = cell.getCellStyle(); + + // 创建新样式 + CellStyle newStyle = workbook.createCellStyle(); + + // 复制原有样式 + newStyle.cloneStyleFrom(currentStyle); + + // 设置水平居中 + newStyle.setAlignment(HorizontalAlignment.CENTER); + newStyle.setVerticalAlignment(VerticalAlignment.CENTER); + + // 保持原有的数据格式 + if (currentStyle.getDataFormatString() != null) { + newStyle.setDataFormat(Short.parseShort(currentStyle.getDataFormatString())); + } + + // 应用新样式 + cell.setCellStyle(newStyle); + } + + /** + * 设置响应头 + */ + private void setupResponseHeaders(HttpServletResponse response, String fileName) throws IOException { + response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); + response.setCharacterEncoding("utf-8"); + String encodedFileName = java.net.URLEncoder.encode(fileName, "UTF-8").replaceAll("\\+", "%20"); + response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + encodedFileName + ".xlsx"); + } +} \ No newline at end of file diff --git a/bonus-modules/bonus-material-mall/src/main/resources/mapper/material/devchange/DevChangeMapper.xml b/bonus-modules/bonus-material-mall/src/main/resources/mapper/material/devchange/DevChangeMapper.xml index bffbf0e..44c5d28 100644 --- a/bonus-modules/bonus-material-mall/src/main/resources/mapper/material/devchange/DevChangeMapper.xml +++ b/bonus-modules/bonus-material-mall/src/main/resources/mapper/material/devchange/DevChangeMapper.xml @@ -667,6 +667,7 @@ AND (cdcd.dev_code = '/' OR cdcd.dev_code = b.tool_code) WHERE cdcd.del_flag = 0 AND cdcd.dev_type IN ('1', '2') + AND cdcd.is_finished != '1' AND cdcd.change_id = #{id} @@ -1097,6 +1098,7 @@ SET is_finished ='1', real_num = num WHERE change_id = #{id} + AND is_finished != '1' AND del_flag = '0' diff --git a/bonus-modules/bonus-material-mall/src/main/resources/mapper/material/devchange/MaDevInfoMapper.xml b/bonus-modules/bonus-material-mall/src/main/resources/mapper/material/devchange/MaDevInfoMapper.xml index 2557977..3d814b5 100644 --- a/bonus-modules/bonus-material-mall/src/main/resources/mapper/material/devchange/MaDevInfoMapper.xml +++ b/bonus-modules/bonus-material-mall/src/main/resources/mapper/material/devchange/MaDevInfoMapper.xml @@ -248,14 +248,23 @@ SELECT COUNT(1) - FROM ma_dev_info WHERE is_active = '1' and entry_status = '1' - - AND on_company = #{companyId} - + from ma_dev_info mdi + INNER JOIN ma_type_view mtv ON mtv.typeId = mdi.type_id + LEFT JOIN jj_sing_project jsp ON mdi.on_project = jsp.pro_code + LEFT JOIN sys_dept sd ON sd.dept_id = mdi.on_company + LEFT JOIN (SELECT max(next_check_time) next_check_time, ma_id from ma_dev_qc GROUP BY ma_id) mdq on + mdi.ma_id = mdq.ma_id + LEFT JOIN ma_supplier ms ON ms.supplier_id = mdi.supplier_id + LEFT JOIN sys_cnarea sc ON sc.area_code = mdi.province_id + + mdi.is_active = '1' and mdi.entry_status = '1' + + AND mdi.on_company = #{companyId} + + diff --git a/bonus-modules/bonus-material-mall/src/main/resources/mapper/material/device/DevInfoMapper.xml b/bonus-modules/bonus-material-mall/src/main/resources/mapper/material/device/DevInfoMapper.xml index 662ee8a..0a406ac 100644 --- a/bonus-modules/bonus-material-mall/src/main/resources/mapper/material/device/DevInfoMapper.xml +++ b/bonus-modules/bonus-material-mall/src/main/resources/mapper/material/device/DevInfoMapper.xml @@ -1680,4 +1680,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" GROUP BY sd.dept_id, sd.dept_name -- 按部门分组,确保所有部门都被列出 ORDER BY totalValue DESC + diff --git a/bonus-modules/bonus-material-mall/src/main/resources/mapper/material/device/DevMergeMapper.xml b/bonus-modules/bonus-material-mall/src/main/resources/mapper/material/device/DevMergeMapper.xml index a3b8641..5f7b512 100644 --- a/bonus-modules/bonus-material-mall/src/main/resources/mapper/material/device/DevMergeMapper.xml +++ b/bonus-modules/bonus-material-mall/src/main/resources/mapper/material/device/DevMergeMapper.xml @@ -609,5 +609,6 @@ SELECT typeId FROM ma_type_view WHERE CONCAT_WS('/', proType, mainGx, childGx, devCategory, devSubcategory) = #{profession} + LIMIT 1 diff --git a/bonus-modules/bonus-material-mall/src/main/resources/mapper/material/scrap/ScrapMapper.xml b/bonus-modules/bonus-material-mall/src/main/resources/mapper/material/scrap/ScrapMapper.xml index 3422881..f042f7b 100644 --- a/bonus-modules/bonus-material-mall/src/main/resources/mapper/material/scrap/ScrapMapper.xml +++ b/bonus-modules/bonus-material-mall/src/main/resources/mapper/material/scrap/ScrapMapper.xml @@ -4,20 +4,24 @@