package com.haisen.laop.dto; import jakarta.validation.constraints.*; import lombok.Data; import java.io.Serializable; import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.List; /** * 发布任务请求 DTO,对应原型图"发布任务"页面的全部表单字段。 * *

多选字段规约:前端以数组提交,Service 层负责转为分号拼接的 {@code String} 存入 DB; * 禁止前端直接拼字符串提交,避免格式校验遗漏。

* * @author duhao */ @Data public class TaskPublishDTO implements Serializable { private static final long serialVersionUID = 1L; /** * 任务名称,列表/详情页标题。 */ @NotBlank(message = "任务名称不能为空") @Size(max = 100, message = "任务名称长度不能超过100个字符") private String name; /** * 任务类型编码:1植保 2吊运 3航拍 4巡检 5清洗 6表演 7测绘。 */ @NotNull(message = "任务类型不能为空") private Integer type; /** * 省份,任务所在地 LBS 筛选维度。 */ @Size(max = 20, message = "省份长度不能超过20个字符") private String province; /** * 城市,任务所在地 LBS 筛选维度。 */ @Size(max = 20, message = "城市长度不能超过20个字符") private String city; /** * 区县。 */ @Size(max = 20, message = "区县长度不能超过20个字符") private String district; /** * 详细地址,飞手导航用;必填(地图选点必带)。 */ @NotBlank(message = "详细地址不能为空") @Size(max = 200, message = "详细地址长度不能超过200个字符") private String address; /** * 纬度坐标,地图选点时自动填入;String 避免浮点精度问题;必填。 */ @NotBlank(message = "纬度不能为空") @Size(max = 20, message = "纬度长度不能超过20个字符") private String latitude; /** * 经度坐标,地图选点时自动填入;String 避免浮点精度问题;必填。 */ @NotBlank(message = "经度不能为空") @Size(max = 20, message = "经度长度不能超过20个字符") private String longitude; /** * 作业场景图 file_id 列表,至少 1 张、最多 5 张。Service 层转为分号拼接字符串。 */ @NotNull(message = "场景图不能为空") @Size(min = 1, max = 5, message = "场景图至少上传1张,最多5张") private List sceneImageIds; /** * 需求人数,默认 1;团队单/急单可大于 1。 */ @NotNull(message = "需求人数不能为空") @Min(value = 1, message = "需求人数至少为1人") @Max(value = 99, message = "需求人数最多99人") private Integer requiredCount; /** * 任务开始时间,精确到分钟。 */ @NotNull(message = "开始时间不能为空") private LocalDateTime taskStartTime; /** * 任务结束时间,必填(作业结束日期)。 */ @NotNull(message = "结束时间不能为空") private LocalDateTime taskEndTime; /** * 报酬(元),必填且必须大于 0。 */ @NotNull(message = "报酬不能为空") @DecimalMin(value = "0.01", message = "报酬必须大于0") private BigDecimal reward; /** * 保险要求编码列表,Service 层转为分号拼接字符串。 * 编码:1=三者险 2=飞手险 3=机身险。可空(无保险要求)。 */ private List insuranceRequireCodes; /** * 联系人姓名,必填。 */ @NotBlank(message = "联系人姓名不能为空") @Size(max = 50, message = "联系人姓名长度不能超过50个字符") private String contactName; /** * 联系电话,必填;中国大陆手机号正则校验。 */ @NotBlank(message = "联系电话不能为空") @Size(max = 20, message = "联系电话长度不能超过20个字符") @Pattern(regexp = "^1[3-9]\\d{9}$", message = "请输入正确的手机号") private String contactPhone; /** * 备注/详细任务描述,选填。 */ @Size(max = 2000, message = "备注长度不能超过2000个字符") private String remark; /** * 是否优质任务,非必填,默认 false。优质任务消耗 4 积分,金色高亮展示。 */ private Boolean isPremium; }