TRX 1 год назад
Родитель
Сommit
240d719cde
25 измененных файлов с 402 добавлено и 141 удалено
  1. 1 1
      FullCardClient/src/main/java/com/zhongshu/card/client/model/devices/DeviceBindAreaParam.java
  2. 40 2
      FullCardClient/src/main/java/com/zhongshu/card/client/model/devices/DeviceInfoModel.java
  3. 4 1
      FullCardClient/src/main/java/com/zhongshu/card/client/model/devices/DeviceInfoSearch.java
  4. 3 0
      FullCardClient/src/main/java/com/zhongshu/card/client/model/org/OrganizationMiniModel.java
  5. 3 0
      FullCardClient/src/main/java/com/zhongshu/card/client/model/orgModel/OrgBindUserAllParam.java
  6. 0 1
      FullCardClient/src/main/java/com/zhongshu/card/client/model/projectAbout/ProjectExcelTemplateParam.java
  7. 19 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/controller/org/OrganizationUserController.java
  8. 1 10
      FullCardServer/src/main/java/com/zhongshu/card/server/core/controller/paySetting/ProjectChannelController.java
  9. 0 77
      FullCardServer/src/main/java/com/zhongshu/card/server/core/controller/projectAbout/PayChannelConfigController.java
  10. 1 1
      FullCardServer/src/main/java/com/zhongshu/card/server/core/controller/projectAbout/ProjectCommonConfigController.java
  11. 6 6
      FullCardServer/src/main/java/com/zhongshu/card/server/core/controller/projectAbout/ProjectExcelTemplateController.java
  12. 1 1
      FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/projectAbout/PayChannelConfigDao.java
  13. 3 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/projectAbout/UnionFrictionlessSettingDao.java
  14. 4 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/projectAbout/impl/PayChannelConfigDaoImpl.java
  15. 7 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/school/impl/DeviceInfoDaoImpl.java
  16. 3 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/domain/devices/DeviceInfo.java
  17. 42 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/domain/devices/DevicePermiss.java
  18. 13 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/service/base/SuperService.java
  19. 34 7
      FullCardServer/src/main/java/com/zhongshu/card/server/core/service/devices/DeviceInfoServiceImpl.java
  20. 152 4
      FullCardServer/src/main/java/com/zhongshu/card/server/core/service/org/OrganizationUserServiceImpl.java
  21. 9 5
      FullCardServer/src/main/java/com/zhongshu/card/server/core/service/orgManager/OrganizationManagerServiceImpl.java
  22. 26 21
      FullCardServer/src/main/java/com/zhongshu/card/server/core/service/paySetting/ProjectChannelConfigService.java
  23. 1 1
      FullCardServer/src/main/java/com/zhongshu/card/server/core/service/paySetting/UnionFrictionlessSettingService.java
  24. 2 3
      FullCardServer/src/main/java/com/zhongshu/card/server/core/service/projectAbout/ProjectExcelTemplateService.java
  25. 27 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/service/school/AreaServiceImpl.java

+ 1 - 1
FullCardClient/src/main/java/com/zhongshu/card/client/model/devices/DeviceBindAreaParam.java

@@ -23,6 +23,6 @@ public class DeviceBindAreaParam {
     private String areaId;
     private String areaId;
 
 
     @Schema(description = "所属机构信息")
     @Schema(description = "所属机构信息")
-    private String oid;
+    private String beLongOid;
 
 
 }
 }

+ 40 - 2
FullCardClient/src/main/java/com/zhongshu/card/client/model/devices/DeviceInfoModel.java

@@ -4,10 +4,12 @@ import com.github.microservice.models.type.DeviceType;
 import com.zhongshu.card.client.model.base.SuperModel;
 import com.zhongshu.card.client.model.base.SuperModel;
 import com.zhongshu.card.client.model.org.OrganizationMiniModel;
 import com.zhongshu.card.client.model.org.OrganizationMiniModel;
 import com.zhongshu.card.client.model.org.OrganizationSimpleModel;
 import com.zhongshu.card.client.model.org.OrganizationSimpleModel;
+import com.zhongshu.card.client.model.school.AreaModel;
 import com.zhongshu.card.client.type.DataState;
 import com.zhongshu.card.client.type.DataState;
 import com.zhongshu.card.client.type.OnLineState;
 import com.zhongshu.card.client.type.OnLineState;
 import io.swagger.v3.oas.annotations.media.Schema;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 import lombok.Data;
