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 itemEntityList = formItemService .list(Wrappers.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.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 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.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.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.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 formItemList = formItemService.list(Wrappers.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.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.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 queryWrapper = Wrappers.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 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); } }