电子围栏 后端接口

master
guochaojie 5 months ago
parent 1baa0e1e2b
commit 9de3b259f8

@ -5,11 +5,11 @@ import jnpf.entity.StationAreaEntity;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
*
*
* V3.5
* https://www.jnpfsoft.com
* JNPF
* 2024-05-20
* 2024-05-21
*/
public interface StationAreaMapper extends BaseMapper<StationAreaEntity> {

@ -2,21 +2,23 @@ package jnpf.service;
import jnpf.model.stationarea.*;
import jnpf.entity.*;
import java.util.*;
import com.baomidou.mybatisplus.extension.service.IService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
/**
*
*
* V3.5
* https://www.jnpfsoft.com
* JNPF
* 2024-05-20
* 2024-05-21
*/
public interface StationAreaService extends IService<StationAreaEntity> {
List<StationAreaEntity> getList(StationAreaPagination stationAreaPagination);
List<StationAreaEntity> getTypeList(StationAreaPagination stationAreaPagination,String dataType);
List<StationAreaEntity> getTypeList(StationAreaPagination stationAreaPagination, String dataType);
StationAreaEntity getInfo(String id);
@ -28,8 +30,8 @@ public interface StationAreaService extends IService<StationAreaEntity> {
//子表方法
//副表数据方法
String checkForm(StationAreaForm form,int i);
String checkForm(StationAreaForm form, int i);
void saveOrUpdate(StationAreaForm stationAreaForm,String id, boolean isSave) throws Exception;
void saveOrUpdate(StationAreaForm stationAreaForm, String id, boolean isSave) throws Exception;
}

@ -32,11 +32,11 @@ import jnpf.base.UserInfo;
import jnpf.permission.entity.UserEntity;
/**
*
*
*
* V3.5
* https://www.jnpfsoft.com
* JNPF
* 2024-05-20
* 2024-05-21
*/
@Service
public class StationAreaServiceImpl extends ServiceImpl<StationAreaMapper, StationAreaEntity> implements StationAreaService{
@ -190,6 +190,35 @@ public class StationAreaServiceImpl extends ServiceImpl<StationAreaMapper, Stati
}
if(ObjectUtil.isNotEmpty(stationAreaPagination.getCompanyId())){
stationAreaNum++;
List<String> idList = new ArrayList<>();
try {
String[][] companyId = JsonUtil.getJsonToBean(stationAreaPagination.getCompanyId(),String[][].class);
for(int i=0;i<companyId.length;i++){
if(companyId[i].length>0){
idList.add(JsonUtil.getObjectToString(Arrays.asList(companyId[i])));
}
}
}catch (Exception e1){
try {
List<String> companyId = JsonUtil.getJsonToList(stationAreaPagination.getCompanyId(),String.class);
if(companyId.size()>0){
idList.add(JsonUtil.getObjectToString(companyId));
}
}catch (Exception e2){
idList.add(String.valueOf(stationAreaPagination.getCompanyId()));
}
}
stationAreaQueryWrapper.lambda().and(t->{
idList.forEach(tt->{
t.like(StationAreaEntity::getCompanyId, tt).or();
});
});
}
}
List<String> intersection = generaterSwapUtil.getIntersection(intersectionList);
if (total>0){

@ -1,44 +1,45 @@
package jnpf.controller;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jnpf.base.ActionResult;
import jnpf.base.UserInfo;
import jnpf.exception.DataException;
import jnpf.permission.entity.UserEntity;
import jnpf.service.*;
import jnpf.entity.*;
import jnpf.util.*;
import jnpf.model.stationarea.*;
import jnpf.base.vo.PageListVO;
import jnpf.base.vo.PaginationVO;
import jnpf.entity.StationAreaEntity;
import jnpf.model.stationarea.Position;
import jnpf.model.stationarea.StationAreaConstant;
import jnpf.model.stationarea.StationAreaForm;
import jnpf.model.stationarea.StationAreaPagination;
import jnpf.service.EnterpriserecyclestationService;
import jnpf.service.StationAreaService;
import jnpf.util.GeneraterSwapUtil;
import jnpf.util.JsonUtil;
import jnpf.util.StringUtil;
import jnpf.util.UserProvider;
import jnpf.utils.AreaUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import java.util.*;
import jnpf.annotation.JnpfField;
import jnpf.base.vo.PageListVO;
import jnpf.base.vo.PaginationVO;
import jnpf.base.vo.DownloadVO;
import jnpf.config.ConfigValueUtil;
import jnpf.base.entity.ProvinceEntity;
import java.io.IOException;
import java.util.stream.Collectors;
import jnpf.engine.entity.FlowTaskEntity;
import jnpf.exception.WorkFlowException;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
*
*
*
* @ V3.5
* @ https://www.jnpfsoft.com
* @ JNPF
* @ 2024-05-20
* @ 2024-05-21
*/
@Slf4j
@RestController
@Tag(name = "回收站电子围栏" , description = "scm")
@Tag(name = "商户经营区域", description = "scm")
@RequestMapping("/api/scm/StationArea")
public class StationAreaController {
@ -50,29 +51,30 @@ public class StationAreaController {
@Autowired
private StationAreaService stationAreaService;
@Autowired
private EnterpriserecyclestationService stationService;
/**
*
*
* @param stationAreaPagination
* @return
*/
*
*
* @param stationAreaPagination
* @return
*/
@Operation(summary = "获取列表")
@PostMapping("/getList")
public ActionResult list(@RequestBody StationAreaPagination stationAreaPagination)throws IOException{
List<StationAreaEntity> list= stationAreaService.getList(stationAreaPagination);
List<Map<String, Object>> realList=new ArrayList<>();
public ActionResult list(@RequestBody StationAreaPagination stationAreaPagination) throws IOException {
List<StationAreaEntity> list = stationAreaService.getList(stationAreaPagination);
List<Map<String, Object>> realList = new ArrayList<>();
for (StationAreaEntity entity : list) {
Map<String, Object> stationAreaMap=JsonUtil.entityToMap(entity);
stationAreaMap.put("id", stationAreaMap.get("id"));
//副表数据
//子表数据
Map<String, Object> stationAreaMap = JsonUtil.entityToMap(entity);
stationAreaMap.put("id", stationAreaMap.get("id"));
//副表数据
//子表数据
realList.add(stationAreaMap);
}
//数据转换
realList = generaterSwapUtil.swapDataList(realList, StationAreaConstant.getFormData(), StationAreaConstant.getColumnData(), stationAreaPagination.getModuleId(),false);
realList = generaterSwapUtil.swapDataList(realList, StationAreaConstant.getFormData(), StationAreaConstant.getColumnData(), stationAreaPagination.getModuleId(), false);
//返回对象
PageListVO vo = new PageListVO();
@ -81,110 +83,164 @@ public class StationAreaController {
vo.setPagination(page);
return ActionResult.success(vo);
}
/**
*
*
* @param stationAreaForm
* @return
*/
*
*
* @param stationAreaForm
* @return
*/
@PostMapping()
@Operation(summary = "创建")
public ActionResult create(@RequestBody @Valid StationAreaForm stationAreaForm) {
String b = stationAreaService.checkForm(stationAreaForm,0);
if (StringUtil.isNotEmpty(b)){
return ActionResult.fail(b );
String b = stationAreaService.checkForm(stationAreaForm, 0);
if (StringUtil.isNotEmpty(b)) {
return ActionResult.fail(b);
}
try{
stationAreaService.saveOrUpdate(stationAreaForm, null ,true);
}catch(Exception e){
try {
stationAreaService.saveOrUpdate(stationAreaForm, null, true);
} catch (Exception e) {
return ActionResult.fail("新增数据失败");
}
return ActionResult.success("创建成功");
}
/**
*
* @param id
* @param stationAreaForm
* @return
*/
*
*
* @param id
* @param stationAreaForm
* @return
*/
@PutMapping("/{id}")
@Operation(summary = "更新")
public ActionResult update(@PathVariable("id") String id,@RequestBody @Valid StationAreaForm stationAreaForm,
@RequestParam(value = "isImport", required = false) boolean isImport){
public ActionResult update(@PathVariable("id") String id, @RequestBody @Valid StationAreaForm stationAreaForm,
@RequestParam(value = "isImport", required = false) boolean isImport) {
stationAreaForm.setId(id);
if (!isImport) {
String b = stationAreaService.checkForm(stationAreaForm,1);
if (StringUtil.isNotEmpty(b)){
return ActionResult.fail(b );
String b = stationAreaService.checkForm(stationAreaForm, 1);
if (StringUtil.isNotEmpty(b)) {
return ActionResult.fail(b);
}
}
StationAreaEntity entity= stationAreaService.getInfo(id);
if(entity!=null){
try{
stationAreaService.saveOrUpdate(stationAreaForm,id,false);
}catch(Exception e){
StationAreaEntity entity = stationAreaService.getInfo(id);
if (entity != null) {
try {
stationAreaService.saveOrUpdate(stationAreaForm, id, false);
} catch (Exception e) {
return ActionResult.fail("修改数据失败");
}
return ActionResult.success("更新成功");
}else{
} else {
return ActionResult.fail("更新失败,数据不存在");
}
}
/**
*
* @param id
* @return
*/
*
*
* @param id
* @return
*/
@Operation(summary = "删除")
@DeleteMapping("/{id}")
@Transactional
public ActionResult delete(@PathVariable("id") String id){
StationAreaEntity entity= stationAreaService.getInfo(id);
if(entity!=null){
public ActionResult delete(@PathVariable("id") String id) {
StationAreaEntity entity = stationAreaService.getInfo(id);
if (entity != null) {
//主表数据删除
stationAreaService.delete(entity);
}
return ActionResult.success("删除成功");
}
/**
* ()
* 使-
* @param id
* @return
*/
* ()
* 使-
*
* @param id
* @return
*/
@Operation(summary = "表单信息(详情页)")
@GetMapping("/detail/{id}")
public ActionResult detailInfo(@PathVariable("id") String id){
StationAreaEntity entity= stationAreaService.getInfo(id);
if(entity==null){
public ActionResult detailInfo(@PathVariable("id") String id) {
StationAreaEntity entity = stationAreaService.getInfo(id);
if (entity == null) {
return ActionResult.fail("表单数据不存在!");
}
Map<String, Object> stationAreaMap=JsonUtil.entityToMap(entity);
Map<String, Object> stationAreaMap = JsonUtil.entityToMap(entity);
stationAreaMap.put("id", stationAreaMap.get("id"));
//副表数据
//子表数据
stationAreaMap = generaterSwapUtil.swapDataDetail(stationAreaMap,StationAreaConstant.getFormData(),"560427626187981125",false);
stationAreaMap = generaterSwapUtil.swapDataDetail(stationAreaMap, StationAreaConstant.getFormData(), "560427626187981125", false);
return ActionResult.success(stationAreaMap);
}
/**
* ()
* 使-
* @param id
* @return
*/
* ()
* 使-
*
* @param id
* @return
*/
@Operation(summary = "信息")
@GetMapping("/{id}")
public ActionResult info(@PathVariable("id") String id){
StationAreaEntity entity= stationAreaService.getInfo(id);
if(entity==null){
public ActionResult info(@PathVariable("id") String id) {
StationAreaEntity entity = stationAreaService.getInfo(id);
if (entity == null) {
return ActionResult.fail("表单数据不存在!");
}
Map<String, Object> stationAreaMap=JsonUtil.entityToMap(entity);
Map<String, Object> stationAreaMap = JsonUtil.entityToMap(entity);
stationAreaMap.put("id", stationAreaMap.get("id"));
//副表数据
//子表数据
stationAreaMap = generaterSwapUtil.swapDataForm(stationAreaMap,StationAreaConstant.getFormData(),StationAreaConstant.TABLEFIELDKEY,StationAreaConstant.TABLERENAMES);
stationAreaMap = generaterSwapUtil.swapDataForm(stationAreaMap, StationAreaConstant.getFormData(), StationAreaConstant.TABLEFIELDKEY, StationAreaConstant.TABLERENAMES);
return ActionResult.success(stationAreaMap);
}
//判断点所属区域
@Operation(summary = "判断当前位置所属区域")
@PostMapping("")
public ActionResult isInArea(@RequestBody Position position) {
//获取所有站点
List<StationAreaEntity> result = new ArrayList<>();
List<StationAreaEntity> list = stationAreaService.getTypeList(new StationAreaPagination(), "1");
BigDecimal lat = position.getLat();//纬度
BigDecimal lng = position.getLng();//经度
for (StationAreaEntity entity : list) {
String mapInfo = entity.getAreaMapInfo();
boolean in = AreaUtil.isInsidePolygon(mapInfo, lat, lng);
if (in) {
result.add(entity);
}
}
if (result.size() > 0) {
return ActionResult.success(result);
} else return ActionResult.fail("当前所在位置不在任何区域中!");
}
@Operation(summary = "获取该位置绑定的回收站列表")
@PostMapping("")
public ActionResult getBindStation(@RequestBody Position position) {
//获取
StationAreaEntity stationArea = null;
List<StationAreaEntity> list = stationAreaService.getTypeList(new StationAreaPagination(), "1");
BigDecimal lat = position.getLat();//纬度
BigDecimal lng = position.getLng();//经度
for (StationAreaEntity entity : list) {
String mapInfo = entity.getAreaMapInfo();
boolean in = AreaUtil.isInsidePolygon(mapInfo, lat, lng);
if (in) {
stationArea = entity;
break;
}
}
if (stationArea != null) {
// todo 根据组织编号 获取回收站清单
return ActionResult.success(stationArea);
} else {
return ActionResult.fail("当前所在超出接单范围!");
}
}
}

@ -0,0 +1,164 @@
package jnpf.utils;
import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import jnpf.util.JsonUtil;
import java.math.BigDecimal;
import java.util.*;
/**
* <p>
* 线线线
* <p>
*
* <p>
* 1.使
* 2.线线
* 3.
* 4.线
* </p>
*
* @author guochaojie
* @version V1.0.0
* @date 202452109:49:29
* @description
*/
public class AreaUtil {
/**
*
*
* @param polygonStr [x1,y1,x2,y2,...]
* x1,y1
* @param lat
* @param lon
* @return
*/
public static boolean isInsidePolygonStr(String polygonStr, double lat, double lon) {
double[][] polygon = parsePolygonFromArray(polygonStr);
int j = polygon.length - 1; // 多边形最后一个点的索引
boolean oddNodes = false;
for (int i = 0; i < polygon.length; i++) {
if ((polygon[i][1] < lon && polygon[j][1] >= lon) // 检查点是否在多边形边的右侧
|| (polygon[j][1] < lon && polygon[i][1] >= lon)) { // 或在多边形边的左侧
if (polygon[i][0] + (lon - polygon[i][1]) / (polygon[j][1] - polygon[i][1])
* (polygon[j][0] - polygon[i][0]) < lat) { // 检查交点是否在线段上
oddNodes = !oddNodes; // 如果是,则翻转状态
}
}
j = i; // 移动到下一个边
}
return oddNodes; // 如果状态为true则点在多边形内
}
/**
*
*
* @param polygonStr
* @return
*/
public static double[][] parsePolygonFromArray(String polygonStr) {
// 移除可能的空格,并用逗号分割字符串`
String[] coordinatePairs = polygonStr.replaceAll(" ", "")
.replaceAll("\\[", "")
.replaceAll("\\]", "")
.split(",");
// 计算有多少个坐标对
int pairCount = coordinatePairs.length / 2;
double[][] polygon = new double[pairCount][2];
// 遍历坐标对数组,并填充二维数组
for (int i = 0, j = 0; i < coordinatePairs.length; i += 2, j++) {
// 将字符串转换为double
polygon[j][0] = Double.parseDouble(coordinatePairs[i]); // 纬度
polygon[j][1] = Double.parseDouble(coordinatePairs[i + 1]); // 经度
}
// 由于多边形应该是闭合的,通常我们需要复制第一个点作为最后一个点
// 判读最后一个点是否与第一个点相同
if (polygon[0][0] != polygon[pairCount - 1][0] && polygon[0][1] != polygon[pairCount - 1][1]) {
//追加一个点
polygon = Arrays.copyOf(polygon, polygon.length + 1);
polygon[pairCount] = new double[]{polygon[0][0], polygon[0][1]};
}
return polygon;
}
/**
* @param json
* @return
*/
public static List<Map<String, Object>> parsePolygonFromJson(String json) {
List<Map<String, Object>> list = JsonUtil.getJsonToListMap(json);
Map start = list.get(0);
Map end = list.get(list.size() - 1);
if (!start.equals(end)) {
list.add(start);
}
return list;
}
/**
* @param polygonJson
* @param lat
* @param lon
* @return
*/
public static boolean isInsidePolygon(String polygonJson, BigDecimal lat, BigDecimal lng) {
List<Map<String, Object>> polygon = parsePolygonFromJson(polygonJson);
boolean isInside = false;
for (int i = 0, j = polygon.size() - 1; i < polygon.size(); i++) {
Map<String, Object> vertex1 = polygon.get(i);
Map<String, Object> vertex2 = polygon.get(j);
// 转换BigDecimal为double进行计算
BigDecimal lat1 = (BigDecimal) vertex1.get("lat");
BigDecimal lng1 = (BigDecimal) vertex1.get("lng");
BigDecimal lat2 = (BigDecimal) vertex2.get("lat");
BigDecimal lng2 = (BigDecimal) vertex2.get("lng");
if (lng1.compareTo(lng) != 0 && lng2.compareTo(lng) != 0 && // 确保测试点的经度不在边段的端点上
lng.compareTo(lng1) * lng.compareTo(lng2) < 0) { // 确保测试点的经度在线段的两端点之间
// 计算交点纬度的估计值
BigDecimal numerator = lat2.subtract(lat1);
BigDecimal denominator = lng2.subtract(lng1);
BigDecimal latCross = lat1.add(numerator.multiply(lng.subtract(lng1)).divide(denominator, 20, BigDecimal.ROUND_HALF_UP));
// 检查测试点的纬度是否在边段的纬度范围内
if (lat.compareTo(latCross) <= 0 && latCross.compareTo(lat1) <= 0 || // 测试点在边段的下方或边段是水平的且测试点在边段上
lat.compareTo(latCross) >= 0 && latCross.compareTo(lat2) >= 0) { // 测试点在边段的上方或边段是水平的且测试点在边段上
// 如果没有交点(即边段是水平的或垂直的)或测试点正好在边段上,我们假设交点存在
// 因为这不会影响边的穿越数
isInside = !isInside;
} else if (lat.compareTo(latCross) < 0 && latCross.compareTo(lat1) > 0 && latCross.compareTo(lat2) < 0) {
// 测试点在边段的左上方
isInside = !isInside;
} else if (lat.compareTo(latCross) > 0 && latCross.compareTo(lat1) < 0 && latCross.compareTo(lat2) > 0) {
// 测试点在边段的右下方
isInside = !isInside;
}
}
j = i; // 移至下一个顶点
}
return isInside;
}
public static void main(String[] args) {
String json = "[{\"lat\":39.974765162066554,\"lng\":116.3056148240612},{\"lat\":39.97686980052487,\"lng\":116.41753216959114},{\"lat\":39.90896256376373,\"lng\":16.41821877318944},{\"lat\":39.90764586140172,\"lng\":116.31007778559433}]";
BigDecimal testLat = new BigDecimal(39.933711764440616);
BigDecimal testLng = new BigDecimal(116.3959039571746);
boolean isInside = isInsidePolygon(json, testLat, testLng);
System.out.println(isInside);
}
}

@ -9,14 +9,14 @@ import java.util.Date;
* @ V3.5
* @ https://www.jnpfsoft.com
* @ JNPF
* @ 2024-05-20
* @ 2024-05-21
*/
@Data
@TableName("nx_station_area")
public class StationAreaEntity {
@TableId(value ="ID" )
private String id;
@TableField(value = "STATION_CODE" , updateStrategy = FieldStrategy.IGNORED)
@TableField("STATION_CODE")
private String stationCode;
@TableField(value = "AREA_TYPE" , updateStrategy = FieldStrategy.IGNORED)
private Integer areaType;
@ -44,7 +44,7 @@ public class StationAreaEntity {
private String deleteMark;
@TableField("F_TENANT_ID")
private String tenantId;
@TableField("COMPANY_ID")
@TableField(value = "COMPANY_ID" , updateStrategy = FieldStrategy.IGNORED)
private String companyId;
@TableField("DEPARTMENT_ID")
private String departmentId;

@ -0,0 +1,14 @@
package jnpf.model.stationarea;
import lombok.Data;
import java.math.BigDecimal;
/**
*
*/
@Data
public class Position {
private BigDecimal lat;
private BigDecimal lng;
}

@ -6,11 +6,11 @@ import java.math.BigDecimal;
import com.fasterxml.jackson.annotation.JsonProperty;
/**
*
*
* @ V3.5
* @ https://www.jnpfsoft.com
* @ JNPF
* @ 2024-05-20
* @ 2024-05-21
*/
@Data
public class StationAreaForm {
@ -26,9 +26,9 @@ public class StationAreaForm {
/** 是否启用 **/
@JsonProperty("status")
private String status;
/** 站点编号 **/
@JsonProperty("stationCode")
private String stationCode;
/** 绑定商户 **/
@JsonProperty("companyId")
private Object companyId;
/** 地图信息 **/
@JsonProperty("areaMapInfo")
private String areaMapInfo;

@ -7,11 +7,11 @@ import java.util.List;
/**
*
*
*
* @ V3.5
* @ https://www.jnpfsoft.com
* @ JNPF
* @ 2024-05-20
* @ 2024-05-21
*/
@Data
public class StationAreaPagination extends Pagination {
@ -36,4 +36,7 @@ public class StationAreaPagination extends Pagination {
/** 是否启用 */
@JsonProperty("status")
private Object status;
/** 绑定商户 */
@JsonProperty("companyId")
private Object companyId;
}

Loading…
Cancel
Save