+import org.apache.commons.lang3.ObjectUtils;
 
 
 /**
 /**
  * @author TRX
  * @author TRX
@@ -52,9 +54,20 @@ public class DeviceInfoModel extends SuperModel {
     @Schema(description = "")
     @Schema(description = "")
     private OrganizationMiniModel organization;
     private OrganizationMiniModel organization;
 
 
-    private String organizationName;
+    @Schema(description = "所属机构信息")
+    private String beLongOid;
 
 
-    public String getOrganizationName() {
+    @Schema(description = "所属机构信息")
+    private String beLongName;
+
+    public String getBeLongOid() {
+        if (organization != null) {
+            return organization.getOid();
+        }
+        return "";
+    }
+
+    public String getBeLongName() {
         if (organization != null) {
         if (organization != null) {
             return organization.getName();
             return organization.getName();
         }
         }
@@ -90,4 +103,29 @@ public class DeviceInfoModel extends SuperModel {
         }
         }
         return "";
         return "";
     }
     }
+
+    @Schema(description = "区域信息")
+    private AreaModel area;
+
+    @Schema(description = "")
+    private String areaId;
+
+    public String getAreaId() {
+        if (ObjectUtils.isNotEmpty(area)) {
+            return area.getId();
+        }
+        return "";
+    }
+
+    private String areaName = "";
+
+    public String getAreaName() {
+        if (ObjectUtils.isNotEmpty(area)) {
+            return area.getName();
+        }
+        return "";
+    }
+
+    private String areaAllName = "";
+
 }
 }

+ 4 - 1
FullCardClient/src/main/java/com/zhongshu/card/client/model/devices/DeviceInfoSearch.java

@@ -34,9 +34,12 @@ public class DeviceInfoSearch extends SuperSearch {
     @Schema(description = "网关号")
     @Schema(description = "网关号")
     private String gateWayId;
     private String gateWayId;
 
 
-    @Schema(description = "所属区域")
+    @Schema(description = "所属区域(精准匹配)")
     private String areaId;
     private String areaId;
 
 
+    @Schema(description = "包含所属区域下所有的设备")
+    private String containAreaId;
+
     @Schema(description = "是否在线")
     @Schema(description = "是否在线")
     private OnLineState onLineState;
     private OnLineState onLineState;
 
 

+ 3 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/model/org/OrganizationMiniModel.java

@@ -16,6 +16,9 @@ public class OrganizationMiniModel {
     @Schema(description = "数据ID")
     @Schema(description = "数据ID")
     private String id;
     private String id;
 
 
+    @Schema(description = "机构oid")
+    private String oid;
+
     @Schema(description = "机构名称")
     @Schema(description = "机构名称")
     private String name;
     private String name;
 
 

+ 3 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/model/orgModel/OrgBindUserAllParam.java

@@ -46,4 +46,7 @@ public class OrgBindUserAllParam {
     @Schema(description = "是否是企业管理员")
     @Schema(description = "是否是企业管理员")
     private Boolean isAdmin = Boolean.FALSE;
     private Boolean isAdmin = Boolean.FALSE;
 
 
+    @Schema(description = "所属项目oid", hidden = true)
+    private String projectOid;
+
 }
 }

+ 0 - 1
FullCardClient/src/main/java/com/zhongshu/card/client/model/projectAbout/ProjectExcelTemplateParam.java

@@ -23,7 +23,6 @@ public class ProjectExcelTemplateParam {
     @Schema(description = "数据ID")
     @Schema(description = "数据ID")
     private String id;
     private String id;
 
 
-    @NotEmpty
     @Schema(description = "项目id", hidden = true)
     @Schema(description = "项目id", hidden = true)
     private String projectOid;
     private String projectOid;
 
 

+ 19 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/controller/org/OrganizationUserController.java

@@ -5,9 +5,11 @@ import com.github.microservice.auth.security.annotations.ResourceAuth;
 import com.github.microservice.auth.security.type.AuthType;
 import com.github.microservice.auth.security.type.AuthType;
 import com.github.microservice.net.ResultContent;
 import com.github.microservice.net.ResultContent;
 import com.zhongshu.card.client.model.base.OidModel;
 import com.zhongshu.card.client.model.base.OidModel;
+import com.zhongshu.card.client.model.base.ProjectOidParam;
 import com.zhongshu.card.client.model.org.*;
 import com.zhongshu.card.client.model.org.*;
 import com.zhongshu.card.client.model.orgModel.OrgBindUserAllParam;
 import com.zhongshu.card.client.model.orgModel.OrgBindUserAllParam;
 import com.zhongshu.card.client.model.project.ProjectSaveParam;
 import com.zhongshu.card.client.model.project.ProjectSaveParam;
+import com.zhongshu.card.client.model.school.ImportResultModel;
 import com.zhongshu.card.client.service.org.OrganizationService;
 import com.zhongshu.card.client.service.org.OrganizationService;
 import com.zhongshu.card.client.service.org.UserAccountService;
 import com.zhongshu.card.client.service.org.UserAccountService;
 import com.zhongshu.card.server.core.model.org.OrgBindUserParam;
 import com.zhongshu.card.server.core.model.org.OrgBindUserParam;
@@ -15,14 +17,19 @@ import com.zhongshu.card.server.core.service.org.OrganizationUserServiceImpl;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Parameter;
 import io.swagger.v3.oas.annotations.Parameter;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Pageable;
 import org.springframework.data.domain.Pageable;
 import org.springframework.data.web.PageableDefault;
 import org.springframework.data.web.PageableDefault;
+import org.springframework.http.MediaType;
 import org.springframework.util.Assert;
 import org.springframework.util.Assert;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
 
 
 import javax.validation.Valid;
 import javax.validation.Valid;
+import java.io.IOException;
 import java.util.List;
 import java.util.List;
 
 
 @RestController
 @RestController
@@ -87,4 +94,16 @@ public class OrganizationUserController {
         return userAccountService.getOrgUserDetail(param);
         return userAccountService.getOrgUserDetail(param);
     }
     }
 
 
+    @ResourceAuth(value = "user", type = AuthType.User)
+    @RequestMapping(value = "importProjectUsers", consumes = MediaType.MULTIPART_FORM_DATA_VALUE, method = RequestMethod.POST)
+    @Operation(summary = "导入项目用户", description = "导入项目用户")
+    public ResultContent<ImportResultModel> importProjectUsers(HttpServletRequest request,
+            HttpServletResponse response,
+            @RequestPart("file") MultipartFile file, ProjectOidParam param) throws IOException {
+        if (file == null || file.isEmpty()) {
+            return ResultContent.buildFail("文件不能为空");
+        }
+        return organizationUserService.importSchoolUsers(request, response, file, param);
+    }
+
 }
 }

+ 1 - 10
FullCardServer/src/main/java/com/zhongshu/card/server/core/controller/paySetting/ProjectChannelController.java

@@ -31,13 +31,10 @@ import org.springframework.web.bind.annotation.RestController;
  * @date 2024/7/26
  * @date 2024/7/26
  */
  */
 @RestController
 @RestController
-@RequestMapping("/project/projectChannel")
+@RequestMapping("/projectChannel")
 @Tag(name = "支付管理-支付产品")
 @Tag(name = "支付管理-支付产品")
 public class ProjectChannelController {
 public class ProjectChannelController {
 
 
-    @Autowired
-    private ProjectPaySettingService projectPaySettingService;
-
     @Autowired
     @Autowired
     private ProjectChannelConfigService projectChannelConfigService;
     private ProjectChannelConfigService projectChannelConfigService;
 
 
@@ -90,10 +87,4 @@ public class ProjectChannelController {
         return projectChannelConfigService.getPlatFormAllPay();
         return projectChannelConfigService.getPlatFormAllPay();
     }
     }
 
 
-    //------------------------------feign start -----------------------
-    @Operation(hidden = true, summary = "根据小程序appId得到配置", description = "根据小程序appId得到配置")
-    @RequestMapping(value = "manager/getProjectWxPayConfig", method = {RequestMethod.POST})
-    public ResultContent<WxPayConfigModel> getProjectWxPayConfig(@RequestBody ProjectWxPayParam param) {
-        return projectPaySettingService.getProjectWxPayConfig(param);
-    }
 }
 }

+ 0 - 77
FullCardServer/src/main/java/com/zhongshu/card/server/core/controller/projectAbout/PayChannelConfigController.java

@@ -1,77 +0,0 @@
-package com.zhongshu.card.server.core.controller.projectAbout;
-
-import com.github.microservice.auth.security.annotations.ResourceAuth;
-import com.github.microservice.auth.security.type.AuthType;
-import com.github.microservice.net.ResultContent;
-import com.zhongshu.card.client.model.base.IDParam;
-import com.zhongshu.card.client.model.projectAbout.ProjectExcelTemplateModel;
-import com.zhongshu.card.client.model.projectAbout.ProjectExcelTemplateParam;
-import com.zhongshu.card.client.model.projectAbout.ProjectExcelTemplateQuery;
-import com.zhongshu.card.client.model.projectAbout.ProjectExcelTemplateSearch;
-import com.zhongshu.card.server.core.service.projectAbout.ProjectExcelTemplateService;
-import io.swagger.v3.oas.annotations.Operation;
-import io.swagger.v3.oas.annotations.Parameter;
-import io.swagger.v3.oas.annotations.tags.Tag;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.data.domain.Page;
-import org.springframework.data.domain.Pageable;
-import org.springframework.data.web.PageableDefault;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.RestController;
-
-import javax.validation.Valid;
-
-/**
- * 项目的 excel模版 配置
- *
- * @author TRX
- * @date 2024/7/26
- */
-@RestController
-@RequestMapping("/project/payChannelConfig")
-@Tag(name = "项目-excel模版")
-public class PayChannelConfigController {
-
-    @Autowired
-    ProjectExcelTemplateService projectExcelTemplateService;
-
-    @ResourceAuth(value = "user", type = AuthType.User)
-    @Operation(summary = "保存信息(添加、编辑)", description = "保存信息")
-    @RequestMapping(value = "saveProjectExcelTemplate", method = {RequestMethod.POST})
-    public ResultContent saveProjectExcelTemplate(@RequestBody @Valid ProjectExcelTemplateParam param) {
-        return projectExcelTemplateService.saveProjectExcelTemplate(param);
-    }
-
-    @ResourceAuth(value = "user", type = AuthType.User)
-    @Operation(summary = "列表列表-分页查询)", description = "列表列表-分页查询")
-    @RequestMapping(value = {"page"}, method = {RequestMethod.POST})
-    public ResultContent<Page<ProjectExcelTemplateModel>> page(
-            @Parameter(hidden = true) @PageableDefault(page = 0, size = 10) Pageable pageable,
-            @Parameter(required = false) ProjectExcelTemplateSearch param) {
-        return projectExcelTemplateService.page(param, pageable);
-    }
-
-    @ResourceAuth(value = "user", type = AuthType.User)
-    @Operation(summary = "删除数据", description = "删除数据")
-    @RequestMapping(value = "deleteData", method = {RequestMethod.POST})
-    public ResultContent deleteData(@RequestBody @Valid IDParam param) {
-        return projectExcelTemplateService.deleteData(param.getId());
-    }
-
-    @ResourceAuth(value = "user", type = AuthType.User)
-    @Operation(summary = "得到详情", description = "得到详情")
-    @RequestMapping(value = "getDetail", method = {RequestMethod.POST})
-    public ResultContent getDetail(@RequestBody @Valid IDParam param) {
-        return projectExcelTemplateService.getDetail(param.getId());
-    }
-
-    @ResourceAuth(value = "user", type = AuthType.User)
-    @Operation(summary = "根据标记得到模版数据", description = "根据标记得到模版数据")
-    @RequestMapping(value = "getDetailByMark", method = {RequestMethod.POST})
-    public ResultContent<ProjectExcelTemplateModel> getDetailByMark(@RequestBody @Valid ProjectExcelTemplateQuery param) {
-        return projectExcelTemplateService.getDetailByMark(param);
-    }
-
-}

