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
+9 -2
View File
@@ -195,6 +195,7 @@ Entity 基类的选择**直接决定** Service 和 ServiceImpl 的继承方式
- 简单查询使用 `LambdaQueryWrapper`,复杂查询写在 Mapper XML 中
- Mapper XML 与接口**同包**放置(`src/main/java` 下)
- 分页统一使用 `Condition.getPage(query)` + `Condition.getQueryWrapper()`
- 表格的排序默认按照创建时间降序;后端分页 SQL 或 QueryWrapper 应默认使用 `create_time DESC` / `orderByDesc(Xxx::getCreateTime)`,除非用户明确要求业务字段优先排序。
- 禁止 JDBC 直连查询
### 6.9 审计字段展示
@@ -204,7 +205,13 @@ Entity 基类的选择**直接决定** Service 和 ServiceImpl 的继承方式
- Entity → VO 转换统一在 `XxxWrapper` 中完成;审计人姓名通过 `UserCache.getUserRealName(userId)` 获取,优先返回用户真实姓名,缓存未命中时兜底返回用户 ID。
- Controller 不应在列表、详情方法中重复编写审计人翻译逻辑,避免各模块显示规则不一致。
### 6.10 日志
### 6.10 导出数据格式
- 导出 Excel、CSV 等文件时,金额类字段必须保留 2 位小数;即使原始数据为整数,也应导出为 `0.00` 形式。
- 导出经度、纬度字段时必须保留 6 位小数;导出前仍需遵守经度 `-180 ~ 180`、纬度 `-90 ~ 90` 的有效范围约束。
- 精度格式化应在导出 DTO/Excel 模型、导出组装逻辑或专用格式化工具中完成,禁止只依赖前端展示格式。
### 6.11 日志
- 使用 `@Slf4j`,占位符传参(禁止字符串拼接)
- 包含关键业务标识,异常必须携带堆栈,禁止打印敏感信息
@@ -344,4 +351,4 @@ id parent_id code name alias path source sort category action is_open component
2075431753298714626 2075431169720033282 airport_master_status airport_master_status 1 2 0 1 0
2075431820189474818 2075431169720033282 airport_master_add airport_master_add 1 2 0 1 0
```
2.生成的表、字段的排序规则要使用utf8mb4_general_ci
2.生成的表、字段的排序规则要使用utf8mb4_general_ci
@@ -25,6 +25,7 @@
*/
package org.springblade.system.pojo.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@@ -93,9 +94,20 @@ public class AirportMaster extends BaseEntity {
*/
@Schema(description = "所属城市")
private String cityName;
/**
* 所属区县编码
*/
@Schema(description = "所属区县编码")
private String districtCode;
/**
* 所属区县
*/
@Schema(description = "所属区县")
private String districtName;
/**
* 行政区划编码
*/
@TableField(exist = false)
@Schema(description = "行政区划编码")
private String regionCode;
/**
@@ -95,6 +95,7 @@ public class Currency extends BaseEntity {
/**
* 是否本位币
*/
@TableField("is_base_currency")
@Schema(description = "是否本位币")
private Integer baseCurrency;
/**
@@ -48,14 +48,19 @@ public class FeeItem extends BaseEntity {
private static final long serialVersionUID = 1L;
/**
* 中文名称
* 费用类型
*/
@Schema(description = "中文名称")
@Schema(description = "费用类型")
private String feeCategory;
/**
* 费用项
*/
@Schema(description = "费用项")
private String name;
/**
* 英文名称
* 费用项代码
*/
@Schema(description = "英文名称")
@Schema(description = "费用项代码")
private String englishName;
}
@@ -25,6 +25,7 @@
*/
package org.springblade.system.pojo.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@@ -88,9 +89,20 @@ public class PortTerminal extends BaseEntity {
*/
@Schema(description = "城市")
private String city;
/**
* 区县编码
*/
@Schema(description = "区县编码")
private String districtCode;
/**
* 区县
*/
@Schema(description = "区县")
private String districtName;
/**
* 行政区划编码
*/
@TableField(exist = false)
@Schema(description = "行政区划编码")
private String regionCode;
/**
@@ -25,6 +25,7 @@
*/
package org.springblade.system.pojo.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@@ -93,9 +94,20 @@ public class RailwayStation extends BaseEntity {
*/
@Schema(description = "所属城市")
private String cityName;
/**
* 所属区县编码
*/
@Schema(description = "所属区县编码")
private String districtCode;
/**
* 所属区县
*/
@Schema(description = "所属区县")
private String districtName;
/**
* 行政区划编码
*/
@TableField(exist = false)
@Schema(description = "行政区划编码")
private String regionCode;
/**
@@ -27,6 +27,7 @@ package org.springblade.system.pojo.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@@ -134,5 +135,12 @@ public class Region implements Serializable {
@Schema(description = "备注")
private String remark;
/**
* 原区划编号
*/
@TableField(exist = false)
@Schema(description = "原区划编号")
private String originalCode;
}
@@ -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);
}
}
}
@@ -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)) {
@@ -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)) {
@@ -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);
}
@@ -74,6 +74,9 @@ public class AirportMasterExcel implements Serializable {
@ExcelProperty("所属城市")
private String cityName;
@ExcelProperty("所属区县")
private String districtName;
@ExcelProperty("行政区划")
private String regionName;
@@ -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("数据来源")
@@ -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;
@@ -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>
@@ -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>
@@ -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>
@@ -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>
@@ -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>
@@ -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>
@@ -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">
@@ -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) {
@@ -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("生效日期不能为空");
@@ -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("费用项已存在");
}
}
@@ -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");
@@ -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) {
@@ -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
@@ -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;
}
@@ -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;
}
@@ -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;
}
@@ -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("事故原因及损坏情况")
@@ -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("店名")
@@ -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("里程单位")
@@ -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("里程单位")
@@ -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("换胎说明")
@@ -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>
@@ -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>
@@ -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>
@@ -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) ? "海里" : "公里";
}
@@ -2413,7 +2413,8 @@ CREATE TABLE "blade_port_terminal" (
"parent_name" varchar(100),
"country" varchar(50),
"city" varchar(50),
"region_code" varchar(32),
"district_code" varchar(12),
"district_name" varchar(50),
"detail_address" varchar(255),
"longitude" numeric(12,6),
"latitude" numeric(12,6),
@@ -2448,6 +2449,9 @@ CREATE TABLE "blade_railway_station" (
"province_name" varchar(128),
"city_code" varchar(12),
"city_name" varchar(128),
"district_code" varchar(12),
"district_name" varchar(128),
"region_name" varchar(128),
"longitude" numeric(12,6),
"latitude" numeric(12,6),
"data_source" varchar(20) DEFAULT '手工导入',
@@ -2482,6 +2486,9 @@ CREATE TABLE "blade_airport_master" (
"province_name" varchar(128),
"city_code" varchar(12),
"city_name" varchar(128),
"district_code" varchar(12),
"district_name" varchar(128),
"region_name" varchar(128),
"longitude" numeric(12,6),
"latitude" numeric(12,6),
"data_source" varchar(20) DEFAULT '手工导入',
+8 -1
View File
@@ -1481,7 +1481,8 @@ CREATE TABLE `blade_port_terminal` (
`parent_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '上级港口名称',
`country` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '国家',
`city` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '城市',
`region_code` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '行政区划编码',
`district_code` varchar(12) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '区县编码',
`district_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '区县',
`detail_address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '详细地址',
`longitude` decimal(12,6) NULL DEFAULT NULL COMMENT '经度',
`latitude` decimal(12,6) NULL DEFAULT NULL COMMENT '纬度',
@@ -1530,6 +1531,9 @@ CREATE TABLE `blade_railway_station` (
`province_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '所属省份',
`city_code` varchar(12) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '所属城市编码',
`city_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '所属城市',
`district_code` varchar(12) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '所属区县编码',
`district_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '所属区县',
`region_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '行政区划',
`longitude` decimal(12,6) NULL DEFAULT NULL COMMENT '经度',
`latitude` decimal(12,6) NULL DEFAULT NULL COMMENT '纬度',
`data_source` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '手动' COMMENT '数据来源',
@@ -1578,6 +1582,9 @@ CREATE TABLE `blade_airport_master` (
`province_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '所属省份',
`city_code` varchar(12) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '所属城市编码',
`city_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '所属城市',
`district_code` varchar(12) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '所属区县编码',
`district_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '所属区县',
`region_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '行政区划',
`longitude` decimal(12,6) NULL DEFAULT NULL COMMENT '经度',
`latitude` decimal(12,6) NULL DEFAULT NULL COMMENT '纬度',
`data_source` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '手动录入' COMMENT '数据来源',
@@ -2413,7 +2413,8 @@ CREATE TABLE "blade_port_terminal" (
"parent_name" varchar(100),
"country" varchar(50),
"city" varchar(50),
"region_code" varchar(32),
"district_code" varchar(12),
"district_name" varchar(50),
"detail_address" varchar(255),
"longitude" numeric(12,6),
"latitude" numeric(12,6),
@@ -2448,6 +2449,9 @@ CREATE TABLE "blade_railway_station" (
"province_name" varchar(128),
"city_code" varchar(12),
"city_name" varchar(128),
"district_code" varchar(12),
"district_name" varchar(128),
"region_name" varchar(128),
"longitude" numeric(12,6),
"latitude" numeric(12,6),
"data_source" varchar(20) DEFAULT '手工导入',
@@ -2482,6 +2486,9 @@ CREATE TABLE "blade_airport_master" (
"province_name" varchar(128),
"city_code" varchar(12),
"city_name" varchar(128),
"district_code" varchar(12),
"district_name" varchar(128),
"region_name" varchar(128),
"longitude" numeric(12,6),
"latitude" numeric(12,6),
"data_source" varchar(20) DEFAULT '手工导入',
@@ -7558,7 +7558,8 @@ CREATE TABLE [dbo].[blade_port_terminal] (
[parent_name] nvarchar(100) NULL,
[country] nvarchar(50) NULL,
[city] nvarchar(50) NULL,
[region_code] nvarchar(32) NULL,
[district_code] nvarchar(12) NULL,
[district_name] nvarchar(50) NULL,
[detail_address] nvarchar(255) NULL,
[longitude] decimal(12,6) NULL,
[latitude] decimal(12,6) NULL,
@@ -7598,6 +7599,9 @@ CREATE TABLE [dbo].[blade_railway_station] (
[province_name] nvarchar(128) NULL,
[city_code] nvarchar(12) NULL,
[city_name] nvarchar(128) NULL,
[district_code] nvarchar(12) NULL,
[district_name] nvarchar(128) NULL,
[region_name] nvarchar(128) NULL,
[longitude] decimal(12,6) NULL,
[latitude] decimal(12,6) NULL,
[data_source] nvarchar(20) DEFAULT '手工导入' NULL,
@@ -7636,6 +7640,9 @@ CREATE TABLE [dbo].[blade_airport_master] (
[province_name] nvarchar(128) NULL,
[city_code] nvarchar(12) NULL,
[city_name] nvarchar(128) NULL,
[district_code] nvarchar(12) NULL,
[district_name] nvarchar(128) NULL,
[region_name] nvarchar(128) NULL,
[longitude] decimal(12,6) NULL,
[latitude] decimal(12,6) NULL,
[data_source] nvarchar(20) DEFAULT '手工导入' NULL,
@@ -13,6 +13,10 @@ CREATE TABLE `blade_airport_master` (
`province_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '所属省份',
`city_code` varchar(12) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '所属城市编码',
`city_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '所属城市',
`district_code` varchar(12) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '所属区县编码',
`district_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '所属区县',
`region_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '行政区划',
`detail_address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '详细地址',
`longitude` decimal(12,6) NULL DEFAULT NULL COMMENT '经度',
`latitude` decimal(12,6) NULL DEFAULT NULL COMMENT '纬度',
`data_source` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '手动录入' COMMENT '数据来源',
+4 -2
View File
@@ -4,8 +4,9 @@
DROP TABLE IF EXISTS `blade_fee_item`;
CREATE TABLE `blade_fee_item` (
`id` bigint NOT NULL COMMENT '主键',
`name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '中文名称',
`english_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '英文名称',
`fee_category` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '费用类型',
`name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '费用项',
`english_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '费用项代码',
`create_user` bigint NULL DEFAULT NULL COMMENT '创建人',
`create_dept` bigint NULL DEFAULT NULL COMMENT '创建部门',
`create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
@@ -15,6 +16,7 @@ CREATE TABLE `blade_fee_item` (
`is_deleted` int NULL DEFAULT 0 COMMENT '是否已删除',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `uk_fee_item_name`(`name`) USING BTREE,
INDEX `idx_fee_item_category`(`fee_category`) USING BTREE,
INDEX `idx_fee_item_status`(`status`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '费用项';
@@ -0,0 +1,7 @@
-- 费用项补充费用类型字段
-- 执行前请先备份数据库;如字段已存在,请跳过对应 ALTER。
ALTER TABLE `blade_fee_item`
ADD COLUMN `fee_category` varchar(50) DEFAULT NULL COMMENT '费用类型' AFTER `id`;
CREATE INDEX `idx_fee_item_category` ON `blade_fee_item` (`fee_category`);
+2 -1
View File
@@ -12,7 +12,8 @@ CREATE TABLE `blade_port_terminal` (
`parent_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '上级港口名称',
`country` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '国家',
`city` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '城市',
`region_code` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '行政区划编码',
`district_code` varchar(12) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '区县编码',
`district_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '区县',
`detail_address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '详细地址',
`longitude` decimal(12,6) NULL DEFAULT NULL COMMENT '经度',
`latitude` decimal(12,6) NULL DEFAULT NULL COMMENT '纬度',
@@ -1,6 +1,5 @@
-- 港口码头主数据补充行政区划编码与详细地址字段
-- 港口码头主数据补充详细地址字段
-- 执行前请先备份数据库;如字段已存在,请跳过对应 ALTER。
ALTER TABLE `blade_port_terminal`
ADD COLUMN `region_code` varchar(32) DEFAULT NULL COMMENT '行政区划编码' AFTER `city`,
ADD COLUMN `detail_address` varchar(255) DEFAULT NULL COMMENT '详细地址' AFTER `region_code`;
ADD COLUMN `detail_address` varchar(255) DEFAULT NULL COMMENT '详细地址' AFTER `district_name`;
@@ -13,6 +13,10 @@ CREATE TABLE `blade_railway_station` (
`province_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '所属省份',
`city_code` varchar(12) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '所属城市编码',
`city_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '所属城市',
`district_code` varchar(12) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '所属区县编码',
`district_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '所属区县',
`region_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '行政区划',
`detail_address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '详细地址',
`longitude` decimal(12,6) NULL DEFAULT NULL COMMENT '经度',
`latitude` decimal(12,6) NULL DEFAULT NULL COMMENT '纬度',
`data_source` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '手动' COMMENT '数据来源',
@@ -0,0 +1,14 @@
-- 基础资料区县字段补充
-- 执行前请先备份数据库;如字段已存在,请跳过对应 ALTER。
ALTER TABLE `blade_airport_master`
ADD COLUMN `district_code` varchar(12) DEFAULT NULL COMMENT '所属区县编码' AFTER `city_name`,
ADD COLUMN `district_name` varchar(128) DEFAULT NULL COMMENT '所属区县' AFTER `district_code`;
ALTER TABLE `blade_railway_station`
ADD COLUMN `district_code` varchar(12) DEFAULT NULL COMMENT '所属区县编码' AFTER `city_name`,
ADD COLUMN `district_name` varchar(128) DEFAULT NULL COMMENT '所属区县' AFTER `district_code`;
ALTER TABLE `blade_port_terminal`
ADD COLUMN `district_code` varchar(12) DEFAULT NULL COMMENT '区县编码' AFTER `city`,
ADD COLUMN `district_name` varchar(50) DEFAULT NULL COMMENT '区县' AFTER `district_code`;
@@ -1,12 +1,10 @@
-- 铁路车站、空港机场补充行政区划与详细地址字段
-- 铁路车站、空港机场补充行政区划名称与详细地址字段
-- 执行前请先备份数据库;如字段已存在,请跳过对应 ALTER。
ALTER TABLE `blade_railway_station`
ADD COLUMN `region_code` varchar(32) DEFAULT NULL COMMENT '行政区划编码' AFTER `city_name`,
ADD COLUMN `region_name` varchar(128) DEFAULT NULL COMMENT '行政区划' AFTER `region_code`,
ADD COLUMN `region_name` varchar(128) DEFAULT NULL COMMENT '行政区划' AFTER `district_name`,
ADD COLUMN `detail_address` varchar(255) DEFAULT NULL COMMENT '详细地址' AFTER `region_name`;
ALTER TABLE `blade_airport_master`
ADD COLUMN `region_code` varchar(32) DEFAULT NULL COMMENT '行政区划编码' AFTER `city_name`,
ADD COLUMN `region_name` varchar(128) DEFAULT NULL COMMENT '行政区划' AFTER `region_code`,
ADD COLUMN `region_name` varchar(128) DEFAULT NULL COMMENT '行政区划' AFTER `district_name`,
ADD COLUMN `detail_address` varchar(255) DEFAULT NULL COMMENT '详细地址' AFTER `region_name`;
+10 -5
View File
@@ -32,7 +32,8 @@ CREATE TABLE `blade_airport_master` (
`province_name` varchar(128) DEFAULT NULL COMMENT '所属省份',
`city_code` varchar(12) DEFAULT NULL COMMENT '所属城市编码',
`city_name` varchar(128) DEFAULT NULL COMMENT '所属城市',
`region_code` varchar(32) DEFAULT NULL COMMENT '行政区划编码',
`district_code` varchar(12) DEFAULT NULL COMMENT '所属区县编码',
`district_name` varchar(128) DEFAULT NULL COMMENT '所属区县',
`region_name` varchar(128) DEFAULT NULL COMMENT '行政区划',
`detail_address` varchar(255) DEFAULT NULL COMMENT '详细地址',
`longitude` decimal(12,6) DEFAULT NULL COMMENT '经度',
@@ -130,8 +131,9 @@ COMMIT;
DROP TABLE IF EXISTS `blade_fee_item`;
CREATE TABLE `blade_fee_item` (
`id` bigint(20) NOT NULL COMMENT '主键',
`name` varchar(50) NOT NULL COMMENT '中文名称',
`english_name` varchar(100) DEFAULT NULL COMMENT '英文名称',
`fee_category` varchar(50) NOT NULL COMMENT '费用类型',
`name` varchar(50) NOT NULL COMMENT '费用项',
`english_name` varchar(100) DEFAULT NULL COMMENT '费用项代码',
`create_user` bigint(20) DEFAULT NULL COMMENT '创建人',
`create_dept` bigint(20) DEFAULT NULL COMMENT '创建部门',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
@@ -141,6 +143,7 @@ CREATE TABLE `blade_fee_item` (
`is_deleted` int(11) DEFAULT '0' COMMENT '是否已删除',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE KEY `uk_fee_item_name` (`name`) USING BTREE,
KEY `idx_fee_item_category` (`fee_category`) USING BTREE,
KEY `idx_fee_item_status` (`status`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='费用项';
@@ -1312,7 +1315,8 @@ CREATE TABLE `blade_port_terminal` (
`parent_name` varchar(100) DEFAULT NULL COMMENT '上级港口名称',
`country` varchar(50) DEFAULT NULL COMMENT '国家',
`city` varchar(50) DEFAULT NULL COMMENT '城市',
`region_code` varchar(32) DEFAULT NULL COMMENT '行政区划编码',
`district_code` varchar(12) DEFAULT NULL COMMENT '区县编码',
`district_name` varchar(50) DEFAULT NULL COMMENT '区县',
`detail_address` varchar(255) DEFAULT NULL COMMENT '详细地址',
`longitude` decimal(12,6) DEFAULT NULL COMMENT '经度',
`latitude` decimal(12,6) DEFAULT NULL COMMENT '纬度',
@@ -1419,7 +1423,8 @@ CREATE TABLE `blade_railway_station` (
`province_name` varchar(128) DEFAULT NULL COMMENT '所属省份',
`city_code` varchar(12) DEFAULT NULL COMMENT '所属城市编码',
`city_name` varchar(128) DEFAULT NULL COMMENT '所属城市',
`region_code` varchar(32) DEFAULT NULL COMMENT '行政区划编码',
`district_code` varchar(12) DEFAULT NULL COMMENT '所属区县编码',
`district_name` varchar(128) DEFAULT NULL COMMENT '所属区县',
`region_name` varchar(128) DEFAULT NULL COMMENT '行政区划',
`detail_address` varchar(255) DEFAULT NULL COMMENT '详细地址',
`longitude` decimal(12,6) DEFAULT NULL COMMENT '经度',