소스 검색

Merge branch 'master' of hyq/ccnet-wx-mp3.0 into master

project 6 년 전
부모
커밋
8f3d024f82

+ 9 - 1
src/main/java/com/emato/ccnet/wx/biz/req/waybill/oms/Ceb511SendDateRequest.java

@@ -8,11 +8,13 @@ import com.emato.ccnet.wx.contants.Contants;
 import com.emato.ccnet.wx.dao.entity.ccnet.CusWaybill;
 import com.emato.ccnet.wx.dao.entity.ccnet.CusWaybillGoods;
 import com.emato.ccnet.wx.dao.entity.ccnet.CusWaybillStatus;
+import com.emato.ccnet.wx.dao.entity.oms.MerchantSecret;
 import com.emato.ccnet.wx.dto.ccnetdto.BondedStockMerchantOrder;
 import com.emato.ccnet.wx.dto.ccnetdto.BondedStockMerchantOrderItem;
 import com.emato.ccnet.wx.service.CusWaybillGoodsService;
 import com.emato.ccnet.wx.service.CusWaybillService;
 import com.emato.ccnet.wx.service.CusWaybillStatusService;
+import com.emato.ccnet.wx.service.OmsMerchantSecretService;
 import com.emato.ccnet.wx.support.msg.resp.ResponseMessage;
 import com.emato.ccnet.wx.support.sign.OmsSign;
 import com.emato.ccnet.wx.util.OkHttpUtils;
@@ -52,6 +54,9 @@ public class Ceb511SendDateRequest implements CebReqSendDate{
     private Ceb511SendDateAfter ceb511SendDateAfter;
 
     @Autowired
+    private OmsMerchantSecretService omsMerchantSecretService;
+
+    @Autowired
     private Cus cus;
 
     /**
@@ -185,13 +190,16 @@ public class Ceb511SendDateRequest implements CebReqSendDate{
         }
         bondedStockMerchantOrder.setItem(bondedStockMerchantOrderItems);
         String bondedStockMerchantOrderJson = JacksonUtil.toJson(bondedStockMerchantOrder);
+        MerchantSecret merchantSecret = omsMerchantSecretService.getSecretByMerchSn(cusWaybill.getMerchSn());
 
         String timestamp = String.valueOf(System.currentTimeMillis()/1000);
         sParaTemp.put("merchId",cusWaybill.getMerchSn());
         sParaTemp.put("data",bondedStockMerchantOrderJson);
         sParaTemp.put("timestamp", timestamp);
         //生成要请求给oms秘钥
-        String sign = OmsSign.sign(sParaTemp,cus.getWaybill().get("secret-key"));
+//        String sign = OmsSign.sign(sParaTemp,cus.getWaybill().get("secret-key"));
+        LOGGER.info("md5混淆码参数:" + merchantSecret.getMd5Salt());
+        String sign = OmsSign.sign(sParaTemp,merchantSecret.getMd5Salt());
         sParaTemp.put("sign", sign);
 
 

+ 69 - 0
src/main/java/com/emato/ccnet/wx/config/db/three/ThreeDataSourceConfiguration.java

@@ -0,0 +1,69 @@
+package com.emato.ccnet.wx.config.db.three;
+
+import org.apache.ibatis.session.SqlSessionFactory;
+import org.mybatis.spring.SqlSessionFactoryBean;
+import org.mybatis.spring.SqlSessionTemplate;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.env.Environment;
+import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
+import org.springframework.jdbc.datasource.DataSourceTransactionManager;
+
+import javax.sql.DataSource;
+
+/**
+ * 多数据源配置
+ *
+ * 数据源配置
+ *
+ * 指定mybatis-config.xml, 和要扫描的别名包
+ *
+ * @author Scott Chen
+ * @date 2017/4/22
+ */
+@Configuration
+public class ThreeDataSourceConfiguration {
+
+    @Autowired
+    private Environment env;
+
+    @Bean
+    @ConfigurationProperties(prefix = "spring.datasource.three")
+    public DataSourceProperties threeDataSourceProperties() {
+        return new DataSourceProperties();
+    }
+
+    @Bean
+    public DataSource threeDataSource() {
+        DataSource dataSource = threeDataSourceProperties().initializeDataSourceBuilder().build();
+        return dataSource;
+    }
+
+    @Bean
+    public SqlSessionFactory threeSqlSessionFactory(DataSource threeDataSource) throws Exception  {
+        SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();
+        sessionFactoryBean.setDataSource(threeDataSource);
+
+        //配置mybatis-config.xml
+        sessionFactoryBean.setConfigLocation(new PathMatchingResourcePatternResolver().getResource(env.getProperty("mybatis.three.config-location")));
+        //配置mapper.xml
+        sessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(env.getProperty("mybatis.three.mapper-locations")));
+        //配置扫描type aliases的包路径
+        sessionFactoryBean.setTypeAliasesPackage(env.getProperty("mybatis.three.type-aliases-package"));
+        return sessionFactoryBean.getObject();
+    }
+
+    @Bean(name = "threeTransactionManager")
+    public DataSourceTransactionManager threeTransactionManager( DataSource threeDataSource) {
+        return new DataSourceTransactionManager(threeDataSource);
+    }
+
+    @Bean
+    public SqlSessionTemplate threeSqlSessionTemplate(SqlSessionFactory threeSqlSessionFactory) {
+        return new SqlSessionTemplate(threeSqlSessionFactory);
+    }
+
+}

