1、调整基础配置模块

2、调整车船务模块
This commit is contained in:
2026-07-24 14:33:50 +08:00
parent af8c9ac2e6
commit fd98744b46
52 changed files with 451 additions and 86 deletions

View File

@@ -172,6 +172,7 @@ public class AirportMasterController extends BladeController {
airportMaster.remove("Blade-Auth");
airportMaster.remove("Authorization");
airportMaster.remove("access_token");
normalizeRegionCodeCondition(airportMaster);
QueryWrapper<AirportMaster> queryWrapper = Condition.getQueryWrapper(airportMaster, AirportMaster.class);
if (Func.isNotEmpty(ids)) {
queryWrapper.lambda().in(AirportMaster::getId, Func.toLongList(ids.toString()));
@@ -207,4 +208,11 @@ public class AirportMasterController extends BladeController {
return query;
}
private void normalizeRegionCodeCondition(Map<String, Object> params) {
Object regionCode = params.remove("regionCode");
if (Func.isNotEmpty(regionCode) && Func.isEmpty(params.get("districtCode"))) {
params.put("districtCode", regionCode);
}
}
}

View File

@@ -184,6 +184,7 @@ public class PortTerminalController extends BladeController {
portTerminal.remove("Blade-Auth");
portTerminal.remove("Authorization");
portTerminal.remove("access_token");
normalizeRegionCodeCondition(portTerminal);
QueryWrapper<PortTerminal> queryWrapper = Condition.getQueryWrapper(portTerminal, PortTerminal.class);
applyDataSourceCondition(queryWrapper, dataSource);
if (Func.isNotEmpty(ids)) {
@@ -220,6 +221,13 @@ public class PortTerminalController extends BladeController {
return query;
}
private void normalizeRegionCodeCondition(Map<String, Object> params) {
Object regionCode = params.remove("regionCode");
if (Func.isNotEmpty(regionCode) && Func.isEmpty(params.get("districtCode"))) {
params.put("districtCode", regionCode);
}
}
private void applyDataSourceCondition(QueryWrapper<PortTerminal> queryWrapper, Object dataSource) {
String value = Func.toStrWithEmpty(dataSource, "");
if (Func.isEmpty(value)) {

View File

@@ -176,6 +176,7 @@ public class RailwayStationController extends BladeController {
railwayStation.remove("Blade-Auth");
railwayStation.remove("Authorization");
railwayStation.remove("access_token");
normalizeRegionCodeCondition(railwayStation);
QueryWrapper<RailwayStation> queryWrapper = Condition.getQueryWrapper(railwayStation, RailwayStation.class);
applyDataSourceCondition(queryWrapper, dataSource);
if (Func.isNotEmpty(ids)) {
@@ -212,6 +213,13 @@ public class RailwayStationController extends BladeController {
return query;
}
private void normalizeRegionCodeCondition(Map<String, Object> params) {
Object regionCode = params.remove("regionCode");
if (Func.isNotEmpty(regionCode) && Func.isEmpty(params.get("districtCode"))) {
params.put("districtCode", regionCode);
}
}
private void applyDataSourceCondition(QueryWrapper<RailwayStation> queryWrapper, Object dataSource) {
String value = Func.toStrWithEmpty(dataSource, "");
if (Func.isEmpty(value)) {

View File

@@ -133,7 +133,7 @@ public class RegionController extends BladeController {
@ApiOperationSupport(order = 5)
@Operation(summary = "新增", description = "传入region")
public R save(@Valid @RequestBody Region region) {
return R.status(regionService.save(region));
return R.status(regionService.submit(region));
}
/**
@@ -143,7 +143,8 @@ public class RegionController extends BladeController {
@ApiOperationSupport(order = 6)
@Operation(summary = "修改", description = "传入region")
public R update(@Valid @RequestBody Region region) {
return R.status(regionService.updateById(region));
region.setOriginalCode(region.getCode());
return R.status(regionService.submit(region));
}
/**
@@ -174,7 +175,10 @@ public class RegionController extends BladeController {
@ApiOperationSupport(order = 9)
@Operation(summary = "下拉数据源", description = "传入tenant")
public R<List<Region>> select(@RequestParam(required = false, defaultValue = "+86") String code) {
List<Region> list = regionService.list(Wrappers.<Region>query().lambda().eq(Region::getParentCode, code));
List<Region> list = regionService.list(Wrappers.<Region>lambdaQuery()
.eq(Region::getParentCode, code)
.orderByAsc(Region::getSort)
.orderByAsc(Region::getCode));
return R.data(list);
}

View File

@@ -74,6 +74,9 @@ public class AirportMasterExcel implements Serializable {
@ExcelProperty("所属城市")
private String cityName;
@ExcelProperty("所属区县")
private String districtName;
@ExcelProperty("行政区划")
private String regionName;

View File

@@ -27,6 +27,7 @@ package org.springblade.system.excel;
import cn.idev.excel.annotation.ExcelIgnore;
import cn.idev.excel.annotation.ExcelProperty;
import cn.idev.excel.annotation.format.NumberFormat;
import cn.idev.excel.annotation.write.style.ColumnWidth;
import cn.idev.excel.annotation.write.style.ContentRowHeight;
import cn.idev.excel.annotation.write.style.HeadRowHeight;
@@ -73,6 +74,9 @@ public class PortTerminalExcel implements Serializable {
@ExcelProperty("城市")
private String city;
@ExcelProperty("区县")
private String districtName;
@ExcelProperty("行政区划编码")
private String regionCode;
@@ -80,9 +84,11 @@ public class PortTerminalExcel implements Serializable {
private String detailAddress;
@ExcelProperty("经度")
@NumberFormat("0.000000")
private BigDecimal longitude;
@ExcelProperty("纬度")
@NumberFormat("0.000000")
private BigDecimal latitude;
@ExcelProperty("数据来源")

View File

@@ -27,7 +27,6 @@ package org.springblade.system.excel;
import cn.idev.excel.annotation.ExcelIgnore;
import cn.idev.excel.annotation.ExcelProperty;
import cn.idev.excel.annotation.format.NumberFormat;
import cn.idev.excel.annotation.write.style.ColumnWidth;
import cn.idev.excel.annotation.write.style.ContentRowHeight;
import cn.idev.excel.annotation.write.style.HeadRowHeight;
@@ -35,7 +34,6 @@ import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
/**
* 铁路车站主数据 Excel
@@ -74,6 +72,9 @@ public class RailwayStationExcel implements Serializable {
@ExcelProperty("所属城市")
private String cityName;
@ExcelProperty("所属区县")
private String districtName;
@ExcelProperty("行政区划")
private String regionName;
@@ -81,12 +82,10 @@ public class RailwayStationExcel implements Serializable {
private String detailAddress;
@ExcelProperty("经度")
@NumberFormat("0.000000")
private BigDecimal longitude;
private String longitude;
@ExcelProperty("纬度")
@NumberFormat("0.000000")
private BigDecimal latitude;
private String latitude;
@ExcelProperty("数据来源")
private String dataSource;

View File

@@ -21,7 +21,9 @@
<result column="province_name" property="provinceName"/>
<result column="city_code" property="cityCode"/>
<result column="city_name" property="cityName"/>
<result column="region_code" property="regionCode"/>
<result column="district_code" property="districtCode"/>
<result column="district_name" property="districtName"/>
<result column="district_code" property="regionCode"/>
<result column="region_name" property="regionName"/>
<result column="detail_address" property="detailAddress"/>
<result column="longitude" property="longitude"/>
@@ -50,7 +52,8 @@
am.province_name,
am.city_code,
am.city_name,
am.region_code,
am.district_code,
am.district_name,
am.region_name,
am.detail_address,
am.longitude,
@@ -77,7 +80,14 @@
AND am.icao_code = #{airportMaster.icaoCode}
</if>
<if test="airportMaster.regionCode != null and airportMaster.regionCode != ''">
AND am.region_code = #{airportMaster.regionCode}
AND am.district_code = #{airportMaster.regionCode}
</if>
<if test="airportMaster.districtCode != null and airportMaster.districtCode != ''">
AND am.district_code = #{airportMaster.districtCode}
</if>
<if test="airportMaster.districtName != null and airportMaster.districtName != ''">
<bind name="districtNameLike" value="'%' + airportMaster.districtName + '%'"/>
AND am.district_name LIKE #{districtNameLike}
</if>
<if test="airportMaster.regionName != null and airportMaster.regionName != ''">
<bind name="regionNameLike" value="'%' + airportMaster.regionName + '%'"/>
@@ -100,7 +110,7 @@
<if test="airportMaster.status != null">
AND am.status = #{airportMaster.status}
</if>
ORDER BY am.update_time DESC, am.create_time DESC
ORDER BY am.create_time DESC
</select>
</mapper>

View File

@@ -91,7 +91,7 @@
<if test="currency.updateTimeEnd != null">
AND bc.update_time &lt;= #{currency.updateTimeEnd}
</if>
ORDER BY bc.code ASC, bc.effective_date DESC, bc.create_time DESC
ORDER BY bc.create_time DESC
</select>
</mapper>

View File

@@ -33,7 +33,7 @@
<if test="customerType.status != null">
AND status = #{customerType.status}
</if>
ORDER BY update_time DESC, create_time DESC
ORDER BY create_time DESC
</select>
</mapper>

View File

@@ -11,6 +11,7 @@
<result column="update_time" property="updateTime"/>
<result column="status" property="status"/>
<result column="is_deleted" property="isDeleted"/>
<result column="fee_category" property="feeCategory"/>
<result column="name" property="name"/>
<result column="english_name" property="englishName"/>
</resultMap>
@@ -22,6 +23,9 @@
blade_fee_item
WHERE
is_deleted = 0
<if test="feeItem.feeCategory != null and feeItem.feeCategory != ''">
AND fee_category = #{feeItem.feeCategory}
</if>
<if test="feeItem.name != null and feeItem.name != ''">
<bind name="nameLike" value="'%' + feeItem.name + '%'"/>
AND name LIKE #{nameLike}
@@ -33,7 +37,7 @@
<if test="feeItem.status != null">
AND status = #{feeItem.status}
</if>
ORDER BY update_time DESC, create_time DESC
ORDER BY create_time DESC
</select>
</mapper>

View File

@@ -20,7 +20,9 @@
<result column="parent_name" property="parentName"/>
<result column="country" property="country"/>
<result column="city" property="city"/>
<result column="region_code" property="regionCode"/>
<result column="district_code" property="districtCode"/>
<result column="district_name" property="districtName"/>
<result column="district_code" property="regionCode"/>
<result column="detail_address" property="detailAddress"/>
<result column="longitude" property="longitude"/>
<result column="latitude" property="latitude"/>
@@ -47,7 +49,8 @@
pt.parent_name,
pt.country,
pt.city,
pt.region_code,
pt.district_code,
pt.district_name,
pt.detail_address,
CASE WHEN pt.longitude BETWEEN -180 AND 180 THEN pt.longitude ELSE NULL END AS longitude,
CASE WHEN pt.latitude BETWEEN -90 AND 90 THEN pt.latitude ELSE NULL END AS latitude,
@@ -82,8 +85,15 @@
<if test="portTerminal.city != null and portTerminal.city != ''">
AND pt.city = #{portTerminal.city}
</if>
<if test="portTerminal.districtCode != null and portTerminal.districtCode != ''">
AND pt.district_code = #{portTerminal.districtCode}
</if>
<if test="portTerminal.districtName != null and portTerminal.districtName != ''">
<bind name="districtNameLike" value="'%' + portTerminal.districtName + '%'"/>
AND pt.district_name LIKE #{districtNameLike}
</if>
<if test="portTerminal.regionCode != null and portTerminal.regionCode != ''">
AND pt.region_code = #{portTerminal.regionCode}
AND pt.district_code = #{portTerminal.regionCode}
</if>
<if test="portTerminal.detailAddress != null and portTerminal.detailAddress != ''">
<bind name="detailAddressLike" value="'%' + portTerminal.detailAddress + '%'"/>
@@ -95,7 +105,7 @@
<if test="portTerminal.status != null">
AND pt.status = #{portTerminal.status}
</if>
ORDER BY pt.update_time DESC, pt.create_time DESC
ORDER BY pt.create_time DESC
</select>
</mapper>

View File

@@ -21,7 +21,9 @@
<result column="province_name" property="provinceName"/>
<result column="city_code" property="cityCode"/>
<result column="city_name" property="cityName"/>
<result column="region_code" property="regionCode"/>
<result column="district_code" property="districtCode"/>
<result column="district_name" property="districtName"/>
<result column="district_code" property="regionCode"/>
<result column="region_name" property="regionName"/>
<result column="detail_address" property="detailAddress"/>
<result column="longitude" property="longitude"/>
@@ -50,7 +52,8 @@
rs.province_name,
rs.city_code,
rs.city_name,
rs.region_code,
rs.district_code,
rs.district_name,
rs.region_name,
rs.detail_address,
rs.longitude,
@@ -82,7 +85,14 @@
AND rs.telegraph_code = #{railwayStation.telegraphCode}
</if>
<if test="railwayStation.regionCode != null and railwayStation.regionCode != ''">
AND rs.region_code = #{railwayStation.regionCode}
AND rs.district_code = #{railwayStation.regionCode}
</if>
<if test="railwayStation.districtCode != null and railwayStation.districtCode != ''">
AND rs.district_code = #{railwayStation.districtCode}
</if>
<if test="railwayStation.districtName != null and railwayStation.districtName != ''">
<bind name="districtNameLike" value="'%' + railwayStation.districtName + '%'"/>
AND rs.district_name LIKE #{districtNameLike}
</if>
<if test="railwayStation.regionName != null and railwayStation.regionName != ''">
<bind name="regionNameLike" value="'%' + railwayStation.regionName + '%'"/>
@@ -111,7 +121,7 @@
<if test="railwayStation.status != null">
AND rs.status = #{railwayStation.status}
</if>
ORDER BY rs.update_time DESC, rs.create_time DESC
ORDER BY rs.create_time DESC
</select>
</mapper>

View File

@@ -72,6 +72,7 @@
and region.name like concat(concat('%', #{param2.name}),'%')
</if>
</where>
ORDER BY region.sort ASC, region.code ASC
</select>
<select id="lazyTree" resultType="java.util.HashMap">
@@ -95,7 +96,7 @@
and region.name like concat(concat('%', #{param2.name}),'%')
</if>
</where>
ORDER BY region.code
ORDER BY region.sort ASC, region.code ASC
</select>
<select id="exportRegion" resultType="org.springblade.system.excel.RegionExcel">

View File

@@ -173,8 +173,16 @@ public class AirportMasterServiceImpl extends BaseServiceImpl<AirportMasterMappe
airportMaster.setProvinceName(trimToNull(airportMaster.getProvinceName()));
airportMaster.setCityCode(trimToNull(airportMaster.getCityCode()));
airportMaster.setCityName(trimToNull(airportMaster.getCityName()));
airportMaster.setDistrictCode(trimToNull(airportMaster.getDistrictCode()));
airportMaster.setDistrictName(trimToNull(airportMaster.getDistrictName()));
airportMaster.setRegionCode(trimToNull(airportMaster.getRegionCode()));
airportMaster.setRegionName(trimToNull(airportMaster.getRegionName()));
if (Func.isEmpty(airportMaster.getDistrictCode()) && Func.isNotEmpty(airportMaster.getRegionCode())) {
airportMaster.setDistrictCode(airportMaster.getRegionCode());
}
if (Func.isEmpty(airportMaster.getDistrictName()) && Func.isNotEmpty(airportMaster.getRegionName())) {
airportMaster.setDistrictName(airportMaster.getRegionName());
}
airportMaster.setDetailAddress(trimToNull(airportMaster.getDetailAddress()));
airportMaster.setRemark(trimToNull(airportMaster.getRemark()));
airportMaster.setDataSource(normalizeDataSource(Func.toStrWithEmpty(airportMaster.getDataSource(), defaultDataSource)));
@@ -205,12 +213,13 @@ public class AirportMasterServiceImpl extends BaseServiceImpl<AirportMasterMappe
validateLength(airportMaster.getShortName(), SHORT_NAME_MAX_LENGTH, "机场简称不能超过100字");
validateLength(airportMaster.getProvinceName(), REGION_NAME_MAX_LENGTH, "所属省份不能超过128字");
validateLength(airportMaster.getCityName(), REGION_NAME_MAX_LENGTH, "所属城市不能超过128字");
validateLength(airportMaster.getDistrictName(), REGION_NAME_MAX_LENGTH, "所属区县不能超过128字");
validateLength(airportMaster.getRegionCode(), REGION_CODE_MAX_LENGTH, "行政区划编码不能超过32字");
validateLength(airportMaster.getRegionName(), REGION_NAME_MAX_LENGTH, "行政区划不能超过128字");
validateLength(airportMaster.getDetailAddress(), DETAIL_ADDRESS_MAX_LENGTH, "详细地址不能超过255字");
validateLength(airportMaster.getRemark(), REMARK_MAX_LENGTH, "备注不能超过200字");
if (Func.isEmpty(airportMaster.getProvinceCode()) || Func.isEmpty(airportMaster.getCityCode())) {
throw new ServiceException("请选择省份城市");
if (Func.isEmpty(airportMaster.getProvinceCode()) || Func.isEmpty(airportMaster.getCityCode()) || Func.isEmpty(airportMaster.getDistrictCode())) {
throw new ServiceException("请选择省份城市和区县");
}
validateCoordinate(airportMaster.getLongitude(), MIN_LONGITUDE, MAX_LONGITUDE, "经度");
validateCoordinate(airportMaster.getLatitude(), MIN_LATITUDE, MAX_LATITUDE, "纬度");
@@ -254,8 +263,26 @@ public class AirportMasterServiceImpl extends BaseServiceImpl<AirportMasterMappe
airportMaster.setProvinceName(province.getName());
airportMaster.setCityCode(city.getCode());
airportMaster.setCityName(city.getName());
airportMaster.setRegionCode(city.getCode());
airportMaster.setRegionName(city.getName());
Region district = null;
if (Func.isNotEmpty(airportMaster.getDistrictCode())) {
district = regionService.getById(airportMaster.getDistrictCode());
}
if (Func.isEmpty(district) && Func.isNotEmpty(airportMaster.getDistrictName())) {
district = regionService.getOne(Wrappers.<Region>lambdaQuery()
.eq(Region::getParentCode, city.getCode())
.eq(Region::getName, airportMaster.getDistrictName()), false);
}
if (Func.isEmpty(district)) {
throw new ServiceException("请选择区县");
}
if (!Objects.equals(district.getParentCode(), city.getCode())) {
throw new ServiceException("所属区县与所属城市不匹配");
}
airportMaster.setDistrictCode(district.getCode());
airportMaster.setDistrictName(district.getName());
airportMaster.setRegionCode(district.getCode());
airportMaster.setRegionName(district.getName());
}
private void validateCoordinate(BigDecimal value, BigDecimal min, BigDecimal max, String name) {

View File

@@ -81,6 +81,11 @@ public class CurrencyServiceImpl extends BaseServiceImpl<CurrencyMapper, Currenc
prepare(currency, SOURCE_MANUAL);
validate(currency);
boolean result = saveOrUpdate(currency);
if (Func.isNotEmpty(currency.getId()) && Func.isEmpty(currency.getExchangeRate())) {
update(Wrappers.<Currency>lambdaUpdate()
.set(Currency::getExchangeRate, null)
.eq(Currency::getId, currency.getId()));
}
rebuildEnabledValidity(currency.getCode());
if (oldCurrency != null && !Objects.equals(oldCurrency.getCode(), currency.getCode())) {
rebuildEnabledValidity(oldCurrency.getCode());
@@ -205,14 +210,13 @@ public class CurrencyServiceImpl extends BaseServiceImpl<CurrencyMapper, Currenc
if (currency.getDecimalPlaces() < MIN_DECIMAL_PLACES || currency.getDecimalPlaces() > MAX_DECIMAL_PLACES) {
throw new ServiceException("小数位数范围为0到8");
}
if (Func.isEmpty(currency.getExchangeRate())) {
throw new ServiceException("汇率不能为空");
}
if (currency.getExchangeRate().compareTo(BigDecimal.ZERO) <= 0) {
throw new ServiceException("汇率必须大于0");
}
if (currency.getExchangeRate().stripTrailingZeros().scale() > EXCHANGE_RATE_SCALE) {
throw new ServiceException("汇率最多保留6位小数");
if (Func.isNotEmpty(currency.getExchangeRate())) {
if (currency.getExchangeRate().compareTo(BigDecimal.ZERO) <= 0) {
throw new ServiceException("汇率必须大于0");
}
if (currency.getExchangeRate().stripTrailingZeros().scale() > EXCHANGE_RATE_SCALE) {
throw new ServiceException("汇率最多保留6位小数");
}
}
if (Func.isEmpty(currency.getEffectiveDate())) {
throw new ServiceException("生效日期不能为空");

View File

@@ -50,6 +50,7 @@ public class FeeItemServiceImpl extends BaseServiceImpl<FeeItemMapper, FeeItem>
private static final int STATUS_ENABLED = 1;
private static final int STATUS_DISABLED = 2;
private static final int FEE_CATEGORY_MAX_LENGTH = 50;
private static final int NAME_MAX_LENGTH = 50;
private static final int ENGLISH_NAME_MAX_LENGTH = 100;
@@ -86,6 +87,7 @@ public class FeeItemServiceImpl extends BaseServiceImpl<FeeItemMapper, FeeItem>
}
private void prepare(FeeItem feeItem) {
feeItem.setFeeCategory(trimToEmpty(feeItem.getFeeCategory()));
feeItem.setName(trimToEmpty(feeItem.getName()));
feeItem.setEnglishName(trimToNull(feeItem.getEnglishName()));
if (Func.isEmpty(feeItem.getStatus())) {
@@ -94,14 +96,20 @@ public class FeeItemServiceImpl extends BaseServiceImpl<FeeItemMapper, FeeItem>
}
private void validate(FeeItem feeItem) {
if (Func.isEmpty(feeItem.getFeeCategory())) {
throw new ServiceException("费用类型不能为空");
}
if (feeItem.getFeeCategory().length() > FEE_CATEGORY_MAX_LENGTH) {
throw new ServiceException("费用类型不能超过50字");
}
if (Func.isEmpty(feeItem.getName())) {
throw new ServiceException("中文名称不能为空");
throw new ServiceException("费用项不能为空");
}
if (feeItem.getName().length() > NAME_MAX_LENGTH) {
throw new ServiceException("中文名称不能超过50字");
throw new ServiceException("费用项不能超过50字");
}
if (Func.isNotEmpty(feeItem.getEnglishName()) && feeItem.getEnglishName().length() > ENGLISH_NAME_MAX_LENGTH) {
throw new ServiceException("英文名称不能超过100字");
throw new ServiceException("费用项代码不能超过100字");
}
validateUniqueName(feeItem);
}
@@ -114,7 +122,7 @@ public class FeeItemServiceImpl extends BaseServiceImpl<FeeItemMapper, FeeItem>
queryWrapper.ne(FeeItem::getId, feeItem.getId());
}
if (count(queryWrapper) > 0L) {
throw new ServiceException("中文名称已存在");
throw new ServiceException("费用项已存在");
}
}

View File

@@ -29,6 +29,7 @@ import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.AllArgsConstructor;
import org.springblade.core.log.exception.ServiceException;
import org.springblade.core.mp.base.BaseServiceImpl;
import org.springblade.core.tool.utils.BeanUtil;
@@ -36,8 +37,10 @@ import org.springblade.core.tool.utils.Func;
import org.springblade.system.excel.PortTerminalExcel;
import org.springblade.system.mapper.PortTerminalMapper;
import org.springblade.system.pojo.entity.PortTerminal;
import org.springblade.system.pojo.entity.Region;
import org.springblade.system.pojo.vo.PortTerminalVO;
import org.springblade.system.service.IPortTerminalService;
import org.springblade.system.service.IRegionService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -55,6 +58,7 @@ import java.util.regex.Pattern;
* @author Chill
*/
@Service
@AllArgsConstructor
public class PortTerminalServiceImpl extends BaseServiceImpl<PortTerminalMapper, PortTerminal> implements IPortTerminalService {
private static final String CATEGORY_PORT = "港口";
@@ -78,6 +82,8 @@ public class PortTerminalServiceImpl extends BaseServiceImpl<PortTerminalMapper,
private static final Pattern PORT_CODE_PATTERN = Pattern.compile("^[A-Z]{5}$");
private static final Pattern TERMINAL_CODE_PATTERN = Pattern.compile("^[A-Z]{5}-[A-Z0-9]+$");
private final IRegionService regionService;
@Override
public IPage<PortTerminalVO> selectPortTerminalPage(IPage<PortTerminalVO> page, PortTerminalVO portTerminal) {
return page.setRecords(baseMapper.selectPortTerminalPage(page, portTerminal));
@@ -152,6 +158,7 @@ public class PortTerminalServiceImpl extends BaseServiceImpl<PortTerminalMapper,
List<PortTerminal> portTerminalList = list(queryWrapper);
return portTerminalList.stream().map(portTerminal -> {
PortTerminalExcel excel = Objects.requireNonNull(BeanUtil.copyProperties(portTerminal, PortTerminalExcel.class));
excel.setRegionCode(portTerminal.getDistrictCode());
excel.setLongitude(scaleCoordinate(portTerminal.getLongitude(), MIN_LONGITUDE, MAX_LONGITUDE));
excel.setLatitude(scaleCoordinate(portTerminal.getLatitude(), MIN_LATITUDE, MAX_LATITUDE));
excel.setDataSource(normalizeDataSource(portTerminal.getDataSource()));
@@ -173,7 +180,12 @@ public class PortTerminalServiceImpl extends BaseServiceImpl<PortTerminalMapper,
portTerminal.setName(trimToEmpty(portTerminal.getName()));
portTerminal.setCountry(trimToEmpty(portTerminal.getCountry()));
portTerminal.setCity(trimToEmpty(portTerminal.getCity()));
portTerminal.setDistrictCode(trimToNull(portTerminal.getDistrictCode()));
portTerminal.setDistrictName(trimToNull(portTerminal.getDistrictName()));
portTerminal.setRegionCode(trimToNull(portTerminal.getRegionCode()));
if (Func.isEmpty(portTerminal.getDistrictCode()) && Func.isNotEmpty(portTerminal.getRegionCode())) {
portTerminal.setDistrictCode(portTerminal.getRegionCode());
}
portTerminal.setDetailAddress(trimToNull(portTerminal.getDetailAddress()));
portTerminal.setRemark(trimToNull(portTerminal.getRemark()));
portTerminal.setDataSource(normalizeDataSource(Func.toStrWithEmpty(portTerminal.getDataSource(), defaultDataSource)));
@@ -181,6 +193,7 @@ public class PortTerminalServiceImpl extends BaseServiceImpl<PortTerminalMapper,
portTerminal.setStatus(STATUS_ENABLED);
}
if (CATEGORY_PORT.equals(portTerminal.getCategory())) {
fillRegion(portTerminal);
portTerminal.setParentId(null);
portTerminal.setParentCode(null);
portTerminal.setParentName(null);
@@ -211,7 +224,50 @@ public class PortTerminalServiceImpl extends BaseServiceImpl<PortTerminalMapper,
portTerminal.setParentName(parent.getName());
portTerminal.setCountry(parent.getCountry());
portTerminal.setCity(parent.getCity());
portTerminal.setRegionCode(parent.getRegionCode());
portTerminal.setDistrictCode(parent.getDistrictCode());
portTerminal.setDistrictName(parent.getDistrictName());
portTerminal.setRegionCode(parent.getDistrictCode());
}
private void fillRegion(PortTerminal portTerminal) {
Region district = null;
if (Func.isNotEmpty(portTerminal.getDistrictCode())) {
district = regionService.getById(portTerminal.getDistrictCode());
}
if (Func.isEmpty(district) && Func.isNotEmpty(portTerminal.getDistrictName())) {
if (Func.isNotEmpty(portTerminal.getCity())) {
List<Region> cityList = regionService.list(Wrappers.<Region>lambdaQuery()
.eq(Region::getName, portTerminal.getCity())
.eq(Region::getRegionLevel, 2));
for (Region city : cityList) {
district = regionService.getOne(Wrappers.<Region>lambdaQuery()
.eq(Region::getParentCode, city.getCode())
.eq(Region::getName, portTerminal.getDistrictName()), false);
if (Func.isNotEmpty(district)) {
break;
}
}
}
if (Func.isEmpty(district)) {
district = regionService.getOne(Wrappers.<Region>lambdaQuery()
.eq(Region::getName, portTerminal.getDistrictName())
.eq(Region::getRegionLevel, 3), false);
}
}
if (Func.isEmpty(district)) {
throw new ServiceException("请选择区县");
}
Region city = regionService.getById(district.getParentCode());
if (Func.isEmpty(city)) {
throw new ServiceException("区县所属城市不存在");
}
if (Func.isNotEmpty(portTerminal.getCity()) && !Objects.equals(portTerminal.getCity(), city.getName())) {
throw new ServiceException("区县与城市不匹配");
}
portTerminal.setCity(city.getName());
portTerminal.setDistrictCode(district.getCode());
portTerminal.setDistrictName(district.getName());
portTerminal.setRegionCode(district.getCode());
}
private void validate(PortTerminal portTerminal) {
@@ -228,6 +284,7 @@ public class PortTerminalServiceImpl extends BaseServiceImpl<PortTerminalMapper,
validateLength(portTerminal.getName(), NAME_MAX_LENGTH, "港口/码头名称不能超过100字");
validateLength(portTerminal.getCountry(), REGION_MAX_LENGTH, "国家不能超过50字");
validateLength(portTerminal.getCity(), REGION_MAX_LENGTH, "城市不能超过50字");
validateLength(portTerminal.getDistrictName(), REGION_MAX_LENGTH, "区县不能超过50字");
validateLength(portTerminal.getRegionCode(), REGION_CODE_MAX_LENGTH, "行政区划编码不能超过32字");
validateLength(portTerminal.getDetailAddress(), DETAIL_ADDRESS_MAX_LENGTH, "详细地址不能超过255字");
validateLength(portTerminal.getRemark(), REMARK_MAX_LENGTH, "备注不能超过200个字");
@@ -246,6 +303,9 @@ public class PortTerminalServiceImpl extends BaseServiceImpl<PortTerminalMapper,
if (Func.isEmpty(portTerminal.getCity())) {
throw new ServiceException("城市不能为空");
}
if (Func.isEmpty(portTerminal.getDistrictCode())) {
throw new ServiceException("区县不能为空");
}
validateDataSource(portTerminal.getDataSource());
validateStatus(portTerminal.getStatus());
validateRange(portTerminal.getLongitude(), MIN_LONGITUDE, MAX_LONGITUDE, "经度范围为 -180 到 180");

View File

@@ -131,6 +131,8 @@ public class RailwayStationServiceImpl extends BaseServiceImpl<RailwayStationMap
RailwayStationExcel excel = data.get(index);
try {
RailwayStation railwayStation = Objects.requireNonNull(BeanUtil.copyProperties(excel, RailwayStation.class));
railwayStation.setLongitude(parseCoordinate(excel.getLongitude(), "经度"));
railwayStation.setLatitude(parseCoordinate(excel.getLatitude(), "纬度"));
railwayStation.setDataSource(SOURCE_BATCH);
railwayStation.setStatus(STATUS_ENABLED);
prepare(railwayStation, SOURCE_BATCH);
@@ -151,19 +153,31 @@ public class RailwayStationServiceImpl extends BaseServiceImpl<RailwayStationMap
List<RailwayStation> railwayStationList = list(queryWrapper);
return railwayStationList.stream().map(railwayStation -> {
RailwayStationExcel excel = Objects.requireNonNull(BeanUtil.copyProperties(railwayStation, RailwayStationExcel.class));
excel.setLongitude(scaleCoordinate(railwayStation.getLongitude(), MIN_LONGITUDE, MAX_LONGITUDE));
excel.setLatitude(scaleCoordinate(railwayStation.getLatitude(), MIN_LATITUDE, MAX_LATITUDE));
excel.setLongitude(formatCoordinate(railwayStation.getLongitude(), MIN_LONGITUDE, MAX_LONGITUDE));
excel.setLatitude(formatCoordinate(railwayStation.getLatitude(), MIN_LATITUDE, MAX_LATITUDE));
excel.setDataSource(normalizeDataSource(railwayStation.getDataSource()));
excel.setStatusName(Objects.equals(railwayStation.getStatus(), STATUS_ENABLED) ? "启用" : "停用");
return excel;
}).toList();
}
private BigDecimal scaleCoordinate(BigDecimal value, BigDecimal min, BigDecimal max) {
private String formatCoordinate(BigDecimal value, BigDecimal min, BigDecimal max) {
if (Func.isEmpty(value)) {
return null;
}
return validRange(value, min, max) ? value.setScale(6, RoundingMode.HALF_UP) : null;
return validRange(value, min, max) ? value.setScale(6, RoundingMode.HALF_UP).toPlainString() : null;
}
private BigDecimal parseCoordinate(String value, String name) {
String trimValue = trimToEmpty(value);
if (trimValue.isEmpty()) {
return null;
}
try {
return new BigDecimal(trimValue);
} catch (NumberFormatException exception) {
throw new ServiceException(name + "格式不正确");
}
}
private void prepare(RailwayStation railwayStation, String defaultDataSource) {
@@ -176,8 +190,16 @@ public class RailwayStationServiceImpl extends BaseServiceImpl<RailwayStationMap
railwayStation.setProvinceName(trimToNull(railwayStation.getProvinceName()));
railwayStation.setCityCode(trimToNull(railwayStation.getCityCode()));
railwayStation.setCityName(trimToNull(railwayStation.getCityName()));
railwayStation.setDistrictCode(trimToNull(railwayStation.getDistrictCode()));
railwayStation.setDistrictName(trimToNull(railwayStation.getDistrictName()));
railwayStation.setRegionCode(trimToNull(railwayStation.getRegionCode()));
railwayStation.setRegionName(trimToNull(railwayStation.getRegionName()));
if (Func.isEmpty(railwayStation.getDistrictCode()) && Func.isNotEmpty(railwayStation.getRegionCode())) {
railwayStation.setDistrictCode(railwayStation.getRegionCode());
}
if (Func.isEmpty(railwayStation.getDistrictName()) && Func.isNotEmpty(railwayStation.getRegionName())) {
railwayStation.setDistrictName(railwayStation.getRegionName());
}
railwayStation.setDetailAddress(trimToNull(railwayStation.getDetailAddress()));
railwayStation.setRemark(trimToNull(railwayStation.getRemark()));
railwayStation.setDataSource(normalizeDataSource(Func.toStrWithEmpty(railwayStation.getDataSource(), defaultDataSource)));
@@ -208,12 +230,13 @@ public class RailwayStationServiceImpl extends BaseServiceImpl<RailwayStationMap
// validateLength(railwayStation.getRailwayLine(), RAILWAY_LINE_MAX_LENGTH, "所属铁路线路不能超过100字");
validateLength(railwayStation.getProvinceName(), REGION_NAME_MAX_LENGTH, "所属省份不能超过128字");
validateLength(railwayStation.getCityName(), REGION_NAME_MAX_LENGTH, "所属城市不能超过128字");
validateLength(railwayStation.getDistrictName(), REGION_NAME_MAX_LENGTH, "所属区县不能超过128字");
validateLength(railwayStation.getRegionCode(), REGION_CODE_MAX_LENGTH, "行政区划编码不能超过32字");
validateLength(railwayStation.getRegionName(), REGION_NAME_MAX_LENGTH, "行政区划不能超过128字");
validateLength(railwayStation.getDetailAddress(), DETAIL_ADDRESS_MAX_LENGTH, "详细地址不能超过255字");
validateLength(railwayStation.getRemark(), REMARK_MAX_LENGTH, "备注不能超过200字");
if (Func.isEmpty(railwayStation.getProvinceCode()) || Func.isEmpty(railwayStation.getCityCode())) {
throw new ServiceException("请选择省份城市");
if (Func.isEmpty(railwayStation.getProvinceCode()) || Func.isEmpty(railwayStation.getCityCode()) || Func.isEmpty(railwayStation.getDistrictCode())) {
throw new ServiceException("请选择省份城市和区县");
}
validateCoordinate(railwayStation.getLongitude(), MIN_LONGITUDE, MAX_LONGITUDE, "经度");
validateCoordinate(railwayStation.getLatitude(), MIN_LATITUDE, MAX_LATITUDE, "纬度");
@@ -257,8 +280,26 @@ public class RailwayStationServiceImpl extends BaseServiceImpl<RailwayStationMap
railwayStation.setProvinceName(province.getName());
railwayStation.setCityCode(city.getCode());
railwayStation.setCityName(city.getName());
railwayStation.setRegionCode(city.getCode());
railwayStation.setRegionName(city.getName());
Region district = null;
if (Func.isNotEmpty(railwayStation.getDistrictCode())) {
district = regionService.getById(railwayStation.getDistrictCode());
}
if (Func.isEmpty(district) && Func.isNotEmpty(railwayStation.getDistrictName())) {
district = regionService.getOne(Wrappers.<Region>lambdaQuery()
.eq(Region::getParentCode, city.getCode())
.eq(Region::getName, railwayStation.getDistrictName()), false);
}
if (Func.isEmpty(district)) {
throw new ServiceException("请选择区县");
}
if (!Objects.equals(district.getParentCode(), city.getCode())) {
throw new ServiceException("所属区县与所属城市不匹配");
}
railwayStation.setDistrictCode(district.getCode());
railwayStation.setDistrictName(district.getName());
railwayStation.setRegionCode(district.getCode());
railwayStation.setRegionName(district.getName());
}
private void validateCoordinate(BigDecimal value, BigDecimal min, BigDecimal max, String name) {

View File

@@ -76,11 +76,7 @@ public class RegionServiceImpl extends ServiceImpl<RegionMapper, Region> impleme
region.setCode(StringUtil.removePrefix(region.getCode(), MAIN_CODE));
}
}
// 查询是否已存在
Long cnt = baseMapper.selectCount(Wrappers.<Region>query().lambda().eq(Region::getCode, region.getCode()));
if (cnt > 0L) {
return this.updateById(region);
}
validateUniqueCode(region);
// 设置祖区划编号
Region parent = getByCode(region.getParentCode());
if (Func.isNotEmpty(parent) && Func.isNotEmpty(parent.getCode())) {
@@ -110,7 +106,22 @@ public class RegionServiceImpl extends ServiceImpl<RegionMapper, Region> impleme
region.setVillageCode(code);
region.setVillageName(name);
}
return this.save(region);
return StringUtil.isNotBlank(region.getOriginalCode()) ? this.updateById(region) : this.save(region);
}
private void validateUniqueCode(Region region) {
String originalCode = region.getOriginalCode();
String code = region.getCode();
Region existRegion = this.getById(code);
if (Func.isEmpty(existRegion)) {
if (StringUtil.isNotBlank(originalCode) && !StringUtil.equals(code, originalCode)) {
throw new ServiceException("区划编号不允许修改");
}
return;
}
if (StringUtil.isBlank(originalCode) || !StringUtil.equals(code, originalCode)) {
throw new ServiceException("该区划编号已存在");
}
}
@Override

View File

@@ -47,6 +47,7 @@ public class AirportMasterWrapper extends BaseEntityWrapper<AirportMaster, Airpo
@Override
public AirportMasterVO entityVO(AirportMaster airportMaster) {
AirportMasterVO airportMasterVO = Objects.requireNonNull(BeanUtil.copyProperties(airportMaster, AirportMasterVO.class));
airportMasterVO.setRegionCode(airportMaster.getDistrictCode());
airportMasterVO.setUpdateUserName(UserCache.getUserRealName(airportMaster.getUpdateUser()));
return airportMasterVO;
}

View File

@@ -47,6 +47,7 @@ public class PortTerminalWrapper extends BaseEntityWrapper<PortTerminal, PortTer
@Override
public PortTerminalVO entityVO(PortTerminal portTerminal) {
PortTerminalVO portTerminalVO = Objects.requireNonNull(BeanUtil.copyProperties(portTerminal, PortTerminalVO.class));
portTerminalVO.setRegionCode(portTerminal.getDistrictCode());
portTerminalVO.setUpdateUserName(UserCache.getUserRealName(portTerminal.getUpdateUser()));
return portTerminalVO;
}

View File

@@ -47,6 +47,7 @@ public class RailwayStationWrapper extends BaseEntityWrapper<RailwayStation, Rai
@Override
public RailwayStationVO entityVO(RailwayStation railwayStation) {
RailwayStationVO railwayStationVO = Objects.requireNonNull(BeanUtil.copyProperties(railwayStation, RailwayStationVO.class));
railwayStationVO.setRegionCode(railwayStation.getDistrictCode());
railwayStationVO.setUpdateUserName(UserCache.getUserRealName(railwayStation.getUpdateUser()));
return railwayStationVO;
}

View File

@@ -27,6 +27,7 @@ package org.springblade.transport.excel;
import cn.idev.excel.annotation.ExcelIgnore;
import cn.idev.excel.annotation.ExcelProperty;
import cn.idev.excel.annotation.format.NumberFormat;
import cn.idev.excel.annotation.write.style.ColumnWidth;
import cn.idev.excel.annotation.write.style.ContentRowHeight;
import cn.idev.excel.annotation.write.style.HeadRowHeight;
@@ -72,9 +73,11 @@ public class AccidentRecordExcel implements Serializable {
private String accidentResponsibility;
@ExcelProperty("直接经济损失")
@NumberFormat("0.00")
private BigDecimal directEconomicLoss;
@ExcelProperty("保险理赔金额")
@NumberFormat("0.00")
private BigDecimal insuranceClaimAmount;
@ExcelProperty("事故原因及损坏情况")

View File

@@ -27,6 +27,7 @@ package org.springblade.transport.excel;
import cn.idev.excel.annotation.ExcelIgnore;
import cn.idev.excel.annotation.ExcelProperty;
import cn.idev.excel.annotation.format.NumberFormat;
import cn.idev.excel.annotation.write.style.ColumnWidth;
import cn.idev.excel.annotation.write.style.ContentRowHeight;
import cn.idev.excel.annotation.write.style.HeadRowHeight;
@@ -75,6 +76,7 @@ public class MaintenancePlanExcel implements Serializable {
private String maintenanceItem;
@ExcelProperty("费用")
@NumberFormat("0.00")
private BigDecimal cost;
@ExcelProperty("店名")

View File

@@ -27,6 +27,7 @@ package org.springblade.transport.excel;
import cn.idev.excel.annotation.ExcelIgnore;
import cn.idev.excel.annotation.ExcelProperty;
import cn.idev.excel.annotation.format.NumberFormat;
import cn.idev.excel.annotation.write.style.ColumnWidth;
import cn.idev.excel.annotation.write.style.ContentRowHeight;
import cn.idev.excel.annotation.write.style.HeadRowHeight;
@@ -72,6 +73,7 @@ public class MaintenanceRecordExcel implements Serializable {
private String replacedPart;
@ExcelProperty("费用")
@NumberFormat("0.00")
private BigDecimal cost;
@ExcelProperty("维修单位")
@@ -87,6 +89,7 @@ public class MaintenanceRecordExcel implements Serializable {
private LocalDateTime factoryTime;
@ExcelProperty("里程/航程数")
@NumberFormat("0.00")
private BigDecimal mileage;
@ExcelProperty("里程单位")

View File

@@ -27,6 +27,7 @@ package org.springblade.transport.excel;
import cn.idev.excel.annotation.ExcelIgnore;
import cn.idev.excel.annotation.ExcelProperty;
import cn.idev.excel.annotation.format.NumberFormat;
import cn.idev.excel.annotation.write.style.ColumnWidth;
import cn.idev.excel.annotation.write.style.ContentRowHeight;
import cn.idev.excel.annotation.write.style.HeadRowHeight;
@@ -59,15 +60,19 @@ public class MileageRecordExcel implements Serializable {
private String vehicleNo;
@ExcelProperty("上月统计里程")
@NumberFormat("0.00")
private BigDecimal previousMonthMileage;
@ExcelProperty("本月统计里程")
@NumberFormat("0.00")
private BigDecimal currentMonthMileage;
@ExcelProperty("本月行驶里程")
@NumberFormat("0.00")
private BigDecimal monthlyMileage;
@ExcelProperty("累计行驶里程")
@NumberFormat("0.00")
private BigDecimal totalMileage;
@ExcelProperty("里程单位")

View File

@@ -27,6 +27,7 @@ package org.springblade.transport.excel;
import cn.idev.excel.annotation.ExcelIgnore;
import cn.idev.excel.annotation.ExcelProperty;
import cn.idev.excel.annotation.format.NumberFormat;
import cn.idev.excel.annotation.write.style.ColumnWidth;
import cn.idev.excel.annotation.write.style.ContentRowHeight;
import cn.idev.excel.annotation.write.style.HeadRowHeight;
@@ -69,6 +70,7 @@ public class TireReplacementRecordExcel implements Serializable {
private Integer tireQuantity;
@ExcelProperty("换胎费用")
@NumberFormat("0.00")
private BigDecimal replacementCost;
@ExcelProperty("换胎说明")

View File

@@ -60,7 +60,7 @@
<bind name="etcCardNoLike" value="'%' + etcRecord.etcCardNo + '%'"/>
AND etc_card_no LIKE #{etcCardNoLike}
</if>
ORDER BY exit_time DESC, create_time DESC
ORDER BY create_time DESC
</select>
</mapper>

View File

@@ -90,7 +90,7 @@
<if test="oilElectricRecord.createTimeEnd != null and oilElectricRecord.createTimeEnd != ''">
AND create_time &lt;= #{oilElectricRecord.createTimeEnd}
</if>
ORDER BY transaction_time DESC, create_time DESC
ORDER BY create_time DESC
</select>
</mapper>

View File

@@ -70,7 +70,7 @@
<if test="otherExpenseRecord.createTimeEnd != null and otherExpenseRecord.createTimeEnd != ''">
AND create_time &lt;= #{otherExpenseRecord.createTimeEnd}
</if>
ORDER BY expense_date DESC, create_time DESC
ORDER BY create_time DESC
</select>
</mapper>

View File

@@ -40,6 +40,7 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
@@ -96,7 +97,8 @@ public class MaintenanceRecordServiceImpl extends BaseServiceImpl<MaintenanceRec
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()));
excel.setCost(scaleAmount(maintenanceRecord.getCost()));
excel.setMileage(scaleAmount(nonNegative(maintenanceRecord.getMileage())));
if (Func.isEmpty(excel.getMileageUnit())) {
excel.setMileageUnit(defaultMileageUnit(maintenanceRecord.getVehicleType()));
}
@@ -167,6 +169,10 @@ public class MaintenanceRecordServiceImpl extends BaseServiceImpl<MaintenanceRec
return BigDecimal.ZERO;
}
private BigDecimal scaleAmount(BigDecimal value) {
return Func.isEmpty(value) ? null : value.setScale(2, RoundingMode.HALF_UP);
}
private String defaultMileageUnit(String vehicleType) {
return "船舶".equals(vehicleType) ? "海里" : "公里";
}