From 774b264cb62b2110f5a957facb594b92a6488abf Mon Sep 17 00:00:00 2001 From: wxz Date: Wed, 6 Sep 2023 19:39:55 +0800 Subject: [PATCH] =?UTF-8?q?1.fix=20=20=E5=B0=86=E9=97=AE=E5=8D=B7=E4=BF=9D?= =?UTF-8?q?=E5=AD=98=E4=B8=BA=E6=A8=A1=E6=9D=BF=E7=9A=84=E6=97=B6=E5=80=99?= =?UTF-8?q?=EF=BC=8C=E6=B2=A1=E6=9C=89=E4=BF=9D=E5=AD=98=E6=A8=A1=E6=9D=BF?= =?UTF-8?q?=E9=80=BB=E8=BE=91=202.fix=20=20=E4=BD=BF=E7=94=A8=E6=A8=A1?= =?UTF-8?q?=E6=9D=BF=E7=94=9F=E6=88=90=E9=97=AE=E5=8D=B7=EF=BC=8C=E6=B2=A1?= =?UTF-8?q?=E6=9C=89=E7=94=9F=E6=88=90=E6=96=B0=E9=97=AE=E5=8D=B7=E7=9A=84?= =?UTF-8?q?=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/readme.md | 24 ++++++ .../web/controller/UserProjectController.java | 73 ++++++++++++++++++- .../entity/ProjectTemplateLogicEntity.java | 66 +++++++++++++++++ .../mapper/ProjectTemplateLogicMapper.java | 15 ++++ .../service/ProjectTemplateLogicService.java | 8 ++ .../impl/ProjectTemplateLogicServiceImpl.java | 12 +++ 6 files changed, 195 insertions(+), 3 deletions(-) create mode 100644 tduck-project/src/main/java/com/tduck/cloud/project/entity/ProjectTemplateLogicEntity.java create mode 100644 tduck-project/src/main/java/com/tduck/cloud/project/mapper/ProjectTemplateLogicMapper.java create mode 100644 tduck-project/src/main/java/com/tduck/cloud/project/service/ProjectTemplateLogicService.java create mode 100644 tduck-project/src/main/java/com/tduck/cloud/project/service/impl/ProjectTemplateLogicServiceImpl.java 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 { +}