Переглянути джерело

Merge branch 'V0.0.2' of http://10.87.10.227:4000/jzyd_yyds/soc into V0.0.2

jiawuxian 2 роки тому
батько
коміт
c9714bf721
14 змінених файлів з 100 додано та 94 видалено
  1. 5 0
      project_data/sql/0.0.2/soc/soc.sql
  2. 2 4
      soc-common/soc-common-core/src/main/java/com/xunmei/common/core/domain/panel/dto/PanelListDto.java
  3. 0 1
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/access/service/impl/TMonitoringRetrievalPlanServiceImpl.java
  4. 12 6
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/drill/service/impl/CoreDrillTaskServiceImpl.java
  5. 8 8
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/edu/service/impl/CoreEduTrainingTaskServiceImpl.java
  6. 3 13
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/panel/service/impl/PanelServiceImpl.java
  7. 0 5
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/retrieval/service/impl/CoreMonitoringRetrievalTaskServiceImpl.java
  8. 19 52
      soc-modules/soc-modules-core/src/main/resources/mapper/drill/CoreDrillTaskMapper.xml
  9. 21 0
      soc-modules/soc-modules-system/src/main/java/com/xunmei/system/controller/SysNfcBindController.java
  10. 3 2
      soc-modules/soc-modules-system/src/main/java/com/xunmei/system/domain/SysNfcBind.java
  11. 2 2
      soc-modules/soc-modules-system/src/main/java/com/xunmei/system/mapper/SysNfcBindMapper.java
  12. 2 1
      soc-modules/soc-modules-system/src/main/java/com/xunmei/system/service/ISysNfcBindService.java
  13. 14 0
      soc-modules/soc-modules-system/src/main/java/com/xunmei/system/service/impl/SysNfcBindServiceImpl.java
  14. 9 0
      soc-modules/soc-modules-system/src/main/resources/mapper/system/SysNfcBindMapper.xml

+ 5 - 0
project_data/sql/0.0.2/soc/soc.sql

@@ -989,6 +989,11 @@ IF
 
 	END IF;
 	IF
+NOT EXISTS ( SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE  table_schema = DATABASE () and TABLE_NAME = 'sys_nfc_bind' AND COLUMN_NAME = 'source' ) THEN
+ALTER TABLE sys_nfc_bind ADD COLUMN source VARCHAR ( 2 ) COMMENT '来源1web端2app';
+
+END IF;
+	IF
 		EXISTS ( SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema = DATABASE () and  TABLE_NAME = 'sys_area_check' AND COLUMN_NAME = 'area_id' ) THEN
 			ALTER TABLE sys_area_check DROP COLUMN area_id;
 

+ 2 - 4
soc-common/soc-common-core/src/main/java/com/xunmei/common/core/domain/panel/dto/PanelListDto.java

@@ -13,13 +13,11 @@ public class PanelListDto {
     private Long userId;
     private Long orgId;
     private String orgPath;
-
     private List<Long> roleIdList;
-
     private List<Integer> statusList;
-
-
     private Date startTime;
     private Date endTime;
 
+    private Integer orgType;
+
 }

+ 0 - 1
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/access/service/impl/TMonitoringRetrievalPlanServiceImpl.java

@@ -387,7 +387,6 @@ public class TMonitoringRetrievalPlanServiceImpl extends ServiceImpl<TMonitoring
             sysOrg.setPath(nowUserOrg.getPath());
             sysOrg.setType(Integer.valueOf(tMonitoringRetrievalPlan.getOrgType()));
             List<SysOrg> sysOrgs = remoteOrgService.listByParentIdAndType(sysOrg, SecurityConstants.INNER);
