|  |  | 
 |  |  |         return iAdminMallTeamLeaderService.addFence(adminLeaderAddFenceDto); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 团长--在线 | 
 |  |  |      */ | 
 |  |  |     @GetMapping("startOnline/{id}") | 
 |  |  |     @ControllerEndpoint(operation = "团长--在线", exceptionMessage = "操作失败") | 
 |  |  |     public FebsResponse startOnline(@NotNull(message = "{required}") @PathVariable Long id) { | 
 |  |  |         return iAdminMallTeamLeaderService.startOnline(id); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 团长--离线 | 
 |  |  |      */ | 
 |  |  |     @GetMapping("closeOnline/{id}") | 
 |  |  |     @ControllerEndpoint(operation = "团长--离线", exceptionMessage = "操作失败") | 
 |  |  |     public FebsResponse closeOnline(@NotNull(message = "{required}") @PathVariable Long id) { | 
 |  |  |         return iAdminMallTeamLeaderService.closeOnline(id); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  | } | 
 
 |  |  | 
 |  |  |     private String bonusPercent; | 
 |  |  |  | 
 |  |  |     @TableField(exist = false) | 
 |  |  |     private int isOk; | 
 |  |  |     private Integer isOk; | 
 |  |  |     //在线状态 1:在线 2:离线 | 
 |  |  |     private Integer onlineState; | 
 |  |  |  | 
 |  |  | } | 
 
 |  |  | 
 |  |  |     FebsResponse closeProfit(Long id); | 
 |  |  |  | 
 |  |  |     FebsResponse addFence(AdminLeaderAddFenceDto adminLeaderAddFenceDto); | 
 |  |  |  | 
 |  |  |     FebsResponse startOnline(Long id); | 
 |  |  |  | 
 |  |  |     FebsResponse closeOnline(Long id); | 
 |  |  | } | 
 
 |  |  | 
 |  |  |     String fenceList(String gaodeKey,String serviceId,String fenceIds); | 
 |  |  |  | 
 |  |  |     String fenceDelete(String gaodeKey,String serviceId,String fenceId); | 
 |  |  |  | 
 |  |  |     String fenceToLocation(String gaodeKey,String serviceId,String locationLonglat,String fenceId); | 
 |  |  | } | 
 
 |  |  | 
 |  |  |         return new FebsResponse().success(); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     public FebsResponse startOnline(Long id) { | 
 |  |  |         MallTeamLeader mallTeamLeader = this.baseMapper.selectById(id); | 
 |  |  |         if(ObjectUtil.isEmpty(mallTeamLeader)){ | 
 |  |  |             return new FebsResponse().fail().message("团长信息不存在,刷新重试"); | 
 |  |  |         } | 
 |  |  |         Integer state = mallTeamLeader.getState(); | 
 |  |  |         if(1!=state){ | 
 |  |  |             return new FebsResponse().fail().message("目前还不是团长,无法操作"); | 
 |  |  |         } | 
 |  |  |         MallElectronicFence mallElectronicFence = mallElectronicFenceMapper.selectByTeamLeaderCode(mallTeamLeader.getUniqueCode()); | 
 |  |  |         if(ObjectUtil.isEmpty(mallElectronicFence)){ | 
 |  |  |             return new FebsResponse().fail().message("请先设置配送范围"); | 
 |  |  |         } | 
 |  |  |         mallTeamLeader.setOnlineState(1); | 
 |  |  |         this.baseMapper.updateById(mallTeamLeader); | 
 |  |  |         return new FebsResponse().success(); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     public FebsResponse closeOnline(Long id) { | 
 |  |  |         MallTeamLeader mallTeamLeader = this.baseMapper.selectById(id); | 
 |  |  |         if(ObjectUtil.isEmpty(mallTeamLeader)){ | 
 |  |  |             return new FebsResponse().fail().message("团长信息不存在,刷新重试"); | 
 |  |  |         } | 
 |  |  |         mallTeamLeader.setOnlineState(2); | 
 |  |  |         this.baseMapper.updateById(mallTeamLeader); | 
 |  |  |         return new FebsResponse().success(); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  | } | 
 
 |  |  | 
 |  |  |     private final DataDictionaryCustomMapper dataDictionaryCustomMapper; | 
 |  |  |     private final MallLeaderAchieveMapper mallLeaderAchieveMapper; | 
 |  |  |     private final IApiMallTeamLeaderService iApiMallTeamLeaderService; | 
 |  |  |     private final IMallElectronicFenceService iMallElectronicFenceService; | 
 |  |  |     private final MallElectronicFenceMapper mallElectronicFenceMapper; | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     @Transactional(rollbackFor = Exception.class) | 
 |  |  | 
 |  |  |         MallTeamLeader mallTeamLeader = mallTeamLeaderMapper.selectLeaderByUniqueCode(takeUniqueCode); | 
 |  |  |         if(ObjectUtil.isEmpty(mallTeamLeader)){ | 
 |  |  |             throw new FebsException("请重新选择团长"); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         //订单范围内才允许下单 | 
 |  |  |         MallAddressInfo address = mallAddressInfoMapper.selectAddressInfoByMemberIdAndId(member.getId(), addOrderDto.getAddressId()); | 
 |  |  |         MallElectronicFence mallElectronicFence = mallElectronicFenceMapper.selectByTeamLeaderCode(mallTeamLeader.getUniqueCode()); | 
 |  |  |         if(ObjectUtil.isNotEmpty(mallElectronicFence)){ | 
 |  |  |             String inStr = iMallElectronicFenceService.fenceToLocation(mallElectronicFence.getGKey(), | 
 |  |  |                     mallElectronicFence.getServiceId(), address.getLongitude() + "," + address.getLatitude(), mallElectronicFence.getGid()); | 
 |  |  |             if("1".equals(inStr)){ | 
 |  |  |                 throw new FebsException("不在当前团长的配送范围内"); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         String orderNo = MallUtils.getOrderNum(); | 
 |  |  | 
 |  |  |         } | 
 |  |  |         orderInfo.setAmount(total); | 
 |  |  |  | 
 |  |  |         MallAddressInfo address = mallAddressInfoMapper.selectAddressInfoByMemberIdAndId(member.getId(), addOrderDto.getAddressId()); | 
 |  |  |         orderInfo.setName(address.getName()); | 
 |  |  |         orderInfo.setPhone(address.getPhone()); | 
 |  |  |         orderInfo.setIsHome(addOrderDto.getIsHome()); | 
 
 |  |  | 
 |  |  |             return "fail"; | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     public String fenceToLocation(String gaodeKey, String serviceId, String locationLonglat, String fenceId) { | 
 |  |  |         String url = "https://tsapi.amap.com/v1/track/geofence/status/location"; | 
 |  |  |         HttpPost httpPost = new HttpPost(url); | 
 |  |  |         Map<String,String> map = new HashMap<>(); | 
 |  |  |         //高德Key | 
 |  |  |         //用户在高德地图官网申请Web服务API类型Key | 
 |  |  |         map.put("key",gaodeKey); | 
 |  |  |         //服务唯一编号 | 
 |  |  |         //sid为猎鹰service唯一编号 | 
 |  |  |         map.put("sid",serviceId); | 
 |  |  |         //指定坐标 | 
 |  |  |         //格式:x,y | 
 |  |  |         map.put("location",locationLonglat); | 
 |  |  |         //围栏的唯一标识 | 
 |  |  |         //支持一次传入多个,以","分割; | 
 |  |  |         //单次最多支持100个,如超出将只截取前100个作为输入。 | 
 |  |  |         map.put("gfids",fenceId); | 
 |  |  |         log.info("查询指定坐标与围栏关系"+JSON.toJSONString(map)); | 
 |  |  |         String result = null; | 
 |  |  |         try { | 
 |  |  |             result = HttpCurlUtil.sendGetHttp(url, map); | 
 |  |  |         } catch (IOException e) { | 
 |  |  |             e.printStackTrace(); | 
 |  |  |         } | 
 |  |  |         log.info("查询指定坐标与围栏关系"+result); | 
 |  |  |         cn.hutool.json.JSONObject maps = JSONUtil.parseObj(result); | 
 |  |  |         String errCode = maps.get("errcode").toString(); | 
 |  |  |         if("10000".equals(errCode)){ | 
 |  |  |             String dataStr = maps.get("data").toString(); | 
 |  |  |             cn.hutool.json.JSONObject dataResults = JSONUtil.parseObj(dataStr); | 
 |  |  |             String resultsStr = dataResults.get("results").toString(); | 
 |  |  |             cn.hutool.json.JSONObject resultsStrJson = JSONUtil.parseObj(resultsStr); | 
 |  |  |             String in = resultsStrJson.get("in").toString(); | 
 |  |  |             return in; | 
 |  |  |         }else{ | 
 |  |  |             return "fail"; | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  | } | 
 
 |  |  | 
 |  |  |     private String bonusPercent; | 
 |  |  |  | 
 |  |  |     private String longlatiarr; | 
 |  |  |  | 
 |  |  |     private Integer onlineState; | 
 |  |  | } | 
 
 |  |  | 
 |  |  |         ) AS distance | 
 |  |  |         from mall_team_leader a | 
 |  |  |         <where> | 
 |  |  |             a.state = 1 | 
 |  |  |             a.state = 1 and a.online_state = 1 | 
 |  |  |             <if test="record.query != null and record.query != ''"> | 
 |  |  |                 and (a.name like CONCAT('%', CONCAT(#{record.query}, '%')) | 
 |  |  |                     or a.phone like CONCAT('%', CONCAT(#{record.query}, '%')) | 
 
 |  |  | 
 |  |  |             //配送范围回显 | 
 |  |  |             // var pathPolygon = []; | 
 |  |  |             let fenceLongLat = leaderInfo.longlatiarr; | 
 |  |  |             let splitList = []; | 
 |  |  |             splitList = fenceLongLat.split(';'); | 
 |  |  |             if(splitList.length > 0){ | 
 |  |  |                 for(let splitIndex = 0;splitIndex < splitList.length-1;splitIndex++){ | 
 |  |  |                     let splitLngLat = splitList[splitIndex].split(','); | 
 |  |  |                     console.log(splitLngLat[0]); | 
 |  |  |                     console.log(splitLngLat[1]); | 
 |  |  |                     let lngLat = new AMap.LngLat(splitLngLat[0],splitLngLat[1]); | 
 |  |  |                     pathPolygon.push(lngLat) | 
 |  |  |             if(fenceLongLat != '' && fenceLongLat != null){ | 
 |  |  |                 let splitList = []; | 
 |  |  |                 splitList = fenceLongLat.split(';'); | 
 |  |  |                 if(splitList.length > 0){ | 
 |  |  |                     for(let splitIndex = 0;splitIndex < splitList.length-1;splitIndex++){ | 
 |  |  |                         let splitLngLat = splitList[splitIndex].split(','); | 
 |  |  |                         console.log(splitLngLat[0]); | 
 |  |  |                         console.log(splitLngLat[1]); | 
 |  |  |                         let lngLat = new AMap.LngLat(splitLngLat[0],splitLngLat[1]); | 
 |  |  |                         pathPolygon.push(lngLat) | 
 |  |  |                     } | 
 |  |  |                 } | 
 |  |  |                 var polygon = new AMap.Polygon({ | 
 |  |  |                     path: pathPolygon, | 
 |  |  |                     fillColor: '#00B2D5', // 多边形填充颜色 | 
 |  |  |                     fillOpacity : 0.5, // 多边形填充透明度,取值范围 [0,1] ,0表示完全透明,1表示不透明。默认为0.5 | 
 |  |  |                     strokeStyle : 'dashed', // 轮廓线样式,实线:solid,虚线:dashed | 
 |  |  |                     borderWeight: 2, // 线条宽度,默认为 1 | 
 |  |  |                     strokeColor: 'green', // 线条颜色 | 
 |  |  |                 }); | 
 |  |  |                 polygonClear = polygon; | 
 |  |  |                 map.add(polygon); | 
 |  |  |             } | 
 |  |  |             var polygon = new AMap.Polygon({ | 
 |  |  |                 path: pathPolygon, | 
 |  |  |                 fillColor: '#00B2D5', // 多边形填充颜色 | 
 |  |  |                 fillOpacity : 0.5, // 多边形填充透明度,取值范围 [0,1] ,0表示完全透明,1表示不透明。默认为0.5 | 
 |  |  |                 strokeStyle : 'dashed', // 轮廓线样式,实线:solid,虚线:dashed | 
 |  |  |                 borderWeight: 2, // 线条宽度,默认为 1 | 
 |  |  |                 strokeColor: 'green', // 线条颜色 | 
 |  |  |             }); | 
 |  |  |             polygonClear = polygon; | 
 |  |  |             map.add(polygon); | 
 |  |  |  | 
 |  |  |             form.val("user-addLeaderFence-form", { | 
 |  |  |                 "id": leaderInfo.id, | 
 
 |  |  | 
 |  |  |     <a lay-event="edit" shiro:hasPermission="user:update"><i | 
 |  |  |             class="layui-icon febs-edit-area febs-blue"></i></a> | 
 |  |  | </script> | 
 |  |  | <script type="text/html" id="onlineStateSwitch"> | 
 |  |  |     {{# if(d.onlineState === 1) { }} | 
 |  |  |     <input type="checkbox" value={{d.id}} lay-text="在线|离线" checked lay-skin="switch" lay-filter="onlineStateSwitch"> | 
 |  |  |     {{# } else { }} | 
 |  |  |     <input type="checkbox" value={{d.id}} lay-text="在线|离线" lay-skin="switch" lay-filter="onlineStateSwitch"> | 
 |  |  |     {{# } }} | 
 |  |  | </script> | 
 |  |  | <script type="text/html" id="upOrDownSwitch"> | 
 |  |  |     {{# if(d.profitSwitch === 1) { }} | 
 |  |  |     <input type="checkbox" value={{d.id}} lay-text="开启|关闭" checked lay-skin="switch" lay-filter="upOrDownSwitch"> | 
 |  |  | 
 |  |  |                     {field: 'addressArea', title: '自提点名称', minWidth: 150,align:'left'}, | 
 |  |  |                     {field: 'detailAddress', title: '自提点地址', minWidth: 150,align:'left'}, | 
 |  |  |                     {field: 'totalProfit', title: '收益', minWidth: 150,align:'left'}, | 
 |  |  |                     {field: 'onlineState', title: '在线状态', templet: '#onlineStateSwitch', minWidth: 100,align:'center'}, | 
 |  |  |                     {field: 'profitSwitch', title: '是否返利', templet: '#upOrDownSwitch', minWidth: 100,align:'center'}, | 
 |  |  |                     {field: 'bonusPercent', title: '返利比例', minWidth: 150,align:'left'}, | 
 |  |  |                     // {field: 'phone', title: '电话', minWidth: 150,align:'left'}, | 
 |  |  | 
 |  |  |             }); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         form.on('switch(onlineStateSwitch)', function (data) { | 
 |  |  |             if (data.elem.checked) { | 
 |  |  |                 startOnline(data.value); | 
 |  |  |             } else { | 
 |  |  |                 closeOnline(data.value); | 
 |  |  |             } | 
 |  |  |             $query.click(); | 
 |  |  |         }) | 
 |  |  |  | 
 |  |  |         function startOnline(id) { | 
 |  |  |             febs.get(ctx + 'admin/leader/startOnline/' + id, null, function () { | 
 |  |  |                 febs.alert.success('在线成功'); | 
 |  |  |                 $query.click(); | 
 |  |  |             }); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         function closeOnline(id) { | 
 |  |  |             febs.get(ctx + 'admin/leader/closeOnline/' + id, null, function () { | 
 |  |  |                 febs.alert.success('离线成功'); | 
 |  |  |                 $query.click(); | 
 |  |  |             }); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         form.on('switch(upOrDownSwitch)', function (data) { | 
 |  |  |             if (data.elem.checked) { | 
 |  |  |                 startProfit(data.value); |