+ 1 - 1
FullCardServer/src/main/java/com/zhongshu/card/server/core/controller/projectAbout/ProjectCommonConfigController.java

@@ -30,7 +30,7 @@ import javax.validation.Valid;
 public class ProjectCommonConfigController {
 public class ProjectCommonConfigController {
 
 
     @Autowired
     @Autowired
-    ProjectCommonConfigService projectCommonConfigService;
+    private ProjectCommonConfigService projectCommonConfigService;
 
 
     @ResourceAuth(value = "user", type = AuthType.User)
     @ResourceAuth(value = "user", type = AuthType.User)
     @Operation(summary = "保存项目的通用设置", description = "保存项目的通用设置")
     @Operation(summary = "保存项目的通用设置", description = "保存项目的通用设置")

+ 6 - 6
FullCardServer/src/main/java/com/zhongshu/card/server/core/controller/projectAbout/ProjectExcelTemplateController.java

@@ -26,14 +26,14 @@ import org.springframework.web.bind.annotation.RestController;
 import javax.validation.Valid;
 import javax.validation.Valid;
 
 
 /**
 /**
- * 项目的 excel模版 配置
+ * 平台的 excel模版 配置
  *
  *
  * @author TRX
  * @author TRX
  * @date 2024/7/26
  * @date 2024/7/26
  */
  */
 @RestController
 @RestController
-@RequestMapping("/project/projectExcelTemplate")
-@Tag(name = "项目-excel模版")
+@RequestMapping("/excelTemplate")
+@Tag(name = "平台-excel模版")
 public class ProjectExcelTemplateController {
 public class ProjectExcelTemplateController {
 
 
     @Autowired
     @Autowired
@@ -41,9 +41,9 @@ public class ProjectExcelTemplateController {
 
 
     @ResourceAuth(value = "user", type = AuthType.User)
     @ResourceAuth(value = "user", type = AuthType.User)
     @Operation(summary = "保存信息(添加、编辑)", description = "保存信息")
     @Operation(summary = "保存信息(添加、编辑)", description = "保存信息")
-    @RequestMapping(value = "saveProjectExcelTemplate", method = {RequestMethod.POST})
-    public ResultContent saveProjectExcelTemplate(@RequestBody @Valid ProjectExcelTemplateParam param) {
-        return projectExcelTemplateService.saveProjectExcelTemplate(param);
+    @RequestMapping(value = "saveExcelTemplate", method = {RequestMethod.POST})
+    public ResultContent saveExcelTemplate(@RequestBody @Valid ProjectExcelTemplateParam param) {
+        return projectExcelTemplateService.saveExcelTemplate(param);
     }
     }
 
 
     @ResourceAuth(value = "user", type = AuthType.User)
     @ResourceAuth(value = "user", type = AuthType.User)

+ 1 - 1
FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/projectAbout/PayChannelConfigDao.java

@@ -15,7 +15,7 @@ public interface PayChannelConfigDao extends MongoDao<PayChannelConfig>, PayChan
 
 
     PayChannelConfig findTopById(String id);
     PayChannelConfig findTopById(String id);
 
 
-    PayChannelConfig findTopByProjectOidAndPaymentChannelType(String projectOid, PaymentChannelType paymentChannelType);
+    PayChannelConfig findTopByPaymentChannelType(PaymentChannelType paymentChannelType);
 
 
     List<PayChannelConfig> findByState(DataState state);
     List<PayChannelConfig> findByState(DataState state);
 
 

+ 3 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/projectAbout/UnionFrictionlessSettingDao.java

@@ -1,6 +1,7 @@
 package com.zhongshu.card.server.core.dao.projectAbout;
 package com.zhongshu.card.server.core.dao.projectAbout;
 
 
 import com.github.microservice.components.data.mongo.mongo.dao.MongoDao;
 import com.github.microservice.components.data.mongo.mongo.dao.MongoDao;
+import com.github.microservice.types.payment.PaymentChannelType;
 import com.github.microservice.types.payment.PaymentType;
 import com.github.microservice.types.payment.PaymentType;
 import com.zhongshu.card.server.core.domain.org.Organization;
 import com.zhongshu.card.server.core.domain.org.Organization;
 import com.zhongshu.card.server.core.domain.paySetting.UnionFrictionlessSetting;
 import com.zhongshu.card.server.core.domain.paySetting.UnionFrictionlessSetting;
@@ -18,4 +19,6 @@ public interface UnionFrictionlessSettingDao extends MongoDao<UnionFrictionlessS
 
 
     UnionFrictionlessSetting findTopByProjectInfoAndPaymentType(Organization projectInfo, PaymentType paymentType);
     UnionFrictionlessSetting findTopByProjectInfoAndPaymentType(Organization projectInfo, PaymentType paymentType);
 
 
+    Integer countByPaymentChannelType(PaymentChannelType paymentChannelType);
+
 }
 }

+ 4 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/projectAbout/impl/PayChannelConfigDaoImpl.java

@@ -37,6 +37,10 @@ public class PayChannelConfigDaoImpl extends BaseImpl implements PayChannelConfi
             criteria.and("projectOid").is(param.getProjectOid());
             criteria.and("projectOid").is(param.getProjectOid());
         }
         }
 
 
+        if (ObjectUtils.isNotEmpty(param.getOid())) {
+            criteria.and("oid").is(param.getOid());
+        }
+
         if (param.getPaymentChannelType() != null) {
         if (param.getPaymentChannelType() != null) {
             criteria.and("paymentChannelType").is(param.getPaymentChannelType());
             criteria.and("paymentChannelType").is(param.getPaymentChannelType());
         }
         }

+ 7 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/school/impl/DeviceInfoDaoImpl.java

@@ -79,6 +79,13 @@ public class DeviceInfoDaoImpl extends BaseImpl implements DeviceInfoDaoExtend {
             Pattern pattern = Pattern.compile("^.*" + param.getIp() + ".*$");
             Pattern pattern = Pattern.compile("^.*" + param.getIp() + ".*$");
             criterias.add(Criteria.where("ip").is(pattern));
             criterias.add(Criteria.where("ip").is(pattern));
         }
         }