+ 41 - 0
src/main/java/com/emato/ccnet/wx/config/db/three/ThreeMapperConfiguration.java

@@ -0,0 +1,41 @@
+package com.emato.ccnet.wx.config.db.three;
+
+import com.google.common.base.Joiner;
+import com.google.common.collect.ImmutableList;
+import org.mybatis.spring.mapper.MapperScannerConfigurer;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+
+/**
+ * Mybatis Mapper接口扫描配置
+ *
+ * @author Scott Chen
+ * @date 2017/4/23
+ */
+@Configuration
+public class ThreeMapperConfiguration {
+
+    @Bean
+    public MapperScannerConfigurer threeMapperScannerConfigurer() {
+        MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
+        //Mapper接口包
+        mapperScannerConfigurer.setBasePackage(mapperPackage());
+        //要使用的数据源
+        mapperScannerConfigurer.setSqlSessionTemplateBeanName("threeSqlSessionTemplate");
+        return mapperScannerConfigurer;
+    }
+
+    /**
+     * 添加要扫描的Mapper接口包
+     * 以逗号分隔的字符串
+     *
+     * @return
+     */
+    protected String mapperPackage() {
+        ImmutableList.Builder<String> builder = new ImmutableList.Builder();
+        builder.add("com.emato.ccnet.wx.dao.mapper.oms");
+        return Joiner.on(",").join(builder.build());
+    }
+
+}

+ 152 - 0
src/main/java/com/emato/ccnet/wx/dao/entity/oms/MerchantSecret.java

