zhuo
2025-02-21 341ad6f3d4f8dd85db45380a8349eada915eb924
设备校准计划移植
已修改4个文件
已添加17个文件
1239 ■■■■■ 文件已修改
basic-server/src/main/java/com/ruoyi/basic/service/impl/CapacityScopeServiceImpl.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/controller/DeviceCalibrationPlanController.java 173 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/dto/DeviceCalibrationPlanDetailDto.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/dto/DeviceCalibrationPlanDto.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/excel/upload/DeviceCalibrationPlanDetailUpload.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/excel/upload/DeviceExaminePlanUpload.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceCalibrationPlanDetailMapper.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceCalibrationPlanMapper.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceCalibrationPlan.java 67 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceCalibrationPlanDetail.java 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/service/DeviceCalibrationPlanDetailService.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/service/DeviceCalibrationPlanService.java 89 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceCalibrationPlanDetailServiceImpl.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceCalibrationPlanServiceImpl.java 353 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/resources/mapper/DeviceCalibrationPlanDetailMapper.xml 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/resources/mapper/DeviceCalibrationPlanMapper.xml 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/util/UserUtils.java 90 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/util/XWPFDocumentUtils.java 119 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/resources/application.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/TreeSelect.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysMenu.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/service/impl/CapacityScopeServiceImpl.java
@@ -100,12 +100,14 @@
        List<Product> products = productMapper.selectList(Wrappers.<Product>lambdaQuery()
                .eq(Product::getObjectId, id));
        List<Integer> productIds = products.stream().map(Product::getId).collect(Collectors.toList());
        productPartMapper.delete(Wrappers.<ProductPart>lambdaQuery()
                .in(ProductPart::getProductId, productIds));
        if (CollectionUtils.isNotEmpty(productIds)) {
            productPartMapper.delete(Wrappers.<ProductPart>lambdaQuery()
                    .in(ProductPart::getProductId, productIds));
        // åˆ é™¤äº§å“ç»´æŠ¤
        productMapper.delete(Wrappers.<Product>lambdaQuery()
                .in(Product::getId, productIds));
            // åˆ é™¤äº§å“ç»´æŠ¤
            productMapper.delete(Wrappers.<Product>lambdaQuery()
                    .in(Product::getId, productIds));
        }
        return structureTestObjectMapper.deleteById(id);
    }
cnas-device/src/main/java/com/ruoyi/device/controller/DeviceCalibrationPlanController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,173 @@
package com.ruoyi.device.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.core.domain.Result;
import com.ruoyi.device.dto.DeviceCalibrationPlanDto;
import com.ruoyi.device.pojo.DeviceCalibrationPlan;
import com.ruoyi.device.pojo.DeviceCalibrationPlanDetail;
import com.ruoyi.device.service.DeviceCalibrationPlanDetailService;
import com.ruoyi.device.service.DeviceCalibrationPlanService;
import com.ruoyi.framework.exception.ErrorException;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;
/**
 * <p>
 * è®¾å¤‡æ ¡å‡†è®¡åˆ’主表 å‰ç«¯æŽ§åˆ¶å™¨
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-12-16 03:58:17
 */
