Browse Source

1、行后报告模块调整

master
Aug 4 months ago
parent
commit
d5e17554ad
38 changed files with 2036 additions and 318 deletions
  1. +42
    -42
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/studytourEmail/controller/StudytourEmailController.java
  2. +71
    -0
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/studytourEmail/entity/StudytourEmail.java
  3. +17
    -0
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/studytourEmail/mapper/StudytourEmailMapper.java
  4. +1
    -1
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/studytourEmail/mapper/xml/StudytourEmailMapper.xml
  5. +14
    -0
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/studytourEmail/service/IStudytourEmailService.java
  6. +19
    -0
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/studytourEmail/service/impl/StudytourEmailServiceImpl.java
  7. +27
    -21
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/studytourEmail/vue/StudytourEmailList.vue
  8. +15
    -10
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/studytourEmail/vue/modules/StudytourEmailForm.vue
  9. +4
    -4
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/studytourEmail/vue/modules/StudytourEmailModal.Style#Drawer.vue
  10. +4
    -4
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/studytourEmail/vue/modules/StudytourEmailModal.vue
  11. +7
    -7
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/studytourEmail/vue3/StudytourEmail.api.ts
  12. +27
    -20
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/studytourEmail/vue3/StudytourEmail.data.ts
  13. +7
    -7
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/studytourEmail/vue3/StudytourEmailList.vue
  14. +2
    -2
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/studytourEmail/vue3/components/StudytourEmailModal.vue
  15. +0
    -19
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/studytourExperience/service/impl/StudytourExperienceServiceImpl.java
  16. +138
    -29
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/studytourRecord/controller/StudytourRecordController.java
  17. +5
    -14
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/studytourRecord/entity/StudytourExperience.java
  18. +4
    -10
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/studytourRecord/entity/StudytourRecord.java
  19. +355
    -0
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/studytourRecord/entity/StudytourReport.java
  20. +7
    -5
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/studytourRecord/mapper/StudytourExperienceMapper.java
  21. +1
    -1
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/studytourRecord/mapper/StudytourRecordMapper.java
  22. +19
    -0
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/studytourRecord/mapper/StudytourReportMapper.java
  23. +16
    -0
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/studytourRecord/mapper/xml/StudytourExperienceMapper.xml
  24. +16
    -0
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/studytourRecord/mapper/xml/StudytourReportMapper.xml
  25. +5
    -3
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/studytourRecord/service/IStudytourExperienceService.java
  26. +28
    -1
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/studytourRecord/service/IStudytourRecordService.java
  27. +16
    -0
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/studytourRecord/service/IStudytourReportService.java
  28. +27
    -0
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/studytourRecord/service/impl/StudytourExperienceServiceImpl.java
  29. +81
    -2
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/studytourRecord/service/impl/StudytourRecordServiceImpl.java
  30. +27
    -0
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/studytourRecord/service/impl/StudytourReportServiceImpl.java
  31. +85
    -0
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/studytourRecord/vo/StudytourRecordPage.java
  32. +16
    -30
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/studytourRecord/vue/StudytourRecordList.vue
  33. +758
    -65
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/studytourRecord/vue/modules/StudytourRecordForm.vue
  34. +12
    -8
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/studytourRecord/vue/modules/StudytourRecordModal.vue
  35. +16
    -6
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/api/service/ExperienceService.java
  36. +99
    -6
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/api/service/Impl/ExperienceServiceImpl.java
  37. +27
    -0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/api/service/Impl/OrderServiceImpl.java
  38. +21
    -1
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/api/studytourController/ExperienceController.java

jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/studytourExperience/controller/StudytourExperienceController.java → jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/studytourEmail/controller/StudytourEmailController.java View File

