This commit is contained in:
2026-07-16 11:35:28 +08:00
parent 8452f1f8f4
commit e58ad75d95
30 changed files with 1067 additions and 60 deletions

View File

@@ -19,6 +19,10 @@
<groupId>org.springblade</groupId>
<artifactId>blade-core-boot</artifactId>
</dependency>
<dependency>
<groupId>org.springblade</groupId>
<artifactId>blade-starter-excel</artifactId>
</dependency>
<dependency>
<groupId>org.springblade</groupId>
<artifactId>blade-starter-swagger</artifactId>

View File

@@ -25,19 +25,26 @@
*/
package org.springblade.transport.controller;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.Valid;
import lombok.AllArgsConstructor;
import org.springblade.core.boot.ctrl.BladeController;
import org.springblade.core.excel.util.ExcelUtil;
import org.springblade.core.mp.support.Condition;
import org.springblade.core.mp.support.Query;
import org.springblade.core.secure.annotation.PreAuth;
import org.springblade.core.tool.api.R;
import org.springblade.core.tool.utils.DateUtil;
import org.springblade.core.tool.utils.Func;
import org.springblade.transport.excel.MaintenancePlanExcel;
import org.springblade.transport.excel.MaintenancePlanImporter;
import org.springblade.transport.pojo.entity.MaintenancePlan;
import org.springblade.transport.pojo.vo.MaintenancePlanVO;
import org.springblade.transport.service.IMaintenancePlanService;
@@ -48,6 +55,10 @@ import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import java.util.ArrayList;
import java.util.List;
/**
* 车辆保养计划 控制器
@@ -61,6 +72,10 @@ import org.springframework.web.bind.annotation.RestController;
@Tag(name = "车辆保养计划", description = "车辆保养计划")
public class MaintenancePlanController extends BladeController {
private static final int DEFAULT_CURRENT = 1;
private static final int DEFAULT_SIZE = 10;
private static final int MAX_SIZE = 100;
private final IMaintenancePlanService maintenancePlanService;
/**
@@ -81,7 +96,7 @@ public class MaintenancePlanController extends BladeController {
@ApiOperationSupport(order = 2)
@Operation(summary = "分页", description = "传入maintenancePlan")
public R<IPage<MaintenancePlanVO>> list(MaintenancePlanVO maintenancePlan, Query query) {
IPage<MaintenancePlanVO> pages = maintenancePlanService.selectMaintenancePlanPage(Condition.getPage(query), maintenancePlan);
IPage<MaintenancePlanVO> pages = maintenancePlanService.selectMaintenancePlanPage(Condition.getPage(normalizeQuery(query)), maintenancePlan);
return R.data(pages);
}
@@ -92,10 +107,7 @@ public class MaintenancePlanController extends BladeController {
@ApiOperationSupport(order = 3)
@Operation(summary = "新增或修改", description = "传入maintenancePlan")
public R submit(@Valid @RequestBody MaintenancePlan maintenancePlan) {
if (Func.isEmpty(maintenancePlan.getMileageUnit())) {
maintenancePlan.setMileageUnit("船舶".equals(maintenancePlan.getVehicleType()) ? "海里" : "公里");
}
return R.status(maintenancePlanService.saveOrUpdate(maintenancePlan));
return R.status(maintenancePlanService.submit(maintenancePlan));
}
/**
@@ -108,4 +120,81 @@ public class MaintenancePlanController extends BladeController {
return R.status(maintenancePlanService.deleteLogic(Func.toLongList(ids)));
}
/**
* 导入保养记录
*/
@PostMapping("/import-maintenance-plan")
@ApiOperationSupport(order = 5)
@Operation(summary = "导入保养记录", description = "传入excel")
public R importMaintenancePlan(MultipartFile file) {
MaintenancePlanImporter maintenancePlanImporter = new MaintenancePlanImporter(maintenancePlanService);
ExcelUtil.save(file, maintenancePlanImporter, MaintenancePlanExcel.class);
return R.success("操作成功");
}
/**
* 导出保养记录
*/
@GetMapping("/export-maintenance-plan")
@ApiOperationSupport(order = 6)
@Operation(summary = "导出保养记录")
public void exportMaintenancePlan(MaintenancePlanVO maintenancePlan,
@RequestParam(required = false) String ids,
HttpServletResponse response) {
List<MaintenancePlanExcel> list = maintenancePlanService.exportMaintenancePlan(buildExportQuery(maintenancePlan, ids));
ExcelUtil.export(response, "保养记录" + DateUtil.time(), "保养记录表", list, MaintenancePlanExcel.class);
}
/**
* 导出模板
*/
@GetMapping("/export-template")
@ApiOperationSupport(order = 7)
@Operation(summary = "导出模板")
public void exportTemplate(HttpServletResponse response) {
List<MaintenancePlanExcel> list = new ArrayList<>();
ExcelUtil.export(response, "保养记录模板", "保养记录表", list, MaintenancePlanExcel.class);
}
private Query normalizeQuery(Query query) {
if (query == null) {
query = new Query();
}
if (query.getCurrent() == null || query.getCurrent() < DEFAULT_CURRENT) {
query.setCurrent(DEFAULT_CURRENT);
}
if (query.getSize() == null || query.getSize() <= 0) {
query.setSize(DEFAULT_SIZE);
}
if (query.getSize() > MAX_SIZE) {
query.setSize(MAX_SIZE);
}
return query;
}
private LambdaQueryWrapper<MaintenancePlan> buildExportQuery(MaintenancePlanVO maintenancePlan, String ids) {
LambdaQueryWrapper<MaintenancePlan> queryWrapper = Wrappers.<MaintenancePlan>lambdaQuery()
.eq(MaintenancePlan::getIsDeleted, 0)
.orderByDesc(MaintenancePlan::getCreateTime);
if (Func.isNotEmpty(ids)) {
queryWrapper.in(MaintenancePlan::getId, Func.toLongList(ids));
}
if (Func.isNotEmpty(maintenancePlan.getCreateDept())) {
queryWrapper.eq(MaintenancePlan::getCreateDept, maintenancePlan.getCreateDept());
}
if (Func.isNotEmpty(maintenancePlan.getVehicleType())) {
queryWrapper.eq(MaintenancePlan::getVehicleType, maintenancePlan.getVehicleType());
}
if (Func.isNotEmpty(maintenancePlan.getVehicleNo())) {
queryWrapper.like(MaintenancePlan::getVehicleNo, maintenancePlan.getVehicleNo());
}
if (Func.isNotEmpty(maintenancePlan.getCreateTimeStart())) {
queryWrapper.ge(MaintenancePlan::getCreateTime, maintenancePlan.getCreateTimeStart());
}
if (Func.isNotEmpty(maintenancePlan.getCreateTimeEnd())) {
queryWrapper.le(MaintenancePlan::getCreateTime, maintenancePlan.getCreateTimeEnd());
}
return queryWrapper;
}
}