@Api(tags = "设备校准计划")
@AllArgsConstructor
@RestController
@RequestMapping("/deviceCalibrationPlan")
public class DeviceCalibrationPlanController {
    private DeviceCalibrationPlanService deviceCalibrationPlanService;
    private DeviceCalibrationPlanDetailService deviceCalibrationPlanDetailService;
    /**
     * æ–°å¢žè®¾å¤‡æ ¡å‡†è®¡åˆ’
     * @return
     */
    @ApiOperation(value = "新增设备校准计划")
    @PostMapping("/addDeviceCalibrationPlan")
    public Result addDeviceCalibrationPlan(@RequestBody DeviceCalibrationPlanDto calibrationPlanDto){
        return Result.success(deviceCalibrationPlanService.addDeviceCalibrationPlan(calibrationPlanDto));
    }
    /**
     * ä¿®æ”¹è®¾å¤‡æ ¡å‡†è®¡åˆ’
     * @param calibrationPlanDto è®¾å¤‡æ ¡å‡†è®¡åˆ’
     */
    @ApiOperation("批量修改设备校准计划")
    @PostMapping("/updateDeviceCalibrationPlan")
    public Result updateDeviceCalibrationPlan(@RequestBody DeviceCalibrationPlanDto calibrationPlanDto) {
        return Result.success(deviceCalibrationPlanService.updateDeviceCalibrationPlan(calibrationPlanDto));
    }
    /**
     * æŸ¥è¯¢è®¾å¤‡æ ¡å‡†è®¡åˆ’详情
     */
    @ApiOperation("查询设备校准计划详情")
    @GetMapping("/getDeviceCalibrationPlan")
    public Result<DeviceCalibrationPlanDto> getDeviceCalibrationPlan(Integer planId) {
        return Result.success(deviceCalibrationPlanService.getDeviceCalibrationPlan(planId));
    }
    /**
     * å¯¼å…¥è®¾å¤‡æ ¡å‡†è®¡åˆ’
     * @return
     */
    @ApiOperation(value = "导入设备校准计划")
    @PostMapping("/importDeviceCalibrationPlan")
    public Result importDeviceCalibrationPlan(MultipartFile file, String planYear){
        return Result.success(deviceCalibrationPlanService.importDeviceCalibrationPlan(file, planYear));
    }
    /**
     * è®¾å¤‡æ ¡å‡†è®¡åˆ’删除
     * @return
     */
    @ApiOperation(value = "设备校准计划删除")
    @DeleteMapping("/delQualitySupervise")
    public Result delQualitySupervise(Integer planId){
        return Result.success(deviceCalibrationPlanService.removeById(planId));
    }
    /**
     * æäº¤æ‰¹å‡†
     * @return
     */
    @ApiOperation(value = "提交批准")
    @PostMapping("/submiatRatifyDeviceCalibrationPlan")
    public Result submiatRatifyDeviceCalibrationPlan(@RequestBody DeviceCalibrationPlan DeviceCalibrationPlan){
        return Result.success(deviceCalibrationPlanService.submiatRatifyDeviceCalibrationPlan(DeviceCalibrationPlan));
    }
    /**
     * è®¾å¤‡æ ¡å‡†è®¡åˆ’批准
     * @return
     */
    @ApiOperation(value = "设备校准计划批准")
    @PostMapping("/ratifyDeviceCalibrationPlan")
    public Result ratifyDeviceCalibrationPlan(@RequestBody DeviceCalibrationPlan DeviceCalibrationPlan){
        return Result.success(deviceCalibrationPlanService.ratifyDeviceCalibrationPlan(DeviceCalibrationPlan));
    }
    /**
     * è®¾å¤‡æ ¡å‡†è®¡åˆ’列表
     * @return
     */
    @ApiOperation(value = "设备校准计划列表")
    @GetMapping("/pageDeviceCalibrationPlan")
    public Result<IPage<DeviceCalibrationPlanDto>> pageDeviceCalibrationPlan(Page page, DeviceCalibrationPlan DeviceCalibrationPlan) throws Exception {
        return Result.success(deviceCalibrationPlanService.pageDeviceCalibrationPlan(page, DeviceCalibrationPlan));
    }
    /**
     * è®¾å¤‡æ ¡å‡†è®¡åˆ’详情列表
     * @return
     */
    @ApiOperation(value = "设备校准计划详情列表")
    @PostMapping("/pageDeviceCalibrationPlanDetail")
    public Result<IPage<DeviceCalibrationPlanDetail>> pageDeviceCalibrationPlanDetail(Page page, DeviceCalibrationPlanDetail deviceCalibrationPlanDetails) {
        return Result.success(deviceCalibrationPlanService.pageDeviceCalibrationPlanDetail(page, deviceCalibrationPlanDetails));
    }
    /**
     * æ–°å¢žè®¾å¤‡æ ¡å‡†è®¡åˆ’详情
     * @return
     */
    @ApiOperation(value = "新增设备校准计划详情")
    @PostMapping("/addDeviceCalibrationPlanDetail")
    public Result addDeviceCalibrationPlanDetail(@RequestBody DeviceCalibrationPlanDetail deviceCalibrationPlanDetail){
        if (deviceCalibrationPlanDetail.getPlanId() == null) {
            throw new ErrorException("缺少设备校准计划主表id");
        }
        return Result.success(deviceCalibrationPlanDetailService.save(deviceCalibrationPlanDetail));
    }
    /**
     * ä¿®æ”¹è®¾å¤‡æ ¡å‡†è®¡åˆ’详情
     * @return
     */
    @ApiOperation(value = "修改设备校准计划详情")
    @PostMapping("/updateDeviceCalibrationPlanDetail")
    public Result updateDeviceCalibrationPlanDetail(@RequestBody DeviceCalibrationPlanDetail deviceCalibrationPlanDetail){
        return Result.success(deviceCalibrationPlanDetailService.updateById(deviceCalibrationPlanDetail));
    }
    /**
     * åˆ é™¤è®¾å¤‡æ ¡å‡†è®¡åˆ’详情
     * @return
     */
    @ApiOperation(value = "删除设备校准计划详情")
    @GetMapping("/delDeviceCalibrationPlanDetail")
    public Result delDeviceCalibrationPlanDetail(Integer planDetailsId){
        return Result.success(deviceCalibrationPlanDetailService.removeById(planDetailsId));
    }
    /**
     * å¯¼å‡ºè®¾å¤‡æ ¡å‡†è®¡åˆ’
     * @return
     */
    @ApiOperation(value = "导出设备校准计划")
    @GetMapping("/exportDeviceCalibrationPlanDetail")
    public void exportDeviceCalibrationPlanDetail(Integer planId, HttpServletResponse response){
        deviceCalibrationPlanService.exportDeviceCalibrationPlanDetail(planId, response);
    }
}
cnas-device/src/main/java/com/ruoyi/device/dto/DeviceCalibrationPlanDetailDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,21 @@
package com.ruoyi.device.dto;
import com.ruoyi.device.pojo.DeviceCalibrationPlanDetail;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * Author: yuan
 * Date: 2024-12-17 æ˜ŸæœŸäºŒ 10:05:08
 * Description:
 */
@Data
public class DeviceCalibrationPlanDetailDto extends DeviceCalibrationPlanDetail {
    @ApiModelProperty("序号")
    private Integer index;
    @ApiModelProperty("最近检定时间Str")
    private String lastDateStr;
    @ApiModelProperty("本年计划校准时间Str")
    private String planDateStr;
}
cnas-device/src/main/java/com/ruoyi/device/dto/DeviceCalibrationPlanDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,31 @@
package com.ruoyi.device.dto;
import com.ruoyi.device.pojo.DeviceCalibrationPlan;
import com.ruoyi.device.pojo.DeviceCalibrationPlanDetail;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
/**
 * @Author zhuo
 * @Date 2024/12/16
 */
@Data
public class DeviceCalibrationPlanDto extends DeviceCalibrationPlan {
    @ApiModelProperty("编制人")
    private String writeName;
    @ApiModelProperty("批准人")
    private String ratifyName;
    @ApiModelProperty("编制时间")
    private String writeTimeStr;
    @ApiModelProperty("批准时间")
    private String ratifyTimeStr;
    @ApiModelProperty("校准计划详情")
    private List<DeviceCalibrationPlanDetail> calibrationPlanDetailList;
}
cnas-device/src/main/java/com/ruoyi/device/excel/upload/DeviceCalibrationPlanDetailUpload.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,36 @@
package com.ruoyi.device.excel.upload;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * @Author zhuo
 * @Date 2024/12/20
 */
@Data
public class DeviceCalibrationPlanDetailUpload {
    @ApiModelProperty("设备名称及型号")
    private String deviceName;
    @ApiModelProperty("设备数量")
    private String deviceAmount;
    @ApiModelProperty("仪器编号")
    private String deviceNumber;
    @ApiModelProperty("检定单位")
    private String verificationUnit;
    @ApiModelProperty("检定周期")
    private String verificationCycles;
    @ApiModelProperty("最近检定时间")
    private String lastDate;
    @ApiModelProperty("本年计划校准时间")
    private String planDate;
    @ApiModelProperty("备注")
    private String remark;
}
cnas-device/src/main/java/com/ruoyi/device/excel/upload/DeviceExaminePlanUpload.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,37 @@
package com.ruoyi.device.excel.upload;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * @Author zhuo
 * @Date 2024/12/20
 */
