zoujiajian 3 lat temu
rodzic
commit
ee6b5922d0

+ 13 - 0
netflix-dao/src/main/java/com/cyksj/mapper/manage/form/QuestionnairePromotionMapper.java

@@ -0,0 +1,13 @@
+package com.cyksj.mapper.manage.form;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.QuestionnairePromotion;
+
+/*
+ *项目名: netflix
+ *文件名: QuestionnairePromotionMapper
+ *创建者: JavaZou
+ *创建时间:2023/6/12 17:18
+ */
+public interface QuestionnairePromotionMapper extends BaseMapper<QuestionnairePromotion> {
+}

+ 56 - 0
netflix-dao/src/main/java/com/cyksj/model/dto/FormFieldsView.java

@@ -0,0 +1,56 @@
+package com.cyksj.model.dto;
+
+import com.cyksj.model.entity.FormFieldsDefault;
+import com.ejlchina.searcher.bean.DbField;
+import com.ejlchina.searcher.bean.DbIgnore;
+import com.ejlchina.searcher.bean.SearchBean;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.Date;
+import java.util.List;
+
+/*
+ *项目名: netflix
+ *文件名: FormFieldsView
+ *创建者: JavaZou
+ *创建时间:2023/6/12 16:23
+ */
+@Getter
+@Setter
+@SearchBean(tables = "form_fields ff left join form_template ft on ft.id = ff.template_id",
+		where = "ff.is_deleted is true,ft.is_deleted is true")
+public class FormFieldsView {
+	@DbField("ff.id")
+	private Long id;
+
+	@DbField("ff.fields_name")
+	private String fieldsName;
+
+	@DbField("ff.data_type")
+	private Integer dataType;
+
+	@DbField("ff.fields_entry_type")
+	private Integer FieldsEntryType;
+
+	@DbField("ff.show_table")
+	private Integer showTable;
+
+	@DbField("ff.sorted")
+	private Integer sorted;
+
+	@DbField("ff.template_id")
+	private Long templateId;
+
+	@DbField("ft.name")
+	private String templateName;
+
+	@DbField("ft.desc_str")
+	private String descStr;
+
+	@DbField("ff.created_time")
+	private Date createdTime;
+
+	@DbIgnore
+	private List<FormFieldsDefault> fieldsDefaults;
+}

+ 33 - 0
netflix-dao/src/main/java/com/cyksj/model/dto/FormTemplateDataDto.java

@@ -0,0 +1,33 @@
+package com.cyksj.model.dto;
+
+import com.cyksj.model.entity.FormFields;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+/*
+ *项目名: netflix
+ *文件名: FormTemplateDataDto
+ *创建者: JavaZou
+ *创建时间:2023/6/12 15:54
+ */
+@Getter
+@Setter
+public class FormTemplateDataDto {
+	private Long id;
+	/**
+	 * 模板名称
+	 */
+	private String name;
+
+	/**
+	 * 模板描述
+	 */
+	private String descStr;
+
+	/**
+	 * 字段
+	 */
+	private List<FormFields> formFieldsList;
+}

+ 49 - 0
netflix-dao/src/main/java/com/cyksj/model/dto/QuestionnaireView.java

@@ -0,0 +1,49 @@
+package com.cyksj.model.dto;
+
+import com.cyksj.model.views.QuestionnaireOptionsView;
+import com.ejlchina.searcher.bean.DbField;
+import com.ejlchina.searcher.bean.DbIgnore;
+import com.ejlchina.searcher.bean.SearchBean;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+/*
+ *项目名: netflix
+ *文件名: QuestionnaireView
+ *创建者: JavaZou
+ *创建时间:2023/6/13 11:13
+ */
+@Getter
+@Setter
+@SearchBean(tables = "form_template ft left join form_fields ff on ff.template_id = ft.id",
+		where = "ff.is_deleted is true")
+public class QuestionnaireView {
+
+	@DbField("ft.id")
+	private Long templateId;
+
+	@DbField("ff.id")
+	private Long fieldsId;
+
+	@DbField("ff.fields_name")
+	private String fieldsName;
+
+	@DbField("ff.data_type")
+	private Integer dataType;
+
+	@DbField("ff.fields_entry_type")
+	private Integer FieldsEntryType;
+
+	@DbField("ff.show_table")
+	private Integer showTable;
+
+	@DbField("ff.sorted")
+	@JsonIgnore
+	private Integer sorted;
+
+	@DbIgnore
+	private List<QuestionnaireOptionsView> options;
+}

