TRX 1 year ago
parent
commit
2ca0d9cea5

+ 1 - 1
FullCardClient/src/main/java/com/zhongshu/card/client/model/base/SuperParam.java

@@ -14,7 +14,7 @@ import java.io.Serializable;
 public class SuperParam implements Serializable {
 
     @Schema(description = "数据ID", example = "")
-    private String id;
+    private String id = null;
 
     @Schema(description = "排序")
     private Long sort = 1l;

+ 1 - 1
FullCardClient/src/main/java/com/zhongshu/card/client/model/org/OrganizationAddParam.java

@@ -27,7 +27,7 @@ public class OrganizationAddParam extends SuperParam {
     @Schema(description = "联系人-用来初始管理员")
     private String contactName;
 
-    @Schema(description = "联系人电话")
+    @Schema(description = "联系人电话", required = false)
     private String contactPhone;
 
     @Schema(description = "logo")

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

@@ -30,9 +30,6 @@ public class OrganizationSearchParam extends SuperSearch {
     @Schema(description = "联系人电话")
     private String contactPhone;
 
-    @Schema(description = "logo")
-    private String logo;
-
     @Schema(description = "地址")
     private String address;
 

+ 54 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/model/org/OrganizationUpdateParam.java

@@ -0,0 +1,54 @@
+package com.zhongshu.card.client.model.org;
+
+import com.github.microservice.auth.security.type.AuthType;
+import com.zhongshu.card.client.model.base.SuperParam;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author TRX
+ * @date 2024/5/31
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class OrganizationUpdateParam  {
+
+    @Schema(description = "数据ID", example = "")
+    private String id = null;
+
+    @Schema(description = "备注")
+    private String remark;
+
+    @Schema(description = "机构名称", required = true)
+    private String name;
+
+    @Schema(description = "统一社会信用代码")
+    private String orgCode;
+
+    @Schema(description = "联系人邮箱")
+    private String contactEmail;
+
+    @Schema(description = "联系人-用来初始管理员")
+    private String contactName;
+
+    @Schema(description = "联系人电话", required = false)
+    private String contactPhone;
+
+    @Schema(description = "logo")
+    private String logo;
+
+    @Schema(description = "地址")
+    private String address;
+
+    @Schema(description = " 行政区划编码")
+    private String adminDivisionItemCode;
+
+    @Schema(description = "经度")
+    private String mapLon;
+
+    @Schema(description = "纬度")
+    private String mapLat;
+}

+ 17 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/model/org/ProjectOrgModel.java

@@ -0,0 +1,17 @@
+package com.zhongshu.card.client.model.org;
+
+import com.github.microservice.auth.security.type.AuthType;
+import com.zhongshu.card.client.model.base.SuperModel;
+import com.zhongshu.card.client.utils.type.OrganizationState;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * @author TRX
+ * @date 2024/5/31
+ */
+@Data
+public class ProjectOrgModel extends OrganizationModel {
+    @Schema(description = "学校数量")
+    private Long schoolNumber = 0L;
+}

+ 8 - 5
FullCardClient/src/main/java/com/zhongshu/card/client/service/org/OrganizationService.java

@@ -1,9 +1,6 @@
 package com.zhongshu.card.client.service.org;
 
-import com.zhongshu.card.client.model.org.OrganizationAddParam;
-import com.zhongshu.card.client.model.org.UserCountAddParam;
-import com.zhongshu.card.client.model.org.UserCountModel;
-import com.zhongshu.card.client.model.org.UserCountSearchParam;
+import com.zhongshu.card.client.model.org.*;
 import com.zhongshu.card.client.ret.ResultContent;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Parameter;
@@ -19,7 +16,13 @@ public interface OrganizationService {
 
     public ResultContent addOrganization(OrganizationAddParam param);
 
-    public ResultContent update(OrganizationAddParam param);
+    public ResultContent update(OrganizationUpdateParam param);
+
+    public ResultContent deleteOrganization(String oid);
+
+    public ResultContent<Page<OrganizationModel>> page(OrganizationSearchParam param, Pageable pageable);
+
+    public ResultContent<Page<OrganizationModel>> pageProject(OrganizationSearchParam param, Pageable pageable);
 
     ResultContent initSuperOrganization();
 }

+ 40 - 5
FullCardServer/src/main/java/com/zhongshu/card/server/core/controller/org/OrganizationController.java

@@ -3,14 +3,18 @@ package com.zhongshu.card.server.core.controller.org;
 import com.github.microservice.auth.client.constant.AuthConstant;
 import com.github.microservice.auth.security.annotations.ResourceAuth;
 import com.github.microservice.auth.security.type.AuthType;
-import com.zhongshu.card.client.model.org.DepartmentParam;
-import com.zhongshu.card.client.model.org.OrganizationAddParam;
+import com.zhongshu.card.client.model.base.OidModel;
+import com.zhongshu.card.client.model.org.*;
 import com.zhongshu.card.client.ret.ResultContent;
 import com.zhongshu.card.client.service.org.DepartmentService;
 import com.zhongshu.card.client.service.org.OrganizationService;
 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.util.Assert;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -25,6 +29,37 @@ public class OrganizationController {
     @Autowired
     private OrganizationService organizationService;
 
+    //------------------------------项目管理 start----------------------
+    @ResourceAuth(value = "user",type = AuthType.User)
+    @ResourceAuth(value = AuthConstant.SuperAdmin,type = AuthType.Platform)
+    @Operation(summary = "项目-添加", description = "项目-添加")
+    @RequestMapping(value = "addProject", method = {RequestMethod.POST})
+    public ResultContent addProject(@RequestBody OrganizationAddParam param) {
+        param.setAuthType(AuthType.Project);
+        return this.organizationService.addOrganization(param);
+    }
+
+    @ResourceAuth(value = "user",type = AuthType.User)
+    @ResourceAuth(value = AuthConstant.SuperAdmin,type = AuthType.Platform)
+    @Operation(summary = "项目列表-分页查询", description = "项目列表-分页查询")
+    @RequestMapping(value = {"pageProject"}, method = {RequestMethod.POST})
+    public ResultContent<Page<OrganizationModel>> pageProject(
+            @Parameter(hidden = true) @PageableDefault(page = 0, size = 10) Pageable pageable,
+            @Parameter(required = false) OrganizationSearchParam param) {
+        param.setAuthType(AuthType.Project);
+        return organizationService.pageProject(param, pageable);
+    }
+
+    //------------------------------项目管理 end------------------------
+
+    @ResourceAuth(value = "user",type = AuthType.User)
+    @ResourceAuth(value = AuthConstant.SuperAdmin,type = AuthType.Platform)
+    @Operation(summary = "项目-学校-商家-删除", description = "项目-学校-商家-删除")
+    @RequestMapping(value = "delete", method = {RequestMethod.POST})
+    public ResultContent delete(@RequestBody OidModel param) {
+        return this.organizationService.deleteOrganization(param.getOid());
+    }
+
     @ResourceAuth(value = "user",type = AuthType.User)
     @ResourceAuth(value = AuthConstant.SuperAdmin,type = AuthType.Platform)
     @Operation(summary = "添加机构", description = "添加机构")
@@ -34,10 +69,10 @@ public class OrganizationController {
     }
 
     @ResourceAuth(value = "user",type = AuthType.User)
-    @Operation(summary = "编辑机构-项目-学校", description = "编辑机构")
+    @Operation(summary = "编辑机构-项目-学校", description = "编辑机构-项目-学校")
     @RequestMapping(value = "update", method = {RequestMethod.POST})
-    public ResultContent update(@RequestBody OrganizationAddParam param) {
-        Assert.hasText(param.getOid(), "oid不能为空");
+    public ResultContent update(@RequestBody OrganizationUpdateParam param) {
+        Assert.hasText(param.getId(), "id不能为空");
         return this.organizationService.update(param);
     }
 

+ 2 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/org/OrganizationUserDao.java

@@ -23,4 +23,6 @@ public interface OrganizationUserDao extends MongoDao<OrganizationUser>, Organiz
 
     // 统计用户所在的结构数量
     long countByUserAndState(UserAccount user, OrganizationState state);
+
+    void deleteByOrganization(Organization organization);
 }

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

@@ -77,6 +77,10 @@ public class OrganizationDaoImpl extends BaseImpl implements OrganizationDaoExte
             Pattern pattern = Pattern.compile("^.*" + param.getContactPhone() + ".*$");
             criterias.add(Criteria.where("contactPhone").is(pattern));
         }
+        if (StringUtils.isNotEmpty(param.getCode())) {
+            Pattern pattern = Pattern.compile("^.*" + param.getCode() + ".*$");
+            criterias.add(Criteria.where("code").is(pattern));
+        }
         if (!CollectionUtils.isEmpty(criterias)) {
             criteria.andOperator(criterias.toArray(new Criteria[]{}));
         }

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

@@ -22,4 +22,7 @@ public class SuperMain extends SuperEntity {
 
     @Schema(description = "所属机构ID")
     private String oid;
+
+    @Schema(description = "创建用户ID")
+    private String createUserId;
 }

+ 86 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/handler/RestExceptionHandler.java

@@ -0,0 +1,86 @@
+package com.zhongshu.card.server.core.handler;
+
+import com.github.microservice.core.util.result.InvokerState;
+import com.zhongshu.card.client.ret.ResultContent;
+import com.zhongshu.card.client.ret.ResultException;
+import com.zhongshu.card.client.ret.ResultState;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.ObjectUtils;
+import org.springframework.http.HttpStatus;
+import org.springframework.lang.Nullable;
+import org.springframework.validation.BindException;
+import org.springframework.validation.FieldError;
+import org.springframework.validation.ObjectError;
+import org.springframework.web.bind.MissingServletRequestParameterException;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.ResponseStatus;
+import org.springframework.web.bind.annotation.RestControllerAdvice;
+import org.springframework.web.servlet.ModelAndView;
+import org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver;
+import org.springframework.web.servlet.view.json.MappingJackson2JsonView;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.stream.Collectors;
+
+@Slf4j
+@RestControllerAdvice
+@ResponseBody
+public class RestExceptionHandler extends DefaultHandlerExceptionResolver {
+
+    @ExceptionHandler(Exception.class)
+    @ResponseStatus(HttpStatus.OK)
+    public ResultContent<String> exception(Exception exception) {
+        String msg = exception.getMessage();
+        log.error("绑定异常信息 ex={}", exception.getMessage(), exception);
+        return ResultContent.buildFail(msg);
+    }
+
+    @ExceptionHandler(BindException.class)
+    @ResponseStatus(HttpStatus.OK)
+    public ResultContent<String> bindException(BindException exception) {
+        String msg = exception.getMessage();
+        try {
+            if (exception.getBindingResult() != null) {
+                List<ObjectError> list = exception.getBindingResult().getAllErrors();
+                if (ObjectUtils.isNotEmpty(list) && list.size() > 0) {
+                    ObjectError objectError = list.get(0);
+                    if (objectError instanceof FieldError) {
+                        FieldError fieldError = (FieldError) objectError;
+                        msg = String.format("【%s】 %s", fieldError.getField(), fieldError.getDefaultMessage());
+                    } else {
+                        msg = String.format("%s", objectError.getDefaultMessage());
+                    }
+                }
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        log.error("绑定异常信息 ex1={}", exception.getMessage(), exception);
+        return ResultContent.buildFail(msg);
+    }
+
+    protected ModelAndView handleMissingServletRequestParameter(MissingServletRequestParameterException ex,
+                                                                HttpServletRequest request, HttpServletResponse response, @Nullable Object handler) throws IOException {
+
+        log.error("missing param exception,uri:{},url:{}", request.getRequestURI(), request.getRequestURL());
+        return super.handleMissingServletRequestParameter(ex, request, response, handler);
+    }
+
+
+    @Override
+    public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
+        e.printStackTrace();
+        log.error("exception : {}", e);
+        ModelAndView mv = new ModelAndView();
+        mv.addObject("state", "Fail");
+        mv.setView(new MappingJackson2JsonView());
+        mv.addObject("exception", ResultException.build(e));
+        mv.addObject("msg", e.getMessage());
+        return mv;
+    }
+
+}

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

@@ -1,8 +1,37 @@
 package com.zhongshu.card.server.core.service.base;
 
+import com.github.microservice.auth.security.helper.AuthHelper;
+import org.springframework.beans.factory.annotation.Autowired;
+
 /**
  * @author TRX
  * @date 2024/6/3
  */
 public abstract class SuperService {
+
+    @Autowired
+    private AuthHelper authHelper;
+
+    /**
+     * 得到当前的用户ID
+     * @return
+     */
+    public String getCurrentUserId() {
+        if (authHelper != null && authHelper.getCurrentUser() != null) {
+            return authHelper.getCurrentUser().getUserId();
+        }
+        return null;
+    }
+
+    /**
+     * 得到当前的Oid
+     * @return
+     */
+    public String getCurrentOid() {
+        if (authHelper != null && authHelper.getCurrentUser() != null) {
+            return authHelper.getOrgId();
+        }
+        return null;
+    }
+
 }

+ 127 - 8
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/org/OrganizationServiceImpl.java

@@ -10,9 +10,10 @@ import com.github.microservice.auth.client.service.OrganizationUserService;
 import com.github.microservice.auth.client.service.RoleService;
 import com.github.microservice.auth.client.service.UserService;
 import com.github.microservice.auth.client.type.LoginType;
+import com.github.microservice.auth.security.helper.AuthHelper;
 import com.github.microservice.auth.security.type.AuthType;
-import com.zhongshu.card.client.model.org.OrganizationAddParam;
-import com.zhongshu.card.client.model.org.OrganizationModel;
+import com.github.microservice.components.data.base.util.PageEntityUtil;
+import com.zhongshu.card.client.model.org.*;
 import com.zhongshu.card.client.ret.ResultContent;
 import com.zhongshu.card.client.ret.ResultMessage;
 import com.zhongshu.card.client.service.org.OrganizationService;
@@ -28,12 +29,17 @@ import com.zhongshu.card.server.core.domain.org.Role;
 import com.zhongshu.card.server.core.domain.org.UserAccount;
 import com.zhongshu.card.server.core.service.base.SuperService;
 import com.zhongshu.card.server.core.util.BeanUtils;
+import com.zhongshu.card.server.core.util.DateUtils;
 import com.zhongshu.card.server.core.util.NextNoUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.ObjectUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.Assert;
 
 import java.util.List;
 import java.util.Set;
@@ -78,6 +84,8 @@ public class OrganizationServiceImpl extends SuperService implements Organizatio
     @Autowired
     DepartmentServiceImpl departmentService;
 
+    @Autowired
+    AuthHelper authHelper;
 
 
     /**
@@ -88,6 +96,7 @@ public class OrganizationServiceImpl extends SuperService implements Organizatio
      */
     @Override
     public ResultContent addOrganization(OrganizationAddParam param) {
+        param.setId(null);
         // 验证数据
         Organization temp = organizationDao.findTopByName(param.getName());
         if (ObjectUtils.isNotEmpty(temp)) {
@@ -97,6 +106,12 @@ public class OrganizationServiceImpl extends SuperService implements Organizatio
         if (authType == AuthType.Platform) {
             return ResultContent.buildFail("机构类型错误");
         }
+        String contactPhone = param.getContactPhone();
+        List<AuthType> authTypes = List.of(AuthType.School, AuthType.Shop, AuthType.Enterprise);
+        if (authTypes.contains(authType)) {
+            Assert.hasText(contactPhone, "contactPhone 不能为空");
+        }
+
         String code = param.getCode();
         if (StringUtils.isEmpty(code)) {
             code = NextNoUtil.getNextNo(authType.getCode().toUpperCase());
@@ -130,29 +145,119 @@ public class OrganizationServiceImpl extends SuperService implements Organizatio
         Organization organization = new Organization();
         BeanUtils.copyProperties(param, organization);
         organization.setOid(oid);
+        organization.setCreateUserId(getCurrentUserId());
         organizationDao.save(organization);
 
-        // 初始机构数据
-        initOrganization(organization);
+        // 不为项目的时候,要初始数据
+        if (authType != AuthType.Project) {
+            // 初始机构数据
+            initOrganization(organization);
+        }
 
         return ResultContent.buildSuccess();
     }
 
     /**
-     * 编辑机构
+     * 编辑机构 (编辑基本信息)
      *
      * @param param
      * @return
      */
     @Override
-    public ResultContent update(OrganizationAddParam param) {
-        Organization organization = new Organization();
-
+    public ResultContent update(OrganizationUpdateParam param) {
+        Organization organization =  organizationDao.findTopById(param.getId());
+        if (ObjectUtils.isEmpty(organization)) {
+            return ResultContent.buildFail(String.format(ResultMessage.DATA_NOT_EXIST, param.getId()));
+        }
+        Organization temp = organizationDao.findTopByName(param.getName());
+        if (ObjectUtils.isNotEmpty(temp)) {
+            if (!temp.getId().equals(param.getId())) {
+                return ResultContent.buildFail(String.format(ResultMessage.NAME_EXIST, param.getName()));
+            }
+        }
 
+        BeanUtils.copyProperties(param, organization);
         organizationDao.save(organization);
         return ResultContent.buildSuccess();
     }
 
+    /**
+     * 删除机构
+     * @param oid
+     * @return
+     */
+    @Transactional
+    public ResultContent deleteOrganization(String oid) {
+        Assert.hasText(oid, "oid不能为空");
+        Organization organization = organizationDao.findTopByOid(oid);
+        if (ObjectUtils.isEmpty(organization)) {
+            return ResultContent.buildFail(String.format(ResultMessage.DATA_NOT_EXIST, oid));
+        }
+        if(organization.getAuthType() == AuthType.Platform) {
+            return ResultContent.buildFail(String.format("该类型数据不能删除: %s", organization.getAuthType().getRemark()));
+        }
+        String currentOid = getCurrentOid();
+        if (StringUtils.isNotEmpty(currentOid) && currentOid.equals(oid)) {
+            return ResultContent.buildFail(String.format("不能删除当前结构"));
+        }
+
+        // 删除
+        organizationDao.delete(organization);
+
+        // 删除用户关系
+        organizationUserDao.deleteByOrganization(organization);
+
+        // 删除角色?
+
+        // 删除部门
+
+        return ResultContent.buildSuccess();
+    }
+
+    /**
+     * 分页数据
+     *
+     * @param param
+     * @param pageable
+     * @return
+     */
+    @Override
+    public ResultContent<Page<OrganizationModel>> page(OrganizationSearchParam param, Pageable pageable) {
+        List<Long> times = param.getTimes();
+        if (ObjectUtils.isNotEmpty(times) && times.size() == 2) {
+            Long startTime = times.get(0);
+            startTime = DateUtils.getDayStartTime(startTime);
+            Long endTime = times.get(1);
+            endTime = DateUtils.getDayEndTime(endTime);
+            param.setStartTime(startTime);
+            param.setEndTime(endTime);
+        }
+        Page<Organization> page = organizationDao.page(pageable, param);
+        return ResultContent.buildSuccess(PageEntityUtil.toPageModel(page, this::toModel));
+    }
+
+    /**
+     * 分页数据
+     *
+     * @param param
+     * @param pageable
+     * @return
+     */
+    @Override
+    public ResultContent<Page<OrganizationModel>> pageProject(OrganizationSearchParam param, Pageable pageable) {
+        List<Long> times = param.getTimes();
+        if (ObjectUtils.isNotEmpty(times) && times.size() == 2) {
+            Long startTime = times.get(0);
+            startTime = DateUtils.getDayStartTime(startTime);
+            Long endTime = times.get(1);
+            endTime = DateUtils.getDayEndTime(endTime);
+            param.setStartTime(startTime);
+            param.setEndTime(endTime);
+        }
+        Page<Organization> page = organizationDao.page(pageable, param);
+        return ResultContent.buildSuccess(PageEntityUtil.toPageModel(page, this::toProjectModel));
+    }
+
     /**
      * 初始平台信息
      *
@@ -337,4 +442,18 @@ public class OrganizationServiceImpl extends SuperService implements Organizatio
         }
         return model;
     }
+
+    /**
+     * 项目的信息模型
+     *
+     * @param entity
+     * @return
+     */
+    public ProjectOrgModel toProjectModel(Organization entity) {
+        ProjectOrgModel model = new ProjectOrgModel();
+        if (ObjectUtils.isNotEmpty(entity)) {
+            BeanUtils.copyProperties(entity, model);
+        }
+        return model;
+    }
 }