Sfoglia il codice sorgente

增加与ai大模型对话

wwh 2 settimane fa
parent
commit
b27a3e407b

+ 53 - 0
huimv-employment/fe-api/src/main/java/com/huimv/employment/controller/mp/WorkerRegistrationController.java

@@ -0,0 +1,53 @@
1
+package com.huimv.employment.controller.mp;
2
+
3
+import com.huimv.employment.common.exception.BizException;
4
+import com.huimv.employment.common.exception.ErrorCode;
5
+import com.huimv.employment.common.web.R;
6
+import com.huimv.employment.security.LoginUser;
7
+import com.huimv.employment.security.LoginUserHolder;
8
+import com.huimv.employment.service.registration.WorkerRegistrationService;
9
+import com.huimv.employment.service.registration.dto.WorkerRegistrationApplyRequest;
10
+import com.huimv.employment.service.registration.dto.WorkerRegistrationApplyResponse;
11
+import io.swagger.v3.oas.annotations.Operation;
12
+import io.swagger.v3.oas.annotations.security.SecurityRequirement;
13
+import io.swagger.v3.oas.annotations.tags.Tag;
14
+import org.springframework.validation.annotation.Validated;
15
+import org.springframework.web.bind.annotation.PostMapping;
16
+import org.springframework.web.bind.annotation.RequestBody;
17
+import org.springframework.web.bind.annotation.RequestMapping;
18
+import org.springframework.web.bind.annotation.RestController;
19
+
20
+/**
21
+ * 临时工批次登记 / 用工邀请申请加入。
22
+ */
23
+@RestController
24
+@RequestMapping("/api/v1/mp/worker-registration")
25
+@Tag(name = "用工邀请登记", description = "扫码后申请加入用工批次,需临时工 JWT")
26
+@SecurityRequirement(name = "Authorization")
27
+public class WorkerRegistrationController {
28
+
29
+    private static final String USER_TYPE_WORKER = "worker";
30
+
31
+    private final WorkerRegistrationService workerRegistrationService;
32
+
33
+    public WorkerRegistrationController(WorkerRegistrationService workerRegistrationService) {
34
+        this.workerRegistrationService = workerRegistrationService;
35
+    }
36
+
37
+    @PostMapping("/apply")
38
+    @Operation(summary = "申请加入用工邀请",
39
+            description = "临时工扫码进入用工邀约后调用。body.scene 为小程序码参数(订单编号)。"
40
+                    + "需已完成档案登记;写入 fe_worker_registration(reg_status=under_review)。")
41
+    public R<WorkerRegistrationApplyResponse> apply(@Validated @RequestBody WorkerRegistrationApplyRequest request) {
42
+        LoginUser loginUser = requireWorker();
43
+        return R.ok(workerRegistrationService.apply(loginUser.getUserId(), request));
44
+    }
45
+
46
+    private static LoginUser requireWorker() {
47
+        LoginUser loginUser = LoginUserHolder.require();
48
+        if (!USER_TYPE_WORKER.equals(loginUser.getUserType())) {
49
+            throw new BizException(ErrorCode.WORKER_ONLY);
50
+        }
51
+        return loginUser;
52
+    }
53
+}

+ 228 - 0
huimv-employment/fe-dao/src/main/java/com/huimv/employment/dao/entity/FeWorkerRegistration.java