+ 7 - 1
netflix-dao/src/main/java/com/cyksj/model/entity/FormFieldsData.java

@@ -3,6 +3,8 @@ package com.cyksj.model.entity;
 import lombok.Getter;
 import lombok.Setter;
 
+import javax.validation.constraints.NotNull;
+
 /*
  *项目名: netflix
  *文件名: FormFieldsData
@@ -15,12 +17,16 @@ public class FormFieldsData extends BaseEntity{
 	/**
 	 * 字段id
 	 */
-	private Long fieldId;
+	@NotNull(message = "请选择对应问题")
+	private Long fieldsId;
+
+	private Long promotionId;
 
 	private Long orderId;
 
 	private Integer sorted;
 
+	@NotNull(message = "请选择对应问题选项")
 	private String content;
 
 	private Boolean isDeleted;

+ 2 - 2
netflix-dao/src/main/java/com/cyksj/model/entity/FormFieldsDefault.java

@@ -20,12 +20,12 @@ public class FormFieldsDefault extends BaseEntity{
 	/**
 	 * 字段id
 	 */
-	private Long fieldId;
+	private Long fieldsId;
 
 	/**
 	 * 字段名称
 	 */
-	private String fieldName;
+	private String fieldsName;
 
 	/**
 	 * 默认值

+ 20 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/QuestionnairePromotion.java

@@ -0,0 +1,20 @@
+package com.cyksj.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/*
+ *项目名: netflix
+ *文件名: QuestionnairePromotion
+ *创建者: JavaZou
+ *创建时间:2023/6/12 17:17
+ */
+@Getter
+@Setter
+public class QuestionnairePromotion extends BaseEntity{
+	private Long templateId;
+
+	private String name;
+
+	private String remark;
+}

+ 29 - 0
netflix-dao/src/main/java/com/cyksj/model/views/QuestionnaireOptionsView.java

@@ -0,0 +1,29 @@
+package com.cyksj.model.views;
+
+import com.ejlchina.searcher.bean.DbField;
+import com.ejlchina.searcher.bean.SearchBean;
+import lombok.Getter;
+import lombok.Setter;
+
+/*
+ *项目名: netflix
+ *文件名: QuestionnaireOptionsView
+ *创建者: JavaZou
+ *创建时间:2023/6/13 13:38
+ */
+@Getter
+@Setter
+@SearchBean(tables = "form_fields_default fd")
+public class QuestionnaireOptionsView {
+	@DbField("fd.fields_id")
+	private Long fieldsId;
+
+	@DbField("fd.promotion_id")
+	private Long promotionId;
+
+	@DbField("fd.fields_name")
+	private String fieldsName;
+
+	@DbField("fd.value")
+	private String value;
+}

+ 45 - 0
netflix-dao/src/main/java/com/cyksj/model/views/QuestionnaireView.java

@@ -0,0 +1,45 @@
+package com.cyksj.model.views;
+
+import com.ejlchina.searcher.bean.DbField;
+import com.ejlchina.searcher.bean.SearchBean;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import lombok.Getter;
+import lombok.Setter;
+
+/*
+ *项目名: netflix
+ *文件名: QuestionnaireView
+ *创建者: JavaZou
+ *创建时间:2023/6/13 11:13
+ */
+@Getter
+@Setter
+@SearchBean(tables = "form_template fd left join form_fields ff on ff.template_id = fd.id",
+		where = "fd.is_deleted is true,ff.is_deleted is true")
+public class QuestionnaireView {
+
+	@DbField("fd.promotion_id")
+	private Long promotionId;
+
+	@DbField("ff.id")
+	private Long fieldsId;
+
+	@DbField("ff.fields_name")
+	private String fieldsName;
+
+	@DbField("ff.data_type")
+	private Integer dataType;
+
+	@DbField("ff.fields_entry_type")
+	private Integer FieldsEntryType;
+
+	@DbField("ff.max_length")
+	private Integer maxLength;
+
+	@DbField("ff.show_table")
+	private Integer showTable;
+
+	@DbField("ff.sorted")
+	@JsonIgnore
+	private Integer sorted;
+}

+ 5 - 0
netflix-service/pom.xml

@@ -35,6 +35,11 @@
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-mail</artifactId>
         </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
     </dependencies>
 
 </project>

+ 22 - 0
netflix-service/src/main/java/com/cyksj/service/mange/form/FormService.java

@@ -0,0 +1,22 @@
+package com.cyksj.service.mange.form;
+
+import com.cyksj.model.dto.FormTemplateDataDto;
+import com.cyksj.model.entity.FormFieldsDefault;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+
+/*
+ *项目名: netflix
+ *文件名: FormService
+ *创建者: JavaZou
+ *创建时间:2023/6/12 15:57
+ */
+public interface FormService {
+
+	void saveOrUpdateTemplateAndRelationFields(FormTemplateDataDto dataDto);
+
+	void exportQuestionInfo(Long promotionId, String start, String end, HttpServletResponse response) throws Exception;
+
+	void saveOrUpdateTemplateFieldsValue(List<FormFieldsDefault> values);
+}

+ 140 - 0
netflix-service/src/main/java/com/cyksj/service/mange/form/impl/FormServiceImpl.java

@@ -0,0 +1,140 @@
+package com.cyksj.service.mange.form.impl;
+
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.support.ExcelTypeEnum;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.cyksj.common.exception.BusinessRuntimeException;
+import com.cyksj.mapper.manage.form.*;
+import com.cyksj.model.dto.FormTemplateDataDto;
+import com.cyksj.model.entity.*;
+import com.cyksj.service.mange.form.FormService;
+import com.google.common.collect.Lists;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.ArrayList;
+import java.util.List;
+
+/*
+ *项目名: netflix
+ *文件名: FormServiceImpl
+ *创建者: JavaZou
+ *创建时间:2023/6/12 15:58
+ */
+@Service
+@RequiredArgsConstructor
+@Slf4j
+public class FormServiceImpl implements FormService {
+	private final FormFieldsMapper formFieldsMapper;
+
+	private final FormFieldsDataMapper formFieldsDataMapper;
+
+	private final FormTemplateMapper formTemplateMapper;
+
+	private final FormFieldsDefaultMapper formFieldsDefaultMapper;
+
+	private final QuestionnairePromotionMapper questionnairePromotionMapper;
+
+	@Override
+	@Transactional(rollbackFor = Throwable.class)
+	public void saveOrUpdateTemplateAndRelationFields(FormTemplateDataDto dataDto) {
+		Long templateId = saveOrUpdateTemplate(dataDto.getId(), dataDto.getName(), dataDto.getDescStr());
+
+		saveOrUpdateTemplateFields(templateId, dataDto.getFormFieldsList());
+	}
+
+	@Override
+	public void exportQuestionInfo(Long promotionId, String start, String end, HttpServletResponse response) throws Exception {
+		QuestionnairePromotion promotion = questionnairePromotionMapper.selectById(promotionId);
+		if (promotion == null) throw BusinessRuntimeException.getInstance("问卷活动不存在");
+		String fileName = promotion.getName();
+		response.setContentType("application/x-download");
+		response.setContentType("application/vnd.ms-excel");
+		response.setCharacterEncoding("utf-8");
+		response.setHeader("Content-disposition",
+				"attachment;filename=" + new String(fileName.getBytes("utf-8"), "ISO-8859-1") + ExcelTypeEnum.XLS.getValue());
+
+		EasyExcel.write(response.getOutputStream())
+				// 这里放入动态头
+				.head(head(promotionId)).sheet("问卷信息")
+				// 当然这里数据也可以用 List<List<String>> 去传入
+				.doWrite(data(promotionId));
+	}
+
+	@Override
+	public void saveOrUpdateTemplateFieldsValue(List<FormFieldsDefault> values) {
+		values.forEach(value -> {
+			if (value.getId() == null) {
+				if (StrUtil.isEmpty(value.getFieldsName())) {
+					FormFields formFields = formFieldsMapper.selectById(value.getFieldsId());
+					value.setFieldsName(formFields.getFieldsName());
+				}
+				formFieldsDefaultMapper.insert(value);
+				return;
+			}
+			formFieldsDefaultMapper.updateById(value);
+		});
+	}
+
+	public Long saveOrUpdateTemplate(Long templateId, String name, String descStr) {
+		FormTemplate formTemplate;
+		if (templateId == null) {
+			formTemplate = new FormTemplate();
+			formTemplate.setName(name);
+			formTemplate.setDescStr(descStr);
+			formTemplateMapper.insert(formTemplate);
+			return formTemplate.getId();
+		}
+		formTemplate = formTemplateMapper.selectById(templateId);
+		formTemplate.setName(name);
+		formTemplate.setDescStr(descStr);
+		formTemplateMapper.updateById(formTemplate);
+		return formTemplate.getId();
+	}
+
+	private void saveOrUpdateTemplateFields(Long templateId, List<FormFields> formFieldsList) {
+		List<Long> filedIds = new ArrayList<>();
+		formFieldsList.forEach(field -> {
+			Long fieldId = field.getId();
+			if (fieldId == null) {
+				field.setTemplateId(templateId);
+				formFieldsMapper.insert(field);
+			} else {
+				formFieldsMapper.updateById(field);
+			}
+			filedIds.add(fieldId);
+		});
+
+		formFieldsMapper.delete(Wrappers.lambdaQuery(FormFields.class)
+				.eq(FormFields::getTemplateId, templateId)
+				.notIn(FormFields::getId, filedIds));
+	}
+
+
+	private List<List<String>> head(Long templateId) {
+		List<FormFields> formFields = formFieldsMapper.selectList(new LambdaQueryWrapper<FormFields>().eq(FormFields::getTemplateId, templateId).orderByAsc(FormFields::getSorted));
+		List<List<String>> headTitles = new ArrayList<>();
+		String formInfo = "表单信息";
+		formFields.forEach((field) -> {
+			headTitles.add(Lists.newArrayList(formInfo, formInfo, field.getFieldsName()));
+		});
+		return headTitles;
+	}
+
+	private List<List<String>> data(Long promotionId) {
+		List<List<String>> contentList = Lists.newArrayList();
+		List<FormFieldsData> fieldsDataList = formFieldsDataMapper.selectList(new LambdaQueryWrapper<FormFieldsData>().eq(FormFieldsData::getPromotionId, promotionId).orderByAsc(FormFieldsData::getSorted));
+		fieldsDataList.forEach((formFieldsData) -> {
+			ArrayList<String> dataList = new ArrayList<>();
+			dataList.add(formFieldsData.getContent());
+			contentList.add(Lists.newArrayList(formFieldsData.getContent()));
+
+		});
+		return contentList;
+	}
+}

+ 45 - 0
netflix-web/src/main/java/com/cyksj/web/controller/group/GroupRelationController.java

@@ -15,11 +15,15 @@ import com.cyksj.common.util.StringUtil;
 import com.cyksj.dto.Result;
 import com.cyksj.enums.GatewayResponse;
 import com.cyksj.mapper.*;
+import com.cyksj.mapper.manage.form.FormFieldsDataMapper;
+import com.cyksj.mapper.manage.form.QuestionnairePromotionMapper;
 import com.cyksj.model.dto.DoubleVerifyDto;
+import com.cyksj.model.dto.QuestionnaireView;
 import com.cyksj.model.entity.*;
 import com.cyksj.model.manage.views.GroupsRelationView;
 import com.cyksj.model.request.OrderPayRequest;
 import com.cyksj.model.views.DoubleVerifyCodeView;
+import com.cyksj.model.views.QuestionnaireOptionsView;
 import com.cyksj.model.views.RenewalView;
 import com.cyksj.model.views.UserTicketView;
 import com.cyksj.redis.RedisService;
@@ -78,6 +82,10 @@ public class GroupRelationController {
 
     private final CouponCommonService couponCommonService;
 
+    private final FormFieldsDataMapper formFieldsDataMapper;
+
+    private final QuestionnairePromotionMapper questionnairePromotionMapper;
+
     private final GlobalThreadPoolTaskExecutor THREAD_POOL;
 
     @RequestMapping("/get/renewal")
@@ -379,4 +387,41 @@ public class GroupRelationController {
         }
         return GatewayResponse.SUCCESS.newBuilder().toResult();
     }
+
+    /**
+     * 获取对应的动态问卷
+     */
+    @GetMapping("/get/questionnaire")
+    public Result<List<QuestionnaireView>> getQuestionnaireView(Long promotionId) {
+        QuestionnairePromotion promotion = questionnairePromotionMapper.selectById(promotionId);
+        if (promotion == null) throw BusinessRuntimeException.getInstance("问卷不存在");
+        Long templateId = promotion.getTemplateId();
+        List<QuestionnaireView> questionnaireViews = beanSearcher.searchAll(QuestionnaireView.class, MapUtils.builder()
+                .field(QuestionnaireView::getTemplateId, templateId)
+                .orderBy(QuestionnaireView::getSorted).asc()
+                .orderBy(QuestionnaireView::getFieldsId).asc()
+                .build());
+        questionnaireViews.forEach(data -> {
+            List<QuestionnaireOptionsView> optionsViews = beanSearcher.searchAll(QuestionnaireOptionsView.class, MapUtils.builder()
+                    .field(QuestionnaireOptionsView::getPromotionId, promotionId)
+                    .field(QuestionnaireOptionsView::getFieldsId, data.getFieldsId())
+                    .build());
+            data.setOptions(optionsViews);
+        });
+        return GatewayResponse.SUCCESS.newBuilder().toResult(questionnaireViews);
+    }
+
+    /**
+     * 记录问卷
+     */
+    @PostMapping("/record/questionnaire")
+    public Result<String> recordQuestionnaire(@RequestBody @Validated FormFieldsData data) {
+        Long promotionId = data.getPromotionId();
+        if (promotionId == null){
+            //默认问卷
+            data.setPromotionId(1l);
+        }
+        formFieldsDataMapper.insert(data);
+        return GatewayResponse.SUCCESS.newBuilder().toResult();
+    }
 }

