xiaofei 2 жил өмнө
parent
commit
8822009ecb
16 өөрчлөгдсөн 66 нэмэгдсэн , 140 устгасан
  1. 2 86
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/params/ExamCardParams.java
  2. 5 5
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/params/ExamDetailParams.java
  3. 1 11
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/ExamDetail.java
  4. 1 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/mapper/ExamCardMapper.java
  5. 1 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ConditionServiceImpl.java
  6. 9 15
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamCardServiceImpl.java
  7. 3 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamDetailServiceImpl.java
  8. 4 5
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamTaskServiceImpl.java
  9. 7 5
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/PrintCommonServiceImpl.java
  10. 7 4
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/service/impl/TaskLogicServiceImpl.java
  11. 1 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/util/CreatePdfUtil.java
  12. 1 0
      distributed-print-business/src/main/resources/mapper/BasicExamMapper.xml
  13. 10 3
      distributed-print-business/src/main/resources/mapper/ExamCardMapper.xml
  14. 1 1
      distributed-print-business/src/main/resources/mapper/ExamTaskMapper.xml
  15. 12 1
      distributed-print/src/main/java/com/qmth/distributed/print/api/EnumsController.java
  16. 1 1
      teachcloud-common/src/main/resources/mapper/SysOrgMapper.xml

+ 2 - 86
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/params/ExamCardParams.java

@@ -1,54 +1,18 @@
 package com.qmth.distributed.print.business.bean.params;
 
-import com.qmth.distributed.print.business.enums.CardStatusEnum;
-import com.qmth.distributed.print.business.enums.CardTypeEnum;
-import com.qmth.distributed.print.business.enums.MakeMethodEnum;
+import com.qmth.distributed.print.business.entity.ExamCard;
 
 /**
  * @Date: 2021/4/8.
  */
