From c641fc8d3786ec477510c842e89af162b3068b0d Mon Sep 17 00:00:00 2001 From: renfan <2206580733@qq.com> Date: Tue, 13 Aug 2024 21:14:07 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=90admin=E3=80=91=E6=96=B0=E5=A2=9E#?= =?UTF-8?q?=E8=AE=BE=E5=A4=87=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- admin/pom.xml | 11 +- .../controller/QrCode/QrCodeController.java | 54 +++++ .../equipment/EquipmentController.java | 124 ++++++++++ .../admin/service/QRCode/QRCodeService.java | 28 +++ .../service/equipment/IEquipmentService.java | 65 ++++++ .../equipment/impl/EquipmentServiceImpl.java | 213 ++++++++++++++++++ .../validate/equipment/EquipmentParam.java | 81 +++++++ .../admin/vo/equipment/EquipmentDetailVo.java | 34 +++ .../admin/vo/equipment/EquipmentListVo.java | 35 +++ common/pom.xml | 19 ++ .../com/hcy/common/config/QRCodeConfig.java | 28 +++ .../common/entity/equipment/Equipment.java | 41 ++++ .../enums/equipment/EquipmentStateEnum.java | 56 +++++ .../mapper/equipment/EquipmentMapper.java | 13 ++ .../java/com/hcy/common/utils/CodeUtil.java | 119 ++++++++++ .../java/com/hcy/common/utils/QRCodeUtil.java | 116 ++++++++++ 16 files changed, 1036 insertions(+), 1 deletion(-) create mode 100644 admin/src/main/java/com/hcy/admin/controller/QrCode/QrCodeController.java create mode 100644 admin/src/main/java/com/hcy/admin/controller/equipment/EquipmentController.java create mode 100644 admin/src/main/java/com/hcy/admin/service/QRCode/QRCodeService.java create mode 100644 admin/src/main/java/com/hcy/admin/service/equipment/IEquipmentService.java create mode 100644 admin/src/main/java/com/hcy/admin/service/equipment/impl/EquipmentServiceImpl.java create mode 100644 admin/src/main/java/com/hcy/admin/validate/equipment/EquipmentParam.java create mode 100644 admin/src/main/java/com/hcy/admin/vo/equipment/EquipmentDetailVo.java create mode 100644 admin/src/main/java/com/hcy/admin/vo/equipment/EquipmentListVo.java create mode 100644 common/src/main/java/com/hcy/common/config/QRCodeConfig.java create mode 100644 common/src/main/java/com/hcy/common/entity/equipment/Equipment.java create mode 100644 common/src/main/java/com/hcy/common/enums/equipment/EquipmentStateEnum.java create mode 100644 common/src/main/java/com/hcy/common/mapper/equipment/EquipmentMapper.java create mode 100644 common/src/main/java/com/hcy/common/utils/CodeUtil.java create mode 100644 common/src/main/java/com/hcy/common/utils/QRCodeUtil.java diff --git a/admin/pom.xml b/admin/pom.xml index 76dbe7e..b958acf 100644 --- a/admin/pom.xml +++ b/admin/pom.xml @@ -3,7 +3,7 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> - + charging_pile org.hcy @@ -44,6 +44,15 @@ 2.0.12 compile + + org.hcy + common + + + org.apache.tomcat.embed + tomcat-embed-core + 9.0.83 + diff --git a/admin/src/main/java/com/hcy/admin/controller/QrCode/QrCodeController.java b/admin/src/main/java/com/hcy/admin/controller/QrCode/QrCodeController.java new file mode 100644 index 0000000..dd1744b --- /dev/null +++ b/admin/src/main/java/com/hcy/admin/controller/QrCode/QrCodeController.java @@ -0,0 +1,54 @@ +package com.hcy.admin.controller.QrCode; + +import com.hcy.admin.service.QRCode.QRCodeService; +import com.hcy.common.utils.QRCodeUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.http.HttpServletResponse; +import java.io.File; + +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.Date; + +@RestController +@RequestMapping("qr/code") +public class QrCodeController{ + + @Autowired + private QRCodeService qrCodeService; + + private static final String RootPath="E:\\shFiles\\QRCode"; + private static final String FileFormat=".png"; + private static final ThreadLocal LOCALDATEFORMAT=ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyyMMddHHmmss")); + //生成二维码并将其存放于本地目录 + @PostMapping("generate/v1") + public void generateV1(String content){ + System.out.println(content); + final String fileName=LOCALDATEFORMAT.get().format(new Date()); + QRCodeUtil.createQRCodeToFile(content,new File(RootPath),fileName+FileFormat); + } + //生成二维码并将其返回给前端调用者 + @PostMapping("generate/v2") + public void generateV2(String content, HttpServletResponse servletResponse) throws IOException { + /*QRCodeUtil.createQRCodeToOutputStream(content,servletResponse.getOutputStream());*/ + } + + @PostMapping("/toFile") + public void toFile(String content) { + qrCodeService.generateFile(content, new File("./test.png")); + } + + @PostMapping("/toStream") + public void toStream(String content, HttpServletResponse response) { + try { + qrCodeService.generateStream(content, response.getOutputStream()); + } catch (IOException e) { + e.printStackTrace(); + } + } +} diff --git a/admin/src/main/java/com/hcy/admin/controller/equipment/EquipmentController.java b/admin/src/main/java/com/hcy/admin/controller/equipment/EquipmentController.java new file mode 100644 index 0000000..5306a4f --- /dev/null +++ b/admin/src/main/java/com/hcy/admin/controller/equipment/EquipmentController.java @@ -0,0 +1,124 @@ +package com.hcy.admin.controller.equipment; + +import com.hcy.admin.config.aop.Log; +import com.hcy.admin.service.equipment.IEquipmentService; +import com.hcy.admin.validate.commonFault.CommonFaultParam; +import com.hcy.admin.validate.equipment.EquipmentParam; +import com.hcy.admin.validate.common.PageParam; +import com.hcy.admin.vo.equipment.EquipmentListVo; +import com.hcy.admin.vo.equipment.EquipmentDetailVo; +import com.hcy.common.core.AjaxResult; +import com.hcy.common.core.PageResult; +import com.hcy.common.utils.QRCodeUtil; +import com.hcy.common.validator.annotation.IDMust; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.Map; + +/** + * 设备管理管理 + */ +@RestController +@RequestMapping("api/equipment") +public class EquipmentController { + + @Resource + IEquipmentService iEquipmentService; + + /** + * 设备管理列表 + * + * @author hcy + * @param pageParam 分页参数 + * @param params 搜索参数 + * @return Object + */ + @GetMapping("/list") + public Object list(@Validated PageParam pageParam, + @RequestParam Map params) { + PageResult list = iEquipmentService.list(pageParam, params); + return AjaxResult.success(list); + } + /** + * 设备管理详情 + * + * @author hcy + * @param id 主键ID + * @return Object + */ + @GetMapping("/detail") + public Object detail(@Validated @IDMust() @RequestParam("id") Integer id) { + EquipmentDetailVo detail = iEquipmentService.detail(id); + return AjaxResult.success(detail); + } + + /** + * 设备管理新增 + * + * @author hcy + * @param equipmentParam 参数 + * @return Object + */ + @Log(title = "设备管理新增") + @PostMapping("/add") + public Object add(@Validated(value = EquipmentParam.create.class) @RequestBody EquipmentParam equipmentParam) { + iEquipmentService.add(equipmentParam); + return AjaxResult.success(); + } + + /** + * 设备管理编辑 + * + * @author hcy + * @param equipmentParam 参数 + * @return Object + */ + @Log(title = "设备管理编辑") + @PostMapping("/edit") + public Object edit(@Validated(value = EquipmentParam.update.class) @RequestBody EquipmentParam equipmentParam) { + iEquipmentService.edit(equipmentParam); + return AjaxResult.success(); + } + + /** + * 设备管理删除 + * + * @author hcy + * @param equipmentParam 参数 + * @return Object + */ + @Log(title = "设备管理删除") + @PostMapping("/del") + public Object del(@Validated(value = EquipmentParam.delete.class) @RequestBody EquipmentParam equipmentParam) { + iEquipmentService.del(Math.toIntExact(equipmentParam.getId())); + return AjaxResult.success(); + } + + /** + * 设备停用 + * + * @author hcy + * @param equipmentParam 参数 + * @return Object + */ + @Log(title = "常见故障管理改变状态") + @PostMapping("/stateEdit") + public Object stateEdit(@RequestBody EquipmentParam equipmentParam) { + iEquipmentService.stateEdit(equipmentParam.getIds()); + return AjaxResult.success(); + } + + /** + * 生成设备编号二维码并将其返回给前端调用者 + * @param number + * @throws IOException + */ + @PostMapping("generate/v2") + public String generateV2(String number) { + return QRCodeUtil.createQRCodeToOutputStream(number); + } +} diff --git a/admin/src/main/java/com/hcy/admin/service/QRCode/QRCodeService.java b/admin/src/main/java/com/hcy/admin/service/QRCode/QRCodeService.java new file mode 100644 index 0000000..671b2ad --- /dev/null +++ b/admin/src/main/java/com/hcy/admin/service/QRCode/QRCodeService.java @@ -0,0 +1,28 @@ +package com.hcy.admin.service.QRCode; + +import cn.hutool.extra.qrcode.QrCodeUtil; +import cn.hutool.extra.qrcode.QrConfig; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.io.File; +import java.io.OutputStream; + +@Service +public class QRCodeService { + + @Resource + private QrConfig qrConfig; + + public void generateFile(String content, File file) { + //生成到本地文件 + QrCodeUtil.generate(content, qrConfig, file); + } + + public void generateStream(String content, OutputStream outputStream) { + //输出到流 + QrCodeUtil.generate(content, qrConfig, "png", outputStream); + } + +} + diff --git a/admin/src/main/java/com/hcy/admin/service/equipment/IEquipmentService.java b/admin/src/main/java/com/hcy/admin/service/equipment/IEquipmentService.java new file mode 100644 index 0000000..52bbaed --- /dev/null +++ b/admin/src/main/java/com/hcy/admin/service/equipment/IEquipmentService.java @@ -0,0 +1,65 @@ +package com.hcy.admin.service.equipment; + +import com.hcy.admin.validate.common.PageParam; +import com.hcy.admin.validate.equipment.EquipmentParam; +import com.hcy.admin.vo.equipment.EquipmentListVo; +import com.hcy.admin.vo.equipment.EquipmentDetailVo; +import com.hcy.common.core.PageResult; + +import java.util.List; +import java.util.Map; + +/** + * 设备管理服务接口类 + */ +public interface IEquipmentService { + + /** + * 设备管理列表 + * + * @author hcy + * @param pageParam 分页参数 + * @param params 搜索参数 + * @return PageResult + */ + PageResult list(PageParam pageParam, Map params); + + /** + * 设备管理详情 + * + * @author hcy + * @param id 主键ID + * @return Equipment + */ + EquipmentDetailVo detail(Integer id); + + /** + * 设备管理新增 + * + * @author hcy + * @param equipmentParam 参数 + */ + void add(EquipmentParam equipmentParam); + + /** + * 设备管理编辑 + * + * @author hcy + * @param equipmentParam 参数 + */ + void edit(EquipmentParam equipmentParam); + + /** + * 设备管理删除 + * + * @author hcy + * @param id 主键ID + */ + void del(Integer id); + + /** + * 设备停用 + * @param ids + */ + void stateEdit(List ids); +} diff --git a/admin/src/main/java/com/hcy/admin/service/equipment/impl/EquipmentServiceImpl.java b/admin/src/main/java/com/hcy/admin/service/equipment/impl/EquipmentServiceImpl.java new file mode 100644 index 0000000..d5c2c9f --- /dev/null +++ b/admin/src/main/java/com/hcy/admin/service/equipment/impl/EquipmentServiceImpl.java @@ -0,0 +1,213 @@ +package com.hcy.admin.service.equipment.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.github.yulichang.query.MPJQueryWrapper; +import com.hcy.admin.service.equipment.IEquipmentService; +import com.hcy.admin.validate.common.PageParam; +import com.hcy.admin.validate.equipment.EquipmentParam; +import com.hcy.admin.vo.equipment.EquipmentListVo; +import com.hcy.admin.vo.equipment.EquipmentDetailVo; +import com.hcy.common.constant.GlobalConstant; +import com.hcy.common.core.PageResult; +import com.hcy.common.entity.commonFault.CommonFault; +import com.hcy.common.entity.equipment.Equipment; +import com.hcy.common.entity.sparePart.SparePart; +import com.hcy.common.enums.commonFault.CommonFaultEnum; +import com.hcy.common.enums.equipment.EquipmentStateEnum; +import com.hcy.common.mapper.equipment.EquipmentMapper; +import com.hcy.common.utils.ArrayUtil; +import com.hcy.common.utils.TimeUtil; +import com.hcy.common.utils.UrlUtil; +import com.hcy.common.config.GlobalConfig; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; +import org.springframework.util.Assert; + +import javax.annotation.Resource; +import java.util.*; + +/** + * 设备管理实现类 + */ +@Service +public class EquipmentServiceImpl implements IEquipmentService { + + @Resource + EquipmentMapper equipmentMapper; + + /** + * 设备管理列表 + * + * @author hcy + * @param pageParam 分页参数 + * @param params 搜索参数 + * @return PageResult + */ + @Override + public PageResult list(PageParam pageParam, Map params) { + Integer page = pageParam.getPageNo(); + Integer limit = pageParam.getPageSize(); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("is_delete", 0); + queryWrapper.orderByDesc("id"); + + equipmentMapper.setSearch(queryWrapper, params, new String[]{ + "like:number:str", + "like:name:str", + "=:deviceStatus@device_status:int", + "datetime:createTimeStart-createTimeEnd@create_time:str", + }); + + IPage iPage = equipmentMapper.selectPage(new Page<>(page, limit), queryWrapper); + + List list = new LinkedList<>(); + for(Equipment item : iPage.getRecords()) { + EquipmentListVo vo = new EquipmentListVo(); + BeanUtils.copyProperties(item, vo); + vo.setCreateTime(TimeUtil.timestampToDate(item.getCreateTime())); + list.add(vo); + } + + return PageResult.iPageHandle(iPage.getTotal(), iPage.getCurrent(), iPage.getSize(), list); + } + + /** + * 设备管理详情 + * + * @author hcy + * @param id 主键参数 + * @return Equipment + */ + @Override + public EquipmentDetailVo detail(Integer id) { + Equipment model = equipmentMapper.selectOne( + new QueryWrapper() + .eq("id", id) + .eq("is_delete", 0) + .last("limit 1")); + + Assert.notNull(model, "数据不存在"); + + EquipmentDetailVo vo = new EquipmentDetailVo(); + BeanUtils.copyProperties(model, vo); + return vo; + } + + /** + * 设备管理新增 + * + * @author hcy + * @param equipmentParam 参数 + */ + @Override + public void add(EquipmentParam equipmentParam) { + Equipment model = new Equipment(); + + model.setNumber(equipmentParam.getNumber()); + model.setName(equipmentParam.getName()); + model.setModel(equipmentParam.getModel()); // 设备型号 + model.setManufacturers(equipmentParam.getManufacturers()); // 设备厂家 + model.setSpecification(equipmentParam.getSpecification()); // 设备规格 + model.setDeviceStatus(EquipmentStateEnum.NORMAL.getStatus()); // 设备状态(0=停用,1=正常,2=保修中,3=检修中) + model.setLongitude(equipmentParam.getLongitude()); // 经度 + model.setLatitude(equipmentParam.getLatitude()); // 纬度 + model.setProvinceId(equipmentParam.getProvinceId()); // 省id + model.setDistrictId(equipmentParam.getDistrictId()); // 区id + model.setCityId(equipmentParam.getCityId()); // 市id + model.setDetailedAddress(equipmentParam.getDetailedAddress()); // 详细地址 + model.setInspectionCycle(equipmentParam.getInspectionCycle()); // 巡检周期方式(0=天数间隔,1=固定日期) + model.setDailyAudit(equipmentParam.getDailyAudit()); // 每隔几天巡检 + model.setCreateTime(System.currentTimeMillis() / 1000); + //model.setDeviceCode(equipmentParam.getDeviceCode()); // 设备码 + equipmentMapper.insert(model); + } + + /** + * 设备管理编辑 + * + * @author hcy + * @param equipmentParam 参数 + */ + @Override + public void edit(EquipmentParam equipmentParam) { + Equipment model = equipmentMapper.selectOne( + new QueryWrapper() + .eq("id", equipmentParam.getId()) + .eq("is_delete", 0) + .last("limit 1")); + + Assert.notNull(model, "数据不存在!"); + + model.setId(equipmentParam.getId()); + model.setUserId(equipmentParam.getUserId()); + model.setModuleId(equipmentParam.getModuleId()); + model.setNumber(equipmentParam.getNumber()); + model.setName(equipmentParam.getName()); + model.setModel(equipmentParam.getModel()); + model.setManufacturers(equipmentParam.getManufacturers()); + model.setSpecification(equipmentParam.getSpecification()); + model.setDeviceStatus(equipmentParam.getDeviceStatus()); + model.setLongitude(equipmentParam.getLongitude()); + model.setLatitude(equipmentParam.getLatitude()); + model.setProvinceId(equipmentParam.getProvinceId()); + model.setDistrictId(equipmentParam.getDistrictId()); + model.setCityId(equipmentParam.getCityId()); + model.setDetailedAddress(equipmentParam.getDetailedAddress()); + model.setInspectionCycle(equipmentParam.getInspectionCycle()); + model.setDailyAudit(equipmentParam.getDailyAudit()); + model.setDeviceCode(equipmentParam.getDeviceCode()); + model.setUpdateTime(System.currentTimeMillis() / 1000); + equipmentMapper.updateById(model); + } + + /** + * 设备管理删除 + * + * @author hcy + * @param id 主键ID + */ + @Override + public void del(Integer id) { + Equipment model = equipmentMapper.selectOne( + new QueryWrapper() + .eq("id", id) + .eq("is_delete", 0) + .last("limit 1")); + + Assert.notNull(model, "数据不存在!"); + + model.setIsDelete(1); + model.setDeleteTime(System.currentTimeMillis() / 1000); + equipmentMapper.updateById(model); + } + + /** + * 设备停用 + * + * @param ids + */ + @Override + public void stateEdit(List ids) { + List modelList = equipmentMapper.selectList( + new QueryWrapper() + .in("id", ids)); + + Assert.notNull(modelList, "数据不存在!"); + + for (Equipment equipment : modelList) { + // 设备状态(0=停用,1=正常,2=保修中,3=检修中) + if(equipment.getDeviceStatus() == EquipmentStateEnum.STOPWORD.getStatus()){ + equipment.setDeviceStatus(EquipmentStateEnum.NORMAL.getStatus()); + }else{ + equipment.setDeviceStatus(EquipmentStateEnum.STOPWORD.getStatus()); + } + equipment.setUpdateTime(System.currentTimeMillis() / 1000); + equipmentMapper.updateById(equipment); + } + + } + +} diff --git a/admin/src/main/java/com/hcy/admin/validate/equipment/EquipmentParam.java b/admin/src/main/java/com/hcy/admin/validate/equipment/EquipmentParam.java new file mode 100644 index 0000000..9ad6840 --- /dev/null +++ b/admin/src/main/java/com/hcy/admin/validate/equipment/EquipmentParam.java @@ -0,0 +1,81 @@ +package com.hcy.admin.validate.equipment; + +import com.hcy.common.entity.equipment.Equipment; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import org.hibernate.validator.constraints.Length; + +import lombok.Data; +import javax.validation.constraints.*; +import java.io.Serializable; +import java.util.List; + +/** + * 设备管理参数 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +public class EquipmentParam implements Serializable { + + private static final long serialVersionUID = 1L; + + public interface create{} + public interface update{} + public interface delete{} + + private Long id; + + @DecimalMin(value = "0", message = "userId参数值不能少于0", groups = {create.class, update.class}) + private Long userId; + + @DecimalMin(value = "0", message = "moduleId参数值不能少于0", groups = {create.class, update.class}) + private Long moduleId; + + @Length(max = 255, message = "number参数不能超出255个字符", groups = {create.class, update.class}) + private String number; + + @Length(max = 255, message = "name参数不能超出255个字符", groups = {create.class, update.class}) + private String name; + + @Length(max = 255, message = "model参数不能超出255个字符", groups = {create.class, update.class}) + private String model; + + @Length(max = 255, message = "manufacturers参数不能超出255个字符", groups = {create.class, update.class}) + private String manufacturers; + + @Length(max = 255, message = "specification参数不能超出255个字符", groups = {create.class, update.class}) + private String specification; + + @DecimalMin(value = "0", message = "deviceStatus参数值不能少于0", groups = {create.class, update.class}) + private Integer deviceStatus; + + @Length(max = 24, message = "longitude参数不能超出24个字符", groups = {create.class, update.class}) + private String longitude; + + @Length(max = 24, message = "latitude参数不能超出24个字符", groups = {create.class, update.class}) + private String latitude; + + @DecimalMin(value = "0", message = "provinceId参数值不能少于0", groups = {create.class, update.class}) + private Long provinceId; + + @DecimalMin(value = "0", message = "districtId参数值不能少于0", groups = {create.class, update.class}) + private Long districtId; + + @DecimalMin(value = "0", message = "cityId参数值不能少于0", groups = {create.class, update.class}) + private Long cityId; + + @Length(max = 255, message = "detailedAddress参数不能超出255个字符", groups = {create.class, update.class}) + private String detailedAddress; + + @DecimalMin(value = "0", message = "inspectionCycle参数值不能少于0", groups = {create.class, update.class}) + private Integer inspectionCycle; + + @DecimalMin(value = "0", message = "dailyAudit参数值不能少于0", groups = {create.class, update.class}) + private Integer dailyAudit; + + @Length(max = 255, message = "deviceCode参数不能超出255个字符", groups = {create.class, update.class}) + private String deviceCode; + + private List ids; //批量停用 +} diff --git a/admin/src/main/java/com/hcy/admin/vo/equipment/EquipmentDetailVo.java b/admin/src/main/java/com/hcy/admin/vo/equipment/EquipmentDetailVo.java new file mode 100644 index 0000000..bc63d35 --- /dev/null +++ b/admin/src/main/java/com/hcy/admin/vo/equipment/EquipmentDetailVo.java @@ -0,0 +1,34 @@ +package com.hcy.admin.vo.equipment; + +import lombok.Data; + +import java.io.Serializable; + +/** + * EquipmentVo + */ +@Data +public class EquipmentDetailVo implements Serializable { + + private static final long serialVersionUID = 1L; + + private Long id; // 主键id + private Long userId; // 用户id + private Long moduleId; // 模块id + private String number; // 设备编号 + private String name; // 设备名称 + private String model; // 设备型号 + private String manufacturers; // 设备厂家 + private String specification; // 设备规格 + private Integer deviceStatus; // 设备状态(0=停用,1=正常,2=保修中,3=检修中) + private String longitude; // 经度 + private String latitude; // 纬度 + private Long provinceId; // 省id + private Long districtId; // 区id + private Long cityId; // 市id + private String detailedAddress; // 详细地址 + private Integer inspectionCycle; // 巡检周期方式(0=天数间隔,1=固定日期) + private Integer dailyAudit; // 每隔几天巡检 + private String deviceCode; // 设备码 + +} diff --git a/admin/src/main/java/com/hcy/admin/vo/equipment/EquipmentListVo.java b/admin/src/main/java/com/hcy/admin/vo/equipment/EquipmentListVo.java new file mode 100644 index 0000000..92a623e --- /dev/null +++ b/admin/src/main/java/com/hcy/admin/vo/equipment/EquipmentListVo.java @@ -0,0 +1,35 @@ +package com.hcy.admin.vo.equipment; + +import lombok.Data; + +import java.io.Serializable; + +/** + * EquipmentVo + */ +@Data +public class EquipmentListVo implements Serializable { + + private static final long serialVersionUID = 1L; + + private Long id; // 主键id + private Long userId; // 用户id + private Long moduleId; // 模块id + private String number; // 设备编号 + private String name; // 设备名称 + private String model; // 设备型号 + private String manufacturers; // 设备厂家 + private String specification; // 设备规格 + private Integer deviceStatus; // 设备状态(0=停用,1=正常,2=保修中,3=检修中) + private String longitude; // 经度 + private String latitude; // 纬度 + private Long provinceId; // 省id + private Long districtId; // 区id + private Long cityId; // 市id + private String detailedAddress; // 详细地址 + private Integer inspectionCycle; // 巡检周期方式(0=天数间隔,1=固定日期) + private Integer dailyAudit; // 每隔几天巡检 + private String deviceCode; // 设备码 + private String createTime; // 创建时间 + +} diff --git a/common/pom.xml b/common/pom.xml index 9086418..b9539d1 100644 --- a/common/pom.xml +++ b/common/pom.xml @@ -245,6 +245,25 @@ 5.8.16 + + + com.google.zxing + core + 3.3.3 + + + com.google.zxing + javase + 3.3.3 + + + + + cn.hutool + hutool-all + 5.2.5 + + \ No newline at end of file diff --git a/common/src/main/java/com/hcy/common/config/QRCodeConfig.java b/common/src/main/java/com/hcy/common/config/QRCodeConfig.java new file mode 100644 index 0000000..41f0774 --- /dev/null +++ b/common/src/main/java/com/hcy/common/config/QRCodeConfig.java @@ -0,0 +1,28 @@ +package com.hcy.common.config; +import org.springframework.context.annotation.Configuration; +import cn.hutool.extra.qrcode.QrConfig; +import org.springframework.context.annotation.Bean; +import java.awt.*; + +import java.io.File; +import java.nio.charset.Charset; +@Configuration +public class QRCodeConfig { + + @Bean + public QrConfig qrConfig() { + QrConfig qrConfig = new QrConfig(); + qrConfig.setBackColor(Color.white); + qrConfig.setForeColor(Color.black); + qrConfig.setCharset(Charset.forName("UTF-8")); + qrConfig.setMargin(1); + qrConfig.setWidth(400); + qrConfig.setHeight(400); + //logo图片 + //qrConfig.setImg(new File("./logo.jpeg")); + //logo缩放比例 + qrConfig.setRatio(6); + return qrConfig; + } +} + diff --git a/common/src/main/java/com/hcy/common/entity/equipment/Equipment.java b/common/src/main/java/com/hcy/common/entity/equipment/Equipment.java new file mode 100644 index 0000000..e1659dd --- /dev/null +++ b/common/src/main/java/com/hcy/common/entity/equipment/Equipment.java @@ -0,0 +1,41 @@ +package com.hcy.common.entity.equipment; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import lombok.Data; + +import java.io.Serializable; + +/** + * 设备管理实体 + */ +@Data +public class Equipment implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value="id", type= IdType.AUTO) + private Long id; // 主键id + private Long userId; // 用户id + private Long moduleId; // 模块id + private String number; // 设备编号 + private String name; // 设备名称 + private String model; // 设备型号 + private String manufacturers; // 设备厂家 + private String specification; // 设备规格 + private Integer deviceStatus; // 设备状态(0=停用,1=正常,2=保修中,3=检修中) + private String longitude; // 经度 + private String latitude; // 纬度 + private Long provinceId; // 省id + private Long districtId; // 区id + private Long cityId; // 市id + private String detailedAddress; // 详细地址 + private Integer inspectionCycle; // 巡检周期方式(0=天数间隔,1=固定日期) + private Integer dailyAudit; // 每隔几天巡检 + private String deviceCode; // 设备码 + private Integer isDelete; // 是否删除: [0=否, 1=是] + private Long createTime; // 创建时间 + private Long updateTime; // 更新时间 + private Long deleteTime; // 删除时间 + +} \ No newline at end of file diff --git a/common/src/main/java/com/hcy/common/enums/equipment/EquipmentStateEnum.java b/common/src/main/java/com/hcy/common/enums/equipment/EquipmentStateEnum.java new file mode 100644 index 0000000..189cbf1 --- /dev/null +++ b/common/src/main/java/com/hcy/common/enums/equipment/EquipmentStateEnum.java @@ -0,0 +1,56 @@ +package com.hcy.common.enums.equipment; + +import com.google.common.collect.Maps; + +import java.util.Map; + +/** + * 审核状态 + * @author dabin + */ + +public enum EquipmentStateEnum { + // 设备状态(0=停用,1=正常,2=保修中,3=检修中) + STOPWORD(0,"停用"), + NORMAL(1, "正常"), + UNDERWARRANTY(2,"保修中"), + UNDEROVERHAUL(3, "检修中"), + // 巡检周期方式(0=天数间隔,1=固定日期) + DAYINTERVAL(0,"天数间隔"), + FIXEDDATE(1, "固定日期"); + private final int status; + private final String desc; + + EquipmentStateEnum(int status, String desc) { + this.status = status; + this.desc = desc; + } + + /** + * 获取状态码 + * + * @return int + * @author dabin + */ + public int getStatus() { + return this.status; + } + + /** + * 获取提示 + * + * @return String + * @author dabin + */ + public String getDesc() { + return this.desc; + } + + public static Map getMap() { + Map map = Maps.newHashMap(); + for (EquipmentStateEnum auditStateEnum : EquipmentStateEnum.values()) { + map.put(auditStateEnum.status, auditStateEnum.desc); + } + return map; + } +} diff --git a/common/src/main/java/com/hcy/common/mapper/equipment/EquipmentMapper.java b/common/src/main/java/com/hcy/common/mapper/equipment/EquipmentMapper.java new file mode 100644 index 0000000..2126e7c --- /dev/null +++ b/common/src/main/java/com/hcy/common/mapper/equipment/EquipmentMapper.java @@ -0,0 +1,13 @@ +package com.hcy.common.mapper.equipment; + + +import com.hcy.common.core.basics.IBaseMapper; +import com.hcy.common.entity.equipment.Equipment; +import org.apache.ibatis.annotations.Mapper; + +/** + * 设备管理Mapper + */ +@Mapper +public interface EquipmentMapper extends IBaseMapper { +} diff --git a/common/src/main/java/com/hcy/common/utils/CodeUtil.java b/common/src/main/java/com/hcy/common/utils/CodeUtil.java new file mode 100644 index 0000000..bc5d4f6 --- /dev/null +++ b/common/src/main/java/com/hcy/common/utils/CodeUtil.java @@ -0,0 +1,119 @@ +package com.hcy.common.utils; +import com.google.zxing.BarcodeFormat; +import com.google.zxing.EncodeHintType; +import com.google.zxing.MultiFormatWriter; +import com.google.zxing.WriterException; +import com.google.zxing.common.BitMatrix; +import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; +import org.springframework.util.ObjectUtils; + +import javax.imageio.ImageIO; +import javax.swing.filechooser.FileSystemView; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.OutputStream; +import java.util.HashMap; +import java.util.Map; + +/** + * 二维码工具类 + * 1)、通用生成方法 + * 此种方式可以生成ZXing库支持的各种类型二维码,且可以自定义二维码颜色 + */ +public class CodeUtil { + + //二维码类型,枚举类 + private static final BarcodeFormat CODE_TYPE = BarcodeFormat.QR_CODE; + //二维码宽度,单位像素 + private static final int CODE_WIDTH = 400; + //二维码高度,单位像素 + private static final int CODE_HEIGHT = 400; + //二维码前景色,0x000000表示黑色 + private static final int FRONT_COLOR = 0x000000; + //二维码背景色,0xFFFFFF表示白色 + private static final int BACKGROUND_COLOR = 0xFFFFFF; + + /** + * 生成二维码并保存为文件 + * @param content 二维码内容 + * @param codeImgFileSaveDir 生成的二维码图片存储位置 + * @param fileName 二维码图片文件名 + */ + public static void createCodeToFile(String content, File codeImgFileSaveDir, String fileName) { + if (ObjectUtils.isEmpty(content) || ObjectUtils.isEmpty(fileName)) { + return; + } + content = content.trim(); + if (codeImgFileSaveDir == null || codeImgFileSaveDir.isFile()) { + //二维码图片存储目录为空,默认放在桌面 + FileSystemView.getFileSystemView().getHomeDirectory(); + } + if (!codeImgFileSaveDir.exists()) { + //二维码图片存储目录不存在,则创建 + codeImgFileSaveDir.mkdirs(); + } + //生成二维码 + try { + BufferedImage bufferedImage = getBufferedImage(content); + File codeImgFile = new File(codeImgFileSaveDir, fileName); + ImageIO.write(bufferedImage, "png", codeImgFile); + } catch (Exception e) { + e.printStackTrace(); + } + } + + /** + * 生成二维码并输出到输出流,通常用于输出到网页上进行显示 + * @param content 二维码内容 + * @param outputStream 输出流 + */ + public static void createCodeToOutputStream(String content, OutputStream outputStream) { + if (ObjectUtils.isEmpty(content)) { + return; + } + content = content.trim(); + //生成二维码 + try { + BufferedImage bufferedImage = getBufferedImage(content); + ImageIO.write(bufferedImage, "png", outputStream); + } catch (Exception e) { + e.printStackTrace(); + } + } + + + /** + * 核心代码,生成二维码 + * @param content + * @return BufferedImage + * @throws WriterException + */ + private static BufferedImage getBufferedImage(String content) throws WriterException { + //com.google.zxing.EncodeHintType:编码提示类,枚举类型 + Map hints = new HashMap<>(); + //EncodeHintType.CHARACTER_SET:设置字符编码类型 + hints.put(EncodeHintType.CHARACTER_SET, "UTF-8"); + //EncodeHintType.ERROR_CORRECTION:设置纠错级别 + //ErrorCorrectionLevel:纠错级别,【L:%7】【M:15%】【Q:25%】[H:30%] + //默认为L级别,纠错级别不同,生成的图案不同,但扫描结果一致 + hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M); + //EncodeHintType.MARGIN:设置二维码边距,单位像素 + hints.put(EncodeHintType.MARGIN, 1); + + //创建工厂类 + MultiFormatWriter multiFormatWriter = new MultiFormatWriter(); + //指定二维码类型和参数,返回对应的Writter进行编码后的二维码对象 + BitMatrix bitMatrix = multiFormatWriter.encode(content, CODE_TYPE, CODE_WIDTH, CODE_HEIGHT, hints); + //创建图像缓冲区 + BufferedImage bufferedImage = new BufferedImage(CODE_WIDTH, CODE_HEIGHT, BufferedImage.TYPE_INT_BGR); + //填充 + for (int x = 0; x < CODE_WIDTH; x++) { + for (int y = 0; y < CODE_HEIGHT; y++) { + //bitMatrix.get(x, y)返回true,表示黑色即前景色 + bufferedImage.setRGB(x, y, bitMatrix.get(x, y) ? FRONT_COLOR : BACKGROUND_COLOR); + } + } + return bufferedImage; + } + +} diff --git a/common/src/main/java/com/hcy/common/utils/QRCodeUtil.java b/common/src/main/java/com/hcy/common/utils/QRCodeUtil.java new file mode 100644 index 0000000..b91ea0d --- /dev/null +++ b/common/src/main/java/com/hcy/common/utils/QRCodeUtil.java @@ -0,0 +1,116 @@ +package com.hcy.common.utils; +import com.google.zxing.BarcodeFormat; +import com.google.zxing.EncodeHintType; +import com.google.zxing.client.j2se.MatrixToImageWriter; +import com.google.zxing.common.BitMatrix; +import com.google.zxing.qrcode.QRCodeWriter; +import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; +import org.springframework.util.ObjectUtils; + +import javax.swing.filechooser.FileSystemView; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.OutputStream; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.Base64; +import java.util.HashMap; +import java.util.Map; + + +/** + * QRCode工具类 + * 2)、生成QRCode + */ +public class QRCodeUtil { + + //二维码宽度,单位像素 + private static final int CODE_WIDTH = 400; + //二维码高度,单位像素 + private static final int CODE_HEIGHT = 400; + + + /** + * 生成QRCode并保存为文件 + * @param content 二维码内容 + * @param codeImgFileSaveDir 生成的二维码图片存储位置 + * @param fileName 二维码图片文件名 + */ + public static void createQRCodeToFile(String content, File codeImgFileSaveDir, String fileName) { + if (ObjectUtils.isEmpty(content) || ObjectUtils.isEmpty(fileName)) { + return; + } + content = content.trim(); + if (codeImgFileSaveDir == null || codeImgFileSaveDir.isFile()) { + //二维码图片存储目录为空,默认放在桌面 + FileSystemView.getFileSystemView().getHomeDirectory(); + } + if (!codeImgFileSaveDir.exists()) { + //二维码图片存储目录不存在,则创建 + codeImgFileSaveDir.mkdirs(); + } + //生成QRCode + //配置 + Map hints = new HashMap<>(); + //设置字符编码类型 + hints.put(EncodeHintType.CHARACTER_SET, "UTF-8"); + //设置纠错级别 + hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M); + //设置二维码边距,单位像素 + hints.put(EncodeHintType.MARGIN, 1); + //设置QRCode版本,1-40 + hints.put(EncodeHintType.QR_VERSION, 1); + //直接使用QRCodeWriter + QRCodeWriter qrCodeWriter = new QRCodeWriter(); + try { + //编码为灰度的位矩阵 + BitMatrix bitMatrix = qrCodeWriter.encode(content, BarcodeFormat.QR_CODE, CODE_WIDTH, CODE_HEIGHT, hints); + //获取Path + Path path = Paths.get(codeImgFileSaveDir.getPath(), fileName); + //写入文件 + MatrixToImageWriter.writeToPath(bitMatrix, "PNG", path); + } catch (Exception e) { + e.printStackTrace(); + } + } + + /** + * 生成QRCode并输出到输出流,通常用于输出到网页上进行显示 + * @param content 二维码内容 + * @param outputStream 输出流 + */ + public static String createQRCodeToOutputStream(String content) { + if (ObjectUtils.isEmpty(content)) { + return ""; + } + content = content.trim(); + //生成QRCode + //配置 + Map hints = new HashMap<>(); + //设置字符编码类型 + hints.put(EncodeHintType.CHARACTER_SET, "UTF-8"); + //设置纠错级别 + hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M); + //设置二维码边距,单位像素 + hints.put(EncodeHintType.MARGIN, 1); + //设置QRCode版本,1-40 + hints.put(EncodeHintType.QR_VERSION, 1); + //直接使用QRCodeWriter + QRCodeWriter qrCodeWriter = new QRCodeWriter(); + try { + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + //编码为灰度的位矩阵 + BitMatrix bitMatrix = qrCodeWriter.encode(content, BarcodeFormat.QR_CODE, CODE_WIDTH, CODE_HEIGHT, hints); + //写入输出流 + MatrixToImageWriter.writeToStream(bitMatrix, "PNG", outputStream); + byte[] imageInByte = outputStream.toByteArray(); + + //对图像字节流进行Base64编码 + return "data:image/jpeg;base64," + Base64.getEncoder().encodeToString(imageInByte); + } catch (Exception e) { + e.printStackTrace(); + return ""; + } + } + +}