From 9275c7950ea1c72edb028135695d993beae45240 Mon Sep 17 00:00:00 2001
From: RuicyWu <1063154311@qq.com>
Date: Thu, 21 May 2026 16:37:40 +0800
Subject: [PATCH] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E4=B8=8A=E4=BC=A0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
seeyon/WEB-INF/assetsmap/pluginCfg.xml | 6 +
seeyon/WEB-INF/assetsmap/spring/spring.xml | 7 +
.../apps/assetsmap/AssetsMapPlugin.java | 41 ++++
.../config/AssetsMapConfigProvider.java | 17 ++
.../constants/AssetsMapConstans.java | 27 +++
.../assetsmap/service/AssetsQueryService.java | 186 ++++++++++++++++++
.../seeyon/apps/assetsmap/vo/AssetsItem.java | 130 ++++++++++++
.../seeyon/apps/assetsmap/vo/RegionVo.java | 60 ++++++
.../assetsmap/AssetsRegionResources.java | 63 ++++++
src/test/Test.java | 7 +
10 files changed, 544 insertions(+)
create mode 100644 seeyon/WEB-INF/assetsmap/pluginCfg.xml
create mode 100644 seeyon/WEB-INF/assetsmap/spring/spring.xml
create mode 100644 src/main/java/com/seeyon/apps/assetsmap/AssetsMapPlugin.java
create mode 100644 src/main/java/com/seeyon/apps/assetsmap/config/AssetsMapConfigProvider.java
create mode 100644 src/main/java/com/seeyon/apps/assetsmap/constants/AssetsMapConstans.java
create mode 100644 src/main/java/com/seeyon/apps/assetsmap/service/AssetsQueryService.java
create mode 100644 src/main/java/com/seeyon/apps/assetsmap/vo/AssetsItem.java
create mode 100644 src/main/java/com/seeyon/apps/assetsmap/vo/RegionVo.java
create mode 100644 src/main/java/com/seeyon/ctp/rest/resources/assetsmap/AssetsRegionResources.java
create mode 100644 src/test/Test.java
diff --git a/seeyon/WEB-INF/assetsmap/pluginCfg.xml b/seeyon/WEB-INF/assetsmap/pluginCfg.xml
new file mode 100644
index 0000000..304a069
--- /dev/null
+++ b/seeyon/WEB-INF/assetsmap/pluginCfg.xml
@@ -0,0 +1,6 @@
+
+
+ assetsmap
+ 租赁资产地图
+ 20260411
+
diff --git a/seeyon/WEB-INF/assetsmap/spring/spring.xml b/seeyon/WEB-INF/assetsmap/spring/spring.xml
new file mode 100644
index 0000000..b3b8c1c
--- /dev/null
+++ b/seeyon/WEB-INF/assetsmap/spring/spring.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/java/com/seeyon/apps/assetsmap/AssetsMapPlugin.java b/src/main/java/com/seeyon/apps/assetsmap/AssetsMapPlugin.java
new file mode 100644
index 0000000..745e8bd
--- /dev/null
+++ b/src/main/java/com/seeyon/apps/assetsmap/AssetsMapPlugin.java
@@ -0,0 +1,41 @@
+package com.seeyon.apps.assetsmap;
+
+import com.seeyon.apps.assetsmap.constants.AssetsMapConstans;
+import com.seeyon.apps.common.plugin.api.APluginInfoApi;
+import com.seeyon.apps.common.plugin.vo.ConfigVo;
+
+public class AssetsMapPlugin extends APluginInfoApi {
+
+ public AssetsMapPlugin() {
+ }
+
+ public String getPluginId() {
+ return AssetsMapConstans.getPluginId();
+ }
+
+ public String getCreateUser() {
+ return "橙阳科技";
+ }
+
+ public String getDescription() {
+ return "租赁资产地图";
+ }
+
+ public ConfigVo getDefaultConfig() {
+ ConfigVo configVo = new ConfigVo();
+ AssetsMapConstans[] var2 = AssetsMapConstans.values();
+ int var3 = var2.length;
+
+ for(int var4 = 0; var4 < var3; ++var4) {
+ AssetsMapConstans value = var2[var4];
+ if (value != AssetsMapConstans.plugin) {
+ configVo.getDevParams().put(value.name(), value.getDefaultValue());
+ configVo.getProdParams().put(value.name(), value.getDefaultValue());
+ configVo.getParamMap().put(value.name(), value.getDescription());
+ }
+ }
+
+ return configVo;
+ }
+
+}
diff --git a/src/main/java/com/seeyon/apps/assetsmap/config/AssetsMapConfigProvider.java b/src/main/java/com/seeyon/apps/assetsmap/config/AssetsMapConfigProvider.java
new file mode 100644
index 0000000..ea387a3
--- /dev/null
+++ b/src/main/java/com/seeyon/apps/assetsmap/config/AssetsMapConfigProvider.java
@@ -0,0 +1,17 @@
+package com.seeyon.apps.assetsmap.config;
+
+import com.seeyon.apps.assetsmap.constants.AssetsMapConstans;
+import com.seeyon.apps.common.config.ICstConfigApi;
+import com.seeyon.apps.common.plugin.vo.ConfigVo;
+import com.seeyon.ctp.common.AppContext;
+
+
+public class AssetsMapConfigProvider {
+
+ protected ICstConfigApi cstConfigApi = (ICstConfigApi) AppContext.getBean("cstConfigApi");
+
+ public String getBizConfigByKey(AssetsMapConstans key) {
+ ConfigVo config = cstConfigApi.getConfig(AssetsMapConstans.getPluginId());
+ return config.getParamVal(key.name());
+ }
+}
diff --git a/src/main/java/com/seeyon/apps/assetsmap/constants/AssetsMapConstans.java b/src/main/java/com/seeyon/apps/assetsmap/constants/AssetsMapConstans.java
new file mode 100644
index 0000000..8f476bb
--- /dev/null
+++ b/src/main/java/com/seeyon/apps/assetsmap/constants/AssetsMapConstans.java
@@ -0,0 +1,27 @@
+package com.seeyon.apps.assetsmap.constants;
+
+public enum AssetsMapConstans {
+ plugin("assetsmap",""),
+ ASSETSFORMNO("assetsformno","资产表单"),
+ ;
+
+ private String defaultValue;
+ private String description;
+
+ AssetsMapConstans(String defaultValue,String description){
+ this.defaultValue = defaultValue;
+ this.description = description;
+ }
+
+ public String getDefaultValue() {
+ return defaultValue;
+ }
+
+ public String getDescription() {
+ return description;
+ }
+
+ public static String getPluginId() {
+ return plugin.defaultValue;
+ }
+}
diff --git a/src/main/java/com/seeyon/apps/assetsmap/service/AssetsQueryService.java b/src/main/java/com/seeyon/apps/assetsmap/service/AssetsQueryService.java
new file mode 100644
index 0000000..c1b577a
--- /dev/null
+++ b/src/main/java/com/seeyon/apps/assetsmap/service/AssetsQueryService.java
@@ -0,0 +1,186 @@
+package com.seeyon.apps.assetsmap.service;
+
+import com.seeyon.apps.assetsmap.config.AssetsMapConfigProvider;
+import com.seeyon.apps.assetsmap.constants.AssetsMapConstans;
+import com.seeyon.apps.assetsmap.vo.AssetsItem;
+import com.seeyon.apps.assetsmap.vo.RegionVo;
+import com.seeyon.ctp.common.AppContext;
+import com.seeyon.ctp.common.exceptions.BusinessException;
+import com.seeyon.ctp.organization.bo.V3xOrgDepartment;
+import com.seeyon.ctp.organization.manager.OrgManager;
+import com.seeyon.utils.form.*;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+public class AssetsQueryService {
+
+ private AssetsMapConfigProvider configProvider = (AssetsMapConfigProvider) AppContext.getBean("assetsMapConfigProvider");
+ private OrgManager orgManager = (OrgManager) AppContext.getBean("orgManager");
+
+ private String getFormNo(){
+ return configProvider.getBizConfigByKey(AssetsMapConstans.ASSETSFORMNO);
+ }
+
+ public List queryAllZoneAssets() throws Exception {
+ System.out.println("表单编码为:" + getFormNo());
+ TableContext tableContext = FormTableExecutor.master(getFormNo());
+ List formColumns = FormTableExecutor.query(tableContext,null, null, true);
+ List regionVos = new ArrayList<>();
+ System.out.println("查询出的数据条数:" + formColumns.size());
+ for (FormColumn formColumn : formColumns) {
+ Map fieldsMap = formColumn.getFieldsMap();
+ if(fieldsMap == null) {
+ continue;
+ }
+ upsertRegionVos(regionVos,fieldsMap);
+ }
+ return regionVos;
+ }
+
+ public void upsertRegionVos(List regionVos, Map fieldsMap) {
+
+ String latStr = (String) fieldsMap.get("纬度");
+ String lngStr = (String) fieldsMap.get("经度");
+
+ // 1️⃣ 经纬度必须有
+ if (StringUtils.isAnyBlank(latStr, lngStr)) {
+ return;
+ }
+
+ double lat = Double.parseDouble(latStr);
+ double lng = Double.parseDouble(lngStr);
+
+ String address = (String) fieldsMap.get("位置详情");
+ String owner = (String) fieldsMap.get("权属公司");
+
+ // 2️⃣ 地址 & 权属公司建议也做非空控制(关键!)
+ if (StringUtils.isAnyBlank(address)) {
+ return;
+ }
+
+ String assetId = getStringValue(fieldsMap,"id");
+ AssetsItem newAsset = buildAssetsItem(fieldsMap);
+ Long managerId = fieldsMap.get("运营单位") == null ? null : Long.parseLong(fieldsMap.get("运营单位") + "");
+ String deptName = getDeptName(managerId);
+ // 3️⃣ 查找区域
+ for (RegionVo regionVo : regionVos) {
+
+ // 3.1 经纬度必须存在
+ if (regionVo.getLat() == null || regionVo.getLng() == null) {
+ continue;
+ }
+
+ boolean sameLocation =
+ Double.compare(regionVo.getLat(), lat) == 0 &&
+ Double.compare(regionVo.getLng(), lng) == 0;
+
+ // 3.2 地址 & 权属公司必须非空才参与匹配
+ if (!sameLocation ||
+ StringUtils.isAnyBlank(regionVo.getAddress())) {
+ continue;
+ }
+
+ boolean sameAddress = address.equals(regionVo.getAddress());
+
+ if (sameAddress) {
+
+ // 4️⃣ 判断资产是否存在
+ boolean exists = regionVo.getAssets().stream()
+ .anyMatch(a -> a.getId().equals(assetId) );
+
+ if (!exists) {
+ regionVo.getAssets().add(newAsset);
+ }
+ return;
+ }
+ }
+
+ // 5️⃣ 新建区域(这里可以放心,因为关键字段都有值)
+ RegionVo newRegion = new RegionVo();
+ newRegion.setLat(lat);
+ newRegion.setLng(lng);
+ newRegion.setAddress(address);
+ newRegion.setOwner(owner);
+ newRegion.setManager(deptName);
+
+ List assets = new ArrayList<>();
+ assets.add(newAsset);
+ newRegion.setAssets(assets);
+
+ regionVos.add(newRegion);
+ }
+
+ private String getDeptName(Long deptId) {
+ if(deptId != null) {
+ try {
+ V3xOrgDepartment department = orgManager.getDepartmentById(deptId);
+ if(department != null) {
+ return department.getName();
+ }
+ }catch (Exception e) {
+
+ }
+ }
+ return null;
+ }
+
+ private AssetsItem buildAssetsItem(Map fieldsMap) {
+ AssetsItem assetsItem = new AssetsItem();
+ assetsItem.setId(getStringValue(fieldsMap,"id"));
+ assetsItem.setArea(fieldsMap.get("资产面积") == null ? null : Double.parseDouble(fieldsMap.get("资产面积") + ""));
+ assetsItem.setTenant(getStringValue(fieldsMap,"租户名称"));
+ assetsItem.setPurpose(getStringValue(fieldsMap,"资产用途"));
+ assetsItem.setRemark(getStringValue(fieldsMap,"备注"));
+ assetsItem.setOwner(getStringValue(fieldsMap,"权属单位"));
+ assetsItem.setAssetName(getStringValue(fieldsMap,"资产名称"));
+ assetsItem.setAddress(getStringValue(fieldsMap,"位置详情"));
+ String certNo = fieldsMap.get("权证号码") == null ? null : (String)fieldsMap.get("权证号码");
+// assetsItem.setManager(fieldsMap.get("运营单位") == null ? null : (String)fieldsMap.get("运营单位") + "");
+ Long managerId = fieldsMap.get("运营单位") == null ? null : Long.parseLong(fieldsMap.get("运营单位") + "");
+ assetsItem.setLat(getStringValue(fieldsMap,"纬度"));
+ assetsItem.setLng(getStringValue(fieldsMap,"经度"));
+ assetsItem.setManager(getDeptName(managerId));
+ assetsItem.setCertNo(certNo);
+ assetsItem.setStatus(getStringValue(fieldsMap,"资产状态"));
+ return assetsItem;
+ }
+
+ private String getStringValue(Map fieldsMap, String key) {
+ return fieldsMap.get(key) == null ? null : (String)fieldsMap.get(key);
+ }
+
+ public Integer countAssets(String type) throws BusinessException {
+ TableContext tableContext = FormTableExecutor.master(getFormNo());
+ List conditions = new ArrayList();
+ if(type == null || "0".equals(type)) {
+ conditions = null;
+ }
+ if("1".equals(type)) {
+ conditions.add(FormWhereCondition.build().display("资产状态").value(EnumMapUtils.getEnumItemValueByDisplayValue(tableContext.getTableBean(),"资产状态","已租")));
+ }
+ if("2".equals(type)) {
+ conditions.add(FormWhereCondition.build().display("资产状态").value(EnumMapUtils.getEnumItemValueByDisplayValue(tableContext.getTableBean(),"资产状态","待租")));
+ }
+ List formColumns = FormTableExecutor.query(tableContext,null, conditions, true);
+ return formColumns.size();
+ }
+
+ public List queryAssetsByKeyword(String keyword) throws BusinessException {
+ List conditions = new ArrayList();
+ if(StringUtils.isNotBlank(keyword)){
+ conditions.add(FormWhereCondition.build().display("位置详情").value(keyword).concatFactor(ClauseFactor.OR).clauseFactor(ClauseFactor.LIKE));
+ }
+ TableContext tableContext = FormTableExecutor.master(getFormNo());
+ List formColumns = FormTableExecutor.pageQuery(tableContext,null, conditions, 1,10,true);
+ List assetsItems = new ArrayList();
+ for (FormColumn formColumn : formColumns) {
+ AssetsItem assetsItem = buildAssetsItem(formColumn.getFieldsMap());
+ assetsItems.add(assetsItem);
+ }
+ return assetsItems;
+ }
+
+}
diff --git a/src/main/java/com/seeyon/apps/assetsmap/vo/AssetsItem.java b/src/main/java/com/seeyon/apps/assetsmap/vo/AssetsItem.java
new file mode 100644
index 0000000..72246f7
--- /dev/null
+++ b/src/main/java/com/seeyon/apps/assetsmap/vo/AssetsItem.java
@@ -0,0 +1,130 @@
+package com.seeyon.apps.assetsmap.vo;
+
+public class AssetsItem {
+ private String id;
+ private String assetName;
+ private Long regionId;
+ private String purpose;
+ private String tenant;
+ private Double area;
+ private String certNo;
+ private String owner;
+ private String remark;
+ private String status;
+ private String manager;
+ private String lng;
+ private String lat;
+ private String address;
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public Long getRegionId() {
+ return regionId;
+ }
+
+ public void setRegionId(Long regionId) {
+ this.regionId = regionId;
+ }
+
+ public String getPurpose() {
+ return purpose;
+ }
+
+ public void setPurpose(String purpose) {
+ this.purpose = purpose;
+ }
+
+ public String getTenant() {
+ return tenant;
+ }
+
+ public void setTenant(String tenant) {
+ this.tenant = tenant;
+ }
+
+ public Double getArea() {
+ return area;
+ }
+
+ public void setArea(Double area) {
+ this.area = area;
+ }
+
+ public String getCertNo() {
+ return certNo;
+ }
+
+ public void setCertNo(String certNo) {
+ this.certNo = certNo;
+ }
+
+ public String getManager() {
+ return manager;
+ }
+
+ public void setManager(String manager) {
+ this.manager = manager;
+ }
+
+ public String getOwner() {
+ return owner;
+ }
+
+ public void setOwner(String owner) {
+ this.owner = owner;
+ }
+
+ public String getRemark() {
+ return remark;
+ }
+
+ public void setRemark(String remark) {
+ this.remark = remark;
+ }
+
+ public String getStatus() {
+ return status;
+ }
+
+ public void setStatus(String status) {
+ this.status = status;
+ }
+
+ public String getLng() {
+ return lng;
+ }
+
+ public void setLng(String lng) {
+ this.lng = lng;
+ }
+
+ public String getLat() {
+ return lat;
+ }
+
+ public void setLat(String lat) {
+ this.lat = lat;
+ }
+
+ public String getAssetName() {
+ return assetName;
+ }
+
+ public void setAssetName(String assetName) {
+ this.assetName = assetName;
+ }
+
+ public String getAddress() {
+ return address;
+ }
+
+ public void setAddress(String address) {
+ this.address = address;
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/seeyon/apps/assetsmap/vo/RegionVo.java b/src/main/java/com/seeyon/apps/assetsmap/vo/RegionVo.java
new file mode 100644
index 0000000..ec50d42
--- /dev/null
+++ b/src/main/java/com/seeyon/apps/assetsmap/vo/RegionVo.java
@@ -0,0 +1,60 @@
+package com.seeyon.apps.assetsmap.vo;
+
+import java.util.List;
+
+public class RegionVo {
+ private String address;
+ private Double lat;
+ private Double lng;
+ private String owner;
+ private String manager;
+ private List assets;
+
+ public String getAddress() {
+ return address;
+ }
+
+ public void setAddress(String address) {
+ this.address = address;
+ }
+
+ public Double getLat() {
+ return lat;
+ }
+
+ public void setLat(Double lat) {
+ this.lat = lat;
+ }
+
+ public Double getLng() {
+ return lng;
+ }
+
+ public void setLng(Double lng) {
+ this.lng = lng;
+ }
+
+ public String getOwner() {
+ return owner;
+ }
+
+ public void setOwner(String owner) {
+ this.owner = owner;
+ }
+
+ public List getAssets() {
+ return assets;
+ }
+
+ public void setAssets(List assets) {
+ this.assets = assets;
+ }
+
+ public String getManager() {
+ return manager;
+ }
+
+ public void setManager(String manager) {
+ this.manager = manager;
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/seeyon/ctp/rest/resources/assetsmap/AssetsRegionResources.java b/src/main/java/com/seeyon/ctp/rest/resources/assetsmap/AssetsRegionResources.java
new file mode 100644
index 0000000..55165a6
--- /dev/null
+++ b/src/main/java/com/seeyon/ctp/rest/resources/assetsmap/AssetsRegionResources.java
@@ -0,0 +1,63 @@
+package com.seeyon.ctp.rest.resources.assetsmap;
+
+import cn.hutool.log.Log;
+import com.alibaba.fastjson.JSONObject;
+import com.seeyon.apps.assetsmap.service.AssetsQueryService;
+import com.seeyon.ctp.common.AppContext;
+import com.seeyon.ctp.rest.resources.BaseResource;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.ws.rs.*;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.Response;
+
+@Path("/assetsRegion")
+@Produces({"application/json", "application/xml"})
+public class AssetsRegionResources extends BaseResource {
+
+ private static final Log log = Log.get(AssetsRegionResources.class);
+ private AssetsQueryService assetsQueryService = (AssetsQueryService) AppContext.getBean("assetsQueryService");
+
+
+ @POST
+ @Path("/getall")
+ @Produces({"application/json"})
+ @Consumes({"application/json"})
+ public Response queryAllRegions(){
+ try {
+ return success(assetsQueryService.queryAllZoneAssets());
+ }catch (Exception e) {
+ log.error(e.getMessage(),e);
+ e.printStackTrace();
+ return fail("查询失败:" + e.getMessage());
+ }
+ }
+
+ @POST
+ @Path("/search")
+ @Produces({"application/json"})
+ @Consumes({"application/json"})
+ public Response search(JSONObject params) {
+ try {
+ return this.success(this.assetsQueryService.queryAssetsByKeyword(params.getString("keyword")));
+ } catch (Exception e) {
+ log.error(e.getMessage(), new Object[]{e});
+ e.printStackTrace();
+ return this.fail("查询失败:" + e.getMessage());
+ }
+ }
+
+ @Path("/countAssets")
+ @GET
+ @Produces({"application/json"})
+ public Response countAssets(@Context HttpServletRequest request){
+ try {
+ String type = request.getParameter("type");
+ return success(assetsQueryService.countAssets(type));
+ }catch (Exception e) {
+ log.error(e.getMessage(),e);
+ e.printStackTrace();
+ return fail("查询失败:" + e.getMessage());
+ }
+ }
+}
diff --git a/src/test/Test.java b/src/test/Test.java
new file mode 100644
index 0000000..47e5e35
--- /dev/null
+++ b/src/test/Test.java
@@ -0,0 +1,7 @@
+import com.seeyon.apps.assetsmap.AssetsMapPlugin;
+
+public class Test {
+ public static void main(String[] args) {
+ AssetsMapPlugin assetsMapPlugin = new AssetsMapPlugin();
+ }
+}