@ -1,4 +1,4 @@
package org.jeecg.modules.studytourExperience.controller;
package org.jeecg.modules.studytourEmail.controller;
import java.util.Arrays;
import java.util.List;
@ -12,8 +12,8 @@ import javax.servlet.http.HttpServletResponse;
import org.jeecg.common.api.vo.Result;
import org.jeecg.common.system.query.QueryGenerator;
import org.jeecg.common.util.oConvertUtils;
import org.jeecg.modules.studytourExperience.entity.StudytourExperience;
import org.jeecg.modules.studytourExperience.service.IStudytourExperienceService;
import org.jeecg.modules.studytourEmail.entity.StudytourEmail;
import org.jeecg.modules.studytourEmail.service.IStudytourEmailService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
@ -37,66 +37,66 @@ import io.swagger.annotations.ApiOperation;
import org.jeecg.common.aspect.annotation.AutoLog;
/**
* @Description: 学员心得
* @Description: 邮件信息
* @Author: jeecg-boot
* @Date: 2025-09-19
* @Date: 2025-10-29
* @Version: V1.0
*/
@Api(tags="学员心得表")
@Api(tags="邮件信息表")
@RestController
@RequestMapping("/studytourExperience/studytourExperience")
@RequestMapping("/studytourEmail/studytourEmail")
@Slf4j
public class StudytourExperienceController extends JeecgController<StudytourExperience, IStudytourExperienceService> {
public class StudytourEmailController extends JeecgController<StudytourEmail, IStudytourEmailService> {
@Autowired
private IStudytourExperienceService studytourExperienceService;
private IStudytourEmailService studytourEmailService;
/**
* 分页列表查询
*
* @param studytourExperience
* @param studytourEmail
* @param pageNo
* @param pageSize
* @param req
* @return
*/
//@AutoLog(value = "学员心得表-分页列表查询")
@ApiOperation(value="学员心得表-分页列表查询", notes="学员心得表-分页列表查询")
//@AutoLog(value = "邮件信息表-分页列表查询")
@ApiOperation(value="邮件信息表-分页列表查询", notes="邮件信息表-分页列表查询")
@GetMapping(value = "/list")
public Result<IPage<StudytourExperience>> queryPageList(StudytourExperience studytourExperience,
public Result<IPage<StudytourEmail>> queryPageList(StudytourEmail studytourEmail,
@RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
@RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
HttpServletRequest req) {
QueryWrapper<StudytourExperience> queryWrapper = QueryGenerator.initQueryWrapper(studytourExperience, req.getParameterMap());
Page<StudytourExperience> page = new Page<StudytourExperience>(pageNo, pageSize);
IPage<StudytourExperience> pageList = studytourExperienceService.page(page, queryWrapper);
QueryWrapper<StudytourEmail> queryWrapper = QueryGenerator.initQueryWrapper(studytourEmail, req.getParameterMap());
Page<StudytourEmail> page = new Page<StudytourEmail>(pageNo, pageSize);
IPage<StudytourEmail> pageList = studytourEmailService.page(page, queryWrapper);
return Result.OK(pageList);
}
/**
* 添加
*
* @param studytourExperience
* @param studytourEmail
* @return
*/
@AutoLog(value = "学员心得表-添加")
@ApiOperation(value="学员心得表-添加", notes="学员心得表-添加")
@AutoLog(value = "邮件信息表-添加")
@ApiOperation(value="邮件信息表-添加", notes="邮件信息表-添加")
@PostMapping(value = "/add")
public Result<String> add(@RequestBody StudytourExperience studytourExperience) {
studytourExperienceService.save(studytourExperience);
public Result<String> add(@RequestBody StudytourEmail studytourEmail) {
studytourEmailService.save(studytourEmail);
return Result.OK("添加成功!");
}
/**
* 编辑
*
* @param studytourExperience
* @param studytourEmail
* @return
*/
@AutoLog(value = "学员心得表-编辑")
@ApiOperation(value="学员心得表-编辑", notes="学员心得表-编辑")
@AutoLog(value = "邮件信息表-编辑")
@ApiOperation(value="邮件信息表-编辑", notes="邮件信息表-编辑")
@RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST})
public Result<String> edit(@RequestBody StudytourExperience studytourExperience) {
studytourExperienceService.updateById(studytourExperience);
public Result<String> edit(@RequestBody StudytourEmail studytourEmail) {
studytourEmailService.updateById(studytourEmail);
return Result.OK("编辑成功!");
}
@ -106,11 +106,11 @@ public class StudytourExperienceController extends JeecgController<StudytourExpe
* @param id
* @return
*/
@AutoLog(value = "学员心得表-通过id删除")
@ApiOperation(value="学员心得表-通过id删除", notes="学员心得表-通过id删除")
@AutoLog(value = "邮件信息表-通过id删除")
@ApiOperation(value="邮件信息表-通过id删除", notes="邮件信息表-通过id删除")
@DeleteMapping(value = "/delete")
public Result<String> delete(@RequestParam(name="id",required=true) String id) {
studytourExperienceService.removeById(id);
studytourEmailService.removeById(id);
return Result.OK("删除成功!");
}
@ -120,11 +120,11 @@ public class StudytourExperienceController extends JeecgController<StudytourExpe
* @param ids
* @return
*/
@AutoLog(value = "学员心得表-批量删除")
@ApiOperation(value="学员心得表-批量删除", notes="学员心得表-批量删除")
@AutoLog(value = "邮件信息表-批量删除")
@ApiOperation(value="邮件信息表-批量删除", notes="邮件信息表-批量删除")
@DeleteMapping(value = "/deleteBatch")
public Result<String> deleteBatch(@RequestParam(name="ids",required=true) String ids) {
this.studytourExperienceService.removeByIds(Arrays.asList(ids.split(",")));
this.studytourEmailService.removeByIds(Arrays.asList(ids.split(",")));
return Result.OK("批量删除成功!");
}
@ -134,26 +134,26 @@ public class StudytourExperienceController extends JeecgController<StudytourExpe
* @param id
* @return
*/
//@AutoLog(value = "学员心得表-通过id查询")
@ApiOperation(value="学员心得表-通过id查询", notes="学员心得表-通过id查询")
//@AutoLog(value = "邮件信息表-通过id查询")
@ApiOperation(value="邮件信息表-通过id查询", notes="邮件信息表-通过id查询")
@GetMapping(value = "/queryById")
public Result<StudytourExperience> queryById(@RequestParam(name="id",required=true) String id) {
StudytourExperience studytourExperience = studytourExperienceService.getById(id);
if(studytourExperience==null) {
public Result<StudytourEmail> queryById(@RequestParam(name="id",required=true) String id) {
StudytourEmail studytourEmail = studytourEmailService.getById(id);
if(studytourEmail==null) {
return Result.error("未找到对应数据");
}
return Result.OK(studytourExperience);
return Result.OK(studytourEmail);
}
/**
* 导出excel
*
* @param request
* @param studytourExperience
* @param studytourEmail
*/
@RequestMapping(value = "/exportXls")
public ModelAndView exportXls(HttpServletRequest request, StudytourExperience studytourExperience) {
return super.exportXls(request, studytourExperience, StudytourExperience.class, "学员心得表");
public ModelAndView exportXls(HttpServletRequest request, StudytourEmail studytourEmail) {
return super.exportXls(request, studytourEmail, StudytourEmail.class, "邮件信息表");
}
/**
@ -165,7 +165,7 @@ public class StudytourExperienceController extends JeecgController<StudytourExpe
*/
@RequestMapping(value = "/importExcel", method = RequestMethod.POST)
public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
return super.importExcel(request, response, StudytourExperience.class);
return super.importExcel(request, response, StudytourEmail.class);
}
}

+ 71
- 0
jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/studytourEmail/entity/StudytourEmail.java View File

@ -0,0 +1,71 @@
package org.jeecg.modules.studytourEmail.entity;
import java.io.Serializable;
import java.io.UnsupportedEncodingException;
import java.util.Date;
import java.math.BigDecimal;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.springframework.format.annotation.DateTimeFormat;
import org.jeecgframework.poi.excel.annotation.Excel;
import org.jeecg.common.aspect.annotation.Dict;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
/**
* @Description: 邮件信息表
* @Author: jeecg-boot
* @Date: 2025-10-29
* @Version: V1.0
*/
@Data
@TableName("studytour_email")
@Accessors(chain = true)
@EqualsAndHashCode(callSuper = false)
@ApiModel(value="studytour_email对象", description="邮件信息表")
public class StudytourEmail implements Serializable {
private static final long serialVersionUID = 1L;
/**主键*/
@TableId(type = IdType.ASSIGN_ID)
@ApiModelProperty(value = "主键")
private java.lang.String id;
/**创建人*/
@ApiModelProperty(value = "创建人")
private java.lang.String createBy;
/**创建日期*/
@ApiModelProperty(value = "创建日期")
private java.util.Date createTime;
/**更新人*/
@ApiModelProperty(value = "更新人")
private java.lang.String updateBy;
/**更新日期*/
@ApiModelProperty(value = "更新日期")
private java.util.Date updateTime;
/**姓名*/
@Excel(name = "姓名", width = 15)
@ApiModelProperty(value = "姓名")
private java.lang.String name;
/**电话*/
@Excel(name = "电话", width = 15)
@ApiModelProperty(value = "电话")
private java.lang.String phone;
/**邮寄地址*/
@Excel(name = "邮寄地址", width = 15)
@ApiModelProperty(value = "邮寄地址")
private java.lang.String address;
/**行后报告*/
@Excel(name = "行后报告", width = 15)
@ApiModelProperty(value = "行后报告")
private java.lang.String report;
/**关联用户*/
@Excel(name = "关联用户", width = 15, dictTable = "han_hai_member", dicText = "nick_name", dicCode = "id")
@Dict(dictTable = "han_hai_member", dicText = "nick_name", dicCode = "id")
@ApiModelProperty(value = "关联用户")
private java.lang.String userId;
}

+ 17
- 0
jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/studytourEmail/mapper/StudytourEmailMapper.java View File

@ -0,0 +1,17 @@
package org.jeecg.modules.studytourEmail.mapper;
import java.util.List;
import org.apache.ibatis.annotations.Param;
import org.jeecg.modules.studytourEmail.entity.StudytourEmail;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @Description: 邮件信息表
* @Author: jeecg-boot
* @Date: 2025-10-29
* @Version: V1.0
*/
public interface StudytourEmailMapper extends BaseMapper<StudytourEmail> {
}

jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/studytourExperience/mapper/xml/StudytourExperienceMapper.xml → jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/studytourEmail/mapper/xml/StudytourEmailMapper.xml View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.jeecg.modules.studytourExperience.mapper.StudytourExperienceMapper">
<mapper namespace="org.jeecg.modules.studytourEmail.mapper.StudytourEmailMapper">
</mapper>

+ 14
- 0
jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/studytourEmail/service/IStudytourEmailService.java View File

@ -0,0 +1,14 @@
package org.jeecg.modules.studytourEmail.service;
import org.jeecg.modules.studytourEmail.entity.StudytourEmail;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* @Description: 邮件信息表
* @Author: jeecg-boot
* @Date: 2025-10-29
* @Version: V1.0
*/
public interface IStudytourEmailService extends IService<StudytourEmail> {
}

+ 19
- 0
jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/studytourEmail/service/impl/StudytourEmailServiceImpl.java View File

@ -0,0 +1,19 @@
package org.jeecg.modules.studytourEmail.service.impl;
import org.jeecg.modules.studytourEmail.entity.StudytourEmail;
import org.jeecg.modules.studytourEmail.mapper.StudytourEmailMapper;
import org.jeecg.modules.studytourEmail.service.IStudytourEmailService;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
/**
* @Description: 邮件信息表
* @Author: jeecg-boot
* @Date: 2025-10-29
* @Version: V1.0
*/
@Service
public class StudytourEmailServiceImpl extends ServiceImpl<StudytourEmailMapper, StudytourEmail> implements IStudytourEmailService {
}

jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/studytourExperience/vue/StudytourExperienceList.vue → jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/studytourEmail/vue/StudytourEmailList.vue View File

@ -12,7 +12,7 @@
<!-- 操作按钮区域 -->
<div class="table-operator">
<a-button @click="handleAdd" type="primary" icon="plus">新增</a-button>
<a-button type="primary" icon="download" @click="handleExportXls('学员心得表')">导出</a-button>
<a-button type="primary" icon="download" @click="handleExportXls('邮件信息表')">导出</a-button>
<a-upload name="file" :showUploadList="false" :multiple="false" :headers="tokenHeader" :action="importExcelUrl" @change="handleImportExcel">
<a-button type="primary" icon="import">导入</a-button>
</a-upload>
@ -89,7 +89,7 @@
</a-table>
</div>
<studytour-experience-modal ref="modalForm" @ok="modalFormOk"></studytour-experience-modal>
<studytour-email-modal ref="modalForm" @ok="modalFormOk"></studytour-email-modal>
</a-card>
</template>
@ -98,18 +98,18 @@
import '@/assets/less/TableExpand.less'
import { mixinDevice } from '@/utils/mixin'
import { JeecgListMixin } from '@/mixins/JeecgListMixin'
import StudytourExperienceModal from './modules/StudytourExperienceModal'
import StudytourEmailModal from './modules/StudytourEmailModal'
import {filterMultiDictText} from '@/components/dict/JDictSelectUtil'
export default {
name: 'StudytourExperienceList',
name: 'StudytourEmailList',
mixins:[JeecgListMixin, mixinDevice],
components: {
StudytourExperienceModal
StudytourEmailModal
},
data () {
return {
description: '学员心得表管理页面',
description: '邮件信息表管理页面',
//
columns: [
{
@ -123,20 +123,25 @@
}
},
{
title:'文字内容',
title:'姓名',
align:"center",
dataIndex: 'content'
dataIndex: 'name'
},
{
title:'图片内容',
title:'电话',
align:"center",
dataIndex: 'image',
scopedSlots: {customRender: 'imgSlot'}
dataIndex: 'phone'
},
{
title:'关联成长档案',
title:'邮寄地址',
align:"center",
dataIndex: 'experienceId_dictText'
dataIndex: 'address'
},
{
title:'行后报告',
align:"center",
dataIndex: 'report',
scopedSlots: {customRender: 'fileSlot'}
},
{
title:'关联用户',
@ -153,11 +158,11 @@
}
],
url: {
list: "/studytourExperience/studytourExperience/list",
delete: "/studytourExperience/studytourExperience/delete",
deleteBatch: "/studytourExperience/studytourExperience/deleteBatch",
exportXlsUrl: "/studytourExperience/studytourExperience/exportXls",
importExcelUrl: "studytourExperience/studytourExperience/importExcel",
list: "/studytourEmail/studytourEmail/list",
delete: "/studytourEmail/studytourEmail/delete",
deleteBatch: "/studytourEmail/studytourEmail/deleteBatch",
exportXlsUrl: "/studytourEmail/studytourEmail/exportXls",
importExcelUrl: "studytourEmail/studytourEmail/importExcel",
},
dictOptions:{},
@ -177,9 +182,10 @@
},
getSuperFieldList(){
let fieldList=[];
fieldList.push({type:'Text',value:'content',text:'文字内容',dictCode:''})
fieldList.push({type:'Text',value:'image',text:'图片内容',dictCode:''})
fieldList.push({type:'sel_search',value:'experienceId',text:'关联成长档案',dictTable:"studytour_record", dictText:'activity_id', dictCode:'id'})
fieldList.push({type:'string',value:'name',text:'姓名',dictCode:''})
fieldList.push({type:'string',value:'phone',text:'电话',dictCode:''})
fieldList.push({type:'Text',value:'address',text:'邮寄地址',dictCode:''})
fieldList.push({type:'Text',value:'report',text:'行后报告',dictCode:''})
fieldList.push({type:'sel_search',value:'userId',text:'关联用户',dictTable:"han_hai_member", dictText:'nick_name', dictCode:'id'})
this.superFieldList = fieldList
}

jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/studytourExperience/vue/modules/StudytourExperienceForm.vue → jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/studytourEmail/vue/modules/StudytourEmailForm.vue View File

@ -4,18 +4,23 @@
<a-form-model ref="form" :model="model" :rules="validatorRules" slot="detail">
<a-row>
<a-col :span="24">
<a-form-model-item label="文字内容" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="content">
<a-textarea v-model="model.content" rows="4" placeholder="请输入文字内容" />
<a-form-model-item label="姓名" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="name">
<a-input v-model="model.name" placeholder="请输入姓名" ></a-input>
</a-form-model-item>
</a-col>
<a-col :span="24">
<a-form-model-item label="图片内容" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="image">
<j-image-upload isMultiple v-model="model.image" ></j-image-upload>
<a-form-model-item label="电话" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="phone">
<a-input v-model="model.phone" placeholder="请输入电话" ></a-input>
</a-form-model-item>
</a-col>
<a-col :span="24">
<a-form-model-item label="关联成长档案" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="experienceId">
<j-search-select-tag v-model="model.experienceId" dict="studytour_record,activity_id,id" />
<a-form-model-item label="邮寄地址" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="address">
<a-input v-model="model.address" placeholder="请输入邮寄地址" ></a-input>
</a-form-model-item>
</a-col>
<a-col :span="24">
<a-form-model-item label="行后报告" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="report">
<j-upload v-model="model.report" ></j-upload>
</a-form-model-item>
</a-col>
<a-col :span="24">
@ -35,7 +40,7 @@
import { validateDuplicateValue } from '@/utils/util'
export default {
name: 'StudytourExperienceForm',
name: 'StudytourEmailForm',
components: {
},
props: {
@ -62,9 +67,9 @@
validatorRules: {
},
url: {
add: "/studytourExperience/studytourExperience/add",
edit: "/studytourExperience/studytourExperience/edit",
queryById: "/studytourExperience/studytourExperience/queryById"
add: "/studytourEmail/studytourEmail/add",
edit: "/studytourEmail/studytourEmail/edit",
queryById: "/studytourEmail/studytourEmail/queryById"
}
}
},

jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/studytourExperience/vue/modules/StudytourExperienceModal.Style#Drawer.vue → jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/studytourEmail/vue/modules/StudytourEmailModal.Style#Drawer.vue View File

@ -7,7 +7,7 @@
@close="close"
destroyOnClose
:visible="visible">
<studytour-experience-form ref="realForm" @ok="submitCallback" :disabled="disableSubmit" normal></studytour-experience-form>
<studytour-email-form ref="realForm" @ok="submitCallback" :disabled="disableSubmit" normal></studytour-email-form>
<div class="drawer-footer">
<a-button @click="handleCancel" style="margin-bottom: 0;">关闭</a-button>
<a-button v-if="!disableSubmit" @click="handleOk" type="primary" style="margin-bottom: 0;">提交</a-button>
@ -17,12 +17,12 @@
<script>
import StudytourExperienceForm from './StudytourExperienceForm'
import StudytourEmailForm from './StudytourEmailForm'
export default {
name: 'StudytourExperienceModal',
name: 'StudytourEmailModal',
components: {
StudytourExperienceForm
StudytourEmailForm
},
data () {
return {

jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/studytourExperience/vue/modules/StudytourExperienceModal.vue → jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/studytourEmail/vue/modules/StudytourEmailModal.vue View File

@ -8,17 +8,17 @@
:okButtonProps="{ class:{'jee-hidden': disableSubmit} }"
@cancel="handleCancel"
cancelText="关闭">
<studytour-experience-form ref="realForm" @ok="submitCallback" :disabled="disableSubmit"></studytour-experience-form>
<studytour-email-form ref="realForm" @ok="submitCallback" :disabled="disableSubmit"></studytour-email-form>
</j-modal>
</template>
<script>
import StudytourExperienceForm from './StudytourExperienceForm'
import StudytourEmailForm from './StudytourEmailForm'
export default {
name: 'StudytourExperienceModal',
name: 'StudytourEmailModal',
components: {
StudytourExperienceForm
StudytourEmailForm
},
data () {
return {

jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/studytourExperience/vue3/StudytourExperience.api.ts → jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/studytourEmail/vue3/StudytourEmail.api.ts View File

@ -2,13 +2,13 @@ import {defHttp} from '/@/utils/http/axios';
import {Modal} from 'ant-design-vue';
enum Api {
list = '/studytourExperience/studytourExperience/list',
save='/studytourExperience/studytourExperience/add',
edit='/studytourExperience/studytourExperience/edit',
deleteOne = '/studytourExperience/studytourExperience/delete',
deleteBatch = '/studytourExperience/studytourExperience/deleteBatch',
importExcel = '/studytourExperience/studytourExperience/importExcel',
exportXls = '/studytourExperience/studytourExperience/exportXls',
list = '/studytourEmail/studytourEmail/list',
save='/studytourEmail/studytourEmail/add',
edit='/studytourEmail/studytourEmail/edit',
deleteOne = '/studytourEmail/studytourEmail/delete',
deleteBatch = '/studytourEmail/studytourEmail/deleteBatch',
importExcel = '/studytourEmail/studytourEmail/importExcel',
exportXls = '/studytourEmail/studytourEmail/exportXls',
}
/**
* api

jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/studytourExperience/vue3/StudytourExperience.data.ts → jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/studytourEmail/vue3/StudytourEmail.data.ts View File

@ -5,20 +5,25 @@ import { render } from '/@/utils/common/renderUtils';
//列表数据
export const columns: BasicColumn[] = [
{
title: '文字内容',
title: '姓名',
align:"center",
dataIndex: 'content'
dataIndex: 'name'
},
{
title: '图片内容',
title: '电话',
align:"center",
dataIndex: 'image',
customRender:render.renderAvatar,
dataIndex: 'phone'
},
{
title: '关联成长档案',
title: '邮寄地址',
align:"center",
dataIndex: 'experienceId_dictText'
dataIndex: 'address'
},
{
title: '行后报告',
align:"center",
dataIndex: 'report',
slots: { customRender: 'fileSlot' },
},
{
title: '关联用户',
@ -32,24 +37,26 @@ export const searchFormSchema: FormSchema[] = [
//表单数据
export const formSchema: FormSchema[] = [
{
label: '文字内容',
field: 'content',
component: 'InputTextArea',//TODO 注意string转换问题
label: '姓名',
field: 'name',
component: 'Input',
},
{
label: '图片内容',
field: 'image',
component: 'JImageUpload',
componentProps:{
},
label: '电话',
field: 'phone',
component: 'Input',
},
{
label: '关联成长档案',
field: 'experienceId',
component: 'JSearchSelect',
label: '邮寄地址',
field: 'address',
component: 'Input',
},
{
label: '行后报告',
field: 'report',
component: 'JUpload',
componentProps:{
dict:"studytour_record,activity_id,id"
},
},
},
{
label: '关联用户',

jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/studytourExperience/vue3/StudytourExperienceList.vue → jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/studytourEmail/vue3/StudytourEmailList.vue View File

@ -35,25 +35,25 @@
</template>
</BasicTable>
<!-- 表单区域 -->
<StudytourExperienceModal @register="registerModal" @success="handleSuccess"></StudytourExperienceModal>
<StudytourEmailModal @register="registerModal" @success="handleSuccess"></StudytourEmailModal>
</div>
</template>
<script lang="ts" name="studytourExperience-studytourExperience" setup>
<script lang="ts" name="studytourEmail-studytourEmail" setup>
import {ref, computed, unref} from 'vue';
import {BasicTable, useTable, TableAction} from '/@/components/Table';
import {useModal} from '/@/components/Modal';
import { useListPage } from '/@/hooks/system/useListPage'
import StudytourExperienceModal from './components/StudytourExperienceModal.vue'
import {columns, searchFormSchema} from './studytourExperience.data';
import {list, deleteOne, batchDelete, getImportUrl,getExportUrl} from './studytourExperience.api';
import StudytourEmailModal from './components/StudytourEmailModal.vue'
import {columns, searchFormSchema} from './studytourEmail.data';
import {list, deleteOne, batchDelete, getImportUrl,getExportUrl} from './studytourEmail.api';
const checkedKeys = ref<Array<string | number>>([]);
//model
const [registerModal, {openModal}] = useModal();
//table
const { prefixCls,tableContext,onExportXls,onImportXls } = useListPage({
tableProps:{
title: '学员心得表',
title: '邮件信息表',
api: list,
columns,
canResize:false,
@ -70,7 +70,7 @@
},
},
exportConfig: {
name:"学员心得表",
name:"邮件信息表",
url: getExportUrl,
},
importConfig: {

jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/studytourExperience/vue3/components/StudytourExperienceModal.vue → jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/studytourEmail/vue3/components/StudytourEmailModal.vue View File

@ -8,8 +8,8 @@
import {ref, computed, unref} from 'vue';
import {BasicModal, useModalInner} from '/@/components/Modal';
import {BasicForm, useForm} from '/@/components/Form/index';
import {formSchema} from '../studytourExperience.data';
import {saveOrUpdate} from '../studytourExperience.api';
import {formSchema} from '../studytourEmail.data';
import {saveOrUpdate} from '../studytourEmail.api';
// Emits
const emit = defineEmits(['register','success']);
const isUpdate = ref(true);

+ 0
- 19
jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/studytourExperience/service/impl/StudytourExperienceServiceImpl.java View File

@ -1,19 +0,0 @@
package org.jeecg.modules.studytourExperience.service.impl;
import org.jeecg.modules.studytourExperience.entity.StudytourExperience;
import org.jeecg.modules.studytourExperience.mapper.StudytourExperienceMapper;
import org.jeecg.modules.studytourExperience.service.IStudytourExperienceService;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
/**
* @Description: 学员心得表
* @Author: jeecg-boot
* @Date: 2025-09-19
* @Version: V1.0
*/
@Service
public class StudytourExperienceServiceImpl extends ServiceImpl<StudytourExperienceMapper, StudytourExperience> implements IStudytourExperienceService {
}

+ 138
- 29
jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/studytourRecord/controller/StudytourRecordController.java View File

@ -1,36 +1,44 @@
package org.jeecg.modules.studytourRecord.controller;
import java.io.UnsupportedEncodingException;
import java.io.IOException;
import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.jeecg.common.api.vo.Result;
import org.jeecg.common.system.query.QueryGenerator;
import org.jeecg.common.util.oConvertUtils;
import org.jeecg.modules.studytourRecord.entity.StudytourRecord;
import org.jeecg.modules.studytourRecord.service.IStudytourRecordService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.extern.slf4j.Slf4j;
import org.jeecgframework.poi.excel.ExcelImportUtil;
import org.jeecgframework.poi.excel.def.NormalExcelConstants;
import org.jeecgframework.poi.excel.entity.ExportParams;
import org.jeecgframework.poi.excel.entity.ImportParams;
import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
import org.jeecg.common.system.base.controller.JeecgController;
import org.jeecg.common.system.vo.LoginUser;
import org.apache.shiro.SecurityUtils;
import org.jeecg.common.api.vo.Result;
import org.jeecg.common.system.query.QueryGenerator;
import org.jeecg.common.util.oConvertUtils;
import org.jeecg.modules.studytourRecord.entity.StudytourExperience;
import org.jeecg.modules.studytourRecord.entity.StudytourReport;
import org.jeecg.modules.studytourRecord.entity.StudytourRecord;
import org.jeecg.modules.studytourRecord.vo.StudytourRecordPage;
import org.jeecg.modules.studytourRecord.service.IStudytourRecordService;
import org.jeecg.modules.studytourRecord.service.IStudytourExperienceService;
import org.jeecg.modules.studytourRecord.service.IStudytourReportService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.servlet.ModelAndView;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.extern.slf4j.Slf4j;
import com.alibaba.fastjson.JSON;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@ -39,16 +47,20 @@ import org.jeecg.common.aspect.annotation.AutoLog;
/**
* @Description: 成长档案表
* @Author: jeecg-boot
* @Date: 2025-09-18
* @Date: 2025-10-28
* @Version: V1.0
*/
@Api(tags="成长档案表")
@RestController
@RequestMapping("/studytourRecord/studytourRecord")
@Slf4j
public class StudytourRecordController extends JeecgController<StudytourRecord, IStudytourRecordService> {
public class StudytourRecordController {
@Autowired
private IStudytourRecordService studytourRecordService;
@Autowired
private IStudytourExperienceService studytourExperienceService;
@Autowired
private IStudytourReportService studytourReportService;
/**
* 分页列表查询
@ -75,28 +87,36 @@ public class StudytourRecordController extends JeecgController<StudytourRecord,
/**
* 添加
*
* @param studytourRecord
* @param studytourRecordPage
* @return
*/
@AutoLog(value = "成长档案表-添加")
@ApiOperation(value="成长档案表-添加", notes="成长档案表-添加")
@PostMapping(value = "/add")
public Result<String> add(@RequestBody StudytourRecord studytourRecord) {
studytourRecordService.save(studytourRecord);
public Result<String> add(@RequestBody StudytourRecordPage studytourRecordPage) {
StudytourRecord studytourRecord = new StudytourRecord();
BeanUtils.copyProperties(studytourRecordPage, studytourRecord);
studytourRecordService.saveMain(studytourRecord, studytourRecordPage.getStudytourExperienceList(),studytourRecordPage.getStudytourReportList());
return Result.OK("添加成功!");
}
/**
* 编辑
*
* @param studytourRecord
* @param studytourRecordPage
* @return
*/
@AutoLog(value = "成长档案表-编辑")
@ApiOperation(value="成长档案表-编辑", notes="成长档案表-编辑")
@RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST})
public Result<String> edit(@RequestBody StudytourRecord studytourRecord) {
studytourRecordService.updateById(studytourRecord);
public Result<String> edit(@RequestBody StudytourRecordPage studytourRecordPage) {
StudytourRecord studytourRecord = new StudytourRecord();
BeanUtils.copyProperties(studytourRecordPage, studytourRecord);
StudytourRecord studytourRecordEntity = studytourRecordService.getById(studytourRecord.getId());
if(studytourRecordEntity==null) {
return Result.error("未找到对应数据");
}
studytourRecordService.updateMain(studytourRecord, studytourRecordPage.getStudytourExperienceList(),studytourRecordPage.getStudytourReportList());
return Result.OK("编辑成功!");
}
@ -110,7 +130,7 @@ public class StudytourRecordController extends JeecgController<StudytourRecord,
@ApiOperation(value="成长档案表-通过id删除", notes="成长档案表-通过id删除")
@DeleteMapping(value = "/delete")
public Result<String> delete(@RequestParam(name="id",required=true) String id) {
studytourRecordService.removeById(id);
studytourRecordService.delMain(id);
return Result.OK("删除成功!");
}
@ -124,8 +144,8 @@ public class StudytourRecordController extends JeecgController<StudytourRecord,
@ApiOperation(value="成长档案表-批量删除", notes="成长档案表-批量删除")
@DeleteMapping(value = "/deleteBatch")
public Result<String> deleteBatch(@RequestParam(name="ids",required=true) String ids) {
this.studytourRecordService.removeByIds(Arrays.asList(ids.split(",")));
return Result.OK("批量删除成功!");
this.studytourRecordService.delBatchMain(Arrays.asList(ids.split(",")));
return Result.OK("批量删除成功");
}
/**
@ -143,6 +163,34 @@ public class StudytourRecordController extends JeecgController<StudytourRecord,
return Result.error("未找到对应数据");
}
return Result.OK(studytourRecord);
}
/**
* 通过id查询
*
* @param id
* @return
*/
//@AutoLog(value = "学员心得表通过主表ID查询")
@ApiOperation(value="学员心得表主表ID查询", notes="学员心得表-通主表ID查询")
@GetMapping(value = "/queryStudytourExperienceByMainId")
public Result<List<StudytourExperience>> queryStudytourExperienceListByMainId(@RequestParam(name="id",required=true) String id) {
List<StudytourExperience> studytourExperienceList = studytourExperienceService.selectByMainId(id);
return Result.OK(studytourExperienceList);
}
/**
* 通过id查询
*
* @param id
* @return
*/
//@AutoLog(value = "行后报告表通过主表ID查询")
@ApiOperation(value="行后报告表主表ID查询", notes="行后报告表-通主表ID查询")
@GetMapping(value = "/queryStudytourReportByMainId")
public Result<List<StudytourReport>> queryStudytourReportListByMainId(@RequestParam(name="id",required=true) String id) {
List<StudytourReport> studytourReportList = studytourReportService.selectByMainId(id);
return Result.OK(studytourReportList);
}
/**
@ -153,11 +201,45 @@ public class StudytourRecordController extends JeecgController<StudytourRecord,
*/
@RequestMapping(value = "/exportXls")
public ModelAndView exportXls(HttpServletRequest request, StudytourRecord studytourRecord) {
return super.exportXls(request, studytourRecord, StudytourRecord.class, "成长档案表");
// Step.1 组装查询条件查询数据
QueryWrapper<StudytourRecord> queryWrapper = QueryGenerator.initQueryWrapper(studytourRecord, request.getParameterMap());
LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
//Step.2 获取导出数据
List<StudytourRecord> queryList = studytourRecordService.list(queryWrapper);
// 过滤选中数据
String selections = request.getParameter("selections");
List<StudytourRecord> studytourRecordList = new ArrayList<StudytourRecord>();
if(oConvertUtils.isEmpty(selections)) {
studytourRecordList = queryList;
}else {
List<String> selectionList = Arrays.asList(selections.split(","));
studytourRecordList = queryList.stream().filter(item -> selectionList.contains(item.getId())).collect(Collectors.toList());
}
// Step.3 组装pageList
List<StudytourRecordPage> pageList = new ArrayList<StudytourRecordPage>();
for (StudytourRecord main : studytourRecordList) {
StudytourRecordPage vo = new StudytourRecordPage();
BeanUtils.copyProperties(main, vo);
List<StudytourExperience> studytourExperienceList = studytourExperienceService.selectByMainId(main.getId());
vo.setStudytourExperienceList(studytourExperienceList);
List<StudytourReport> studytourReportList = studytourReportService.selectByMainId(main.getId());
vo.setStudytourReportList(studytourReportList);
pageList.add(vo);
}
// Step.4 AutoPoi 导出Excel
ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());
mv.addObject(NormalExcelConstants.FILE_NAME, "成长档案表列表");
mv.addObject(NormalExcelConstants.CLASS, StudytourRecordPage.class);
mv.addObject(NormalExcelConstants.PARAMS, new ExportParams("成长档案表数据", "导出人:"+sysUser.getRealname(), "成长档案表"));
mv.addObject(NormalExcelConstants.DATA_LIST, pageList);
return mv;
}
/**
* 通过excel导入数据
* 通过excel导入数据
*
* @param request
* @param response
@ -165,7 +247,34 @@ public class StudytourRecordController extends JeecgController<StudytourRecord,
*/
@RequestMapping(value = "/importExcel", method = RequestMethod.POST)
public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
return super.importExcel(request, response, StudytourRecord.class);
MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {
MultipartFile file = entity.getValue();// 获取上传文件对象
ImportParams params = new ImportParams();
params.setTitleRows(2);
params.setHeadRows(1);
params.setNeedSave(true);
try {
List<StudytourRecordPage> list = ExcelImportUtil.importExcel(file.getInputStream(), StudytourRecordPage.class, params);
for (StudytourRecordPage page : list) {
StudytourRecord po = new StudytourRecord();
BeanUtils.copyProperties(page, po);
studytourRecordService.saveMain(po, page.getStudytourExperienceList(),page.getStudytourReportList());
}
return Result.OK("文件导入成功!数据行数:" + list.size());
} catch (Exception e) {
log.error(e.getMessage(),e);
return Result.error("文件导入失败:"+e.getMessage());
} finally {
try {
file.getInputStream().close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return Result.OK("文件导入失败!");
}
}

jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/studytourExperience/entity/StudytourExperience.java → jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/studytourRecord/entity/StudytourExperience.java View File

@ -1,9 +1,6 @@
package org.jeecg.modules.studytourExperience.entity;
package org.jeecg.modules.studytourRecord.entity;
import java.io.Serializable;
import java.io.UnsupportedEncodingException;
import java.util.Date;
import java.math.BigDecimal;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
@ -13,23 +10,20 @@ import com.fasterxml.jackson.annotation.JsonFormat;
import org.jeecg.modules.hanHaiMember.entity.HanHaiMember;
import org.springframework.format.annotation.DateTimeFormat;
import org.jeecgframework.poi.excel.annotation.Excel;
import org.jeecg.common.aspect.annotation.Dict;
import java.util.Date;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.UnsupportedEncodingException;
/**
* @Description: 学员心得表
* @Author: jeecg-boot
* @Date: 2025-09-19
* @Date: 2025-10-28
* @Version: V1.0
*/
@ApiModel(value="studytour_experience对象", description="学员心得表")
@Data
@TableName("studytour_experience")
@Accessors(chain = true)
@EqualsAndHashCode(callSuper = false)
@ApiModel(value="studytour_experience对象", description="学员心得表")
public class StudytourExperience implements Serializable {
private static final long serialVersionUID = 1L;
@ -58,13 +52,10 @@ public class StudytourExperience implements Serializable {
@ApiModelProperty(value = "图片内容")
private java.lang.String image;
/**关联成长档案*/
@Excel(name = "关联成长档案", width = 15, dictTable = "studytour_record", dicText = "activity_id", dicCode = "id")
@Dict(dictTable = "studytour_record", dicText = "activity_id", dicCode = "id")
@ApiModelProperty(value = "关联成长档案")
private java.lang.String experienceId;
/**关联用户*/
@Excel(name = "关联用户", width = 15, dictTable = "han_hai_member", dicText = "nick_name", dicCode = "id")
@Dict(dictTable = "han_hai_member", dicText = "nick_name", dicCode = "id")
@ApiModelProperty(value = "关联用户")
private java.lang.String userId;

+ 4
- 10
jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/studytourRecord/entity/StudytourRecord.java View File

@ -3,7 +3,6 @@ package org.jeecg.modules.studytourRecord.entity;
import java.io.Serializable;
import java.io.UnsupportedEncodingException;
import java.util.Date;
import java.math.BigDecimal;
import java.util.List;
import com.baomidou.mybatisplus.annotation.IdType;
@ -12,27 +11,22 @@ import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.jeecg.modules.studytourExperience.entity.StudytourExperience;
import org.jeecg.modules.studytourImage.entity.StudytourImageContent;
import org.springframework.format.annotation.DateTimeFormat;
import org.jeecgframework.poi.excel.annotation.Excel;
import org.jeecg.common.aspect.annotation.Dict;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
/**
* @Description: 成长档案表
* @Author: jeecg-boot
* @Date: 2025-09-18
* @Date: 2025-10-28
* @Version: V1.0
*/
@ApiModel(value="studytour_record对象", description="成长档案表")
@Data
@TableName("studytour_record")
@Accessors(chain = true)
@EqualsAndHashCode(callSuper = false)
@ApiModel(value="studytour_record对象", description="成长档案表")
public class StudytourRecord implements Serializable {
private static final long serialVersionUID = 1L;
@ -78,12 +72,12 @@ public class StudytourRecord implements Serializable {
private java.lang.String activityTitle;
/**关联活动*/
@Excel(name = "关联活动", width = 15, dictTable = "studytour_activity", dicText = "title", dicCode = "id")
@Dict(dictTable = "studytour_activity", dicText = "title", dicCode = "id")
@Dict(dictTable = "studytour_activity", dicText = "title", dicCode = "id")
@ApiModelProperty(value = "关联活动")
private java.lang.String activityId;
/**关联用户*/
@Excel(name = "关联用户", width = 15, dictTable = "han_hai_member", dicText = "nick_name", dicCode = "id")
@Dict(dictTable = "han_hai_member", dicText = "nick_name", dicCode = "id")
@Dict(dictTable = "han_hai_member", dicText = "nick_name", dicCode = "id")
@ApiModelProperty(value = "关联用户")
private java.lang.String userId;


+ 355
- 0
jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/studytourRecord/entity/StudytourReport.java View File

@ -0,0 +1,355 @@
package org.jeecg.modules.studytourRecord.entity;
import java.io.Serializable;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.springframework.format.annotation.DateTimeFormat;
import org.jeecgframework.poi.excel.annotation.Excel;
import java.util.Date;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.UnsupportedEncodingException;
/**
* @Description: 行后报告表
* @Author: jeecg-boot
* @Date: 2025-10-28
* @Version: V1.0
*/
@ApiModel(value="studytour_report对象", description="行后报告表")
@Data
@TableName("studytour_report")
public class StudytourReport implements Serializable {
private static final long serialVersionUID = 1L;
/**id*/
@TableId(type = IdType.ASSIGN_ID)
@ApiModelProperty(value = "id")
private java.lang.String id;
/**创建人*/
@ApiModelProperty(value = "创建人")
private java.lang.String createBy;
/**创建日期*/
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd")
@DateTimeFormat(pattern="yyyy-MM-dd")
@ApiModelProperty(value = "创建日期")
private java.util.Date createTime;
/**更新人*/
@ApiModelProperty(value = "更新人")
private java.lang.String updateBy;
/**更新日期*/
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd")
@DateTimeFormat(pattern="yyyy-MM-dd")
@ApiModelProperty(value = "更新日期")
private java.util.Date updateTime;
/**(第2页)头像*/
@Excel(name = "(第2页)头像", width = 15)
@ApiModelProperty(value = "(第2页)头像")
private java.lang.String page2Image1;
/**(第2页)姓名*/
@Excel(name = "(第2页)姓名", width = 15)
@ApiModelProperty(value = "(第2页)姓名")
private java.lang.String page2Name;
/**(第2页)性别*/
@Excel(name = "(第2页)性别", width = 15)
@ApiModelProperty(value = "(第2页)性别")
private java.lang.String page2Sex;
/**(第2页)年龄*/
@Excel(name = "(第2页)年龄", width = 15)
@ApiModelProperty(value = "(第2页)年龄")
private java.lang.String page2Age;
/**(第2页)学段*/
@Excel(name = "(第2页)学段", width = 15)
@ApiModelProperty(value = "(第2页)学段")
private java.lang.String page2Period;
/**(第2页)学校*/
@Excel(name = "(第2页)学校", width = 15)
@ApiModelProperty(value = "(第2页)学校")
private java.lang.String page2School;
/**(第2页)城市*/
@Excel(name = "(第2页)城市", width = 15)
@ApiModelProperty(value = "(第2页)城市")
private java.lang.String page2City;
/**(第2页)出勤情况*/
@Excel(name = "(第2页)出勤情况", width = 15)
@ApiModelProperty(value = "(第2页)出勤情况")
private java.lang.String page2Attendance;
/**(第3页)图片1*/
@Excel(name = "(第3页)图片1", width = 15)
@ApiModelProperty(value = "(第3页)图片1")
private java.lang.String page3Image1;
/**(第4页)图片1*/
@Excel(name = "(第4页)图片1", width = 15)
@ApiModelProperty(value = "(第4页)图片1")
private java.lang.String page4Image1;
/**(第4页)图片2*/
@Excel(name = "(第4页)图片2", width = 15)
@ApiModelProperty(value = "(第4页)图片2")
private java.lang.String page4Image2;
/**(第4页)图片3*/
@Excel(name = "(第4页)图片3", width = 15)
@ApiModelProperty(value = "(第4页)图片3")
private java.lang.String page4Image3;
/**(第4页)图片4*/
@Excel(name = "(第4页)图片4", width = 15)
@ApiModelProperty(value = "(第4页)图片4")
private java.lang.String page4Image4;
/**(第4页)图片5*/
@Excel(name = "(第4页)图片5", width = 15)
@ApiModelProperty(value = "(第4页)图片5")
private java.lang.String page4Image5;
/**(第4页)图片6*/
@Excel(name = "(第4页)图片6", width = 15)
@ApiModelProperty(value = "(第4页)图片6")
private java.lang.String page4Image6;
/**(第4页)图片7*/
@Excel(name = "(第4页)图片7", width = 15)
@ApiModelProperty(value = "(第4页)图片7")
private java.lang.String page4Image7;
/**(第4页)标语1*/
@Excel(name = "(第4页)标语1", width = 15)
@ApiModelProperty(value = "(第4页)标语1")
private java.lang.String page4Text1;
/**(第4页)标语2*/
@Excel(name = "(第4页)标语2", width = 15)
@ApiModelProperty(value = "(第4页)标语2")
private java.lang.String page4Text2;
/**(第4页)标语3*/
@Excel(name = "(第4页)标语3", width = 15)
@ApiModelProperty(value = "(第4页)标语3")
private java.lang.String page4Text3;
/**(第4页)标语4*/
@Excel(name = "(第4页)标语4", width = 15)
@ApiModelProperty(value = "(第4页)标语4")
private java.lang.String page4Text4;
/**(第5页)图片1*/
@Excel(name = "(第5页)图片1", width = 15)
@ApiModelProperty(value = "(第5页)图片1")
private java.lang.String page5Image1;
/**(第5页)图片2*/
@Excel(name = "(第5页)图片2", width = 15)
@ApiModelProperty(value = "(第5页)图片2")
private java.lang.String page5Image2;
/**(第5页)图片3*/
@Excel(name = "(第5页)图片3", width = 15)
@ApiModelProperty(value = "(第5页)图片3")
private java.lang.String page5Image3;
/**(第5页)图片4*/
@Excel(name = "(第5页)图片4", width = 15)
@ApiModelProperty(value = "(第5页)图片4")
private java.lang.String page5Image4;
/**(第6页)图片1*/
@Excel(name = "(第6页)图片1", width = 15)
@ApiModelProperty(value = "(第6页)图片1")
private java.lang.String page6Image1;
/**(第6页)图片2*/
@Excel(name = "(第6页)图片2", width = 15)
@ApiModelProperty(value = "(第6页)图片2")
private java.lang.String page6Image2;
/**(第6页)图片3*/
@Excel(name = "(第6页)图片3", width = 15)
@ApiModelProperty(value = "(第6页)图片3")
private java.lang.String page6Image3;
/**(第6页)图片4*/
@Excel(name = "(第6页)图片4", width = 15)
@ApiModelProperty(value = "(第6页)图片4")
private java.lang.String page6Image4;
/**(第6页)图片5*/
@Excel(name = "(第6页)图片5", width = 15)
@ApiModelProperty(value = "(第6页)图片5")
private java.lang.String page6Image5;
/**(第7页)图片1*/
@Excel(name = "(第7页)图片1", width = 15)
@ApiModelProperty(value = "(第7页)图片1")
private java.lang.String page7Image1;
/**(第7页)图片2*/
@Excel(name = "(第7页)图片2", width = 15)
@ApiModelProperty(value = "(第7页)图片2")
private java.lang.String page7Image2;
/**(第7页)图片3*/
@Excel(name = "(第7页)图片3", width = 15)
@ApiModelProperty(value = "(第7页)图片3")
private java.lang.String page7Image3;
/**(第7页)图片4*/
@Excel(name = "(第7页)图片4", width = 15)
@ApiModelProperty(value = "(第7页)图片4")
private java.lang.String page7Image4;
/**(第7页)图片5*/
@Excel(name = "(第7页)图片5", width = 15)
@ApiModelProperty(value = "(第7页)图片5")
private java.lang.String page7Image5;
/**(第7页)图片6*/
@Excel(name = "(第7页)图片6", width = 15)
@ApiModelProperty(value = "(第7页)图片6")
private java.lang.String page7Image6;
/**(第7页)图片7*/
@Excel(name = "(第7页)图片7", width = 15)
@ApiModelProperty(value = "(第7页)图片7")
private java.lang.String page7Image7;
/**(第7页)图片8*/
@Excel(name = "(第7页)图片8", width = 15)
@ApiModelProperty(value = "(第7页)图片8")
private java.lang.String page7Image8;
/**(第7页)图片9*/
@Excel(name = "(第7页)图片9", width = 15)
@ApiModelProperty(value = "(第7页)图片9")
private java.lang.String page7Image9;
/**(第8页)图片1*/
@Excel(name = "(第8页)图片1", width = 15)
@ApiModelProperty(value = "(第8页)图片1")
private java.lang.String page8Image1;
/**(第8页)图片2*/
@Excel(name = "(第8页)图片2", width = 15)
@ApiModelProperty(value = "(第8页)图片2")
private java.lang.String page8Image2;
/**(第9页)图片1*/
@Excel(name = "(第9页)图片1", width = 15)
@ApiModelProperty(value = "(第9页)图片1")
private java.lang.String page9Image1;
/**(第9页)图片2*/
@Excel(name = "(第9页)图片2", width = 15)
@ApiModelProperty(value = "(第9页)图片2")
private java.lang.String page9Image2;
/**(第9页)图片3*/
@Excel(name = "(第9页)图片3", width = 15)
@ApiModelProperty(value = "(第9页)图片3")
private java.lang.String page9Image3;
/**(第9页)图片4*/
@Excel(name = "(第9页)图片4", width = 15)
@ApiModelProperty(value = "(第9页)图片4")
private java.lang.String page9Image4;
/**(第9页)图片5*/
@Excel(name = "(第9页)图片5", width = 15)
@ApiModelProperty(value = "(第9页)图片5")
private java.lang.String page9Image5;
/**(第9页)图片6*/
@Excel(name = "(第9页)图片6", width = 15)
@ApiModelProperty(value = "(第9页)图片6")
private java.lang.String page9Image6;
/**(第9页)图片7*/
@Excel(name = "(第9页)图片7", width = 15)
@ApiModelProperty(value = "(第9页)图片7")
private java.lang.String page9Image7;
/**(第9页)图片8*/
@Excel(name = "(第9页)图片8", width = 15)
@ApiModelProperty(value = "(第9页)图片8")
private java.lang.String page9Image8;
/**(第10页)图片1*/
@Excel(name = "(第10页)图片1", width = 15)
@ApiModelProperty(value = "(第10页)图片1")
private java.lang.String page10Image1;
/**(第10页)图片2*/
@Excel(name = "(第10页)图片2", width = 15)
@ApiModelProperty(value = "(第10页)图片2")
private java.lang.String page10Image2;
/**(第10页)图片3*/
@Excel(name = "(第10页)图片3", width = 15)
@ApiModelProperty(value = "(第10页)图片3")
private java.lang.String page10Image3;
/**(第10页)图片4*/
@Excel(name = "(第10页)图片4", width = 15)
@ApiModelProperty(value = "(第10页)图片4")
private java.lang.String page10Image4;
/**(第10页)图片5*/
@Excel(name = "(第10页)图片5", width = 15)
@ApiModelProperty(value = "(第10页)图片5")
private java.lang.String page10Image5;
/**(第11页)勋章1*/
@Excel(name = "(第11页)勋章1", width = 15)
@ApiModelProperty(value = "(第11页)勋章1")
private java.lang.String page11Image1;
/**(第11页)勋章2*/
@Excel(name = "(第11页)勋章2", width = 15)
@ApiModelProperty(value = "(第11页)勋章2")
private java.lang.String page11Image2;
/**(第11页)勋章3*/
@Excel(name = "(第11页)勋章3", width = 15)
@ApiModelProperty(value = "(第11页)勋章3")
private java.lang.String page11Image3;
/**(第11页)勋章4*/
@Excel(name = "(第11页)勋章4", width = 15)
@ApiModelProperty(value = "(第11页)勋章4")
private java.lang.String page11Image4;
/**(第11页)勋章5*/
@Excel(name = "(第11页)勋章5", width = 15)
@ApiModelProperty(value = "(第11页)勋章5")
private java.lang.String page11Image5;
/**(第11页)勋章6*/
@Excel(name = "(第11页)勋章6", width = 15)
@ApiModelProperty(value = "(第11页)勋章6")
private java.lang.String page11Image6;
/**(第11页)勋章7*/
@Excel(name = "(第11页)勋章7", width = 15)
@ApiModelProperty(value = "(第11页)勋章7")
private java.lang.String page11Image7;
/**(第11页)勋章8*/
@Excel(name = "(第11页)勋章8", width = 15)
@ApiModelProperty(value = "(第11页)勋章8")
private java.lang.String page11Image8;
/**(第11页)勋章9*/
@Excel(name = "(第11页)勋章9", width = 15)
@ApiModelProperty(value = "(第11页)勋章9")
private java.lang.String page11Image9;
/**(第11页)勋章10*/
@Excel(name = "(第11页)勋章10", width = 15)
@ApiModelProperty(value = "(第11页)勋章10")
private java.lang.String page11Image10;
/**(第12页)技能1*/
@Excel(name = "(第12页)技能1", width = 15)
@ApiModelProperty(value = "(第12页)技能1")
private java.lang.String page12Skill1;
/**(第12页)技能2*/
@Excel(name = "(第12页)技能2", width = 15)
@ApiModelProperty(value = "(第12页)技能2")
private java.lang.String page12Skill2;
/**(第12页)技能3*/
@Excel(name = "(第12页)技能3", width = 15)
@ApiModelProperty(value = "(第12页)技能3")
private java.lang.String page12Skill3;
/**(第12页)技能4*/
@Excel(name = "(第12页)技能4", width = 15)
@ApiModelProperty(value = "(第12页)技能4")
private java.lang.String page12Skill4;
/**(第12页)技能5*/
@Excel(name = "(第12页)技能5", width = 15)
@ApiModelProperty(value = "(第12页)技能5")
private java.lang.String page12Skill5;
/**(第12页)进度1*/
@Excel(name = "(第12页)进度1", width = 15)
@ApiModelProperty(value = "(第12页)进度1")
private java.lang.String page12Process1;
/**(第12页)进度2*/
@Excel(name = "(第12页)进度2", width = 15)
@ApiModelProperty(value = "(第12页)进度2")
private java.lang.String page12Process2;
/**(第12页)进度3*/
@Excel(name = "(第12页)进度3", width = 15)
@ApiModelProperty(value = "(第12页)进度3")
private java.lang.String page12Process3;
/**(第12页)进度4*/
@Excel(name = "(第12页)进度4", width = 15)
@ApiModelProperty(value = "(第12页)进度4")
private java.lang.String page12Process4;
/**(第12页)进度5*/
@Excel(name = "(第12页)进度5", width = 15)
@ApiModelProperty(value = "(第12页)进度5")
private java.lang.String page12Process5;
/**(第13页)同学寄语*/
@Excel(name = "(第13页)同学寄语", width = 15)
@ApiModelProperty(value = "(第13页)同学寄语")
private java.lang.String page13Text1;
/**(第13页)导师寄语*/
@Excel(name = "(第13页)导师寄语", width = 15)
@ApiModelProperty(value = "(第13页)导师寄语")
private java.lang.String page13Text2;
/**(第14页)图片1*/
@Excel(name = "(第14页)图片1", width = 15)
@ApiModelProperty(value = "(第14页)图片1")
private java.lang.String page14Image1;
/**关联成长档案*/
@ApiModelProperty(value = "关联成长档案")
private java.lang.String recordId;
}

jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/studytourExperience/mapper/StudytourExperienceMapper.java → jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/studytourRecord/mapper/StudytourExperienceMapper.java View File

@ -1,17 +1,19 @@
package org.jeecg.modules.studytourExperience.mapper;
package org.jeecg.modules.studytourRecord.mapper;
import java.util.List;
import org.apache.ibatis.annotations.Param;
import org.jeecg.modules.studytourExperience.entity.StudytourExperience;
import org.jeecg.modules.studytourRecord.entity.StudytourExperience;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
/**
* @Description: 学员心得表
* @Author: jeecg-boot
* @Date: 2025-09-19
* @Date: 2025-10-28
* @Version: V1.0
*/
public interface StudytourExperienceMapper extends BaseMapper<StudytourExperience> {
public boolean deleteByMainId(@Param("mainId") String mainId);
public List<StudytourExperience> selectByMainId(@Param("mainId") String mainId);
}

+ 1
- 1
jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/studytourRecord/mapper/StudytourRecordMapper.java View File

@ -9,7 +9,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @Description: 成长档案表
* @Author: jeecg-boot
* @Date: 2025-09-18
* @Date: 2025-10-28
* @Version: V1.0
*/
public interface StudytourRecordMapper extends BaseMapper<StudytourRecord> {


+ 19
- 0
jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/studytourRecord/mapper/StudytourReportMapper.java View File

@ -0,0 +1,19 @@
package org.jeecg.modules.studytourRecord.mapper;
import java.util.List;
import org.jeecg.modules.studytourRecord.entity.StudytourReport;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
/**
* @Description: 行后报告表
* @Author: jeecg-boot
* @Date: 2025-10-28
* @Version: V1.0
*/
public interface StudytourReportMapper extends BaseMapper<StudytourReport> {
public boolean deleteByMainId(@Param("mainId") String mainId);
public List<StudytourReport> selectByMainId(@Param("mainId") String mainId);
}

+ 16
- 0
jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/studytourRecord/mapper/xml/StudytourExperienceMapper.xml View File

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.jeecg.modules.studytourRecord.mapper.StudytourExperienceMapper">
<delete id="deleteByMainId" parameterType="java.lang.String">
DELETE
FROM studytour_experience
WHERE
experience_id = #{mainId} </delete>
<select id="selectByMainId" parameterType="java.lang.String" resultType="org.jeecg.modules.studytourRecord.entity.StudytourExperience">
SELECT *
FROM studytour_experience
WHERE
experience_id = #{mainId} </select>
</mapper>

+ 16
- 0
jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/studytourRecord/mapper/xml/StudytourReportMapper.xml View File

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.jeecg.modules.studytourRecord.mapper.StudytourReportMapper">
<delete id="deleteByMainId" parameterType="java.lang.String">
DELETE
FROM studytour_report
WHERE
record_id = #{mainId} </delete>
<select id="selectByMainId" parameterType="java.lang.String" resultType="org.jeecg.modules.studytourRecord.entity.StudytourReport">
SELECT *
FROM studytour_report
WHERE
record_id = #{mainId} </select>
</mapper>

jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/studytourExperience/service/IStudytourExperienceService.java → jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/studytourRecord/service/IStudytourExperienceService.java View File

@ -1,14 +1,16 @@
package org.jeecg.modules.studytourExperience.service;
package org.jeecg.modules.studytourRecord.service;
import org.jeecg.modules.studytourExperience.entity.StudytourExperience;
import org.jeecg.modules.studytourRecord.entity.StudytourExperience;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
/**
* @Description: 学员心得表
* @Author: jeecg-boot
* @Date: 2025-09-19
* @Date: 2025-10-28
* @Version: V1.0
*/
public interface IStudytourExperienceService extends IService<StudytourExperience> {
public List<StudytourExperience> selectByMainId(String mainId);
}

+ 28
- 1
jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/studytourRecord/service/IStudytourRecordService.java View File

@ -1,14 +1,41 @@
package org.jeecg.modules.studytourRecord.service;
import org.jeecg.modules.studytourRecord.entity.StudytourExperience;
import org.jeecg.modules.studytourRecord.entity.StudytourReport;
import org.jeecg.modules.studytourRecord.entity.StudytourRecord;
import com.baomidou.mybatisplus.extension.service.IService;
import java.io.Serializable;
import java.util.Collection;
import java.util.List;
/**
* @Description: 成长档案表
* @Author: jeecg-boot
* @Date: 2025-09-18
* @Date: 2025-10-28
* @Version: V1.0
*/
public interface IStudytourRecordService extends IService<StudytourRecord> {
/**
* 添加一对多
*
*/
public void saveMain(StudytourRecord studytourRecord,List<StudytourExperience> studytourExperienceList,List<StudytourReport> studytourReportList) ;
/**
* 修改一对多
*
*/
public void updateMain(StudytourRecord studytourRecord,List<StudytourExperience> studytourExperienceList,List<StudytourReport> studytourReportList);
/**
* 删除一对多
*/
public void delMain (String id);
/**
* 批量删除一对多
*/
public void delBatchMain (Collection<? extends Serializable> idList);
}

+ 16
- 0
jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/studytourRecord/service/IStudytourReportService.java View File

@ -0,0 +1,16 @@
package org.jeecg.modules.studytourRecord.service;
import org.jeecg.modules.studytourRecord.entity.StudytourReport;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
/**
* @Description: 行后报告表
* @Author: jeecg-boot
* @Date: 2025-10-28
* @Version: V1.0
*/
public interface IStudytourReportService extends IService<StudytourReport> {
public List<StudytourReport> selectByMainId(String mainId);
}

+ 27
- 0
jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/studytourRecord/service/impl/StudytourExperienceServiceImpl.java View File

@ -0,0 +1,27 @@
package org.jeecg.modules.studytourRecord.service.impl;
import org.jeecg.modules.studytourRecord.entity.StudytourExperience;
import org.jeecg.modules.studytourRecord.mapper.StudytourExperienceMapper;
import org.jeecg.modules.studytourRecord.service.IStudytourExperienceService;
import org.springframework.stereotype.Service;
import java.util.List;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
/**
* @Description: 学员心得表
* @Author: jeecg-boot
* @Date: 2025-10-28
* @Version: V1.0
*/
@Service
public class StudytourExperienceServiceImpl extends ServiceImpl<StudytourExperienceMapper, StudytourExperience> implements IStudytourExperienceService {
@Autowired
private StudytourExperienceMapper studytourExperienceMapper;
@Override
public List<StudytourExperience> selectByMainId(String mainId) {
return studytourExperienceMapper.selectByMainId(mainId);
}
}

+ 81
- 2
jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/studytourRecord/service/impl/StudytourRecordServiceImpl.java View File

@ -1,19 +1,98 @@
package org.jeecg.modules.studytourRecord.service.impl;
import org.jeecg.modules.studytourRecord.entity.StudytourRecord;
import org.jeecg.modules.studytourRecord.entity.StudytourExperience;
import org.jeecg.modules.studytourRecord.entity.StudytourReport;
import org.jeecg.modules.studytourRecord.mapper.StudytourExperienceMapper;
import org.jeecg.modules.studytourRecord.mapper.StudytourReportMapper;
import org.jeecg.modules.studytourRecord.mapper.StudytourRecordMapper;
import org.jeecg.modules.studytourRecord.service.IStudytourRecordService;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import java.io.Serializable;
import java.util.List;
import java.util.Collection;
/**
* @Description: 成长档案表
* @Author: jeecg-boot
* @Date: 2025-09-18
* @Date: 2025-10-28
* @Version: V1.0
*/
@Service
public class StudytourRecordServiceImpl extends ServiceImpl<StudytourRecordMapper, StudytourRecord> implements IStudytourRecordService {
@Autowired
private StudytourRecordMapper studytourRecordMapper;
@Autowired
private StudytourExperienceMapper studytourExperienceMapper;
@Autowired
private StudytourReportMapper studytourReportMapper;
@Override
@Transactional(rollbackFor = Exception.class)
public void saveMain(StudytourRecord studytourRecord, List<StudytourExperience> studytourExperienceList,List<StudytourReport> studytourReportList) {
studytourRecordMapper.insert(studytourRecord);
if(studytourExperienceList!=null && studytourExperienceList.size()>0) {
for(StudytourExperience entity:studytourExperienceList) {
//外键设置
entity.setExperienceId(studytourRecord.getId());
studytourExperienceMapper.insert(entity);
}
}
if(studytourReportList!=null && studytourReportList.size()>0) {
for(StudytourReport entity:studytourReportList) {
//外键设置
entity.setRecordId(studytourRecord.getId());
studytourReportMapper.insert(entity);
}
}
}
@Override
@Transactional(rollbackFor = Exception.class)
public void updateMain(StudytourRecord studytourRecord,List<StudytourExperience> studytourExperienceList,List<StudytourReport> studytourReportList) {
studytourRecordMapper.updateById(studytourRecord);
//1.先删除子表数据
studytourExperienceMapper.deleteByMainId(studytourRecord.getId());
studytourReportMapper.deleteByMainId(studytourRecord.getId());
//2.子表数据重新插入
if(studytourExperienceList!=null && studytourExperienceList.size()>0) {
for(StudytourExperience entity:studytourExperienceList) {
//外键设置
entity.setExperienceId(studytourRecord.getId());
studytourExperienceMapper.insert(entity);
}
}
if(studytourReportList!=null && studytourReportList.size()>0) {
for(StudytourReport entity:studytourReportList) {
//外键设置
entity.setRecordId(studytourRecord.getId());
studytourReportMapper.insert(entity);
}
}
}
@Override
@Transactional(rollbackFor = Exception.class)
public void delMain(String id) {
studytourExperienceMapper.deleteByMainId(id);
studytourReportMapper.deleteByMainId(id);
studytourRecordMapper.deleteById(id);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void delBatchMain(Collection<? extends Serializable> idList) {
for(Serializable id:idList) {
studytourExperienceMapper.deleteByMainId(id.toString());
studytourReportMapper.deleteByMainId(id.toString());
studytourRecordMapper.deleteById(id);
}
}
}

+ 27
- 0
jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/studytourRecord/service/impl/StudytourReportServiceImpl.java View File

@ -0,0 +1,27 @@
package org.jeecg.modules.studytourRecord.service.impl;
import org.jeecg.modules.studytourRecord.entity.StudytourReport;
import org.jeecg.modules.studytourRecord.mapper.StudytourReportMapper;
import org.jeecg.modules.studytourRecord.service.IStudytourReportService;
import org.springframework.stereotype.Service;
import java.util.List;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
/**
* @Description: 行后报告表
* @Author: jeecg-boot
* @Date: 2025-10-28
* @Version: V1.0
*/
@Service
public class StudytourReportServiceImpl extends ServiceImpl<StudytourReportMapper, StudytourReport> implements IStudytourReportService {
@Autowired
private StudytourReportMapper studytourReportMapper;
@Override
public List<StudytourReport> selectByMainId(String mainId) {
return studytourReportMapper.selectByMainId(mainId);
}
}

+ 85
- 0
jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/studytourRecord/vo/StudytourRecordPage.java View File

@ -0,0 +1,85 @@
package org.jeecg.modules.studytourRecord.vo;
import java.util.List;
import org.jeecg.modules.studytourRecord.entity.StudytourRecord;
import org.jeecg.modules.studytourRecord.entity.StudytourExperience;
import org.jeecg.modules.studytourRecord.entity.StudytourReport;
import lombok.Data;
import org.jeecgframework.poi.excel.annotation.Excel;
import org.jeecgframework.poi.excel.annotation.ExcelEntity;
import org.jeecgframework.poi.excel.annotation.ExcelCollection;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
import org.jeecg.common.aspect.annotation.Dict;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
/**
* @Description: 成长档案表
* @Author: jeecg-boot
* @Date: 2025-10-28
* @Version: V1.0
*/
@Data
@ApiModel(value="studytour_recordPage对象", description="成长档案表")
public class StudytourRecordPage {
/**主键*/
@ApiModelProperty(value = "主键")
private java.lang.String id;
/**创建人*/
@ApiModelProperty(value = "创建人")
private java.lang.String createBy;
/**创建日期*/
@ApiModelProperty(value = "创建日期")
private java.util.Date createTime;
/**更新人*/
@ApiModelProperty(value = "更新人")
private java.lang.String updateBy;
/**更新日期*/
@ApiModelProperty(value = "更新日期")
private java.util.Date updateTime;
/**行程分数*/
@Excel(name = "行程分数", width = 15)
@ApiModelProperty(value = "行程分数")
private java.lang.Integer processScore;
/**景点分数*/
@Excel(name = "景点分数", width = 15)
@ApiModelProperty(value = "景点分数")
private java.lang.Integer spotScore;
/**导师分数*/
@Excel(name = "导师分数", width = 15)
@ApiModelProperty(value = "导师分数")
private java.lang.Integer teacherScore;
/**活动掠影*/
@Excel(name = "活动掠影", width = 15)
@ApiModelProperty(value = "活动掠影")
private java.lang.String image;
/**学员心得*/
@Excel(name = "学员心得", width = 15)
@ApiModelProperty(value = "学员心得")
private java.lang.String content;
/**活动标题*/
@Excel(name = "活动标题", width = 15)
@ApiModelProperty(value = "活动标题")
private java.lang.String activityTitle;
/**关联活动*/
@Excel(name = "关联活动", width = 15, dictTable = "studytour_activity", dicText = "title", dicCode = "id")
@Dict(dictTable = "studytour_activity", dicText = "title", dicCode = "id")
@ApiModelProperty(value = "关联活动")
private java.lang.String activityId;
/**关联用户*/
@Excel(name = "关联用户", width = 15, dictTable = "han_hai_member", dicText = "nick_name", dicCode = "id")
@Dict(dictTable = "han_hai_member", dicText = "nick_name", dicCode = "id")
@ApiModelProperty(value = "关联用户")
private java.lang.String userId;
@ExcelCollection(name="学员心得表")
@ApiModelProperty(value = "学员心得表")
private List<StudytourExperience> studytourExperienceList;
@ExcelCollection(name="行后报告表")
@ApiModelProperty(value = "行后报告表")
private List<StudytourReport> studytourReportList;
}

+ 16
- 30
jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/studytourRecord/vue/StudytourRecordList.vue View File

@ -8,7 +8,7 @@
</a-form>
</div>
<!-- 查询区域-END -->
<!-- 操作按钮区域 -->
<div class="table-operator">
<a-button @click="handleAdd" type="primary" icon="plus">新增</a-button>
@ -36,15 +36,15 @@
<a-table
ref="table"
size="middle"
:scroll="{x:true}"
bordered
rowKey="id"
class="j-table-force-nowrap"
:scroll="{x:true}"
:columns="columns"
:dataSource="dataSource"
:pagination="ipagination"
:loading="loading"
:rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
class="j-table-force-nowrap"
@change="handleTableChange">
<template slot="htmlSlot" slot-scope="text">
@ -89,21 +89,20 @@
</a-table>
</div>
<studytour-record-modal ref="modalForm" @ok="modalFormOk"></studytour-record-modal>
<studytour-record-modal ref="modalForm" @ok="modalFormOk"/>
</a-card>
</template>
<script>
import '@/assets/less/TableExpand.less'
import { mixinDevice } from '@/utils/mixin'
import { JeecgListMixin } from '@/mixins/JeecgListMixin'
import StudytourRecordModal from './modules/StudytourRecordModal'
import {filterMultiDictText} from '@/components/dict/JDictSelectUtil'
import '@/assets/less/TableExpand.less'
export default {
name: 'StudytourRecordList',
mixins:[JeecgListMixin, mixinDevice],
name: "StudytourRecordList",
mixins:[JeecgListMixin],
components: {
StudytourRecordModal
},
@ -137,17 +136,6 @@
align:"center",
dataIndex: 'teacherScore'
},
{
title:'活动掠影',
align:"center",
dataIndex: 'image',
scopedSlots: {customRender: 'imgSlot'}
},
{
title:'学员心得',
align:"center",
dataIndex: 'content'
},
{
title:'活动标题',
align:"center",
@ -169,7 +157,7 @@
align:"center",
fixed:"right",
width:147,
scopedSlots: { customRender: 'action' }
scopedSlots: { customRender: 'action' },
}
],
url: {
@ -185,26 +173,24 @@
}
},
created() {
this.getSuperFieldList();
this.getSuperFieldList();
},
computed: {
importExcelUrl: function(){
return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;
},
}
},
methods: {
initDictConfig(){
},
getSuperFieldList(){
let fieldList=[];
fieldList.push({type:'int',value:'processScore',text:'行程分数',dictCode:''})
fieldList.push({type:'int',value:'spotScore',text:'景点分数',dictCode:''})
fieldList.push({type:'int',value:'teacherScore',text:'导师分数',dictCode:''})
fieldList.push({type:'Text',value:'image',text:'活动掠影',dictCode:''})
fieldList.push({type:'Text',value:'content',text:'学员心得',dictCode:''})
fieldList.push({type:'Text',value:'activityTitle',text:'活动标题',dictCode:''})
fieldList.push({type:'string',value:'activityId',text:'关联活动',dictCode:"studytour_activity,title,id"})
fieldList.push({type:'sel_search',value:'userId',text:'关联用户',dictTable:"han_hai_member", dictText:'nick_name', dictCode:'id'})
fieldList.push({type:'int',value:'processScore',text:'行程分数',dictCode:''})
fieldList.push({type:'int',value:'spotScore',text:'景点分数',dictCode:''})
fieldList.push({type:'int',value:'teacherScore',text:'导师分数',dictCode:''})
fieldList.push({type:'Text',value:'activityTitle',text:'活动标题',dictCode:''})
fieldList.push({type:'string',value:'activityId',text:'关联活动',dictCode:"studytour_activity,title,id"})
fieldList.push({type:'sel_search',value:'userId',text:'关联用户',dictTable:"han_hai_member", dictText:'nick_name', dictCode:'id'})
this.superFieldList = fieldList
}
}


+ 758
- 65
jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/studytourRecord/vue/modules/StudytourRecordForm.vue View File

@ -1,44 +1,35 @@
<template>
<a-spin :spinning="confirmLoading">
<j-form-container :disabled="formDisabled">
<!-- 主表单区域 -->
<a-form-model ref="form" :model="model" :rules="validatorRules" slot="detail">
<a-row>
<a-col :span="24">
<a-col :span="24" >
<a-form-model-item label="行程分数" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="processScore">
<a-input-number v-model="model.processScore" placeholder="请输入行程分数" style="width: 100%" />
</a-form-model-item>
</a-col>
<a-col :span="24">
<a-col :span="24" >
<a-form-model-item label="景点分数" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="spotScore">
<a-input-number v-model="model.spotScore" placeholder="请输入景点分数" style="width: 100%" />
</a-form-model-item>
</a-col>
<a-col :span="24">
<a-col :span="24" >
<a-form-model-item label="导师分数" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="teacherScore">
<a-input-number v-model="model.teacherScore" placeholder="请输入导师分数" style="width: 100%" />
</a-form-model-item>
</a-col>
<a-col :span="24">
<a-form-model-item label="活动掠影" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="image">
<j-image-upload isMultiple v-model="model.image" ></j-image-upload>
</a-form-model-item>
</a-col>
<a-col :span="24">
<a-form-model-item label="学员心得" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="content">
<a-textarea v-model="model.content" rows="4" placeholder="请输入学员心得" />
</a-form-model-item>
</a-col>
<a-col :span="24">
<a-col :span="24" >
<a-form-model-item label="活动标题" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="activityTitle">
<a-input v-model="model.activityTitle" placeholder="请输入活动标题" ></a-input>
<a-input v-model="model.activityTitle" placeholder="请输入活动标题" ></a-input>
</a-form-model-item>
</a-col>
<a-col :span="24">
<a-col :span="24" >
<a-form-model-item label="关联活动" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="activityId">
<j-dict-select-tag type="list" v-model="model.activityId" dictCode="studytour_activity,title,id" placeholder="请选择关联活动" />
</a-form-model-item>
</a-col>
<a-col :span="24">
<a-col :span="24" >
<a-form-model-item label="关联用户" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="userId">
<j-search-select-tag v-model="model.userId" dict="han_hai_member,nick_name,id" />
</a-form-model-item>
@ -46,30 +37,50 @@
</a-row>
</a-form-model>
</j-form-container>
<!-- 子表单区域 -->
<a-tabs v-model="activeKey" @change="handleChangeTabs">
<a-tab-pane tab="学员心得表" :key="refKeys[0]" :forceRender="true">
<j-editable-table
:ref="refKeys[0]"
:loading="studytourExperienceTable.loading"
:columns="studytourExperienceTable.columns"
:dataSource="studytourExperienceTable.dataSource"
:maxHeight="300"
:disabled="formDisabled"
:rowNumber="true"
:rowSelection="true"
:actionButton="true"/>
</a-tab-pane>
<a-tab-pane tab="行后报告表" :key="refKeys[1]" :forceRender="true">
<j-editable-table
:ref="refKeys[1]"
:loading="studytourReportTable.loading"
:columns="studytourReportTable.columns"
:dataSource="studytourReportTable.dataSource"
:maxHeight="300"
:disabled="formDisabled"
:rowNumber="true"
:rowSelection="true"
:actionButton="true"/>
</a-tab-pane>
</a-tabs>
</a-spin>
</template>
<script>
import { httpAction, getAction } from '@/api/manage'
import { getAction } from '@/api/manage'
import { FormTypes,getRefPromise,VALIDATE_NO_PASSED } from '@/utils/JEditableTableUtil'
import { JEditableTableModelMixin } from '@/mixins/JEditableTableModelMixin'
import { validateDuplicateValue } from '@/utils/util'
export default {
name: 'StudytourRecordForm',
mixins: [JEditableTableModelMixin],
components: {
},
props: {
//
disabled: {
type: Boolean,
default: false,
required: false
}
},
data () {
data() {
return {
model:{
},
labelCol: {
xs: { span: 24 },
sm: { span: 5 },
@ -78,62 +89,744 @@
xs: { span: 24 },
sm: { span: 16 },
},
confirmLoading: false,
model:{
},
//
addDefaultRowNum: 1,
validatorRules: {
},
refKeys: ['studytourExperience', 'studytourReport', ],
tableKeys:['studytourExperience', 'studytourReport', ],
activeKey: 'studytourExperience',
//
studytourExperienceTable: {
loading: false,
dataSource: [],
columns: [
{
title: '文字内容',
key: 'content',
type: FormTypes.input,
width:"200px",
placeholder: '请输入${title}',
defaultValue:'',
},
{
title: '图片内容',
key: 'image',
type: FormTypes.image,
token:true,
responseName:"message",
width:"200px",
placeholder: '请输入${title}',
defaultValue:'',
},
{
title: '关联用户',
key: 'userId',
type: FormTypes.sel_search,
dictCode:"han_hai_member,nick_name,id",
width:"200px",
placeholder: '请输入${title}',
defaultValue:'',
},
]
},
//
studytourReportTable: {
loading: false,
dataSource: [],
columns: [
{
title: '(第2页)头像',
key: 'page2Image1',
type: FormTypes.input,
width:"200px",
placeholder: '请输入${title}',
defaultValue:'',
},
{
title: '(第2页)姓名',
key: 'page2Name',
type: FormTypes.input,
width:"200px",
placeholder: '请输入${title}',
defaultValue:'',
},
{
title: '(第2页)性别',
key: 'page2Sex',
type: FormTypes.input,
width:"200px",
placeholder: '请输入${title}',
defaultValue:'',
},
{
title: '(第2页)年龄',
key: 'page2Age',
type: FormTypes.input,
width:"200px",
placeholder: '请输入${title}',
defaultValue:'',
},
{
title: '(第2页)学段',
key: 'page2Period',
type: FormTypes.input,
width:"200px",
placeholder: '请输入${title}',
defaultValue:'',
},
{
title: '(第2页)学校',
key: 'page2School',
type: FormTypes.input,
width:"200px",
placeholder: '请输入${title}',
defaultValue:'',
},
{
title: '(第2页)城市',
key: 'page2City',
type: FormTypes.input,
width:"200px",
placeholder: '请输入${title}',
defaultValue:'',
},
{
title: '(第2页)出勤情况',
key: 'page2Attendance',
type: FormTypes.input,
width:"200px",
placeholder: '请输入${title}',
defaultValue:'',
},
{
title: '(第3页)图片1',
key: 'page3Image1',
type: FormTypes.input,
width:"200px",
placeholder: '请输入${title}',
defaultValue:'',
},
{
title: '(第4页)图片1',
key: 'page4Image1',
type: FormTypes.input,
width:"200px",
placeholder: '请输入${title}',
defaultValue:'',
},
{
title: '(第4页)图片2',
key: 'page4Image2',
type: FormTypes.input,
width:"200px",
placeholder: '请输入${title}',
defaultValue:'',
},
{
title: '(第4页)图片3',
key: 'page4Image3',
type: FormTypes.input,
width:"200px",
placeholder: '请输入${title}',
defaultValue:'',
},
{
title: '(第4页)图片4',
key: 'page4Image4',
type: FormTypes.input,
width:"200px",
placeholder: '请输入${title}',
defaultValue:'',
},
{
title: '(第4页)图片5',
key: 'page4Image5',
type: FormTypes.input,
width:"200px",
placeholder: '请输入${title}',
defaultValue:'',
},
{
title: '(第4页)图片6',
key: 'page4Image6',
type: FormTypes.input,
width:"200px",
placeholder: '请输入${title}',
defaultValue:'',
},
{
title: '(第4页)图片7',
key: 'page4Image7',
type: FormTypes.input,
width:"200px",
placeholder: '请输入${title}',
defaultValue:'',
},
{
title: '(第4页)标语1',
key: 'page4Text1',
type: FormTypes.input,
width:"200px",
placeholder: '请输入${title}',
defaultValue:'',
},
{
title: '(第4页)标语2',
key: 'page4Text2',
type: FormTypes.input,
width:"200px",
placeholder: '请输入${title}',
defaultValue:'',
},
{
title: '(第4页)标语3',
key: 'page4Text3',
type: FormTypes.input,
width:"200px",
placeholder: '请输入${title}',
defaultValue:'',
},
{
title: '(第4页)标语4',
key: 'page4Text4',
type: FormTypes.input,
width:"200px",
placeholder: '请输入${title}',
defaultValue:'',
},
{
title: '(第5页)图片1',
key: 'page5Image1',
type: FormTypes.input,
width:"200px",
placeholder: '请输入${title}',
defaultValue:'',
},
{
title: '(第5页)图片2',
key: 'page5Image2',
type: FormTypes.input,
width:"200px",
placeholder: '请输入${title}',
defaultValue:'',
},
{
title: '(第5页)图片3',
key: 'page5Image3',
type: FormTypes.input,
width:"200px",
placeholder: '请输入${title}',
defaultValue:'',
},
{
title: '(第5页)图片4',
key: 'page5Image4',
type: FormTypes.input,
width:"200px",
placeholder: '请输入${title}',
defaultValue:'',
},
{
title: '(第6页)图片1',
key: 'page6Image1',
type: FormTypes.input,
width:"200px",
placeholder: '请输入${title}',
defaultValue:'',
},
{
title: '(第6页)图片2',
key: 'page6Image2',
type: FormTypes.input,
width:"200px",
placeholder: '请输入${title}',
defaultValue:'',
},
{
title: '(第6页)图片3',
key: 'page6Image3',
type: FormTypes.input,
width:"200px",
placeholder: '请输入${title}',
defaultValue:'',
},
{
title: '(第6页)图片4',
key: 'page6Image4',
type: FormTypes.input,
width:"200px",
placeholder: '请输入${title}',
defaultValue:'',
},
{
title: '(第6页)图片5',
key: 'page6Image5',
type: FormTypes.input,
width:"200px",
placeholder: '请输入${title}',
defaultValue:'',
},
{
title: '(第7页)图片1',
key: 'page7Image1',
type: FormTypes.input,
width:"200px",
placeholder: '请输入${title}',
defaultValue:'',
},
{
title: '(第7页)图片2',
key: 'page7Image2',
type: FormTypes.input,
width:"200px",
placeholder: '请输入${title}',
defaultValue:'',
},
{
title: '(第7页)图片3',
key: 'page7Image3',
type: FormTypes.input,
width:"200px",
placeholder: '请输入${title}',
defaultValue:'',
},
{
title: '(第7页)图片4',
key: 'page7Image4',
type: FormTypes.input,
width:"200px",
placeholder: '请输入${title}',
defaultValue:'',
},
{
title: '(第7页)图片5',
key: 'page7Image5',
type: FormTypes.input,
width:"200px",
placeholder: '请输入${title}',
defaultValue:'',
},
{
title: '(第7页)图片6',
key: 'page7Image6',
type: FormTypes.input,
width:"200px",
placeholder: '请输入${title}',
defaultValue:'',
},
{
title: '(第7页)图片7',
key: 'page7Image7',
type: FormTypes.input,
width:"200px",
placeholder: '请输入${title}',
defaultValue:'',
},
{
title: '(第7页)图片8',
key: 'page7Image8',
type: FormTypes.input,
width:"200px",
placeholder: '请输入${title}',
defaultValue:'',
},
{
title: '(第7页)图片9',
key: 'page7Image9',
type: FormTypes.input,
width:"200px",
placeholder: '请输入${title}',
defaultValue:'',
},
{
title: '(第8页)图片1',
key: 'page8Image1',
type: FormTypes.input,
width:"200px",
placeholder: '请输入${title}',
defaultValue:'',
},
{
title: '(第8页)图片2',
key: 'page8Image2',
type: FormTypes.input,
width:"200px",
placeholder: '请输入${title}',
defaultValue:'',
},
{
title: '(第9页)图片1',
key: 'page9Image1',
type: FormTypes.input,
width:"200px",
placeholder: '请输入${title}',
defaultValue:'',
},
{
title: '(第9页)图片2',
key: 'page9Image2',
type: FormTypes.input,
width:"200px",
placeholder: '请输入${title}',
defaultValue:'',
},
{
title: '(第9页)图片3',
key: 'page9Image3',
type: FormTypes.input,
width:"200px",
placeholder: '请输入${title}',
defaultValue:'',
},
{
title: '(第9页)图片4',
key: 'page9Image4',
type: FormTypes.input,
width:"200px",
placeholder: '请输入${title}',
defaultValue:'',
},
{
title: '(第9页)图片5',
key: 'page9Image5',
type: FormTypes.input,
width:"200px",
placeholder: '请输入${title}',
defaultValue:'',
},
{
title: '(第9页)图片6',
key: 'page9Image6',
type: FormTypes.input,
width:"200px",
placeholder: '请输入${title}',
defaultValue:'',
},
{
title: '(第9页)图片7',
key: 'page9Image7',
type: FormTypes.input,
width:"200px",
placeholder: '请输入${title}',
defaultValue:'',
},
{
title: '(第9页)图片8',
key: 'page9Image8',
type: FormTypes.input,
width:"200px",
placeholder: '请输入${title}',
defaultValue:'',
},
{
title: '(第10页)图片1',
key: 'page10Image1',
type: FormTypes.input,
width:"200px",
placeholder: '请输入${title}',
defaultValue:'',
},
{
title: '(第10页)图片2',
key: 'page10Image2',
type: FormTypes.input,
width:"200px",
placeholder: '请输入${title}',
defaultValue:'',
},
{
title: '(第10页)图片3',
key: 'page10Image3',
type: FormTypes.input,
width:"200px",
placeholder: '请输入${title}',
defaultValue:'',
},
{
title: '(第10页)图片4',
key: 'page10Image4',
type: FormTypes.input,
width:"200px",
placeholder: '请输入${title}',
defaultValue:'',
},
{
title: '(第10页)图片5',
key: 'page10Image5',
type: FormTypes.input,
width:"200px",
placeholder: '请输入${title}',
defaultValue:'',
},
{
title: '(第11页)勋章1',
key: 'page11Image1',
type: FormTypes.input,
width:"200px",
placeholder: '请输入${title}',
defaultValue:'',
},
{
title: '(第11页)勋章2',
key: 'page11Image2',
type: FormTypes.input,
width:"200px",
placeholder: '请输入${title}',
defaultValue:'',
},
{
title: '(第11页)勋章3',
key: 'page11Image3',
type: FormTypes.input,
width:"200px",
placeholder: '请输入${title}',
defaultValue:'',
},
{
title: '(第11页)勋章4',
key: 'page11Image4',
type: FormTypes.input,
width:"200px",
placeholder: '请输入${title}',
defaultValue:'',
},
{
title: '(第11页)勋章5',
key: 'page11Image5',
type: FormTypes.input,
width:"200px",
placeholder: '请输入${title}',
defaultValue:'',
},
{
title: '(第11页)勋章6',
key: 'page11Image6',
type: FormTypes.input,
width:"200px",
placeholder: '请输入${title}',
defaultValue:'',
},
{
title: '(第11页)勋章7',
key: 'page11Image7',
type: FormTypes.input,
width:"200px",
placeholder: '请输入${title}',
defaultValue:'',
},
{
title: '(第11页)勋章8',
key: 'page11Image8',
type: FormTypes.input,
width:"200px",
placeholder: '请输入${title}',
defaultValue:'',
},
{
title: '(第11页)勋章9',
key: 'page11Image9',
type: FormTypes.input,
width:"200px",
placeholder: '请输入${title}',
defaultValue:'',
},
{
title: '(第11页)勋章10',
key: 'page11Image10',
type: FormTypes.input,
width:"200px",
placeholder: '请输入${title}',
defaultValue:'',
},
{
title: '(第12页)技能1',
key: 'page12Skill1',
type: FormTypes.input,
width:"200px",
placeholder: '请输入${title}',
defaultValue:'',
},
{
title: '(第12页)技能2',
key: 'page12Skill2',
type: FormTypes.input,
width:"200px",
placeholder: '请输入${title}',
defaultValue:'',
},
{
title: '(第12页)技能3',
key: 'page12Skill3',
type: FormTypes.input,
width:"200px",
placeholder: '请输入${title}',
defaultValue:'',
},
{
title: '(第12页)技能4',
key: 'page12Skill4',
type: FormTypes.input,
width:"200px",
placeholder: '请输入${title}',
defaultValue:'',
},
{
title: '(第12页)技能5',
key: 'page12Skill5',
type: FormTypes.input,
width:"200px",
placeholder: '请输入${title}',
defaultValue:'',
},
{
title: '(第12页)进度1',
key: 'page12Process1',
type: FormTypes.input,
width:"200px",
placeholder: '请输入${title}',
defaultValue:'',
},
{
title: '(第12页)进度2',
key: 'page12Process2',
type: FormTypes.input,
width:"200px",
placeholder: '请输入${title}',
defaultValue:'',
},
{
title: '(第12页)进度3',
key: 'page12Process3',
type: FormTypes.input,
width:"200px",
placeholder: '请输入${title}',
defaultValue:'',
},
{
title: '(第12页)进度4',
key: 'page12Process4',
type: FormTypes.input,
width:"200px",
placeholder: '请输入${title}',
defaultValue:'',
},
{
title: '(第12页)进度5',
key: 'page12Process5',
type: FormTypes.input,
width:"200px",
placeholder: '请输入${title}',
defaultValue:'',
},
{
title: '(第13页)同学寄语',
key: 'page13Text1',
type: FormTypes.input,
width:"200px",
placeholder: '请输入${title}',
defaultValue:'',
},
{
title: '(第13页)导师寄语',
key: 'page13Text2',
type: FormTypes.input,
width:"200px",
placeholder: '请输入${title}',
defaultValue:'',
},
{
title: '(第14页)图片1',
key: 'page14Image1',
type: FormTypes.input,
width:"200px",
placeholder: '请输入${title}',
defaultValue:'',
},
]
},
url: {
add: "/studytourRecord/studytourRecord/add",
edit: "/studytourRecord/studytourRecord/edit",
queryById: "/studytourRecord/studytourRecord/queryById"
queryById: "/studytourRecord/studytourRecord/queryById",
studytourExperience: {
list: '/studytourRecord/studytourRecord/queryStudytourExperienceByMainId'
},
studytourReport: {
list: '/studytourRecord/studytourRecord/queryStudytourReportByMainId'
},
}
}
},
props: {
//
disabled: {
type: Boolean,
default: false,
required: false
}
},
computed: {
formDisabled(){
return this.disabled
},
},
created () {
//model
this.modelDefault = JSON.parse(JSON.stringify(this.model));
},
methods: {
add () {
this.edit(this.modelDefault);
addBefore(){
this.studytourExperienceTable.dataSource=[]
this.studytourReportTable.dataSource=[]
},
edit (record) {
this.model = Object.assign({}, record);
this.visible = true;
getAllTable() {
let values = this.tableKeys.map(key => getRefPromise(this, key))
return Promise.all(values)
},
submitForm () {
const that = this;
//
this.$refs.form.validate(valid => {
if (valid) {
that.confirmLoading = true;
let httpurl = '';
let method = '';
if(!this.model.id){
httpurl+=this.url.add;
method = 'post';
}else{
httpurl+=this.url.edit;
method = 'put';
}
httpAction(httpurl,this.model,method).then((res)=>{
if(res.success){
that.$message.success(res.message);
that.$emit('ok');
}else{
that.$message.warning(res.message);
/** 调用完edit()方法之后会自动调用此方法 */
editAfter() {
this.$nextTick(() => {
})
//
if (this.model.id) {
let params = { id: this.model.id }
this.requestSubTableData(this.url.studytourExperience.list, params, this.studytourExperienceTable)
this.requestSubTableData(this.url.studytourReport.list, params, this.studytourReportTable)
}
},
//
validateSubForm(allValues){
return new Promise((resolve,reject)=>{
Promise.all([
]).then(() => {
resolve(allValues)
}).catch(e => {
if (e.error === VALIDATE_NO_PASSED) {
// tab
this.activeKey = e.index == null ? this.activeKey : this.refKeys[e.index]
} else {
console.error(e)
}
}).finally(() => {
that.confirmLoading = false;
})
}
})
})
},
/** 整理成formData */
classifyIntoFormData(allValues) {
let main = Object.assign(this.model, allValues.formValue)
return {
...main, //
studytourExperienceList: allValues.tablesValue[0].values,
studytourReportList: allValues.tablesValue[1].values,
}
},
validateError(msg){
this.$message.error(msg)
},
}
}
</script>
</script>
<style scoped>
</style>

+ 12
- 8
jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/studytourRecord/vue/modules/StudytourRecordModal.vue View File

@ -1,26 +1,27 @@
<template>
<j-modal
:title="title"
:width="width"
:width="1200"
:visible="visible"
:maskClosable="false"
switchFullscreen
@ok="handleOk"
:okButtonProps="{ class:{'jee-hidden': disableSubmit} }"
@cancel="handleCancel"
cancelText="关闭">
<studytour-record-form ref="realForm" @ok="submitCallback" :disabled="disableSubmit"></studytour-record-form>
@cancel="handleCancel">
<studytour-record-form ref="realForm" @ok="submitCallback" :disabled="disableSubmit"/>
</j-modal>
</template>
<script>
import StudytourRecordForm from './StudytourRecordForm'
export default {
name: 'StudytourRecordModal',
components: {
StudytourRecordForm
},
data () {
data() {
return {
title:'',
width:800,
@ -28,7 +29,7 @@
disableSubmit: false
}
},
methods: {
methods:{
add () {
this.visible=true
this.$nextTick(()=>{
@ -46,7 +47,7 @@
this.visible = false;
},
handleOk () {
this.$refs.realForm.submitForm();
this.$refs.realForm.handleOk();
},
submitCallback(){
this.$emit('ok');
@ -57,4 +58,7 @@
}
}
}
</script>
</script>
<style scoped>
</style>

+ 16
- 6
jeecg-boot-module-system/src/main/java/org/jeecg/modules/api/service/ExperienceService.java View File

@ -3,9 +3,10 @@ package org.jeecg.modules.api.service;
import io.swagger.annotations.ApiOperation;
import org.jeecg.common.api.vo.Result;
import org.jeecg.modules.api.bean.PageBean;
import org.jeecg.modules.studytourBindperson.entity.StudytourBindperson;
import org.jeecg.modules.studytourExperience.entity.StudytourExperience;
import org.jeecg.modules.studytourEmail.entity.StudytourEmail;
import org.jeecg.modules.studytourRecord.entity.StudytourExperience;
import org.jeecg.modules.studytourRecord.entity.StudytourRecord;
import org.jeecg.modules.studytourRecord.entity.StudytourReport;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@ -13,12 +14,21 @@ import org.springframework.web.bind.annotation.RequestMethod;
public interface ExperienceService {
//成长档案-查询成长档案列表
public Result<?> queryExperienceList(@RequestHeader("X-Access-Token") String token, StudytourRecord studytourRecord, PageBean pageBean);
public Result<?> queryExperienceList(String token, StudytourRecord studytourRecord, PageBean pageBean);
//成长档案-查询成长档案详情
public Result<?> queryExperienceById(@RequestHeader("X-Access-Token") String token, String recordId);
public Result<?> queryExperienceById(String token, String recordId);
//成长档案-新增成长档案
public Result<?> addExperience(@RequestHeader("X-Access-Token") String token, StudytourExperience studytourExperience);
//成长档案-新增学员心得
public Result<?> addExperience(String token, StudytourExperience studytourExperience);
//成长档案-查看行后报告详情
public Result<?> queryReportById(String token, String recordId);
//成长档案-修改行后报告
public Result<?> updateReport(String token, StudytourReport studytourReport);
//成长档案-申请邮寄
public Result<?> addEmail(String token, StudytourEmail studytourEmail);
}

+ 99
- 6
jeecg-boot-module-system/src/main/java/org/jeecg/modules/api/service/Impl/ExperienceServiceImpl.java View File

@ -10,16 +10,18 @@ import org.jeecg.modules.api.bean.PageBean;
import org.jeecg.modules.api.service.ExperienceService;
import org.jeecg.modules.hanHaiMember.entity.HanHaiMember;
import org.jeecg.modules.hanHaiMember.service.IHanHaiMemberService;
import org.jeecg.modules.studytourActivity.entity.StudytourActivity;
import org.jeecg.modules.studytourBindperson.entity.StudytourBindperson;
import org.jeecg.modules.studytourExperience.entity.StudytourExperience;
import org.jeecg.modules.studytourExperience.service.IStudytourExperienceService;
import org.jeecg.modules.studytourEmail.entity.StudytourEmail;
import org.jeecg.modules.studytourEmail.service.IStudytourEmailService;
import org.jeecg.modules.studytourImage.entity.StudytourImage;
import org.jeecg.modules.studytourImage.entity.StudytourImageContent;
import org.jeecg.modules.studytourImage.service.IStudytourImageContentService;
import org.jeecg.modules.studytourImage.service.IStudytourImageService;
import org.jeecg.modules.studytourRecord.entity.StudytourExperience;
import org.jeecg.modules.studytourRecord.entity.StudytourRecord;
import org.jeecg.modules.studytourRecord.entity.StudytourReport;
import org.jeecg.modules.studytourRecord.service.IStudytourExperienceService;
import org.jeecg.modules.studytourRecord.service.IStudytourRecordService;
import org.jeecg.modules.studytourRecord.service.IStudytourReportService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@ -42,6 +44,12 @@ public class ExperienceServiceImpl implements ExperienceService {
//学员心得
@Resource
private IStudytourExperienceService studytourExperienceService;
//行后报告
@Resource
private IStudytourReportService studytourReportService;
//邮件信息
@Resource
private IStudytourEmailService studytourEmailService;
//图片直播
@Resource
private IStudytourImageService studytourImageService;
@ -161,7 +169,7 @@ public class ExperienceServiceImpl implements ExperienceService {
}
}
//成长档案-新增成长档案
//成长档案-新增学员心得
@Override
public Result<?> addExperience(String token, StudytourExperience studytourExperience) {
log.info("开始新增学员心得信息");
@ -172,7 +180,7 @@ public class ExperienceServiceImpl implements ExperienceService {
String massege = "";
try{
//1新增成长档案信息
//1新增学员心得信息
studytourExperience.setUserId(hanHaiMember.getId());
boolean result = studytourExperienceService.save(studytourExperience);
@ -191,4 +199,89 @@ public class ExperienceServiceImpl implements ExperienceService {
}
}
//成长档案-查看行后报告详情
@Override
public Result<?> queryReportById(String token, String recordId) {
log.info("开始查询行后报告详情");
//权限验证
HanHaiMember hanHaiMember = shiroRealm.checkUserTokenIsEffectHanHaiOpenId(token);
//HanHaiMember hanHaiMember = hanHaiMemberService.getById(token);
//返回信息
String massege = "";
try{
//行后报告详情
StudytourReport one = studytourReportService
.lambdaQuery()
.eq(StudytourReport::getRecordId, recordId)
.one();
log.info("行后报告详情查询结束");
return Result.OK("行后报告详情", one);
}catch (Exception e){
log.info("行后报告详情查询失败");
e.printStackTrace();
return Result.error("行后报告详情查询失败");
}
}
//成长档案-修改行后报告
@Override
public Result<?> updateReport(String token, StudytourReport studytourReport) {
log.info("开始修改行后报告信息");
//权限验证
HanHaiMember hanHaiMember = shiroRealm.checkUserTokenIsEffectHanHaiOpenId(token);
//HanHaiMember hanHaiMember = hanHaiMemberService.getById(token);
//返回信息
String massege = "";
try{
//1修改行后报告信息
boolean result = studytourReportService.updateById(studytourReport);
if(result){
log.info("行后报告信息修改成功");
return Result.OK("行后报告信息修改成功");
}else {
log.info("行后报告信息修改失败");
return Result.error("行后报告信息修改失败");
}
}catch (Exception e){
log.info("行后报告信息修改失败");
e.printStackTrace();
return Result.error("行后报告信息修改失败");
}
}
//成长档案-申请邮寄
@Override
public Result<?> addEmail(String token, StudytourEmail studytourEmail) {
log.info("开始申请邮寄");
//权限验证
HanHaiMember hanHaiMember = shiroRealm.checkUserTokenIsEffectHanHaiOpenId(token);
//HanHaiMember hanHaiMember = hanHaiMemberService.getById(token);
//返回信息
String massege = "";
try{
//1修改行后报告信息
studytourEmail.setUserId(hanHaiMember.getId());
boolean result = studytourEmailService.save(studytourEmail);
if(result){
log.info("申请邮寄成功");
return Result.OK("申请邮寄成功");
}else {
log.info("申请邮寄失败");
return Result.error("申请邮寄失败");
}
}catch (Exception e){
log.info("申请邮寄失败");
e.printStackTrace();
return Result.error("申请邮寄失败");
}
}
}

+ 27
- 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/api/service/Impl/OrderServiceImpl.java View File

@ -33,7 +33,9 @@ import org.jeecg.modules.studytourOrder.service.IStudytourOrderService;
import org.jeecg.modules.studytourPerson.entity.StudytourPerson;
import org.jeecg.modules.studytourPerson.service.IStudytourPersonService;
import org.jeecg.modules.studytourRecord.entity.StudytourRecord;
import org.jeecg.modules.studytourRecord.entity.StudytourReport;
import org.jeecg.modules.studytourRecord.service.IStudytourRecordService;
import org.jeecg.modules.studytourRecord.service.IStudytourReportService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@ -82,6 +84,9 @@ public class OrderServiceImpl implements OrderService {
//用户成长档案信息
@Resource
private IStudytourRecordService studytourRecordService;
//用户行后报告信息
@Resource
private IStudytourReportService studytourReportService;
//开营通知信息
@Resource
private IStudytourNoticeService studytourNoticeService;
@ -532,12 +537,17 @@ public class OrderServiceImpl implements OrderService {
if(recordList.size() < 1){
//没有该活动的成长档案进行添加
StudytourRecord studytourRecord = new StudytourRecord();
String recordId = IdWorker.getIdStr();//生成成长档案id
studytourRecord.setId(recordId);//成长档案id
studytourRecord.setActivityId(studytourOrder.getActivityId());//关联活动
studytourRecord.setUserId(studytourOrder.getUserId());//关联用户
boolean result = studytourRecordService.save(studytourRecord);
if(!result){
log.error("用户成长档案添加失败");
}
//添加行后报告信息
addReport(studytourOrder, recordId);
}
}catch (Exception e){
@ -546,6 +556,23 @@ public class OrderServiceImpl implements OrderService {
}
}
//添加行后报告
public void addReport(StudytourOrder studytourOrder, String recordId){
try{
StudytourReport studytourReport = new StudytourReport();
studytourReport.setRecordId(recordId);
boolean result = studytourReportService.save(studytourReport);
if(!result){
log.error("用户行后报告添加失败");
}
}catch (Exception e){
e.printStackTrace();
log.error("用户行后报告添加失败");
}
}
//添加开营通知
public void addNotice(StudytourOrder studytourOrder){
try{


+ 21
- 1
jeecg-boot-module-system/src/main/java/org/jeecg/modules/api/studytourController/ExperienceController.java View File

@ -6,8 +6,10 @@ import lombok.extern.slf4j.Slf4j;
import org.jeecg.common.api.vo.Result;
import org.jeecg.modules.api.bean.PageBean;
import org.jeecg.modules.api.service.ExperienceService;
import org.jeecg.modules.studytourExperience.entity.StudytourExperience;
import org.jeecg.modules.studytourEmail.entity.StudytourEmail;
import org.jeecg.modules.studytourRecord.entity.StudytourExperience;
import org.jeecg.modules.studytourRecord.entity.StudytourRecord;
import org.jeecg.modules.studytourRecord.entity.StudytourReport;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@ -45,5 +47,23 @@ public class ExperienceController {
return experienceService.addExperience(token, studytourExperience);
}
@ApiOperation(value="成长档案-查看行后报告详情", notes="recordId:成长档案id")
@RequestMapping(value = "/queryReportById", method = {RequestMethod.GET})
public Result<?> queryReportById(@RequestHeader("X-Access-Token") String token, String recordId){
return experienceService.queryReportById(token,recordId);
}
@ApiOperation(value="成长档案-修改行后报告", notes="成长档案-修改行后报告")
@RequestMapping(value = "/updateReport", method = {RequestMethod.POST})
public Result<?> updateReport(@RequestHeader("X-Access-Token") String token, StudytourReport studytourReport){
return experienceService.updateReport(token, studytourReport);
}
@ApiOperation(value="成长档案-申请邮寄", notes="成长档案-申请邮寄")
@RequestMapping(value = "/addEmail", method = {RequestMethod.POST})
public Result<?> addEmail(@RequestHeader("X-Access-Token") String token, StudytourEmail studytourEmail){
return experienceService.addEmail(token, studytourEmail);
}
}

Loading…
Cancel
Save