View File

@@ -25,19 +25,26 @@
*/
package org.springblade.transport.controller;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.Valid;
import lombok.AllArgsConstructor;
import org.springblade.core.boot.ctrl.BladeController;
import org.springblade.core.excel.util.ExcelUtil;
import org.springblade.core.mp.support.Condition;
import org.springblade.core.mp.support.Query;
import org.springblade.core.secure.annotation.PreAuth;
import org.springblade.core.tool.api.R;
import org.springblade.core.tool.utils.DateUtil;
import org.springblade.core.tool.utils.Func;
import org.springblade.transport.excel.MaintenanceRecordExcel;
import org.springblade.transport.excel.MaintenanceRecordImporter;
import org.springblade.transport.pojo.entity.MaintenanceRecord;
import org.springblade.transport.pojo.vo.MaintenanceRecordVO;
import org.springblade.transport.service.IMaintenanceRecordService;
@@ -48,6 +55,10 @@ import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import java.util.ArrayList;
import java.util.List;
/**
* 车辆维修记录 控制器
@@ -61,6 +72,10 @@ import org.springframework.web.bind.annotation.RestController;
@Tag(name = "车辆维修记录", description = "车辆维修记录")
public class MaintenanceRecordController extends BladeController {
private static final int DEFAULT_CURRENT = 1;
private static final int DEFAULT_SIZE = 10;
private static final int MAX_SIZE = 100;
private final IMaintenanceRecordService maintenanceRecordService;
/**
@@ -81,7 +96,7 @@ public class MaintenanceRecordController extends BladeController {
@ApiOperationSupport(order = 2)
@Operation(summary = "分页", description = "传入maintenanceRecord")
public R<IPage<MaintenanceRecordVO>> list(MaintenanceRecordVO maintenanceRecord, Query query) {
IPage<MaintenanceRecordVO> pages = maintenanceRecordService.selectMaintenanceRecordPage(Condition.getPage(query), maintenanceRecord);
IPage<MaintenanceRecordVO> pages = maintenanceRecordService.selectMaintenanceRecordPage(Condition.getPage(normalizeQuery(query)), maintenanceRecord);
return R.data(pages);
}
@@ -92,10 +107,7 @@ public class MaintenanceRecordController extends BladeController {
@ApiOperationSupport(order = 3)
@Operation(summary = "新增或修改", description = "传入maintenanceRecord")
public R submit(@Valid @RequestBody MaintenanceRecord maintenanceRecord) {
if (Func.isEmpty(maintenanceRecord.getMileageUnit())) {
maintenanceRecord.setMileageUnit("船舶".equals(maintenanceRecord.getVehicleType()) ? "海里" : "公里");
}
return R.status(maintenanceRecordService.saveOrUpdate(maintenanceRecord));
return R.status(maintenanceRecordService.submit(maintenanceRecord));
}
/**
@@ -108,4 +120,81 @@ public class MaintenanceRecordController extends BladeController {
return R.status(maintenanceRecordService.deleteLogic(Func.toLongList(ids)));
}
/**
* 导入维修记录
*/
@PostMapping("/import-maintenance-record")
@ApiOperationSupport(order = 5)
@Operation(summary = "导入维修记录", description = "传入excel")
public R importMaintenanceRecord(MultipartFile file) {
MaintenanceRecordImporter maintenanceRecordImporter = new MaintenanceRecordImporter(maintenanceRecordService);
ExcelUtil.save(file, maintenanceRecordImporter, MaintenanceRecordExcel.class);
return R.success("操作成功");
}
/**
* 导出维修记录
*/
@GetMapping("/export-maintenance-record")
@ApiOperationSupport(order = 6)
@Operation(summary = "导出维修记录")
public void exportMaintenanceRecord(MaintenanceRecordVO maintenanceRecord,
@RequestParam(required = false) String ids,
HttpServletResponse response) {
List<MaintenanceRecordExcel> list = maintenanceRecordService.exportMaintenanceRecord(buildExportQuery(maintenanceRecord, ids));
ExcelUtil.export(response, "维修记录" + DateUtil.time(), "维修记录表", list, MaintenanceRecordExcel.class);
}
/**
* 导出模板
*/
@GetMapping("/export-template")
@ApiOperationSupport(order = 7)
@Operation(summary = "导出模板")
public void exportTemplate(HttpServletResponse response) {
List<MaintenanceRecordExcel> list = new ArrayList<>();
ExcelUtil.export(response, "维修记录模板", "维修记录表", list, MaintenanceRecordExcel.class);
}
private Query normalizeQuery(Query query) {
if (query == null) {
query = new Query();
}
if (query.getCurrent() == null || query.getCurrent() < DEFAULT_CURRENT) {
query.setCurrent(DEFAULT_CURRENT);
}
if (query.getSize() == null || query.getSize() <= 0) {
query.setSize(DEFAULT_SIZE);
}
if (query.getSize() > MAX_SIZE) {
query.setSize(MAX_SIZE);
}
return query;
}
private LambdaQueryWrapper<MaintenanceRecord> buildExportQuery(MaintenanceRecordVO maintenanceRecord, String ids) {
LambdaQueryWrapper<MaintenanceRecord> queryWrapper = Wrappers.<MaintenanceRecord>lambdaQuery()
.eq(MaintenanceRecord::getIsDeleted, 0)
.orderByDesc(MaintenanceRecord::getCreateTime);
if (Func.isNotEmpty(ids)) {
queryWrapper.in(MaintenanceRecord::getId, Func.toLongList(ids));
}
if (Func.isNotEmpty(maintenanceRecord.getCreateDept())) {
queryWrapper.eq(MaintenanceRecord::getCreateDept, maintenanceRecord.getCreateDept());
}
if (Func.isNotEmpty(maintenanceRecord.getVehicleType())) {
queryWrapper.eq(MaintenanceRecord::getVehicleType, maintenanceRecord.getVehicleType());
}
if (Func.isNotEmpty(maintenanceRecord.getVehicleNo())) {
queryWrapper.like(MaintenanceRecord::getVehicleNo, maintenanceRecord.getVehicleNo());
}
if (Func.isNotEmpty(maintenanceRecord.getCreateTimeStart())) {
queryWrapper.ge(MaintenanceRecord::getCreateTime, maintenanceRecord.getCreateTimeStart());
}
if (Func.isNotEmpty(maintenanceRecord.getCreateTimeEnd())) {
queryWrapper.le(MaintenanceRecord::getCreateTime, maintenanceRecord.getCreateTimeEnd());
}
return queryWrapper;
}
}

