From 68669a81b69aabc5f38f6f8b5f9bdf6ae0cda93c Mon Sep 17 00:00:00 2001 From: sunjianxi <839419401@qq.com> Date: Thu, 16 Jan 2025 15:45:06 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8A=9F=E8=83=BD=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../business/contraller/DeviceController.java | 35 +- .../contraller/MaintenanceController.java | 7 + .../contraller/WorkOrderController.java | 3 +- .../contraller/supplies/ApplyController.java | 15 + .../business/excel/CustomMergeStrategy.java | 41 ++ .../business/excel/DeviceImportExcel.java | 44 +++ .../business/excel/DeviceImporter.java | 7 +- .../mapper/MaintenanceTaskDetailMapper.java | 5 + .../mapper/MaintenanceTaskDetailMapper.xml | 23 ++ .../pojo/entity/DeviceMaintenance.java | 3 + .../entity/maintenance/MaintenanceTask.java | 6 + .../maintenance/MaintenanceTaskDetail.java | 18 + .../maintenance/RepairGoodsOutputData.java | 26 ++ .../maintenance/UnRepairGoodsOutputData.java | 24 ++ .../business/pojo/entity/supplies/Apply.java | 3 + .../business/pojo/entity/supplies/Goods.java | 3 + .../pojo/entity/workorder/WorkOrder.java | 9 + .../business/service/IDeviceService.java | 3 +- .../IMaintenanceTaskDetailService.java | 3 + .../service/impl/DeviceServiceImpl.java | 41 +- .../impl/MaintenancePlanServiceImpl.java | 20 +- .../MaintenanceTaskDetailServiceImpl.java | 350 +++++++++++++++--- .../service/impl/WorkOrderServiceImpl.java | 2 +- .../modules/system/pojo/entity/Dept.java | 12 +- .../excel/MaintenanceTaskReport.xlsx | Bin 10953 -> 14698 bytes src/main/resources/excel/RepairService.xlsx | Bin 0 -> 12768 bytes 26 files changed, 604 insertions(+), 99 deletions(-) create mode 100644 src/main/java/org/springblade/modules/business/excel/CustomMergeStrategy.java create mode 100644 src/main/java/org/springblade/modules/business/excel/DeviceImportExcel.java create mode 100644 src/main/java/org/springblade/modules/business/pojo/entity/maintenance/RepairGoodsOutputData.java create mode 100644 src/main/java/org/springblade/modules/business/pojo/entity/maintenance/UnRepairGoodsOutputData.java create mode 100644 src/main/resources/excel/RepairService.xlsx diff --git a/src/main/java/org/springblade/modules/business/contraller/DeviceController.java b/src/main/java/org/springblade/modules/business/contraller/DeviceController.java index 292d600..2e40694 100644 --- a/src/main/java/org/springblade/modules/business/contraller/DeviceController.java +++ b/src/main/java/org/springblade/modules/business/contraller/DeviceController.java @@ -22,6 +22,7 @@ import org.springblade.core.tool.utils.BeanUtil; import org.springblade.core.tool.utils.DateUtil; import org.springblade.core.tool.utils.Func; import org.springblade.modules.business.excel.DeviceExcel; +import org.springblade.modules.business.excel.DeviceImportExcel; import org.springblade.modules.business.excel.DeviceImporter; import org.springblade.modules.business.pojo.dto.DeviceDTO; import org.springblade.modules.business.pojo.entity.Device; @@ -187,9 +188,9 @@ public class DeviceController extends BladeController { */ @PostMapping("/import-device") @Operation(summary = "导入设备", description = "传入excel") - public R importDevice(MultipartFile file, Integer isCovered) { - DeviceImporter deviceImporter = new DeviceImporter(deviceService, isCovered == 1); - ExcelUtil.save(file, deviceImporter, DeviceExcel.class); + public R importDevice(MultipartFile file) { + DeviceImporter deviceImporter = new DeviceImporter(deviceService); + ExcelUtil.save(file, deviceImporter, DeviceImportExcel.class); return R.success("操作成功"); } @@ -210,20 +211,20 @@ public class DeviceController extends BladeController { @GetMapping("/export-template") @Operation(summary = "导出模板") public void exportDevice(HttpServletResponse response) { - List list = new ArrayList<>(); - DeviceExcel deviceExcel = new DeviceExcel(); - deviceExcel.setCode("WX-20241017-01"); - deviceExcel.setName("测试设备"); - deviceExcel.setModel("MDP-456"); - deviceExcel.setType("设备类型1"); - deviceExcel.setPosition("种子常规检测室1"); - deviceExcel.setSupplier("山东烁今"); - deviceExcel.setProduceTime(new Date()); - deviceExcel.setLimsName("测试实验室"); - deviceExcel.setFloorName("三层"); - deviceExcel.setRoomName("301"); - list.add(deviceExcel); - ExcelUtil.export(response, "设备模板", "设备表", list, DeviceExcel.class); + List list = new ArrayList<>(); +// DeviceExcel deviceExcel = new DeviceExcel(); +// deviceExcel.setCode("WX-20241017-01"); +// deviceExcel.setName("测试设备"); +// deviceExcel.setModel("MDP-456"); +// deviceExcel.setType("设备类型1"); +// deviceExcel.setPosition("种子常规检测室1"); +// deviceExcel.setSupplier("山东烁今"); +// deviceExcel.setProduceTime(new Date()); +// deviceExcel.setLimsName("测试实验室"); +// deviceExcel.setFloorName("三层"); +// deviceExcel.setRoomName("301"); +// list.add(deviceExcel); + ExcelUtil.export(response, "设备模板", "设备表", list, DeviceImportExcel.class); } } diff --git a/src/main/java/org/springblade/modules/business/contraller/MaintenanceController.java b/src/main/java/org/springblade/modules/business/contraller/MaintenanceController.java index e5acd1f..2dfb34d 100644 --- a/src/main/java/org/springblade/modules/business/contraller/MaintenanceController.java +++ b/src/main/java/org/springblade/modules/business/contraller/MaintenanceController.java @@ -189,6 +189,7 @@ public class MaintenanceController extends BladeController { MaintenanceTask taskOld = taskService.getById(task.getId()); taskOld.setSignUrl(task.getSignUrl()); taskOld.setRemark(task.getRemark()); + taskOld.setInspectionConclusion(task.getInspectionConclusion()); taskService.updateById(taskOld); return R.success(); @@ -498,4 +499,10 @@ public class MaintenanceController extends BladeController { public void maintenancePlanReport(@RequestBody MaintenancePlan maintenancePlan, HttpServletResponse response) throws IOException { planDetailService.maintenancePlanReport(maintenancePlan, response); } + + @PostMapping("/repair-output-service") + @Operation(summary = "导出运维服务单", description = "导出运维服务单") + public void repairOutputService(@RequestBody MaintenanceTask task, HttpServletResponse response) throws IOException { + taskDetailService.repairOutputService(task, response); + } } diff --git a/src/main/java/org/springblade/modules/business/contraller/WorkOrderController.java b/src/main/java/org/springblade/modules/business/contraller/WorkOrderController.java index 2f83809..c4d1915 100644 --- a/src/main/java/org/springblade/modules/business/contraller/WorkOrderController.java +++ b/src/main/java/org/springblade/modules/business/contraller/WorkOrderController.java @@ -262,7 +262,8 @@ public class WorkOrderController extends BladeController { messageService.saveMessage(workOrder.getRequirementCode(), "您已接收新的维修单,请尽快处理", workOrder.getRepairPerson(), 2); } // todo 审核通过 - LogUtil.saveLog(workOrderOld.getRequirementCode(), WorkOrderStatusEnum.KF_ORDER_ALLOT.getName()); + User user = userService.getById(workOrder.getRepairPerson()); + LogUtil.saveLog(workOrderOld.getRequirementCode(), WorkOrderStatusEnum.KF_ORDER_ALLOT.getName() + ":" + user.getName()); return R.success(""); } diff --git a/src/main/java/org/springblade/modules/business/contraller/supplies/ApplyController.java b/src/main/java/org/springblade/modules/business/contraller/supplies/ApplyController.java index 96ae460..d4b4fda 100644 --- a/src/main/java/org/springblade/modules/business/contraller/supplies/ApplyController.java +++ b/src/main/java/org/springblade/modules/business/contraller/supplies/ApplyController.java @@ -11,14 +11,18 @@ import org.springblade.common.cache.UserCache; import org.springblade.core.boot.ctrl.BladeController; import org.springblade.core.mp.support.Condition; import org.springblade.core.mp.support.Query; +import org.springblade.core.secure.BladeUser; import org.springblade.core.secure.utils.AuthUtil; import org.springblade.core.tool.api.R; import org.springblade.core.tool.utils.CollectionUtil; import org.springblade.core.tool.utils.Func; import org.springblade.modules.business.pojo.dto.supplies.ApplyDTO; +import org.springblade.modules.business.pojo.entity.maintenance.MaintenancePlan; import org.springblade.modules.business.pojo.entity.supplies.Apply; import org.springblade.modules.business.pojo.entity.supplies.ApplyDetail; import org.springblade.modules.business.pojo.entity.supplies.Goods; +import org.springblade.modules.business.pojo.entity.workorder.WorkOrder; +import org.springblade.modules.business.service.IWorkOrderService; import org.springblade.modules.business.service.supplies.IApplyDetailService; import org.springblade.modules.business.service.supplies.IApplyService; import org.springblade.modules.business.service.supplies.IGoodsService; @@ -43,6 +47,7 @@ public class ApplyController extends BladeController { private final IApplyService applyService; private final IApplyDetailService applyDetailService; private final IGoodsService goodsService; + private final IWorkOrderService workOrderService; /** * 物品申领表 详情 @@ -59,13 +64,23 @@ public class ApplyController extends BladeController { */ @GetMapping("/list") public R> list(ApplyDTO apply, Query query) { + BladeUser user = AuthUtil.getUser(); LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(Apply.class); wrapper.orderByDesc(Apply::getCreateTime); wrapper.eq(apply.getIsReturn() != null, Apply::getIsReturn, apply.getIsReturn()); wrapper.eq(StringUtils.isNotBlank(apply.getApplyUser()), Apply::getApplyUser, apply.getApplyUser()); + if (!user.getRoleName().contains("administrator") && !user.getRoleName().contains("admin") && !user.getRoleName().contains("库管员")) { + wrapper.eq(Apply::getApplyUserId,user.getUserId()); + } IPage pages = applyService.page(Condition.getPage(query), wrapper); List records = pages.getRecords(); if (CollectionUtil.isNotEmpty(records)) { + for(Apply record: records){ + WorkOrder order = workOrderService.getById(record.getWorkId()); + if(order != null){ + record.setRequirementCode(order.getRequirementCode()); + } + } List ids = records.stream().map(Apply::getId).collect(Collectors.toList()); List details = applyDetailService.list(Wrappers.lambdaQuery(ApplyDetail.class).in(ApplyDetail::getApplyId, ids)); for (Apply record : records) { diff --git a/src/main/java/org/springblade/modules/business/excel/CustomMergeStrategy.java b/src/main/java/org/springblade/modules/business/excel/CustomMergeStrategy.java new file mode 100644 index 0000000..91d7100 --- /dev/null +++ b/src/main/java/org/springblade/modules/business/excel/CustomMergeStrategy.java @@ -0,0 +1,41 @@ +package org.springblade.modules.business.excel; + +import com.alibaba.excel.metadata.Head; +import com.alibaba.excel.write.merge.AbstractMergeStrategy; +import org.apache.poi.ss.usermodel.*; +import org.apache.poi.ss.util.CellRangeAddress; +import org.apache.poi.ss.util.RegionUtil; + +import java.util.List; + +public class CustomMergeStrategy extends AbstractMergeStrategy { + @Override + protected void merge(Sheet sheet, Cell cell, Head head, Integer relativeRowIndex) { + if (relativeRowIndex == null || relativeRowIndex == 0) { + return; + } + int rowIndex = cell.getRowIndex(); + int colIndex = cell.getColumnIndex(); + sheet = cell.getSheet(); + Row preRow = sheet.getRow(rowIndex - 1); + Cell preCell = preRow.getCell(colIndex);// 获取上一行的该格 + List list = sheet.getMergedRegions(); + CellStyle cs = cell.getCellStyle(); + cell.setCellStyle(cs); + for (int i = 0; i < list.size(); i++) { + CellRangeAddress cellRangeAddress = list.get(i); + if (cellRangeAddress.containsRow(preCell.getRowIndex()) && cellRangeAddress.containsColumn(preCell.getColumnIndex())) { + int lastColIndex = cellRangeAddress.getLastColumn(); + int firstColIndex = cellRangeAddress.getFirstColumn(); + CellRangeAddress cra = new CellRangeAddress(cell.getRowIndex(), cell.getRowIndex(), firstColIndex, lastColIndex); + sheet.addMergedRegion(cra); + RegionUtil.setBorderBottom(BorderStyle.THIN, cra, sheet); + RegionUtil.setBorderLeft(BorderStyle.THIN, cra, sheet); + RegionUtil.setBorderRight(BorderStyle.THIN, cra, sheet); + RegionUtil.setBorderTop(BorderStyle.THIN, cra, sheet); + return; + } + } + } + +} diff --git a/src/main/java/org/springblade/modules/business/excel/DeviceImportExcel.java b/src/main/java/org/springblade/modules/business/excel/DeviceImportExcel.java new file mode 100644 index 0000000..21a1c24 --- /dev/null +++ b/src/main/java/org/springblade/modules/business/excel/DeviceImportExcel.java @@ -0,0 +1,44 @@ +package org.springblade.modules.business.excel; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 设备表 Excel实体类 + * @author BladeX + * @since 2024-10-14 + */ +@Data +@ColumnWidth(25) +@HeadRowHeight(20) +@ContentRowHeight(18) +public class DeviceImportExcel implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + + @ExcelProperty("设备编号") + private String code; + + @ExcelProperty("设备名称") + private String name; + + @ExcelProperty("设备类型") + private String type; + + @ExcelProperty({"巡检相关","巡检内容"}) + private String checkContent; + + @ExcelProperty({"巡检相关","工艺要求"}) + private String craft; + + @ExcelProperty("备注") + private String description; + + +} diff --git a/src/main/java/org/springblade/modules/business/excel/DeviceImporter.java b/src/main/java/org/springblade/modules/business/excel/DeviceImporter.java index 37dc12b..846629b 100644 --- a/src/main/java/org/springblade/modules/business/excel/DeviceImporter.java +++ b/src/main/java/org/springblade/modules/business/excel/DeviceImporter.java @@ -37,13 +37,12 @@ import java.util.List; * @author Chill */ @RequiredArgsConstructor -public class DeviceImporter implements ExcelImporter { +public class DeviceImporter implements ExcelImporter { private final IDeviceService service; - private final Boolean isCovered; @Override - public void save(List data) { - service.importGoods(data, isCovered); + public void save(List data) { + service.importDevice(data); } } diff --git a/src/main/java/org/springblade/modules/business/mapper/MaintenanceTaskDetailMapper.java b/src/main/java/org/springblade/modules/business/mapper/MaintenanceTaskDetailMapper.java index e59962d..39dc040 100644 --- a/src/main/java/org/springblade/modules/business/mapper/MaintenanceTaskDetailMapper.java +++ b/src/main/java/org/springblade/modules/business/mapper/MaintenanceTaskDetailMapper.java @@ -6,6 +6,7 @@ import org.apache.ibatis.annotations.Param; import org.springblade.modules.business.pojo.entity.maintenance.MaintenanceTaskDetail; import java.util.List; +import java.util.Map; /** * 维保任务详情 Mapper 接口 @@ -17,4 +18,8 @@ public interface MaintenanceTaskDetailMapper extends BaseMapper findListByDeviceId(@Param("deviceId")Long deviceId); + String findPeriod(); + + Map getDeptContact(@Param("deptId")long deptId); + } diff --git a/src/main/java/org/springblade/modules/business/mapper/MaintenanceTaskDetailMapper.xml b/src/main/java/org/springblade/modules/business/mapper/MaintenanceTaskDetailMapper.xml index 2487302..9fe4ef4 100644 --- a/src/main/java/org/springblade/modules/business/mapper/MaintenanceTaskDetailMapper.xml +++ b/src/main/java/org/springblade/modules/business/mapper/MaintenanceTaskDetailMapper.xml @@ -15,4 +15,27 @@ a.is_deleted = 0 AND a.device_id = #{deviceId} + + diff --git a/src/main/java/org/springblade/modules/business/pojo/entity/DeviceMaintenance.java b/src/main/java/org/springblade/modules/business/pojo/entity/DeviceMaintenance.java index 931c404..8331260 100644 --- a/src/main/java/org/springblade/modules/business/pojo/entity/DeviceMaintenance.java +++ b/src/main/java/org/springblade/modules/business/pojo/entity/DeviceMaintenance.java @@ -2,6 +2,8 @@ package org.springblade.modules.business.pojo.entity; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.NullSerializer; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; @@ -36,6 +38,7 @@ public class DeviceMaintenance extends BaseEntity { /** * 巡检周期 1:月, 2:季, 3:半年 */ + @JsonSerialize(nullsUsing = NullSerializer.class) private Integer period; /** diff --git a/src/main/java/org/springblade/modules/business/pojo/entity/maintenance/MaintenanceTask.java b/src/main/java/org/springblade/modules/business/pojo/entity/maintenance/MaintenanceTask.java index 646b84a..febae60 100644 --- a/src/main/java/org/springblade/modules/business/pojo/entity/maintenance/MaintenanceTask.java +++ b/src/main/java/org/springblade/modules/business/pojo/entity/maintenance/MaintenanceTask.java @@ -3,6 +3,8 @@ package org.springblade.modules.business.pojo.entity.maintenance; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.NullSerializer; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; @@ -114,6 +116,7 @@ public class MaintenanceTask extends BaseEntity { /** * 审批结果(0不通过 1通过) */ + @JsonSerialize(nullsUsing = NullSerializer.class) private Integer approveResult; /** @@ -124,6 +127,7 @@ public class MaintenanceTask extends BaseEntity { /** * 审批人 */ + @JsonSerialize(nullsUsing = NullSerializer.class) private Long approvePerson; /** @@ -206,6 +210,7 @@ public class MaintenanceTask extends BaseEntity { /** * 差旅费 */ + @JsonSerialize(nullsUsing = NullSerializer.class) private Double travelExpense; /** @@ -216,5 +221,6 @@ public class MaintenanceTask extends BaseEntity { /** * 总价 */ + @JsonSerialize(nullsUsing = NullSerializer.class) private Double totalPrice; } diff --git a/src/main/java/org/springblade/modules/business/pojo/entity/maintenance/MaintenanceTaskDetail.java b/src/main/java/org/springblade/modules/business/pojo/entity/maintenance/MaintenanceTaskDetail.java index b9b7c0d..6580ea1 100644 --- a/src/main/java/org/springblade/modules/business/pojo/entity/maintenance/MaintenanceTaskDetail.java +++ b/src/main/java/org/springblade/modules/business/pojo/entity/maintenance/MaintenanceTaskDetail.java @@ -3,6 +3,8 @@ package org.springblade.modules.business.pojo.entity.maintenance; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.NullSerializer; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; @@ -24,8 +26,21 @@ import java.util.List; @Schema(description = "维保任务详细") public class MaintenanceTaskDetail extends BaseEntity { + /** + * 任务id + */ private Long taskId; + /** + * 计划id + */ + private Long planId; + + /** + * 计划明细id + */ + private Long planDetailId; + /** * 设备id */ @@ -88,16 +103,19 @@ public class MaintenanceTaskDetail extends BaseEntity { /** * 维修价格 */ + @JsonSerialize(nullsUsing = NullSerializer.class) private Double price; /** * 客户确认是否维修, 0:不维修, 1维修 */ + @JsonSerialize(nullsUsing = NullSerializer.class) private Integer isRepair; /** * 确认是否需要物资 */ + @JsonSerialize(nullsUsing = NullSerializer.class) private Integer isNeed; /** diff --git a/src/main/java/org/springblade/modules/business/pojo/entity/maintenance/RepairGoodsOutputData.java b/src/main/java/org/springblade/modules/business/pojo/entity/maintenance/RepairGoodsOutputData.java new file mode 100644 index 0000000..c0c238c --- /dev/null +++ b/src/main/java/org/springblade/modules/business/pojo/entity/maintenance/RepairGoodsOutputData.java @@ -0,0 +1,26 @@ +package org.springblade.modules.business.pojo.entity.maintenance; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.converters.bytearray.ByteArrayImageConverter; +import com.baomidou.mybatisplus.annotation.TableField; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Data +@EqualsAndHashCode(callSuper = false) +public class RepairGoodsOutputData { + + private long no; + + //物料名称 + private String goodsName; + + //数量 + private Integer number; + + //价格 + private Double price; + + private Double totalPrice; + +} diff --git a/src/main/java/org/springblade/modules/business/pojo/entity/maintenance/UnRepairGoodsOutputData.java b/src/main/java/org/springblade/modules/business/pojo/entity/maintenance/UnRepairGoodsOutputData.java new file mode 100644 index 0000000..aeeb699 --- /dev/null +++ b/src/main/java/org/springblade/modules/business/pojo/entity/maintenance/UnRepairGoodsOutputData.java @@ -0,0 +1,24 @@ +package org.springblade.modules.business.pojo.entity.maintenance; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Data +@EqualsAndHashCode(callSuper = false) +public class UnRepairGoodsOutputData { + + private long no1; + + + //物料名称 + private String goodsName1; + + //数量 + private Integer number1; + + //价格 + private Double price1; + + private Double totalPrice1; + +} diff --git a/src/main/java/org/springblade/modules/business/pojo/entity/supplies/Apply.java b/src/main/java/org/springblade/modules/business/pojo/entity/supplies/Apply.java index f5213ed..c1ac538 100644 --- a/src/main/java/org/springblade/modules/business/pojo/entity/supplies/Apply.java +++ b/src/main/java/org/springblade/modules/business/pojo/entity/supplies/Apply.java @@ -97,4 +97,7 @@ public class Apply extends BaseEntity { @TableField(exist = false) List details; + + @TableField(exist = false) + private String requirementCode;; } diff --git a/src/main/java/org/springblade/modules/business/pojo/entity/supplies/Goods.java b/src/main/java/org/springblade/modules/business/pojo/entity/supplies/Goods.java index fc43bdd..fab93d0 100644 --- a/src/main/java/org/springblade/modules/business/pojo/entity/supplies/Goods.java +++ b/src/main/java/org/springblade/modules/business/pojo/entity/supplies/Goods.java @@ -2,6 +2,8 @@ package org.springblade.modules.business.pojo.entity.supplies; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.NullSerializer; import lombok.Data; import lombok.EqualsAndHashCode; import org.springblade.core.mp.base.BaseEntity; @@ -134,6 +136,7 @@ public class Goods extends BaseEntity { /** * 续订时间(天) */ + @JsonSerialize(nullsUsing = NullSerializer.class) private Integer renewNum; /** diff --git a/src/main/java/org/springblade/modules/business/pojo/entity/workorder/WorkOrder.java b/src/main/java/org/springblade/modules/business/pojo/entity/workorder/WorkOrder.java index a79022a..33758db 100644 --- a/src/main/java/org/springblade/modules/business/pojo/entity/workorder/WorkOrder.java +++ b/src/main/java/org/springblade/modules/business/pojo/entity/workorder/WorkOrder.java @@ -2,6 +2,8 @@ package org.springblade.modules.business.pojo.entity.workorder; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.NullSerializer; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; @@ -52,6 +54,7 @@ public class WorkOrder extends BaseEntity { /** * 设备id */ + @JsonSerialize(nullsUsing = NullSerializer.class) private Long deviceId; /** @@ -143,6 +146,7 @@ public class WorkOrder extends BaseEntity { /** * 是否需要申领物料(0否 1是) */ + @JsonSerialize(nullsUsing = NullSerializer.class) private Integer isNeedMaterial; /** @@ -226,25 +230,30 @@ public class WorkOrder extends BaseEntity { /** * 折扣 */ + @JsonSerialize(nullsUsing = NullSerializer.class) private Double discount; /** * 折扣后总价 */ + @JsonSerialize(nullsUsing = NullSerializer.class) private Double discountPrice; /** * 维修类型 */ + @JsonSerialize(nullsUsing = NullSerializer.class) private Integer repairType; /** * 人工费 */ + @JsonSerialize(nullsUsing = NullSerializer.class) private Double laborCost; /** * 差旅费 */ + @JsonSerialize(nullsUsing = NullSerializer.class) private Double travelExpense; } diff --git a/src/main/java/org/springblade/modules/business/service/IDeviceService.java b/src/main/java/org/springblade/modules/business/service/IDeviceService.java index 6a6f876..b2c8906 100644 --- a/src/main/java/org/springblade/modules/business/service/IDeviceService.java +++ b/src/main/java/org/springblade/modules/business/service/IDeviceService.java @@ -3,6 +3,7 @@ package org.springblade.modules.business.service; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import org.springblade.core.mp.base.BaseService; +import org.springblade.modules.business.excel.DeviceImportExcel; import org.springblade.modules.business.pojo.dto.DeviceDTO; import org.springblade.modules.business.pojo.entity.Device; import org.springblade.modules.business.excel.DeviceExcel; @@ -46,7 +47,7 @@ public interface IDeviceService extends BaseService { List selectStatusCount(String startTime, String endTime); - void importGoods(List data, Boolean isCovered); + void importDevice(List data); List limsList(Device device); diff --git a/src/main/java/org/springblade/modules/business/service/IMaintenanceTaskDetailService.java b/src/main/java/org/springblade/modules/business/service/IMaintenanceTaskDetailService.java index 793d551..3611f4f 100644 --- a/src/main/java/org/springblade/modules/business/service/IMaintenanceTaskDetailService.java +++ b/src/main/java/org/springblade/modules/business/service/IMaintenanceTaskDetailService.java @@ -21,4 +21,7 @@ public interface IMaintenanceTaskDetailService extends BaseService task, HttpServletResponse response) throws IOException; + + void repairOutputService(MaintenanceTask task, HttpServletResponse response) throws IOException; + } diff --git a/src/main/java/org/springblade/modules/business/service/impl/DeviceServiceImpl.java b/src/main/java/org/springblade/modules/business/service/impl/DeviceServiceImpl.java index 1c9c334..a17e6f3 100644 --- a/src/main/java/org/springblade/modules/business/service/impl/DeviceServiceImpl.java +++ b/src/main/java/org/springblade/modules/business/service/impl/DeviceServiceImpl.java @@ -5,20 +5,22 @@ import com.aliyun.oss.ServiceException; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.google.zxing.WriterException; import lombok.AllArgsConstructor; import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang3.StringUtils; import org.springblade.common.cache.SysCache; import org.springblade.common.constant.CommonConstant; import org.springblade.common.utils.CommonUtil; +import org.springblade.core.mp.base.BaseEntity; import org.springblade.core.mp.base.BaseServiceImpl; import org.springblade.core.secure.utils.AuthUtil; import org.springblade.core.tool.utils.BeanUtil; import org.springblade.core.tool.utils.CollectionUtil; import org.springblade.core.tool.utils.Func; import org.springblade.modules.business.excel.DeviceExcel; +import org.springblade.modules.business.excel.DeviceImportExcel; import org.springblade.modules.business.mapper.DeviceMapper; import org.springblade.modules.business.pojo.dto.DeviceDTO; import org.springblade.modules.business.pojo.entity.Device; @@ -36,10 +38,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.io.IOException; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; +import java.util.*; import java.util.stream.Collectors; /** @@ -152,7 +151,7 @@ public class DeviceServiceImpl extends BaseServiceImpl imp return baseMapper.selectStatusCount(startTime, endTime); } - @Override + /*@Override public void importGoods(List data, Boolean isCovered) { List list = new ArrayList<>(); // 获取负责的实验室数据 @@ -203,6 +202,36 @@ public class DeviceServiceImpl extends BaseServiceImpl imp } else { this.saveBatch(list); } + }*/ + + @Override + public void importDevice(List data) { + data.forEach(deviceExcel -> { + if(StringUtils.isEmpty(deviceExcel.getCode())){ + throw new ServiceException("设备" + deviceExcel.getName() + "未填写设备编码,请修改后再上传!"); + } + Device device = BeanUtil.copyProperties(deviceExcel, Device.class); + DeviceMaintenance deviceMaintenance = BeanUtil.copyProperties(deviceExcel, DeviceMaintenance.class); + if (device != null) { + //根据编码查询设备 + Device oldDevice = this.getOne(Wrappers.lambdaQuery(Device.class).eq(Device::getCode,device.getCode()).eq(BaseEntity::getIsDeleted,0)); + if (oldDevice != null) { + device.setId(oldDevice.getId()); + this.saveOrUpdate(device); + } else { + device.setRunStatus(CommonConstant.DEVICE_RUN_STATUS_WORKING); + this.save(device); + } + if(deviceMaintenance != null){ + if(oldDevice != null){ + maintenanceService.remove(Wrappers.lambdaQuery(DeviceMaintenance.class).eq(DeviceMaintenance::getDeviceId,oldDevice.getId())); + } + deviceMaintenance.setDeviceId(device.getId()); + maintenanceService.save(deviceMaintenance); + } + } + }); + } @Override diff --git a/src/main/java/org/springblade/modules/business/service/impl/MaintenancePlanServiceImpl.java b/src/main/java/org/springblade/modules/business/service/impl/MaintenancePlanServiceImpl.java index aeed47d..7015b41 100644 --- a/src/main/java/org/springblade/modules/business/service/impl/MaintenancePlanServiceImpl.java +++ b/src/main/java/org/springblade/modules/business/service/impl/MaintenancePlanServiceImpl.java @@ -10,7 +10,9 @@ import jakarta.servlet.ServletOutputStream; import jakarta.servlet.http.HttpServletResponse; import lombok.AllArgsConstructor; import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang3.StringUtils; import org.springblade.common.cache.UserCache; +import org.springblade.core.mp.base.BaseEntity; import org.springblade.core.mp.base.BaseServiceImpl; import org.springblade.core.tool.utils.CollectionUtil; import org.springblade.core.tool.utils.DateUtil; @@ -294,17 +296,16 @@ public class MaintenancePlanServiceImpl extends BaseServiceImpl maintenanceSupervisorList = userService.list(Wrappers.lambdaQuery(User.class).eq(User::getRoleId, roleId)); try { for (User maintenanceSupervisor : maintenanceSupervisorList) { - Optional phone = Optional.ofNullable(maintenanceSupervisor.getPhone()); - if (phone.isEmpty()) { + if (StringUtils.isEmpty(maintenanceSupervisor.getPhone())) { continue; //TODO 当手机号为空时需要处理的逻辑 } Optional realName = Optional.ofNullable(maintenanceSupervisor.getRealName()); //TODO 当真实姓名为空时需要处理的逻辑 if (realName.isEmpty()) { - smsService.sendSms(phone.get(), "未实名"); + smsService.sendSms(maintenanceSupervisor.getPhone(), "未实名"); } else { - smsService.sendSms(phone.get(), realName.get()); + smsService.sendSms(maintenanceSupervisor.getPhone(), realName.get()); } } } catch (Exception e) { @@ -338,11 +339,11 @@ public class MaintenancePlanServiceImpl extends BaseServiceImpl taskDetails = new ArrayList<>(); - MaintenanceTaskDetail maintenanceTaskDetail = new MaintenanceTaskDetail(); - List list = taskService.list(Wrappers.lambdaQuery(MaintenanceTask.class).eq(MaintenanceTask::getPlanId, planId)); for (MaintenancePlanDetail newPlanDetail : newDetails) { MaintenanceTaskDetail taskDetail = new MaintenanceTaskDetail(); taskDetail.setTaskId(maintenanceTask.getId()); + taskDetail.setPlanId(newPlanDetail.getPlanId()); + taskDetail.setPlanDetailId(newPlanDetail.getId()); taskDetail.setFloorName(newPlanDetail.getFloorName()); taskDetail.setDeptId(newPlanDetail.getDeptId()); taskDetail.setDeptName(newPlanDetail.getDeptName()); @@ -353,6 +354,13 @@ public class MaintenancePlanServiceImpl extends BaseServiceImpl implements IMaintenanceTaskDetailService { + @Autowired + private IUserService userService; + + @Autowired + private IMaintenanceApplyGoodsService maintenanceApplyGoodsService; @Override public List findListByDeviceId(Long deviceId) { @@ -55,14 +73,35 @@ public class MaintenanceTaskDetailServiceImpl extends BaseServiceImpl map = new HashMap<>(); - map.put("taskName", task.getDeptName()); - map.put("address", task.getDeptName()); - map.put("taskContent", task.getTaskContent()); - map.put("serviceManName", task.getServicemanName()); + Map map0 = new HashMap<>(); + map0.put("taskName", task.getDeptName()); + String period = baseMapper.findPeriod(); + map0.put("period",period + "度报告"); + map0.put("time", DateFormatUtils.format(task.getFinishTime(),"yyyy年MM月dd日")); + map0.put("taskCode", task.getTaskCode()); + + Map map1 = new HashMap<>(); + map1.put("taskName", task.getDeptName()); + map1.put("address", task.getDeptName()); + map1.put("taskContent", task.getTaskContent()); + + Map map2 = new HashMap<>(); + map2.put("taskName", task.getDeptName()); + map2.put("address", task.getDeptName()); + map2.put("inspectionConclusion", task.getInspectionConclusion()); + map2.put("signatureTime",task.getSignatureTime() != null ? DateFormatUtils.format(task.getSignatureTime(),"yyyy年MM月dd日"): ""); + //获取客户联系人、联系电话 + Map cusMap = baseMapper.getDeptContact(task.getDeptId()); + if(CollectionUtils.isNotEmpty(cusMap)){ + map2.put("contact",cusMap.get("name")); //联系人 + map2.put("phone",cusMap.get("phone")); //联系方式 + } + List maintenanceTaskDetailList = baseMapper.selectList(Wrappers.lambdaQuery(MaintenanceTaskDetail.class).eq(MaintenanceTaskDetail::getTaskId, task.getId())); List maintenanceOutputDataList = new ArrayList<>(); + List maintenanceOutputDataList1 = new ArrayList<>(); long no = 0; + long no1 = 0; for (MaintenanceTaskDetail maintenanceTaskDetail : maintenanceTaskDetailList) { no++; MaintenanceOutputData maintenanceOutputData = new MaintenanceOutputData(); @@ -101,33 +140,55 @@ public class MaintenanceTaskDetailServiceImpl extends BaseServiceImpl voidWriteCellData = TemplateExcelUtils.imageCells(bytes, width, height, 0.6, 1.9); + map2.put("image", voidWriteCellData); + } catch (Exception e) { + throw new RuntimeException(e); + } + } else { + map2.put("image",null); } + //将数据导出到Excel ServletOutputStream outputStream = response.getOutputStream(); try (ExcelWriter excelWriter = EasyExcel.write(outputStream).withTemplate(fileInputStream).build()) { - WriteSheet writeSheet = EasyExcel.writerSheet().build(); - excelWriter.fill(maintenanceOutputDataList, fillConfig, writeSheet); - excelWriter.fill(map, writeSheet); + WriteSheet writeSheet0 = EasyExcel.writerSheet(0).build(); + excelWriter.fill(map0, writeSheet0); + + WriteSheet writeSheet1 = EasyExcel.writerSheet(1).build(); + excelWriter.fill(maintenanceOutputDataList, fillConfig, writeSheet1); + excelWriter.fill(map1, writeSheet1); + + WriteSheet writeSheet2 = EasyExcel.writerSheet(2).build(); + excelWriter.fill(maintenanceOutputDataList1, fillConfig, writeSheet2); + + WriteSheet writeSheet3 = EasyExcel.writerSheet(3).build(); + excelWriter.fill(map2, writeSheet3); + excelWriter.finish(); outputStream.flush(); outputStream.close(); @@ -141,14 +202,36 @@ public class MaintenanceTaskDetailServiceImpl extends BaseServiceImpl map = new HashMap<>(); - map.put("taskName", task.getDeptName()); - map.put("address", task.getDeptName()); - map.put("taskContent", task.getTaskContent()); - map.put("serviceManName", task.getServicemanName()); + Map map0 = new HashMap<>(); + map0.put("taskName", task.getDeptName()); + String period = baseMapper.findPeriod(); + map0.put("period",period + "度报告"); + map0.put("time", DateFormatUtils.format(task.getFinishTime(),"yyyy年MM月dd日")); + map0.put("taskCode", task.getTaskCode()); + + Map map1 = new HashMap<>(); + map1.put("taskName", task.getDeptName()); + map1.put("address", task.getDeptName()); + map1.put("taskContent", task.getTaskContent()); + + Map map2 = new HashMap<>(); + map2.put("taskName", task.getDeptName()); + map2.put("address", task.getDeptName()); + map2.put("inspectionConclusion", task.getInspectionConclusion()); + map2.put("signatureTime",task.getSignatureTime() != null ? DateFormatUtils.format(task.getSignatureTime(),"yyyy年MM月dd日"): ""); + + //获取客户联系人、联系电话 + Map cusMap = baseMapper.getDeptContact(task.getDeptId()); + if(CollectionUtils.isNotEmpty(cusMap)){ + map2.put("contact",cusMap.get("name")); //联系人 + map2.put("phone",cusMap.get("phone")); //联系方式 + } + List maintenanceTaskDetailList = baseMapper.selectList(Wrappers.lambdaQuery(MaintenanceTaskDetail.class).eq(MaintenanceTaskDetail::getTaskId, task.getId())); List maintenanceOutputDataList = new ArrayList<>(); + List maintenanceOutputDataList1 = new ArrayList<>(); long no = 0; + long no1 = 0; for (MaintenanceTaskDetail maintenanceTaskDetail : maintenanceTaskDetailList) { no++; MaintenanceOutputData maintenanceOutputData = new MaintenanceOutputData(); @@ -187,40 +270,191 @@ public class MaintenanceTaskDetailServiceImpl extends BaseServiceImpl voidWriteCellData = TemplateExcelUtils.imageCells(bytes, width, height, 0.6, 1.9); + map2.put("image", voidWriteCellData); + } catch (Exception e) { + throw new RuntimeException(e); + } + } else { + map2.put("image",null); } //将数据导出到Excel ZipOutputStream zos = new ZipOutputStream(response.getOutputStream()); String fileName = task.getTaskCode() + "巡检报告.xlsx"; zos.putNextEntry(new ZipEntry(fileName)); try (ExcelWriter excelWriter = EasyExcel.write(zos).withTemplate(fileInputStream).build()) { - WriteSheet writeSheet = EasyExcel.writerSheet().build(); - excelWriter.fill(maintenanceOutputDataList, fillConfig, writeSheet); - excelWriter.fill(map, writeSheet); + WriteSheet writeSheet0 = EasyExcel.writerSheet(0).build(); + excelWriter.fill(map0, writeSheet0); + + WriteSheet writeSheet1 = EasyExcel.writerSheet(1).build(); + excelWriter.fill(maintenanceOutputDataList, fillConfig, writeSheet1); + excelWriter.fill(map1, writeSheet1); + + WriteSheet writeSheet2 = EasyExcel.writerSheet(2).build(); + excelWriter.fill(maintenanceOutputDataList1, fillConfig, writeSheet2); + + WriteSheet writeSheet3 = EasyExcel.writerSheet(3).build(); + excelWriter.fill(map2, writeSheet3); + excelWriter.finish(); zos.flush(); zos.closeEntry(); } } } + + @Override + public void repairOutputService(MaintenanceTask task, HttpServletResponse response) throws IOException { + //数据获取 + String templateFile = "RepairService.xlsx"; + InputStream fileInputStream = this.getClass().getClassLoader().getResourceAsStream("excel" + "/" + templateFile); + FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build(); + Map map0 = new HashMap<>(); + map0.put("taskName", task.getDeptName()); //客户名称 + map0.put("address", task.getDeptName()); //地址 + //获取客户联系人、联系电话 + Map cusMap = baseMapper.getDeptContact(task.getDeptId()); + if(CollectionUtils.isNotEmpty(cusMap)){ + map0.put("contact",cusMap.get("name")); //联系人 + map0.put("phone",cusMap.get("phone")); //联系方式 + } + map0.put("servicemanName", task.getServicemanName()); //维修工程师 + map0.put("inspectionConclusion", task.getInspectionConclusion()); //维修结论 + if(task.getServicemanId() != null){ + User serviceman = userService.getOne(Wrappers.lambdaQuery(User.class).eq(User::getId, task.getServicemanId())); + map0.put("servicemanPhone", serviceman.getPhone()); //维修工程师联系方式 + } + map0.put("faultDescribe",task.getFaultDescribe()); //故障现象 + map0.put("faultCause",task.getFaultCause()); //故障原因 + map0.put("travelExpense",task.getTravelExpense()==null?0:task.getTravelExpense()); //维修差旅费 + map0.put("processingResult",task.getProcessingResult()); //处理结果 + map0.put("finishTime",task.getFinishTime() != null ? DateFormatUtils.format(task.getFinishTime(),"yyyy年MM月dd日") : ""); //维修结束时间 + + Map map1 = new HashMap<>(); + map1.put("taskName", task.getDeptName()); + map1.put("address", task.getDeptName()); + if(CollectionUtils.isNotEmpty(cusMap)){ + map1.put("contact",cusMap.get("name")); //联系人 + map1.put("phone",cusMap.get("phone")); //联系方式 + } + map1.put("inspectionConclusion", task.getInspectionConclusion()); + map1.put("signatureTime",task.getSignatureTime() != null ? DateFormatUtils.format(task.getSignatureTime(),"yyyy年MM月dd日"): ""); //客户签字时间 + + + List repairGoodsList = new ArrayList<>(); + List unRepairGoodsList = new ArrayList<>(); + long no = 0; + long no1 = 0; + double total = 0.0; + double total1 = 0.0; + List taskDetailList = this.list(Wrappers.lambdaQuery(MaintenanceTaskDetail.class).eq(MaintenanceTaskDetail::getTaskId,task.getId()).eq(BaseEntity::getIsDeleted,0)); + if(CollectionUtils.isNotEmpty(taskDetailList)){ + Map> taskDetailMap = taskDetailList.stream().collect(Collectors.groupingBy(MaintenanceTaskDetail::getIsRepair)); + for (Map.Entry> entry : taskDetailMap.entrySet()) { + if(entry.getKey() == 1){ + for(MaintenanceTaskDetail detail : entry.getValue()){ + List list = maintenanceApplyGoodsService.list(Wrappers.lambdaQuery(MaintenanceTaskDetailGoods.class).eq(MaintenanceTaskDetailGoods::getParentId,detail.getId()).eq(BaseEntity::getIsDeleted,0)); + if(CollectionUtils.isNotEmpty(list)){ + for(MaintenanceTaskDetailGoods goods : list){ + no++; + RepairGoodsOutputData repairGoodsOutputData = new RepairGoodsOutputData(); + repairGoodsOutputData.setNo(no); + repairGoodsOutputData.setGoodsName(goods.getGoodsName()); + repairGoodsOutputData.setNumber(goods.getNumber()); + repairGoodsOutputData.setPrice(goods.getPrice()); + repairGoodsOutputData.setTotalPrice(goods.getNumber() * goods.getPrice()); + repairGoodsList.add(repairGoodsOutputData); + total+=goods.getNumber() * goods.getPrice(); + } + } + } + }else{ + for(MaintenanceTaskDetail detail : entry.getValue()){ + List list = maintenanceApplyGoodsService.list(Wrappers.lambdaQuery(MaintenanceTaskDetailGoods.class).eq(MaintenanceTaskDetailGoods::getParentId,detail.getId()).eq(BaseEntity::getIsDeleted,0)); + if(CollectionUtils.isNotEmpty(list)){ + for(MaintenanceTaskDetailGoods goods : list){ + no1++; + RepairGoodsOutputData unRepairGoodsOutputData = new RepairGoodsOutputData(); + unRepairGoodsOutputData.setNo(no1); + unRepairGoodsOutputData.setGoodsName(goods.getGoodsName()); + unRepairGoodsOutputData.setNumber(goods.getNumber()); + unRepairGoodsOutputData.setPrice(goods.getPrice()); + unRepairGoodsOutputData.setTotalPrice(goods.getNumber() * goods.getPrice()); + unRepairGoodsList.add(unRepairGoodsOutputData); + total1+=goods.getNumber() * goods.getPrice(); + } + } + } + } + } + } + map0.put("total",total); //维修材料费用 + map0.put("repairTotal", (task.getTravelExpense() == null ? 0.0 : task.getTravelExpense()) + total); //维修费总计 + map0.put("total1",total1); //未维修项目材料费用 + + //获取签字图片 + if (StringUtils.isNotBlank(task.getSignatureUrl())) { + try { + //获取图片 + URL url = new URL(task.getSignatureUrl()); + HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection(); + httpURLConnection.setRequestMethod("GET"); + httpURLConnection.setDoInput(true); + InputStream inputStream = httpURLConnection.getInputStream(); + BufferedImage image = ImageIO.read(inputStream); + ByteArrayOutputStream arrayOutputStream = new ByteArrayOutputStream(); + ImageIO.write(image, "png", arrayOutputStream); + byte[] bytes = arrayOutputStream.toByteArray(); + Double width = Double.valueOf(image.getWidth()); + Double height = Double.valueOf(image.getHeight()); + WriteCellData voidWriteCellData = TemplateExcelUtils.imageCells(bytes, width, height, 0.6, 1.9); + map0.put("image", voidWriteCellData); + map1.put("image", voidWriteCellData); + } catch (Exception e) { + throw new RuntimeException(e); + } + } else { + map0.put("image",null); + map1.put("image",null); + } + + //将数据导出到Excel + ServletOutputStream outputStream = response.getOutputStream(); + try (ExcelWriter excelWriter = EasyExcel.write(outputStream).withTemplate(fileInputStream).build()) { + WriteSheet writeSheet0 = EasyExcel.writerSheet(0).registerWriteHandler(new CustomMergeStrategy()).build(); + excelWriter.fill(map0, writeSheet0); + excelWriter.fill(new FillWrapper("data1", repairGoodsList),fillConfig, writeSheet0); + excelWriter.fill(new FillWrapper("data2", unRepairGoodsList),fillConfig, writeSheet0); + + WriteSheet writeSheet1 = EasyExcel.writerSheet(1).build(); + excelWriter.fill(map1, writeSheet1); + + excelWriter.finish(); + outputStream.flush(); + outputStream.close(); + } + } } diff --git a/src/main/java/org/springblade/modules/business/service/impl/WorkOrderServiceImpl.java b/src/main/java/org/springblade/modules/business/service/impl/WorkOrderServiceImpl.java index 758408f..f295e41 100644 --- a/src/main/java/org/springblade/modules/business/service/impl/WorkOrderServiceImpl.java +++ b/src/main/java/org/springblade/modules/business/service/impl/WorkOrderServiceImpl.java @@ -637,7 +637,7 @@ public class WorkOrderServiceImpl extends BaseServiceImpl limsId = Optional.ofNullable(device.get().getLimsId()); if (limsId.isPresent()) { - map.put("in", total + workOrder.getLaborCost()); + map.put("in", total + (workOrder.getLaborCost() == null ? 0 : workOrder.getLaborCost())); map.put("out", "--"); map.put("sel1", "√"); map.put("sel2", null); diff --git a/src/main/java/org/springblade/modules/system/pojo/entity/Dept.java b/src/main/java/org/springblade/modules/system/pojo/entity/Dept.java index a621aa2..1754b7f 100644 --- a/src/main/java/org/springblade/modules/system/pojo/entity/Dept.java +++ b/src/main/java/org/springblade/modules/system/pojo/entity/Dept.java @@ -120,11 +120,13 @@ public class Dept implements Serializable { @Schema(description = "是否已删除") private Integer isDeleted; - /** - * 部门种类 - * 实验室,房间 - */ -// private Integer deptCat; + private String provinceName; + + private String provinceCode; + + private String cityName; + + private String cityCode; } diff --git a/src/main/resources/excel/MaintenanceTaskReport.xlsx b/src/main/resources/excel/MaintenanceTaskReport.xlsx index 50ba63b409f83b014a8c9a8c09b491d9bdfe9600..2d5becfeec9d8842c5b4ca5312f4199622daaac1 100644 GIT binary patch delta 11818 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 delta 8038 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 diff --git a/src/main/resources/excel/RepairService.xlsx b/src/main/resources/excel/RepairService.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..91df203c3f196152322b8562cffc59afda8ad9ae GIT binary patch literal 12768 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 literal 0 HcmV?d00001