zjh
2024-05-14 3ef44331e3bd3e8b61513c88b7439631f49f05c7
zjh 2024/05/14-1
10个文件已修改
1个文件已删除
2729 ■■■■ 已修改文件
ltkj-admin/src/main/java/com/ltkj/LtkjApplication.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ltkj-admin/src/main/java/com/ltkj/web/tduck/UserFormController.java 620 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ltkj-admin/src/main/java/com/ltkj/web/tduck/UserFormResultController.java 456 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ltkj-admin/src/main/java/com/ltkj/web/tduck/UserFormSettingController.java 280 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ltkj-admin/src/main/resources/application.yml 20 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ltkj-admin/src/main/resources/config/ehcache.xml 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ltkj-system/src/main/java/com/ltkj/tduck/service/UserFormSettingService.java 122 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ltkj-system/src/main/java/com/ltkj/tduck/service/impl/UserFormDataServiceImpl.java 300 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ltkj-system/src/main/java/com/ltkj/tduck/service/impl/UserFormSettingServiceImpl.java 388 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ltkj-system/src/main/java/com/ltkj/tduck/utils/CacheUtils.java 266 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ltkj-system/src/main/java/com/ltkj/tduck/utils/SortUtils.java 218 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ltkj-admin/src/main/java/com/ltkj/LtkjApplication.java
@@ -3,6 +3,7 @@
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.transaction.annotation.EnableTransactionManagement;
@@ -15,6 +16,7 @@
@EnableTransactionManagement
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class},scanBasePackages = {"org.jeecg.modules.jmreport","com.ltkj"})
@EnableAsync
//@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/tduck/UserFormController.java
@@ -1,311 +1,311 @@
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) {
//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);
        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);
    }
}
////        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);
//    }
//
//}
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;
/**
 * 表单数据
 *
 * @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);
    }
//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;
//
//
//    /**
//     * 填写附件导出
// * 表单数据
//     *
//     * @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();
    }
// * @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 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);
//    @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);
//    }
////
////
////    /**
////     * 填写附件导出
////     *
////     * @param request 请求
////     * @return 文件
////     */
////    @PostMapping("/download/file")
////    public Result downloadFormResultFile(@RequestBody QueryFormResultRequest request) {
////        return formResultService.downloadFormResultFile(request);
////    }
//
//    /**
//     * 填写
//     *
//     * @param entity  填写数据
//     * @param request 请求
//     * @return Result
//     * @return
//     */
//    @PostMapping("/update")
//    @PermitAll
//    public Result<Void> updateFormResult(@RequestBody UserFormDataEntity entity, HttpServletRequest request) {
//    @PostMapping("/create")
//    public AjaxResult createFormResult(@RequestBody UserFormDataEntity entity, HttpServletRequest request) {
//        ValidatorUtils.validateEntity(entity);
//        try {
//            entity.setUpdateBy(String.valueOf(SecurityUtils.getUserId()));
//        } catch (Exception ignored) {
//        }
//        formResultService.updateFormResult(entity);
//        return Result.success();
//        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 response 响应
//     * @param formKey  表单key
//     * @param entity  填写数据
//     * @param request 请求
//     */
//    @GetMapping("/import/template")
//    public void downloadImportTemplate(HttpServletResponse response, String formKey) {
//        formDataImportUtils.importTemplateExcel(response, formKey);
//    @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();
//    }
//
//    /**
//     * 导出表单数据
//     */
//    @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()));
//    }
////
////    /**
////     * 批量删除
////     *
////     * @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();
////    }
//
//
//    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 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));
    }
    /**
     * 表单提交设置查询
     */
    @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()));
//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));
//        }
//        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())) {
//
//    /**
//     * 表单提交设置查询
//     */
//    @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);
//        }
//        return Result.failed("密码输入错误");
        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);
//    }
//
//
//}
ltkj-admin/src/main/resources/application.yml
@@ -70,22 +70,22 @@
    restart:
      # 热部署开关
      enabled: true
  cache:
    type: ehcache
    ehcache:
      config: classpath:config/ehcache.xml
#  cache:
#    type: ehcache
#    ehcache:
#      config: classpath:config/ehcache.xml
  # redis 配置
#  redis:
#    # 地址
#    host: 101.42.27.146
##    host: localhost
##    host: 101.42.27.146
#    host: localhost
#    # 端口,默认为6379
#    port: 6379
#    # 数据库索引
#    database: 0
#    # 密码
#    password: 654321
##    password: 123456
##    password: 654321
#    password: 123456
#    # 连接超时时间
#    timeout: 120s
#    lettuce:
@@ -220,11 +220,11 @@
#积木报表访问地址
jimu:
#  path: https://ltpeis.xaltjdkj.cn:5011/ltkj-admin
  path: https://ltpeis.xaltjdkj.cn:5021/ltkj-admin
#  path: https://ltpeis.xaltjdkj.cn:5021/ltkj-admin
#  path: http://192.168.0.5:5000/ltkj-admin
#   path: http://10.168.0.9:5011
#   path: http://192.168.0.105:5011
#  path: http://192.168.0.112:5011
  path: http://192.168.1.113:5011
jeecg :
ltkj-admin/src/main/resources/config/ehcache.xml
File was deleted
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;
/**
 * 表单表单项(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);
//    }
//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;
//
//
    @Override
    public FormDataTableVO listFormDataTable(QueryFormResultRequest request) {
        return formDataUtils.search(request);
    }
///**
// * 表单表单项(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 Boolean deleteByIds(List<String> dataIdList, String formKey) {
//        baseMapper.deleteBatchIds(dataIdList);
//        formDataUtils.asyncDeleteEsDocument(dataIdList, formKey);
//        return true;
//    @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);
////    }
////
////
//    @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;
//    public FormDataTableVO listFormDataTable(QueryFormResultRequest request) {
//        return formDataUtils.search(request);
//    }
    @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);
    }
}
////
////
////    @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);
//        }
//        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,133 +1,133 @@
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";
    @Autowired
    private EhCacheCacheManager cacheManager;
    /**
     * 保存到Cache
     */
    public void save(String key, String value) {
        cacheManager.getCache(ETERNAL_CACHE_NAME).put(key, value);
    }
    /**
     * 获取
     *
     * @param key
     */
    public String get(String key) {
        Cache.ValueWrapper valueWrapper = cacheManager.getCache(ETERNAL_CACHE_NAME).get(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);
        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);
        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) {
        cacheManager.getCache(TEMP_CACHE_NAME).put(key, value);
    }
    /**
     * 获取临时存储变量
     *
     * @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())) {
            return valueWrapper.get().toString();
        }
        return null;
    }
    public void removeTemp(String key) {
        cacheManager.getCache(TEMP_CACHE_NAME).evict(key);
    }
}
//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";
//    @Autowired
//    private EhCacheCacheManager cacheManager;
//
//    /**
//     * 保存到Cache
//     */
//    public void save(String key, String value) {
//        cacheManager.getCache(ETERNAL_CACHE_NAME).put(key, value);
//    }
//
//    /**
//     * 获取
//     *
//     * @param key
//     */
//    public String get(String key) {
//        Cache.ValueWrapper valueWrapper = cacheManager.getCache(ETERNAL_CACHE_NAME).get(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);
//        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);
//        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) {
//        cacheManager.getCache(TEMP_CACHE_NAME).put(key, value);
//    }
//
//    /**
//     * 获取临时存储变量
//     *
//     * @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())) {
//            return valueWrapper.get().toString();
//        }
//        return null;
//    }
//
//    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;
//    }
//
//}