diff --git a/doc/readme.md b/doc/readme.md index 6a0f398..9867342 100644 --- a/doc/readme.md +++ b/doc/readme.md @@ -54,4 +54,28 @@ curl 'http://192.168.1.144/api/tduck-api/user/project/result/create?access_key=u --data-raw '{"completeTime":"4862","projectKey":"eec7f270fb1c4e659d9abded37c1f402","submitOs":"Mac OS","submitBrowser":"Chrome","submitUa":{"ua":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36","browser":{"name":"Chrome","version":"116.0.0.0","major":"116"},"engine":{"name":"Blink","version":"116.0.0.0"},"os":{"name":"Mac OS","version":"10.15.7"},"device":{},"cpu":{}},"wxUserInfo":{},"originalData":{"field101":"描述文字","field102":1},"processData":{"field102":"选项一"}}' \ --compressed \ --insecure +``` + + +### 保存为模板 +``` +curl 'http://localhost:8080/api/tduck-api/user/project/template/save?timestamp=1693996087137&sign=109e46660811f2b152bd3520612d3015' \ + -H 'Accept: application/json, text/plain, */*' \ + -H 'Accept-Language: zh-CN,zh;q=0.9' \ + -H 'Cache-Control: no-cache' \ + -H 'Connection: keep-alive' \ + -H 'Content-Type: application/json' \ + -H 'Origin: http://192.168.1.144' \ + -H 'Pragma: no-cache' \ + -H 'Referer: http://192.168.1.144/' \ + -H 'Sec-Fetch-Dest: empty' \ + -H 'Sec-Fetch-Mode: cors' \ + -H 'Sec-Fetch-Site: cross-site' \ + -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36' \ + -H 'sec-ch-ua: "Chromium";v="116", "Not)A;Brand";v="24", "Google Chrome";v="116"' \ + -H 'sec-ch-ua-mobile: ?0' \ + -H 'sec-ch-ua-platform: "macOS"' \ + -H 'token: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.eyJhcHAiOiJnb3YiLCJjbGllbnQiOiJ3ZWIiLCJleHAiOjE2OTQ1ODkyMTQsInVzZXJJZCI6ImQ4ZGZjNmMxZmEyNTM4OTc2MDU5ZjM5MDAwMzZkNDE5IiwiaWF0IjoxNjkzOTg0NDE0fQ.bK_ItNjqyqlEz3KJpuDi96j6gn9b_Jz2FViYiPAcx9UTiRG241za59AJM-Wv-qZ-rf_rAe8kFVPqBcVw59GNZw' \ + --data-raw '{"key":"2e974db6c9f44c5c8489e61f68d6334c"}' \ + --compressed ``` \ No newline at end of file diff --git a/tduck-api/src/main/java/com/tduck/cloud/api/web/controller/UserProjectController.java b/tduck-api/src/main/java/com/tduck/cloud/api/web/controller/UserProjectController.java index 340944a..3357aa5 100644 --- a/tduck-api/src/main/java/com/tduck/cloud/api/web/controller/UserProjectController.java +++ b/tduck-api/src/main/java/com/tduck/cloud/api/web/controller/UserProjectController.java @@ -6,6 +6,7 @@ import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -43,13 +44,12 @@ import me.chanjar.weixin.common.error.WxErrorException; import me.chanjar.weixin.mp.api.WxMpService; import me.chanjar.weixin.mp.bean.result.WxMpQrCodeTicket; import org.apache.commons.lang3.StringUtils; +import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletRequest; import javax.validation.constraints.NotBlank; -import java.util.Date; -import java.util.List; -import java.util.Set; +import java.util.*; import java.util.stream.Collectors; /** @@ -65,6 +65,8 @@ public class UserProjectController { private final UserProjectService projectService; private final UserProjectItemService projectItemService; private final UserProjectResultService projectResultService; + private final UserProjectLogicService projectLogicService; + private final ProjectTemplateLogicService templateLogicService; private final SortUtils sortUtils; private final UserProjectThemeService userProjectThemeService; private final UserProjectSettingService userProjectSettingService; @@ -96,11 +98,15 @@ public class UserProjectController { * 从模板创建项目 */ @Login + @Transactional(rollbackFor = Exception.class) @PostMapping("/user/project/use-template/create") public Result createProjectByTemplate(@RequestBody ProjectTemplateEntity request, @RequestAttribute String userId) { String templateKey = request.getKey(); + ProjectTemplateEntity projectTemplateEntity = projectTemplateService.getByKey(templateKey); List projectTemplateItemEntities = projectTemplateItemService.listByTemplateKey(templateKey); + + // 生成项目主信息 UserProjectEntity userProjectEntity = new UserProjectEntity(); BeanUtil.copyProperties(projectTemplateEntity, userProjectEntity, UserProjectEntity.Fields.status); userProjectEntity.setId(null); @@ -112,11 +118,40 @@ public class UserProjectController { // 名称后面追加一个时间 userProjectEntity.setName(userProjectEntity.getName().concat(String.format("(%s)", DateUtil.format(new Date(), "yyyy-MM-dd")))); projectService.save(userProjectEntity); + + // 生成项目题目信息 List userProjectItemEntityList = JsonUtils.jsonToList(JsonUtils.objToJson(projectTemplateItemEntities), UserProjectItemEntity.class); userProjectItemEntityList.forEach(item -> { item.setId(null); item.setProjectKey(userProjectEntity.getKey());}); projectItemService.saveBatch(userProjectItemEntityList); + + // 生成逻辑信息 + List templateLogics = + templateLogicService.list(new LambdaQueryWrapper().eq(ProjectTemplateLogicEntity::getProjectKey, request.getKey())); + + List logics = templateLogics.stream().map(l -> { + + // 转化condition + HashSet conditions = new HashSet<>(); + + Set conditionSource = l.getConditionList(); + + for (Object e : conditionSource) { + UserProjectLogicEntity.Condition userProjectCondition = JsonUtils.mapToObj((LinkedHashMap) e, UserProjectLogicEntity.Condition.class); + conditions.add(userProjectCondition); + } + + UserProjectLogicEntity userLogicEntity = new UserProjectLogicEntity(); + userLogicEntity.setProjectKey(userProjectEntity.getKey()); + userLogicEntity.setExpression(l.getExpression()); + userLogicEntity.setConditionList(conditions); + userLogicEntity.setFormItemId(l.getFormItemId()); + return userLogicEntity; + }).collect(Collectors.toList()); + + projectLogicService.saveBatch(logics); + return Result.success(userProjectEntity.getKey()); } @@ -130,21 +165,53 @@ public class UserProjectController { */ @Login @PostMapping("/user/project/template/save") + @Transactional(rollbackFor = Exception.class) public Result saveAsProjectTemplate(@RequestBody UserProjectEntity request, @RequestAttribute String userId) { UserProjectEntity projectEntity = projectService.getByKey(request.getKey()); List itemEntityList = projectItemService.listByProjectKey(request.getKey()); + + /** ==================== 保存模板信息 ================================= */ ProjectTemplateEntity projectTemplateEntity = new ProjectTemplateEntity(); BeanUtil.copyProperties(projectEntity, projectTemplateEntity, UserProjectEntity.Fields.status); projectTemplateEntity.setId(null); projectTemplateEntity.setKey(IdUtil.fastSimpleUUID()); projectTemplateEntity.setCategoryId(CommonConstants.ConstantNumber.FOUR.longValue()); projectTemplateService.save(projectTemplateEntity); + + /** ==================== 保存问题列表 ================================= */ List projectTemplateItemList = JsonUtils.jsonToList(JsonUtils.objToJson(itemEntityList), ProjectTemplateItemEntity.class); projectTemplateItemList.forEach(item -> { item.setId(null); item.setProjectKey(projectTemplateEntity.getKey()); }); projectTemplateItemService.saveBatch(projectTemplateItemList); + + /** ==================== 保存逻辑.将project逻辑转化为template逻辑,然后存入 ================================= */ + List projectLogics = + projectLogicService.list(new LambdaQueryWrapper().eq(UserProjectLogicEntity::getProjectKey, request.getKey())); + + List logics = projectLogics.stream().map(l -> { + + // 转化condition + HashSet conditions = new HashSet<>(); + + Set conditionSource = l.getConditionList(); + + for (Object e : conditionSource) { + ProjectTemplateLogicEntity.Condition templateCondition = JsonUtils.mapToObj((LinkedHashMap) e, ProjectTemplateLogicEntity.Condition.class); + conditions.add(templateCondition); + } + + ProjectTemplateLogicEntity templateLogEntity = new ProjectTemplateLogicEntity(); + templateLogEntity.setProjectKey(projectTemplateEntity.getKey()); + templateLogEntity.setExpression(l.getExpression()); + templateLogEntity.setConditionList(conditions); + templateLogEntity.setFormItemId(l.getFormItemId()); + return templateLogEntity; + }).collect(Collectors.toList()); + + templateLogicService.saveBatch(logics); + return Result.success(projectTemplateEntity.getKey()); } diff --git a/tduck-project/src/main/java/com/tduck/cloud/project/entity/ProjectTemplateLogicEntity.java b/tduck-project/src/main/java/com/tduck/cloud/project/entity/ProjectTemplateLogicEntity.java new file mode 100644 index 0000000..10604e8 --- /dev/null +++ b/tduck-project/src/main/java/com/tduck/cloud/project/entity/ProjectTemplateLogicEntity.java @@ -0,0 +1,66 @@ +package com.tduck.cloud.project.entity; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.tduck.cloud.common.entity.BaseEntity; +import com.tduck.cloud.common.mybatis.handler.JacksonTypeHandler; +import com.tduck.cloud.project.entity.enums.ProjectLogicExpressionEnum; +import lombok.Data; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotBlank; +import java.util.Set; + +/** + * 项目模板逻辑(UserProjectLogic)表实体类 + * + * @author smalljop + * @since 2020-05-01 13:36:27 + */ +@Data +@Accessors(chain = true) +@TableName(value = "pr_project_template_logic", autoResultMap = true) +public class ProjectTemplateLogicEntity extends BaseEntity { + + /** + * 项目key + */ + @NotBlank(message = "projectKey不能为空") + private String projectKey; + /** + * 表单项Id + */ + private String formItemId; + /** + * 条件成立的表达式 + */ + private ProjectLogicExpressionEnum expression; + + + /** + * 条件 + */ + @TableField(typeHandler = JacksonTypeHandler.class) + private Set conditionList; + + + /** + * 条件 + */ + @Data + public static class Condition { + /** + * 表单项Id + */ + private String formItemId; + /** + * 表达式 + */ + private String expression; + /** + * 选项 + */ + private Object optionValue; + } + +} diff --git a/tduck-project/src/main/java/com/tduck/cloud/project/mapper/ProjectTemplateLogicMapper.java b/tduck-project/src/main/java/com/tduck/cloud/project/mapper/ProjectTemplateLogicMapper.java new file mode 100644 index 0000000..798f9ac --- /dev/null +++ b/tduck-project/src/main/java/com/tduck/cloud/project/mapper/ProjectTemplateLogicMapper.java @@ -0,0 +1,15 @@ +package com.tduck.cloud.project.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.tduck.cloud.project.entity.ProjectTemplateLogicEntity; +import com.tduck.cloud.project.entity.UserProjectLogicEntity; + +/** + * 用户项目逻辑表(UserProjectLogic)表数据库访问层 + * + * @author smalljop + * @since 2020-11-18 18:16:17 + */ +public interface ProjectTemplateLogicMapper extends BaseMapper { + +} \ No newline at end of file diff --git a/tduck-project/src/main/java/com/tduck/cloud/project/service/ProjectTemplateLogicService.java b/tduck-project/src/main/java/com/tduck/cloud/project/service/ProjectTemplateLogicService.java new file mode 100644 index 0000000..6dc3756 --- /dev/null +++ b/tduck-project/src/main/java/com/tduck/cloud/project/service/ProjectTemplateLogicService.java @@ -0,0 +1,8 @@ +package com.tduck.cloud.project.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.tduck.cloud.project.entity.ProjectTemplateLogicEntity; +import com.tduck.cloud.project.entity.UserProjectLogicEntity; + +public interface ProjectTemplateLogicService extends IService { +} diff --git a/tduck-project/src/main/java/com/tduck/cloud/project/service/impl/ProjectTemplateLogicServiceImpl.java b/tduck-project/src/main/java/com/tduck/cloud/project/service/impl/ProjectTemplateLogicServiceImpl.java new file mode 100644 index 0000000..abacbe9 --- /dev/null +++ b/tduck-project/src/main/java/com/tduck/cloud/project/service/impl/ProjectTemplateLogicServiceImpl.java @@ -0,0 +1,12 @@ +package com.tduck.cloud.project.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.tduck.cloud.project.entity.ProjectTemplateLogicEntity; +import com.tduck.cloud.project.mapper.ProjectTemplateLogicMapper; +import com.tduck.cloud.project.service.ProjectTemplateLogicService; +import org.springframework.stereotype.Service; + + +@Service("projectTemplateLogicService") +public class ProjectTemplateLogicServiceImpl extends ServiceImpl implements ProjectTemplateLogicService { +}