@@ -0,0 +1,228 @@
1
+package com.huimv.employment.dao.entity;
2
+
3
+import com.baomidou.mybatisplus.annotation.IdType;
4
+import com.baomidou.mybatisplus.annotation.TableId;
5
+import com.baomidou.mybatisplus.annotation.TableLogic;
6
+import com.baomidou.mybatisplus.annotation.TableName;
7
+
8
+import java.time.LocalDateTime;
9
+
10
+/**
11
+ * 批次登记记录 {@code fe_worker_registration} 实体。
12
+ */
13
+@TableName("fe_worker_registration")
14
+public class FeWorkerRegistration {
15
+
16
+    @TableId(type = IdType.AUTO)
17
+    private Long id;
18
+
19
+    private Long batchId;
20
+
21
+    private Long orderId;
22
+
23
+    private Long enterpriseId;
24
+
25
+    private Long workerId;
26
+
27
+    private String realName;
28
+
29
+    private String mobileEnc;
30
+
31
+    private String mobileMask;
32
+
33
+    private String idCardNoEnc;
34
+
35
+    private String bankAccountEnc;
36
+
37
+    private String confirmedWorkType;
38
+
39
+    /** pending / registering / completed / verify_failed / under_review */
40
+    private String regStatus;
41
+
42
+    private String failReason;
43
+
44
+    private LocalDateTime submittedAt;
45
+
46
+    private LocalDateTime reviewedAt;
47
+
48
+    private Long reviewedBy;
49
+
50
+    private Integer remindCount;
51
+
52
+    private LocalDateTime lastRemindAt;
53
+
54
+    private LocalDateTime createTime;
55
+
56
+    private LocalDateTime updateTime;
57
+
58
+    @TableLogic
59
+    private Integer delFlag;
60
+
61
+    public Long getId() {
62
+        return id;
63
+    }
64
+
65
+    public void setId(Long id) {
66
+        this.id = id;
67
+    }
68
+
69
+    public Long getBatchId() {
70
+        return batchId;
71
+    }
72
+
73
+    public void setBatchId(Long batchId) {
74
+        this.batchId = batchId;
75
+    }
76
+
77
+    public Long getOrderId() {
78
+        return orderId;
79
+    }
80
+
81
+    public void setOrderId(Long orderId) {
82
+        this.orderId = orderId;
83
+    }
84
+
85
+    public Long getEnterpriseId() {
86
+        return enterpriseId;
87
+    }
88
+
89
+    public void setEnterpriseId(Long enterpriseId) {
90
+        this.enterpriseId = enterpriseId;
91
+    }
92
+
93
+    public Long getWorkerId() {
94
+        return workerId;
95
+    }
96
+
97
+    public void setWorkerId(Long workerId) {
98
+        this.workerId = workerId;
99
+    }
100
+
101
+    public String getRealName() {
102
+        return realName;
103
+    }
104
+
105
+    public void setRealName(String realName) {
106
+        this.realName = realName;
107
+    }
108
+
109
+    public String getMobileEnc() {
110
+        return mobileEnc;
111
+    }
112
+
113
+    public void setMobileEnc(String mobileEnc) {
114
+        this.mobileEnc = mobileEnc;
115
+    }
116
+
117
+    public String getMobileMask() {
118
+        return mobileMask;
119
+    }
120
+
121
+    public void setMobileMask(String mobileMask) {
122
+        this.mobileMask = mobileMask;
123
+    }
124
+
125
+    public String getIdCardNoEnc() {
126
+        return idCardNoEnc;
127
+    }
128
+
129
+    public void setIdCardNoEnc(String idCardNoEnc) {
130
+        this.idCardNoEnc = idCardNoEnc;
131
+    }
132
+
133
+    public String getBankAccountEnc() {
134
+        return bankAccountEnc;
135
+    }
136
+
137
+    public void setBankAccountEnc(String bankAccountEnc) {
138
+        this.bankAccountEnc = bankAccountEnc;
139
+    }
140
+
141
+    public String getConfirmedWorkType() {
142
+        return confirmedWorkType;
143
+    }
144
+
145
+    public void setConfirmedWorkType(String confirmedWorkType) {
146
+        this.confirmedWorkType = confirmedWorkType;
147
+    }
148
+
149
+    public String getRegStatus() {
150
+        return regStatus;
151
+    }
152
+
153
+    public void setRegStatus(String regStatus) {
154
+        this.regStatus = regStatus;
155
+    }
156
+
157
+    public String getFailReason() {
158
+        return failReason;
159
+    }
160
+
161
+    public void setFailReason(String failReason) {
162
+        this.failReason = failReason;
163
+    }
164
+
165
+    public LocalDateTime getSubmittedAt() {
166
+        return submittedAt;
167
+    }
168
+
169
+    public void setSubmittedAt(LocalDateTime submittedAt) {
170
+        this.submittedAt = submittedAt;
171
+    }
172
+
173
+    public LocalDateTime getReviewedAt() {
174
+        return reviewedAt;
175
+    }
176
+
177
+    public void setReviewedAt(LocalDateTime reviewedAt) {
178
+        this.reviewedAt = reviewedAt;
179
+    }
180
+
181
+    public Long getReviewedBy() {
182
+        return reviewedBy;
183
+    }
184
+
185
+    public void setReviewedBy(Long reviewedBy) {
186
+        this.reviewedBy = reviewedBy;
187
+    }
188
+
189
+    public Integer getRemindCount() {
190
+        return remindCount;
191
+    }
192
+
193
+    public void setRemindCount(Integer remindCount) {
194
+        this.remindCount = remindCount;
195
+    }
196
+
197
+    public LocalDateTime getLastRemindAt() {
198
+        return lastRemindAt;
199
+    }
200
+
201
+    public void setLastRemindAt(LocalDateTime lastRemindAt) {
202
+        this.lastRemindAt = lastRemindAt;
203
+    }
204
+
205
+    public LocalDateTime getCreateTime() {
206
+        return createTime;
207
+    }
208
+
209
+    public void setCreateTime(LocalDateTime createTime) {
210
+        this.createTime = createTime;
211
+    }
212
+
213
+    public LocalDateTime getUpdateTime() {
214
+        return updateTime;
215
+    }
216
+
217
+    public void setUpdateTime(LocalDateTime updateTime) {
218
+        this.updateTime = updateTime;
219
+    }
220
+
221
+    public Integer getDelFlag() {
222
+        return delFlag;
223
+    }
224
+
225
+    public void setDelFlag(Integer delFlag) {
226
+        this.delFlag = delFlag;
227
+    }
228
+}