View File

@@ -27,6 +27,7 @@ package org.springblade.transport.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.apache.ibatis.annotations.Param;
import org.springblade.transport.pojo.entity.MaintenancePlan;
import org.springblade.transport.pojo.vo.MaintenancePlanVO;
@@ -46,6 +47,6 @@ public interface MaintenancePlanMapper extends BaseMapper<MaintenancePlan> {
* @param maintenancePlan 查询参数
* @return 保养计划列表
*/
List<MaintenancePlanVO> selectMaintenancePlanPage(IPage<MaintenancePlanVO> page, MaintenancePlanVO maintenancePlan);
List<MaintenancePlanVO> selectMaintenancePlanPage(IPage<MaintenancePlanVO> page, @Param("maintenancePlan") MaintenancePlanVO maintenancePlan);
}

View File

@@ -31,11 +31,37 @@
<select id="selectMaintenancePlanPage" resultMap="maintenancePlanResultMap">
SELECT
*
id,
tenant_id,
create_user,
create_dept,
create_time,
update_user,
update_time,
status,
is_deleted,
vehicle_type,
vehicle_no,
maintainer,
maintenance_time,
CASE WHEN mileage &lt; 0 THEN 0 ELSE mileage END AS mileage,
mileage_unit,
maintenance_item,
cost,
store_name,
contact_phone,
address,
next_maintenance_time,
CASE WHEN next_maintenance_mileage &lt; 0 THEN 0 ELSE next_maintenance_mileage END AS next_maintenance_mileage,
attachments,
remark
FROM
blade_vehicle_maintenance_plan
WHERE
is_deleted = 0
<if test="maintenancePlan.createDept != null">
AND create_dept = #{maintenancePlan.createDept}
</if>
<if test="maintenancePlan.vehicleType != null and maintenancePlan.vehicleType != ''">
AND vehicle_type = #{maintenancePlan.vehicleType}
</if>