@@ -0,0 +1,152 @@
+package com.emato.ccnet.wx.dao.entity.oms;
+
+import java.io.Serializable;
+import java.util.Date;
+
+public class MerchantSecret implements Serializable {
+    private String secSn;
+
+    private String merchSn;
+
+    private String merchSecType;
+
+    private String md5Salt;
+
+    private String merchPubKey;
+
+    private String merchPriKey;
+
+    private String ematoPubKey;
+
+    private String ematoPriKey;
+
+    private String isValid;
+
+    private String createrSn;
+
+    private Date createTime;
+
+    private String moderSn;
+
+    private Date modTime;
+
+    private Date tstm;
+
+    private static final long serialVersionUID = 1L;
+
+    public MerchantSecret() {
+        super();
+    }
+
+    public String getSecSn() {
+        return secSn;
+    }
+
+    public void setSecSn(String secSn) {
+        this.secSn = secSn == null ? null : secSn.trim();
+    }
+
+    public String getMerchSn() {
+        return merchSn;
+    }
+
+    public void setMerchSn(String merchSn) {
+        this.merchSn = merchSn == null ? null : merchSn.trim();
+    }
+
+    public String getMerchSecType() {
+        return merchSecType;
+    }
+
+    public void setMerchSecType(String merchSecType) {
+        this.merchSecType = merchSecType == null ? null : merchSecType.trim();
+    }
+
+    public String getMd5Salt() {
+        return md5Salt;
+    }
+
+    public void setMd5Salt(String md5Salt) {
+        this.md5Salt = md5Salt == null ? null : md5Salt.trim();
+    }
+
+    public String getMerchPubKey() {
+        return merchPubKey;
+    }
+
+    public void setMerchPubKey(String merchPubKey) {
+        this.merchPubKey = merchPubKey == null ? null : merchPubKey.trim();
+    }
+
+    public String getMerchPriKey() {
+        return merchPriKey;
+    }
+
+    public void setMerchPriKey(String merchPriKey) {
+        this.merchPriKey = merchPriKey == null ? null : merchPriKey.trim();
+    }
+
+    public String getEmatoPubKey() {
+        return ematoPubKey;
+    }
+
+    public void setEmatoPubKey(String ematoPubKey) {
+        this.ematoPubKey = ematoPubKey == null ? null : ematoPubKey.trim();
+    }
+
+    public String getEmatoPriKey() {
+        return ematoPriKey;
+    }
+
+    public void setEmatoPriKey(String ematoPriKey) {
+        this.ematoPriKey = ematoPriKey == null ? null : ematoPriKey.trim();
+    }
+
+    public String getIsValid() {
+        return isValid;
+    }
+
+    public void setIsValid(String isValid) {
+        this.isValid = isValid == null ? null : isValid.trim();
+    }
+
+    public String getCreaterSn() {
+        return createrSn;
+    }
+
+    public void setCreaterSn(String createrSn) {
+        this.createrSn = createrSn == null ? null : createrSn.trim();
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    public String getModerSn() {
+        return moderSn;
+    }
+
+    public void setModerSn(String moderSn) {
+        this.moderSn = moderSn == null ? null : moderSn.trim();
+    }
+
+    public Date getModTime() {
+        return modTime;
+    }
+
+    public void setModTime(Date modTime) {
+        this.modTime = modTime;
+    }
+
+    public Date getTstm() {
+        return tstm;
+    }
+
+    public void setTstm(Date tstm) {
+        this.tstm = tstm;
+    }
+}

+ 14 - 0
src/main/java/com/emato/ccnet/wx/dao/mapper/oms/MerchantSecretMapper.java

@@ -0,0 +1,14 @@
+package com.emato.ccnet.wx.dao.mapper.oms;
+
+import com.emato.ccnet.wx.dao.entity.oms.MerchantSecret;
+import com.emato.ccnet.wx.dao.entity.wx.WxOrderDate;
+import com.emato.ccnet.wx.dao.entity.wx.WxOrderGoodsDate;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+import java.util.Map;
+
+@Repository
+public interface MerchantSecretMapper {
+    MerchantSecret getSecretByMerchSn(String merchSn);
+}

+ 7 - 0
src/main/java/com/emato/ccnet/wx/service/OmsMerchantSecretService.java

@@ -0,0 +1,7 @@
+package com.emato.ccnet.wx.service;
+
+import com.emato.ccnet.wx.dao.entity.oms.MerchantSecret;
+
+public interface OmsMerchantSecretService {
+    MerchantSecret getSecretByMerchSn(String merchSn);
+}

+ 23 - 0
src/main/java/com/emato/ccnet/wx/service/impl/OmsMerchantSecretServiceImpl.java

@@ -0,0 +1,23 @@
+package com.emato.ccnet.wx.service.impl;
+
+import com.emato.ccnet.wx.dao.entity.oms.MerchantSecret;
+import com.emato.ccnet.wx.dao.mapper.oms.MerchantSecretMapper;
+import com.emato.ccnet.wx.service.OmsMerchantSecretService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service("omsMerchantSecretService")
+public class OmsMerchantSecretServiceImpl implements OmsMerchantSecretService {
+    @Autowired
+    private MerchantSecretMapper merchantSecretMapper;
+
+    private static final Logger logger = LoggerFactory.getLogger(OmsMerchantSecretServiceImpl.class);
+
+    @Override
+    public MerchantSecret getSecretByMerchSn(String cusWaybillSn) {
+        return this.merchantSecretMapper.getSecretByMerchSn(cusWaybillSn);
+    }
+
+}

+ 151 - 0
src/main/resources/application-global.yml

@@ -0,0 +1,151 @@
+
+# 服务配置
+server:
+    address: 183.62.225.124
+    port: 9580
+    servlet:
+        context-path:
+
+# 当前环境
+spring:
+    profiles: global
+
+
+    # 数据源
+    datasource:
+        primary:
+            # 数据源zaxxer HikariCP
+            type: com.zaxxer.hikari.HikariDataSource
+            driver-class-name: org.mariadb.jdbc.Driver
+            url: jdbc:mysql://out-rm-wz9rps8173a1nx63gio.mysql.rds.aliyuncs.com:3306/ccnet_wx_global?useSSL=false&useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&autoReconnect=true&failOverReadOnly=false&zeroDateTimeBehavior=convertToNull
+            username: ccnet_wx
+            password: b$bFB*86yy
+            hikari:
+                read-only: true
+                connection-timeout: 10000
+                validation-timeout: 5000
+                idle-timeout: 600000
+                max-lifetime: 1200000
+                maximum-pool-size: 3
+                minimum-idle: 3
+        middle:
+            # 数据源zaxxer HikariCP
+            type: com.zaxxer.hikari.HikariDataSource
+            driver-class-name: org.mariadb.jdbc.Driver
+            url: jdbc:mysql://out-rm-wz9rps8173a1nx63gio.mysql.rds.aliyuncs.com:3306/kmall_pt_global?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8
+            username: kmall_pt
+            password: AFnwRBu!3q
+            hikari:
+                read-only: true
+                connection-timeout: 10000
+                validation-timeout: 5000
+                idle-timeout: 600000
+                max-lifetime: 1200000
+                maximum-pool-size: 3
+                minimum-idle: 3
+        three:
+            # 数据源zaxxer HikariCP
+            type: com.zaxxer.hikari.HikariDataSource
+            driver-class-name: org.mariadb.jdbc.Driver
+            url: jdbc:mysql://out-rm-wz9rps8173a1nx63gio.mysql.rds.aliyuncs.com:3306/oms_write?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true
+            username: out_qhm
+            password: r%4PEusOn&
+            hikari:
+                read-only: true
+                connection-timeout: 10000
+                validation-timeout: 5000
+                idle-timeout: 600000
+                max-lifetime: 1200000
+                maximum-pool-size: 3
+                minimum-idle: 3
+
+    # 队列配置
+    rabbitmq:
+      host: 120.76.26.84
+      port: 5672
+      username: admin
+      password: Abc-123#
+      virtual-host: /
+
+redis:
+    # JedisCluster
+    jedis-cluster:
+        # Redis Cluster 主机列表
+        redis-cluster-host-list:
+            - host: 120.76.84.45
+              port: 7000
+            - host: 120.76.84.45
+              port: 7001
+            - host: 120.76.84.45
+              port: 7002
+            - host: 120.76.26.84
+              port: 7003
+            - host: 120.76.26.84
+              port: 7004
+            - host: 120.76.26.84
+              port: 7005
+        password: Abc-123#*.-
+        # 连接超时时间(秒), 默认 2*1000
+        connection-timeout: 5000
+        # so-timeout:
+        # 最大重试次数
+        max-attempts: 5
+        # password:
+        pool-config:
+            # 连接池管理的对象实例最大数, 默认 8
+            max-total: 8
+            # 连接池中最大闲置连接数, 默认 8
+            max-idle: 8
+            # 连接池中最小闲置连接数, 默认 0
+            min-idle: 0
+
+# 海关业务信息
+cus:
+    message:
+        # 是否格式化XML报文,主要用于调试程序,生产环境不能格式化(必须为false)
+        format: false
+        # 报文存放目录
+        saveDir: /entity/SZEPORT/send/CEB411/zw/
+
+    # 海关电子订单配置参数
+    order:
+        # e码头CSP系统
+        emato-csp:
+        order-url: http://120.76.26.84:8880/order/add
+
+    # ws
+    waybill:
+        # e码头OMS系统
+        emato-oms:
+        # 地址 http://wstest.ds-bay.com/bds/order 店提
+        shop-url: http://ws.ds-bay.com/al/shop/bdd/cb/order
+        # 备货
+        bds-url: http://ws.ds-bay.com/al/bds/order
+        # 补货
+        bdd-url: http://ws.ds-bay.com/al/bdd/supplement/order
+        #校验
+        check-url: http://ws.ds-bay.com/al/cbnf/buyerPayer/check
+        # 快递公司标识
+        exprComrId: yunda
+        # 快递类型
+        exprType: '00'
+
+    #支付信息
+    play:
+        current: wx
+        wx:
+            #中网国际微信公众ID
+            app-id: wx59c05dcbb3ef2f36
+            #微信支付商户号
+            mch-id: 103106626
+            #财富通编号:
+            pay-code: 440316T004
+            #财富通备案名称:
+            pay-name: 财付通支付科技有限公司
+            #海关
+            customs: SHENZHEN
+            #地址
+            play-url: http://120.76.26.84:9999/wx/custom/wxCbPay
+
+
+

+ 21 - 6
src/main/resources/application-test.yml

@@ -2,7 +2,7 @@
 
 # 服务配置
 server:
-    address: 192.168.1.113
+    address: 192.168.1.68
     port: 8860
     servlet:
         context-path: /
@@ -32,9 +32,24 @@ spring:
             # 数据源zaxxer HikariCP
             type: com.zaxxer.hikari.HikariDataSource
             driver-class-name: org.mariadb.jdbc.Driver
-            url: jdbc:mysql://192.168.1.251:3306/kmall_pt?useSSL=false&useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&autoReconnect=true&failOverReadOnly=false&zeroDateTimeBehavior=convertToNull
-            username: ceshi
-            password: abc-123
+            url: jdbc:mysql://120.76.84.45:3306/kmall_pt?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8
+            username: tuser
+            password: Qq!123
+            hikari:
+                read-only: true
+                connection-timeout: 10000
+                validation-timeout: 5000
+                idle-timeout: 600000
+                max-lifetime: 1200000
+                maximum-pool-size: 3
+                minimum-idle: 3
+        three:
+            # 数据源zaxxer HikariCP
+            type: com.zaxxer.hikari.HikariDataSource
+            driver-class-name: org.mariadb.jdbc.Driver
+            url: jdbc:mysql://120.76.84.45:3306/oms_write?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true
+            username: tuser
+            password: Qq!123
             hikari:
                 read-only: true
                 connection-timeout: 10000
@@ -120,7 +135,7 @@ cus:
     play:
         wx:
             #微信公众ID
-            app-id: wx24013b34e349db3c
+            app-id: wxb6b30b1b14ee502a
             #微信支付商户号
             mch-id: 1501125641
             #财富通编号:
@@ -130,5 +145,5 @@ cus:
             #海关
             customs: SHENZHEN
             #地址
-            play-url: http://192.168.1.251:9999/wx/custom/wxCbPay
+            play-url: http://192.168.1.68:9999/wx/custom/wxCbPay
 

+ 22 - 3
src/main/resources/application.yml

@@ -59,6 +59,21 @@ spring:
                 max-lifetime: 1200000
                 maximum-pool-size: 3
                 minimum-idle: 3
+        three:
+            # 数据源zaxxer HikariCP
+            type: com.zaxxer.hikari.HikariDataSource
+            driver-class-name: org.mariadb.jdbc.Driver
+            url: jdbc:mysql://out-rm-wz9rps8173a1nx63gio.mysql.rds.aliyuncs.com:3306/oms_write?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true
+            username: out_qhm
+            password: r%4PEusOn&
+            hikari:
+                read-only: true
+                connection-timeout: 10000
+                validation-timeout: 5000
+                idle-timeout: 600000
+                max-lifetime: 1200000
+                maximum-pool-size: 3
+                minimum-idle: 3
 
     # 队列配置
     rabbitmq:
@@ -115,6 +130,12 @@ mybatis:
         mapper-locations: classpath:mybatis/mapper/wx/**/*.xml
         # SqlSessionFactoryBean搜索实体beans并注册别名, 多个以逗号分隔
         type-aliases-package: com.emato.ccnet.wx.dao.entity.wx
+    three:
+        # 加载MyBatis配置文件
+        config-location: classpath:mybatis/mybatis-config.xml
+        mapper-locations: classpath:mybatis/mapper/oms/**/*.xml
+        # SqlSessionFactoryBean搜索实体beans并注册别名, 多个以逗号分隔
+        type-aliases-package: com.emato.ccnet.wx.dao.entity.oms
 
 db:
 # 电子订单数据发送csp
@@ -160,8 +181,6 @@ cus:
     waybill:
         # e码头OMS系统
         emato-oms:
-        # 秘钥
-        secret-key: IxyIvP0sJqlUZinx
         # 地址 http://wstest.ds-bay.com/bds/order 店提
         shop-url: http://ws.ds-bay.com/al/shop/bdd/cb/order
         # 备货
@@ -179,7 +198,7 @@ cus:
     play:
         current: wx
         wx:
-            #微信公众ID
+            #中网微信公众ID
             app-id: wxb6b30b1b14ee502a
             #微信支付商户号
             mch-id: 1501125641

+ 28 - 0
src/main/resources/mybatis/mapper/oms/OmsMerchSecret.xml

@@ -0,0 +1,28 @@
+<?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="com.emato.ccnet.wx.dao.mapper.oms.MerchantSecretMapper" >
+  <resultMap id="merchantSecret" type="com.emato.ccnet.wx.dao.entity.oms.MerchantSecret" >
+    <id column="sec_sn" property="secSn" jdbcType="VARCHAR" />
+    <result column="merch_sn" property="merchSn" jdbcType="VARCHAR" />
+    <result column="merch_sec_type" property="merchSecType" jdbcType="VARCHAR" />
+    <result column="md5_salt" property="md5Salt" jdbcType="VARCHAR" />
+    <result column="merch_pub_key" property="merchPubKey" jdbcType="VARCHAR" />
+    <result column="merch_pri_key" property="merchPriKey" jdbcType="VARCHAR" />
+    <result column="emato_pub_key" property="ematoPubKey" jdbcType="VARCHAR" />
+    <result column="emato_pri_key" property="ematoPriKey" jdbcType="VARCHAR" />
+    <result column="is_valid" property="isValid" jdbcType="CHAR" />
+    <result column="creater_sn" property="createrSn" jdbcType="VARCHAR" />
+    <result column="create_time" property="createTime" jdbcType="TIMESTAMP" />
+    <result column="moder_sn" property="moderSn" jdbcType="VARCHAR" />
+    <result column="mod_time" property="modTime" jdbcType="TIMESTAMP" />
+    <result column="tstm" property="tstm" jdbcType="TIMESTAMP" />
+  </resultMap>
+  <!-- 获取运单数据-->
+  <select id="getSecretByMerchSn" parameterType="java.lang.String" resultMap="merchantSecret">
+    SELECT * FROM merchant_secret mo
+    <where>
+      mo.merch_sn = #{merchSn}
+    </where>
+  </select>
+
+</mapper>