+ 94 - 89
netflix-web/src/main/java/com/cyksj/web/controller/manage/form/FormController.java

@@ -1,33 +1,29 @@
 package com.cyksj.web.controller.manage.form;
 
+import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.StrUtil;
-import com.alibaba.excel.EasyExcel;
-import com.alibaba.excel.support.ExcelTypeEnum;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.cyksj.dto.Result;
 import com.cyksj.enums.GatewayResponse;
 import com.cyksj.mapper.manage.form.FormFieldsDataMapper;
 import com.cyksj.mapper.manage.form.FormFieldsMapper;
+import com.cyksj.mapper.manage.form.FormTemplateMapper;
+import com.cyksj.model.dto.FormFieldsView;
+import com.cyksj.model.dto.FormTemplateDataDto;
 import com.cyksj.model.entity.FormFields;
-import com.cyksj.model.entity.FormFieldsData;
+import com.cyksj.model.entity.FormFieldsDefault;
 import com.cyksj.model.entity.FormTemplate;
-import com.cyksj.model.excel.ExcelOrderDonInfo;
 import com.cyksj.model.views.FormFieldsDataView;
+import com.cyksj.service.mange.form.FormService;
 import com.ejlchina.searcher.BeanSearcher;
 import com.ejlchina.searcher.SearchResult;
 import com.ejlchina.searcher.util.MapUtils;