View File

@@ -27,6 +27,7 @@ package org.springblade.transport.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.apache.ibatis.annotations.Param;
import org.springblade.transport.pojo.entity.MaintenanceRecord;
import org.springblade.transport.pojo.vo.MaintenanceRecordVO;
@@ -46,6 +47,6 @@ public interface MaintenanceRecordMapper extends BaseMapper<MaintenanceRecord> {
* @param maintenanceRecord 查询参数
* @return 维修记录列表
*/
List<MaintenanceRecordVO> selectMaintenanceRecordPage(IPage<MaintenanceRecordVO> page, MaintenanceRecordVO maintenanceRecord);
List<MaintenanceRecordVO> selectMaintenanceRecordPage(IPage<MaintenanceRecordVO> page, @Param("maintenanceRecord") MaintenanceRecordVO maintenanceRecord);
}

View File

@@ -31,11 +31,37 @@
<select id="selectMaintenanceRecordPage" resultMap="maintenanceRecordResultMap">
SELECT
*
id,
tenant_id,
create_user,
create_dept,
create_time,
update_user,
update_time,
status,
is_deleted,
vehicle_type,
vehicle_no,
maintainer,
maintenance_time,
location,
replaced_part,
cost,
company,
contact,
address,
factory_time,
CASE WHEN mileage &lt; 0 THEN 0 ELSE mileage END AS mileage,
mileage_unit,
attachments,
remark
FROM
blade_vehicle_maintenance_record
WHERE
is_deleted = 0
<if test="maintenanceRecord.createDept != null">
AND create_dept = #{maintenanceRecord.createDept}
</if>
<if test="maintenanceRecord.vehicleType != null and maintenanceRecord.vehicleType != ''">
AND vehicle_type = #{maintenanceRecord.vehicleType}
</if>