-            // List<TMonitoringRetrievalPlan> tMonitoringRetrievalPlans = new ArrayList<>();
             for (SysOrg s : sysOrgs) {
                 TMonitoringRetrievalPlan plan = new TMonitoringRetrievalPlan();
                 BeanUtils.copyProperties(tMonitoringRetrievalPlan, plan);

+ 12 - 6
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/drill/service/impl/CoreDrillTaskServiceImpl.java

@@ -151,11 +151,10 @@ public class CoreDrillTaskServiceImpl extends ServiceImpl<CoreDrillTaskMapper, C
         record.setStatusText(DrillDoStatus.getName(record.getStatus()));
 
         List<CoreDrillTaskToRole> coreDrillTaskToRoles = listMap.get(record.getId());
-        if (ObjectUtil.isEmpty(coreDrillTaskToRoles)) {
-            return;
+        if (ObjectUtil.isNotEmpty(coreDrillTaskToRoles)) {
+            record.setTaskRoleList(coreDrillTaskToRoles);
+            record.setTaskRoleNameList(coreDrillTaskToRoles.stream().map(CoreDrillTaskToRole::getRoleName).collect(Collectors.joining(",")));
         }
-        record.setTaskRoleList(coreDrillTaskToRoles);
-        record.setTaskRoleNameList(coreDrillTaskToRoles.stream().map(CoreDrillTaskToRole::getRoleName).collect(Collectors.joining(",")));
         //状态 != 待执行才存在相关用户信息
         if (!record.getStatus().equals(DrillDoStatus.WAIT_RECORDED.getCode())) {
             List<CoreDrillTaskToUser> userList = taskToUserMapper.selectList(new LambdaQueryWrapper<CoreDrillTaskToUser>()
@@ -845,16 +844,23 @@ public class CoreDrillTaskServiceImpl extends ServiceImpl<CoreDrillTaskMapper, C
     public List<PanelListVo> selectCurUserTaskList(PanelListDto panelListDto) {
         SysOrg sysOrg = RemoteCallHandlerExecutor.executeRemoteCall(() ->
                 orgService.selectSysOrgById(panelListDto.getOrgId(), SecurityConstants.FROM_SOURCE), ErrorMsgConstants.QUERY_ORG_DATA_ERROR);
+        panelListDto.setOrgType(sysOrg.getType());
+        panelListDto.setOrgPath(sysOrg.getPath());
         List<Integer> statusList = new ArrayList<>();
         Collections.addAll(statusList, 0, 1);
         List<PanelListVo> list = coreDrillTaskMapper.selectCurUserTaskList(panelListDto, statusList);
         dealListData(list, panelListDto.getUserId());
-        if (!OrgTypeEnum.YINGYE_WANGDIAN.getCode().equals(sysOrg.getType())) {
-            panelListDto.setOrgPath(sysOrg.getPath());
+        //省联社/办事处或行社
+        if (OrgTypeEnum.HANG_SHE.getCode().equals(sysOrg.getType()) ||
+                OrgTypeEnum.BAN_SHI_CHU.getCode().equals(sysOrg.getType()) ||
+                OrgTypeEnum.SHEGN_LIAN_SHE.getCode().equals(sysOrg.getType())) {
+
             //查询待评价数据
             List<PanelListVo> list2 = coreDrillTaskMapper.selectWaitEvaluateTaskList(panelListDto);
             list2.removeIf(item -> DateUtil.compare(new Date(), item.getEndTime()) > 0);
             list.addAll(list2);
+
+
         }
 
         list.forEach(item -> {

+ 8 - 8
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/edu/service/impl/CoreEduTrainingTaskServiceImpl.java

@@ -142,13 +142,13 @@ public class CoreEduTrainingTaskServiceImpl extends ServiceImpl<CoreEduTrainingT
         IPage<CoreEduTrainingTaskPageVo> pageData = coreEduTrainingTaskMapper.selectPageData(request.getPageRequest(), request);
         if (ObjectUtil.isNotEmpty(pageData.getRecords())) {
             pageData.getRecords().sort(getComparator());
-            List<Long> idList = pageData.getRecords().stream().map(CoreEduTrainingTaskPageVo::getId).collect(Collectors.toList());
+           /* List<Long> idList = pageData.getRecords().stream().map(CoreEduTrainingTaskPageVo::getId).collect(Collectors.toList());
             List<CoreEduTrainingTaskToRole> roleList = taskToRoleMapper.selectList(new LambdaQueryWrapper<CoreEduTrainingTaskToRole>()
                     .in(CoreEduTrainingTaskToRole::getEduTrainingTaskId, idList));
-            Map<Long, List<CoreEduTrainingTaskToRole>> listMap = roleList.stream().collect(Collectors.groupingBy(CoreEduTrainingTaskToRole::getEduTrainingTaskId));
+            Map<Long, List<CoreEduTrainingTaskToRole>> listMap = roleList.stream().collect(Collectors.groupingBy(CoreEduTrainingTaskToRole::getEduTrainingTaskId));*/
             final List<CoreEduTrainingTaskPageVo> records = pageData.getRecords();
             for (CoreEduTrainingTaskPageVo record : records) {
-                dealData(record, records, listMap);
+                dealData(record, records, null);
             }
         }
         //抓换为TableDataInfo适配前端
@@ -182,12 +182,12 @@ public class CoreEduTrainingTaskServiceImpl extends ServiceImpl<CoreEduTrainingT
         //record.setTypeText(EduTrainingType.getName(record.getType()));
         record.setStatusText(EduTrainingDoStatus.getName(record.getStatus()));
 
-        List<CoreEduTrainingTaskToRole> coreEduTrainingTaskToRoles = listMap.get(record.getId());
-        if (ObjectUtil.isEmpty(coreEduTrainingTaskToRoles)) {
-            return;
-        }
-        record.setTaskRoleList(coreEduTrainingTaskToRoles);
+       /* List<CoreEduTrainingTaskToRole> coreEduTrainingTaskToRoles = listMap.get(record.getId());
+        if (ObjectUtil.isNotEmpty(coreEduTrainingTaskToRoles)) {
+           record.setTaskRoleList(coreEduTrainingTaskToRoles);
         record.setTaskRoleNameList(coreEduTrainingTaskToRoles.stream().map(CoreEduTrainingTaskToRole::getRoleName).collect(Collectors.joining(",")));
+        }*/
+
         List<CoreEduTrainingTaskToUser> userList = taskToUserMapper.selectList(new LambdaQueryWrapper<CoreEduTrainingTaskToUser>()
                 .eq(CoreEduTrainingTaskToUser::getEduTrainingTaskId, record.getId()));
         int signNums = (int) userList.stream().filter(user -> user.getSign() == 1 && ObjectUtil.equal(user.getType(), 1)).count();

+ 3 - 13
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/panel/service/impl/PanelServiceImpl.java

@@ -99,18 +99,6 @@ public class PanelServiceImpl implements PanelService {
         CompletableFuture<List<PanelListVo>> eduTrainingTaskFuture = CompletableFuture.supplyAsync(() ->
              eduTrainingTaskService.selectCurUserTaskList(panelListDto)
         );
-      /*  List<PanelListVo> resumptionTaskResult = resumptionTaskFuture.get(TIMEOUT, TimeUnit.SECONDS);
-
-        List<PanelListVo> protectionTaskResult = protectionTaskFuture.get(TIMEOUT, TimeUnit.SECONDS);
-        List<PanelListVo> monitorTaskResult = monitorTaskFuture.get(TIMEOUT, TimeUnit.SECONDS);
-        List<PanelListVo> safetyTaskResult = safetyTaskFuture.get(TIMEOUT, TimeUnit.SECONDS);
-        List<PanelListVo> drillTaskResult = drillTaskFuture.get(TIMEOUT, TimeUnit.SECONDS);
-        List<PanelListVo> eduTrainingTaskResult = eduTrainingTaskFuture.get(TIMEOUT, TimeUnit.SECONDS);
-        dealResult(resumptionTaskResult,protectionTaskResult,monitorTaskResult,safetyTaskResult,drillTaskResult,eduTrainingTaskResult);
-        List<PanelListVo> resultList = Stream.of(resumptionTaskResult, protectionTaskResult, monitorTaskResult, safetyTaskResult, drillTaskResult, eduTrainingTaskResult)
-                .flatMap(Collection::stream)
-                .collect(Collectors.toList());*/
-
         CompletableFuture<Void> allQueries = CompletableFuture.allOf(
                 resumptionTaskFuture, protectionTaskFuture, monitorTaskFuture,
                 safetyTaskFuture, drillTaskFuture, eduTrainingTaskFuture
@@ -125,7 +113,9 @@ public class PanelServiceImpl implements PanelService {
                 .flatMap(Collection::stream)
                 .collect(Collectors.toList());
         //将resultList根据type字段分组,并排序
-        Map<Integer, List<PanelListVo>> listMap = resultList.stream().sorted(Comparator.comparing(PanelListVo::getType)).collect(Collectors.groupingBy(PanelListVo::getType));
+        Map<Integer, List<PanelListVo>> listMap = resultList.stream()
+                .sorted(Comparator.comparing(PanelListVo::getType))
+                .collect(Collectors.groupingBy(PanelListVo::getType));
         List<PanelResultVo> list = new ArrayList<PanelResultVo>();
         for (Integer type : listMap.keySet()) {
             PanelResultVo vo = new PanelResultVo();

+ 0 - 5
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/retrieval/service/impl/CoreMonitoringRetrievalTaskServiceImpl.java

@@ -510,11 +510,6 @@ public class CoreMonitoringRetrievalTaskServiceImpl extends ServiceImpl<CoreMoni
             dateRange = DateUtils.getStartAndEnd(dateTime, EduTrainingPlanCycleEnum.toCommmonEnum(Integer.parseInt(plan.getPlanCycle())));
         }
         Map<Integer, DateRange> dateRanges = DateUtils.splitDateRange(dateRange.getStartTime(), dateRange.getEndTime(), plan.getPlanFrequency().intValue());
-        for (int i = 1; i <= plan.getPlanFrequency(); i++) {
-            DateRange dateRange1 = dateRanges.get(i);
-            CoreMonitoringRetrievalTask task = this.buildCoreMonitoringRetrievalTask(batchNum, i, plan, sysOrg, dateRange1, ymd);
-            taskList.add(task);
-        }
         //判断作息(无周期排开)
         if(!plan.getPlanCycle().equals(RetrievalTaskCycle.NOCYCLE.getCode().toString())){
             boolean flag = checkWorkTime(dateRange.getStartTime(), dateRange.getEndTime(), sysOrg.getId());

+ 19 - 52
soc-modules/soc-modules-core/src/main/resources/mapper/drill/CoreDrillTaskMapper.xml

@@ -85,23 +85,7 @@
             <if test="request.status != null">
                 and t.status=#{request.status}
             </if>
-            <if test="request.startTime != null and request.endTime != null">
-                and (
-                (
-                #{request.startTime}   <![CDATA[<=]]> t.start_date
-                and #{request.endTime}     <![CDATA[>=]]> t.start_date
-                )
-                or
-                (
-                #{request.startTime}   <![CDATA[<=]]> t.end_date
-                and #{request.endTime}     <![CDATA[>=]]> t.end_date
-                )
-                or (
-                #{request.startTime}   <![CDATA[>=]]> t.start_date
-                and #{request.endTime}     <![CDATA[<=]]> t.end_date
-                )
-                )
-            </if>
+            <include refid="timeRangeSql"/>
         </where>
         order by t.update_time desc
     </select>
@@ -216,23 +200,7 @@
             #{item}
         </foreach>
         and t.org_path like concat(#{request.orgPath},'%')
-        <if test="request.startTime != null and request.endTime != null">
-            and (
-            (
-            #{request.startTime}   <![CDATA[<=]]> t.start_date
-            and #{request.endTime}     <![CDATA[>=]]> t.start_date
-            )
-            or
-            (
-            #{request.startTime}   <![CDATA[<=]]> t.end_date
-            and #{request.endTime}     <![CDATA[>=]]> t.end_date
-            )
-            or (
-            #{request.startTime}   <![CDATA[>=]]> t.start_date
-            and #{request.endTime}     <![CDATA[<=]]> t.end_date
-            )
-            )
-        </if>
+        <include refid="timeRangeSql"/>
     </select>
     <sql id="recTaskListPage">
         <if test="request.orgPath !=null and request.orgPath != ''">
@@ -285,7 +253,13 @@
         <foreach collection="request.roleIdList" item="roleId" open="(" separator="," close=")">
             #{roleId}
         </foreach>
-        and t.status in (0,1,2)
+        and t.status in
+        <foreach collection="list" item="status" open="(" separator="," close=")">
+            #{status}
+        </foreach>
+        <include refid="timeRangeSql"/>
+    </select>
+    <sql id="timeRangeSql">
         <if test="request.startTime != null and request.endTime != null">
             and (
             (
@@ -303,30 +277,23 @@
             )
             )
         </if>
-    </select>
+    </sql>
 
     <select id="selectWaitEvaluateTaskList" resultType="com.xunmei.common.core.domain.panel.vo.PanelListVo">
         select distinct t.id as id, title as taskName,t.start_date startTime,t.end_date as endTime,t.status
         from core_drill_task t
         where t.status =2
         and t.org_path like concat(#{request.orgPath},'%')
-        <if test="request.startTime != null and request.endTime != null">
-            and (
-            (
-            #{request.startTime}   <![CDATA[<=]]> t.start_date
-            and #{request.endTime}     <![CDATA[>=]]> t.start_date
-            )
-            or
-            (
-            #{request.startTime}   <![CDATA[<=]]> t.end_date
-            and #{request.endTime}     <![CDATA[>=]]> t.end_date
-            )
-            or (
-            #{request.startTime}   <![CDATA[>=]]> t.start_date
-            and #{request.endTime}     <![CDATA[<=]]> t.end_date
-            )
-            )
+        <if test="request.orgType =3">
+            or (t.rec_status=0)
+        </if>
+        <if test="request.orgType =2">
+            or (t.rec_status=2)
+        </if>
+        <if test="request.orgType =2">
+            or (t.rec_status=4)
         </if>
+        <include refid="timeRangeSql"/>
     </select>
 
     <update id="updateTaskStatus">

+ 21 - 0
soc-modules/soc-modules-system/src/main/java/com/xunmei/system/controller/SysNfcBindController.java

@@ -1,6 +1,7 @@
 package com.xunmei.system.controller;
 
 import java.util.List;
+
 import com.xunmei.system.api.domain.SysArea;
 import com.xunmei.system.domain.SysAreaCheck;
 import com.xunmei.system.service.ISysAreaCheckService;
@@ -52,6 +53,15 @@ public class SysNfcBindController extends BaseController {
         return sysNfcBindService.selectPage(sysNfcBind);
     }
 
+    /**
+     * 获取【请填写功能名称】详细信息
+     */
+    @ApiOperation(value = "获取SysNfcBind详细信息")
+    @RequiresPermissions("system:bind:query")
+    @GetMapping(value = {"/appGetInfo", "/{code}"})
+    public AjaxResult appGetInfo(@PathVariable(value = "code", required = false) String code) {
+        return success(sysNfcBindService.selectSysNfcBindByCode(code));
+    }
 
     /**
      * 获取【请填写功能名称】详细信息
@@ -106,4 +116,15 @@ public class SysNfcBindController extends BaseController {
     public AjaxResult remove(@PathVariable Long[] ids) {
         return toAjax(sysNfcBindService.deleteSysNfcBindByIds(ids));
     }
+
+    /**
+     * 解绑【请填写功能名称】
+     */
+    @ApiOperation(value = "解绑")
+    @RequiresPermissions("system:bind:remove")
+    @Log(title = "【请填写功能名称】", businessType = BusinessType.DELETE)
+    @DeleteMapping("/unbinding/{code}")
+    public AjaxResult unbinding(@PathVariable String code) {
+        return toAjax(sysNfcBindService.deleteSysNfcBindByCode(code));
+    }
 }

+ 3 - 2
soc-modules/soc-modules-system/src/main/java/com/xunmei/system/domain/SysNfcBind.java

@@ -57,7 +57,7 @@ public class SysNfcBind extends BaseEntity {
      */
     @ApiModelProperty(value = "标签编号")
     private String code;
-    @ApiModelProperty(value = "标签名称")
+    @ApiModelProperty(value = "标签名称,app没有不传")
     private String labelName;
 
     /**
@@ -65,7 +65,8 @@ public class SysNfcBind extends BaseEntity {
      */
     @ApiModelProperty(value = "最后修改人id")
     private Long updateId;
-
+    @ApiModelProperty(value = "来源1web端2app")
+private String source;
     /**
      * 机构
      */

+ 2 - 2
soc-modules/soc-modules-system/src/main/java/com/xunmei/system/mapper/SysNfcBindMapper.java

@@ -40,7 +40,7 @@ public interface SysNfcBindMapper extends BaseMapper<SysNfcBind> {
      * @return
      */
     Page<SysNfcBind> selectNFCPage(Page<SysNfcBind> page, @Param("info") SysNfcBind info);
-
+    SysNfcBind selectSysNfcBindByCode(String code);
     /**
      * 修改区域名称
      * @param sysNfcBind
@@ -69,7 +69,7 @@ public interface SysNfcBindMapper extends BaseMapper<SysNfcBind> {
      * @return 结果
      */
      int updateSysNfcBind(SysNfcBind sysNfcBind);
-
+    int deleteSysNfcBindByCode(String code);
     /**
      * 删除【请填写功能名称】
      *

+ 2 - 1
soc-modules/soc-modules-system/src/main/java/com/xunmei/system/service/ISysNfcBindService.java

@@ -22,6 +22,7 @@ public interface ISysNfcBindService extends IService<SysNfcBind> {
      */
     SysNfcBind selectSysNfcBindById(Long id);
 
+    SysNfcBind selectSysNfcBindByCode(String code);
     /**
      * 查询【NFC管理】列表
      *
@@ -53,7 +54,7 @@ public interface ISysNfcBindService extends IService<SysNfcBind> {
      * @return 结果
      */
     int deleteSysNfcBindByIds(Long[] ids);
-
+int deleteSysNfcBindByCode(String code);
     /**
      * 删除【NFC管理】信息
      *

+ 14 - 0
soc-modules/soc-modules-system/src/main/java/com/xunmei/system/service/impl/SysNfcBindServiceImpl.java

@@ -91,6 +91,11 @@ public class SysNfcBindServiceImpl extends ServiceImpl<SysNfcBindMapper, SysNfcB
         return sysNfcBindMapper.selectById(id);
     }
 
+    @Override
+    public SysNfcBind selectSysNfcBindByCode(String code) {
+        return sysNfcBindMapper.selectSysNfcBindByCode(code);
+    }
+
     /**
      * 查询【请填写功能名称】列表
      *
@@ -123,6 +128,10 @@ public class SysNfcBindServiceImpl extends ServiceImpl<SysNfcBindMapper, SysNfcB
         sysNfcBind.setUpdateTime(DateUtils.getNowDate());
         sysNfcBind.setCreateTime(DateUtils.getNowDate());
         sysNfcBind.setDelFlag("0");
+        sysNfcBind.setSource("1");
+        if(null==sysNfcBind.getCode()){
+            sysNfcBind.setSource("2");
+        }
         SysOrg sysOrg = sysOrgService.selectSysOrgById(sysNfcBind.getOrgId());
         if (null != sysOrg) {
             sysNfcBind.setOrgName(sysOrg.getShortName());
@@ -194,6 +203,11 @@ public class SysNfcBindServiceImpl extends ServiceImpl<SysNfcBindMapper, SysNfcB
 
     }
 
+    @Override
+    public int deleteSysNfcBindByCode(String code) {
+        return sysNfcBindMapper.deleteSysNfcBindByCode(code);
+    }
+
     /**
      * 删除【请填写功能名称】信息
      *

+ 9 - 0
soc-modules/soc-modules-system/src/main/resources/mapper/system/SysNfcBindMapper.xml

@@ -122,6 +122,9 @@
         </if>
         order by a.org_id,a.area_id,code
     </select>
+    <select id="selectSysNfcBindByCode" resultType="com.xunmei.system.domain.SysNfcBind">
+        SELECT * FROM sys_nfc_bind WHERE source=2 AND code=#{code}
+    </select>
 
     <insert id="insertSysNfcBind" parameterType="com.xunmei.system.domain.SysNfcBind">
         insert into sys_nfc_bind
@@ -252,4 +255,10 @@
             #{id}
         </foreach>
     </delete>
+    <delete id="deleteSysNfcBindByCode">
+        delete
+        from sys_nfc_bind
+        where source = '2'
+          and code = #{code}
+    </delete>
 </mapper>