feat: 增加草稿保存提交和状态机接口

This commit is contained in:
lilong 2024-03-20 16:33:47 +08:00
parent f034274557
commit baabd470c7
7 changed files with 198 additions and 21 deletions

View File

@ -6,6 +6,7 @@ import com.alibaba.fastjson.JSONObject;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
import org.springframework.cloud.openfeign.FeignClient;
@ -32,6 +33,12 @@ public interface OpMessageConfigApi {
@PostMapping("/api/op-message-config/update")
ApiResult<OpMessageConfigBaseResp> update(@Valid @RequestBody UpdateOpMessageConfigParam param);
@PostMapping("/api/op-message-config/draft/save")
ApiResult<OpMessageConfigBaseResp> saveDraft(@Valid @RequestBody SaveDraftOpMessageConfigParam req);
@PostMapping("/api/op-message-config/draft/submit")
ApiResult<OpMessageConfigBaseResp> submitDraft(@Valid @RequestBody SaveDraftOpMessageConfigParam req);
@Builder
@Data
@NoArgsConstructor
@ -47,7 +54,7 @@ public interface OpMessageConfigApi {
private JSONObject receiveData;
private Status status;
private ActionEnum action;
private String title;
@ -65,10 +72,15 @@ public interface OpMessageConfigApi {
private Date planStartTime;
@NotNull(message = "updatePersonId不能为空")
private Long updatePersonId;
@NotNull(message = "operatePersonId不能为空")
private Long operatePersonId;
}
@Getter
@AllArgsConstructor
enum ActionEnum {
SUBMIT_DRAFT
}
@Builder
@Data
@NoArgsConstructor
@ -78,8 +90,8 @@ public interface OpMessageConfigApi {
@NotNull(message = "id不能为空")
private Long id;
@NotNull(message = "deletePersonId不能为空")
private Long deletePersonId;
@NotNull(message = "operatePersonId不能为空")
private Long operatePersonId;
}
@Builder
@ -111,8 +123,8 @@ public interface OpMessageConfigApi {
private Date planStartTime;
@NotNull(message = "createPersonId不能为空")
private Long createPersonId;
@NotNull(message = "operatePersonId不能为空")
private Long operatePersonId;
}
@SuperBuilder
@ -146,6 +158,11 @@ public interface OpMessageConfigApi {
* 返回创建人的信息
*/
private boolean needCreatePersonInfo;
/**
* 返回提交审核人的信息
*/
private boolean needSubmitPersonInfo;
}
@SuperBuilder
@ -171,6 +188,8 @@ public interface OpMessageConfigApi {
private SendUserInfo sendUserInfo;
private PersonProfileDto createPersonProfile;
private PersonProfileDto submitPersonProfile;
}
@Data
@ -282,4 +301,38 @@ public interface OpMessageConfigApi {
COMPLETED,
;
}
@Builder
@Data
@NoArgsConstructor
@AllArgsConstructor
class SaveDraftOpMessageConfigParam {
private Long id;
private String name;
private String sendImAccount;
private JSONObject receiveData;
private String title;
private String content;
private String contentType;
private String coverImg;
private JSONObject jumpData;
private JSONObject pushData;
private JSONObject ext;
private Date planStartTime;
@NotNull(message = "operatePersonId不能为空")
private Long operatePersonId;
}
}

View File

@ -10,7 +10,9 @@ public enum BizResultCode implements ResultCode {
OP_MESSAGE_CONFIG_NOT_FOUND("100", "运营消息配置不存在"),
DELETE_OP_MESSAGE_CONFIG_STATUS_ERROR("101", "删除运营消息配置失败,状态异常"),
UPDATE_OP_MESSAGE_CONFIG_STATUS_ERROR("102", "更新运营消息配置失败,状态异常"),;
UPDATE_OP_MESSAGE_CONFIG_STATUS_ERROR("102", "更新运营消息配置失败,状态异常"),
OP_MESSAGE_CONFIG_ID_NOT_NULL("103", "id不能为空"),
OP_MESSAGE_CONFIG_STATUS_ERROR("104", "操作运营消息配置失败,状态异常"),;
private String errorCode;

View File

@ -5,11 +5,14 @@ import cn.axzo.framework.domain.web.result.ApiResult;
import cn.axzo.nanopart.server.domain.OpMessageConfig;
import cn.axzo.nanopart.server.service.OpMessageConfigService;
import cn.axzo.op.api.OpMessageConfigApi;
import cn.axzo.pokonyan.exception.Aassert;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RestController;
import static cn.axzo.nanopart.server.config.BizResultCode.OP_MESSAGE_CONFIG_ID_NOT_NULL;
@RestController
public class OpMessageConfigController implements OpMessageConfigApi {
@ -41,6 +44,12 @@ public class OpMessageConfigController implements OpMessageConfigApi {
opMessageConfigResp.setCreatePersonProfile(createPersonProfile);
}
if (record.getSubmitPersonProfile() != null) {
PersonProfileDto submitPersonProfile = PersonProfileDto.builder().build();
BeanUtils.copyProperties(record.getSubmitPersonProfile(), submitPersonProfile);
opMessageConfigResp.setCreatePersonProfile(submitPersonProfile);
}
return opMessageConfigResp;
}));
}
@ -49,19 +58,19 @@ public class OpMessageConfigController implements OpMessageConfigApi {
public ApiResult<OpMessageConfigBaseResp> create(CreateOpMessageConfigParam param) {
OpMessageConfigService.CreateOpMessageConfigParam createOpMessageConfigParam = OpMessageConfigService.CreateOpMessageConfigParam.builder().build();
BeanUtils.copyProperties(param, createOpMessageConfigParam);
// 默认状态为待执行创建人就是提交审核人
createOpMessageConfigParam.setSubmitPersonId(param.getOperatePersonId());
createOpMessageConfigParam.setCreatePersonId(param.getOperatePersonId());
OpMessageConfig opMessageConfig = opMessageConfigService.create(createOpMessageConfigParam);
OpMessageConfigBaseResp opMessageConfigResp = OpMessageConfigBaseResp.builder().build();;
BeanUtils.copyProperties(opMessageConfig, opMessageConfigResp);
return ApiResult.ok(opMessageConfigResp);
return ApiResult.ok(to(opMessageConfig));
}
@Override
public ApiResult<Void> delete(DeleteOpMessageConfigParam param) {
OpMessageConfigService.DeleteOpMessageConfigParam deleteOpMessageConfigParam = OpMessageConfigService.DeleteOpMessageConfigParam.builder()
.id(param.getId())
.deletePersonId(param.getDeletePersonId())
.deletePersonId(param.getOperatePersonId())
.build();
opMessageConfigService.delete(deleteOpMessageConfigParam);
return ApiResult.ok();
@ -71,11 +80,50 @@ public class OpMessageConfigController implements OpMessageConfigApi {
public ApiResult<OpMessageConfigBaseResp> update(UpdateOpMessageConfigParam param) {
OpMessageConfigService.UpdateOpMessageConfigParam updateOpMessageConfigParam = OpMessageConfigService.UpdateOpMessageConfigParam.builder().build();
BeanUtils.copyProperties(param, updateOpMessageConfigParam);
updateOpMessageConfigParam.setUpdatePersonId(param.getOperatePersonId());
OpMessageConfig opMessageConfig = opMessageConfigService.update(updateOpMessageConfigParam);
return ApiResult.ok(to(opMessageConfig));
}
@Override
public ApiResult<OpMessageConfigBaseResp> saveDraft(SaveDraftOpMessageConfigParam req) {
if (req.getId() == null) {
OpMessageConfigService.CreateOpMessageConfigParam createOpMessageConfigParam = OpMessageConfigService.CreateOpMessageConfigParam.builder().build();
BeanUtils.copyProperties(req, createOpMessageConfigParam);
createOpMessageConfigParam.setStatus(OpMessageConfig.Status.DRAFT.name());
createOpMessageConfigParam.setCreatePersonId(req.getOperatePersonId());
OpMessageConfig opMessageConfig = opMessageConfigService.create(createOpMessageConfigParam);
return ApiResult.ok(to(opMessageConfig));
}
OpMessageConfigService.UpdateOpMessageConfigParam updateOpMessageConfigParam = OpMessageConfigService.UpdateOpMessageConfigParam.builder().build();
BeanUtils.copyProperties(req, updateOpMessageConfigParam);
updateOpMessageConfigParam.setUpdatePersonId(req.getOperatePersonId());
OpMessageConfig opMessageConfig = opMessageConfigService.update(updateOpMessageConfigParam);
return ApiResult.ok(to(opMessageConfig));
}
@Override
public ApiResult<OpMessageConfigBaseResp> submitDraft(SaveDraftOpMessageConfigParam req) {
Aassert.notNull(req.getId(), OP_MESSAGE_CONFIG_ID_NOT_NULL);
OpMessageConfigService.UpdateOpMessageConfigParam updateOpMessageConfigParam = OpMessageConfigService.UpdateOpMessageConfigParam.builder().build();
BeanUtils.copyProperties(req, updateOpMessageConfigParam);
updateOpMessageConfigParam.setAction(OpMessageConfig.ActionEnum.SUBMIT_DRAFT);
updateOpMessageConfigParam.setUpdatePersonId(req.getOperatePersonId());
OpMessageConfig opMessageConfig = opMessageConfigService.update(updateOpMessageConfigParam);
return ApiResult.ok(to(opMessageConfig));
}
public OpMessageConfigBaseResp to(OpMessageConfig opMessageConfig) {
OpMessageConfigBaseResp opMessageConfigResp = OpMessageConfigBaseResp.builder().build();;
BeanUtils.copyProperties(opMessageConfig, opMessageConfigResp);
return ApiResult.ok(opMessageConfigResp);
opMessageConfigResp.setStatus(opMessageConfig.getStatus().name());
return opMessageConfigResp;
}
}

View File

@ -1,19 +1,24 @@
package cn.axzo.nanopart.server.domain;
import cn.axzo.nanopart.server.config.BizResultCode;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler;
import com.google.common.collect.HashBasedTable;
import com.google.common.collect.Sets;
import com.google.common.collect.Table;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import lombok.experimental.SuperBuilder;
import java.util.Date;
import java.util.Optional;
import java.util.Set;
@Data
@ -120,6 +125,12 @@ public class OpMessageConfig {
@TableField
private Long updatePersonId;
/**
* 提交审核人
*/
@TableField
private Long submitPersonId;
public enum Status {
DRAFT,
PENDING,
@ -135,4 +146,21 @@ public class OpMessageConfig {
public boolean canUpdate() {
return CAN_UPDATE_STATUSES.contains(this.getStatus());
}
@Getter
@AllArgsConstructor
public enum ActionEnum {
SUBMIT_DRAFT,
;
private static final Table<Status, ActionEnum, Status> STATUS_FLOWS = HashBasedTable.create();
static {
STATUS_FLOWS.put(Status.DRAFT, SUBMIT_DRAFT, Status.PENDING);
}
public Status getNextStatus(Status oldStatus) {
return Optional.ofNullable(STATUS_FLOWS.get(oldStatus, this)).orElseThrow(BizResultCode.OP_MESSAGE_CONFIG_STATUS_ERROR::toException);
}
}
}

View File

@ -58,8 +58,6 @@ public interface OpMessageConfigService extends IService<OpMessageConfig> {
private JSONObject receiveData;
private String status;
private String title;
private String content;
@ -78,6 +76,10 @@ public interface OpMessageConfigService extends IService<OpMessageConfig> {
private Long updatePersonId;
private Long submitPersonId;
private OpMessageConfig.ActionEnum action;
public OpMessageConfig to() {
OpMessageConfig opMessageConfig = OpMessageConfig.builder().build();
BeanUtils.copyProperties(this, opMessageConfig);
@ -116,6 +118,8 @@ public interface OpMessageConfigService extends IService<OpMessageConfig> {
private Long createPersonId;
private Long submitPersonId;
public OpMessageConfig to() {
OpMessageConfig opMessageConfig = OpMessageConfig.builder().build();
BeanUtils.copyProperties(this, opMessageConfig);
@ -163,6 +167,12 @@ public interface OpMessageConfigService extends IService<OpMessageConfig> {
*/
@CriteriaField(ignore = true)
private boolean needCreatePersonInfo;
/**
* 返回提交审核人的信息
*/
@CriteriaField(ignore = true)
private boolean needSubmitPersonInfo;
}
@Builder
@ -237,15 +247,19 @@ public interface OpMessageConfigService extends IService<OpMessageConfig> {
private PersonProfileDto createPersonProfile;
private PersonProfileDto submitPersonProfile;
public static OpMessageConfigDTO from(OpMessageConfig opMessageConfig,
Map<String, SendUserInfo> sendUserInfos,
Map<Long, PersonProfileDto> personProfiles) {
Map<Long, PersonProfileDto> createPersonProfiles,
Map<Long, PersonProfileDto> submitPersonProfiles) {
OpMessageConfigDTO opMessageConfigDTO = OpMessageConfigDTO.builder().build();
BeanUtils.copyProperties(opMessageConfig, opMessageConfigDTO);
opMessageConfigDTO.setSendUserInfo(sendUserInfos.get(opMessageConfigDTO.getSendImAccount()));
opMessageConfigDTO.setCreatePersonProfile(personProfiles.get(opMessageConfigDTO.getCreatePersonId()));
opMessageConfigDTO.setCreatePersonProfile(createPersonProfiles.get(opMessageConfigDTO.getCreatePersonId()));
opMessageConfigDTO.setSubmitPersonProfile(submitPersonProfiles.get(opMessageConfigDTO.getSubmitPersonId()));
return opMessageConfigDTO;
}
}

View File

@ -34,6 +34,8 @@ import static cn.axzo.nanopart.server.config.BizResultCode.UPDATE_OP_MESSAGE_CON
public class OpMessageConfigServiceImpl extends ServiceImpl<OpMessageConfigMapper, OpMessageConfig>
implements OpMessageConfigService {
private static final Long DEFAULT_ZERO_PERSON_ID = 0L;
@Autowired
private RobotInfoApi robotInfoApi;
@Autowired
@ -47,9 +49,13 @@ public class OpMessageConfigServiceImpl extends ServiceImpl<OpMessageConfigMappe
Map<String, SendUserInfo> sendUserInfos = listSendUserInfo(param, page.getRecords());
Map<Long, PersonProfileDto> personProfiles = listCreatePersonProfile(param, page.getRecords());
Map<Long, PersonProfileDto> createPersonProfiles = listCreatePersonProfile(param, page.getRecords());
Map<Long, PersonProfileDto> submitPersonProfiles = listSubmitPersonProfile(param, page.getRecords());
return PageConverter.convert(page, (record) -> OpMessageConfigDTO.from(record, sendUserInfos, personProfiles));
return PageConverter.convert(page, (record) -> OpMessageConfigDTO.from(record,
sendUserInfos,
submitPersonProfiles,
submitPersonProfiles));
}
@Override
@ -66,7 +72,12 @@ public class OpMessageConfigServiceImpl extends ServiceImpl<OpMessageConfigMappe
Aassert.check(oldOpMessageConfig.canUpdate(), UPDATE_OP_MESSAGE_CONFIG_STATUS_ERROR);
this.updateById(param.to());
OpMessageConfig opMessageConfig = param.to();
if (param.getAction() != null) {
opMessageConfig.setStatus(param.getAction().getNextStatus(oldOpMessageConfig.getStatus()));
}
this.updateById(opMessageConfig);
return this.getById(param.getId());
}
@ -137,4 +148,24 @@ public class OpMessageConfigServiceImpl extends ServiceImpl<OpMessageConfigMappe
.stream()
.collect(Collectors.toMap(PersonProfileDto::getId, Function.identity()));
}
private Map<Long, PersonProfileDto> listSubmitPersonProfile(PageOpMessageConfigParam param,
List<OpMessageConfig> opMessageConfigs) {
if (CollectionUtils.isEmpty(opMessageConfigs) || BooleanUtils.isNotTrue(param.isNeedSubmitPersonInfo())) {
return Collections.emptyMap();
}
List<Long> submitPersonIds = opMessageConfigs.stream()
.map(OpMessageConfig::getSubmitPersonId)
.filter(id -> !Objects.equals(DEFAULT_ZERO_PERSON_ID, id))
.distinct()
.collect(Collectors.toList());
if (CollectionUtils.isEmpty(submitPersonIds)) {
return Collections.emptyMap();
}
return userProfileServiceApi.postPersonProfiles(submitPersonIds).getData()
.stream()
.collect(Collectors.toMap(PersonProfileDto::getId, Function.identity()));
}
}

View File

@ -20,6 +20,7 @@ CREATE TABLE IF NOT EXISTS op_message_config
is_delete tinyint default 0 not null comment '未删除0,删除1',
create_at datetime default CURRENT_TIMESTAMP not null comment '创建时间',
create_person_id bigint not null comment '创建人id',
submit_person_id bigint not null default 0 comment '提交审核人id可能跟crate_person_id不一样比如先保存草稿',
delete_person_id bigint not null default 0 comment '删除人id',
update_person_id bigint not null default 0 comment '更新人id',
update_at datetime default CURRENT_TIMESTAMP not null comment '更新时间',