+ 9 - 0
huimv-employment/fe-dao/src/main/java/com/huimv/employment/dao/mapper/FeWorkerRegistrationMapper.java

@@ -0,0 +1,9 @@
1
+package com.huimv.employment.dao.mapper;
2
+
3
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
4
+import com.huimv.employment.dao.entity.FeWorkerRegistration;
5
+import org.apache.ibatis.annotations.Mapper;
6
+
7
+@Mapper
8
+public interface FeWorkerRegistrationMapper extends BaseMapper<FeWorkerRegistration> {
9
+}

+ 188 - 0
huimv-employment/fe-service/src/main/java/com/huimv/employment/service/registration/WorkerRegistrationService.java

@@ -0,0 +1,188 @@
1
+package com.huimv.employment.service.registration;
2
+
3
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
4
+import com.huimv.employment.common.exception.BizException;
5
+import com.huimv.employment.common.exception.ErrorCode;
6
+import com.huimv.employment.dao.entity.FeEmploymentOrder;
7
+import com.huimv.employment.dao.entity.FeRegistrationBatch;
8
+import com.huimv.employment.dao.entity.FeWorker;
9
+import com.huimv.employment.dao.entity.FeWorkerRegistration;
10
+import com.huimv.employment.dao.mapper.FeEmploymentOrderMapper;
11
+import com.huimv.employment.dao.mapper.FeRegistrationBatchMapper;
12
+import com.huimv.employment.dao.mapper.FeWorkerRegistrationMapper;
13
+import com.huimv.employment.service.registration.dto.WorkerRegistrationApplyRequest;
14
+import com.huimv.employment.service.registration.dto.WorkerRegistrationApplyResponse;
15
+import com.huimv.employment.service.worker.WorkerService;
16
+import org.springframework.stereotype.Service;
17
+import org.springframework.transaction.annotation.Transactional;
18
+import org.springframework.util.StringUtils;
19
+
20
+import java.time.LocalDateTime;
21
+
22
+/**
23
+ * 用工邀请 / 批次登记:临时工扫码后申请加入。
24
+ */
25
+@Service
26
+public class WorkerRegistrationService {
27
+
28
+    private static final String BATCH_ACTIVE = "active";
29
+    private static final String REG_UNDER_REVIEW = "under_review";
30
+    private static final String APPLY_SUCCESS = "success";
31
+    private static final String APPLY_ALREADY = "already_applied";
32
+
33
+    private final FeRegistrationBatchMapper feRegistrationBatchMapper;
34
+    private final FeEmploymentOrderMapper feEmploymentOrderMapper;
35
+    private final FeWorkerRegistrationMapper feWorkerRegistrationMapper;
36
+    private final WorkerService workerService;
37
+
38
+    public WorkerRegistrationService(FeRegistrationBatchMapper feRegistrationBatchMapper,
39
+                                     FeEmploymentOrderMapper feEmploymentOrderMapper,
40
+                                     FeWorkerRegistrationMapper feWorkerRegistrationMapper,
41
+                                     WorkerService workerService) {
42
+        this.feRegistrationBatchMapper = feRegistrationBatchMapper;
43
+        this.feEmploymentOrderMapper = feEmploymentOrderMapper;
44
+        this.feWorkerRegistrationMapper = feWorkerRegistrationMapper;
45
+        this.workerService = workerService;
46
+    }
47
+
48
+    /**
49
+     * 临时工申请加入用工邀请(scene = 订单编号)。
50
+     * <p>要求已完成档案登记({@code fe_worker})。同一批次重复申请返回已有记录。</p>
51
+     */
52
+    @Transactional(rollbackFor = Exception.class)
53
+    public WorkerRegistrationApplyResponse apply(Long userId, WorkerRegistrationApplyRequest request) {
54
+        workerService.requireWorkerUser(userId);
55
+        if (request == null || !StringUtils.hasText(request.getScene())) {
56
+            throw new BizException(ErrorCode.BAD_REQUEST, "scene 不能为空");
57
+        }
58
+        FeWorker worker = workerService.findWorkerByUserId(userId);
59
+        if (worker == null) {
60
+            throw new BizException(ErrorCode.BAD_REQUEST, "请先完成临时工档案登记");
61
+        }
62
+
63
+        String scene = request.getScene().trim();
64
+        FeRegistrationBatch batch = requireActiveBatchByScene(scene);
65
+        FeEmploymentOrder order = feEmploymentOrderMapper.selectById(batch.getOrderId());
66
+        if (order == null) {
67
+            throw new BizException(ErrorCode.NOT_FOUND, "用工订单不存在");
68
+        }
69
+
70
+        FeWorkerRegistration existing = feWorkerRegistrationMapper.selectOne(new LambdaQueryWrapper<FeWorkerRegistration>()
71
+                .eq(FeWorkerRegistration::getBatchId, batch.getId())
72
+                .eq(FeWorkerRegistration::getWorkerId, worker.getId())
73
+                .orderByDesc(FeWorkerRegistration::getId)
74
+                .last("LIMIT 1"));
75
+        if (existing != null) {
76
+            return toResponse(existing, batch, order, APPLY_ALREADY, "您已申请加入该用工,请等待企业确认");
77
+        }
78
+
79
+        assertBatchHasCapacity(batch);
80
+
81
+        LocalDateTime now = LocalDateTime.now();
82
+        FeWorkerRegistration reg = new FeWorkerRegistration();
83
+        reg.setBatchId(batch.getId());
84
+        reg.setOrderId(order.getId());
85
+        reg.setEnterpriseId(batch.getEnterpriseId());
86
+        reg.setWorkerId(worker.getId());
87
+        reg.setRealName(worker.getRealName());
88
+        reg.setMobileEnc(worker.getMobileEnc());
89
+        reg.setMobileMask(worker.getMobileMask());
90
+        reg.setIdCardNoEnc(worker.getIdCardNoEnc());
91
+        reg.setBankAccountEnc(worker.getBankAccountEnc());
92
+        if (StringUtils.hasText(request.getConfirmedWorkType())) {
93
+            reg.setConfirmedWorkType(request.getConfirmedWorkType().trim());
94
+        } else if (StringUtils.hasText(order.getWorkType())) {
95
+            reg.setConfirmedWorkType(order.getWorkType());
96
+        }
97
+        reg.setRegStatus(REG_UNDER_REVIEW);
98
+        reg.setSubmittedAt(now);
99
+        reg.setRemindCount(0);
100
+        reg.setCreateTime(now);
101
+        reg.setUpdateTime(now);
102
+        reg.setDelFlag(0);
103
+        feWorkerRegistrationMapper.insert(reg);
104
+
105
+        bumpBatchCounters(batch, now);
106
+        bumpOrderCounters(order, now);
107
+
108
+        return toResponse(reg, batch, order, APPLY_SUCCESS, "申请已提交,请等待企业确认");
109
+    }
110
+
111
+    private FeRegistrationBatch requireActiveBatchByScene(String scene) {
112
+        FeRegistrationBatch batch = feRegistrationBatchMapper.selectOne(new LambdaQueryWrapper<FeRegistrationBatch>()
113
+                .eq(FeRegistrationBatch::getQrToken, scene)
114
+                .orderByDesc(FeRegistrationBatch::getId)
115
+                .last("LIMIT 1"));
116
+        if (batch == null) {
117
+            FeEmploymentOrder order = feEmploymentOrderMapper.selectOne(new LambdaQueryWrapper<FeEmploymentOrder>()
118
+                    .eq(FeEmploymentOrder::getOrderNo, scene)
119
+                    .orderByDesc(FeEmploymentOrder::getId)
120
+                    .last("LIMIT 1"));
121
+            if (order != null) {
122
+                batch = feRegistrationBatchMapper.selectOne(new LambdaQueryWrapper<FeRegistrationBatch>()
123
+                        .eq(FeRegistrationBatch::getOrderId, order.getId())
124
+                        .orderByDesc(FeRegistrationBatch::getId)
125
+                        .last("LIMIT 1"));
126
+            }
127
+        }
128
+        if (batch == null) {
129
+            throw new BizException(ErrorCode.NOT_FOUND, "未找到对应用工邀请");
130
+        }
131
+        if (!BATCH_ACTIVE.equals(batch.getStatus())) {
132
+            throw new BizException(ErrorCode.BAD_REQUEST, "该用工邀请已关闭或失效");
133
+        }
134
+        LocalDateTime now = LocalDateTime.now();
135
+        if (batch.getValidUntil() != null && now.isAfter(batch.getValidUntil())) {
136
+            throw new BizException(ErrorCode.BAD_REQUEST, "该用工邀请已过期");
137
+        }
138
+        if (batch.getValidFrom() != null && now.isBefore(batch.getValidFrom())) {
139
+            throw new BizException(ErrorCode.BAD_REQUEST, "该用工邀请尚未生效");
140
+        }
141
+        return batch;
142
+    }
143
+
144
+    private void assertBatchHasCapacity(FeRegistrationBatch batch) {
145
+        int expected = batch.getExpectedCount() != null ? batch.getExpectedCount() : 0;
146
+        int registered = batch.getRegisteredCount() != null ? batch.getRegisteredCount() : 0;
147
+        if (expected > 0 && registered >= expected) {
148
+            throw new BizException(ErrorCode.BAD_REQUEST, "该用工名额已满");
149
+        }
150
+    }
151
+
152
+    private void bumpBatchCounters(FeRegistrationBatch batch, LocalDateTime now) {
153
+        int registered = batch.getRegisteredCount() != null ? batch.getRegisteredCount() : 0;
154
+        int pending = batch.getPendingCount() != null ? batch.getPendingCount() : 0;
155
+        FeRegistrationBatch update = new FeRegistrationBatch();
156
+        update.setId(batch.getId());
157
+        update.setRegisteredCount(registered + 1);
158
+        update.setPendingCount(Math.max(0, pending - 1));
159
+        update.setUpdateTime(now);
160
+        feRegistrationBatchMapper.updateById(update);
161
+    }
162
+
163
+    private void bumpOrderCounters(FeEmploymentOrder order, LocalDateTime now) {
164
+        int registered = order.getRegisteredCount() != null ? order.getRegisteredCount() : 0;
165
+        int pending = order.getPendingCount() != null ? order.getPendingCount() : 0;
166
+        FeEmploymentOrder update = new FeEmploymentOrder();
167
+        update.setId(order.getId());
168
+        update.setRegisteredCount(registered + 1);
169
+        update.setPendingCount(Math.max(0, pending - 1));
170
+        update.setUpdateTime(now);
171
+        feEmploymentOrderMapper.updateById(update);
172
+    }
173
+
174
+    private static WorkerRegistrationApplyResponse toResponse(FeWorkerRegistration reg,
175
+                                                              FeRegistrationBatch batch,
176
+                                                              FeEmploymentOrder order,
177
+                                                              String status,
178
+                                                              String message) {
179
+        WorkerRegistrationApplyResponse response = new WorkerRegistrationApplyResponse();
180
+        response.setStatus(status);
181
+        response.setRegistrationId(reg.getId());
182
+        response.setBatchNo(batch.getBatchNo());
183
+        response.setOrderNo(order.getOrderNo());
184
+        response.setRegStatus(reg.getRegStatus());
185
+        response.setMessage(message);
186
+        return response;
187
+    }
188
+}