-import com.google.common.collect.Lists;
 import lombok.RequiredArgsConstructor;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
-import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 
@@ -46,24 +42,97 @@ public class FormController {
 
 	private final FormFieldsDataMapper formFieldsDataMapper;
 
+	private final FormTemplateMapper formTemplateMapper;
+
+	private final FormService formService;
+
 	private final BeanSearcher beanSearcher;
 
 	private final HttpServletRequest request;
 
 	/**
-	 * 问卷表单模板
+	 * 新增模板 以及对应模板字段
+	 */
+	@PostMapping("/template/post")
+	public Result<String> insertTemplateAndRelationFields(@RequestBody FormTemplateDataDto dataDto) {
+		formService.saveOrUpdateTemplateAndRelationFields(dataDto);
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+
+	/**
+	 * 编辑模板以及对应模板字段
+	 */
+	@PutMapping("/template/put")
+	public Result<String> updateTemplateAndRelationFields(@RequestBody FormTemplateDataDto dataDto) {
+		formService.saveOrUpdateTemplateAndRelationFields(dataDto);
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+
+	/**
+	 * 选择模板 生成对应问题
+	 */
+	@PostMapping("/template/fields/value")
+	public Result<String> postTemplateFieldsValue(@RequestBody List<FormFieldsDefault> values) {
+		formService.saveOrUpdateTemplateFieldsValue(values);
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+
+	/**
+	 * 选择模板 修改对应问题
+	 */
+	@PutMapping("/template/fields/value")
+	public Result<String> updateTemplateFieldsValue(@RequestBody List<FormFieldsDefault> values) {
+		formService.saveOrUpdateTemplateFieldsValue(values);
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+
+	/**
+	 * 删除模板
+	 */
+	@PutMapping("/template/del/{id}")
+	public Result<String> delTid(@PathVariable Long id) {
+		formTemplateMapper.update(null, Wrappers.lambdaUpdate(FormTemplate.class)
+				.set(FormTemplate::getIsDeleted, false)
+				.eq(FormTemplate::getId, id));
+
+		formFieldsMapper.update(null, Wrappers.lambdaUpdate(FormFields.class)
+				.set(FormFields::getIsDeleted, false)
+				.eq(FormFields::getTemplateId, id));
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+
+	/**
+	 * 问卷表单模板列表
 	 */
-	@GetMapping("/get/template")
+	@GetMapping("/template/get")
 	public Result<SearchResult<FormTemplate>> getTemplate() {
 		SearchResult<FormTemplate> search = beanSearcher.search(FormTemplate.class, MapUtils.flatBuilder(request.getParameterMap()).build());
 		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
 	}
 
+	/**
+	 * 模板详情 问卷字段列表
+	 */
+	@GetMapping("/template/get/detail/{id}")
+	public Result<SearchResult<FormFieldsView>> getFieldsView(@PathVariable Long id) {
+		SearchResult<FormFieldsView> search = beanSearcher.search(FormFieldsView.class, MapUtils.flatBuilder(request.getParameterMap())
+				.field(FormFieldsView::getTemplateId, id)
+				.orderBy(FormFieldsView::getSorted).asc()
+				.build());
+		search.getDataList().forEach(data->{
+			List<FormFieldsDefault> formFieldsDefaults = beanSearcher.searchAll(FormFieldsDefault.class, MapUtils.builder().field(FormFieldsDefault::getFieldsId, data.getId()).orderBy(FormFieldsDefault::getId).asc().build());
+			data.setFieldsDefaults(formFieldsDefaults);
+		});
+		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
+	}
+
+
 	/**
 	 * 问卷回答列表
 	 */
-	@GetMapping("/get/data")
-	public Result<SearchResult<FormFieldsDataView>> getData() {
+	@GetMapping("/get/question/resp/data")
+	public Result<SearchResult<FormFieldsDataView>> getData(Long fieldsId) {
+		if (fieldsId == null) fieldsId = 3l;
 		SearchResult<FormFieldsDataView> search = beanSearcher.search(FormFieldsDataView.class, MapUtils.flatBuilder(request.getParameterMap()).build());
 		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
 	}
@@ -71,84 +140,20 @@ public class FormController {
 	/**
 	 * @param promotionId
 	 */
-
-	public void exportOrderInfo(@PathVariable Long promotionId, String start, String end, String charset, HttpServletResponse response) throws IOException {
+	@GetMapping("/export/question/resp/data")
+	public void exportQuestionInfo(@RequestParam(required = false, defaultValue = "1") Long promotionId, String start, String end, String charset, HttpServletResponse response) throws Exception {
 		if (StrUtil.isNotBlank(start)) {
 			start = DateUtil.formatDate(new Date(Long.parseLong(start))) + " 00:00:00";
 		}
 		if (StrUtil.isNotBlank(end)) {
 			end = DateUtil.formatDate(new Date(Long.parseLong(end))) + " 23:59:59";
 		}
-
-		List<ExcelOrderDonInfo> list = cmsOrderDonService.exportOrderInfo(promotionId, start, end);
-
-		String fileName = "报名信息";
-		response.setContentType("application/x-download");
-		response.setContentType("application/vnd.ms-excel");
-		response.setCharacterEncoding("utf-8");
-		response.setHeader("Content-disposition",
-				"attachment;filename=" + new String(fileName.getBytes("utf-8"), "ISO-8859-1") + ExcelTypeEnum.XLS.getValue());
-
-		EasyExcel.write(response.getOutputStream())
-				// 这里放入动态头
-				.head(head(4l)).sheet("商务合作问卷")
-				// 当然这里数据也可以用 List<List<String>> 去传入
-				.doWrite(data(list));
-	}
-
-
-	private List<List<String>> head(Long templateId) {
-
-		List<FormFields> formFields = formFieldsMapper.selectList(new LambdaQueryWrapper<FormFields>().eq(FormFields::getTemplateId, templateId).orderByAsc(FormFields::getSorted));
-		List<List<String>> headTitles = new ArrayList<>();
-//		String orderInfo = "订单基本信息";
-		String formInfo = "表单信息";
-//		String lottery = "中奖信息";
-//		//第一列,1/2/3行
-//		headTitles.add( Lists.newArrayList(orderInfo,orderInfo,"订单号" ));
-//		headTitles.add( Lists.newArrayList(orderInfo,orderInfo,"微信名称" ));
-//		headTitles.add( Lists.newArrayList(orderInfo,orderInfo,"推荐人微信名称" ));
-//		headTitles.add( Lists.newArrayList(orderInfo,orderInfo,"金额" ));
-//		headTitles.add( Lists.newArrayList(orderInfo,orderInfo,"支付时间" ));
-//
-//		headTitles.add( Lists.newArrayList(lottery,lottery,"奖品名称" ));
-//		headTitles.add( Lists.newArrayList(lottery,lottery,"奖品描述" ));
-
-		formFields.forEach((field) -> {
-			headTitles.add(Lists.newArrayList(formInfo, formInfo, field.getFieldsName()));
-		});
-		return headTitles;
-	}
-
-	private List<List<String>> data(List<ExcelOrderDonInfo> list) {
-		List<List<String>> contentList = Lists.newArrayList();
-		list.forEach((donInfo) -> {
-			ArrayList<String> dataList = Lists.newArrayList(donInfo.getOrderNo(), donInfo.getNickName(), donInfo.getSharedName(), donInfo.getPrice().toString(), DateUtil.format(donInfo.getPayTime(), "yyyy年MM月dd日HH时mm分ss秒"));
-
-//			OrderDon orderDon = cmsOrderDonService.getById(donInfo.getOrderId());
-//			LotteryRecord lotteryRecord = Optional.ofNullable(
-//					lotteryRecordMapper.selectOne(new LambdaQueryWrapper<LotteryRecord>()
-//							.eq(LotteryRecord::getUserId, orderDon.getUserId())
-//							.eq(LotteryRecord::getPromotionId, orderDon.getPromotionId())
-//							.last("limit 1")))
-//					.orElseGet(() -> {
-//						LotteryRecord record = new LotteryRecord();
-//						record.setGiftName(StringUtil.EMPTY);
-//						record.setGiftDesc(StringUtil.EMPTY);
-//						return record;
-//					});
-//
-//			dataList.add(lotteryRecord.getGiftName());
-//			dataList.add(lotteryRecord.getGiftDesc());
-
-			List<FormFieldsData> fieldsDataList = formFieldsDataMapper.selectList(new LambdaQueryWrapper<FormFieldsData>().eq(FormFieldsData::getOrderId, donInfo.getOrderId()).orderByAsc(FormFieldsData::getSorted));
-			fieldsDataList.forEach((formFieldsData) -> {
-				dataList.add(formFieldsData.getContent());
-			});
-
-			contentList.add(dataList);
-		});
-
-		return contentList;
+		if (StrUtil.isBlank(start)) {
+			start = DateUtil.beginOfDay(DateTime.now()).toString();
+		}
+		if (StrUtil.isBlank(end)) {
+			start = DateUtil.endOfDay(DateTime.now()).toString();
+		}
+		formService.exportQuestionInfo(promotionId, start, end, response);
 	}
 }