@Data
public class DeviceExaminePlanUpload {
    @ApiModelProperty("设备编号")
    private String deviceNumber;
    @ApiModelProperty("计划名称")
    private String deviceName;
    @ApiModelProperty("核查时间")
    private String checkTime;
    @ApiModelProperty("核查指标")
    private String checkIndex;
    @ApiModelProperty("核查方法")
    private String checkMethod;
    @ApiModelProperty("结果如何判定")
    private String howResults;
    @ApiModelProperty("核查责任人")
    private String checkChargerUser;
    @ApiModelProperty("备注")
    private String remark;
}
cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceCalibrationPlanDetailMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,27 @@
package com.ruoyi.device.mapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.device.pojo.DeviceCalibrationPlanDetail;
import org.apache.ibatis.annotations.Param;
/**
 * <p>
 * è®¾å¤‡æ ¡å‡†è®¡åˆ’详情表 Mapper æŽ¥å£
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-12-16 03:58:29
 */
public interface DeviceCalibrationPlanDetailMapper extends BaseMapper<DeviceCalibrationPlanDetail> {
    /**
     * è®¾å¤‡æ ¡å‡†è®¡åˆ’详情列表
     * @param page
     * @param ew
     * @return
     */
    IPage<DeviceCalibrationPlanDetail> pageDeviceCalibrationPlanDetail(Page page, @Param("ew") QueryWrapper<DeviceCalibrationPlanDetail> ew);
}
cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceCalibrationPlanMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,29 @@
package com.ruoyi.device.mapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.device.dto.DeviceCalibrationPlanDto;
import com.ruoyi.device.pojo.DeviceCalibrationPlan;
import org.apache.ibatis.annotations.Param;
/**
 * <p>
 * è®¾å¤‡æ ¡å‡†è®¡åˆ’主表 Mapper æŽ¥å£
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-12-16 03:58:17
 */
public interface DeviceCalibrationPlanMapper extends BaseMapper<DeviceCalibrationPlan> {
    /**
     * è®¾å¤‡æ ¡å‡†è®¡åˆ’列表
     * @param page
     * @param ew
     * @return
     */
    IPage<DeviceCalibrationPlanDto> pageDeviceCalibrationPlan(Page page, @Param("ew") QueryWrapper<DeviceCalibrationPlan> ew);
}
cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceCalibrationPlan.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,67 @@
package com.ruoyi.device.pojo;
import com.baomidou.mybatisplus.annotation.*;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.time.LocalDateTime;
/**
 * <p>
 * è®¾å¤‡æ ¡å‡†è®¡åˆ’主表
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-12-16 03:58:17
 */