View File

@@ -25,11 +25,15 @@
*/
package org.springblade.transport.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.transport.excel.MaintenancePlanExcel;
import org.springblade.transport.pojo.entity.MaintenancePlan;
import org.springblade.transport.pojo.vo.MaintenancePlanVO;
import java.util.List;
/**
* 车辆保养计划 服务类
*
@@ -46,4 +50,27 @@ public interface IMaintenancePlanService extends BaseService<MaintenancePlan> {
*/
IPage<MaintenancePlanVO> selectMaintenancePlanPage(IPage<MaintenancePlanVO> page, MaintenancePlanVO maintenancePlan);
/**
* 新增或修改保养记录
*
* @param maintenancePlan 保养记录
* @return 是否成功
*/
boolean submit(MaintenancePlan maintenancePlan);
/**
* 导入保养记录
*
* @param data 导入数据
*/
void importMaintenancePlan(List<MaintenancePlanExcel> data);
/**
* 导出保养记录
*
* @param queryWrapper 查询条件
* @return 导出数据
*/
List<MaintenancePlanExcel> exportMaintenancePlan(Wrapper<MaintenancePlan> queryWrapper);
}

View File

@@ -25,11 +25,15 @@
*/
package org.springblade.transport.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.transport.excel.MaintenanceRecordExcel;
import org.springblade.transport.pojo.entity.MaintenanceRecord;
import org.springblade.transport.pojo.vo.MaintenanceRecordVO;
import java.util.List;
/**
* 车辆维修记录 服务类
*
@@ -46,4 +50,27 @@ public interface IMaintenanceRecordService extends BaseService<MaintenanceRecord
*/
IPage<MaintenanceRecordVO> selectMaintenanceRecordPage(IPage<MaintenanceRecordVO> page, MaintenanceRecordVO maintenanceRecord);
/**
* 新增或修改维修记录
*
* @param maintenanceRecord 维修记录
* @return 是否成功
*/
boolean submit(MaintenanceRecord maintenanceRecord);
/**
* 导入维修记录
*
* @param data 导入数据
*/
void importMaintenanceRecord(List<MaintenanceRecordExcel> data);
/**
* 导出维修记录
*
* @param queryWrapper 查询条件
* @return 导出数据
*/
List<MaintenanceRecordExcel> exportMaintenanceRecord(Wrapper<MaintenanceRecord> queryWrapper);
}

View File