+
+        // 包含的都算
+        if (StringUtils.isNotEmpty(param.getContainAreaId())) {
+            Pattern pattern = Pattern.compile("^.*" + param.getContainAreaId() + ".*$");
+            criterias.add(Criteria.where("areaPaths").is(pattern));
+        }
+
         if (!CollectionUtils.isEmpty(criterias)) {
         if (!CollectionUtils.isEmpty(criterias)) {
             criteria.andOperator(criterias.toArray(new Criteria[]{}));
             criteria.andOperator(criterias.toArray(new Criteria[]{}));
         }
         }

+ 3 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/domain/devices/DeviceInfo.java

@@ -66,4 +66,7 @@ public class DeviceInfo extends SuperMain {
     @DBRef(lazy = true)
     @DBRef(lazy = true)
     private Area area;
     private Area area;
 
 
+    @Schema(description = "区域所有上级ID路径,如:a1/a12/a123")
+    private String areaPaths = "";
+
 }
 }

+ 42 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/domain/devices/DevicePermiss.java

@@ -0,0 +1,42 @@
+package com.zhongshu.card.server.core.domain.devices;
+
+import com.zhongshu.card.server.core.domain.base.SuperMain;
+import com.zhongshu.card.server.core.domain.org.UserAccount;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+import org.springframework.data.mongodb.core.mapping.DBRef;
+import org.springframework.data.mongodb.core.mapping.Document;
+
+/**
+ * 用户可使用设备的绑定
+ *
+ * @author TRX
+ * @date 2024/10/10
+ */
+@Data
+@Document
+@NoArgsConstructor
+@AllArgsConstructor
+public class DevicePermiss extends SuperMain {
+
+    @Schema(description = "关联的设备信息")
+    @DBRef(lazy = true)
+    private DeviceInfo deviceInfo;
+
+    @Schema(description = "设备ID")
+    private String deviceId;
+
+    @Schema(description = "可使用的用户信息")
+    @DBRef(lazy = true)
+    private UserAccount userAccount;
+
+    @Schema(description = "可使用用户userId")
+    private String userId;
+
+    @Schema(description = "权限是否下发")
+    private Boolean isUsed = Boolean.FALSE;
+
+}

+ 13 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/base/SuperService.java

@@ -1,5 +1,6 @@
 package com.zhongshu.card.server.core.service.base;
 package com.zhongshu.card.server.core.service.base;
 
 
+import com.github.microservice.auth.security.helper.AuthClientSecurityAuthenticationHelper;
 import com.github.microservice.auth.security.helper.AuthHelper;
 import com.github.microservice.auth.security.helper.AuthHelper;
 import com.zhongshu.card.client.model.base.SuperParam;
 import com.zhongshu.card.client.model.base.SuperParam;
 import com.zhongshu.card.client.model.base.SuperSearch;
 import com.zhongshu.card.client.model.base.SuperSearch;
