ltkj-admin/src/main/java/com/ltkj/LtkjApplication.java
@@ -16,7 +16,7 @@ @EnableTransactionManagement @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class},scanBasePackages = {"org.jeecg.modules.jmreport","com.ltkj"}) @EnableAsync //@EnableCaching @EnableCaching public class LtkjApplication { public static void main(String[] args) { //spring-boot-devtools的模块使Spring Boot应用支持热部署,无需手动重启Spring Boot应用。 ltkj-admin/src/main/java/com/ltkj/web/controller/system/TjSurveyTemplateController.java
@@ -8,11 +8,14 @@ import cn.hutool.core.date.DateTime; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.ltkj.common.core.domain.TreeSelect; import com.ltkj.common.core.domain.entity.SysDept; import com.ltkj.hosp.domain.TjSurveyOptions; import com.ltkj.hosp.domain.TjSurveyQuestion; import com.ltkj.hosp.domain.TjSurveyTempQues; import com.ltkj.hosp.service.ITjSurveyQuestionService; import com.ltkj.system.service.ISysConfigService; import com.ltkj.system.service.ISysDeptService; import com.ltkj.tduck.domain.UserFormEntity; import com.ltkj.tduck.enums.FormSourceTypeEnum; import com.ltkj.tduck.enums.FormStatusEnum; @@ -53,6 +56,8 @@ @Autowired private UserFormService formService; @Autowired private ISysDeptService deptService; /** * 判断是否开启填鸭表单设计 @@ -155,6 +160,21 @@ } return AjaxResult.success("暂无信息"); // List<TjSurveyQuestion> l11=new ArrayList<>(); // TjSurveyTemplate byId1 = tjSurveyTemplateService.selectTjSurveyTemplateByMid(mid); // List<TjSurveyTempQues> tjSurveyTempQuesList = byId1.getTjSurveyTempQuesList(); // if (tjSurveyTempQuesList!=null){ // for (TjSurveyTempQues tjSurveyTempQues : tjSurveyTempQuesList) { // TjSurveyQuestion byId11 = tjSurveyQuestionService.selectTjSurveyQuestionByQid(tjSurveyTempQues.getQid()); // if (byId11!=null){ // l11.add(byId11); // } // } // return AjaxResult.success(l11); // } // return AjaxResult.success("暂无信息"); } @@ -194,6 +214,51 @@ return AjaxResult.success(false); } @GetMapping("/getQuestionsByMid") public Map<String, Object> getQuestionsByMid(@RequestParam("mid") Long mid, @RequestParam(required = false) String question, @RequestParam("pageNum") int pageNum, @RequestParam("pageSize") int pageSize) { Map<String, Object> res = new HashMap<>(); // List<TjSurveyQuestion> list = tjSurveyTemplateService.getQuestionsByMid(mid); LambdaQueryWrapper<TjSurveyQuestion> wq1=new LambdaQueryWrapper<>(); wq1.eq(TjSurveyQuestion::getMid,mid); if(null !=question && !question.equals("")){ wq1.like(TjSurveyQuestion::getQuestion,question); } final List<TjSurveyQuestion> list = tjSurveyQuestionService.list(wq1); int start = 0, end = 0; start = (pageNum - 1) * pageSize; end = start + pageSize; end = Math.min(list.size(), end); List<TjSurveyQuestion> result = new ArrayList<>(); for (int i = start; i < end; i++) { result.add(list.get(i)); } final TjSurveyTemplate byId = tjSurveyTemplateService.selectTemplateByMid1(mid); for (TjSurveyQuestion tjSurveyQuestion : result) { tjSurveyQuestion.setTemplate(byId); final List<TjSurveyOptions> tjSurveyOptions = tjSurveyQuestionService.selectOptionsByQid(tjSurveyQuestion.getQid()); tjSurveyQuestion.setTjSurveyOptionsList(tjSurveyOptions); } res.put("data", result); // res.put("temp", tjSurveyTemplateService.selectTjSurveyTemplateByMid(mid)); res.put("total", list.size()); return res; } /** * 查询问卷模板列表 */ @GetMapping("/listByDeptId") public AjaxResult listByDeptId(SysDept dept) { List<TreeSelect> treeSelects =deptService.selectDeptList1(dept); return AjaxResult.success(treeSelects); } /** * 修改问卷模板 */ ltkj-admin/src/main/java/com/ltkj/web/tduck/UserFormController.java
@@ -1,311 +1,315 @@ //package com.ltkj.web.tduck; // //import cn.hutool.core.util.ObjectUtil; //import cn.hutool.core.util.StrUtil; //import cn.hutool.json.JSONObject; //import cn.hutool.json.JSONUtil; //import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; //import com.baomidou.mybatisplus.core.toolkit.Wrappers; //import com.ltkj.common.core.domain.AjaxResult; //import com.ltkj.tduck.constant.CommonConstants; //import com.ltkj.tduck.domain.*; //import com.ltkj.tduck.enums.FormStatusEnum; //import com.ltkj.tduck.enums.FormTypeEnum; //import com.ltkj.tduck.request.QueryFormItemRequest; //import com.ltkj.tduck.request.QueryFormRequest; //import com.ltkj.tduck.request.QueryFormTemplateTypeRequest; //import com.ltkj.tduck.request.SortFormItemRequest; //import com.ltkj.tduck.service.*; //import com.ltkj.tduck.utils.FormDataUtils; //import com.ltkj.tduck.utils.Result; //import com.ltkj.tduck.utils.SortUtils; //import com.ltkj.tduck.utils.ValidatorUtils; //import com.ltkj.tduck.vo.FormFieldVO; //import com.ltkj.tduck.vo.OperateFormItemVO; //import com.ltkj.tduck.vo.UserFormDetailVO; //import lombok.RequiredArgsConstructor; //import lombok.extern.slf4j.Slf4j; //import org.springframework.web.bind.annotation.*; // //import javax.annotation.Resource; //import javax.annotation.security.PermitAll; //import javax.validation.constraints.NotBlank; //import java.util.ArrayList; //import java.util.Comparator; //import java.util.Date; //import java.util.List; // // ///** // * 用户表单 // **/ //@RequiredArgsConstructor //@RestController //@Slf4j ////@RequestMapping("/tduck-api") //public class UserFormController { // @Resource // private final UserFormService formService; // @Resource // private final UserFormItemService formItemService; // @Resource // private final FormTemplateCategoryService formTemplateCategoryService; // @Resource // private final SortUtils sortUtils; // // private final UserFormThemeService userFormThemeService; // private final UserFormLogicService userFormLogicService; // // // /** // * 查询表单 // */ // @GetMapping("/user/form/{key}") // public AjaxResult queryFormByKey(@PathVariable @NotBlank String key) { // return AjaxResult.success(formService.getByKey(key)); // } // // /** // * 项目表单项查询 // */ // @GetMapping("/user/form/item/list") // public AjaxResult queryFormItems(QueryFormItemRequest request) { package com.ltkj.web.tduck; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.ltkj.common.core.domain.AjaxResult; import com.ltkj.tduck.constant.CommonConstants; import com.ltkj.tduck.domain.*; import com.ltkj.tduck.enums.FormStatusEnum; import com.ltkj.tduck.enums.FormTypeEnum; import com.ltkj.tduck.request.QueryFormItemRequest; import com.ltkj.tduck.request.QueryFormRequest; import com.ltkj.tduck.request.QueryFormTemplateTypeRequest; import com.ltkj.tduck.request.SortFormItemRequest; import com.ltkj.tduck.service.*; import com.ltkj.tduck.utils.FormDataUtils; import com.ltkj.tduck.utils.Result; import com.ltkj.tduck.utils.SortUtils; import com.ltkj.tduck.utils.ValidatorUtils; import com.ltkj.tduck.vo.FormFieldVO; import com.ltkj.tduck.vo.OperateFormItemVO; import com.ltkj.tduck.vo.UserFormDetailVO; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import javax.annotation.security.PermitAll; import javax.validation.constraints.NotBlank; import java.util.ArrayList; import java.util.Comparator; import java.util.Date; import java.util.List; /** * 用户表单 **/ @RequiredArgsConstructor @RestController @Slf4j //@RequestMapping("/tduck-api") public class UserFormController { @Resource private final UserFormService formService; @Resource private final UserFormItemService formItemService; @Resource private final FormTemplateCategoryService formTemplateCategoryService; @Resource private final SortUtils sortUtils; private final UserFormThemeService userFormThemeService; private final UserFormLogicService userFormLogicService; /** * 查询表单 */ @GetMapping("/user/form/{key}") public AjaxResult queryFormByKey(@PathVariable @NotBlank String key) { return AjaxResult.success(formService.getByKey(key)); } /** * 项目表单项查询 */ @GetMapping("/user/form/item/list") public AjaxResult queryFormItems(QueryFormItemRequest request) { ValidatorUtils.validateEntity(request); // FormAuthUtils.hasPermission(request.getKey()); List<UserFormItemEntity> itemEntityList = formItemService .list(Wrappers.<UserFormItemEntity>lambdaQuery() .eq(UserFormItemEntity::getFormKey, request.getKey()) .eq(ObjectUtil.isNotNull(request.getDisplayType()), UserFormItemEntity::getDisplayType, request.getDisplayType())); itemEntityList.sort(Comparator.comparing(UserFormItemEntity::getSort)); return AjaxResult.success(itemEntityList); } /** * 分页查询项目分类 * * @return */ @GetMapping("/form/template/type/list") public AjaxResult queryFormTemplateTypes(QueryFormTemplateTypeRequest.List request) { return AjaxResult.success(formTemplateCategoryService.list(Wrappers.<FormTemplateCategoryEntity>lambdaQuery() .orderByDesc(FormTemplateCategoryEntity::getSort))); } /** * 表单更新 * * @param form */ @PostMapping("/user/form/update") public AjaxResult updateForm(@RequestBody UserFormEntity form) { // ValidatorUtils.validateEntity(form, AddGroup.class); UserFormEntity oldForm = formService.getByKey(form.getFormKey()); if (ObjectUtil.isNotNull(oldForm)) { form.setId(oldForm.getId()); formService.updateById(form); } return AjaxResult.success(); } /** * 项目表单项创建 * * @param entity */ @PostMapping("/user/form/item/create") public AjaxResult createFormItem(@RequestBody UserFormItemEntity entity) { // ValidatorUtils.validateEntity(entity, AddGroup.class); if (ObjectUtil.isNull(entity.getDisplayType())) { entity.setDisplayType(false); } if (ObjectUtil.isNull(entity.getHideType())) { entity.setHideType(false); } //排序下标计算 entity.setSort(sortUtils.getInitialSortPosition(entity.getFormKey())); entity.setSpecialType(formItemService.isSpecialTypeItem(entity)); entity.setCreateTime(new Date()); boolean save = formItemService.save(entity); return AjaxResult.success(new OperateFormItemVO(entity.getSort(), entity.getId(), save, false)); } /** * 批量项目表单项创建 */ @PostMapping("/user/form/item/batch/create") public AjaxResult batchCreateFormItem(@RequestBody List<UserFormItemEntity> itemEntityList) { //排序下标计算 itemEntityList.forEach(item -> item.setSort(sortUtils.getInitialSortPosition(item.getFormKey()))); itemEntityList.forEach(item -> item.setDisplayType(false)); itemEntityList.forEach(item -> item.setHideType(false)); itemEntityList.forEach(item -> item.setSpecialType(false)); boolean save = formItemService.saveBatch(itemEntityList); AjaxResult ajaxResult = new AjaxResult(); ajaxResult.put("code", 200); ajaxResult.put("data", null); ajaxResult.put("msg", null); return ajaxResult; } /** * 表单项删除 */ @PostMapping("/user/form/item/delete") public AjaxResult deleteFormItem(@RequestBody UserFormItemEntity request) { // FormAuthUtils.hasPermission(request.getFormKey()); boolean delete = formItemService.remove(Wrappers.<UserFormItemEntity>lambdaQuery().eq(UserFormItemEntity::getFormKey, request.getFormKey()).eq(UserFormItemEntity::getFormItemId, request.getFormItemId())); return AjaxResult.success(delete); } /** * 表单项更新 * * @param request */ @PostMapping("/user/form/item/update") public AjaxResult updateFormItem(@RequestBody UserFormItemEntity request) { // FormAuthUtils.hasPermission(request.getFormKey()); // ValidatorUtils.validateEntity(request, UpdateGroup.class); request.setSpecialType(formItemService.isSpecialTypeItem(request)); boolean update = formItemService.update(request, Wrappers.<UserFormItemEntity>lambdaQuery().eq(UserFormItemEntity::getFormKey, request.getFormKey()).eq(UserFormItemEntity::getFormItemId, request.getFormItemId())); return AjaxResult.success(update); } /** * 表单项排序 * * @param request */ @PostMapping("/user/form/item/sort") public AjaxResult sortFormItem(@RequestBody SortFormItemRequest request) { // ValidatorUtils.validateEntity(request); //// FormAuthUtils.hasPermission(request.getKey()); // List<UserFormItemEntity> itemEntityList = formItemService.list(Wrappers.<UserFormItemEntity>lambdaQuery().eq(UserFormItemEntity::getFormKey, request.getKey()).eq(ObjectUtil.isNotNull(request.getDisplayType()), UserFormItemEntity::getDisplayType, request.getDisplayType())); // itemEntityList.sort(Comparator.comparing(UserFormItemEntity::getSort)); // return AjaxResult.success(itemEntityList); // } // // // /** // * 分页查询项目分类 // * // * @return // */ // @GetMapping("/form/template/type/list") // public AjaxResult queryFormTemplateTypes(QueryFormTemplateTypeRequest.List request) { // return AjaxResult.success(formTemplateCategoryService.list(Wrappers.<FormTemplateCategoryEntity>lambdaQuery() // .orderByDesc(FormTemplateCategoryEntity::getSort))); // } // // // /** // * 表单更新 // * // * @param form // */ // @PostMapping("/user/form/update") // public AjaxResult updateForm(@RequestBody UserFormEntity form) { //// ValidatorUtils.validateEntity(form, AddGroup.class); // UserFormEntity oldForm = formService.getByKey(form.getFormKey()); // if (ObjectUtil.isNotNull(oldForm)) { // form.setId(oldForm.getId()); // formService.updateById(form); // } // return AjaxResult.success(); // } // // // /** // * 项目表单项创建 // * // * @param entity // */ // @PostMapping("/user/form/item/create") // public AjaxResult createFormItem(@RequestBody UserFormItemEntity entity) { //// ValidatorUtils.validateEntity(entity, AddGroup.class); // if (ObjectUtil.isNull(entity.getDisplayType())) { // entity.setDisplayType(false); // } // if (ObjectUtil.isNull(entity.getHideType())) { // entity.setHideType(false); // } // //排序下标计算 // entity.setSort(sortUtils.getInitialSortPosition(entity.getFormKey())); // entity.setSpecialType(formItemService.isSpecialTypeItem(entity)); // entity.setCreateTime(new Date()); // boolean save = formItemService.save(entity); // return AjaxResult.success(new OperateFormItemVO(entity.getSort(), entity.getId(), save, false)); // } // // // /** // * 批量项目表单项创建 // */ // @PostMapping("/user/form/item/batch/create") // public AjaxResult batchCreateFormItem(@RequestBody List<UserFormItemEntity> itemEntityList) { // //排序下标计算 // itemEntityList.forEach(item -> item.setSort(sortUtils.getInitialSortPosition(item.getFormKey()))); // itemEntityList.forEach(item -> item.setDisplayType(false)); // itemEntityList.forEach(item -> item.setHideType(false)); // itemEntityList.forEach(item -> item.setSpecialType(false)); // boolean save = formItemService.saveBatch(itemEntityList); // AjaxResult ajaxResult = new AjaxResult(); // ajaxResult.put("code", 200); // ajaxResult.put("data", null); // ajaxResult.put("msg", null); // return ajaxResult; // } // // // /** // * 表单项删除 // */ // @PostMapping("/user/form/item/delete") // public AjaxResult deleteFormItem(@RequestBody UserFormItemEntity request) { //// FormAuthUtils.hasPermission(request.getFormKey()); // boolean delete = formItemService.remove(Wrappers.<UserFormItemEntity>lambdaQuery().eq(UserFormItemEntity::getFormKey, request.getFormKey()).eq(UserFormItemEntity::getFormItemId, request.getFormItemId())); // return AjaxResult.success(delete); // } // // // /** // * 表单项更新 // * // * @param request // */ // @PostMapping("/user/form/item/update") // public AjaxResult updateFormItem(@RequestBody UserFormItemEntity request) { //// FormAuthUtils.hasPermission(request.getFormKey()); //// ValidatorUtils.validateEntity(request, UpdateGroup.class); // request.setSpecialType(formItemService.isSpecialTypeItem(request)); // boolean update = formItemService.update(request, Wrappers.<UserFormItemEntity>lambdaQuery().eq(UserFormItemEntity::getFormKey, request.getFormKey()).eq(UserFormItemEntity::getFormItemId, request.getFormItemId())); // return AjaxResult.success(update); // } // // /** // * 表单项排序 // * // * @param request // */ // @PostMapping("/user/form/item/sort") // public AjaxResult sortFormItem(@RequestBody SortFormItemRequest request) { //// ValidatorUtils.validateEntity(request); // if (ObjectUtil.isNull(request.getAfterPosition()) && ObjectUtil.isNull(request.getBeforePosition())) { // return AjaxResult.success(); // } // UserFormItemEntity itemEntity = formItemService.getOne(Wrappers.<UserFormItemEntity>lambdaQuery().eq(UserFormItemEntity::getFormKey, request.getFormKey()).eq(UserFormItemEntity::getFormItemId, request.getFormItemId())); // Long sort = sortUtils.calcSortPosition(request.getBeforePosition(), request.getAfterPosition(), request.getFormKey()); // if (sortUtils.sortAllList(request.getBeforePosition(), request.getAfterPosition(), request.getFormKey(), sort)) { // return AjaxResult.success(new OperateFormItemVO(itemEntity.getSort(), itemEntity.getId(), true, true)); // } // itemEntity.setSort(sort); // boolean b = formItemService.updateById(itemEntity); // return AjaxResult.success(new OperateFormItemVO(itemEntity.getSort(), itemEntity.getId(), b, false)); // } // // // /** // * 查询表单详情 // * 包含表单信息 表单字段信息 表单主题 // * // * @param key // */ // @GetMapping("/user/form/details/{key}") // @PermitAll // public AjaxResult queryFormDetails(@PathVariable @NotBlank String key) { // UserFormEntity form = formService.getByKey(key); // if (ObjectUtil.isNull(form)) { // return AjaxResult.success(); // } // List<UserFormItemEntity> formItemList = formItemService.list(Wrappers.<UserFormItemEntity>lambdaQuery().ne(UserFormItemEntity::getHideType, 1).eq(UserFormItemEntity::getFormKey, key)); // formItemList.sort(Comparator.comparing(UserFormItemEntity::getSort)); // UserFormThemeEntity theme = userFormThemeService.getByKey(key); // UserFormLogicEntity formLogic = userFormLogicService.getOne(Wrappers.<UserFormLogicEntity>lambdaQuery().eq(UserFormLogicEntity::getFormKey, key)); // // 如果是考试 移除正确答案 避免把正确答案返回到前端 // if (form.getType() == FormTypeEnum.EXAM.getValue().toString()) { // formItemList.forEach(item -> { // JSONObject schemeJson = JSONUtil.parseObj(item.getScheme()); // if (schemeJson.containsKey("examConfig")) { // schemeJson.getJSONObject("examConfig").remove("answer"); // } // item.setScheme(schemeJson); // }); // } // return AjaxResult.success(new UserFormDetailVO(new UserFormDetailVO.UserForm(form), formItemList, theme, formLogic)); // } // // // /** // * 发布表单 // */ // @PostMapping("/user/form/publish") // public AjaxResult publishForm(@RequestBody UserFormEntity request) { //// FormAuthUtils.hasPermission(request.getFormKey()); // long count = formItemService.count(Wrappers.<UserFormItemEntity>lambdaQuery().eq(UserFormItemEntity::getFormKey, request.getFormKey())); // if (count == CommonConstants.ConstantNumber.ZERO) { // return AjaxResult.error("无有效表单项,无法发布"); // } // UserFormEntity entity = formService.getByKey(request.getFormKey()); // entity.setStatus(2); // return AjaxResult.success(formService.updateById(entity)); // } // // // /** // * 停止收集 // * // * @param request // */ // @PostMapping("/user/form/stop") // public Result stopForm(@RequestBody UserFormEntity request) { //// FormAuthUtils.hasPermission(request.getFormKey()); // UserFormEntity entity = formService.getByKey(request.getFormKey()); // entity.setStatus(3); // return Result.success(formService.updateById(entity)); // } // // // /** // * 查询我的表单分页 // */ // @GetMapping("/user/form/page") // public Result queryMyForms(@RequestAttribute Long userId, QueryFormRequest.Page request) { // LambdaQueryWrapper<UserFormEntity> queryWrapper = Wrappers.<UserFormEntity>lambdaQuery().eq(UserFormEntity::getUserId, userId) // .eq(ObjectUtil.isNotNull(request.getFolder()), UserFormEntity::getFolder, request.getFolder()) // .eq(ObjectUtil.isNotNull(request.getType()), UserFormEntity::getType, request.getType()) // .eq(UserFormEntity::getDeleted, 0).func(i -> { // // 通过文件名搜索时 可以搜索到子文件夹下的表单 // if (StrUtil.isNotBlank(request.getName()) && request.getFolderId() == 0) { // } else { // i.eq(UserFormEntity::getFolderId, request.getFolderId()); // } // }).eq(ObjectUtil.isNotNull(request.getStatus()), UserFormEntity::getStatus, request.getStatus()).like(StrUtil.isNotBlank(request.getName()), // UserFormEntity::getName, request.getName()).le(ObjectUtil.isNotNull(request.getEndDateTime()), UserFormEntity::getUpdateTime, // request.getEndDateTime()).ge(ObjectUtil.isNotNull(request.getBeginDateTime()), UserFormEntity::getUpdateTime, // request.getBeginDateTime()).orderByDesc(UserFormEntity::getFolder) //// .orderByDesc(TBaseEntity::getCreateTime) // ; // return Result.success(formService.page(request.toMybatisPage(), queryWrapper)); // } // // // /** // * 获取表单字段 包括系统默认字段 // */ // @GetMapping("/user/form/fields/{formKey}") // public Result queryUserFormFields(@PathVariable String formKey) { // return Result.success(formItemService.listAllFormFields(formKey)); // } // // /** // * 获取表单固定字段 // * 所有表单都包含 用于查看详情右侧显示 // */ // @GetMapping("/user/form/fixed/fields/{formKey}") // public Result queryUserFormFixedFields(@PathVariable String formKey) { // // 查询表单类型 // UserFormEntity userFormEntity = formService.getByKey(formKey); // List<FormFieldVO> fields = new ArrayList<>(); // FormDataUtils.addFormBaseDataField(fields); // fields.add(new FormFieldVO("submitUaOs", "操作系统")); // fields.add(new FormFieldVO("submitUaDevice", "设备")); // fields.add(new FormFieldVO(UserFormDataEntity.Fields.submitBrowser, "浏览器")); // fields.add(new FormFieldVO(UserFormDataEntity.Fields.submitAddress, "地址")); // fields.add(new FormFieldVO(UserFormDataEntity.Fields.submitRequestIp, "IP")); // fields.add(new FormFieldVO(UserFormDataEntity.Fields.wxUserInfo, "微信用户")); // return Result.success(fields); // } // //} if (ObjectUtil.isNull(request.getAfterPosition()) && ObjectUtil.isNull(request.getBeforePosition())) { return AjaxResult.success(); } UserFormItemEntity itemEntity = formItemService.getOne(Wrappers.<UserFormItemEntity>lambdaQuery().eq(UserFormItemEntity::getFormKey, request.getFormKey()).eq(UserFormItemEntity::getFormItemId, request.getFormItemId())); Long sort = sortUtils.calcSortPosition(request.getBeforePosition(), request.getAfterPosition(), request.getFormKey()); if (sortUtils.sortAllList(request.getBeforePosition(), request.getAfterPosition(), request.getFormKey(), sort)) { return AjaxResult.success(new OperateFormItemVO(itemEntity.getSort(), itemEntity.getId(), true, true)); } itemEntity.setSort(sort); boolean b = formItemService.updateById(itemEntity); return AjaxResult.success(new OperateFormItemVO(itemEntity.getSort(), itemEntity.getId(), b, false)); } /** * 查询表单详情 * 包含表单信息 表单字段信息 表单主题 * * @param key */ @GetMapping("/user/form/details/{key}") @PermitAll public AjaxResult queryFormDetails(@PathVariable @NotBlank String key) { UserFormEntity form = formService.getByKey(key); if (ObjectUtil.isNull(form)) { return AjaxResult.success(); } List<UserFormItemEntity> formItemList = formItemService.list(Wrappers.<UserFormItemEntity>lambdaQuery().ne(UserFormItemEntity::getHideType, 1).eq(UserFormItemEntity::getFormKey, key)); formItemList.sort(Comparator.comparing(UserFormItemEntity::getSort)); UserFormThemeEntity theme = userFormThemeService.getByKey(key); UserFormLogicEntity formLogic = userFormLogicService.getOne(Wrappers.<UserFormLogicEntity>lambdaQuery().eq(UserFormLogicEntity::getFormKey, key)); // 如果是考试 移除正确答案 避免把正确答案返回到前端 if (form.getType() == FormTypeEnum.EXAM.getValue().toString()) { formItemList.forEach(item -> { JSONObject schemeJson = JSONUtil.parseObj(item.getScheme()); if (schemeJson.containsKey("examConfig")) { schemeJson.getJSONObject("examConfig").remove("answer"); } item.setScheme(schemeJson); }); } return AjaxResult.success(new UserFormDetailVO(new UserFormDetailVO.UserForm(form), formItemList, theme, formLogic)); } /** * 发布表单 */ @PostMapping("/user/form/publish") public AjaxResult publishForm(@RequestBody UserFormEntity request) { // FormAuthUtils.hasPermission(request.getFormKey()); long count = formItemService.count(Wrappers.<UserFormItemEntity>lambdaQuery().eq(UserFormItemEntity::getFormKey, request.getFormKey())); if (count == CommonConstants.ConstantNumber.ZERO) { return AjaxResult.error("无有效表单项,无法发布"); } UserFormEntity entity = formService.getByKey(request.getFormKey()); entity.setStatus(2); return AjaxResult.success(formService.updateById(entity)); } /** * 停止收集 * * @param request */ @PostMapping("/user/form/stop") public Result stopForm(@RequestBody UserFormEntity request) { // FormAuthUtils.hasPermission(request.getFormKey()); UserFormEntity entity = formService.getByKey(request.getFormKey()); entity.setStatus(3); return Result.success(formService.updateById(entity)); } /** * 查询我的表单分页 */ @GetMapping("/user/form/page") public Result queryMyForms(@RequestAttribute Long userId, QueryFormRequest.Page request) { LambdaQueryWrapper<UserFormEntity> queryWrapper = Wrappers.<UserFormEntity>lambdaQuery().eq(UserFormEntity::getUserId, userId) .eq(ObjectUtil.isNotNull(request.getFolder()), UserFormEntity::getFolder, request.getFolder()) .eq(ObjectUtil.isNotNull(request.getType()), UserFormEntity::getType, request.getType()) .eq(UserFormEntity::getDeleted, 0).func(i -> { // 通过文件名搜索时 可以搜索到子文件夹下的表单 if (StrUtil.isNotBlank(request.getName()) && request.getFolderId() == 0) { } else { i.eq(UserFormEntity::getFolderId, request.getFolderId()); } }).eq(ObjectUtil.isNotNull(request.getStatus()), UserFormEntity::getStatus, request.getStatus()).like(StrUtil.isNotBlank(request.getName()), UserFormEntity::getName, request.getName()).le(ObjectUtil.isNotNull(request.getEndDateTime()), UserFormEntity::getUpdateTime, request.getEndDateTime()).ge(ObjectUtil.isNotNull(request.getBeginDateTime()), UserFormEntity::getUpdateTime, request.getBeginDateTime()).orderByDesc(UserFormEntity::getFolder) // .orderByDesc(TBaseEntity::getCreateTime) ; return Result.success(formService.page(request.toMybatisPage(), queryWrapper)); } /** * 获取表单字段 包括系统默认字段 */ @GetMapping("/user/form/fields/{formKey}") public Result queryUserFormFields(@PathVariable String formKey) { return Result.success(formItemService.listAllFormFields(formKey)); } /** * 获取表单固定字段 * 所有表单都包含 用于查看详情右侧显示 */ @GetMapping("/user/form/fixed/fields/{formKey}") public Result queryUserFormFixedFields(@PathVariable String formKey) { // 查询表单类型 UserFormEntity userFormEntity = formService.getByKey(formKey); List<FormFieldVO> fields = new ArrayList<>(); FormDataUtils.addFormBaseDataField(fields); fields.add(new FormFieldVO("submitUaOs", "操作系统")); fields.add(new FormFieldVO("submitUaDevice", "设备")); fields.add(new FormFieldVO(UserFormDataEntity.Fields.submitBrowser, "浏览器")); fields.add(new FormFieldVO(UserFormDataEntity.Fields.submitAddress, "地址")); fields.add(new FormFieldVO(UserFormDataEntity.Fields.submitRequestIp, "IP")); fields.add(new FormFieldVO(UserFormDataEntity.Fields.wxUserInfo, "微信用户")); return Result.success(fields); } } ltkj-admin/src/main/java/com/ltkj/web/tduck/UserFormResultController.java
@@ -1,254 +1,254 @@ //package com.ltkj.web.tduck; // //import cn.hutool.core.date.DateUtil; //import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; //import com.ltkj.common.core.domain.AjaxResult; //import com.ltkj.common.utils.SecurityUtils; //import com.ltkj.common.utils.http.HttpUtils; //import com.ltkj.tduck.domain.UserFormDataEntity; //import com.ltkj.tduck.domain.UserFormViewCountEntity; //import com.ltkj.tduck.request.QueryFormResultRequest; //import com.ltkj.tduck.service.UserFormDataService; //import com.ltkj.tduck.service.UserFormViewCountService; //import com.ltkj.tduck.utils.Result; //import com.ltkj.tduck.utils.ValidatorUtils; //import lombok.RequiredArgsConstructor; //import lombok.extern.slf4j.Slf4j; //import org.springframework.web.bind.annotation.*; // //import javax.annotation.security.PermitAll; //import javax.servlet.http.HttpServletRequest; //import java.util.List; //import java.util.Map; //import java.util.concurrent.ConcurrentHashMap; //import java.util.concurrent.ConcurrentMap; package com.ltkj.web.tduck; import cn.hutool.core.date.DateUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.ltkj.common.core.domain.AjaxResult; import com.ltkj.common.utils.SecurityUtils; import com.ltkj.common.utils.http.HttpUtils; import com.ltkj.tduck.domain.UserFormDataEntity; import com.ltkj.tduck.domain.UserFormViewCountEntity; import com.ltkj.tduck.request.QueryFormResultRequest; import com.ltkj.tduck.service.UserFormDataService; import com.ltkj.tduck.service.UserFormViewCountService; import com.ltkj.tduck.utils.Result; import com.ltkj.tduck.utils.ValidatorUtils; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; import javax.annotation.security.PermitAll; import javax.servlet.http.HttpServletRequest; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; /** * 表单数据 * * @author : smalljop * @description : 表单数据页 当前用户自己使用接口 * @create : 2020-11-18 18:17 **/ @Slf4j @RestController @RequiredArgsConstructor @RequestMapping("/user/form/data") public class UserFormResultController { private final UserFormDataService formResultService; // private final UserFormSettingService userFormSettingService; // private final FormDataImportUtils formDataImportUtils; // private final FormDataExportUtils formDataExportUtils; // private final UserFormService userFormService; private final UserFormViewCountService userFormViewCountService; // private final MailService mailService; // private final WxMpUserMsgService userMsgService; private final ConcurrentMap<String, Integer> viewFormMap = new ConcurrentHashMap<>(); /** * 根据体检号获取问卷记录 */ @GetMapping("getRecordByTjNumber") public AjaxResult getRecordByTjNumber(String tjNumber) { LambdaQueryWrapper<UserFormDataEntity> wq=new LambdaQueryWrapper<>(); wq.eq(UserFormDataEntity::getTjNumber,tjNumber); final List<UserFormDataEntity> list = formResultService.list(wq); AjaxResult ajaxResult = new AjaxResult(); ajaxResult.put("code", 200); ajaxResult.put("data", list); ajaxResult.put("msg", null); return ajaxResult; } /*** * 查看表单 * 记录查看的IP 统计查看用户数 */ @GetMapping("view/{formKey}") @PermitAll public Result<Void> viewForm(HttpServletRequest request, @PathVariable("formKey") String formKey) { if (viewFormMap.containsKey(formKey)) { userFormViewCountService.increment(formKey); } else { // 不存在则添加 Long count = userFormViewCountService.count(formKey); if (count == 0) { UserFormViewCountEntity entity = new UserFormViewCountEntity(); entity.setFormKey(formKey); entity.setCount(1L); userFormViewCountService.save(entity); } viewFormMap.put(formKey, 1); } return Result.success(); } /** * 查询数据 * * @param request 查询条件 * @return 数据 */ @PostMapping("query") public Result queryFormDataTable(@RequestBody QueryFormResultRequest request) { // FormAuthUtils.hasPermission(request.getFormKey()); return Result.success(formResultService.listFormDataTable(request)); } /** * 获取某条数据详情 * * @param dataId 数据ID * @return 数据详情 */ @GetMapping("details/{dataId}") @PermitAll public Result getFormDataDetails(@PathVariable("dataId") String dataId) { return formResultService.getFormDataDetails(dataId); } // // ///** // * 表单数据 // * 填写附件导出 // * // * @author : smalljop // * @description : 表单数据页 当前用户自己使用接口 // * @create : 2020-11-18 18:17 // **/ // //@Slf4j //@RestController //@RequiredArgsConstructor //@RequestMapping("/user/form/data") //public class UserFormResultController { // private final UserFormDataService formResultService; //// private final UserFormSettingService userFormSettingService; //// private final FormDataImportUtils formDataImportUtils; //// private final FormDataExportUtils formDataExportUtils; //// private final UserFormService userFormService; // private final UserFormViewCountService userFormViewCountService; //// private final MailService mailService; //// private final WxMpUserMsgService userMsgService; // private final ConcurrentMap<String, Integer> viewFormMap = new ConcurrentHashMap<>(); // // // * @param request 请求 // * @return 文件 // */ // @PostMapping("/download/file") // public Result downloadFormResultFile(@RequestBody QueryFormResultRequest request) { // return formResultService.downloadFormResultFile(request); // } /** * 填写 * * @param entity 填写数据 * @param request 请求 * @return */ @PostMapping("/create") public AjaxResult createFormResult(@RequestBody UserFormDataEntity entity, HttpServletRequest request) { ValidatorUtils.validateEntity(entity); entity.setSubmitRequestIp(HttpUtils.getIpAddr(request)); // 如果已经登陆了也记录用户信息 try catch 避免抛出异常 entity.setCreateBy(SecurityUtils.getUserId() != null ? String.valueOf(SecurityUtils.getUserId()) : null); Map<String, Object> result = formResultService.saveFormResult(entity); return AjaxResult.success(result); } /** * 公开填写 * * @param entity 填写数据 * @param request 请求 */ @PostMapping("/public/create") @PermitAll public Result<Map<String, Object>> createPublicFormResult(@RequestBody UserFormDataEntity entity, HttpServletRequest request) { ValidatorUtils.validateEntity(entity); entity.setSubmitRequestIp(HttpUtils.getIpAddr(request)); // Result<Boolean> userFormSettingStatus = userFormSettingService.getUserFormWriteSettingStatus(entity.getFormKey(), entity.getSubmitRequestIp(), entity.getWxOpenId(), CommonConstants.ConstantNumber.ONE); // if (StrUtil.isNotBlank(userFormSettingStatus.getMsg())) { // return Result.failed(userFormSettingStatus.getMsg()); // } // 如果已经登陆了也记录用户信息 try catch 避免抛出异常 entity.setCreateBy(SecurityUtils.getUserId() != null ? String.valueOf(SecurityUtils.getUserId()) : null); Map<String, Object> result = formResultService.saveFormResult(entity); // ThreadUtil.execAsync(() -> { // sendWriteResultNotify(entity.getFormKey()); // }); return Result.success(result); // return Result.success(); } // // /** // * 根据体检号获取问卷记录 // * 批量删除 // * // * @param formKey 表单key // * @param dataIdList 数据ID // * @return Result // */ // @GetMapping("getRecordByTjNumber") // public AjaxResult getRecordByTjNumber(String tjNumber) { // LambdaQueryWrapper<UserFormDataEntity> wq=new LambdaQueryWrapper<>(); // wq.eq(UserFormDataEntity::getTjNumber,tjNumber); // final List<UserFormDataEntity> list = formResultService.list(wq); // AjaxResult ajaxResult = new AjaxResult(); // ajaxResult.put("code", 200); // ajaxResult.put("data", list); // ajaxResult.put("msg", null); // return ajaxResult; // @PostMapping("/delete/{formKey}") // public Result deleteFormData(@RequestBody List<String> dataIdList, @PathVariable("formKey") String formKey) { // formResultService.deleteByIds(dataIdList, formKey); // return Result.success(); // } // // // /*** // * 查看表单 // * 记录查看的IP 统计查看用户数 // /** // * 更新 // * // * @param entity 填写数据 // * @param request 请求 // * @return Result // */ // @GetMapping("view/{formKey}") // @PostMapping("/update") // @PermitAll // public Result<Void> viewForm(HttpServletRequest request, @PathVariable("formKey") String formKey) { // if (viewFormMap.containsKey(formKey)) { // userFormViewCountService.increment(formKey); // } else { // // 不存在则添加 // Long count = userFormViewCountService.count(formKey); // if (count == 0) { // UserFormViewCountEntity entity = new UserFormViewCountEntity(); // entity.setFormKey(formKey); // entity.setCount(1L); // userFormViewCountService.save(entity); // public Result<Void> updateFormResult(@RequestBody UserFormDataEntity entity, HttpServletRequest request) { // ValidatorUtils.validateEntity(entity); // try { // entity.setUpdateBy(String.valueOf(SecurityUtils.getUserId())); // } catch (Exception ignored) { // } // viewFormMap.put(formKey, 1); // } // formResultService.updateFormResult(entity); // return Result.success(); // } // // /** // * 查询数据 // * 下载导入模板 // * // * @param request 查询条件 // * @return 数据 // * @param response 响应 // * @param formKey 表单key // */ // @PostMapping("query") // public Result queryFormDataTable(@RequestBody QueryFormResultRequest request) { //// FormAuthUtils.hasPermission(request.getFormKey()); // return Result.success(formResultService.listFormDataTable(request)); // @GetMapping("/import/template") // public void downloadImportTemplate(HttpServletResponse response, String formKey) { // formDataImportUtils.importTemplateExcel(response, formKey); // } // // /** // * 获取某条数据详情 // * // * @param dataId 数据ID // * @return 数据详情 // * 导出表单数据 // */ // @GetMapping("details/{dataId}") // @PermitAll // public Result getFormDataDetails(@PathVariable("dataId") String dataId) { // return formResultService.getFormDataDetails(dataId); // @PostMapping("export") // public void exportFormData(@RequestBody ExportRequest.FormData exportRequest) { // formDataExportUtils.exportData(exportRequest); // } //// //// //// /** //// * 填写附件导出 //// * //// * @param request 请求 //// * @return 文件 //// */ //// @PostMapping("/download/file") //// public Result downloadFormResultFile(@RequestBody QueryFormResultRequest request) { //// return formResultService.downloadFormResultFile(request); //// } // // /** // * 填写 // * 导入表单数据 // * // * @param entity 填写数据 // * @param request 请求 // * @return // * @param file 文件 // * @return Result // */ // @PostMapping("/create") // public AjaxResult createFormResult(@RequestBody UserFormDataEntity entity, HttpServletRequest request) { // ValidatorUtils.validateEntity(entity); // entity.setSubmitRequestIp(HttpUtils.getIpAddr(request)); // // 如果已经登陆了也记录用户信息 try catch 避免抛出异常 // entity.setCreateBy(SecurityUtils.getUserId() != null ? String.valueOf(SecurityUtils.getUserId()) : null); // Map<String, Object> result = formResultService.saveFormResult(entity); // return AjaxResult.success(result); // @PostMapping("import") // public Result importFormData(@RequestParam("file") MultipartFile file, UserFormDataEntity dataEntity) throws IOException { // return Result.success(formDataImportUtils.importFile(file.getInputStream(), dataEntity.getFormKey())); // } // // // /** // * 公开填写 // * // * @param entity 填写数据 // * @param request 请求 // */ // @PostMapping("/public/create") // @PermitAll // public Result<Map<String, Object>> createPublicFormResult(@RequestBody UserFormDataEntity entity, HttpServletRequest request) { // // ValidatorUtils.validateEntity(entity); // entity.setSubmitRequestIp(HttpUtils.getIpAddr(request)); //// Result<Boolean> userFormSettingStatus = userFormSettingService.getUserFormWriteSettingStatus(entity.getFormKey(), entity.getSubmitRequestIp(), entity.getWxOpenId(), CommonConstants.ConstantNumber.ONE); //// if (StrUtil.isNotBlank(userFormSettingStatus.getMsg())) { //// return Result.failed(userFormSettingStatus.getMsg()); //// } // // 如果已经登陆了也记录用户信息 try catch 避免抛出异常 // entity.setCreateBy(SecurityUtils.getUserId() != null ? String.valueOf(SecurityUtils.getUserId()) : null); // Map<String, Object> result = formResultService.saveFormResult(entity); //// ThreadUtil.execAsync(() -> { //// sendWriteResultNotify(entity.getFormKey()); //// }); // return Result.success(result); //// return Result.success(); // private void sendWriteResultNotify(String formKey) { // FormSettingSchemaStruct formSettingSchema = userFormSettingService.getFormSettingSchema(formKey); // if (ObjectUtil.isNull(formSettingSchema)) { // return; // } // UserFormEntity form = userFormService.getByKey(formKey); // if (StrUtil.isNotBlank(formSettingSchema.getNewWriteNotifyEmail())) { // mailService.sendTemplateHtmlMail(formSettingSchema.getNewWriteNotifyEmail(), "新回复通知", "mail/form-write-notify", MapUtil.of("projectName", form.getName())); // } // //// //// /** //// * 批量删除 //// * //// * @param formKey 表单key //// * @param dataIdList 数据ID //// * @return Result //// */ //// @PostMapping("/delete/{formKey}") //// public Result deleteFormData(@RequestBody List<String> dataIdList, @PathVariable("formKey") String formKey) { //// formResultService.deleteByIds(dataIdList, formKey); //// return Result.success(); //// } // // //// /** //// * 更新 //// * //// * @param entity 填写数据 //// * @param request 请求 //// * @return Result //// */ //// @PostMapping("/update") //// @PermitAll //// public Result<Void> updateFormResult(@RequestBody UserFormDataEntity entity, HttpServletRequest request) { //// ValidatorUtils.validateEntity(entity); //// try { //// entity.setUpdateBy(String.valueOf(SecurityUtils.getUserId())); //// } catch (Exception ignored) { //// } //// formResultService.updateFormResult(entity); //// return Result.success(); //// } //// //// /** //// * 下载导入模板 //// * //// * @param response 响应 //// * @param formKey 表单key //// */ //// @GetMapping("/import/template") //// public void downloadImportTemplate(HttpServletResponse response, String formKey) { //// formDataImportUtils.importTemplateExcel(response, formKey); //// } //// //// /** //// * 导出表单数据 //// */ //// @PostMapping("export") //// public void exportFormData(@RequestBody ExportRequest.FormData exportRequest) { //// formDataExportUtils.exportData(exportRequest); //// } //// //// /** //// * 导入表单数据 //// * //// * @param file 文件 //// * @return Result //// */ //// @PostMapping("import") //// public Result importFormData(@RequestParam("file") MultipartFile file, UserFormDataEntity dataEntity) throws IOException { //// return Result.success(formDataImportUtils.importFile(file.getInputStream(), dataEntity.getFormKey())); //// } //// //// //// private void sendWriteResultNotify(String formKey) { //// FormSettingSchemaStruct formSettingSchema = userFormSettingService.getFormSettingSchema(formKey); //// if (ObjectUtil.isNull(formSettingSchema)) { //// return; //// } //// UserFormEntity form = userFormService.getByKey(formKey); //// if (StrUtil.isNotBlank(formSettingSchema.getNewWriteNotifyEmail())) { //// mailService.sendTemplateHtmlMail(formSettingSchema.getNewWriteNotifyEmail(), "新回复通知", "mail/form-write-notify", MapUtil.of("projectName", form.getName())); //// } //// //// if (StrUtil.isNotBlank(formSettingSchema.getNewWriteNotifyWx())) { //// List<String> openIdList = StrUtil.splitTrim(formSettingSchema.getNewWriteNotifyWx(), ";"); //// openIdList.stream().forEach(openId -> { //// userMsgService.sendKfTextMsg("", openId, "收到新的反馈,请去Pc端查看"); //// }); //// } //// } // // if (StrUtil.isNotBlank(formSettingSchema.getNewWriteNotifyWx())) { // List<String> openIdList = StrUtil.splitTrim(formSettingSchema.getNewWriteNotifyWx(), ";"); // openIdList.stream().forEach(openId -> { // userMsgService.sendKfTextMsg("", openId, "收到新的反馈,请去Pc端查看"); // }); //} // } } ltkj-admin/src/main/java/com/ltkj/web/tduck/UserFormSettingController.java
@@ -1,143 +1,143 @@ //package com.ltkj.web.tduck; // //import cn.hutool.core.util.ObjectUtil; //import com.ltkj.common.utils.http.HttpUtils; //import com.ltkj.tduck.domain.UserFormSettingEntity; //import com.ltkj.tduck.request.CheckWritePwdRequest; //import com.ltkj.tduck.service.UserFormSettingService; //import com.ltkj.tduck.utils.CacheUtils; //import com.ltkj.tduck.utils.Result; //import lombok.RequiredArgsConstructor; //import lombok.extern.slf4j.Slf4j; //import org.springframework.validation.annotation.Validated; //import org.springframework.web.bind.annotation.*; // //import javax.annotation.security.PermitAll; //import javax.servlet.http.HttpServletRequest; //import java.util.Map; // ///** // * 表单设置 // * // * @author : smalljop // * @description : 表单设置 // * @create : 2020-11-18 18:17 // **/ //@Slf4j //@RestController //@RequiredArgsConstructor //public class UserFormSettingController { // // private final UserFormSettingService userFormSettingService; //// private final WxMpUserService wxMpUserService; // private final CacheUtils cacheUtils; //// private final WxMpService wxMpService; // // // /** // * 保存表单设置 // */ // @PostMapping("/user/form/setting/save") // public Result<Boolean> saveFormSetting(@RequestBody Map<String, Object> setting) { // String formKey = setting.get("formKey").toString(); //// FormAuthUtils.hasPermission(formKey); // return Result.success(userFormSettingService.saveFormSetting(setting)); package com.ltkj.web.tduck; import cn.hutool.core.util.ObjectUtil; import com.ltkj.common.utils.http.HttpUtils; import com.ltkj.tduck.domain.UserFormSettingEntity; import com.ltkj.tduck.request.CheckWritePwdRequest; import com.ltkj.tduck.service.UserFormSettingService; import com.ltkj.tduck.utils.CacheUtils; import com.ltkj.tduck.utils.Result; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import javax.annotation.security.PermitAll; import javax.servlet.http.HttpServletRequest; import java.util.Map; /** * 表单设置 * * @author : smalljop * @description : 表单设置 * @create : 2020-11-18 18:17 **/ @Slf4j @RestController @RequiredArgsConstructor public class UserFormSettingController { private final UserFormSettingService userFormSettingService; // private final WxMpUserService wxMpUserService; private final CacheUtils cacheUtils; // private final WxMpService wxMpService; /** * 保存表单设置 */ @PostMapping("/user/form/setting/save") public Result<Boolean> saveFormSetting(@RequestBody Map<String, Object> setting) { String formKey = setting.get("formKey").toString(); // FormAuthUtils.hasPermission(formKey); return Result.success(userFormSettingService.saveFormSetting(setting)); } /** * 表单提交设置查询 */ @GetMapping("/user/form/setting/{key}") public Result<Map<String, Object>> queryFormSettingByKey(@PathVariable("key") String formKey) { UserFormSettingEntity setting = userFormSettingService.getFormSettingByKey(formKey); if (ObjectUtil.isNull(setting)) { return Result.success(); } Map<String, Object> settings = setting.getSettings(); settings.put(UserFormSettingEntity.Fields.formKey, formKey); return Result.success(settings); } /** * 当前填写设置的状态 * * @param formKey 表单key * @param wxOpenId 微信openid * @param type 类型 1公开填写 2.指定填写 */ @GetMapping("/user/form/setting-status") @PermitAll public Result<Boolean> querySettingStatus(@RequestParam String formKey, @RequestParam(required = false) String wxOpenId, @RequestParam(required = false) Integer type, HttpServletRequest request) { return userFormSettingService.getUserFormWriteSettingStatus(formKey, HttpUtils.getIpAddr(request), wxOpenId, type); } /** * 填写微信通知二维码 */ @GetMapping("/user/form/wx/notify-qrcode") public Result<String> getWxNotifyQrCode(@RequestParam("key") String formKey) throws Exception { // String loginSceneStr = JsonUtils.objToJson(new WxMpQrCodeGenRequest(WxMpQrCodeGenRequest.QrCodeType.SUB_NOTIFY, formKey)); // //5分钟有效 // WxMpQrCodeTicket ticket = wxMpService.getQrcodeService().qrCodeCreateTmpTicket(loginSceneStr, 10 * 60); // String subNotifyQrcodeUrl = wxMpService.getQrcodeService().qrCodePictureUrl(ticket.getTicket()); // return Result.success(subNotifyQrcodeUrl); return Result.success(); } /** * 填写微信通知二维码 */ @PostMapping("/user/form/wx/delete/notify-user") public Result<Boolean> deleteWxNotifyQrCode(@RequestParam("key") String key, @RequestParam("openId") String openId) { // cacheUtils.removeList(StrUtil.format(WxMpRedisKeyConstants.WX_MP_SUB_NOTIFY, key), openId); return Result.success(true); } /** * 获取表单微信通知用户 */ @GetMapping("/user/form/wx/notify-user") public Result getWxNotifyUser(@RequestParam("key") String formKey, @RequestParam(required = false) String openIdStr) { // Set<Object> subNotifyUsers = null; // if (StrUtil.isNotBlank(openIdStr)) { // subNotifyUsers = Sets.newHashSet(StrUtil.splitTrim(openIdStr, ";")); // } else { // List coll = cacheUtils.getList(StrUtil.format(WxMpRedisKeyConstants.WX_MP_SUB_NOTIFY, formKey), String.class); // subNotifyUsers = Collections.singleton(coll.stream().collect(Collectors.toSet())); // } // // /** // * 表单提交设置查询 // */ // @GetMapping("/user/form/setting/{key}") // public Result<Map<String, Object>> queryFormSettingByKey(@PathVariable("key") String formKey) { // UserFormSettingEntity setting = userFormSettingService.getFormSettingByKey(formKey); // if (ObjectUtil.isNull(setting)) { // return Result.success(); // } // Map<String, Object> settings = setting.getSettings(); // settings.put(UserFormSettingEntity.Fields.formKey, formKey); // return Result.success(settings); // } // // // /** // * 当前填写设置的状态 // * // * @param formKey 表单key // * @param wxOpenId 微信openid // * @param type 类型 1公开填写 2.指定填写 // */ // @GetMapping("/user/form/setting-status") // @PermitAll // public Result<Boolean> querySettingStatus(@RequestParam String formKey, @RequestParam(required = false) String wxOpenId, @RequestParam(required = false) Integer type, HttpServletRequest request) { // return userFormSettingService.getUserFormWriteSettingStatus(formKey, HttpUtils.getIpAddr(request), wxOpenId, type); // } // // // /** // * 填写微信通知二维码 // */ // @GetMapping("/user/form/wx/notify-qrcode") // public Result<String> getWxNotifyQrCode(@RequestParam("key") String formKey) throws Exception { //// String loginSceneStr = JsonUtils.objToJson(new WxMpQrCodeGenRequest(WxMpQrCodeGenRequest.QrCodeType.SUB_NOTIFY, formKey)); //// //5分钟有效 //// WxMpQrCodeTicket ticket = wxMpService.getQrcodeService().qrCodeCreateTmpTicket(loginSceneStr, 10 * 60); //// String subNotifyQrcodeUrl = wxMpService.getQrcodeService().qrCodePictureUrl(ticket.getTicket()); //// return Result.success(subNotifyQrcodeUrl); // return Result.success(); // } // // // /** // * 填写微信通知二维码 // */ // @PostMapping("/user/form/wx/delete/notify-user") // public Result<Boolean> deleteWxNotifyQrCode(@RequestParam("key") String key, @RequestParam("openId") String openId) { //// cacheUtils.removeList(StrUtil.format(WxMpRedisKeyConstants.WX_MP_SUB_NOTIFY, key), openId); // return Result.success(wxMpUserService.listWxMpUserByOpenId(subNotifyUsers).stream().map(item -> new WxMpUserVO(item.getNickname(), item.getHeadImgUrl(), item.getOpenId())).collect(Collectors.toList())); return Result.success(); } /** * 公开接口 * 表单填写时需要的设置 */ @GetMapping("/user/form/public/settings/{key}") @PermitAll public Result queryPublicFormSettingByKey(@PathVariable("key") String formKey) { // FormSettingSchemaStruct formSettingSchema = userFormSettingService.getFormSettingSchema(formKey); return Result.success(); } /** * 公开接口 * 检查填写密码是否正确 */ @PostMapping("/user/form/public/checkWritePwd") @PermitAll public Result<Boolean> checkWritePwd(@RequestBody @Validated CheckWritePwdRequest request) { // FormSettingSchemaStruct formSettingSchema = userFormSettingService.getFormSettingSchema(request.getFormKey()); // if (formSettingSchema.getWritePassword().equals(request.getPassword())) { // return Result.success(true); // } // // /** // * 获取表单微信通知用户 // */ // @GetMapping("/user/form/wx/notify-user") // public Result getWxNotifyUser(@RequestParam("key") String formKey, @RequestParam(required = false) String openIdStr) { //// Set<Object> subNotifyUsers = null; //// if (StrUtil.isNotBlank(openIdStr)) { //// subNotifyUsers = Sets.newHashSet(StrUtil.splitTrim(openIdStr, ";")); //// } else { //// List coll = cacheUtils.getList(StrUtil.format(WxMpRedisKeyConstants.WX_MP_SUB_NOTIFY, formKey), String.class); //// subNotifyUsers = Collections.singleton(coll.stream().collect(Collectors.toSet())); //// } //// return Result.success(wxMpUserService.listWxMpUserByOpenId(subNotifyUsers).stream().map(item -> new WxMpUserVO(item.getNickname(), item.getHeadImgUrl(), item.getOpenId())).collect(Collectors.toList())); // return Result.success(); // } // // // /** // * 公开接口 // * 表单填写时需要的设置 // */ // @GetMapping("/user/form/public/settings/{key}") // @PermitAll // public Result queryPublicFormSettingByKey(@PathVariable("key") String formKey) { //// FormSettingSchemaStruct formSettingSchema = userFormSettingService.getFormSettingSchema(formKey); // return Result.success(); // } // // /** // * 公开接口 // * 检查填写密码是否正确 // */ // @PostMapping("/user/form/public/checkWritePwd") // @PermitAll // public Result<Boolean> checkWritePwd(@RequestBody @Validated CheckWritePwdRequest request) { //// FormSettingSchemaStruct formSettingSchema = userFormSettingService.getFormSettingSchema(request.getFormKey()); //// if (formSettingSchema.getWritePassword().equals(request.getPassword())) { //// return Result.success(true); //// } //// return Result.failed("密码输入错误"); // return Result.success(true); // } // // //} // return Result.failed("密码输入错误"); return Result.success(true); } } ltkj-admin/src/main/resources/application.yml
@@ -72,8 +72,7 @@ enabled: true # cache: # type: ehcache # ehcache: # config: classpath:config/ehcache.xml # redis 配置 # redis: # # 地址 ltkj-framework/pom.xml
@@ -19,8 +19,21 @@ <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.9.0</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId> </dependency> <dependency> <groupId>net.sf.ehcache</groupId> <artifactId>ehcache</artifactId> </dependency> <!-- SpringBoot Web容器 --> <dependency> <groupId>org.springframework.boot</groupId> ltkj-hosp/src/main/java/com/ltkj/hosp/service/impl/TjSurveyTemplateServiceImpl.java
@@ -93,8 +93,7 @@ @Override public int updateTjSurveyTemplate(TjSurveyTemplate tjSurveyTemplate) { tjSurveyTemplate.setUpdateTime(DateUtils.getNowDate()); tjSurveyTemplateMapper.deleteTjSurveyTempQuesByMid(tjSurveyTemplate.getMid()) ; tjSurveyTemplateMapper.deleteTjSurveyTempQuesByMid(tjSurveyTemplate.getMid()); insertTjSurveyTempQues(tjSurveyTemplate); return tjSurveyTemplateMapper.updateTjSurveyTemplate(tjSurveyTemplate); } ltkj-system/src/main/java/com/ltkj/system/service/ISysDeptService.java
@@ -149,4 +149,6 @@ Map<String,Object> getSysDeptYjWjCustomerList13(String deptid, String tjname, String tjNumber, int type, int page , int pageSize); Map<String,Object> getSysDeptHyAndYxYjWjCustomerList13(String deptid, String tjname, String tjNumber, int type, int page , int pageSize); List<TreeSelect> selectDeptList1(SysDept dept); } ltkj-system/src/main/java/com/ltkj/system/service/impl/SysDeptServiceImpl.java
@@ -422,4 +422,10 @@ return map1 ; } @Override public List<TreeSelect> selectDeptList1(SysDept dept) { List<SysDept> depts = SpringUtils.getAopProxy(this).selectDeptList11(dept); return buildDeptTreeSelect(depts); } } ltkj-system/src/main/java/com/ltkj/tduck/service/UserFormSettingService.java
@@ -1,61 +1,61 @@ //package com.ltkj.tduck.service; // // // //import com.baomidou.mybatisplus.extension.service.IService; //import com.ltkj.tduck.domain.UserFormSettingEntity; //import com.ltkj.tduck.struct.FormSettingSchemaStruct; //import com.ltkj.tduck.utils.Result; // //import java.util.Map; // ///** // * 表单设置 // * // * @author smalljop // * @since 2020-11-30 14:00:52 // */ //public interface UserFormSettingService extends IService<UserFormSettingEntity> { // /** // * 保存表单设置 // */ // Boolean saveFormSetting(Map<String, Object> params); // // // /** // * 表单设置 // * // * @param formKey 表单key // * @return 设置项 // */ // UserFormSettingEntity getFormSettingByKey(String formKey); // // /** // * 设置具体定义设置项 // * // * @param formKey 表单key // * @return 设置项 // */ // FormSettingSchemaStruct getFormSettingSchema(String formKey); // // /** // * 获取当前项目设置的状态 // * 是否可以填写等 // * // * @param formKey 表单key // * @param requestIp 请求ip // * @param wxOpenId 微信openid // * @param type 类型 1公开填写 2.指定填写 // * @return 是否可以填写 // */ // Result<Boolean> getUserFormWriteSettingStatus(String formKey, String requestIp, String wxOpenId, Integer type); // // // /** // * 删除表单所有设置 // * // * @param key 表单key // * @return 是否删除成功 // */ // Boolean deleteAllSetting(String key); //} package com.ltkj.tduck.service; import com.baomidou.mybatisplus.extension.service.IService; import com.ltkj.tduck.domain.UserFormSettingEntity; import com.ltkj.tduck.struct.FormSettingSchemaStruct; import com.ltkj.tduck.utils.Result; import java.util.Map; /** * 表单设置 * * @author smalljop * @since 2020-11-30 14:00:52 */ public interface UserFormSettingService extends IService<UserFormSettingEntity> { /** * 保存表单设置 */ Boolean saveFormSetting(Map<String, Object> params); /** * 表单设置 * * @param formKey 表单key * @return 设置项 */ UserFormSettingEntity getFormSettingByKey(String formKey); /** * 设置具体定义设置项 * * @param formKey 表单key * @return 设置项 */ FormSettingSchemaStruct getFormSettingSchema(String formKey); /** * 获取当前项目设置的状态 * 是否可以填写等 * * @param formKey 表单key * @param requestIp 请求ip * @param wxOpenId 微信openid * @param type 类型 1公开填写 2.指定填写 * @return 是否可以填写 */ Result<Boolean> getUserFormWriteSettingStatus(String formKey, String requestIp, String wxOpenId, Integer type); /** * 删除表单所有设置 * * @param key 表单key * @return 是否删除成功 */ Boolean deleteAllSetting(String key); } ltkj-system/src/main/java/com/ltkj/tduck/service/impl/UserFormDataServiceImpl.java
@@ -1,159 +1,159 @@ //package com.ltkj.tduck.service.impl; // //import cn.hutool.core.bean.BeanUtil; //import cn.hutool.core.map.MapUtil; //import cn.hutool.core.util.ObjectUtil; //import cn.hutool.core.util.StrUtil; //import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; //import com.ltkj.common.utils.ip.AddressUtils; //import com.ltkj.tduck.constant.CommonConstants; //import com.ltkj.tduck.domain.UserFormDataEntity; //import com.ltkj.tduck.mapper.UserFormDataMapper; //import com.ltkj.tduck.request.QueryFormResultRequest; //import com.ltkj.tduck.service.UserFormDataService; //import com.ltkj.tduck.service.UserFormItemService; //import com.ltkj.tduck.utils.CacheUtils; //import com.ltkj.tduck.utils.FormDataUtils; //import com.ltkj.tduck.utils.Result; //import com.ltkj.tduck.vo.FormDataTableVO; //import com.ltkj.tduck.vo.FormFieldVO; //import lombok.RequiredArgsConstructor; //import lombok.extern.slf4j.Slf4j; //import org.springframework.stereotype.Service; //import org.springframework.transaction.annotation.Transactional; // //import java.util.HashMap; //import java.util.List; //import java.util.Map; // //import static com.ltkj.tduck.constant.FormRedisKeyConstants.FORM_RESULT_NUMBER; package com.ltkj.tduck.service.impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.map.MapUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ltkj.common.utils.ip.AddressUtils; import com.ltkj.tduck.constant.CommonConstants; import com.ltkj.tduck.domain.UserFormDataEntity; import com.ltkj.tduck.mapper.UserFormDataMapper; import com.ltkj.tduck.request.QueryFormResultRequest; import com.ltkj.tduck.service.UserFormDataService; import com.ltkj.tduck.service.UserFormItemService; import com.ltkj.tduck.utils.CacheUtils; import com.ltkj.tduck.utils.FormDataUtils; import com.ltkj.tduck.utils.Result; import com.ltkj.tduck.vo.FormDataTableVO; import com.ltkj.tduck.vo.FormFieldVO; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.HashMap; import java.util.List; import java.util.Map; import static com.ltkj.tduck.constant.FormRedisKeyConstants.FORM_RESULT_NUMBER; /** * 表单表单项(FormResult)表服务实现类 * * @author smalljop * @since 2020-11-23 14:09:22 */ @Service @Slf4j @RequiredArgsConstructor public class UserFormDataServiceImpl extends ServiceImpl<UserFormDataMapper, UserFormDataEntity> implements UserFormDataService { private final UserFormItemService userFormItemService; private final CacheUtils redisUtils; private final FormDataUtils formDataUtils; @Override @Transactional(rollbackFor = Exception.class) public Map<String, Object> saveFormResult(UserFormDataEntity entity) { HashMap<String, Object> result = MapUtil.newHashMap(); String formKey = entity.getFormKey(); entity.setSubmitAddress(AddressUtils.getRealAddressByIP(entity.getSubmitRequestIp())); entity.setSerialNumber(redisUtils.incr(StrUtil.format(FORM_RESULT_NUMBER, formKey), CommonConstants.ConstantNumber.ONE)); this.save(entity); // formDataUtils.syncSaveFormData(entity); result.put("id", entity.getId()); return result; } /** * 下载表单结果中的附件 * * @param request * @return */ // @Override // public Result downloadFormResultFile(QueryFormResultRequest request) { // String uuid = IdUtil.simpleUUID(); // List<UserFormItemEntity> userFormItemEntityList = userFormItemService.list(Wrappers.<UserFormItemEntity>lambdaQuery().eq(UserFormItemEntity::getFormKey, request.getFormKey()).in(UserFormItemEntity::getType, CollUtil.newArrayList(FormItemTypeEnum.UPLOAD.toString(), FormItemTypeEnum.IMAGE_UPLOAD.toString()))); // //结果 // List<Map> rows = null; // if (ObjectUtil.isNull(request.getCurrent()) && ObjectUtil.isNull(request.getSize())) { // rows = formDataUtils.searchAll(request); // } else { // FormDataTableVO formDataTableVO = this.listFormDataTable(request); // rows = formDataTableVO.getRows(); // } // if (CollectionUtil.isEmpty(rows) || CollectionUtil.isEmpty(userFormItemEntityList)) { // return Result.failed("暂无收集附件,无法下载"); // } // List<Map> finalRows = rows; // ThreadUtil.execAsync(() -> { // TimeInterval timer = DateUtil.timer(); // List<String> paths = new ArrayList<>(); // List<InputStream> ins = new ArrayList<>(); // try { // finalRows.forEach(result -> { // int index = 0; // userFormItemEntityList.forEach(item -> { // List<UploadResultStruct> uploadResults = JsonUtils.jsonToList(JsonUtils.objToJson(MapUtil.get(result, item.getFormItemId(), List.class)), UploadResultStruct.class); // if (CollectionUtil.isNotEmpty(uploadResults)) { // uploadResults.forEach(uFile -> { // if (StrUtil.isNotBlank(uFile.getUrl())) { // paths.add(FileNameUtil.getName(uFile.getUrl())); // byte[] bytes = HttpUtil.downloadBytes(uFile.getUrl()); // ins.add(IoUtil.toStream(bytes)); // } // }); // } // }); // AsyncProcessUtils.setProcess(uuid, ++index / finalRows.size()); // }); // // 压缩上传oss // ByteArrayOutputStream zipOutputStream = new ByteArrayOutputStream(); // ZipUtil.zip(zipOutputStream, paths.toArray(new String[]{}), ins.toArray(new InputStream[]{})); // String downloadUrl = OssStorageFactory.getStorageService().upload(zipOutputStream.toByteArray(), StorageUtils.generateFileName("download", ".zip")); // AsyncProcessUtils.setProcess(uuid, downloadUrl); // log.info("export file cost time: {}", timer.interval()); // } catch (Exception e) { // log.error("download file", e); // } // }); // return Result.success(uuid); // } // // ///** // * 表单表单项(FormResult)表服务实现类 // * // * @author smalljop // * @since 2020-11-23 14:09:22 // */ //@Service //@Slf4j //@RequiredArgsConstructor //public class UserFormDataServiceImpl extends ServiceImpl<UserFormDataMapper, UserFormDataEntity> implements UserFormDataService { // // private final UserFormItemService userFormItemService; // private final CacheUtils redisUtils; // private final FormDataUtils formDataUtils; @Override public FormDataTableVO listFormDataTable(QueryFormResultRequest request) { return formDataUtils.search(request); } // // // @Override // @Transactional(rollbackFor = Exception.class) // public Map<String, Object> saveFormResult(UserFormDataEntity entity) { // HashMap<String, Object> result = MapUtil.newHashMap(); // String formKey = entity.getFormKey(); // entity.setSubmitAddress(AddressUtils.getRealAddressByIP(entity.getSubmitRequestIp())); // entity.setSerialNumber(redisUtils.incr(StrUtil.format(FORM_RESULT_NUMBER, formKey), CommonConstants.ConstantNumber.ONE)); // this.save(entity); //// formDataUtils.syncSaveFormData(entity); // result.put("id", entity.getId()); // return result; // public Boolean deleteByIds(List<String> dataIdList, String formKey) { // baseMapper.deleteBatchIds(dataIdList); // formDataUtils.asyncDeleteEsDocument(dataIdList, formKey); // return true; // } // // // /** // * 下载表单结果中的附件 // * // * @param request // * @return // */ //// @Override //// public Result downloadFormResultFile(QueryFormResultRequest request) { //// String uuid = IdUtil.simpleUUID(); //// List<UserFormItemEntity> userFormItemEntityList = userFormItemService.list(Wrappers.<UserFormItemEntity>lambdaQuery().eq(UserFormItemEntity::getFormKey, request.getFormKey()).in(UserFormItemEntity::getType, CollUtil.newArrayList(FormItemTypeEnum.UPLOAD.toString(), FormItemTypeEnum.IMAGE_UPLOAD.toString()))); //// //结果 //// List<Map> rows = null; //// if (ObjectUtil.isNull(request.getCurrent()) && ObjectUtil.isNull(request.getSize())) { //// rows = formDataUtils.searchAll(request); //// } else { //// FormDataTableVO formDataTableVO = this.listFormDataTable(request); //// rows = formDataTableVO.getRows(); //// } //// if (CollectionUtil.isEmpty(rows) || CollectionUtil.isEmpty(userFormItemEntityList)) { //// return Result.failed("暂无收集附件,无法下载"); //// } //// List<Map> finalRows = rows; //// ThreadUtil.execAsync(() -> { //// TimeInterval timer = DateUtil.timer(); //// List<String> paths = new ArrayList<>(); //// List<InputStream> ins = new ArrayList<>(); //// try { //// finalRows.forEach(result -> { //// int index = 0; //// userFormItemEntityList.forEach(item -> { //// List<UploadResultStruct> uploadResults = JsonUtils.jsonToList(JsonUtils.objToJson(MapUtil.get(result, item.getFormItemId(), List.class)), UploadResultStruct.class); //// if (CollectionUtil.isNotEmpty(uploadResults)) { //// uploadResults.forEach(uFile -> { //// if (StrUtil.isNotBlank(uFile.getUrl())) { //// paths.add(FileNameUtil.getName(uFile.getUrl())); //// byte[] bytes = HttpUtil.downloadBytes(uFile.getUrl()); //// ins.add(IoUtil.toStream(bytes)); //// } //// }); //// } //// }); //// AsyncProcessUtils.setProcess(uuid, ++index / finalRows.size()); //// }); //// // 压缩上传oss //// ByteArrayOutputStream zipOutputStream = new ByteArrayOutputStream(); //// ZipUtil.zip(zipOutputStream, paths.toArray(new String[]{}), ins.toArray(new InputStream[]{})); //// String downloadUrl = OssStorageFactory.getStorageService().upload(zipOutputStream.toByteArray(), StorageUtils.generateFileName("download", ".zip")); //// AsyncProcessUtils.setProcess(uuid, downloadUrl); //// log.info("export file cost time: {}", timer.interval()); //// } catch (Exception e) { //// log.error("download file", e); //// } //// }); //// return Result.success(uuid); //// } //// //// // @Override // public FormDataTableVO listFormDataTable(QueryFormResultRequest request) { // return formDataUtils.search(request); // } //// //// //// @Override //// public Boolean deleteByIds(List<String> dataIdList, String formKey) { //// baseMapper.deleteBatchIds(dataIdList); //// formDataUtils.asyncDeleteEsDocument(dataIdList, formKey); //// return true; //// } //// //// @Override //// public Boolean updateFormResult(UserFormDataEntity entity) { //// UserFormDataEntity dataEntity = this.getById(entity.getId()); //// dataEntity.setOriginalData(entity.getOriginalData()); //// dataEntity.setUpdateBy(entity.getUpdateBy()); //// boolean update = this.updateById(dataEntity); //// // 查询数据 同步到es 避免数据变空被覆盖 //// formDataUtils.asyncUpdateEsDocument(dataEntity); //// return update; //// } // // @Override // public Result getFormDataDetails(String dataId) { // Map<String, Object> result =new HashMap<>(); // UserFormDataEntity dataEntity = this.getById(dataId); // List<FormFieldVO> formFields = userFormItemService.listFormFields(dataEntity.getFormKey()); // // 表单字段 // result.put("formFields", formFields); // // 表单填写数据 // if (ObjectUtil.isNotNull(dataEntity)) { // Map<String, Object> originalData = dataEntity.getOriginalData(); // dataEntity.setOriginalData(null); // originalData.putAll(BeanUtil.beanToMap(dataEntity, false, true)); // result.put("formData", originalData); // public Boolean updateFormResult(UserFormDataEntity entity) { // UserFormDataEntity dataEntity = this.getById(entity.getId()); // dataEntity.setOriginalData(entity.getOriginalData()); // dataEntity.setUpdateBy(entity.getUpdateBy()); // boolean update = this.updateById(dataEntity); // // 查询数据 同步到es 避免数据变空被覆盖 // formDataUtils.asyncUpdateEsDocument(dataEntity); // return update; // } // return Result.success(result); // } //} @Override public Result getFormDataDetails(String dataId) { Map<String, Object> result =new HashMap<>(); UserFormDataEntity dataEntity = this.getById(dataId); List<FormFieldVO> formFields = userFormItemService.listFormFields(dataEntity.getFormKey()); // 表单字段 result.put("formFields", formFields); // 表单填写数据 if (ObjectUtil.isNotNull(dataEntity)) { Map<String, Object> originalData = dataEntity.getOriginalData(); dataEntity.setOriginalData(null); originalData.putAll(BeanUtil.beanToMap(dataEntity, false, true)); result.put("formData", originalData); } return Result.success(result); } } ltkj-system/src/main/java/com/ltkj/tduck/service/impl/UserFormSettingServiceImpl.java
@@ -1,194 +1,194 @@ //package com.ltkj.tduck.service.impl; // //import cn.hutool.core.bean.BeanUtil; //import cn.hutool.core.collection.CollUtil; //import cn.hutool.core.date.DateUtil; //import cn.hutool.core.util.ObjectUtil; //import cn.hutool.core.util.StrUtil; //import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; //import com.baomidou.mybatisplus.core.toolkit.Wrappers; //import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; //import com.ltkj.common.utils.SecurityUtils; //import com.ltkj.tduck.constant.CommonConstants; //import com.ltkj.tduck.domain.UserFormDataEntity; //import com.ltkj.tduck.domain.UserFormEntity; //import com.ltkj.tduck.domain.UserFormSettingEntity; //import com.ltkj.tduck.enums.FormStatusEnum; //import com.ltkj.tduck.mapper.UserFormSettingMapper; //import com.ltkj.tduck.service.UserFormDataService; //import com.ltkj.tduck.service.UserFormService; //import com.ltkj.tduck.service.UserFormSettingService; //import com.ltkj.tduck.struct.FormSettingSchemaStruct; //import com.ltkj.tduck.utils.Result; //import lombok.RequiredArgsConstructor; //import org.springframework.stereotype.Service; //import org.springframework.transaction.annotation.Transactional; // //import java.time.LocalTime; //import java.util.List; //import java.util.Map; //import java.util.Objects; // ///** // * 表单表单项(UserFormSetting)表服务实现类 // * // * @author smalljop // * @since 2020-11-30 14:00:53 // */ //@Service //@RequiredArgsConstructor //public class UserFormSettingServiceImpl extends ServiceImpl<UserFormSettingMapper, UserFormSettingEntity> implements UserFormSettingService { // private final UserFormService userFormService; // private final UserFormDataService userFormDataService; // // @Override // public Boolean saveFormSetting(Map<String, Object> params) { // String formKey = params.get("formKey").toString(); // UserFormSettingEntity entity = this.getOne(Wrappers.<UserFormSettingEntity>lambdaQuery().eq(UserFormSettingEntity::getFormKey, formKey)); // if (ObjectUtil.isNull(entity)) { // UserFormSettingEntity setting = new UserFormSettingEntity(); // setting.setFormKey(formKey); // setting.setSettings(params); // return this.save(setting); // } // Map<String, Object> settings = entity.getSettings(); // settings.putAll(params); // entity.setSettings(settings); // return this.updateById(entity); // } // // // @Override // public UserFormSettingEntity getFormSettingByKey(String formKey) { // return this.getOne(Wrappers.<UserFormSettingEntity>lambdaQuery().eq(UserFormSettingEntity::getFormKey, formKey)); // } // // @Override // public FormSettingSchemaStruct getFormSettingSchema(String formKey) { // UserFormSettingEntity settingEntity = getFormSettingByKey(formKey); // if (ObjectUtil.isNull(settingEntity)) { // return null; // } // return BeanUtil.toBean(settingEntity.getSettings(), FormSettingSchemaStruct.class); // } // // // @Override // public Result<Boolean> getUserFormWriteSettingStatus(String formKey, String requestIp, String wxOpenId, Integer type) { // UserFormEntity userFormEntity = userFormService.getByKey(formKey); // boolean checkPublish = Objects.equals(type, CommonConstants.ConstantNumber.ONE) && // (ObjectUtil.isNull(userFormEntity) || userFormEntity.getStatus() != 2); // // 非公开填写 不校验发布状态 // if (checkPublish) { // return Result.success(null, "表单暂时无法填写"); // } // UserFormSettingEntity settingEntity = getFormSettingByKey(formKey); // if (ObjectUtil.isNull(settingEntity)) { // return Result.success(true); // } // FormSettingSchemaStruct settingSchemaStruct = BeanUtil.toBean(settingEntity.getSettings(), FormSettingSchemaStruct.class); // // 填写时间限制 // boolean writeInterviewTime = isWriteInterviewTime(settingSchemaStruct); // if (!writeInterviewTime) { // return Result.success(null, StrUtil.blankToDefault(settingSchemaStruct.getWriteInterviewTimeText(), "不在答题时间范围内,有问题请与表单发布者联系")); // } // // 每个微信答题次数限制 // if (settingSchemaStruct.isWxWriteCountLimitStatus()) { // LambdaQueryWrapper<UserFormDataEntity> wrapper = Wrappers.<UserFormDataEntity>lambdaQuery().eq(UserFormDataEntity::getFormKey, formKey).eq(UserFormDataEntity::getWxOpenId, wxOpenId); // String rangeTypeSql = FormSettingSchemaStruct.DateRangeType.getDateSql(settingSchemaStruct.getWxWriteCountLimitDateType()); // wrapper.apply(StrUtil.isNotBlank(rangeTypeSql), rangeTypeSql); // long writeCount = userFormDataService.count(wrapper); // if (writeCount >= settingSchemaStruct.getWxWriteCountLimit()) { // return Result.success(null, StrUtil.blankToDefault(settingSchemaStruct.getWxWriteCountLimitText(), "该微信已经提交过数据,不可重复提交,有问题请与表单发布者联系")); // } // } // // 每个IP答题次数限制 // if (settingSchemaStruct.isIpWriteCountLimitStatus()) { // LambdaQueryWrapper<UserFormDataEntity> wrapper = Wrappers.<UserFormDataEntity>lambdaQuery().eq(UserFormDataEntity::getFormKey, formKey).eq(UserFormDataEntity::getSubmitRequestIp, requestIp); // String rangeTypeSql = FormSettingSchemaStruct.DateRangeType.getDateSql(settingSchemaStruct.getIpWriteCountLimitDateType()); // wrapper.apply(StrUtil.isNotBlank(rangeTypeSql), rangeTypeSql); // long writeCount = userFormDataService.count(wrapper); // if (writeCount >= settingSchemaStruct.getIpWriteCountLimit()) { // return Result.success(null, StrUtil.blankToDefault(settingSchemaStruct.getIpWriteCountLimitText(), "该IP已经提交过数据,不可重复提交,有问题请与表单发布者联系")); // } // } // // 总答题次数限制 // if (settingSchemaStruct.isTotalWriteCountLimitStatus()) { // LambdaQueryWrapper<UserFormDataEntity> wrapper = Wrappers.<UserFormDataEntity>lambdaQuery().eq(UserFormDataEntity::getFormKey, formKey); // String rangeTypeSql = FormSettingSchemaStruct.DateRangeType.getDateSql(settingSchemaStruct.getTotalWriteCountLimitDateType()); // wrapper.apply(StrUtil.isNotBlank(rangeTypeSql), rangeTypeSql); // long writeCount = userFormDataService.count(wrapper); // if (writeCount >= settingSchemaStruct.getTotalWriteCountLimit()) { // return Result.success(null, StrUtil.blankToDefault(settingSchemaStruct.getTotalWriteCountLimitText(), "该表单收集数据已经达到上限,有问题请与表单发布者联系")); // } // } // // 每个账号答题次数限制 // if (settingSchemaStruct.isAccountWriteCountLimitStatus()) { // LambdaQueryWrapper<UserFormDataEntity> wrapper = Wrappers.<UserFormDataEntity>lambdaQuery().eq(UserFormDataEntity::getFormKey, formKey) // .eq(UserFormDataEntity::getCreateBy, SecurityUtils.getUserId()); // String rangeTypeSql = FormSettingSchemaStruct.DateRangeType.getDateSql(settingSchemaStruct.getAccountWriteCountLimitDateType()); // wrapper.apply(StrUtil.isNotBlank(rangeTypeSql), rangeTypeSql); // long writeCount = userFormDataService.count(wrapper); // if (writeCount >= settingSchemaStruct.getAccountWriteCountLimit()) { // return Result.success(null, StrUtil.blankToDefault(settingSchemaStruct.getAccountWriteCountLimitText(), "该账号已经提交过数据,不可重复提交,有问题请与表单发布者联系")); // } // } // return Result.success(true); // } // // /** // * 是否在设置的答题时间内 // * // * @return true 在答题时间内 // */ // private boolean isWriteInterviewTime(FormSettingSchemaStruct settingSchemaStruct) { // // 答题时间限制 // if (settingSchemaStruct.isWriteInterviewTimeStatus()) { // // 是否每天时间范围限制 // if (settingSchemaStruct.isWriteInterviewDayTimeStatus()) { // // 是否在允许访问的天内 // List<String> writeInterviewDateRange = settingSchemaStruct.getWriteInterviewDateRange(); // if (CollUtil.isEmpty(writeInterviewDateRange) || DateUtil.isIn(DateUtil.date(), DateUtil.parse(writeInterviewDateRange.get(0)), DateUtil.parse(writeInterviewDateRange.get(1)))) { // // 是否在允许访问的小时内 // List<String> writeInterviewTimeRange = settingSchemaStruct.getWriteInterviewTimeRange(); // LocalTime now = LocalTime.now(); // boolean isRange = CollUtil.isNotEmpty(writeInterviewDateRange) && now.isBefore(LocalTime.parse(writeInterviewTimeRange.get(0))) || now.isAfter(LocalTime.parse(writeInterviewTimeRange.get(1))); // if (isRange) { // return false; // } // } else { // return false; // } // } else { // // 是否在允许访问的天内 // List<String> writeInterviewDateTimeRange = settingSchemaStruct.getWriteInterviewDateTimeRange(); // if (CollUtil.isNotEmpty(writeInterviewDateTimeRange) && !DateUtil.isIn(DateUtil.date(), DateUtil.parse(writeInterviewDateTimeRange.get(0)), DateUtil.parse(writeInterviewDateTimeRange.get(1)))) { // return false; // } // } // // 是否是每周允许访问的周几 // List<String> writeInterviewTimeWhichDays = settingSchemaStruct.getWriteInterviewTimeWhichDays(); // if (CollUtil.isNotEmpty(writeInterviewTimeWhichDays)) { // // 获取今天是每周的第几天 // int day = DateUtil.dayOfWeek(DateUtil.date()); // return writeInterviewTimeWhichDays.contains(String.valueOf(day)); // } // } // return true; // } // // // /** // * 删除全部的表单数据 // * // * @param formKey 表单key // * @return 删除结果 // */ // @Override // @Transactional(rollbackFor = {Exception.class}) // public Boolean deleteAllSetting(String formKey) { // this.remove(Wrappers.<UserFormSettingEntity>lambdaQuery().eq(UserFormSettingEntity::getFormKey, formKey)); // return true; // } // //} package com.ltkj.tduck.service.impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ltkj.common.utils.SecurityUtils; import com.ltkj.tduck.constant.CommonConstants; import com.ltkj.tduck.domain.UserFormDataEntity; import com.ltkj.tduck.domain.UserFormEntity; import com.ltkj.tduck.domain.UserFormSettingEntity; import com.ltkj.tduck.enums.FormStatusEnum; import com.ltkj.tduck.mapper.UserFormSettingMapper; import com.ltkj.tduck.service.UserFormDataService; import com.ltkj.tduck.service.UserFormService; import com.ltkj.tduck.service.UserFormSettingService; import com.ltkj.tduck.struct.FormSettingSchemaStruct; import com.ltkj.tduck.utils.Result; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.time.LocalTime; import java.util.List; import java.util.Map; import java.util.Objects; /** * 表单表单项(UserFormSetting)表服务实现类 * * @author smalljop * @since 2020-11-30 14:00:53 */ @Service @RequiredArgsConstructor public class UserFormSettingServiceImpl extends ServiceImpl<UserFormSettingMapper, UserFormSettingEntity> implements UserFormSettingService { private final UserFormService userFormService; private final UserFormDataService userFormDataService; @Override public Boolean saveFormSetting(Map<String, Object> params) { String formKey = params.get("formKey").toString(); UserFormSettingEntity entity = this.getOne(Wrappers.<UserFormSettingEntity>lambdaQuery().eq(UserFormSettingEntity::getFormKey, formKey)); if (ObjectUtil.isNull(entity)) { UserFormSettingEntity setting = new UserFormSettingEntity(); setting.setFormKey(formKey); setting.setSettings(params); return this.save(setting); } Map<String, Object> settings = entity.getSettings(); settings.putAll(params); entity.setSettings(settings); return this.updateById(entity); } @Override public UserFormSettingEntity getFormSettingByKey(String formKey) { return this.getOne(Wrappers.<UserFormSettingEntity>lambdaQuery().eq(UserFormSettingEntity::getFormKey, formKey)); } @Override public FormSettingSchemaStruct getFormSettingSchema(String formKey) { UserFormSettingEntity settingEntity = getFormSettingByKey(formKey); if (ObjectUtil.isNull(settingEntity)) { return null; } return BeanUtil.toBean(settingEntity.getSettings(), FormSettingSchemaStruct.class); } @Override public Result<Boolean> getUserFormWriteSettingStatus(String formKey, String requestIp, String wxOpenId, Integer type) { UserFormEntity userFormEntity = userFormService.getByKey(formKey); boolean checkPublish = Objects.equals(type, CommonConstants.ConstantNumber.ONE) && (ObjectUtil.isNull(userFormEntity) || userFormEntity.getStatus() != 2); // 非公开填写 不校验发布状态 if (checkPublish) { return Result.success(null, "表单暂时无法填写"); } UserFormSettingEntity settingEntity = getFormSettingByKey(formKey); if (ObjectUtil.isNull(settingEntity)) { return Result.success(true); } FormSettingSchemaStruct settingSchemaStruct = BeanUtil.toBean(settingEntity.getSettings(), FormSettingSchemaStruct.class); // 填写时间限制 boolean writeInterviewTime = isWriteInterviewTime(settingSchemaStruct); if (!writeInterviewTime) { return Result.success(null, StrUtil.blankToDefault(settingSchemaStruct.getWriteInterviewTimeText(), "不在答题时间范围内,有问题请与表单发布者联系")); } // 每个微信答题次数限制 if (settingSchemaStruct.isWxWriteCountLimitStatus()) { LambdaQueryWrapper<UserFormDataEntity> wrapper = Wrappers.<UserFormDataEntity>lambdaQuery().eq(UserFormDataEntity::getFormKey, formKey).eq(UserFormDataEntity::getWxOpenId, wxOpenId); String rangeTypeSql = FormSettingSchemaStruct.DateRangeType.getDateSql(settingSchemaStruct.getWxWriteCountLimitDateType()); wrapper.apply(StrUtil.isNotBlank(rangeTypeSql), rangeTypeSql); long writeCount = userFormDataService.count(wrapper); if (writeCount >= settingSchemaStruct.getWxWriteCountLimit()) { return Result.success(null, StrUtil.blankToDefault(settingSchemaStruct.getWxWriteCountLimitText(), "该微信已经提交过数据,不可重复提交,有问题请与表单发布者联系")); } } // 每个IP答题次数限制 if (settingSchemaStruct.isIpWriteCountLimitStatus()) { LambdaQueryWrapper<UserFormDataEntity> wrapper = Wrappers.<UserFormDataEntity>lambdaQuery().eq(UserFormDataEntity::getFormKey, formKey).eq(UserFormDataEntity::getSubmitRequestIp, requestIp); String rangeTypeSql = FormSettingSchemaStruct.DateRangeType.getDateSql(settingSchemaStruct.getIpWriteCountLimitDateType()); wrapper.apply(StrUtil.isNotBlank(rangeTypeSql), rangeTypeSql); long writeCount = userFormDataService.count(wrapper); if (writeCount >= settingSchemaStruct.getIpWriteCountLimit()) { return Result.success(null, StrUtil.blankToDefault(settingSchemaStruct.getIpWriteCountLimitText(), "该IP已经提交过数据,不可重复提交,有问题请与表单发布者联系")); } } // 总答题次数限制 if (settingSchemaStruct.isTotalWriteCountLimitStatus()) { LambdaQueryWrapper<UserFormDataEntity> wrapper = Wrappers.<UserFormDataEntity>lambdaQuery().eq(UserFormDataEntity::getFormKey, formKey); String rangeTypeSql = FormSettingSchemaStruct.DateRangeType.getDateSql(settingSchemaStruct.getTotalWriteCountLimitDateType()); wrapper.apply(StrUtil.isNotBlank(rangeTypeSql), rangeTypeSql); long writeCount = userFormDataService.count(wrapper); if (writeCount >= settingSchemaStruct.getTotalWriteCountLimit()) { return Result.success(null, StrUtil.blankToDefault(settingSchemaStruct.getTotalWriteCountLimitText(), "该表单收集数据已经达到上限,有问题请与表单发布者联系")); } } // 每个账号答题次数限制 if (settingSchemaStruct.isAccountWriteCountLimitStatus()) { LambdaQueryWrapper<UserFormDataEntity> wrapper = Wrappers.<UserFormDataEntity>lambdaQuery().eq(UserFormDataEntity::getFormKey, formKey) .eq(UserFormDataEntity::getCreateBy, SecurityUtils.getUserId()); String rangeTypeSql = FormSettingSchemaStruct.DateRangeType.getDateSql(settingSchemaStruct.getAccountWriteCountLimitDateType()); wrapper.apply(StrUtil.isNotBlank(rangeTypeSql), rangeTypeSql); long writeCount = userFormDataService.count(wrapper); if (writeCount >= settingSchemaStruct.getAccountWriteCountLimit()) { return Result.success(null, StrUtil.blankToDefault(settingSchemaStruct.getAccountWriteCountLimitText(), "该账号已经提交过数据,不可重复提交,有问题请与表单发布者联系")); } } return Result.success(true); } /** * 是否在设置的答题时间内 * * @return true 在答题时间内 */ private boolean isWriteInterviewTime(FormSettingSchemaStruct settingSchemaStruct) { // 答题时间限制 if (settingSchemaStruct.isWriteInterviewTimeStatus()) { // 是否每天时间范围限制 if (settingSchemaStruct.isWriteInterviewDayTimeStatus()) { // 是否在允许访问的天内 List<String> writeInterviewDateRange = settingSchemaStruct.getWriteInterviewDateRange(); if (CollUtil.isEmpty(writeInterviewDateRange) || DateUtil.isIn(DateUtil.date(), DateUtil.parse(writeInterviewDateRange.get(0)), DateUtil.parse(writeInterviewDateRange.get(1)))) { // 是否在允许访问的小时内 List<String> writeInterviewTimeRange = settingSchemaStruct.getWriteInterviewTimeRange(); LocalTime now = LocalTime.now(); boolean isRange = CollUtil.isNotEmpty(writeInterviewDateRange) && now.isBefore(LocalTime.parse(writeInterviewTimeRange.get(0))) || now.isAfter(LocalTime.parse(writeInterviewTimeRange.get(1))); if (isRange) { return false; } } else { return false; } } else { // 是否在允许访问的天内 List<String> writeInterviewDateTimeRange = settingSchemaStruct.getWriteInterviewDateTimeRange(); if (CollUtil.isNotEmpty(writeInterviewDateTimeRange) && !DateUtil.isIn(DateUtil.date(), DateUtil.parse(writeInterviewDateTimeRange.get(0)), DateUtil.parse(writeInterviewDateTimeRange.get(1)))) { return false; } } // 是否是每周允许访问的周几 List<String> writeInterviewTimeWhichDays = settingSchemaStruct.getWriteInterviewTimeWhichDays(); if (CollUtil.isNotEmpty(writeInterviewTimeWhichDays)) { // 获取今天是每周的第几天 int day = DateUtil.dayOfWeek(DateUtil.date()); return writeInterviewTimeWhichDays.contains(String.valueOf(day)); } } return true; } /** * 删除全部的表单数据 * * @param formKey 表单key * @return 删除结果 */ @Override @Transactional(rollbackFor = {Exception.class}) public Boolean deleteAllSetting(String formKey) { this.remove(Wrappers.<UserFormSettingEntity>lambdaQuery().eq(UserFormSettingEntity::getFormKey, formKey)); return true; } } ltkj-system/src/main/java/com/ltkj/tduck/utils/CacheUtils.java
@@ -1,122 +1,131 @@ //package com.ltkj.tduck.utils; // //import cn.hutool.core.convert.Convert; //import cn.hutool.core.util.ObjectUtil; //import cn.hutool.core.util.StrUtil; //import lombok.extern.slf4j.Slf4j; //import org.apache.commons.compress.utils.Lists; //import org.springframework.beans.factory.annotation.Autowired; //import org.springframework.cache.Cache; //import org.springframework.cache.annotation.EnableCaching; //import org.springframework.cache.ehcache.EhCacheCacheManager; //import org.springframework.stereotype.Component; // //import java.util.List; // ///** // * @author : tduck // * @description : 基于ehcache实现 // * @create : 2022/01/06 10:40 // **/ //@Component //@Slf4j //@EnableCaching //public class CacheUtils { // private final String ETERNAL_CACHE_NAME = "eternal_cache"; // private final String TEMP_CACHE_NAME = "temp_cache"; package com.ltkj.tduck.utils; import cn.hutool.core.convert.Convert; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.ltkj.common.core.redis.RedisCache; import lombok.extern.slf4j.Slf4j; import org.apache.commons.compress.utils.Lists; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.Cache; import org.springframework.cache.annotation.EnableCaching; import org.springframework.stereotype.Component; import java.util.List; /** * @author : tduck * @description : 基于ehcache实现 * @create : 2022/01/06 10:40 **/ @Component @Slf4j @EnableCaching public class CacheUtils { private final String ETERNAL_CACHE_NAME = "eternal_cache"; private final String TEMP_CACHE_NAME = "temp_cache"; // @Autowired // private EhCacheCacheManager cacheManager; // // /** // * 保存到Cache // */ // public void save(String key, String value) { @Autowired private RedisCache cache; /** * 保存到Cache */ public void save(String key, String value) { // cacheManager.getCache(ETERNAL_CACHE_NAME).put(key, value); // } // // /** // * 获取 // * // * @param key // */ // public String get(String key) { cache.setCacheObject(key,value); } /** * 获取 * * @param key */ public String get(String key) { // Cache.ValueWrapper valueWrapper = cacheManager.getCache(ETERNAL_CACHE_NAME).get(key); // Cache.ValueWrapper valueWrapper = cache.getCacheObject(key); // if (ObjectUtil.isNotNull(valueWrapper) && ObjectUtil.isNotNull(valueWrapper.get())) { // return valueWrapper.get().toString(); // } // return null; // } // // // /** // * 自增 // * // * @param key // * @param number // * @return // */ // public Long incr(String key, Integer number) { // String v = get(key); // if (StrUtil.isBlank(v)) { // v = "0"; // } // long finalValue = Convert.toLong(v) + number; // save(key, String.valueOf(finalValue)); // return finalValue; // } // // // /** // * 添加到集合缓存 // * // * @param key // * @param value // */ // public void addList(String key, Object value) { // List coll = this.getList(key, Object.class); // coll.add(value); Object valueWrapper = cache.getCacheObject(key); if (ObjectUtil.isNotNull(valueWrapper) && ObjectUtil.isNotNull(valueWrapper)) { return valueWrapper.toString(); } return null; } /** * 自增 * * @param key * @param number * @return */ public Long incr(String key, Integer number) { String v = get(key); if (StrUtil.isBlank(v)) { v = "0"; } long finalValue = Convert.toLong(v) + number; save(key, String.valueOf(finalValue)); return finalValue; } /** * 添加到集合缓存 * * @param key * @param value */ public void addList(String key, Object value) { List coll = this.getList(key, Object.class); coll.add(value); // cacheManager.getCache(TEMP_CACHE_NAME).put(key, JsonUtils.objToJson(coll)); // } // // // /** // * 从集合中移除 // * // * @param key // * @param value // */ // public void removeList(String key, Object value) { // List coll = this.getList(key, Object.class); // coll.remove(value); cache.setCacheObject(key, JsonUtils.objToJson(coll)); } /** * 从集合中移除 * * @param key * @param value */ public void removeList(String key, Object value) { List coll = this.getList(key, Object.class); coll.remove(value); // cacheManager.getCache(TEMP_CACHE_NAME).put(key, JsonUtils.objToJson(coll)); // } // // /** // * 获取集合 // * // * @param key // */ // public List getList(String key, Class classz) { // String v = get(key); // if (ObjectUtil.isNotNull(v)) { // return JsonUtils.jsonToList(v, classz.getClass()); // } // return Lists.newArrayList(); // } // // // /** // * 临时保存 默认5min // */ // public void tempSave(String key, String value) { } /** * 获取集合 * * @param key */ public List getList(String key, Class classz) { String v = get(key); if (ObjectUtil.isNotNull(v)) { return JsonUtils.jsonToList(v, classz.getClass()); } return Lists.newArrayList(); } /** * 临时保存 默认5min */ public void tempSave(String key, String value) { // cacheManager.getCache(TEMP_CACHE_NAME).put(key, value); // } // // /** // * 获取临时存储变量 // * // * @param key // */ } /** * 获取临时存储变量 * * @param key */ // public String getTemp(String key) { // Cache.ValueWrapper valueWrapper = cacheManager.getCache(TEMP_CACHE_NAME).get(key); // if (ObjectUtil.isNotNull(valueWrapper) && ObjectUtil.isNotNull(valueWrapper.get())) { @@ -128,6 +137,6 @@ // public void removeTemp(String key) { // cacheManager.getCache(TEMP_CACHE_NAME).evict(key); // } // // //} } ltkj-system/src/main/java/com/ltkj/tduck/utils/SortUtils.java
@@ -1,109 +1,109 @@ //package com.ltkj.tduck.utils; // // //import cn.hutool.core.util.ObjectUtil; //import cn.hutool.core.util.StrUtil; //import com.baomidou.mybatisplus.core.toolkit.Wrappers; //import com.ltkj.tduck.constant.FormRedisKeyConstants; //import com.ltkj.tduck.domain.UserFormItemEntity; //import com.ltkj.tduck.service.UserFormItemService; //import lombok.RequiredArgsConstructor; //import org.springframework.stereotype.Component; // //import java.util.Comparator; //import java.util.List; // ///** // * 两个前提:位置的信息记录在任务的模型上(pos字段);一般两个任务的pos值相差很大(默认是65536);现在假设有任务 A, B, C. // * 列举几个常见的场景:如果C要移到A的前面, 那么后端会把 C.pos 改为 A.pos/2;若果C要移到A和B之间, // * 那么后端会把 C.pos 改为 (A.pos + B.pos)/2;如果B要移到C的后面, 那么后端会把 B.pos 改为 C.pos + 65536; // * 当然这里会有个极端情况需要处理(假设pos是整数):如果 A.pos 是 1, B.pos 是 2, C想移到A和B之间, 其实是没有一个整数可以用的, // * 针对这种情况, 后端会重新给整个列表的任务重新刷一遍pos值. // * <p> // * 拖动排序工具类 // * 算法参考 @link https://www.zhihu.com/question/55789722 // * // * @author smalljop // */ //@RequiredArgsConstructor //@Component //public class SortUtils { // // private final CacheUtils cacheUtils; // // /** // * 排序默认自增因子 // */ // private final Long SORT_DEFAULT_INCR_FACT = 65536L; // // private final UserFormItemService formItemService; // // // /** // * 获取排序数值 // * // * @param formKey 表单key // * @return 初始排序数值 // */ // public Long getInitialSortPosition(String formKey) { // String redisKey = StrUtil.format(FormRedisKeyConstants.FORM_ITEM_POS_DELTA, formKey); // // 模板创建时 初始排序数值 // if (StrUtil.isBlank(cacheUtils.get(redisKey))) { // Long sort = formItemService.getLastItemSort(formKey); // cacheUtils.save(redisKey, String.valueOf(sort == null ? 1 : sort)); // } // return cacheUtils.incr(redisKey, SORT_DEFAULT_INCR_FACT.intValue()); // } // // // /** // * * 两个前提:位置的信息记录在任务的模型上(pos字段);一般两个任务的pos值相差很大(默认是65536);现在假设有任务 A, B, C. // * * 列举几个常见的场景:如果C要移到A的前面, 那么后端会把 C.pos 改为 A.pos/2;若果C要移到A和B之间, // * * 那么后端会把 C.pos 改为 (A.pos + B.pos)/2;如果B要移到C的后面, 那么后端会把 B.pos 改为 C.pos + 65536; // * * 当然这里会有个极端情况需要处理(假设pos是整数):如果 A.pos 是 1, B.pos 是 2, C想移到A和B之间, 其实是没有一个整数可以用的, // * * 针对这种情况, 后端会重新给整个列表的任务重新刷一遍pos值. // * 排序之后重新计算 // * // * @param beforePosition 之前的位置 // * @param afterPosition 之后的位置 // * @param formKey 表单key // * @return 最终位置 // */ // public Long calcSortPosition(Long beforePosition, Long afterPosition, String formKey) { // String redisKey = StrUtil.format(FormRedisKeyConstants.FORM_ITEM_POS_DELTA, formKey); // boolean isCenter = (ObjectUtil.isNotNull(beforePosition) && 0L != beforePosition) && (ObjectUtil.isNotNull(afterPosition) && 0L != afterPosition); // if (isCenter) { // 放到中间 // return (beforePosition + afterPosition) / 2; // } // if (ObjectUtil.isNull(beforePosition) || 0L == beforePosition) { // 放到最前面 // return afterPosition / 2; // } else { // 放到最后面 // return cacheUtils.incr(redisKey, SORT_DEFAULT_INCR_FACT.intValue()); // } // } // // // /** // * 极端情况刷新整个列表 // * // * @param beforePosition 之前的位置 // * @param afterPosition 之后的位置 // * @param formKey 表单key // * @param sort 排序数值 // */ // public Boolean sortAllList(Long beforePosition, Long afterPosition, String formKey, Long sort) { // // 即将没有整数,刷新全部列表排序值 // if ((ObjectUtil.isNotNull(beforePosition) && 0L != beforePosition && ObjectUtil.equal(sort, beforePosition + 1)) // || (ObjectUtil.isNotNull(afterPosition) && 0L != afterPosition && ObjectUtil.equal(sort, 1L))) { // List<UserFormItemEntity> itemEntityList = formItemService.list(Wrappers.<UserFormItemEntity>lambdaQuery().eq(UserFormItemEntity::getFormKey, formKey)); // itemEntityList.sort(Comparator.comparing(UserFormItemEntity::getSort)); // for (int i = 0; i < itemEntityList.size(); i++) { // itemEntityList.get(i).setSort(SORT_DEFAULT_INCR_FACT * (i + 1)); // } // formItemService.updateBatchById(itemEntityList); // return true; // } // return false; // } // //} package com.ltkj.tduck.utils; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.ltkj.tduck.constant.FormRedisKeyConstants; import com.ltkj.tduck.domain.UserFormItemEntity; import com.ltkj.tduck.service.UserFormItemService; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; import java.util.Comparator; import java.util.List; /** * 两个前提:位置的信息记录在任务的模型上(pos字段);一般两个任务的pos值相差很大(默认是65536);现在假设有任务 A, B, C. * 列举几个常见的场景:如果C要移到A的前面, 那么后端会把 C.pos 改为 A.pos/2;若果C要移到A和B之间, * 那么后端会把 C.pos 改为 (A.pos + B.pos)/2;如果B要移到C的后面, 那么后端会把 B.pos 改为 C.pos + 65536; * 当然这里会有个极端情况需要处理(假设pos是整数):如果 A.pos 是 1, B.pos 是 2, C想移到A和B之间, 其实是没有一个整数可以用的, * 针对这种情况, 后端会重新给整个列表的任务重新刷一遍pos值. * <p> * 拖动排序工具类 * 算法参考 @link https://www.zhihu.com/question/55789722 * * @author smalljop */ @RequiredArgsConstructor @Component public class SortUtils { private final CacheUtils cacheUtils; /** * 排序默认自增因子 */ private final Long SORT_DEFAULT_INCR_FACT = 65536L; private final UserFormItemService formItemService; /** * 获取排序数值 * * @param formKey 表单key * @return 初始排序数值 */ public Long getInitialSortPosition(String formKey) { String redisKey = StrUtil.format(FormRedisKeyConstants.FORM_ITEM_POS_DELTA, formKey); // 模板创建时 初始排序数值 if (StrUtil.isBlank(cacheUtils.get(redisKey))) { Long sort = formItemService.getLastItemSort(formKey); cacheUtils.save(redisKey, String.valueOf(sort == null ? 1 : sort)); } return cacheUtils.incr(redisKey, SORT_DEFAULT_INCR_FACT.intValue()); } /** * * 两个前提:位置的信息记录在任务的模型上(pos字段);一般两个任务的pos值相差很大(默认是65536);现在假设有任务 A, B, C. * * 列举几个常见的场景:如果C要移到A的前面, 那么后端会把 C.pos 改为 A.pos/2;若果C要移到A和B之间, * * 那么后端会把 C.pos 改为 (A.pos + B.pos)/2;如果B要移到C的后面, 那么后端会把 B.pos 改为 C.pos + 65536; * * 当然这里会有个极端情况需要处理(假设pos是整数):如果 A.pos 是 1, B.pos 是 2, C想移到A和B之间, 其实是没有一个整数可以用的, * * 针对这种情况, 后端会重新给整个列表的任务重新刷一遍pos值. * 排序之后重新计算 * * @param beforePosition 之前的位置 * @param afterPosition 之后的位置 * @param formKey 表单key * @return 最终位置 */ public Long calcSortPosition(Long beforePosition, Long afterPosition, String formKey) { String redisKey = StrUtil.format(FormRedisKeyConstants.FORM_ITEM_POS_DELTA, formKey); boolean isCenter = (ObjectUtil.isNotNull(beforePosition) && 0L != beforePosition) && (ObjectUtil.isNotNull(afterPosition) && 0L != afterPosition); if (isCenter) { // 放到中间 return (beforePosition + afterPosition) / 2; } if (ObjectUtil.isNull(beforePosition) || 0L == beforePosition) { // 放到最前面 return afterPosition / 2; } else { // 放到最后面 return cacheUtils.incr(redisKey, SORT_DEFAULT_INCR_FACT.intValue()); } } /** * 极端情况刷新整个列表 * * @param beforePosition 之前的位置 * @param afterPosition 之后的位置 * @param formKey 表单key * @param sort 排序数值 */ public Boolean sortAllList(Long beforePosition, Long afterPosition, String formKey, Long sort) { // 即将没有整数,刷新全部列表排序值 if ((ObjectUtil.isNotNull(beforePosition) && 0L != beforePosition && ObjectUtil.equal(sort, beforePosition + 1)) || (ObjectUtil.isNotNull(afterPosition) && 0L != afterPosition && ObjectUtil.equal(sort, 1L))) { List<UserFormItemEntity> itemEntityList = formItemService.list(Wrappers.<UserFormItemEntity>lambdaQuery().eq(UserFormItemEntity::getFormKey, formKey)); itemEntityList.sort(Comparator.comparing(UserFormItemEntity::getSort)); for (int i = 0; i < itemEntityList.size(); i++) { itemEntityList.get(i).setSort(SORT_DEFAULT_INCR_FACT * (i + 1)); } formItemService.updateBatchById(itemEntityList); return true; } return false; } }