+ 38 - 0
huimv-employment/fe-service/src/main/java/com/huimv/employment/service/registration/dto/WorkerRegistrationApplyRequest.java

@@ -0,0 +1,38 @@
1
+package com.huimv.employment.service.registration.dto;
2
+
3
+import com.fasterxml.jackson.annotation.JsonAlias;
4
+import com.fasterxml.jackson.annotation.JsonProperty;
5
+import io.swagger.v3.oas.annotations.media.Schema;
6
+
7
+import javax.validation.constraints.NotBlank;
8
+
9
+@Schema(description = "用工邀请申请加入请求")
10
+public class WorkerRegistrationApplyRequest {
11
+
12
+    @NotBlank(message = "scene 不能为空")
13
+    @JsonProperty("scene")
14
+    @JsonAlias({"order_no", "orderNo", "qr_token"})
15
+    @Schema(description = "小程序码 scene(订单编号)", example = "ord_123", requiredMode = Schema.RequiredMode.REQUIRED)
16
+    private String scene;
17
+
18
+    @JsonProperty("confirmed_work_type")
19
+    @JsonAlias({"confirmedWorkType", "work_type"})
20
+    @Schema(description = "确认工种/任务(可选)", example = "仓库搬运")
21
+    private String confirmedWorkType;
22
+
23
+    public String getScene() {
24
+        return scene;
25
+    }
26
+
27
+    public void setScene(String scene) {
28
+        this.scene = scene;
29
+    }
30
+
31
+    public String getConfirmedWorkType() {
32
+        return confirmedWorkType;
33
+    }
34
+
35
+    public void setConfirmedWorkType(String confirmedWorkType) {
36
+        this.confirmedWorkType = confirmedWorkType;
37
+    }
38
+}