@@ -34,6 +35,9 @@ public abstract class SuperService {
     @Autowired
     @Autowired
     private HttpServletRequest request;
     private HttpServletRequest request;
 
 
+    @Autowired
+    private AuthClientSecurityAuthenticationHelper authClientSecurityAuthenticationHelper;
+
     /**
     /**
      * 得到当前的用户ID
      * 得到当前的用户ID
      *
      *
@@ -76,6 +80,15 @@ public abstract class SuperService {
         return null;
         return null;
     }
     }
 
 
+    /**
+     * 得到当时设置到head的 项目oid
+     *
+     * @return
+     */
+    public String getCurrentProjectOid() {
+        return authClientSecurityAuthenticationHelper.getParameter(new String[]{"projectoid", "projectOid"});
+    }
+
     /**
     /**
      * 初始Entity的默认参数 oid、createUser (oid为空会抛出异常)
      * 初始Entity的默认参数 oid、createUser (oid为空会抛出异常)
      *
      *

+ 34 - 7
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/devices/DeviceInfoServiceImpl.java

@@ -6,6 +6,7 @@ import com.zhongshu.card.client.model.devices.*;
 import com.github.microservice.net.ResultContent;
 import com.github.microservice.net.ResultContent;
 import com.github.microservice.net.ResultMessage;
 import com.github.microservice.net.ResultMessage;
 import com.zhongshu.card.client.model.org.OrganizationMiniModel;
 import com.zhongshu.card.client.model.org.OrganizationMiniModel;
+import com.zhongshu.card.client.model.school.AreaModel;
 import com.zhongshu.card.client.service.school.DeviceInfoService;
 import com.zhongshu.card.client.service.school.DeviceInfoService;
 import com.zhongshu.card.server.core.dao.org.OrganizationDao;
 import com.zhongshu.card.server.core.dao.org.OrganizationDao;
 import com.zhongshu.card.server.core.dao.school.AreaDao;
 import com.zhongshu.card.server.core.dao.school.AreaDao;
@@ -28,6 +29,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.util.Assert;
 import org.springframework.util.Assert;
 
 
 import java.util.ArrayList;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 import java.util.List;
 import java.util.stream.Collectors;
 import java.util.stream.Collectors;
 
 
@@ -70,13 +72,23 @@ public class DeviceInfoServiceImpl extends SuperService implements DeviceInfoSer
         String deviceId = param.getDeviceId();
         String deviceId = param.getDeviceId();
         DeviceInfo deviceInfo = deviceInfoDao.findTopByDeviceId(deviceId);
         DeviceInfo deviceInfo = deviceInfoDao.findTopByDeviceId(deviceId);
         if (ObjectUtils.isNotEmpty(deviceInfo)) {
         if (ObjectUtils.isNotEmpty(deviceInfo)) {
+            // 编辑
         } else {
         } else {
+            // 新增
             deviceInfo = new DeviceInfo();
             deviceInfo = new DeviceInfo();
             initEntityNoCheckOid(deviceInfo);
             initEntityNoCheckOid(deviceInfo);
         }
         }
         BeanUtils.copyProperties(param, deviceInfo, "id");
         BeanUtils.copyProperties(param, deviceInfo, "id");
         deviceInfo.setProjectInfoName(organizationServiceImpl.getOrgNameByCode(param.getProjectInfoCode()));
         deviceInfo.setProjectInfoName(organizationServiceImpl.getOrgNameByCode(param.getProjectInfoCode()));
 
 
+        if (StringUtils.isNotEmpty(param.getProjectInfoCode())) {
+            Organization projectInfo = organizationDao.findTopByOrgCode(param.getProjectInfoCode());
+            if (ObjectUtils.isNotEmpty(projectInfo)) {
+                deviceInfo.setProjectOid(projectInfo.getOid());
+                deviceInfo.setAboutOid(projectInfo.getOid());
+                deviceInfo.setAboutAuthType(projectInfo.getAuthType());
+            }
+        }
         deviceInfoDao.save(deviceInfo);
         deviceInfoDao.save(deviceInfo);
         return ResultContent.buildSuccess();
         return ResultContent.buildSuccess();
     }
     }
@@ -120,6 +132,7 @@ public class DeviceInfoServiceImpl extends SuperService implements DeviceInfoSer
             return ResultContent.buildFail("projectOid不存在");
             return ResultContent.buildFail("projectOid不存在");
         }
         }
         param.setProjectInfoCode(organization.getCode());
         param.setProjectInfoCode(organization.getCode());
+
         Page<DeviceInfo> page = deviceInfoDao.page(pageable, param);
         Page<DeviceInfo> page = deviceInfoDao.page(pageable, param);
         return ResultContent.buildSuccess(PageEntityUtil.concurrent2PageModel(page, this::toModel));
         return ResultContent.buildSuccess(PageEntityUtil.concurrent2PageModel(page, this::toModel));
     }
     }
@@ -197,18 +210,23 @@ public class DeviceInfoServiceImpl extends SuperService implements DeviceInfoSer
         if (ObjectUtils.isEmpty(deviceInfo)) {
         if (ObjectUtils.isEmpty(deviceInfo)) {
             return ResultContent.buildFail(String.format(ResultMessage.DATA_NOT_EXIST, param.getId()));
             return ResultContent.buildFail(String.format(ResultMessage.DATA_NOT_EXIST, param.getId()));
         }
         }
+        Area area = null;
+        List<String> strings = new ArrayList<>();
         // 修改设备 只能绑定 区域 所属机构等信息
         // 修改设备 只能绑定 区域 所属机构等信息
-        if (StringUtils.isNotEmpty(deviceInfo.getDeviceId())) {
-            Area area = areaDao.findTopById(param.getAreaId());
+        if (StringUtils.isNotEmpty(param.getAreaId())) {
+            area = areaDao.findTopById(param.getAreaId());
             if (ObjectUtils.isEmpty(area)) {
             if (ObjectUtils.isEmpty(area)) {
                 return ResultContent.buildFail("区域信息不存在");
                 return ResultContent.buildFail("区域信息不存在");
             }
             }
-            deviceInfo.setArea(area);
+            strings = areaService.getAllParents(param.getAreaId());
         }
         }
+        deviceInfo.setArea(area);
+        deviceInfo.setAreaPaths(String.join("/", strings));
 
 
+        // 设备所属机构
         Organization organization = null;
         Organization organization = null;
-        if (StringUtils.isNotEmpty(param.getOid())) {
-            organization = organizationDao.findTopByOid(param.getOid());
+        if (StringUtils.isNotEmpty(param.getBeLongOid())) {
+            organization = organizationDao.findTopByOid(param.getBeLongOid());
         }
         }
         deviceInfo.setOrganization(organization);
         deviceInfo.setOrganization(organization);
         deviceInfoDao.save(deviceInfo);
         deviceInfoDao.save(deviceInfo);
@@ -225,11 +243,20 @@ public class DeviceInfoServiceImpl extends SuperService implements DeviceInfoSer
         DeviceInfoModel model = null;
         DeviceInfoModel model = null;
         if (ObjectUtils.isNotEmpty(entity)) {
         if (ObjectUtils.isNotEmpty(entity)) {
             model = new DeviceInfoModel();
             model = new DeviceInfoModel();
+            // 所属机构信息
+            OrganizationMiniModel miniModel = organizationManagerService.toMiniModel(entity.getOrganization());
+            model.setOrganization(miniModel);
+
             BeanUtils.copyProperties(entity, model);
             BeanUtils.copyProperties(entity, model);
             model.setProjectInfoName(organizationServiceImpl.getOrgNameByCode(entity.getProjectInfoCode()));
             model.setProjectInfoName(organizationServiceImpl.getOrgNameByCode(entity.getProjectInfoCode()));
 
 
-            OrganizationMiniModel miniModel = organizationManagerService.toMiniModel(entity.getOrganization());
-            model.setOrganization(miniModel);
+            // 所属区域信息
+            List<AreaModel> areaModel = areaService.getParents(entity.getArea());
+            if (ObjectUtils.isNotEmpty(areaModel)) {
+                model.setArea(areaModel.get(0));
+                Collections.reverse(areaModel);
+                model.setAreaAllName(String.format("/", areaModel.stream().map(it -> it.getName()).collect(Collectors.toList())));
+            }
         }
         }
         return model;
         return model;
     }
     }

+ 152 - 4
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/org/OrganizationUserServiceImpl.java

@@ -1,12 +1,18 @@
 package com.zhongshu.card.server.core.service.org;
 package com.zhongshu.card.server.core.service.org;
 
 
+import cn.afterturn.easypoi.excel.ExcelImportUtil;
+import cn.afterturn.easypoi.excel.entity.ImportParams;
 import com.github.microservice.auth.client.content.ResultState;
 import com.github.microservice.auth.client.content.ResultState;
 import com.github.microservice.auth.client.service.OrganizationUserService;
 import com.github.microservice.auth.client.service.OrganizationUserService;
 import com.github.microservice.auth.client.service.RoleService;
 import com.github.microservice.auth.client.service.RoleService;
 import com.github.microservice.auth.security.type.AuthType;
 import com.github.microservice.auth.security.type.AuthType;
+import com.github.microservice.core.util.bean.BeanUtil;
 import com.github.microservice.net.ResultContent;
 import com.github.microservice.net.ResultContent;
+import com.zhongshu.card.client.model.base.ProjectOidParam;
 import com.zhongshu.card.client.model.org.*;
 import com.zhongshu.card.client.model.org.*;
 import com.zhongshu.card.client.model.orgModel.OrgBindUserAllParam;
 import com.zhongshu.card.client.model.orgModel.OrgBindUserAllParam;
+import com.zhongshu.card.client.model.school.ExcelUserParam;
+import com.zhongshu.card.client.model.school.ImportResultModel;
 import com.zhongshu.card.client.model.school.RegisterBindSchoolParam;
 import com.zhongshu.card.client.model.school.RegisterBindSchoolParam;
 import com.zhongshu.card.client.type.OrganizationUserType;
 import com.zhongshu.card.client.type.OrganizationUserType;
 import com.zhongshu.card.client.type.UserState;
 import com.zhongshu.card.client.type.UserState;
@@ -20,17 +26,28 @@ import com.zhongshu.card.server.core.service.orgManager.OrganizationManagerServi
 import com.zhongshu.card.server.core.service.user.DepartmentServiceImpl;
 import com.zhongshu.card.server.core.service.user.DepartmentServiceImpl;
 import com.zhongshu.card.server.core.service.user.RoleServiceImpl;
 import com.zhongshu.card.server.core.service.user.RoleServiceImpl;
 import com.zhongshu.card.server.core.service.user.UserAccountServiceImpl;
 import com.zhongshu.card.server.core.service.user.UserAccountServiceImpl;
+import com.zhongshu.card.server.core.util.CommonUtil;
+import com.zhongshu.card.server.core.util.ExcelUtils;
+import com.zhongshu.card.server.core.util.excel.CommonExeclParam;
+import com.zhongshu.card.server.core.util.excel.CommonExeclTd;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.ObjectUtils;
 import org.apache.commons.lang3.ObjectUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.data.domain.Pageable;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.Assert;
 import org.springframework.util.Assert;
+import org.springframework.web.multipart.MultipartFile;
 
 
 import java.util.ArrayList;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.List;
+import java.util.Map;
 import java.util.stream.Collectors;
 import java.util.stream.Collectors;
 
 
 /**
 /**
@@ -86,8 +103,12 @@ public class OrganizationUserServiceImpl extends SuperService {
      */
      */
     public ResultContent<OrganizationUser> saveOrgUser(UserCountAddParam param) {
     public ResultContent<OrganizationUser> saveOrgUser(UserCountAddParam param) {
         String oid = param.getOid();
         String oid = param.getOid();
-        Assert.hasText(oid, "oid不能为空");
-        Assert.hasText(param.getName(), "name不能为空");
+        if (StringUtils.isEmpty(oid)) {
+            return ResultContent.buildFail("oid不能为空");
+        }
+        if (StringUtils.isEmpty(param.getName())) {
+            return ResultContent.buildFail("name不能为空");
+        }
         if (param.getState() == null) {
         if (param.getState() == null) {
             param.setState(UserState.Normal);
             param.setState(UserState.Normal);
         }
         }
@@ -251,7 +272,9 @@ public class OrganizationUserServiceImpl extends SuperService {
         organizationUser.setAboutOid(oidAboutInfo.getOid());
         organizationUser.setAboutOid(oidAboutInfo.getOid());
         organizationUser.setAboutAuthType(oidAboutInfo.getAuthType());
         organizationUser.setAboutAuthType(oidAboutInfo.getAuthType());
         organizationUser.setAuthType(organization.getAuthType());
         organizationUser.setAuthType(organization.getAuthType());
-
+        if (StringUtils.isNotEmpty(param.getProjectOid())) {
+            organizationUser.setProjectOid(param.getProjectOid());
+        }
         // 用户信息
         // 用户信息
         organizationUser.setPhone(userAccount.getPhone());
         organizationUser.setPhone(userAccount.getPhone());
         organizationUser.setName(userAccount.getName());
         organizationUser.setName(userAccount.getName());
@@ -269,7 +292,7 @@ public class OrganizationUserServiceImpl extends SuperService {
     }
     }
 
 
     /**
     /**
-     * 绑定构管理员 (已新的为准,以前的删除掉)
+     * 绑定构管理员 (已新的为准,以前的删除掉)
      *
      *
      * @param organization
      * @param organization
      * @param userAccounts
      * @param userAccounts
@@ -406,6 +429,131 @@ public class OrganizationUserServiceImpl extends SuperService {
         return ResultContent.buildSuccess();
         return ResultContent.buildSuccess();
     }
     }
 
 
+    /**
+     * 导入 学校用户excel
+     *
+     * @param request
+     * @param response
+     * @param file
+     * @return
+     */
+    public ResultContent<ImportResultModel> importSchoolUsers(HttpServletRequest request,
+            HttpServletResponse response, MultipartFile file, ProjectOidParam proParam) {
+        String oid = proParam.getProjectOid();
+        Assert.hasText(oid, "projectOid不能为空");
+
+        ImportResultModel model = new ImportResultModel();
+        try {
+            int startRow = 2;
+            ImportParams params = new ImportParams();
+            List<ExcelUserParam> list = ExcelImportUtil.importExcel(file.getInputStream(),
+                    ExcelUserParam.class, params);
+            model.setTotal(list.size());
+
+            List<String> failDetails = new ArrayList<>();
+            List<UserCountAddParam> userList = new ArrayList<>();
+            if (ObjectUtils.isNotEmpty(list)) {
+                for (ExcelUserParam param1 : list) {
+                    // 验证数据合法性
+                    boolean b = true;
+                    if (b && StringUtils.isEmpty(param1.getName())) {
+                        b = false;
+                        failDetails.add(String.format("第%d行名称不能为空", startRow));
+                    }
+                    if (b && StringUtils.isEmpty(param1.getCode())) {
+                        b = false;
+                        failDetails.add(String.format("第%d行编码不能为空", startRow));
+                    }
+                    if (b && StringUtils.isEmpty(param1.getPhone())) {
+                        b = false;
+                        failDetails.add(String.format("第%d行电话不能为空", startRow));
+                    }
+                    if (b) {
+                        if (StringUtils.isEmpty(param1.getCardNumber())) {
+                            b = false;
+                            failDetails.add(String.format("第%d行身份证号不能为空", startRow));
+                        } else if (param1.getCardNumber().length() != 18) {
+                            b = false;
+                            failDetails.add(String.format("第%d行身份证号格式不正确", startRow));
+                        }
+                    }
+                    if (b) {
+                        // 验证通过
+                        UserCountAddParam addParam = new UserCountAddParam();
+                        initDefaultUserParam(addParam);
+                        addParam.setOid(oid);
+
+                        com.zhongshu.card.server.core.util.BeanUtils.copyProperties(param1, addParam);
+                        if (StringUtils.isNotBlank(param1.getSexStr())) {
+                            addParam.setSex(CommonUtil.getSexByStr(param1.getSexStr()));
+                        }
+                        String passWord = param1.getCardNumber().substring(12, 18);
+                        passWord = passWord.toLowerCase().replace("x", "0");
+                        addParam.setPassWord(passWord);
+                        userList.add(addParam);
+                    }
+                    startRow++;
+                }
+
+                // 添加到对应的结构中
+                for (UserCountAddParam param : userList) {
+                    ResultContent resultContent = saveOrgUser(param);
+                    log.info("添加日志: {}", resultContent.getMsg());
+                }
+                model.setSuccess(userList.size());
+                model.setFailDetails(failDetails);
+            }
+        } catch (Exception e) {
+            return ResultContent.buildFail(String.format("导入出错:%s", e.getMessage()));
+        }
+        return ResultContent.buildSuccess(model);
+    }
+
+    /**
+     * 导出项目用户
+     *
+     * @param request
+     * @param response
+     * @param param
+     */
+    public void exportProjectUser(HttpServletRequest request, HttpServletResponse response,
+            OrganizationUserSearch param) {
+        param.setIsSearchProject(Boolean.TRUE);
+
+        Organization organization = organizationDao.findTopByOid(param.getOid());
+        Pageable pageable = PageRequest.of(0, Integer.MAX_VALUE);
+        Page<OrganizationUser> page = organizationUserDao.page(pageable, param);
+
+        List<Map<String, Object>> maps = new ArrayList<>();
+        if (page.getContent() != null) {
+            List<OrganizationUser> list = page.getContent();
+            maps = list.stream().map(it -> {
+                Map<String, Object> map = BeanUtil.bean2Map(it);
+                String sex = "";
+                if (it.getUser() != null && it.getUser().getSex() != null) {
+                    sex = it.getUser().getSex().getRemark();
+                }
+                map.put("sexStr", sex);
+                return map;
+            }).collect(Collectors.toList());
+        }
+        CommonExeclParam execlParam = new CommonExeclParam();
+        execlParam.setTitle(String.format("%s用户列表", organization.getName()));
+        execlParam.setStartRow(2);
+        execlParam.setDatas(maps);
+
+        List<CommonExeclTd> tds = new ArrayList<>();
+        tds.add(CommonExeclTd.build("人员编号", "code"));
+        tds.add(CommonExeclTd.build("姓名", "name"));
+        tds.add(CommonExeclTd.build("性别", "sexStr"));
+        tds.add(CommonExeclTd.build("手机号", "phone"));
+        tds.add(CommonExeclTd.build("身份证号", "cardNumber"));
+        tds.add(CommonExeclTd.build("备注", "remark"));
+
+        execlParam.setTds(tds);
+        ExcelUtils.commonExecuteExcel(request, response, execlParam);
+    }
+
     /**
     /**
      * 转换机构用户信息(基本信息 角色  部门)
      * 转换机构用户信息(基本信息 角色  部门)
      *
      *

+ 9 - 5
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/orgManager/OrganizationManagerServiceImpl.java

@@ -10,8 +10,10 @@ import com.github.microservice.net.ResultContent;
 import com.github.microservice.net.ResultMessage;
 import com.github.microservice.net.ResultMessage;
 import com.zhongshu.card.client.model.org.*;
 import com.zhongshu.card.client.model.org.*;
 import com.zhongshu.card.client.model.orgModel.OrgSaveParam;
 import com.zhongshu.card.client.model.orgModel.OrgSaveParam;
+import com.zhongshu.card.client.type.OrganizationRelationType;
 import com.zhongshu.card.server.core.dao.org.*;
 import com.zhongshu.card.server.core.dao.org.*;
 import com.zhongshu.card.server.core.domain.org.Organization;
 import com.zhongshu.card.server.core.domain.org.Organization;
+import com.zhongshu.card.server.core.domain.org.OrganizationRelation;
 import com.zhongshu.card.server.core.domain.org.Region;
 import com.zhongshu.card.server.core.domain.org.Region;
 import com.zhongshu.card.server.core.service.base.SuperService;
 import com.zhongshu.card.server.core.service.base.SuperService;
 import com.zhongshu.card.server.core.service.org.*;
 import com.zhongshu.card.server.core.service.org.*;
@@ -250,6 +252,7 @@ public class OrganizationManagerServiceImpl extends SuperService {
 
 
     public OidAboutInfo getOidAboutInfo(String oid) {
     public OidAboutInfo getOidAboutInfo(String oid) {
         OidAboutInfo aboutInfo = new OidAboutInfo();
         OidAboutInfo aboutInfo = new OidAboutInfo();
+        aboutInfo.setOid(oid);
         if (StringUtils.isNotEmpty(oid)) {
         if (StringUtils.isNotEmpty(oid)) {
             Organization organization = organizationDao.findTopByOid(oid);
             Organization organization = organizationDao.findTopByOid(oid);
             if (ObjectUtils.isNotEmpty(organization)) {
             if (ObjectUtils.isNotEmpty(organization)) {
@@ -259,13 +262,14 @@ public class OrganizationManagerServiceImpl extends SuperService {
                 AuthType authType = organization.getAuthType();
                 AuthType authType = organization.getAuthType();
                 if (authType == AuthType.Project) {
                 if (authType == AuthType.Project) {
                     aboutInfo.setProjectOid(oid);
                     aboutInfo.setProjectOid(oid);
+                } else {
+                    // 查询结构绑定的项目 (如果机构绑定多个项目,怎么办)
+                    List<OrganizationRelation> list = organizationRelationDao.findByRelOrganizationAndRelationType(organization, OrganizationRelationType.ProjectBindOrg);
+                    if (ObjectUtils.isNotEmpty(list)) {
+                        aboutInfo.setProjectOid(list.get(0).getMainOrganization().getOid());
+                    }
                 }
                 }
-
-            } else {
-                aboutInfo.setOid(oid);
             }
             }
-        } else {
-            aboutInfo.setOid(oid);
         }
         }
         return aboutInfo;
         return aboutInfo;
     }
     }

+ 26 - 21
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/paySetting/ProjectChannelConfigService.java

@@ -12,12 +12,14 @@ import com.zhongshu.card.client.model.projectAbout.PayChannelConfigSearch;
 import com.zhongshu.card.client.type.DataState;
 import com.zhongshu.card.client.type.DataState;
 import com.zhongshu.card.server.core.dao.org.OrganizationDao;
 import com.zhongshu.card.server.core.dao.org.OrganizationDao;
 import com.zhongshu.card.server.core.dao.projectAbout.PayChannelConfigDao;
 import com.zhongshu.card.server.core.dao.projectAbout.PayChannelConfigDao;
+import com.zhongshu.card.server.core.dao.projectAbout.UnionFrictionlessSettingDao;
 import com.zhongshu.card.server.core.domain.org.Organization;
 import com.zhongshu.card.server.core.domain.org.Organization;
 import com.zhongshu.card.server.core.domain.paySetting.PayChannelConfig;
 import com.zhongshu.card.server.core.domain.paySetting.PayChannelConfig;
 import com.zhongshu.card.server.core.service.base.SuperService;
 import com.zhongshu.card.server.core.service.base.SuperService;
 import com.zhongshu.card.server.core.util.BeanUtils;
 import com.zhongshu.card.server.core.util.BeanUtils;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.ObjectUtils;
 import org.apache.commons.lang3.ObjectUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Pageable;
 import org.springframework.data.domain.Pageable;
@@ -43,6 +45,9 @@ public class ProjectChannelConfigService extends SuperService {
     @Autowired
     @Autowired
     PayChannelConfigDao payChannelConfigDao;
     PayChannelConfigDao payChannelConfigDao;
 
 
+    @Autowired
+    private UnionFrictionlessSettingDao unionFrictionlessSettingDao;
+
     /**
     /**
      * 保存信息
      * 保存信息
      *
      *
@@ -50,15 +55,16 @@ public class ProjectChannelConfigService extends SuperService {
      * @return
      * @return
      */
      */
     public ResultContent savePayChannelConfig(PayChannelConfigParam param) {
     public ResultContent savePayChannelConfig(PayChannelConfigParam param) {
-        checkSaveParamProjectOid(param);
-
-        String projectOid = param.getProjectOid();
-        Organization projectInfo = organizationDao.findTopByOid(projectOid);
-        if (ObjectUtils.isEmpty(projectInfo)) {
-            return ResultContent.buildFail(String.format("项目oid不存在:%s", projectOid));
+        String oid = param.getOid();
+        if (StringUtils.isEmpty(oid)) {
+            oid = getCurrentOid();
+        }
+        Organization orgInfo = organizationDao.findTopByOid(oid);
+        if (ObjectUtils.isEmpty(orgInfo)) {
+            return ResultContent.buildFail(String.format("oid不存在:%s", oid));
         }
         }
         PayChannelConfig entity = null;
         PayChannelConfig entity = null;
-        PayChannelConfig nameTemp = payChannelConfigDao.findTopByProjectOidAndPaymentChannelType(projectOid, param.getPaymentChannelType());
+        PayChannelConfig nameTemp = payChannelConfigDao.findTopByPaymentChannelType(param.getPaymentChannelType());
 
 
         if (ObjectUtils.isNotEmpty(param.getId())) {
         if (ObjectUtils.isNotEmpty(param.getId())) {
             entity = payChannelConfigDao.findTopById(param.getId());
             entity = payChannelConfigDao.findTopById(param.getId());
@@ -78,16 +84,14 @@ public class ProjectChannelConfigService extends SuperService {
             entity.setIsDelete(Boolean.FALSE);
             entity.setIsDelete(Boolean.FALSE);
             initEntityNoOid(entity);
             initEntityNoOid(entity);
         }
         }
-
         BeanUtils.copyProperties(param, entity);
         BeanUtils.copyProperties(param, entity);
-        entity.setProjectInfo(projectInfo);
-        entity.setProjectName(projectInfo.getName());
-        entity.setProjectCode(projectInfo.getCode());
-        entity.setProjectOid(projectInfo.getOid());
-
-        entity.setOid(projectOid);
-        entity.setAboutOid(projectOid);
-        entity.setAboutAuthType(projectInfo.getAuthType());
+        entity.setProjectInfo(orgInfo);
+        entity.setProjectName(orgInfo.getName());
+        entity.setProjectCode(orgInfo.getCode());
+        entity.setProjectOid(orgInfo.getOid());
+        entity.setOid(oid);
+        entity.setAboutOid(oid);
+        entity.setAboutAuthType(orgInfo.getAuthType());
         payChannelConfigDao.save(entity);
         payChannelConfigDao.save(entity);
         return ResultContent.buildSuccess();
         return ResultContent.buildSuccess();
     }
     }
@@ -100,7 +104,6 @@ public class ProjectChannelConfigService extends SuperService {
      * @return
      * @return
      */
      */
     public ResultContent<Page<PayChannelConfigModel>> page(PayChannelConfigSearch param, Pageable pageable) {
     public ResultContent<Page<PayChannelConfigModel>> page(PayChannelConfigSearch param, Pageable pageable) {
-        initSearchParamCheckProjectOid(param);
         Page<PayChannelConfig> page = payChannelConfigDao.page(pageable, param);
         Page<PayChannelConfig> page = payChannelConfigDao.page(pageable, param);
         return ResultContent.buildSuccess(PageEntityUtil.concurrent2PageModel(page, this::toModel));
         return ResultContent.buildSuccess(PageEntityUtil.concurrent2PageModel(page, this::toModel));
     }
     }
@@ -117,7 +120,10 @@ public class ProjectChannelConfigService extends SuperService {
             return ResultContent.buildFail(String.format(ResultMessage.DATA_NOT_EXIST, id));
             return ResultContent.buildFail(String.format(ResultMessage.DATA_NOT_EXIST, id));
         }
         }
         // 判断是否可以删除
         // 判断是否可以删除
-
+        int number = unionFrictionlessSettingDao.countByPaymentChannelType(entity.getPaymentChannelType());
+        if (number > 0) {
+            return ResultContent.buildFail("已有机构使用该支付产品,不能删除");
+        }
         payChannelConfigDao.delete(entity);
         payChannelConfigDao.delete(entity);
         return ResultContent.buildSuccess();
         return ResultContent.buildSuccess();
     }
     }
@@ -139,12 +145,11 @@ public class ProjectChannelConfigService extends SuperService {
     /**
     /**
      * 得到项目渠道配置
      * 得到项目渠道配置
      *
      *
-     * @param projectOid
      * @param paymentChannelType
      * @param paymentChannelType
      * @return
      * @return
      */
      */
-    public PayChannelConfig getProjectPayChannel(String projectOid, PaymentChannelType paymentChannelType) {
-        PayChannelConfig entity = payChannelConfigDao.findTopByProjectOidAndPaymentChannelType(projectOid, paymentChannelType);
+    public PayChannelConfig getProjectPayChannel(PaymentChannelType paymentChannelType) {
+        PayChannelConfig entity = payChannelConfigDao.findTopByPaymentChannelType(paymentChannelType);
         return entity;
         return entity;
     }
     }
 
 

+ 1 - 1
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/paySetting/UnionFrictionlessSettingService.java

@@ -61,7 +61,7 @@ public class UnionFrictionlessSettingService extends SuperService {
             return ResultContent.buildFail(String.format("projectOid不能为空"));
             return ResultContent.buildFail(String.format("projectOid不能为空"));
         }
         }
         PayChannelConfig payChannelConfig = projectChannelConfigService
         PayChannelConfig payChannelConfig = projectChannelConfigService
-                .getProjectPayChannel(projectOid, PaymentChannelType.SecretFreePayment);
+                .getProjectPayChannel(PaymentChannelType.SecretFreePayment);
         if (ObjectUtils.isEmpty(payChannelConfig)) {
         if (ObjectUtils.isEmpty(payChannelConfig)) {
             return ResultContent.buildFail(String.format("当前项目未配置%s",
             return ResultContent.buildFail(String.format("当前项目未配置%s",
                     PaymentChannelType.SecretFreePayment.getRemark()));
                     PaymentChannelType.SecretFreePayment.getRemark()));

+ 2 - 3
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/projectAbout/ProjectExcelTemplateService.java

@@ -45,7 +45,7 @@ public class ProjectExcelTemplateService extends SuperService {
      * @param param
      * @param param
      * @return
      * @return
      */
      */
-    public ResultContent saveProjectExcelTemplate(ProjectExcelTemplateParam param) {
+    public ResultContent saveExcelTemplate(ProjectExcelTemplateParam param) {
         String mark = param.getMark();
         String mark = param.getMark();
         ProjectExcelTemplate entity = null;
         ProjectExcelTemplate entity = null;
         ProjectExcelTemplate nameTemp = projectExcelTemplateDao.findTopByMark(mark);
         ProjectExcelTemplate nameTemp = projectExcelTemplateDao.findTopByMark(mark);
@@ -69,7 +69,6 @@ public class ProjectExcelTemplateService extends SuperService {
         }
         }
         BeanUtils.copyProperties(param, entity);
         BeanUtils.copyProperties(param, entity);
         projectExcelTemplateDao.save(entity);
         projectExcelTemplateDao.save(entity);
-
         return ResultContent.buildSuccess();
         return ResultContent.buildSuccess();
     }
     }
 
 
@@ -109,7 +108,7 @@ public class ProjectExcelTemplateService extends SuperService {
                 ProjectExcelTemplateParam param1 = new ProjectExcelTemplateParam();
                 ProjectExcelTemplateParam param1 = new ProjectExcelTemplateParam();
                 param1.setProjectOid(param.getProjectOid());
                 param1.setProjectOid(param.getProjectOid());
                 param1.setMark(param.getMark());
                 param1.setMark(param.getMark());
-                saveProjectExcelTemplate(param1);
+                saveExcelTemplate(param1);
             }
             }
             return ResultContent.buildFail(String.format("数据不存在:%s", param.getMark()));
             return ResultContent.buildFail(String.format("数据不存在:%s", param.getMark()));
         }
         }

+ 27 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/school/AreaServiceImpl.java

@@ -1,5 +1,6 @@
 package com.zhongshu.card.server.core.service.school;
 package com.zhongshu.card.server.core.service.school;
 
 
+import com.google.common.collect.Lists;
 import com.zhongshu.card.client.model.base.IDsParam;
 import com.zhongshu.card.client.model.base.IDsParam;
 import com.zhongshu.card.client.model.org.OidAboutInfo;
 import com.zhongshu.card.client.model.org.OidAboutInfo;
 import com.zhongshu.card.client.model.school.AreaModel;
 import com.zhongshu.card.client.model.school.AreaModel;
@@ -26,6 +27,8 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 
 
 import java.util.ArrayList;
 import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
 import java.util.List;
 import java.util.List;
 import java.util.stream.Collectors;
 import java.util.stream.Collectors;
 
 
@@ -183,6 +186,30 @@ public class AreaServiceImpl extends SuperService implements AreaService {
         return models;
         return models;
     }
     }
 
 
+    public List<AreaModel> getParents(Area area) {
+        if (ObjectUtils.isNotEmpty(area)) {
+            return getParents(area.getId());
+        }
+        return Lists.newArrayList();
+    }
+
+    /**
+     * 得到所有上级数据ID包括自己的
+     *
+     * @param id
+     * @return
+     */
+    public List<String> getAllParents(String id) {
+        List<Area> list = new ArrayList<>();
+        loopLoad(id, list);
+        List<String> strings = new ArrayList<>();
+        if (ObjectUtils.isNotEmpty(list)) {
+            Collections.reverse(list);
+            strings = list.stream().map(it -> it.getId()).collect(Collectors.toList());
+        }
+        return strings;
+    }
+
     private void loopLoad(String id, List<Area> list) {
     private void loopLoad(String id, List<Area> list) {
         Area area = areaDao.findTopById(id);
         Area area = areaDao.findTopById(id);
         if (ObjectUtils.isNotEmpty(area)) {
         if (ObjectUtils.isNotEmpty(area)) {