-public class ExamCardParams {
+public class ExamCardParams extends ExamCard {
 
-    private Long id;
-    private Long orgId;
-    private CardStatusEnum status;
     private String examTaskId;
-    private String courseCode;
-    private String courseName;
-    private String title;
-    private MakeMethodEnum makeMethod;
     private String content;
     private String htmlContent;
-    private String attachmentId;
     private String custAttachmentId;
-    private CardTypeEnum type;
     private Long templateId;
 
-    public Long getId() {
-        return id;
-    }
-
-    public void setId(Long id) {
-        this.id = id;
-    }
-
-
-    public Long getOrgId() {
-        return orgId;
-    }
-
-    public void setOrgId(Long orgId) {
-        this.orgId = orgId;
-    }
-
-    public CardStatusEnum getStatus() {
-        return status;
-    }
-
-    public void setStatus(CardStatusEnum status) {
-        this.status = status;
-    }
-
     public String getExamTaskId() {
         return examTaskId;
     }
@@ -57,38 +21,6 @@ public class ExamCardParams {
         this.examTaskId = examTaskId;
     }
 
-    public String getCourseCode() {
-        return courseCode;
-    }
-
-    public void setCourseCode(String courseCode) {
-        this.courseCode = courseCode;
-    }
-
-    public String getCourseName() {
-        return courseName;
-    }
-
-    public void setCourseName(String courseName) {
-        this.courseName = courseName;
-    }
-
-    public String getTitle() {
-        return title;
-    }
-
-    public void setTitle(String title) {
-        this.title = title;
-    }
-
-    public MakeMethodEnum getMakeMethod() {
-        return makeMethod;
-    }
-
-    public void setMakeMethod(MakeMethodEnum makeMethod) {
-        this.makeMethod = makeMethod;
-    }
-
     public String getContent() {
         return content;
     }
@@ -105,14 +37,6 @@ public class ExamCardParams {
         this.htmlContent = htmlContent;
     }
 
-    public String getAttachmentId() {
-        return attachmentId;
-    }
-
-    public void setAttachmentId(String attachmentId) {
-        this.attachmentId = attachmentId;
-    }
-
     public String getCustAttachmentId() {
         return custAttachmentId;
     }
@@ -121,14 +45,6 @@ public class ExamCardParams {
         this.custAttachmentId = custAttachmentId;
     }
 
-    public CardTypeEnum getType() {
-        return type;
-    }
-
-    public void setType(CardTypeEnum type) {
-        this.type = type;
-    }
-
     public Long getTemplateId() {
         return templateId;
     }

+ 5 - 5
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/params/ExamDetailParams.java

@@ -14,7 +14,7 @@ public class ExamDetailParams {
     private String courseName;
 
     private Double backupCount;
-    private Integer printCount; // 总数量,适用于模式2
+    private Integer totalSubjects; // 总数量,适用于模式2
     private Long printHouseId; // 总印刷室,适用于模式2
     private List<ExamDetailList> list;
 
@@ -66,12 +66,12 @@ public class ExamDetailParams {
         this.backupCount = backupCount;
     }
 
-    public Integer getPrintCount() {
-        return printCount;
+    public Integer getTotalSubjects() {
+        return totalSubjects;
     }
 
-    public void setPrintCount(Integer printCount) {
-        this.printCount = printCount;
+    public void setTotalSubjects(Integer totalSubjects) {
+        this.totalSubjects = totalSubjects;
     }
 
     public Long getPrintHouseId() {

+ 1 - 11
distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/ExamDetail.java

@@ -60,7 +60,7 @@ public class ExamDetail extends BaseEntity implements Serializable {
     @TableField("exam_place")
     private String examPlace;
     /**
-     * 总科次:考场总科次
+     * 总科次:考场总科次。模式2时为考生数量(打印数量)
      */
     @TableField("total_subjects")
     private Integer totalSubjects;
@@ -125,10 +125,6 @@ public class ExamDetail extends BaseEntity implements Serializable {
     @JsonSerialize(using = ToStringSerializer.class)
     private Long printHouseId;
 
-    @ApiModelProperty(value = "模式2,考生数量(打印数量)")
-    @TableField("print_count")
-    private Integer printCount;
-
     @ApiModelProperty(value = "试卷、题卡备份数量")
     @TableField("backup_count")
     private Double backupCount;
@@ -345,13 +341,7 @@ public class ExamDetail extends BaseEntity implements Serializable {
         this.cardAttachmentId = cardAttachmentId;
     }
 
-    public Integer getPrintCount() {
-        return printCount;
-    }
 
-    public void setPrintCount(Integer printCount) {
-        this.printCount = printCount;
-    }
 
     public Double getBackupCount() {
         return backupCount;

+ 1 - 1
distributed-print-business/src/main/java/com/qmth/distributed/print/business/mapper/ExamCardMapper.java

@@ -29,7 +29,7 @@ public interface ExamCardMapper extends BaseMapper<ExamCard> {
 
     List<ExamCard> listGenericCard(@Param("schoolId") Long schoolId, @Param("type") String type, @Param("cardRuleId") Long cardRuleId);
 
-    List<ExamCard> listCustom(@Param("schoolId") Long schoolId,@Param("courseCode") String courseCode, @Param("type") String type);
+    List<ExamCard> listCustom(@Param("schoolId") Long schoolId, @Param("courseCode") String courseCode, @Param("type") String type, @Param("cardRuleId") Long cardRuleId);
 
     CardDetailDto getCardDetailBySelect(Long cardId);
 

+ 1 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ConditionServiceImpl.java

@@ -60,6 +60,7 @@ public class ConditionServiceImpl implements ConditionService {
         if (enable != null) {
             queryWrapper.lambda().eq(BasicExam::getEnable, enable);
         }
+        queryWrapper.lambda().orderByDesc(BasicExam::getCreateTime);
         return basicExamService.list(queryWrapper);
     }
 

+ 9 - 15
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamCardServiceImpl.java

@@ -134,9 +134,8 @@ public class ExamCardServiceImpl extends ServiceImpl<ExamCardMapper, ExamCard> i
             examCard.setMakeMethod(examCardParams.getMakeMethod());
             examCard.setStatus(examCardParams.getStatus());
             examCard.setType(examCardParams.getType());
-            if (StringUtils.isNotBlank(examCardParams.getAttachmentId())) {
-                examCard.setAttachmentId(Long.valueOf(examCardParams.getAttachmentId()));
-            }
+            examCard.setAttachmentId(examCardParams.getAttachmentId());
+            examCard.setCardRuleId(examCardParams.getCardRuleId());
             examCard.insertInfo(user.getId());
             this.save(examCard);
 
@@ -149,7 +148,9 @@ public class ExamCardServiceImpl extends ServiceImpl<ExamCardMapper, ExamCard> i
                 examCardDetail.setJpgAttachmentInfo(JSON.toJSONString(convertJpgStorageList));
             }
             examCardDetail.setHtmlContent(htmlContent);
-            examCardDetail.setAttachmentId(examCardParams.getAttachmentId());
+            if (examCardParams.getAttachmentId() != null) {
+                examCardDetail.setAttachmentId(String.valueOf(examCardParams.getAttachmentId()));
+            }
             examCardDetail.insertInfo(user.getId());
             examCardDetailService.save(examCardDetail);
         }
@@ -167,12 +168,6 @@ public class ExamCardServiceImpl extends ServiceImpl<ExamCardMapper, ExamCard> i
 
             examCard = this.getById(examCardParams.getId());
             examCard.setTitle(examCardParams.getTitle());
-//            if (CardTypeEnum.CUSTOM.equals(examCard.getType()) && !examCardParams.getCourseCode().equals(examCard.getCourseCode())) {
-//                throw ExceptionResultEnum.ERROR.exception("课程不能更改");
-//            }
-//            if (!examCardParams.getMakeMethod().name().equals(examCard.getMakeMethod().name())) {
-//                throw ExceptionResultEnum.ERROR.exception("题卡制作方式不能更改");
-//            }
             examCard.setStatus(examCardParams.getStatus());
             examCard.setUpdateId(user.getId());
             examCard.setUpdateTime(System.currentTimeMillis());
@@ -189,14 +184,13 @@ public class ExamCardServiceImpl extends ServiceImpl<ExamCardMapper, ExamCard> i
                 examCardDetail.setJpgAttachmentInfo(JSON.toJSONString(convertJpgStorageList));
             }
             examCardDetail.setHtmlContent(htmlContent);
-            examCardDetail.setAttachmentId(examCardParams.getAttachmentId());
+            if (examCardParams.getAttachmentId() != null) {
+                examCardDetail.setAttachmentId(String.valueOf(examCardParams.getAttachmentId()));
+            }
             examCardDetail.updateInfo(user.getId());
             examCardDetailService.updateById(examCardDetail);
         }
 
-        // 绑定命题任务
-//        examTaskDetailService.bindCardId(examCardParams.getExamTaskId(), examCard);
-
         return String.valueOf(examCard.getId());
     }
 
@@ -279,7 +273,7 @@ public class ExamCardServiceImpl extends ServiceImpl<ExamCardMapper, ExamCard> i
         // 专卡
         if (SystemConstant.ALL_CARD != cardRuleId) {
             // 只查自己创建的专卡(20230405已改为查询课程下所有题卡,允许复制,不能选择)
-            List<ExamCard> customCards = this.baseMapper.listCustom(schoolId, courseCode, CardTypeEnum.CUSTOM.name());
+            List<ExamCard> customCards = this.baseMapper.listCustom(schoolId, courseCode, CardTypeEnum.CUSTOM.name(), cardRuleId);
             if (!customCards.isEmpty()) {
                 list.addAll(customCards);
             }

+ 3 - 1
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamDetailServiceImpl.java

@@ -233,6 +233,7 @@ public class ExamDetailServiceImpl extends ServiceImpl<ExamDetailMapper, ExamDet
 //        if (requiredFieldsList.stream().anyMatch(e -> !e.getEnable())) {
 //            throw ExceptionResultEnum.ERROR.exception("该学校考务字段设置存在必选字段禁用的情况");
 //        }
+        requiredFieldsList = requiredFieldsList.stream().filter(m->m.getEnable()).collect(Collectors.toList());
         for (FieldsDto fieldsDto : requiredFieldsList) {
             fieldsDto.setLevel("primary");
         }
@@ -240,7 +241,8 @@ public class ExamDetailServiceImpl extends ServiceImpl<ExamDetailMapper, ExamDet
         // 扩展字段
         List<FieldsDto> extendFieldsList = JSONObject.parseArray(extendFields, FieldsDto.class);
         List<String> extendCodeList = extendFieldsList.stream().map(FieldsDto::getCode).collect(Collectors.toList());
-        if (extendCodeList.stream().anyMatch(e -> requiredFieldsList.stream().map(FieldsDto::getCode).collect(Collectors.toList()).contains(e))) {
+        List<FieldsDto> finalRequiredFieldsList = requiredFieldsList;
+        if (extendCodeList.stream().anyMatch(e -> finalRequiredFieldsList.stream().map(FieldsDto::getCode).collect(Collectors.toList()).contains(e))) {
             throw ExceptionResultEnum.ERROR.exception("该学校考务字段设置存在相同的代码");
         }
         // 有效的扩展字段

+ 4 - 5
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamTaskServiceImpl.java

@@ -1810,15 +1810,14 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
                     examDetail.setPrintPlanId(examPrintPlan.getId());
                     examDetail.setPrintPlanName(examPrintPlan.getName());
                     examDetail.setExamId(examPrintPlan.getExamId());
-                    examDetail.setExamPlace("考点1"); // 默认填充班级所在校区
-                    examDetail.setExamRoom("考场1"); // 默认填充班级
+//                    examDetail.setExamPlace("考点1"); // 默认填充班级所在校区
+//                    examDetail.setExamRoom("考场1"); // 默认填充班级
                     examDetail.setStatus(ExamDetailStatusEnum.NEW);
                     examDetail.setExamStartTime(examDetailParams.getExamStartTime());
                     examDetail.setExamEndTime(examDetailParams.getExamEndTime());
-                    examDetail.setTotalSubjects(examDetailParams.getPrintCount());
+                    examDetail.setTotalSubjects(examDetailParams.getTotalSubjects());
                     examDetail.setExamDataSource(ExamDataSourceEnum.EXAM_TASK);
                     examDetail.setNormal(true);
-                    examDetail.setPrintCount(examDetailParams.getPrintCount());
                     examDetail.setPrintHouseId(examDetailParams.getPrintHouseId());
                     examDetail.setBackupCount(examDetailParams.getBackupCount());
                     examDetail.setCreateId(sysUser.getId());
@@ -1833,7 +1832,7 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
                     examDetailCourse.setCourseCode(examTask.getCourseCode());
                     examDetailCourse.setCourseName(examTask.getCourseName());
                     examDetailCourse.setPaperNumber(paperNumber);
-                    examDetailCourse.setTotalSubjects(examDetailParams.getPrintCount());
+                    examDetailCourse.setTotalSubjects(examDetailParams.getTotalSubjects());
                     examDetailCourse.setCreateId(sysUser.getId());
                     examDetailCourseService.save(examDetailCourse);
                 }

+ 7 - 5
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/PrintCommonServiceImpl.java

@@ -1201,13 +1201,15 @@ public class PrintCommonServiceImpl implements PrintCommonService {
             } catch (InterruptedException e) {
                 log.error("生成准考证号失败");
             }
-            if (totalDigit <= 8) {
-                return convertUtil.getIncre("", SystemConstant.NUMBER_CACHE + "ticketNumber" + schoolId, totalDigit);
+            String date = DateUtil.today().replace(SystemConstant.HYPHEN, "");
+            String prefix;
+            if (totalDigit < 10) {
+                prefix = date.substring(2, 4);
             } else {
-                String date = DateUtil.today().replace(SystemConstant.HYPHEN, "");
-                String prefix = date.substring(2, date.length());
-                return convertUtil.getIncre(date.substring(2, date.length()), SystemConstant.NUMBER_CACHE + "ticketNumber" + schoolId, totalDigit - prefix.length());
+                prefix = date.substring(2);
             }
+            return convertUtil.getIncre(prefix, SystemConstant.NUMBER_CACHE + "ticketNumber" + schoolId, totalDigit - prefix.length());
+
         } finally {
             lock.unlock();
         }

+ 7 - 4
distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/service/impl/TaskLogicServiceImpl.java

@@ -366,6 +366,9 @@ public class TaskLogicServiceImpl implements TaskLogicService {
                                 studentPaperTypes.add(t.getPaperType());
                             }
                         }
+                    } else {
+                        relatePaperTypes.addAll(paperTypes);
+                        studentPaperTypes.addAll(paperTypes);
                     }
 
                     examTaskDetail.setRelatePaperType(String.join(",", relatePaperTypes));
@@ -392,10 +395,10 @@ public class TaskLogicServiceImpl implements TaskLogicService {
                                     createPdfUtil.getExamStudentPaperPdf(t.getPaperType(), paperPdfDto, studentPaperPdfList, waterMarkNames);
                                 }
                             }
-                        } else if (examDetail.getPrintCount() != null) {
+                        } else if (examDetail.getTotalSubjects() != null) {
                             AtomicInteger atomicInteger = new AtomicInteger(0);
                             int i = 0;
-                            while (i < examDetail.getPrintCount()) {
+                            while (i < examDetail.getTotalSubjects()) {
                                 int seq = atomicInteger.getAndIncrement();
                                 int mod = seq % examTaskDetail.getDrawCount();
                                 if (Objects.nonNull(pdfDto)) {
@@ -444,11 +447,11 @@ public class TaskLogicServiceImpl implements TaskLogicService {
                                 // 用带条码的模板
                                 basicAttachmentList.add(createPdfUtil.examStudentHtml(examCardDetailMap.get(t.getPaperType()).getHtmlContent(), t, paperType, examDetail, examDetailCourse, sysUser.getId(), studentCardPdfList, basicCardRule, fileTempList));
                             }
-                        } else if (examDetail.getPrintCount() != null) {
+                        } else if (examDetail.getTotalSubjects() != null) {
                             AtomicInteger atomicInteger = new AtomicInteger(0);
                             Map<String, BasicAttachment> stringBasicAttachmentMap = new HashMap<>();
                             int i = 0;
-                            while (i < examDetail.getPrintCount()) {
+                            while (i < examDetail.getTotalSubjects()) {
                                 int seq = atomicInteger.getAndIncrement();
                                 int mod = seq % examTaskDetail.getDrawCount();
                                 String tempPaperType = paperTypes.get(mod);

+ 1 - 1
distributed-print-business/src/main/java/com/qmth/distributed/print/business/util/CreatePdfUtil.java

@@ -761,7 +761,7 @@ public class CreatePdfUtil {
                     }
                     List<String> courseNames = examDetailCourseList.stream().map(m -> String.format("%s(%s)", m.getCourseName(), m.getCourseCode())).collect(Collectors.toList());
                     basicMap.put("code", "courseName");
-                    basicMap.put("name", "科目名称");
+                    basicMap.put("name", "课程名称");
                     basicMap.put("value", String.join(SystemConstant.COMMA_OF_CHINESE, courseNames));
                     isCourseFill = true;
                 } else {

+ 1 - 0
distributed-print-business/src/main/resources/mapper/BasicExamMapper.xml

@@ -55,5 +55,6 @@
                 </if>
             </if>
         </where>
+        order by a.create_time desc
     </select>
 </mapper>

+ 10 - 3
distributed-print-business/src/main/resources/mapper/ExamCardMapper.xml

@@ -118,9 +118,14 @@
             a.school_id = #{schoolId}
             AND a.type = #{type}
             AND a.enable = TRUE
-            <if test="cardRuleId == '-1'">
-                AND a.create_method != 'STANDARD'
-            </if>
+              <if test="cardRuleId != null and cardRuleId != ''">
+                  <if test="cardRuleId == '-1'">
+                      AND a.create_method != 'STANDARD'
+                  </if>
+                  <if test="cardRuleId != '-1'">
+                      AND a.card_rule_id = #{cardRuleId}
+                  </if>
+              </if>
         order by a.id desc
     </select>
     <select id="listCustom" resultType="com.qmth.distributed.print.business.entity.ExamCard">
@@ -132,6 +137,7 @@
             a.school_id = #{schoolId}
             AND a.course_code = #{courseCode}
             AND a.type = #{type}
+            AND a.card_rule_id = #{cardRuleId}
             AND a.create_time >= 1680624000000
         order by a.create_time desc
     </select>
@@ -232,6 +238,7 @@
                 </if>
             </if>
         </where>
+        order by ec.create_time desc
     </select>
     <select id="listCustomByExamStage" resultType="com.qmth.distributed.print.business.entity.ExamCard">
         SELECT

+ 1 - 1
distributed-print-business/src/main/resources/mapper/ExamTaskMapper.xml

@@ -103,7 +103,7 @@
                     AND a.create_id = #{dpr.requestUserId}
                 </if>
                 <if test="dpr.orgIdSet != null and dpr.orgIdSet != '' and dpr.orgIdSet.size > 0">
-                    AND c.org_id IN
+                    AND d.org_id IN
                     <foreach collection="dpr.orgIdSet" item="item" index="index" open="(" separator="," close=")">
                         #{item}
                     </foreach>

+ 12 - 1
distributed-print/src/main/java/com/qmth/distributed/print/api/EnumsController.java

@@ -1,7 +1,10 @@
 package com.qmth.distributed.print.api;
 
+import com.alibaba.fastjson.JSON;
 import com.qmth.boot.api.constant.ApiConstant;
+import com.qmth.distributed.print.business.entity.BasicExamRule;
 import com.qmth.distributed.print.business.enums.*;
+import com.qmth.distributed.print.business.service.BasicExamRuleService;
 import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.enums.*;
 import com.qmth.teachcloud.common.enums.log.CustomizedOperationTypeEnum;
@@ -14,6 +17,7 @@ import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
+import javax.annotation.Resource;
 import java.util.List;
 
 /**
@@ -26,6 +30,9 @@ import java.util.List;
 @RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + SystemConstant.PREFIX_URL_COMMON + "/get_enums")
 public class EnumsController {
 
+    @Resource
+    BasicExamRuleService basicExamRuleService;
+
     /**
      * 查询
      *
@@ -65,7 +72,11 @@ public class EnumsController {
             list = PrivilegeEnum.listTypes();
         } else if (type.equals(EnumType.REQUIRED_FIELDS.name())) {
             //考务必选字段
-            list = RequiredFieldsEnum.listTypes();
+//            list = RequiredFieldsEnum.listTypes();
+            BasicExamRule basicExamRule = basicExamRuleService.getBySchoolId();
+            if(basicExamRule != null){
+                list = JSON.parseArray(basicExamRule.getRequiredFields(), EnumResult.class);
+            }
         } else if (type.equals(EnumType.REVIEW_STATUS.name())) {
             //审核状态类型
             list = ReviewStatusEnum.listTypes();

+ 1 - 1
teachcloud-common/src/main/resources/mapper/SysOrgMapper.xml

@@ -54,6 +54,6 @@
                 and so.school_id = #{schoolId}
             </if>
         </where>
-            order by so.parent_id asc
+            order by so.create_time asc
     </select>
 </mapper>