@Getter
@Setter
@TableName("device_calibration_plan")
@ApiModel(value = "DeviceCalibrationPlan对象", description = "设备校准计划主表")
public class DeviceCalibrationPlan{
    @TableId(value = "plan_id", type = IdType.AUTO)
    private Integer planId;
    @ApiModelProperty("计划名称")
    private String planName;
    @ApiModelProperty("计划年份")
    private String planYear;
    @ApiModelProperty("编制人")
    private Integer writeUserId;
    @ApiModelProperty("编制时间")
    private LocalDateTime writeTime;
    @ApiModelProperty("批准人")
    private Integer ratifyUserId;
    @ApiModelProperty("批准时间")
    private LocalDateTime ratifyTime;
    @ApiModelProperty("批准状态,0 ä¸é€šè¿‡, 1 é€šè¿‡")
    private Integer ratifyStatus;
    @ApiModelProperty("批准信息")
    private String ratifyRemark;
    @ApiModelProperty("创建人")
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @ApiModelProperty("创建时间")
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    @ApiModelProperty("修改人")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @ApiModelProperty("修改时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
}
cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceCalibrationPlanDetail.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,74 @@
package com.ruoyi.device.pojo;
import com.baomidou.mybatisplus.annotation.*;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.time.LocalDate;
import java.time.LocalDateTime;
/**
 * <p>
 * è®¾å¤‡æ ¡å‡†è®¡åˆ’详情表
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-12-16 03:58:29
 */
@Getter
@Setter
@TableName("device_calibration_plan_detail")
@ApiModel(value = "DeviceCalibrationPlanDetail对象", description = "设备校准计划详情表")
public class DeviceCalibrationPlanDetail{
    @TableId(value = "plan_detail_id", type = IdType.AUTO)
    private Integer planDetailId;
    @ApiModelProperty("计划主表id")
    private Integer planId;
    @ApiModelProperty("设备id")
    private Integer deviceId;
    @ApiModelProperty("设备名称及型号")
    private String deviceName;
    @ApiModelProperty("设备数量")
    private String deviceAmount;
    @ApiModelProperty("仪器编号")
    private String deviceNumber;
    @ApiModelProperty("检定单位")
    private String verificationUnit;
    @ApiModelProperty("检定周期")
    private String verificationCycles;
    @ApiModelProperty("最近检定时间")
    private LocalDate lastDate;
    @ApiModelProperty("本年计划校准时间")
    private LocalDate planDate;
    @ApiModelProperty("备注")
    private String remark;
    @ApiModelProperty("创建人")
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @ApiModelProperty("创建时间")
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    @ApiModelProperty("修改人")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @ApiModelProperty("修改时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
}
cnas-device/src/main/java/com/ruoyi/device/service/DeviceCalibrationPlanDetailService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
package com.ruoyi.device.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.device.pojo.DeviceCalibrationPlanDetail;
/**
 * <p>
 * è®¾å¤‡æ ¡å‡†è®¡åˆ’详情表 æœåŠ¡ç±»
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-12-16 03:58:29
 */
public interface DeviceCalibrationPlanDetailService extends IService<DeviceCalibrationPlanDetail> {
}
cnas-device/src/main/java/com/ruoyi/device/service/DeviceCalibrationPlanService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,89 @@
package com.ruoyi.device.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.device.dto.DeviceCalibrationPlanDto;
import com.ruoyi.device.pojo.DeviceCalibrationPlan;
import com.ruoyi.device.pojo.DeviceCalibrationPlanDetail;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
/**
 * <p>
 * è®¾å¤‡æ ¡å‡†è®¡åˆ’主表 æœåŠ¡ç±»
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-12-16 03:58:17
 */
public interface DeviceCalibrationPlanService extends IService<DeviceCalibrationPlan> {
    /**
     * æ–°å¢žè®¾å¤‡æ ¡å‡†è®¡åˆ’
     * @param calibrationPlanDto
     * @return
     */
    boolean addDeviceCalibrationPlan(DeviceCalibrationPlanDto calibrationPlanDto);
    /**
     * å¯¼å…¥è®¾å¤‡æ ¡å‡†è®¡åˆ’
     * @param file
     * @return
     */
    boolean importDeviceCalibrationPlan(MultipartFile file, String planYear);
    /**
     * æäº¤æ‰¹å‡†
     * @param deviceCalibrationPlan
     * @return
     */
    boolean submiatRatifyDeviceCalibrationPlan(DeviceCalibrationPlan deviceCalibrationPlan);
    /**
     * è®¾å¤‡æ ¡å‡†è®¡åˆ’批准
     * @param DeviceCalibrationPlan
     * @return
     */
    boolean ratifyDeviceCalibrationPlan(DeviceCalibrationPlan DeviceCalibrationPlan);
    /**
     * è®¾å¤‡æ ¡å‡†è®¡åˆ’列表
     * @param page
     * @param DeviceCalibrationPlan
     * @return
     */
    IPage<DeviceCalibrationPlanDto> pageDeviceCalibrationPlan(Page page, DeviceCalibrationPlan deviceCalibrationPlan);
    /**
     * è®¾å¤‡æ ¡å‡†è®¡åˆ’详情列表
     * @param page
     * @param DeviceCalibrationPlanDetails
     * @return
     */
    IPage<DeviceCalibrationPlanDetail> pageDeviceCalibrationPlanDetail(Page page, DeviceCalibrationPlanDetail deviceCalibrationPlanDetails);
    /**
     * å¯¼å‡ºè®¾å¤‡æ ¡å‡†è®¡åˆ’
     *
     * @param DeviceCalibrationPlanId
     * @param response
     */
    void exportDeviceCalibrationPlanDetail(Integer DeviceCalibrationPlanId, HttpServletResponse response);
    /**
     * æ‰¹é‡ç¼–辑设备校准详情
     * @param calibrationPlanDto
     * @return
     */
    boolean updateDeviceCalibrationPlan(DeviceCalibrationPlanDto calibrationPlanDto);
    /**
     * æŸ¥è¯¢è®¾å¤‡æ ¡å‡†è¯¦æƒ…
     * @param planId
     * @return
     */
    DeviceCalibrationPlanDto getDeviceCalibrationPlan(Integer planId);
}
cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceCalibrationPlanDetailServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
package com.ruoyi.device.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.device.mapper.DeviceCalibrationPlanDetailMapper;
import com.ruoyi.device.pojo.DeviceCalibrationPlanDetail;
import com.ruoyi.device.service.DeviceCalibrationPlanDetailService;
import org.springframework.stereotype.Service;
/**
 * <p>
 * è®¾å¤‡æ ¡å‡†è®¡åˆ’详情表 æœåŠ¡å®žçŽ°ç±»
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-12-16 03:58:29
 */
@Service
public class DeviceCalibrationPlanDetailServiceImpl extends ServiceImpl<DeviceCalibrationPlanDetailMapper, DeviceCalibrationPlanDetail> implements DeviceCalibrationPlanDetailService {
}
cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceCalibrationPlanServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,353 @@
package com.ruoyi.device.service.impl;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure;
import com.ruoyi.common.core.domain.entity.InformationNotification;
import com.ruoyi.common.core.domain.entity.User;
import com.ruoyi.common.utils.QueryWrappers;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.WxCpUtils;
import com.ruoyi.device.dto.DeviceCalibrationPlanDetailDto;
import com.ruoyi.device.dto.DeviceCalibrationPlanDto;
import com.ruoyi.device.excel.upload.DeviceCalibrationPlanDetailUpload;
import com.ruoyi.device.mapper.DeviceCalibrationPlanDetailMapper;
import com.ruoyi.device.mapper.DeviceCalibrationPlanMapper;
import com.ruoyi.device.pojo.DeviceCalibrationPlan;
import com.ruoyi.device.pojo.DeviceCalibrationPlanDetail;
import com.ruoyi.device.service.DeviceCalibrationPlanDetailService;
import com.ruoyi.device.service.DeviceCalibrationPlanService;
import com.ruoyi.inspect.util.HackLoopTableRenderPolicy;
import com.ruoyi.inspect.util.UserUtils;
import com.ruoyi.system.mapper.UserMapper;
import com.ruoyi.system.service.InformationNotificationService;
import org.springframework.beans.BeanUtils;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
/**
 * <p>
 * è®¾å¤‡æ ¡å‡†è®¡åˆ’主表 æœåŠ¡å®žçŽ°ç±»
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-12-16 03:58:17
 */
@Service
@Transactional(rollbackFor = Exception.class)
public class DeviceCalibrationPlanServiceImpl extends ServiceImpl<DeviceCalibrationPlanMapper, DeviceCalibrationPlan> implements DeviceCalibrationPlanService {
    @Resource
    private DeviceCalibrationPlanDetailMapper deviceCalibrationPlanDetailMapper;
    @Resource
    private DeviceCalibrationPlanDetailService deviceCalibrationPlanDetailService;
    @Resource
    private ThreadPoolTaskExecutor threadPoolTaskExecutor;
    @Resource
    private InformationNotificationService informationNotificationService;
    @Resource
    private UserMapper userMapper;
    /**
     * æ–°å¢žè®¾å¤‡æ ¡å‡†è®¡åˆ’
     * @param calibrationPlanDto
     * @return
     */
    @Override
    public boolean addDeviceCalibrationPlan(DeviceCalibrationPlanDto calibrationPlanDto) {
        // å½“前登录用户
        Integer userId = SecurityUtils.getUserId().intValue();
        // ç¼–制日期
        calibrationPlanDto.setWriteUserId(userId);
        calibrationPlanDto.setWriteTime(LocalDateTime.now());
        baseMapper.insert(calibrationPlanDto);
        // æ·»åŠ è¯¦æƒ…
        if (CollectionUtils.isNotEmpty(calibrationPlanDto.getCalibrationPlanDetailList())) {
            for (DeviceCalibrationPlanDetail calibrationPlanDetail : calibrationPlanDto.getCalibrationPlanDetailList()) {
                calibrationPlanDetail.setPlanId(calibrationPlanDto.getPlanId());
            }
            deviceCalibrationPlanDetailService.saveBatch(calibrationPlanDto.getCalibrationPlanDetailList());
        }
        return true;
    }
    /**
     * å¯¼å…¥è®¾å¤‡æ ¡å‡†è®¡åˆ’
     * @param file
     * @return
     */
    @Override
    public boolean importDeviceCalibrationPlan(MultipartFile file, String planYear) {
        // å½“前登录用户
        Integer userId = SecurityUtils.getUserId().intValue();
        // æ–‡ä»¶åç§°
        String fileName = file.getOriginalFilename().substring(0, file.getOriginalFilename().lastIndexOf("."));
        DeviceCalibrationPlan calibrationPlan = new DeviceCalibrationPlan();
        calibrationPlan.setPlanName(fileName);
        calibrationPlan.setPlanYear(planYear);
        calibrationPlan.setWriteUserId(userId);
        calibrationPlan.setWriteTime(LocalDateTime.now());
        baseMapper.insert(calibrationPlan);
        List<DeviceCalibrationPlanDetail> detailsUploadList = new ArrayList<>();
        // å¯¼å…¥é™„件内容
        try {
            // excel解析
            EasyExcel.read(file.getInputStream(), DeviceCalibrationPlanDetailUpload.class, new AnalysisEventListener<DeviceCalibrationPlanDetailUpload>() {
                @Override
                public void invoke(DeviceCalibrationPlanDetailUpload detailsUpload, AnalysisContext analysisContext) {
                    // åˆ¤æ–­æ˜¯å¦ä¸ºç©º
                    if (StringUtils.isNotBlank(detailsUpload.getDeviceName()) &&
                            StringUtils.isNotBlank(detailsUpload.getDeviceNumber())) {
                        // å¯¹è±¡å¤åˆ¶
                        DeviceCalibrationPlanDetail calibrationPlanDetail = new DeviceCalibrationPlanDetail();
                        BeanUtils.copyProperties(detailsUpload, calibrationPlanDetail);
                        // æ ¼å¼è¯æœ€è¿‘检定时间和本年计划校准时间
                        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy.MM.dd");
                        calibrationPlanDetail.setLastDate(LocalDate.parse(detailsUpload.getLastDate(), formatter));
                        calibrationPlanDetail.setPlanDate(LocalDate.parse(detailsUpload.getLastDate(), formatter));
                        calibrationPlanDetail.setPlanId(calibrationPlan.getPlanId());
                        detailsUploadList.add(calibrationPlanDetail);
                    }
                }
                @Override
                public void doAfterAllAnalysed(AnalysisContext analysisContext) {
                }
            }).sheet().doRead();
            deviceCalibrationPlanDetailService.saveBatch(detailsUploadList);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        return true;
    }
    /**
     * æäº¤æ‰¹å‡†
     * @param deviceCalibrationPlan
     * @return
     */
    @Override
    public boolean submiatRatifyDeviceCalibrationPlan(DeviceCalibrationPlan deviceCalibrationPlan) {
        baseMapper.update(null, Wrappers.<DeviceCalibrationPlan>lambdaUpdate()
                .eq(DeviceCalibrationPlan::getPlanId, deviceCalibrationPlan.getPlanId())
                .set(DeviceCalibrationPlan::getRatifyUserId, deviceCalibrationPlan.getRatifyUserId())
                .set(DeviceCalibrationPlan::getRatifyRemark, null)
                .set(DeviceCalibrationPlan::getRatifyStatus, null)
                .set(DeviceCalibrationPlan::getRatifyTime, null)
        );
        DeviceCalibrationPlan calibrationPlan = baseMapper.selectById(deviceCalibrationPlan.getPlanId());
        // å‘送消息
        Integer userId = SecurityUtils.getUserId().intValue();
        User user = userMapper.selectById(userId);
        // æ¶ˆæ¯å‘送
        InformationNotification info = new InformationNotification();
        // å‘送人
        info.setCreateUser(user.getName());
        info.setMessageType("6");
        info.setTheme("CNAS设备校准计划批准通知");
        info.setContent(calibrationPlan.getPlanName() + "的设备校准计划待批准");
        info.setSenderId(userId);
        // æŽ¥æ”¶äºº
        info.setConsigneeId(deviceCalibrationPlan.getRatifyUserId());
        info.setJumpPath("a6-device");
        informationNotificationService.addInformationNotification(info);
        // å‘送企业微信通知
        threadPoolTaskExecutor.execute(() -> {
            // æŸ¥è¯¢æŽ¥æ”¶äºº
            User personnel = userMapper.selectById(deviceCalibrationPlan.getPlanId());
            String message = "";
            message += "CNAS设备校准计划批准通知";
            message += "\n请去资源管理-设备一层目录-设备校准计划填写";
            message += "\n" + calibrationPlan.getPlanName() + "的校准计划待批准";
            //发送企业微信消息通知
            try {
                WxCpUtils.inform(personnel.getAccount(), message, null);
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        });
        return true;
    }
    /**
     * è®¾å¤‡æ ¡å‡†è®¡åˆ’批准
     * @param deviceCalibrationPlan
     * @return
     */
    @Override
    public boolean ratifyDeviceCalibrationPlan(DeviceCalibrationPlan deviceCalibrationPlan) {
        baseMapper.update(null, Wrappers.<DeviceCalibrationPlan>lambdaUpdate()
                .eq(DeviceCalibrationPlan::getPlanId, deviceCalibrationPlan.getPlanId())
                .set(DeviceCalibrationPlan::getRatifyRemark, deviceCalibrationPlan.getRatifyRemark())
                .set(DeviceCalibrationPlan::getRatifyStatus, deviceCalibrationPlan.getRatifyStatus())
                .set(DeviceCalibrationPlan::getRatifyTime, LocalDateTime.now())
        );
        return true;
    }
    /**
     * è®¾å¤‡æ ¡å‡†è®¡åˆ’列表
     * @param page
     * @param deviceCalibrationPlan
     * @return
     */
    @Override
    public IPage<DeviceCalibrationPlanDto> pageDeviceCalibrationPlan(Page page, DeviceCalibrationPlan deviceCalibrationPlan) {
        return baseMapper.pageDeviceCalibrationPlan(page, QueryWrappers.queryWrappers(deviceCalibrationPlan));
    }
    /**
     * è®¾å¤‡æ ¡å‡†è®¡åˆ’详情列表
     * @param page
     * @param deviceCalibrationPlanDetails
     * @return
     */
    @Override
    public IPage<DeviceCalibrationPlanDetail> pageDeviceCalibrationPlanDetail(Page page, DeviceCalibrationPlanDetail deviceCalibrationPlanDetails) {
        if (deviceCalibrationPlanDetails.getPlanId() == null) {
            return new Page();
        }
        return deviceCalibrationPlanDetailMapper.pageDeviceCalibrationPlanDetail(page, QueryWrappers.queryWrappers(deviceCalibrationPlanDetails));
    }
    /**
     * å¯¼å‡ºè®¾å¤‡æ ¡å‡†è®¡åˆ’
     * @param deviceCalibrationPlanId
     * @param response
     */
    @Override
    public void exportDeviceCalibrationPlanDetail(Integer deviceCalibrationPlanId, HttpServletResponse response) {
        // æŸ¥è¯¢è®¾å¤‡æ ¡å‡†è®¡åˆ’
        DeviceCalibrationPlan deviceCalibrationPlan = baseMapper.selectById(deviceCalibrationPlanId);
        DeviceCalibrationPlanDto deviceCalibrationPlanDto = new DeviceCalibrationPlanDto();
        BeanUtils.copyProperties(deviceCalibrationPlan, deviceCalibrationPlanDto);
        // è®¾ç½®ç¼–制和批准时间格式
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        deviceCalibrationPlanDto.setWriteTimeStr(deviceCalibrationPlan.getWriteTime() == null ? null : deviceCalibrationPlan.getWriteTime().format(formatter));
        deviceCalibrationPlanDto.setRatifyTimeStr(deviceCalibrationPlan.getRatifyTime() == null ? null : deviceCalibrationPlan.getRatifyTime().format(formatter));
        // æŸ¥è¯¢è®¾å¤‡æ ¡å‡†è®¡åˆ’详情
        List<DeviceCalibrationPlanDetail> deviceCalibrationPlanDetailList = deviceCalibrationPlanDetailMapper.selectList(Wrappers.<DeviceCalibrationPlanDetail>lambdaQuery().eq(DeviceCalibrationPlanDetail::getPlanId, deviceCalibrationPlanId));
        // è®¾ç½®åºå· å’Œ æ—¶é—´
        ArrayList<DeviceCalibrationPlanDetailDto> deviceCalibrationPlanDetailDtoList = new ArrayList<>();
        deviceCalibrationPlanDetailList.forEach(deviceCalibrationPlanDetail -> {
            DeviceCalibrationPlanDetailDto deviceCalibrationPlanDetailDto = new DeviceCalibrationPlanDetailDto();
            BeanUtils.copyProperties(deviceCalibrationPlanDetail, deviceCalibrationPlanDetailDto);
            deviceCalibrationPlanDetailDto.setIndex(deviceCalibrationPlanDetailList.indexOf(deviceCalibrationPlanDetail) + 1);
            deviceCalibrationPlanDetailDto.setLastDateStr((deviceCalibrationPlanDetail.getLastDate().format(formatter)));
            deviceCalibrationPlanDetailDto.setPlanDateStr((deviceCalibrationPlanDetail.getPlanDate().format(formatter)));
            deviceCalibrationPlanDetailDtoList.add(deviceCalibrationPlanDetailDto);
        });
        // èŽ·å–è·¯å¾„
        InputStream inputStream = this.getClass().getResourceAsStream("/static/word/device-calibration-plan.docx");
        Configure configure = Configure.builder()
                .bind("deviceCalibrationPlanDetailDtoList", new HackLoopTableRenderPolicy())
                .build();
        XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
                new HashMap<String, Object>() {{
                    put("deviceCalibrationPlan", deviceCalibrationPlanDto);
                    put("deviceCalibrationPlanDetailDtoList", deviceCalibrationPlanDetailDtoList);
                    //获取编制人的签名地址
                    put("organizationUrl", UserUtils.getFinalUserSignatureUrl(deviceCalibrationPlan.getRatifyUserId()));
                    //获取批准人的签名地址
                    put("approvedUrl", UserUtils.getFinalUserSignatureUrl(deviceCalibrationPlan.getWriteUserId()));
                }});
        try {
            response.setContentType("application/msword");
            String fileName = URLEncoder.encode(
                    "设备校准计划表", "UTF-8");
            response.setHeader("Content-disposition",
                    "attachment;filename=" + fileName + ".docx");
            OutputStream os = response.getOutputStream();
            template.write(os);
            os.flush();
            os.close();
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("导出失败");
        }
    }
    /**
     * æ‰¹é‡ç¼–辑设备校准
     * @param calibrationPlanDto
     * @return
     */
    @Override
    public boolean updateDeviceCalibrationPlan(DeviceCalibrationPlanDto calibrationPlanDto) {
        // å½“前登录用户
        Integer userId = SecurityUtils.getUserId().intValue();
        // ç¼–制日期
        calibrationPlanDto.setWriteUserId(userId);
        calibrationPlanDto.setWriteTime(LocalDateTime.now());
        baseMapper.updateById(calibrationPlanDto);
        // åˆ é™¤åŽŸæœ¬çš„è¯¦æƒ…
        deviceCalibrationPlanDetailService.remove(Wrappers.<DeviceCalibrationPlanDetail>lambdaQuery().eq(DeviceCalibrationPlanDetail::getPlanId, calibrationPlanDto.getPlanId()));
        // æ·»åŠ è¯¦æƒ…
        if (CollectionUtils.isNotEmpty(calibrationPlanDto.getCalibrationPlanDetailList())) {
            for (DeviceCalibrationPlanDetail calibrationPlanDetail : calibrationPlanDto.getCalibrationPlanDetailList()) {
                calibrationPlanDetail.setPlanId(calibrationPlanDto.getPlanId());
            }
            deviceCalibrationPlanDetailService.saveBatch(calibrationPlanDto.getCalibrationPlanDetailList());
        }
        return true;
    }
    /**
     * æŸ¥è¯¢è®¾å¤‡æ ¡å‡†è¯¦æƒ…
     * @param planId
     * @return
     */
    @Override
    public DeviceCalibrationPlanDto getDeviceCalibrationPlan(Integer planId) {
        DeviceCalibrationPlan calibrationPlan = baseMapper.selectById(planId);
        DeviceCalibrationPlanDto deviceCalibrationPlanDto = new DeviceCalibrationPlanDto();
        BeanUtils.copyProperties(calibrationPlan, deviceCalibrationPlanDto);
        // æŸ¥è¯¢è¯¦æƒ…
        List<DeviceCalibrationPlanDetail> list = deviceCalibrationPlanDetailService.list(Wrappers.<DeviceCalibrationPlanDetail>lambdaQuery()
                .eq(DeviceCalibrationPlanDetail::getPlanId, planId)
                .orderByAsc(DeviceCalibrationPlanDetail::getPlanDate));
        deviceCalibrationPlanDto.setCalibrationPlanDetailList(list);
        return deviceCalibrationPlanDto;
    }
}
cnas-device/src/main/resources/mapper/DeviceCalibrationPlanDetailMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.device.mapper.DeviceCalibrationPlanDetailMapper">
    <!-- è®¾å¤‡æ ¡å‡†è®¡åˆ’详情列表 -->
    <select id="pageDeviceCalibrationPlanDetail" resultType="com.ruoyi.device.pojo.DeviceCalibrationPlanDetail">
        select * from (
        select *
        from device_calibration_plan_detail
        order by plan_date asc
        ) a
        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
            ${ew.customSqlSegment}
        </if>
    </select>
</mapper>
cnas-device/src/main/resources/mapper/DeviceCalibrationPlanMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.device.mapper.DeviceCalibrationPlanMapper">
    <!-- è®¾å¤‡æ ¡å‡†è®¡åˆ’列表 -->
    <select id="pageDeviceCalibrationPlan" resultType="com.ruoyi.device.dto.DeviceCalibrationPlanDto">
        select *
        from (select cqm.*,
        u1.name write_name,
        u3.name ratify_name
        from device_calibration_plan cqm
        left join user u1 on u1.id = cqm.write_user_id
        left join user u3 on u3.id = cqm.ratify_user_id
        order by cqm.create_time desc) a
        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
            ${ew.customSqlSegment}
        </if>
    </select>
</mapper>
inspect-server/src/main/java/com/ruoyi/inspect/util/UserUtils.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,90 @@
package com.ruoyi.inspect.util;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.deepoove.poi.data.PictureRenderData;
import com.deepoove.poi.data.Pictures;
import com.ruoyi.common.core.domain.entity.User;
import com.ruoyi.framework.exception.ErrorException;
import com.ruoyi.system.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
/**
 * Author: yuan
 * Date: 2024-12-17 æ˜ŸæœŸäºŒ 10:35:50
 * Description: User工具类
 */
@Component
public class UserUtils {
    private static UserMapper userMapper;
    private static String imgUrl;
    @Autowired
    public void setUserMapper(UserMapper userMapper) {
        UserUtils.userMapper = userMapper;
    }
    @Autowired
    public void setImgUrl(@Value("${file.path}") String imgUrl) {
        UserUtils.imgUrl = imgUrl;
    }
    /**
     * é€šè¿‡äººå‘˜id获取用户签名地址
     * @param userId äººå‘˜id
     * @return ç”¨æˆ·ç­¾ååœ°å€
     */
    public static String getUserSignatureUrl(Integer userId) {
        String userSignatureUrl = null;
        if (userId != null) {
            userSignatureUrl = userMapper.selectOne(Wrappers.<User>lambdaQuery()
                            .eq(User::getId, userId))
                    .getSignatureUrl();
            if (StringUtils.isBlank(userSignatureUrl)) {
                throw new ErrorException("找不到该人员签名");
            }
            return imgUrl + "\\" + userSignatureUrl;
        } else {
            return null;
        }
    }
    /**
     * é€šè¿‡äººå‘˜id获取渲染Word用户签名对象
     * @param userId äººå‘˜id
     * @return ç”¨æˆ·ç­¾åå¯¹è±¡ or null
     */
    public static PictureRenderData getFinalUserSignatureUrl(Integer userId) {
        String userSignatureUrl = null;
        if (userId != null) {
            userSignatureUrl = userMapper.selectById(userId)
                    .getSignatureUrl();
            if (StringUtils.isBlank(userSignatureUrl)) {
                throw new ErrorException("找不到该人员签名");
            }
        }
        return StringUtils.isNotBlank(userSignatureUrl) ? Pictures.ofLocal(imgUrl + "/" + userSignatureUrl).create() : null;
    }
    /**
     * é€šè¿‡åå­—获取渲染Word用户签名对象
     * @param userName äººå‘˜åå­—
     * @return ç”¨æˆ·ç­¾åå¯¹è±¡ or null
     */
    public static PictureRenderData getFinalUserSignatureUrl(String userName) {
        String userSignatureUrl = null;
        if (userName != null) {
            userSignatureUrl = userMapper.selectOne(Wrappers.<User>lambdaQuery()
                            .eq(User::getName, userName))
                    .getSignatureUrl();
            if (StringUtils.isBlank(userSignatureUrl)) {
                throw new ErrorException("找不到该人员签名");
            }
        }
        return StringUtils.isNotBlank(userSignatureUrl) ? Pictures.ofLocal(imgUrl + "/" + userSignatureUrl).create() : null;
    }
}
inspect-server/src/main/java/com/ruoyi/inspect/util/XWPFDocumentUtils.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,119 @@
package com.ruoyi.inspect.util;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import org.apache.poi.xwpf.usermodel.*;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STMerge;
import java.util.*;
/**
 * @Author zhuo
 * @Date 2024/11/16
 */
public class XWPFDocumentUtils {
    public static void updateMergeByDocument(XWPFDocument document) {
        // å¤„理合并单元格的问题
        List<XWPFTable> xwpfTables = document.getTables();
        for (int i = 0; i < xwpfTables.size(); i++) {
            Set<String> set1 = new HashSet<>();
            Map<String, Map<String, Integer>> maps = new HashMap<>();
            for (int j = 0; j < xwpfTables.get(i).getRows().size(); j++) {
                for (int k = 0; k < xwpfTables.get(i).getRows().get(j).getTableCells().size(); k++) {
                    if (xwpfTables.get(i).getRows().get(j).getTableCells().get(k).getText().contains("∑")) {
                        String[] split = xwpfTables.get(i).getRows().get(j).getTableCells().get(k).getText().split("∑");
                        if (set1.add(split[1])) {
                            Map<String, Integer> map = new HashMap<>();
                            map.put("sr", j);
                            map.put("sc", k);
                            map.put("er", j + 0);
                            map.put("ec", k + 0);
                            maps.put(split[1], map);
                        } else {
                            Map<String, Integer> map1 = maps.get(split[1]);
                            if (j == map1.get("sr")) {
                                map1.put("ec", map1.get("ec") + 1);
                            } else if (k == map1.get("sc")) {
                                map1.put("er", map1.get("er") + 1);
                            }
                        }
                        String str = xwpfTables.get(i).getRows().get(j).getTableCells().get(k).getText().split("∑")[0];
                        xwpfTables.get(i).getRows().get(j).getTableCells().get(k).removeParagraph(0);
                        xwpfTables.get(i).getRows().get(j).getTableCells().get(k).setText(str);
                        xwpfTables.get(i).getRows().get(j).getTableCells().get(k).setVerticalAlignment(XWPFTableCell.XWPFVertAlign.CENTER);
                        xwpfTables.get(i).getRows().get(j).getTableCells().get(k).getParagraphArray(0).setAlignment(ParagraphAlignment.CENTER);
                    }
                }
            }
            // å•元格排序, é¿å…æ ¼å¼é”™ä¹±
            List<Map.Entry<String, Map<String, Integer>>> entries = new ArrayList<>(maps.entrySet());
            entries.sort((o1, o2) -> o1.getValue().get("sc") - o2.getValue().get("sc"));
            // æŒ‰ç…§é¡ºåºæ·»åŠ è¿›é›†åˆ
            List<String> list = new ArrayList<>();
            for (Map.Entry<String, Map<String, Integer>> entry : entries) {
                list.add(entry.getKey());
            }
            for (int a = list.size() - 1; a >= 0; a--) {
                Map<String, Integer> v = maps.get(list.get(a));
                for (int j = 0; j < v.get("er") - v.get("sr") + 1; j++) {
                    if (v.get("ec") > v.get("sc")) {
                        try {
                            mergeCellsHorizontally(xwpfTables.get(i), v.get("sr") + j, v.get("sc"), v.get("ec"));
                        } catch (Exception e) {
                        }
                    }
                }
                if (v.get("er") > v.get("sr")) {
                    try {
                        mergeCellsVertically(xwpfTables.get(i), v.get("sc"), v.get("sr"), v.get("er"));
                    } catch (Exception e) {
                    }
                }
            }
        }
        //处理中英文换行的问题
        List<XWPFTable> xwpfTables1 = document.getTables();
        for (int i = 0; i < xwpfTables1.size(); i++) {
            for (int j = 0; j < xwpfTables1.get(i).getRows().size(); j++) {
                for (int k = 0; k < xwpfTables1.get(i).getRows().get(j).getTableCells().size(); k++) {
                    if (xwpfTables1.get(i).getRows().get(j).getTableCells().get(k).getText().contains("@")) {
                        String text = xwpfTables1.get(i).getRows().get(j).getTableCells().get(k).getText();
                        String[] split = text.split("@");
                        xwpfTables1.get(i).getRows().get(j).getTableCells().get(k).removeParagraph(0);
                        XWPFParagraph xwpfParagraph = xwpfTables1.get(i).getRows().get(j).getTableCells().get(k).addParagraph();
                        XWPFRun run = xwpfParagraph.createRun();
                        run.setText(split[0]);
                        if (ObjectUtils.isNotNull(split[1])) {
                            run.addBreak();
                            run.setText(split[1]);
                        }
                        xwpfParagraph.setAlignment(ParagraphAlignment.CENTER);
                    }
                }
            }
        }
    }
    // æ°´å¹³åˆå¹¶å•元格
    private static void mergeCellsHorizontally(XWPFTable table, int row, int fromCol, int toCol) {
        for (int i = fromCol; i <= toCol; i++) {
            if (i == fromCol) {
                table.getRow(row).getCell(i).getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.RESTART);
            } else {
                table.getRow(row).getCell(i).getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.CONTINUE);
            }
        }
    }
    // åž‚直合并单元格
    private static void mergeCellsVertically(XWPFTable table, int col, int fromRow, int toRow) {
        for (int i = fromRow; i <= toRow; i++) {
            if (i == fromRow) {
                table.getRow(i).getCell(col).getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.RESTART);
            } else {
                table.getRow(i).getCell(col).getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.CONTINUE);
            }
        }
    }
}
ruoyi-admin/src/main/resources/application.yml
@@ -78,7 +78,7 @@
    # æ•°æ®åº“索引
    database: 0
    # å¯†ç 
    password: 123456
#    password: 123456
    # è¿žæŽ¥è¶…æ—¶æ—¶é—´
    timeout: 10s
    lettuce:
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/TreeSelect.java
@@ -51,7 +51,7 @@
    {
        this.id = menu.getMenuId();
        this.label = menu.getMenuName();
        this.isRersonalButton = menu.geIsRersonalButton();
        this.isRersonalButton = menu.getIsRersonalButton();
        this.children = menu.getChildren().stream().map(TreeSelect::new).collect(Collectors.toList());
    }
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysMenu.java
@@ -239,7 +239,7 @@
        this.icon = icon;
    }
    public Integer geIsRersonalButton()
    public Integer getIsRersonalButton()
    {
        return isRersonalButton;
    }
@@ -282,7 +282,7 @@
            .append("updateBy", getUpdateBy())
            .append("updateTime", getUpdateTime())
            .append("remark", getRemark())
            .append("isRersonalButton", geIsRersonalButton())
            .append("isRersonalButton", getIsRersonalButton())
            .toString();
    }
}