From e22c4a4ee00f57cdb9e038119a0235c881549d08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E5=B8=85?= Date: Wed, 27 Aug 2025 20:43:29 +0800 Subject: [PATCH] =?UTF-8?q?1.bug=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hezhi/api/kaoshi/ApiExamController.java | 15 +++- .../hezhi/api/kaoshi/ApiPCController.java | 6 +- .../src/main/resources/application.yml | 19 +++++ .../com/ruoyi/hezhi/mapper/TbExamMapper.java | 8 ++ .../impl/TbExamRegistrationServiceImpl.java | 85 ++++++++++--------- .../hezhi/service/impl/TbExamServiceImpl.java | 2 + .../impl/TbExamSubjectServiceImpl.java | 28 +++--- .../service/impl/TbMajorClassServiceImpl.java | 1 + .../resources/mapper/hezhi/TbExamMapper.xml | 4 + .../mapper/hezhi/TbExamNoticeMapper.xml | 61 ++++++------- .../mapper/hezhi/TbExamRegistrationMapper.xml | 5 +- .../mapper/hezhi/TbExamSubjectMapper.xml | 12 +++ .../mapper/hezhi/TbMemberSubjectAllMapper.xml | 6 ++ .../views/hezhi/examRegistration/index.vue | 17 +++- 14 files changed, 174 insertions(+), 95 deletions(-) diff --git a/ruoyi-admin/src/main/java/com/ruoyi/hezhi/api/kaoshi/ApiExamController.java b/ruoyi-admin/src/main/java/com/ruoyi/hezhi/api/kaoshi/ApiExamController.java index 7d59c4f..0d6dab6 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/hezhi/api/kaoshi/ApiExamController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/hezhi/api/kaoshi/ApiExamController.java @@ -25,6 +25,7 @@ import java.math.RoundingMode; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; +import java.util.stream.Collectors; /** * @Author: LCL @@ -156,13 +157,16 @@ public class ApiExamController { // 做过的题目 String doneNum = "0"; - // 查询所有题目 + // 查询所有题目根据课程 List> list = examSubjectService.queryByParam(params); // 题目总数 int allNum = list.size(); statisticsUn = String.valueOf(allNum); if (params.containsKey("memberUserId") && StringUtils.isNotBlank(params.get("memberUserId").toString()) && allNum > 0) { + if (!list.isEmpty()) { + params.put("examSubjectIds", list.stream().map(item -> item.get("examSubjectId")).collect(Collectors.toList())); + } // 正确题数, 当前题目编号 params.put("status", 1); int countTrue = memberSubjectAllService.memberSubjectAllCount(params); @@ -245,6 +249,9 @@ public class ApiExamController { try { // 查询所有题目 List> list = examSubjectService.queryByParam(params); + if (!list.isEmpty()) { + params.put("examSubjectIds", list.stream().map(item -> item.get("examSubjectId")).collect(Collectors.toList())); + } // 题目总数 int allNum = list.size(); // 错误题数,正确题数, 当前题目编号 @@ -264,11 +271,13 @@ public class ApiExamController { } else { // int location = memberSubjectAll.getLocation(); //初始化数组 - List nums = new ArrayList(); + List nums = new ArrayList<>(); TbMemberSubjectAll subjectAll = new TbMemberSubjectAll(); subjectAll.setPracticeType(Integer.parseInt(params.get("practiceType").toString())); subjectAll.setMemberUserId(Long.parseLong(params.get("memberUserId").toString())); - subjectAll.setSubjectWarehouseClassId(Long.parseLong(params.get("subjectWarehouseClassId").toString())); + if (StringUtils.isNotEmpty(params.get("subjectWarehouseClassId").toString())) { + subjectAll.setSubjectWarehouseClassId(Long.parseLong(params.get("subjectWarehouseClassId").toString())); + } List allList = memberSubjectAllService.selectMemberSubjectAllList(subjectAll); completeNum = allList.size(); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/hezhi/api/kaoshi/ApiPCController.java b/ruoyi-admin/src/main/java/com/ruoyi/hezhi/api/kaoshi/ApiPCController.java index 8ca7b72..3fd771d 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/hezhi/api/kaoshi/ApiPCController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/hezhi/api/kaoshi/ApiPCController.java @@ -167,9 +167,9 @@ public class ApiPCController { if (StringUtils.isNull(params.get("examNoticeId"))&&StringUtils.isNull(params.get("examId"))){ return AjaxResult.error("缺少 examNoticeId 考试通知ID 或者 examId 考试id"); } - /* if (!params.containsKey("examNoticeId") || StringUtils.isBlank(params.get("examNoticeId").toString())) { - return AjaxResult.error("缺少 examNoticeId 考试通知ID"); - }*/ + if (!params.containsKey("examRegistrationId") || StringUtils.isBlank(params.get("examRegistrationId").toString())) { + return AjaxResult.error("缺少 examRegistrationId 考试报名ID"); + } try { return AjaxResult.success().put("data", examNoticeService.getExamNoticeInfo(params)); } catch (Exception e) { diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml index 1dd2f6b..b7b1f5b 100644 --- a/ruoyi-admin/src/main/resources/application.yml +++ b/ruoyi-admin/src/main/resources/application.yml @@ -239,6 +239,25 @@ wx: description: 学信考试 # 证书密钥 apiClientKey: MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCYx8UTdItOSLGNZF/wBP2DWe6iF33l+80X+MQZtTYyAhfWu2HblnOm+LN9yc/S/Jyft5LbWj58/4jk1idPzXoDoYWf5UcyyCXXVTIZhuS7zuwsaVL6jdrdHxTeeu+LkSiJGKDrw10M8M0Utf2LQxdCIel/yZY59iOSPcF5sMfhpMgmMFB7LbDfStNHFku4IW/iIV+FzOI/NVaTwN2MXpgdSVnJnhV+HuHchqW+yA2fONaLgglQyNn748onSH/zzEQFYezkHgi1z8J7gxfK8HG83Bjj62ybL3LPhpe9cnB7J+suc1a+8EjFcMDiM9HH1NFbF947OoaVUU6NwZOfVB/tAgMBAAECggEBAJJuHcAY2o+scqhexOjKD6S+JE6tD1jHLvpDzsgI+6mQggKoVBFfsPcetQHh1FOXFBKsoo+kffHWBQG3E7ST7tbeD7GB0eylEkfBeyQmOsKaf5fNVt+X6GY4rQrTbxYoiV5lAY8WDvAhN54bE6hPJFKZKC/3KQnilJNMp0wYGGt1xdMtFmLn0nzhA4TYX6UWUaAV8T1e4gRjkUVCdTRTF4RqJQISzXsXCMh/UkbYNno/hxHHvur5Nd9QzXVzEoieRmrkVHWtbL1+hUnvi2JthRefRfdXESax2rWeqRumOQzxpkjymMBFngc8ze9lQlHtgw2nFaa4U4DlJVCKk8YQXAECgYEAyB+pphD7geNIV98TEFH5Rbh9WSgQrw2K6crUjbY6HFFmbgRRoHKMaHqCMeb7cOmDTlQzDQPr2w8Wa+rNIcCfS/y5ZprGdOOAn8JEIXpRFJrEyYHyGwKd2zNkXUVx9mXlQp1bQLbTTlOI5GSuB54zUeLGK8i/MLHu2q4NTvfjGQECgYEAw3Af+poh2/QiNG8/Sr/6nO363LRGlcTpCiPWn66oMOOcnpHrIT9YqqBFh0MxcN/9P7r92IrLn0fwE6XaprfXSJZQiQRhKE3A6zhq0G+/iM1yngCdt8Wf1Kf9/lHn7ksxokBSCcCiTlAhyXTdgoAyckOww1VJ1iiJWnB6Sqir+u0CgYBVpn+ETMZn+++NdDMDjCIEvgYf727cjQ5EK4Q3NqO+VPRi58RLyFrhqHUqiHJbDAYfsxe6XVBHjDiLbY3oATnsWri6+kkv4+K7/XgNX/1ttSO+HriQ6NjI5UDyTnONAmVR0mko1Faxsjzni1OUfRf31vf760owvCa/PzkA8EUpAQKBgBQ065mFhiqvuzmgpvKbltXS5TUcjo+9pDqgKfionksvvWnHvH/bhNdfatDpaZs6DX0hYE2bTCJT1cayR0ElkOS4ZetEwKbiIygu1Rxn8W27kDY16hiuHjBmjiRVY52HuMIF1HWdrSpbrqKdqqlrh8u4o/YOQ2wZFNp89qfxeJahAoGAD8etps+mEO6GJesJclzGBwvbLAzQjHqniLuRzZgoOOI7Fe5lOjXguFUVlUj+l8NujlzF7SvMWOg/y+DZfOX25OoRG0vmtxsEHNPSzlvBXuF3DCkEDv51lcxWB0LH6RG/0lAguFR3HBAO0xybYdExzh/Ng6f1jpxJ/G1+1sdOLHg= + h5: # 小程序id + appId: wx8de56186c26a6a76 + # 小程序商户号 + mchId: 1720827154 + # api证书序列号 + mchSerialNum: 270586DDA5BC8321EC6759EB98346BEB1CBE2A34 + # apiV3密钥 + apiV3Key: yFRJqhZQJ45wrwg2zJwokb40P7Yn2123 + # 微信支付回调通知域名 + notifyUrl: https://server.chsie.com.cn/api/pay/createNativePayParamNotify + # 微信支付回调通知域名 + h5NotifyUrl: https://server.chsie.com.cn/api/pay/createH5PayParamNotify + # 支付宝支付回调通知域名 + notifyZfbUrl: https://server.chsie.com.cn/api/pay/aliPayBoilerNotify + # 商品描述 + description: 学信考试 + # 证书密钥 + apiClientKey: MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDOSZP9VJ8kmG2FOGFORlJP3uR4RnXXThNnqtogvv+5OrlRlErsyce37ukPhwwrtRr0nXpXkfL7p8GXzDgTNQ+KDyFvuv14nPtlQdaoqyyjSmMh0fnsFNY2RSqNX/hdep5blxUkoCjoQG4Y+n9QXlZMHJ+TFfQG9/YNDz+hVjXHTCeeRRyvHlxTt/+f9BEfjCz32pwYYzLBEjeTf95m8q7g5Vw4vDqNiDEBRtk3clUoLkSw+fKNSLXfeTcji35v8Ozx1Sw2aTg+WOz14IF4aHekJMiA1nYC5tbWYccaprjZXVuQhGK0KIvy/7A6uHWH9ACwGnPT+VXUKLBxSnqwkFu9AgMBAAECggEBAM0kRIQ34+8LmlZSJAooSnDdMo0dXNDY9tkwAa1w43O7n1EuTHg/jVovvxtO7F6GwqCh/mkZXe6++/lOADGxoZtkwpaO+MQ6MJKYr7SaTVCxh/W5D3WjnwbnL5LZ7m5fox1oGIGMuEGG2TYD3hn5Ro54JISr3zoS2mBQWrHBvsdJ/kSPYotOTsTeCcUDRwOqX6oTgRtes7eNpHlEvqH7cczH9eZxEfqHqisC0sRUISjge5zipCtscEIEv60JlGUjt7CGs9f36sYVn6wu1CiM6kcNh/ncOhYCvHBFTsh6+FxjC2dJj5KcaxIXcHcfjOkLOHV8p/VtBoW0ocXmnzA9aK0CgYEA57IJQyHZICtWo0vWvp8ru00DIx9C1rXTefrxEaHJf3sfiKx1kJmxuRwPMSRo37KvDczKIM6BzpnCqTgQd19+dXZ6JkCOJgabvcAVv7hbJL4SE7oNEQB+pElVitOzdEmUTP6+425S1Cz39eysz/WEQwik7Um/BFF4YY3+6ujJIaMCgYEA4+07nRzhA/mKIoITcnjEQ+F3wxNTs8JeCvRWuVrncGO0IcbMrY9aVzAp79emWnEuc+JN5VZ+bNGe7rr3+9DHEp8YTv29fYfndWWB6h7qxBGTlX4JCEy1vAwBgwR4P0fwxxoZ2AN+qKURepMdkfQF/DFuDH4WHjs+2YdZyt60Ix8CgYEA4hPqzcKdZrJjG3vI0r/loCGJSiAay/8nlwKxb476WpX9MxN0s+AEdqdWe5EXdA+amFCXemOGbd3C//NgvdpEPsGYdvLOwXP5S7G+hxCQfs2oPe9xCIH/ELct7QSdOn8BYg/Am5Lu53HpkeGazmC26eHpbFBlPwVv/WDcuMLkXxkCgYBERtyExBHjzuzCSZTpxaOFchUeKrv4LVFelrMj80dBM5zSQWsu0rKNS7BEWKVMknsH29LZ0H8uudySRw/iLzhzK5VslDYfVIbRdAbmyzwoX9uF/KtYASKvoikRxlT/H93QxtDXFLTscAY8YbWJ8z+XvHbq5xpZFAZPw2vyiaQMoQKBgDiZiRdkLw5MBBDqwDrF1V8CN+/MUgdUNT1zFiynYLClNVgx+titz8Zq73NpziNacxzLUKkXJEN1kzWntm51nRfrdHWsiv/qdgDCpIVR05f1EqUuLAK46Usg8ElD444iz3ehvN/ou3DYadNGNp9KrQuTp/8iTFpbG/PkXxDtAtkA + login: appId: wx8de56186c26a6a76 diff --git a/ruoyi-system/src/main/java/com/ruoyi/hezhi/mapper/TbExamMapper.java b/ruoyi-system/src/main/java/com/ruoyi/hezhi/mapper/TbExamMapper.java index df070ac..856b363 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/hezhi/mapper/TbExamMapper.java +++ b/ruoyi-system/src/main/java/com/ruoyi/hezhi/mapper/TbExamMapper.java @@ -31,6 +31,14 @@ public interface TbExamMapper */ public List selectTbExamList(TbExam tbExam); + /** + * 查询考试列表 + * + * @param courseId 课程ID + * @return 考试集合 + */ + public List selectTbExamListByCourseId(Long courseId); + /** * 查询考试列表 * diff --git a/ruoyi-system/src/main/java/com/ruoyi/hezhi/service/impl/TbExamRegistrationServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/hezhi/service/impl/TbExamRegistrationServiceImpl.java index ca7d141..28040be 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/hezhi/service/impl/TbExamRegistrationServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/hezhi/service/impl/TbExamRegistrationServiceImpl.java @@ -347,44 +347,51 @@ public class TbExamRegistrationServiceImpl implements ITbExamRegistrationService if (examRegistration.getCertificateStatus()!=1){ throw new ServiceException("不是待发货状态,发货失败"); } - try { - JSONObject sendResult = kd100Util.testBorderOfficial( - CompanyConstant.EMS, - sendManName, - sendManMobile, - sendManPrintAddr, - tbExamRegistration.getName(), - tbExamRegistration.getContactPhone(), - tbExamRegistration.getProvinceName() + tbExamRegistration.getCityName() + tbExamRegistration.getAreaName() + tbExamRegistration.getAddress()); - - Boolean result = sendResult.getBoolean("result"); - if (result){ - JSONObject data = sendResult.getJSONObject("data"); - String taskId = data.getString("taskId"); - String orderId = data.getString("orderId"); - String kuaidinum = data.getString("kuaidinum"); - String pollToken = data.getString("pollToken"); - - tbExamRegistration.setShippingMark("ems"); - tbExamRegistration.setShippingName("ems"); - tbExamRegistration.setShippingCode(kuaidinum); - tbExamRegistration.setShippingTaskId(taskId); - tbExamRegistration.setShippingOrderId(orderId); - tbExamRegistration.setShippingPollToken(pollToken); - tbExamRegistration.setSendManName(sendManName); - tbExamRegistration.setSendManMobile(sendManMobile); - tbExamRegistration.setSendManPrintAddr(sendManPrintAddr); - tbExamRegistrationMapper.updateTbExamRegistration(examRegistration); - - return 1; - }else { - String message = sendResult.getString("message"); - throw new ServiceException(message); - } - } catch (Exception e) { - e.printStackTrace(); - throw new ServiceException("发货提交异常"); - } + examRegistration.setCertificate(tbExamRegistration.getCertificate()); + examRegistration.setSendManName(sendManName); + examRegistration.setSendManMobile(sendManMobile); + examRegistration.setSendManPrintAddr(sendManPrintAddr); + return tbExamRegistrationMapper.updateTbExamRegistration(examRegistration); + // todo 后续需要对接快递,将以下代码取消注释,进行调试 +// try { +// JSONObject sendResult = kd100Util.testBorderOfficial( +// CompanyConstant.EMS, +// sendManName, +// sendManMobile, +// sendManPrintAddr, +// tbExamRegistration.getName(), +// tbExamRegistration.getContactPhone(), +// tbExamRegistration.getProvinceName() + tbExamRegistration.getCityName() + tbExamRegistration.getAreaName() + tbExamRegistration.getAddress()); +// +// Boolean result = sendResult.getBoolean("result"); +// +// if (result){ +// JSONObject data = sendResult.getJSONObject("data"); +// String taskId = data.getString("taskId"); +// String orderId = data.getString("orderId"); +// String kuaidinum = data.getString("kuaidinum"); +// String pollToken = data.getString("pollToken"); +// +// tbExamRegistration.setShippingMark("ems"); +// tbExamRegistration.setShippingName("ems"); +// tbExamRegistration.setShippingCode(kuaidinum); +// tbExamRegistration.setShippingTaskId(taskId); +// tbExamRegistration.setShippingOrderId(orderId); +// tbExamRegistration.setShippingPollToken(pollToken); +// tbExamRegistration.setSendManName(sendManName); +// tbExamRegistration.setSendManMobile(sendManMobile); +// tbExamRegistration.setSendManPrintAddr(sendManPrintAddr); +// tbExamRegistrationMapper.updateTbExamRegistration(examRegistration); +// +// return 1; +// }else { +// String message = sendResult.getString("message"); +// throw new ServiceException(message); +// } +// } catch (Exception e) { +// e.printStackTrace(); +// throw new ServiceException("发货提交异常"); +// } } /** @@ -810,7 +817,7 @@ public class TbExamRegistrationServiceImpl implements ITbExamRegistrationService fileUrl = this.downloadAdmissionTicket(tbExamRegistration); } if (4 == type){// 证书 - fileUrl = tbExamRegistration.getGraduationCertificate(); + fileUrl = tbExamRegistration.getCertificate(); } if (10 == type){// 报名表 fileUrl = this.downloadReportForm(tbExamRegistration); diff --git a/ruoyi-system/src/main/java/com/ruoyi/hezhi/service/impl/TbExamServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/hezhi/service/impl/TbExamServiceImpl.java index d949f8c..107fd25 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/hezhi/service/impl/TbExamServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/hezhi/service/impl/TbExamServiceImpl.java @@ -398,6 +398,8 @@ public class TbExamServiceImpl implements ITbExamService return "中级"; case 3: return "高级"; + case 4: + return "技师"; default: return null; } diff --git a/ruoyi-system/src/main/java/com/ruoyi/hezhi/service/impl/TbExamSubjectServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/hezhi/service/impl/TbExamSubjectServiceImpl.java index 5a58132..4339820 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/hezhi/service/impl/TbExamSubjectServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/hezhi/service/impl/TbExamSubjectServiceImpl.java @@ -180,12 +180,16 @@ public class TbExamSubjectServiceImpl implements ITbExamSubjectService { */ @Override public List> queryByParam(Map params) { -// Long courseId = MapUtils.getLong(params, "courseId"); -// TbExamCourse examCourseDetail = tbExamCourseMapper.getSubjectWarehouseClassIdByCourseId(courseId); -// if (ObjectUtils.isEmpty(examCourseDetail)) { -// throw new ServiceException("此课程未添加题库"); -// } -// params.put("subjectWarehouseClassId", examCourseDetail.getSubjectWarehouseClassId()); + Long courseId = MapUtils.getLong(params, "courseId"); + if (null == courseId) { + throw new ServiceException("课程不能为空"); + } + List tbExamList = tbExamMapper.selectTbExamListByCourseId(courseId); + List examIds = tbExamList.stream().map(TbExam::getExamId).collect(Collectors.toList()); + if (examIds.isEmpty()) { + throw new ServiceException("课程不存在考试"); + } + params.put("examIds", examIds); return tbExamSubjectMapper.queryByParam(params); } @@ -233,11 +237,15 @@ public class TbExamSubjectServiceImpl implements ITbExamSubjectService { @Override public List> getSpecialPracticeList(Map params) { Long courseId = MapUtils.getLong(params, "courseId"); - TbExamCourse examCourseDetail = tbExamCourseMapper.getSubjectWarehouseClassIdByCourseId(courseId); - if (ObjectUtils.isEmpty(examCourseDetail)) { - throw new ServiceException("管理员未上传该题库信息"); + if (null == courseId) { + throw new ServiceException("课程不能为空"); } - params.put("subjectWarehouseClassId", examCourseDetail.getSubjectWarehouseClassId()); + List tbExamList = tbExamMapper.selectTbExamListByCourseId(courseId); + List examIds = tbExamList.stream().map(TbExam::getExamId).collect(Collectors.toList()); + if (examIds.isEmpty()) { + throw new ServiceException("课程不存在考试"); + } + params.put("examIds", examIds); return tbExamSubjectMapper.getSpecialPracticeList(params); } diff --git a/ruoyi-system/src/main/java/com/ruoyi/hezhi/service/impl/TbMajorClassServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/hezhi/service/impl/TbMajorClassServiceImpl.java index 433a813..61e41f6 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/hezhi/service/impl/TbMajorClassServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/hezhi/service/impl/TbMajorClassServiceImpl.java @@ -201,6 +201,7 @@ public class TbMajorClassServiceImpl implements ITbMajorClassService list.forEach(item -> { if (Objects.equals(MapUtils.getLong(course, "courseId"), item.getCourseId())){ course.put("isEnroll", item.getIsEnroll()); + course.put("examRegistrationId", item.getExamRegistrationId()); } }); } diff --git a/ruoyi-system/src/main/resources/mapper/hezhi/TbExamMapper.xml b/ruoyi-system/src/main/resources/mapper/hezhi/TbExamMapper.xml index 409d82c..161391e 100644 --- a/ruoyi-system/src/main/resources/mapper/hezhi/TbExamMapper.xml +++ b/ruoyi-system/src/main/resources/mapper/hezhi/TbExamMapper.xml @@ -540,4 +540,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + diff --git a/ruoyi-system/src/main/resources/mapper/hezhi/TbExamNoticeMapper.xml b/ruoyi-system/src/main/resources/mapper/hezhi/TbExamNoticeMapper.xml index 3b6005a..185c288 100644 --- a/ruoyi-system/src/main/resources/mapper/hezhi/TbExamNoticeMapper.xml +++ b/ruoyi-system/src/main/resources/mapper/hezhi/TbExamNoticeMapper.xml @@ -176,40 +176,37 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"