@@ -25,13 +25,24 @@
*/
package org.springblade.transport.service.impl;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.springblade.core.log.exception.ServiceException;
import org.springblade.core.mp.base.BaseServiceImpl;
import org.springblade.core.tool.utils.BeanUtil;
import org.springblade.core.tool.utils.Func;
import org.springblade.transport.excel.MaintenancePlanExcel;
import org.springblade.transport.mapper.MaintenancePlanMapper;
import org.springblade.transport.pojo.entity.MaintenancePlan;
import org.springblade.transport.pojo.vo.MaintenancePlanVO;
import org.springblade.transport.service.IMaintenancePlanService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
/**
* 车辆保养计划 服务实现类
@@ -41,9 +52,131 @@ import org.springframework.stereotype.Service;
@Service
public class MaintenancePlanServiceImpl extends BaseServiceImpl<MaintenancePlanMapper, MaintenancePlan> implements IMaintenancePlanService {
private static final int VEHICLE_NO_MAX_LENGTH = 30;
private static final int MAINTAINER_MAX_LENGTH = 20;
private static final int MAINTENANCE_ITEM_MAX_LENGTH = 100;
private static final int ADDRESS_MAX_LENGTH = 100;
private static final int REMARK_MAX_LENGTH = 500;
@Override
public IPage<MaintenancePlanVO> selectMaintenancePlanPage(IPage<MaintenancePlanVO> page, MaintenancePlanVO maintenancePlan) {
return page.setRecords(baseMapper.selectMaintenancePlanPage(page, maintenancePlan));
}
@Override
@Transactional(rollbackFor = Exception.class)
public boolean submit(MaintenancePlan maintenancePlan) {
prepare(maintenancePlan);
validate(maintenancePlan);
return saveOrUpdate(maintenancePlan);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void importMaintenancePlan(List<MaintenancePlanExcel> data) {
if (Func.isEmpty(data)) {
throw new ServiceException("导入数据不能为空");
}
List<String> errorList = new ArrayList<>();
for (int index = 0; index < data.size(); index++) {
try {
MaintenancePlan maintenancePlan = Objects.requireNonNull(BeanUtil.copyProperties(data.get(index), MaintenancePlan.class));
submit(maintenancePlan);
} catch (Exception exception) {
errorList.add("" + (index + 2) + "行:" + exception.getMessage());
}
}
if (Func.isNotEmpty(errorList)) {
throw new ServiceException(String.join("", errorList));
}
}
@Override
public List<MaintenancePlanExcel> exportMaintenancePlan(Wrapper<MaintenancePlan> queryWrapper) {
return list(queryWrapper).stream().map(maintenancePlan -> {
MaintenancePlanExcel excel = Objects.requireNonNull(BeanUtil.copyProperties(maintenancePlan, MaintenancePlanExcel.class));
excel.setMileage(nonNegative(maintenancePlan.getMileage()));
excel.setNextMaintenanceMileage(nonNegative(maintenancePlan.getNextMaintenanceMileage()));
if (Func.isEmpty(excel.getMileageUnit())) {
excel.setMileageUnit(defaultMileageUnit(maintenancePlan.getVehicleType()));
}
return excel;
}).toList();
}
private void prepare(MaintenancePlan maintenancePlan) {
maintenancePlan.setVehicleType(trimToEmpty(maintenancePlan.getVehicleType()));
maintenancePlan.setVehicleNo(trimToEmpty(maintenancePlan.getVehicleNo()));
maintenancePlan.setMaintainer(trimToNull(maintenancePlan.getMaintainer()));
maintenancePlan.setMaintenanceItem(trimToNull(maintenancePlan.getMaintenanceItem()));
maintenancePlan.setStoreName(trimToNull(maintenancePlan.getStoreName()));
maintenancePlan.setContactPhone(trimToNull(maintenancePlan.getContactPhone()));
maintenancePlan.setAddress(trimToNull(maintenancePlan.getAddress()));
maintenancePlan.setRemark(trimToNull(maintenancePlan.getRemark()));
if (Func.isEmpty(maintenancePlan.getMileageUnit())) {
maintenancePlan.setMileageUnit(defaultMileageUnit(maintenancePlan.getVehicleType()));
}
}
private void validate(MaintenancePlan maintenancePlan) {
if (Func.isEmpty(maintenancePlan.getVehicleType())) {
throw new ServiceException("车船类型不能为空");
}
if (!"车辆".equals(maintenancePlan.getVehicleType()) && !"船舶".equals(maintenancePlan.getVehicleType())) {
throw new ServiceException("车船类型不正确");
}
if (Func.isEmpty(maintenancePlan.getVehicleNo())) {
throw new ServiceException("车牌号/船号不能为空");
}
validateLength(maintenancePlan.getVehicleNo(), VEHICLE_NO_MAX_LENGTH, "车牌号/船号不能超过30字");
validateLength(maintenancePlan.getMaintainer(), MAINTAINER_MAX_LENGTH, "保养人不能超过20字");
validateLength(maintenancePlan.getMaintenanceItem(), MAINTENANCE_ITEM_MAX_LENGTH, "保养项目不能超过100字");
validateLength(maintenancePlan.getAddress(), ADDRESS_MAX_LENGTH, "地址不能超过100字");
validateLength(maintenancePlan.getRemark(), REMARK_MAX_LENGTH, "备注不能超过500字");
if (Func.isEmpty(maintenancePlan.getMaintenanceTime())) {
throw new ServiceException("保养时间不能为空");
}
if (Func.isEmpty(maintenancePlan.getCost())) {
throw new ServiceException("费用不能为空");
}
validateNonNegative(maintenancePlan.getCost(), "费用不能小于0");
validateNonNegative(maintenancePlan.getMileage(), "里程/航程数不能小于0");
validateNonNegative(maintenancePlan.getNextMaintenanceMileage(), "下次保养里程/航程不能小于0");
if (Func.isNotEmpty(maintenancePlan.getNextMaintenanceTime()) && maintenancePlan.getNextMaintenanceTime().isBefore(maintenancePlan.getMaintenanceTime())) {
throw new ServiceException("下次保养时间不能早于保养时间");
}
}
private void validateLength(String value, int maxLength, String message) {
if (Func.isNotEmpty(value) && value.length() > maxLength) {
throw new ServiceException(message);
}
}
private void validateNonNegative(BigDecimal value, String message) {
if (Func.isNotEmpty(value) && value.compareTo(BigDecimal.ZERO) < 0) {
throw new ServiceException(message);
}
}
private BigDecimal nonNegative(BigDecimal value) {
if (Func.isEmpty(value) || value.compareTo(BigDecimal.ZERO) >= 0) {
return value;
}
return BigDecimal.ZERO;
}
private String defaultMileageUnit(String vehicleType) {
return "船舶".equals(vehicleType) ? "海里" : "公里";
}
private String trimToEmpty(String value) {
return value == null ? "" : value.trim();
}
private String trimToNull(String value) {
String trimValue = trimToEmpty(value);
return trimValue.isEmpty() ? null : trimValue;
}
}

View File

@@ -25,13 +25,24 @@
*/
package org.springblade.transport.service.impl;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.springblade.core.log.exception.ServiceException;
import org.springblade.core.mp.base.BaseServiceImpl;
import org.springblade.core.tool.utils.BeanUtil;
import org.springblade.core.tool.utils.Func;
import org.springblade.transport.excel.MaintenanceRecordExcel;
import org.springblade.transport.mapper.MaintenanceRecordMapper;
import org.springblade.transport.pojo.entity.MaintenanceRecord;
import org.springblade.transport.pojo.vo.MaintenanceRecordVO;
import org.springblade.transport.service.IMaintenanceRecordService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
/**
* 车辆维修记录 服务实现类
@@ -41,9 +52,132 @@ import org.springframework.stereotype.Service;
@Service
public class MaintenanceRecordServiceImpl extends BaseServiceImpl<MaintenanceRecordMapper, MaintenanceRecord> implements IMaintenanceRecordService {
private static final int VEHICLE_NO_MAX_LENGTH = 30;
private static final int MAINTAINER_MAX_LENGTH = 20;
private static final int LOCATION_MAX_LENGTH = 100;
private static final int REPLACED_PART_MAX_LENGTH = 200;
private static final int ADDRESS_MAX_LENGTH = 100;
private static final int REMARK_MAX_LENGTH = 500;
@Override
public IPage<MaintenanceRecordVO> selectMaintenanceRecordPage(IPage<MaintenanceRecordVO> page, MaintenanceRecordVO maintenanceRecord) {
return page.setRecords(baseMapper.selectMaintenanceRecordPage(page, maintenanceRecord));
}
@Override
@Transactional(rollbackFor = Exception.class)
public boolean submit(MaintenanceRecord maintenanceRecord) {
prepare(maintenanceRecord);
validate(maintenanceRecord);
return saveOrUpdate(maintenanceRecord);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void importMaintenanceRecord(List<MaintenanceRecordExcel> data) {
if (Func.isEmpty(data)) {
throw new ServiceException("导入数据不能为空");
}
List<String> errorList = new ArrayList<>();
for (int index = 0; index < data.size(); index++) {
try {
MaintenanceRecord maintenanceRecord = Objects.requireNonNull(BeanUtil.copyProperties(data.get(index), MaintenanceRecord.class));
submit(maintenanceRecord);
} catch (Exception exception) {
errorList.add("" + (index + 2) + "行:" + exception.getMessage());
}
}
if (Func.isNotEmpty(errorList)) {
throw new ServiceException(String.join("", errorList));
}
}
@Override
public List<MaintenanceRecordExcel> exportMaintenanceRecord(Wrapper<MaintenanceRecord> queryWrapper) {
return list(queryWrapper).stream().map(maintenanceRecord -> {
MaintenanceRecordExcel excel = Objects.requireNonNull(BeanUtil.copyProperties(maintenanceRecord, MaintenanceRecordExcel.class));
excel.setMileage(nonNegative(maintenanceRecord.getMileage()));
if (Func.isEmpty(excel.getMileageUnit())) {
excel.setMileageUnit(defaultMileageUnit(maintenanceRecord.getVehicleType()));
}
return excel;
}).toList();
}
private void prepare(MaintenanceRecord maintenanceRecord) {
maintenanceRecord.setVehicleType(trimToEmpty(maintenanceRecord.getVehicleType()));
maintenanceRecord.setVehicleNo(trimToEmpty(maintenanceRecord.getVehicleNo()));
maintenanceRecord.setMaintainer(trimToNull(maintenanceRecord.getMaintainer()));
maintenanceRecord.setLocation(trimToNull(maintenanceRecord.getLocation()));
maintenanceRecord.setReplacedPart(trimToNull(maintenanceRecord.getReplacedPart()));
maintenanceRecord.setCompany(trimToNull(maintenanceRecord.getCompany()));
maintenanceRecord.setContact(trimToNull(maintenanceRecord.getContact()));
maintenanceRecord.setAddress(trimToNull(maintenanceRecord.getAddress()));
maintenanceRecord.setRemark(trimToNull(maintenanceRecord.getRemark()));
if (Func.isEmpty(maintenanceRecord.getMileageUnit())) {
maintenanceRecord.setMileageUnit(defaultMileageUnit(maintenanceRecord.getVehicleType()));
}
}
private void validate(MaintenanceRecord maintenanceRecord) {
if (Func.isEmpty(maintenanceRecord.getVehicleType())) {
throw new ServiceException("车船类型不能为空");
}
if (!"车辆".equals(maintenanceRecord.getVehicleType()) && !"船舶".equals(maintenanceRecord.getVehicleType())) {
throw new ServiceException("车船类型不正确");
}
if (Func.isEmpty(maintenanceRecord.getVehicleNo())) {
throw new ServiceException("车牌号/船号不能为空");
}
validateLength(maintenanceRecord.getVehicleNo(), VEHICLE_NO_MAX_LENGTH, "车牌号/船号不能超过30字");
validateLength(maintenanceRecord.getMaintainer(), MAINTAINER_MAX_LENGTH, "维修人不能超过20字");
validateLength(maintenanceRecord.getLocation(), LOCATION_MAX_LENGTH, "维修位置不能超过100字");
validateLength(maintenanceRecord.getReplacedPart(), REPLACED_PART_MAX_LENGTH, "更换零件不能超过200字");
validateLength(maintenanceRecord.getAddress(), ADDRESS_MAX_LENGTH, "地址不能超过100字");
validateLength(maintenanceRecord.getRemark(), REMARK_MAX_LENGTH, "备注不能超过500字");
if (Func.isEmpty(maintenanceRecord.getMaintenanceTime())) {
throw new ServiceException("维修时间不能为空");
}
if (Func.isEmpty(maintenanceRecord.getCost())) {
throw new ServiceException("费用不能为空");
}
validateNonNegative(maintenanceRecord.getCost(), "费用不能小于0");
validateNonNegative(maintenanceRecord.getMileage(), "里程/航程数不能小于0");
if (Func.isNotEmpty(maintenanceRecord.getFactoryTime()) && maintenanceRecord.getFactoryTime().isBefore(maintenanceRecord.getMaintenanceTime())) {
throw new ServiceException("出厂时间不能早于维修时间");
}
}
private void validateLength(String value, int maxLength, String message) {
if (Func.isNotEmpty(value) && value.length() > maxLength) {
throw new ServiceException(message);
}
}
private void validateNonNegative(BigDecimal value, String message) {
if (Func.isNotEmpty(value) && value.compareTo(BigDecimal.ZERO) < 0) {
throw new ServiceException(message);
}
}
private BigDecimal nonNegative(BigDecimal value) {
if (Func.isEmpty(value) || value.compareTo(BigDecimal.ZERO) >= 0) {
return value;
}
return BigDecimal.ZERO;
}
private String defaultMileageUnit(String vehicleType) {
return "船舶".equals(vehicleType) ? "海里" : "公里";
}
private String trimToEmpty(String value) {
return value == null ? "" : value.trim();
}
private String trimToNull(String value) {
String trimValue = trimToEmpty(value);
return trimValue.isEmpty() ? null : trimValue;
}
}