+ 78 - 0
huimv-employment/fe-service/src/main/java/com/huimv/employment/service/registration/dto/WorkerRegistrationApplyResponse.java

@@ -0,0 +1,78 @@
1
+package com.huimv.employment.service.registration.dto;
2
+
3
+import com.fasterxml.jackson.annotation.JsonProperty;
4
+import io.swagger.v3.oas.annotations.media.Schema;
5
+
6
+@Schema(description = "用工邀请申请加入响应")
7
+public class WorkerRegistrationApplyResponse {
8
+
9
+    @Schema(description = "处理结果", example = "success")
10
+    private String status;
11
+
12
+    @JsonProperty("registration_id")
13
+    @Schema(description = "批次登记记录 ID")
14
+    private Long registrationId;
15
+
16
+    @JsonProperty("batch_no")
17
+    @Schema(description = "登记批次编号", example = "bat_1")
18
+    private String batchNo;
19
+
20
+    @JsonProperty("order_no")
21
+    @Schema(description = "订单编号 / scene", example = "ord_123")
22
+    private String orderNo;
23
+
24
+    @JsonProperty("reg_status")
25
+    @Schema(description = "登记状态", example = "under_review")
26
+    private String regStatus;
27
+
28
+    @Schema(description = "提示文案")
29
+    private String message;
30
+
31
+    public String getStatus() {
32
+        return status;
33
+    }
34
+
35
+    public void setStatus(String status) {
36
+        this.status = status;
37
+    }
38
+
39
+    public Long getRegistrationId() {
40
+        return registrationId;
41
+    }
42
+
43
+    public void setRegistrationId(Long registrationId) {
44
+        this.registrationId = registrationId;
45
+    }
46
+
47
+    public String getBatchNo() {
48
+        return batchNo;
49
+    }
50
+
51
+    public void setBatchNo(String batchNo) {
52
+        this.batchNo = batchNo;
53
+    }
54
+
55
+    public String getOrderNo() {
56
+        return orderNo;
57
+    }
58
+
59
+    public void setOrderNo(String orderNo) {
60
+        this.orderNo = orderNo;
61
+    }
62
+
63
+    public String getRegStatus() {
64
+        return regStatus;
65
+    }
66
+
67
+    public void setRegStatus(String regStatus) {
68
+        this.regStatus = regStatus;
69
+    }
70
+
71
+    public String getMessage() {
72
+        return message;
73
+    }
74
+
75
+    public void setMessage(String message) {
76
+        this.message = message;
77
+    }
78
+}