Selaa lähdekoodia

Merge remote-tracking branch 'origin/master'

wujiefeng 1 vuosi sitten
vanhempi
commit
7ed724e9cc
25 muutettua tiedostoa jossa 795 lisäystä ja 184 poistoa
  1. 3 0
      FullCardClient/src/main/java/com/zhongshu/card/client/model/org/OrganizationUserSearch.java
  2. 46 0
      FullCardClient/src/main/java/com/zhongshu/card/client/model/paySetting/paySetting/PayOrderSettingModel.java
  3. 33 0
      FullCardClient/src/main/java/com/zhongshu/card/client/model/paySetting/paySetting/PayOrderSettingParam.java
  4. 10 0
      FullCardClient/src/main/java/com/zhongshu/card/client/model/paySetting/paySetting/ProjectMainPaySettingModel.java
  5. 10 0
      FullCardClient/src/main/java/com/zhongshu/card/client/model/paySetting/paySetting/ProjectMainPaySettingParam.java
  6. 19 75
      FullCardClient/src/main/java/com/zhongshu/card/client/openApi/model/DevicePermissOpenApiModel.java
  7. 67 0
      FullCardClient/src/main/java/com/zhongshu/card/client/openApi/model/OrganizationUserOpenApiModel.java
  8. 36 0
      FullCardClient/src/main/java/com/zhongshu/card/client/openApi/params/OrganizationUserOpenApiSearch.java
  9. 23 0
      FullCardClient/src/main/java/com/zhongshu/card/client/openApi/params/PermissChangeOpenApiParam.java
  10. 21 0
      FullCardClient/src/main/java/com/zhongshu/card/client/openApi/params/UserOpenApiParam.java
  11. 19 0
      FullCardClient/src/main/java/com/zhongshu/card/client/type/paySetting/WithdrawMethodType.java
  12. 38 4
      FullCardServer/src/main/java/com/zhongshu/card/server/core/controller/openAPI/DevicePermissOpenApiController.java
  13. 1 1
      FullCardServer/src/main/java/com/zhongshu/card/server/core/controller/openAPI/ExpenseFlowOpenApiController.java
  14. 45 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/controller/openAPI/OrganizationUserOpenApiController.java
  15. 2 1
      FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/devices/DevicePermissDao.java
  16. 17 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/projectAbout/PayOrderSettingDao.java
  17. 34 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/domain/paySetting/PayOrderSetting.java
  18. 10 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/domain/paySetting/ProjectMainPaySetting.java
  19. 157 4
      FullCardServer/src/main/java/com/zhongshu/card/server/core/service/openAPI/DevicePermissOpenApiService.java
  20. 42 79
      FullCardServer/src/main/java/com/zhongshu/card/server/core/service/openAPI/OrganizationUserOpenApiService.java
  21. 64 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/service/paySetting/PayOrderSettingService.java
  22. 22 12
      FullCardServer/src/main/java/com/zhongshu/card/server/core/service/paySetting/ProjectMainPaySettingService.java
  23. 55 6
      FullCardServer/src/main/java/com/zhongshu/card/server/core/service/payment/PayCallService.java
  24. 1 1
      FullCardServer/src/main/java/com/zhongshu/card/server/core/service/schedule/ScheduleTaskConfigService.java
  25. 20 1
      FullCardServer/src/main/java/com/zhongshu/card/server/core/service/schedule/TaskContextService.java

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

@@ -25,6 +25,9 @@ public class OrganizationUserSearch extends SuperSearch {
     @Schema(description = "登录名")
     private String loginName;
 
+    @Schema(description = "工号")
+    private String code;
+
     @Schema(description = "用户手机号")
     private String phone;
 

+ 46 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/model/paySetting/paySetting/PayOrderSettingModel.java

@@ -0,0 +1,46 @@
+package com.zhongshu.card.client.model.paySetting.paySetting;
+
+import com.github.microservice.types.payment.PaymentType;
+import com.zhongshu.card.client.type.DataState;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author TRX
+ * @date 2024/11/12
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class PayOrderSettingModel {
+
+    @Schema(description = "数据ID")
+    private String id;
+
+    @Schema(description = "支付渠道")
+    private PaymentType paymentType;
+
+    @Schema(description = "名称")
+    private String name;
+
+    @Schema(description = "支付产品的图标")
+    private String logo;
+
+    private String paymentTypeStr;
+
+    public String getPaymentTypeStr() {
+        if (paymentType != null) {
+            return paymentType.getRemark();
+        }
+        return "";
+    }
+
+    @Schema(description = "排序")
+    private Long sort = 1l;
+
+    @Schema(description = "是否启用")
+    private DataState state = DataState.Enable;
+    
+}

+ 33 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/model/paySetting/paySetting/PayOrderSettingParam.java

@@ -0,0 +1,33 @@
+package com.zhongshu.card.client.model.paySetting.paySetting;
+
+import com.github.microservice.types.payment.PaymentType;
+import com.zhongshu.card.client.type.DataState;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author TRX
+ * @date 2024/11/12
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class PayOrderSettingParam {
+
+    @Schema(description = "数据ID")
+    private String id;
+
+    @Schema(description = "支付渠道")
+    private PaymentType paymentType;
+
+    @Schema(description = "所属用户userId")
+    private String userId;
+
+    @Schema(description = "是否启用")
+    private DataState state = DataState.Enable;
+
+    @Schema(description = "排序")
+    private Long sort = 1l;
+}

+ 10 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/model/paySetting/paySetting/ProjectMainPaySettingModel.java

@@ -4,6 +4,7 @@ import com.github.microservice.types.payment.PaymentChannelType;
 import com.github.microservice.types.payment.PaymentType;
 import com.zhongshu.card.client.type.paySetting.RegularType;
 import com.zhongshu.card.client.type.paySetting.SettlementRulesType;
+import com.zhongshu.card.client.type.paySetting.WithdrawMethodType;
 import com.zhongshu.card.client.type.paySetting.WithdrawType;
 import io.swagger.v3.oas.annotations.media.Schema;
 import jakarta.validation.constraints.Max;
@@ -53,6 +54,15 @@ public class ProjectMainPaySettingModel {
     @Schema(description = "结算规则")
     private SettlementRulesType settlementRulesType;
 
+    @Schema(description = "提现方式")
+    private WithdrawMethodType withdrawMethodType;
+
+    @Schema(description = "最小的提现额度")
+    private Long minWithdraw = 0L;
+
+    @Schema(description = "最大的提现额度")
+    private Long maxWithdraw = 0L;
+
     //---------------D+N结算 设置
     @Schema(description = "天数,>= 1")
     @Min(value = 1)

+ 10 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/model/paySetting/paySetting/ProjectMainPaySettingParam.java

@@ -2,6 +2,7 @@ package com.zhongshu.card.client.model.paySetting.paySetting;
 
 import com.zhongshu.card.client.type.paySetting.RegularType;
 import com.zhongshu.card.client.type.paySetting.SettlementRulesType;
+import com.zhongshu.card.client.type.paySetting.WithdrawMethodType;
 import com.zhongshu.card.client.type.paySetting.WithdrawType;
 import io.swagger.v3.oas.annotations.media.Schema;
 import jakarta.validation.constraints.NotEmpty;
@@ -59,6 +60,15 @@ public class ProjectMainPaySettingParam {
     @NotNull
     private WithdrawType withdrawType;
 
+    @Schema(description = "提现方式")
+    private WithdrawMethodType withdrawMethodType;
+
+    @Schema(description = "最小的提现额度")
+    private Long minWithdraw = 0L;
+
+    @Schema(description = "最大的提现额度")
+    private Long maxWithdraw = 0L;
+
     //---------------------------分账规则配置 start ------------
     @Schema(description = "最小分账金额, 单位分")
     private Long minSharing = 0L;

+ 19 - 75
FullCardClient/src/main/java/com/zhongshu/card/client/openApi/model/DevicePermissOpenApiModel.java

@@ -1,7 +1,6 @@
 package com.zhongshu.card.client.openApi.model;
 
 import com.github.microservice.models.type.DeviceType;
-import com.zhongshu.card.client.model.base.SuperModel;
 import com.zhongshu.card.client.model.devices.DeviceInfoModel;
 import com.zhongshu.card.client.model.org.DepartmentModel;
 import com.zhongshu.card.client.model.org.OrganizationUserModel;
@@ -9,10 +8,11 @@ import com.zhongshu.card.client.model.org.UserCountSimpleModel;
 import com.zhongshu.card.client.model.org.role.RoleModel;
 import com.zhongshu.card.client.model.school.AreaSimpleModel;
 import com.zhongshu.card.client.model.school.DictInfoSimpleModel;
+import com.zhongshu.card.client.openApi.base.SuperAPIModel;
 import com.zhongshu.card.client.type.DataState;
 import com.zhongshu.card.client.type.OnLineState;
+import com.zhongshu.card.client.type.Sex;
 import com.zhongshu.card.client.type.UserState;
-import com.zhongshu.opengateway.client.model.OpenApiModel;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.AllArgsConstructor;
 import lombok.Data;
@@ -29,33 +29,22 @@ import java.util.List;
 @Data
 @AllArgsConstructor
 @NoArgsConstructor
-public class DevicePermissOpenApiModel extends OpenApiModel {
+public class DevicePermissOpenApiModel extends SuperAPIModel {
 
-    @Schema(description = "关联的设备信息")
-    private DeviceInfoModel deviceInfo;
+    //-----------------------设备信息 start-----------------
 
-    //------------------设备冗余数据 start-------------------
-    @Schema(description = "设备ID")
+    @Schema(description = "设备ID、设备号")
     private String deviceId;
 
     @Schema(description = "设备名称")
     private String deviceName;
 
+    @Schema(description = "关联的项目code")
+    private String projectInfoCode;
+
     @Schema(description = "设备类型,如 消费机 门禁机")
     private DeviceType deviceType;
 
-    @Schema(description = "是否在线")
-    private OnLineState onLineState;
-
-    private String onLineStateStr;
-
-    public String getOnLineStateStr() {
-        if (onLineState != null) {
-            return onLineState.getRemark();
-        }
-        return "";
-    }
-
     private String deviceTypeStr;
 
     public String getDeviceTypeStr() {
@@ -65,69 +54,25 @@ public class DevicePermissOpenApiModel extends OpenApiModel {
         return "";
     }
 
-    @Schema(description = "区域信息")
-    private AreaSimpleModel area;
-
-    public AreaSimpleModel getArea() {
-        if (ObjectUtils.isNotEmpty(deviceInfo)) {
-            return deviceInfo.getArea();
-        }
-        return null;
-    }
-
-    @Schema(description = "区域所有上级ID路径,如:a1/a12/a123")
-    private String areaPaths = "";
-
-    @Schema(description = "可使用的用户信息")
-    private UserCountSimpleModel userAccount;
-
-    public UserCountSimpleModel getUserAccount() {
-        if (organizationUser != null) {
-            return organizationUser.getUser();
-        }
-        return null;
-    }
-
-    @Schema(description = "机构用户信息")
-    private OrganizationUserModel organizationUser;
+    //----------------------用户信息 start ------------------
 
-    //---------------用户冗余数据 start--------------
+    @Schema(description = "工号、编码")
+    private String code;
 
-    @Schema(description = "可使用用户userId")
+    @Schema(description = "用户ID(由鉴权中心颁发)")
     private String userId;
 
+    @Schema(description = "用户手机号")
+    private String phone;
+
     @Schema(description = "昵称")
     private String name;
 
-    @Schema(description = "编码")
-    private String code;
-
-    @Schema(description = "用户所属机构oid")
-    private String userOid;
-
-    @Schema(description = "职位")
-    private DictInfoSimpleModel position;
-
-    @Schema(description = "角色信息")
-    private List<RoleModel> roles = new ArrayList<>();
-
-    @Schema(description = "部门信息")
-    private DepartmentModel department;
+    @Schema(description = "头像")
+    private String profilePic;
 
-    @Schema(description = "用户状态")
-    private UserState state = UserState.Normal;
-
-    private String stateStr;
-
-    public String getStateStr() {
-        if (state != null) {
-            return state.getRemark();
-        }
-        return "";
-    }
-
-    @Schema(description = "权限是否下发")
-    private Boolean isUsed = Boolean.FALSE;
+    @Schema(description = "性别")
+    private Sex sex;
 
     @Schema(description = "权限是否可用")
     private DataState dataState;
@@ -140,5 +85,4 @@ public class DevicePermissOpenApiModel extends OpenApiModel {
         }
         return "";
     }
-
 }

+ 67 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/openApi/model/OrganizationUserOpenApiModel.java

@@ -0,0 +1,67 @@
+package com.zhongshu.card.client.openApi.model;
+
+import com.github.microservice.auth.security.type.AuthType;
+import com.zhongshu.card.client.model.base.SuperModel;
+import com.zhongshu.card.client.model.org.DepartmentModel;
+import com.zhongshu.card.client.model.org.OrganizationMiniModel;
+import com.zhongshu.card.client.model.org.UserCountSimpleModel;
+import com.zhongshu.card.client.model.org.role.RoleModel;
+import com.zhongshu.card.client.model.school.DictInfoSimpleModel;
+import com.zhongshu.card.client.openApi.base.SuperAPIModel;
+import com.zhongshu.card.client.type.CertificateType;
+import com.zhongshu.card.client.type.OrganizationUserType;
+import com.zhongshu.card.client.type.Sex;
+import com.zhongshu.card.client.type.UserState;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.apache.commons.lang3.ObjectUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 机构用户详情
+ *
+ * @author TRX
+ * @date 2024/6/6
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class OrganizationUserOpenApiModel extends SuperAPIModel {
+
+    @Schema(description = "工号/学号")
+    private String code;
+
+    @Schema(description = "用户ID(由鉴权中心颁发)")
+    private String userId;
+
+    @Schema(description = "用户手机号")
+    private String phone;
+
+    @Schema(description = "昵称")
+    private String name;
+
+    @Schema(description = "头像")
+    private String profilePic;
+
+    @Schema(description = "性别")
+    private Sex sex;
+
+    //-------------------------------机构信息 start ---------------
+    @Schema(description = "机构名称")
+    private String orgName;
+
+    @Schema(description = "机构类型")
+    private AuthType authType;
+
+    @Schema(description = "所属机构oid")
+    private String orgOid;
+
+    @Schema(description = "logo")
+    private String logo;
+
+}

+ 36 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/openApi/params/OrganizationUserOpenApiSearch.java

@@ -0,0 +1,36 @@
+package com.zhongshu.card.client.openApi.params;
+
+import com.github.microservice.auth.security.type.AuthType;
+import com.zhongshu.card.client.model.base.SuperSearch;
+import com.zhongshu.card.client.openApi.base.SuperOpenAPIParam;
+import com.zhongshu.card.client.type.OrganizationUserType;
+import com.zhongshu.card.client.type.UserState;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author TRX
+ * @date 2024/5/31
+ */
+@Data
+public class OrganizationUserOpenApiSearch extends SuperOpenAPIParam {
+
+    @Schema(description = "关键字")
+    private String keyWord;
+
+    @Schema(description = "用户ID")
+    private String userId;
+
+    @Schema(description = "登录名")
+    private String loginName;
+
+    @Schema(description = "用户手机号")
+    private String phone;
+
+    @Schema(description = "姓名")
+    private String name;
+
+    private String code;
+}

+ 23 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/openApi/params/PermissChangeOpenApiParam.java

@@ -0,0 +1,23 @@
+package com.zhongshu.card.client.openApi.params;
+
+import com.zhongshu.card.client.openApi.base.ProjectCodeParam;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author TRX
+ * @date 2024/11/12
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class PermissChangeOpenApiParam extends ProjectCodeParam {
+
+    @Schema(description = "用户userId")
+    private String userId;
+
+    @Schema(description = "设备ID")
+    private String deviceId;
+}

+ 21 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/openApi/params/UserOpenApiParam.java

@@ -0,0 +1,21 @@
+package com.zhongshu.card.client.openApi.params;
+
+import com.zhongshu.card.client.openApi.base.ProjectCodeParam;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author TRX
+ * @date 2024/11/12
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class UserOpenApiParam extends ProjectCodeParam {
+
+    @Schema(description = "用户userId")
+    private String userId;
+
+}

+ 19 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/type/paySetting/WithdrawMethodType.java

@@ -0,0 +1,19 @@
+package com.zhongshu.card.client.type.paySetting;
+
+import lombok.Getter;
+
+/**
+ * 提现规则
+ */
+public enum WithdrawMethodType {
+    OnLine("线上"),
+    OffLine("线下"),
+    ;
+
+    @Getter
+    private String remark;
+
+    WithdrawMethodType(String remark) {
+        this.remark = remark;
+    }
+}

+ 38 - 4
FullCardServer/src/main/java/com/zhongshu/card/server/core/controller/openAPI/DevicePermissOpenApiController.java

@@ -5,9 +5,8 @@ import com.github.microservice.auth.security.type.AuthType;
 import com.github.microservice.net.ResultContent;
 import com.zhongshu.card.client.openApi.model.DeviceInfoOpenApiModel;
 import com.zhongshu.card.client.openApi.model.DevicePermissOpenApiModel;
-import com.zhongshu.card.client.openApi.params.DeviceIdAndProjectCodeParam;
-import com.zhongshu.card.client.openApi.params.DeviceIdParam;
-import com.zhongshu.card.client.openApi.params.DeviceInfoOpenApiSearch;
+import com.zhongshu.card.client.openApi.params.*;
+import com.zhongshu.card.client.type.DataState;
 import com.zhongshu.card.server.core.service.openAPI.DevicePermissOpenApiService;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
@@ -47,10 +46,45 @@ public class DevicePermissOpenApiController {
     }
 
     @ResourceAuth(value = "user", type = AuthType.User)
-    @Operation(summary = "查询设备的权限", description = "设备详情-根据设备ID查询")
+    @Operation(summary = "查询设备的权限", description = "查询设备的权限")
     @RequestMapping(value = {"getDevicePermissByDeviceId"}, method = {RequestMethod.POST})
     public ResultContent<List<DevicePermissOpenApiModel>> getDevicePermissByDeviceId(@RequestBody DeviceIdAndProjectCodeParam param) {
         return devicePermissOpenApiService.getDevicePermissByDeviceId(param);
     }
 
+    @ResourceAuth(value = "user", type = AuthType.User)
+    @Operation(summary = "查询用户的设备权限", description = "查询用户的设备权限")
+    @RequestMapping(value = {"getDevicePermissByUserId"}, method = {RequestMethod.POST})
+    public ResultContent<List<DevicePermissOpenApiModel>> getDevicePermissByUserId(@RequestBody UserOpenApiParam param) {
+        return devicePermissOpenApiService.getDevicePermissByUserId(param);
+    }
+
+    @ResourceAuth(value = "user", type = AuthType.User)
+    @Operation(summary = "启用权限", description = "启用权限")
+    @RequestMapping(value = {"enablePermiss"}, method = {RequestMethod.POST})
+    public ResultContent enablePermiss(@RequestBody PermissChangeOpenApiParam param) {
+        return devicePermissOpenApiService.changePermissState(param, DataState.Enable);
+    }
+
+    @ResourceAuth(value = "user", type = AuthType.User)
+    @Operation(summary = "禁用权限", description = "禁用权限")
+    @RequestMapping(value = {"disablePermiss"}, method = {RequestMethod.POST})
+    public ResultContent disablePermiss(@RequestBody PermissChangeOpenApiParam param) {
+        return devicePermissOpenApiService.changePermissState(param, DataState.Disable);
+    }
+
+    @ResourceAuth(value = "user", type = AuthType.User)
+    @Operation(summary = "移除设备权限", description = "移除设备权限")
+    @RequestMapping(value = {"deletePermiss"}, method = {RequestMethod.POST})
+    public ResultContent deletePermiss(@RequestBody PermissChangeOpenApiParam param) {
+        return devicePermissOpenApiService.deletePermiss(param);
+    }
+
+    @ResourceAuth(value = "user", type = AuthType.User)
+    @Operation(summary = "添加用户设备权限", description = "添加用户设备权限")
+    @RequestMapping(value = {"addPermiss"}, method = {RequestMethod.POST})
+    public ResultContent addPermiss(@RequestBody PermissChangeOpenApiParam param) {
+        return devicePermissOpenApiService.addPermiss(param);
+    }
+
 }

+ 1 - 1
FullCardServer/src/main/java/com/zhongshu/card/server/core/controller/openAPI/ExpenseFlowOpenApiController.java

@@ -33,7 +33,7 @@ import javax.validation.Valid;
  * @date 2024/6/5
  */
 @RestController
-@RequestMapping("/openAPI/v1/projectManager")
+@RequestMapping("/openAPI/v1/orderManager")
 @Tag(name = "openAPI-订单管理")
 public class ExpenseFlowOpenApiController {
 

+ 45 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/controller/openAPI/OrganizationUserOpenApiController.java

@@ -0,0 +1,45 @@
+package com.zhongshu.card.server.core.controller.openAPI;
+
+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.openApi.model.OrganizationUserOpenApiModel;
+import com.zhongshu.card.client.openApi.params.OrganizationUserOpenApiSearch;
+import com.zhongshu.card.server.core.service.openAPI.OrganizationUserOpenApiService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+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;
+
+/**
+ * @author TRX
+ * @date 2024/6/5
+ */
+@RestController
+@RequestMapping("/openAPI/v1/projectUserManager")
+@Tag(name = "openAPI-项目用户")
+public class OrganizationUserOpenApiController {
+
+    @Autowired
+    private OrganizationUserOpenApiService organizationUserOpenApiService;
+
+    @ResourceAuth(value = "user", type = AuthType.User)
+    @Operation(summary = "项目用户列表-分页查询", description = "项目用户列表-分页查询")
+    @RequestMapping(value = {"page"}, method = {RequestMethod.POST})
+    public ResultContent<Page<OrganizationUserOpenApiModel>> page(@RequestBody OrganizationUserOpenApiSearch param) {
+        return organizationUserOpenApiService.projectUserPage(param);
+    }
+
+    @ResourceAuth(value = "user", type = AuthType.User)
+    @Operation(summary = "用户详情", description = "用户详情")
+    @RequestMapping(value = {"getUserDetailById"}, method = {RequestMethod.POST})
+    public ResultContent<OrganizationUserOpenApiModel> getUserDetailById(@RequestBody IDParam param) {
+        return organizationUserOpenApiService.getUserDetailById(param.getId());
+    }
+
+}

+ 2 - 1
FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/devices/DevicePermissDao.java

@@ -18,11 +18,12 @@ public interface DevicePermissDao extends MongoDao<DevicePermiss>, DevicePermiss
 
     DevicePermiss findTopById(String id);
 
-
     List<DevicePermiss> findByIdIn(List<String> ids);
 
     List<DevicePermiss> findByDeviceIdAndProjectOid(String deviceId, String projectOid);
 
+    List<DevicePermiss> findByUserIdAndProjectOid(String userId, String projectOid);
+
     DevicePermiss findTopByDeviceIdAndOrganizationUser(String deviceId, OrganizationUser organizationUser);
 
     DevicePermiss findTopByUserIdAndDeviceIdAndProjectOid(String userId, String deviceId, String projectOid);

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

@@ -0,0 +1,17 @@
+package com.zhongshu.card.server.core.dao.projectAbout;
+
+import com.github.microservice.components.data.mongo.mongo.dao.MongoDao;
+import com.github.microservice.types.payment.PaymentType;
+import com.zhongshu.card.client.type.DataState;
+import com.zhongshu.card.server.core.domain.paySetting.PayOrderSetting;
+import com.zhongshu.card.server.core.domain.paySetting.ProjectPaySetting;
+
+import java.util.List;
+
+public interface PayOrderSettingDao extends MongoDao<PayOrderSetting> {
+
+    PayOrderSetting findTopById(String id);
+
+    List<PayOrderSetting> findByUserIdAndProjectOidOrderBySortAsc(String userId, String projectOid);
+
+}

+ 34 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/domain/paySetting/PayOrderSetting.java

@@ -0,0 +1,34 @@
+package com.zhongshu.card.server.core.domain.paySetting;
+
+import com.github.microservice.types.payment.PaymentType;
+import com.zhongshu.card.client.type.DataState;
+import com.zhongshu.card.server.core.domain.base.SuperMain;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.springframework.data.mongodb.core.mapping.Document;
+
+import java.util.Date;
+
+/**
+ * @author TRX
+ * @date 2024/11/12
+ */
+@Data
+@Builder
+@Document
+@AllArgsConstructor
+@NoArgsConstructor
+public class PayOrderSetting extends SuperMain {
+
+    @Schema(description = "支付渠道")
+    private PaymentType paymentType;
+
+    @Schema(description = "所属用户userId")
+    private String userId;
+
+    @Schema(description = "是否启用")
+    private DataState state = DataState.Enable;
+}

+ 10 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/domain/paySetting/ProjectMainPaySetting.java

@@ -4,6 +4,7 @@ import com.github.microservice.types.payment.PaymentChannelType;
 import com.github.microservice.types.payment.PaymentType;
 import com.zhongshu.card.client.type.paySetting.RegularType;
 import com.zhongshu.card.client.type.paySetting.SettlementRulesType;
+import com.zhongshu.card.client.type.paySetting.WithdrawMethodType;
 import com.zhongshu.card.client.type.paySetting.WithdrawType;
 import com.zhongshu.card.server.core.domain.base.SuperMain;
 import io.swagger.v3.oas.annotations.media.Schema;
@@ -84,6 +85,15 @@ public class ProjectMainPaySetting extends SuperMain {
     @Schema(description = "提现规则类型")
     private WithdrawType withdrawType;
 
+    @Schema(description = "提现方式")
+    private WithdrawMethodType withdrawMethodType;
+
+    @Schema(description = "最小的提现额度")
+    private Long minWithdraw = 0L;
+    
+    @Schema(description = "最大的提现额度")
+    private Long maxWithdraw = 0L;
+
     //---------------------------分账规则配置 start ------------
     @Schema(description = "最小分账金额, 单位分")
     private Long minSharing = 0L;

+ 157 - 4
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/openAPI/DevicePermissOpenApiService.java

@@ -2,22 +2,27 @@ package com.zhongshu.card.server.core.service.openAPI;
 
 import com.github.microservice.components.data.base.util.PageEntityUtil;
 import com.github.microservice.net.ResultContent;
+import com.zhongshu.card.client.model.base.IDsParam;
 import com.zhongshu.card.client.model.devices.DeviceInfoSearch;
+import com.zhongshu.card.client.model.devices.DevicePermissParam;
 import com.zhongshu.card.client.model.org.OrganizationMiniModel;
 import com.zhongshu.card.client.model.school.AreaSimpleModel;
 import com.zhongshu.card.client.openApi.model.DeviceInfoOpenApiModel;
 import com.zhongshu.card.client.openApi.model.DeviceInfoOpenApiSimpleModel;
 import com.zhongshu.card.client.openApi.model.DevicePermissOpenApiModel;
-import com.zhongshu.card.client.openApi.params.DeviceIdAndProjectCodeParam;
-import com.zhongshu.card.client.openApi.params.DeviceIdParam;
-import com.zhongshu.card.client.openApi.params.DeviceInfoOpenApiSearch;
+import com.zhongshu.card.client.openApi.params.*;
+import com.zhongshu.card.client.type.DataState;
 import com.zhongshu.card.server.core.dao.devices.DeviceInfoDao;
 import com.zhongshu.card.server.core.dao.devices.DevicePermissDao;
-import com.zhongshu.card.server.core.dao.payment.ExpenseFlowDao;
 import com.zhongshu.card.server.core.domain.devices.DeviceInfo;
 import com.zhongshu.card.server.core.domain.devices.DevicePermiss;
+import com.zhongshu.card.server.core.domain.org.OrganizationUser;
+import com.zhongshu.card.server.core.domain.org.UserAccount;
 import com.zhongshu.card.server.core.service.base.SuperService;
+import com.zhongshu.card.server.core.service.devices.DevicePermissIotService;
+import com.zhongshu.card.server.core.service.devices.DevicePermissService;
 import com.zhongshu.card.server.core.service.org.OrganizationServiceImpl;
+import com.zhongshu.card.server.core.service.org.OrganizationUserServiceImpl;
 import com.zhongshu.card.server.core.service.orgManager.OrganizationManagerServiceImpl;
 import com.zhongshu.card.server.core.service.school.AreaServiceImpl;
 import com.zhongshu.card.server.core.util.BeanUtils;
@@ -60,6 +65,15 @@ public class DevicePermissOpenApiService extends SuperService {
     @Autowired
     private DevicePermissDao devicePermissDao;
 
+    @Autowired
+    private DevicePermissIotService devicePermissIotService;
+
+    @Autowired
+    private DevicePermissService devicePermissService;
+
+    @Autowired
+    private OrganizationUserServiceImpl organizationUserService;
+
     /**
      * 设备列表
      *
@@ -114,6 +128,119 @@ public class DevicePermissOpenApiService extends SuperService {
         return ResultContent.buildSuccess(models);
     }
 
+    public ResultContent changePermissState(PermissChangeOpenApiParam param, DataState dataState) {
+        if (StringUtils.isEmpty(param.getProjectCode())) {
+            return ResultContent.buildFail("projectCode不能为空");
+        }
+        if (StringUtils.isEmpty(param.getUserId())) {
+            return ResultContent.buildFail("userId不能为空");
+        }
+        if (StringUtils.isEmpty(param.getDeviceId())) {
+            return ResultContent.buildFail("deviceId不能为空");
+        }
+        String projectOid = getOidByCode(param.getProjectCode());
+        if (StringUtils.isEmpty(projectOid)) {
+            return ResultContent.buildFail("projectCode不存在");
+        }
+        DevicePermiss entity = devicePermissDao.findTopByUserIdAndDeviceIdAndProjectOid(param.getUserId(), param.getDeviceId(), projectOid);
+        if (ObjectUtils.isEmpty(entity)) {
+            return ResultContent.buildFail("权限不存在");
+        }
+        if (dataState == DataState.Disable) {
+            // 移除权限
+            devicePermissIotService.changeDeviceUser(List.of(entity), 0, "");
+        } else {
+            // 启用
+            devicePermissIotService.changeDeviceUser(List.of(entity), 1, "");
+        }
+        return ResultContent.buildSuccess();
+    }
+
+    /**
+     * 移出权限
+     *
+     * @param param
+     * @return
+     */
+    public ResultContent deletePermiss(PermissChangeOpenApiParam param) {
+        if (StringUtils.isEmpty(param.getProjectCode())) {
+            return ResultContent.buildFail("projectCode不能为空");
+        }
+        if (StringUtils.isEmpty(param.getUserId())) {
+            return ResultContent.buildFail("userId不能为空");
+        }
+        if (StringUtils.isEmpty(param.getDeviceId())) {
+            return ResultContent.buildFail("deviceId不能为空");
+        }
+        String projectOid = getOidByCode(param.getProjectCode());
+        if (StringUtils.isEmpty(projectOid)) {
+            return ResultContent.buildFail("projectCode不存在");
+        }
+        DevicePermiss entity = devicePermissDao.findTopByUserIdAndDeviceIdAndProjectOid(param.getUserId(), param.getDeviceId(), projectOid);
+        if (ObjectUtils.isEmpty(entity)) {
+            return ResultContent.buildFail("权限不存在");
+        }
+        IDsParam iDsParam = new IDsParam();
+        iDsParam.setIds(List.of(entity.getId()));
+        return devicePermissService.deleteByIds(iDsParam);
+    }
+
+    /**
+     * 添加权限
+     *
+     * @param param
+     * @return
+     */
+    public ResultContent addPermiss(PermissChangeOpenApiParam param) {
+        if (StringUtils.isEmpty(param.getProjectCode())) {
+            return ResultContent.buildFail("projectCode不能为空");
+        }
+        if (StringUtils.isEmpty(param.getUserId())) {
+            return ResultContent.buildFail("userId不能为空");
+        }
+        if (StringUtils.isEmpty(param.getDeviceId())) {
+            return ResultContent.buildFail("deviceId不能为空");
+        }
+        String projectOid = getOidByCode(param.getProjectCode());
+        if (StringUtils.isEmpty(projectOid)) {
+            return ResultContent.buildFail("projectCode不存在");
+        }
+        DevicePermiss entity = devicePermissDao.findTopByUserIdAndDeviceIdAndProjectOid(param.getUserId(), param.getDeviceId(), projectOid);
+        if (ObjectUtils.isNotEmpty(entity)) {
+            return ResultContent.buildFail("权限已存在");
+        }
+        List<OrganizationUser> orgUsers = organizationUserService.getUserOrgList(param.getUserId(), projectOid);
+        if (ObjectUtils.isEmpty(orgUsers)) {
+            return ResultContent.buildFail("用户不属于项目");
+        }
+        DevicePermissParam saveParam = new DevicePermissParam();
+        saveParam.setDeviceIds(List.of(param.getDeviceId()));
+        saveParam.setProjectOid(projectOid);
+        saveParam.setIds(orgUsers.stream().map(OrganizationUser::getId).collect(Collectors.toList()));
+        return devicePermissService.saveBindInfo(saveParam);
+    }
+
+    /**
+     * 查询用户的设备权限列表
+     *
+     * @param param
+     * @return
+     */
+    public ResultContent<List<DevicePermissOpenApiModel>> getDevicePermissByUserId(UserOpenApiParam param) {
+        if (StringUtils.isEmpty(param.getProjectCode())) {
+            return ResultContent.buildFail("projectCode不能为空");
+        }
+        List<DevicePermissOpenApiModel> models = new ArrayList<>();
+        String projectOid = getOidByCode(param.getProjectCode());
+        if (StringUtils.isNotEmpty(projectOid)) {
+            List<DevicePermiss> list = devicePermissDao.findByUserIdAndProjectOid(param.getUserId(), projectOid);
+            if (ObjectUtils.isNotEmpty(list)) {
+                models = list.stream().map(this::toDevicePermissModel).collect(Collectors.toUnmodifiableList());
+            }
+        }
+        return ResultContent.buildSuccess(models);
+    }
+
     /**
      * 设备基础信息
      *
@@ -153,11 +280,37 @@ public class DevicePermissOpenApiService extends SuperService {
         return model;
     }
 
+    /**
+     * 设备权限
+     *
+     * @param entity
+     * @return
+     */
     public DevicePermissOpenApiModel toDevicePermissModel(DevicePermiss entity) {
         DevicePermissOpenApiModel model = new DevicePermissOpenApiModel();
         if (ObjectUtils.isEmpty(entity)) {
             BeanUtils.copyProperties(entity, model);
+            DeviceInfo deviceInfo = entity.getDeviceInfo();
+            if (ObjectUtils.isNotEmpty(deviceInfo)) {
+                model.setDeviceId(deviceInfo.getDeviceId());
+                model.setDeviceName(deviceInfo.getDeviceName());
+                model.setDeviceType(deviceInfo.getDeviceType());
+                model.setProjectInfoCode(deviceInfo.getProjectInfoCode());
+            }
 
+            UserAccount user = null;
+            OrganizationUser organizationUser = entity.getOrganizationUser();
+            if (ObjectUtils.isNotEmpty(organizationUser)) {
+                user = organizationUser.getUser();
+            }
+            if (ObjectUtils.isNotEmpty(user)) {
+                model.setCode(organizationUser.getCode());
+                model.setUserId(user.getUserId());
+                model.setName(user.getName());
+                model.setPhone(user.getPhone());
+                model.setProfilePic(user.getProfilePic());
+                model.setSex(user.getSex());
+            }
         }
         return model;
     }

+ 42 - 79
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/openAPI/OrganizationUserOpenApiService.java

@@ -2,21 +2,15 @@ package com.zhongshu.card.server.core.service.openAPI;
 
 import com.github.microservice.components.data.base.util.PageEntityUtil;
 import com.github.microservice.net.ResultContent;
-import com.zhongshu.card.client.model.devices.DeviceInfoSearch;
-import com.zhongshu.card.client.model.org.OrganizationMiniModel;
-import com.zhongshu.card.client.model.school.AreaSimpleModel;
-import com.zhongshu.card.client.openApi.model.DeviceInfoOpenApiModel;
-import com.zhongshu.card.client.openApi.model.DeviceInfoOpenApiSimpleModel;
-import com.zhongshu.card.client.openApi.params.DeviceIdParam;
-import com.zhongshu.card.client.openApi.params.DeviceInfoOpenApiSearch;
-import com.zhongshu.card.server.core.dao.devices.DeviceInfoDao;
-import com.zhongshu.card.server.core.dao.devices.DevicePermissDao;
-import com.zhongshu.card.server.core.dao.payment.ExpenseFlowDao;
-import com.zhongshu.card.server.core.domain.devices.DeviceInfo;
+import com.zhongshu.card.client.model.org.OrganizationUserModel;
+import com.zhongshu.card.client.model.org.OrganizationUserSearch;
+import com.zhongshu.card.client.openApi.model.OrganizationUserOpenApiModel;
+import com.zhongshu.card.client.openApi.params.OrganizationUserOpenApiSearch;
+import com.zhongshu.card.server.core.dao.org.OrganizationUserDao;
+import com.zhongshu.card.server.core.domain.org.Organization;
+import com.zhongshu.card.server.core.domain.org.OrganizationUser;
+import com.zhongshu.card.server.core.domain.org.UserAccount;
 import com.zhongshu.card.server.core.service.base.SuperService;
-import com.zhongshu.card.server.core.service.org.OrganizationServiceImpl;
-import com.zhongshu.card.server.core.service.orgManager.OrganizationManagerServiceImpl;
-import com.zhongshu.card.server.core.service.school.AreaServiceImpl;
 import com.zhongshu.card.server.core.util.BeanUtils;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.ObjectUtils;
@@ -27,10 +21,6 @@ import org.springframework.data.domain.PageRequest;
 import org.springframework.data.domain.Pageable;
 import org.springframework.stereotype.Service;
 
-import java.util.Collections;
-import java.util.List;
-import java.util.stream.Collectors;
-
 /**
  * 机构相关的 openAPI
  *
@@ -42,93 +32,66 @@ import java.util.stream.Collectors;
 public class OrganizationUserOpenApiService extends SuperService {
 
     @Autowired
-    private DevicePermissDao devicePermissDao;
-
-    @Autowired
-    private ExpenseFlowDao expenseFlowDao;
-
-    @Autowired
-    private OrganizationManagerServiceImpl organizationManagerService;
-
-    @Autowired
-    private OrganizationServiceImpl organizationServiceImpl;
-
-    @Autowired
-    private AreaServiceImpl areaService;
-
-    @Autowired
-    private DeviceInfoDao deviceInfoDao;
+    private OrganizationUserDao organizationUserDao;
 
     /**
-     * 设备列表
+     * 项目用户列表
      *
      * @param apiSearch
      * @return
      */
-    public ResultContent<Page<DeviceInfoOpenApiModel>> page(DeviceInfoOpenApiSearch apiSearch) {
+    public ResultContent<Page<OrganizationUserOpenApiModel>> projectUserPage(OrganizationUserOpenApiSearch apiSearch) {
+        OrganizationUserSearch param = new OrganizationUserSearch();
         if (StringUtils.isEmpty(apiSearch.getProjectCode())) {
             return ResultContent.buildFail("projectCode不能为空");
         }
-        DeviceInfoSearch param = new DeviceInfoSearch();
+        String projectOid = getOidByCode(apiSearch.getProjectCode());
+        if (StringUtils.isEmpty(projectOid)) {
+            projectOid = "unKnow";
+        }
         BeanUtils.copyProperties(apiSearch, param);
-        param.setProjectInfoCode(apiSearch.getProjectCode());
+        param.setProjectOid(projectOid);
 
         Pageable pageable = PageRequest.of(apiSearch.getNumber(), apiSearch.getSize());
-        Page<DeviceInfo> page = deviceInfoDao.page(pageable, param);
+        Page<OrganizationUser> page = organizationUserDao.page(pageable, param);
         return ResultContent.buildSuccess(PageEntityUtil.concurrent2PageModel(page, this::toModel));
     }
 
     /**
-     * 设备详情
+     * 用户详情
      *
-     * @param param
+     * @param id
      * @return
      */
-    public ResultContent<DeviceInfoOpenApiModel> getDetailByDeviceId(DeviceIdParam param) {
-        DeviceInfo deviceInfo = deviceInfoDao.findTopByDeviceId(param.getDeviceId());
-        if (ObjectUtils.isEmpty(deviceInfo)) {
-            return ResultContent.buildFail("数据不存在");
+    public ResultContent<OrganizationUserOpenApiModel> getUserDetailById(String id) {
+        OrganizationUser organizationUser = organizationUserDao.findTopById(id);
+        if (ObjectUtils.isEmpty(organizationUser)) {
+            return ResultContent.buildFail("用户存在");
         }
-        return ResultContent.buildSuccess(toModel(deviceInfo));
+        return ResultContent.buildSuccess(toModel(organizationUser));
     }
 
-    /**
-     * 设备基础信息
-     *
-     * @param entity
-     * @return
-     */
-    public DeviceInfoOpenApiModel toModel(DeviceInfo entity) {
-        DeviceInfoOpenApiModel model = null;
-        if (ObjectUtils.isNotEmpty(entity)) {
-            model = new DeviceInfoOpenApiModel();
+    public OrganizationUserOpenApiModel toModel(OrganizationUser entity) {
+        OrganizationUserOpenApiModel model = new OrganizationUserOpenApiModel();
+        if (ObjectUtils.isNotEmpty(entity.getId())) {
             BeanUtils.copyProperties(entity, model);
 
-            // 所属机构信息
-            OrganizationMiniModel miniModel = organizationManagerService.toMiniModel(entity.getOrganization());
-            model.setOrganization(miniModel);
-
-            model.setProjectInfoName(organizationServiceImpl.getOrgNameByCode(entity.getProjectInfoCode()));
-
-            // 所属区域信息
-            List<AreaSimpleModel> areaModels = areaService.getParents(entity.getArea());
-            if (ObjectUtils.isNotEmpty(areaModels)) {
-                model.setArea(areaModels.get(0));
-                Collections.reverse(areaModels);
-                List<String> areaNames = areaModels.stream().map(it -> it.getName()).collect(Collectors.toList());
-                model.setAreaAllName(String.join("/", areaNames));
+            Organization organization = entity.getOrganization();
+            UserAccount user = entity.getUser();
+            if (ObjectUtils.isNotEmpty(user)) {
+                model.setUserId(user.getUserId());
+                model.setPhone(user.getPhone());
+                model.setName(user.getName());
+                model.setProfilePic(user.getProfilePic());
+                model.setSex(user.getSex());
+            }
+            if (ObjectUtils.isNotEmpty(organization)) {
+                model.setOrgName(organization.getName());
+                model.setAuthType(organization.getAuthType());
+                model.setOrgOid(organization.getOid());
+                model.setLogo(organization.getLogo());
             }
         }
         return model;
     }
-
-    public DeviceInfoOpenApiSimpleModel toDeviceSimpleModel(DeviceInfo entity) {
-        DeviceInfoOpenApiSimpleModel model = null;
-        if (ObjectUtils.isNotEmpty(entity)) {
-            model = new DeviceInfoOpenApiSimpleModel();
-            BeanUtils.copyProperties(entity, model);
-        }
-        return model;
-    }
-
 }

+ 64 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/paySetting/PayOrderSettingService.java

@@ -0,0 +1,64 @@
+package com.zhongshu.card.server.core.service.paySetting;
+
+import com.github.microservice.net.ResultContent;
+import com.github.microservice.types.payment.PaymentType;
+import com.zhongshu.card.client.model.paySetting.paySetting.PayOrderSettingModel;
+import com.zhongshu.card.client.type.DataState;
+import com.zhongshu.card.server.core.dao.projectAbout.PayOrderSettingDao;
+import com.zhongshu.card.server.core.dao.projectAbout.ProjectPaySettingDao;
+import com.zhongshu.card.server.core.domain.paySetting.ProjectPaySetting;
+import com.zhongshu.card.server.core.service.base.SuperService;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.ObjectUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author TRX
+ * @date 2024/11/12
+ */
+@Slf4j
+@Service
+public class PayOrderSettingService extends SuperService {
+
+    @Autowired
+    private PayOrderSettingDao payOrderSettingDao;
+
+    @Autowired
+    private ProjectPaySettingDao projectPaySettingDao;
+
+    /**
+     * 得到用户的支付服务
+     *
+     * @return
+     */
+    public ResultContent<List<PayOrderSettingModel>> getUserPayOrderSetting() {
+        String userId = getCurrentUserId();
+        String projectOid = getCurrentProjectOid();
+
+
+        return ResultContent.buildSuccess();
+    }
+
+    public List<PaymentType> getProjectPayment(String projectOid) {
+        List<PaymentType> paymentTypes = new ArrayList<PaymentType>();
+        List<ProjectPaySetting> projectPaySettings = projectPaySettingDao.findByProjectOid(projectOid);
+        if (ObjectUtils.isNotEmpty(projectPaySettings)) {
+            for (ProjectPaySetting projectPaySetting : projectPaySettings) {
+                if (projectPaySetting.getState() != DataState.Enable) {
+                    continue;
+                }
+                PaymentType channelType = projectPaySetting.getChannelType();
+//                if (channelType == PaymentType.WeChat) {
+//                    channelType = PaymentType.UserWallet;
+//                }
+                paymentTypes.add(channelType);
+            }
+        }
+        return paymentTypes;
+    }
+
+}

+ 22 - 12
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/paySetting/ProjectMainPaySettingService.java

@@ -88,16 +88,14 @@ public class ProjectMainPaySettingService extends SuperService {
         // 项目 的分成
         BigDecimal projectScale = param.getProjectScale();
         if (projectScale != null) {
-            if (BigDecimal.ZERO.compareTo(projectScale) == 1 ||
-                    BigDecimal.valueOf(100).compareTo(projectScale) == -1) {
+            if (BigDecimal.ZERO.compareTo(projectScale) == 1 || BigDecimal.valueOf(100).compareTo(projectScale) == -1) {
                 return ResultContent.buildFail("projectScale不符合要求");
             }
         }
         // 机构 的分成
         BigDecimal orgScale = param.getOrgScale();
         if (projectScale != null) {
-            if (BigDecimal.ZERO.compareTo(orgScale) == 1 ||
-                    BigDecimal.valueOf(100).compareTo(orgScale) == -1) {
+            if (BigDecimal.ZERO.compareTo(orgScale) == 1 || BigDecimal.valueOf(100).compareTo(orgScale) == -1) {
                 return ResultContent.buildFail("orgScale不符合要求");
             }
         }
@@ -106,8 +104,16 @@ public class ProjectMainPaySettingService extends SuperService {
             return ResultContent.buildFail("项目分成和机构分成之和不等100");
         }
 
-        ProjectMainPaySetting mainPaySetting = projectMainPaySettingDao.findTopByProjectOidAndChannelType(
-                param.getProjectOid(), orgPaySettingInfo.getChannelType());
+        Long minWithdraw = param.getMinWithdraw();
+        Long maxWithdraw = param.getMaxWithdraw();
+        if (minWithdraw <= 0 || maxWithdraw <= 0) {
+            return ResultContent.buildFail("minWithdraw或maxWithdraw不能小于等于0");
+        }
+        if (minWithdraw > maxWithdraw) {
+            return ResultContent.buildFail("minWithdraw不能大于maxWithdraw");
+        }
+
+        ProjectMainPaySetting mainPaySetting = projectMainPaySettingDao.findTopByProjectOidAndChannelType(param.getProjectOid(), orgPaySettingInfo.getChannelType());
         if (ObjectUtils.isEmpty(mainPaySetting)) {
             mainPaySetting = new ProjectMainPaySetting();
         }
@@ -132,13 +138,19 @@ public class ProjectMainPaySettingService extends SuperService {
      * @return
      */
     public ResultContent<ProjectMainPaySettingModel> getMainPaySetting(String projectOid, PaymentType paymentType) {
-        ProjectMainPaySetting mainPaySetting = projectMainPaySettingDao.findTopByProjectOidAndChannelType(
-                projectOid, paymentType);
+        ProjectMainPaySetting mainPaySetting = getProjectMainPaySetting(projectOid, paymentType);
         ProjectMainPaySettingModel model = toMainModel(mainPaySetting);
         model.setProjectOid(projectOid);
         return ResultContent.buildSuccess(model);
     }
 
+    public ProjectMainPaySetting getProjectMainPaySetting(String projectOid, PaymentType paymentType) {
+        if (StringUtils.isNotEmpty(projectOid) && paymentType != null) {
+            return projectMainPaySettingDao.findTopByProjectOidAndChannelType(projectOid, paymentType);
+        }
+        return null;
+    }
+
     //---------------------------项目上的灵活 分账配置 start -----------------------
 
     /**
@@ -177,16 +189,14 @@ public class ProjectMainPaySettingService extends SuperService {
         // 项目 的分成
         BigDecimal projectScale = param.getProjectScale();
         if (projectScale != null) {
-            if (BigDecimal.ZERO.compareTo(projectScale) == 1 ||
-                    BigDecimal.valueOf(100).compareTo(projectScale) == -1) {
+            if (BigDecimal.ZERO.compareTo(projectScale) == 1 || BigDecimal.valueOf(100).compareTo(projectScale) == -1) {
                 return ResultContent.buildFail("projectScale不符合要求");
             }
         }
         // 机构 的分成
         BigDecimal orgScale = param.getOrgScale();
         if (projectScale != null) {
-            if (BigDecimal.ZERO.compareTo(orgScale) == 1 ||
-                    BigDecimal.valueOf(100).compareTo(orgScale) == -1) {
+            if (BigDecimal.ZERO.compareTo(orgScale) == 1 || BigDecimal.valueOf(100).compareTo(orgScale) == -1) {
                 return ResultContent.buildFail("orgScale不符合要求");
             }
         }

+ 55 - 6
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/payment/PayCallService.java

@@ -6,6 +6,7 @@ import com.github.microservice.pay.client.ret.ResultState;
 import com.github.microservice.types.OrderState;
 import com.github.microservice.types.payment.PaymentType;
 import com.zhongshu.card.client.model.operLogs.OperationLogsAddParam;
+import com.zhongshu.card.client.model.org.OrganizationMiniModel;
 import com.zhongshu.card.client.model.payment.ExpenseRefundParam;
 import com.zhongshu.card.client.type.LogsLevel;
 import com.zhongshu.card.client.type.MessageType;
@@ -13,8 +14,11 @@ import com.zhongshu.card.client.type.RefundState;
 import com.zhongshu.card.client.utils.PayExceptionToShowUtil;
 import com.zhongshu.card.server.core.dao.payment.ExpenseFlowDao;
 import com.zhongshu.card.server.core.domain.payment.ExpenseFlow;
+import com.zhongshu.card.server.core.domain.schedule.ScheduleTaskConfig;
 import com.zhongshu.card.server.core.service.base.SuperService;
+import com.zhongshu.card.server.core.service.orgManager.ProjectBindOrgServiceImpl;
 import com.zhongshu.card.server.core.service.pay.BalancePayService;
+import com.zhongshu.card.server.core.service.pay.SettleService;
 import com.zhongshu.card.server.core.service.user.OperationLogsService;
 import com.zhongshu.card.server.core.util.NextNoUtil;
 import lombok.extern.slf4j.Slf4j;
@@ -24,7 +28,9 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Set;
 import java.util.stream.Collectors;
 
 /**
@@ -44,6 +50,12 @@ public class PayCallService extends SuperService {
     @Autowired
     ExpenseFlowDao expenseFlowDao;
 
+    @Autowired
+    private ProjectBindOrgServiceImpl projectBindOrgService;
+
+    @Autowired
+    private SettleService settleService;
+
     /**
      * 统一调用支付服务
      *
@@ -76,9 +88,7 @@ public class PayCallService extends SuperService {
         logsAddParam.setDataId(entity.getPaymentNo());
         entity.setPayStartTime(System.currentTimeMillis());
 
-        com.github.microservice.pay.client.ret.ResultContent<List<TransactionLogModel>> resultContent = balancePayService.balancePay(
-                entity.getProjectOid(), entity.getShopOid(), entity.getUserId(),
-                entity.getPayAmount(), entity.getPaymentNo(), entity.getRemark());
+        com.github.microservice.pay.client.ret.ResultContent<List<TransactionLogModel>> resultContent = balancePayService.balancePay(entity.getProjectOid(), entity.getShopOid(), entity.getUserId(), entity.getPayAmount(), entity.getPaymentNo(), entity.getRemark());
         if (resultContent.getState() == ResultState.Success) {
             // 关联参数
             String msg = "支付成功";
@@ -196,9 +206,7 @@ public class PayCallService extends SuperService {
     public ResultContent<List<TransactionLogModel>> walletRefund(ExpenseFlow entity, ExpenseRefundParam param) {
         String refundNo = NextNoUtil.getNextPaymentNo(null);
         entity.setRefundNo(refundNo);
-        com.github.microservice.pay.client.ret.ResultContent<List<TransactionLogModel>> resultContent = balancePayService.refund(
-                entity.getProjectOid(), entity.getShopOid(), entity.getUserId(),
-                refundNo, entity.getPayAmount(), param.getRemark());
+        com.github.microservice.pay.client.ret.ResultContent<List<TransactionLogModel>> resultContent = balancePayService.refund(entity.getProjectOid(), entity.getShopOid(), entity.getUserId(), refundNo, entity.getPayAmount(), param.getRemark());
         if (resultContent.getState() == ResultState.Success) {
             return ResultContent.buildSuccess(resultContent.getContent());
         } else {
@@ -206,4 +214,45 @@ public class PayCallService extends SuperService {
         }
     }
 
+    /**
+     * 结算
+     *
+     * @param taskConfig
+     * @return
+     */
+    public ResultContent settlement(ScheduleTaskConfig taskConfig) {
+        HashMap<String, Object> data = taskConfig.getData();
+        String projectOid = data.get("projectOid").toString();
+        PaymentType paymentType = PaymentType.valueOf(data.get("paymentType").toString());
+        if (StringUtils.isNotEmpty(projectOid) && paymentType != null) {
+            String remark = "定时结算";
+            Long endTime = System.currentTimeMillis();
+            // 项目包含的机构列表
+            ResultContent<List<OrganizationMiniModel>> content = projectBindOrgService.getProjectOrgList(projectOid);
+            if (content.isSuccess()) {
+                List<OrganizationMiniModel> list = content.getContent();
+                if (ObjectUtils.isNotEmpty(list)) {
+                    for (OrganizationMiniModel organizationMiniModel : list) {
+                        com.github.microservice.pay.client.ret.ResultContent resultContent = settleService.settle(projectOid, organizationMiniModel.getOid(), endTime, remark, paymentType);
+                        //TODO 标记订单已结算
+                        if (resultContent.getState() == ResultState.Success) {
+                            Object object = resultContent.getContent();
+                            if (object != null) {
+                                Set<String> orderNoSet = (Set<String>) object;
+                                markOrderSettlement(orderNoSet);
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        return ResultContent.buildSuccess();
+    }
+
+    private void markOrderSettlement(Set<String> orderNoSet) {
+        if (orderNoSet != null && !orderNoSet.isEmpty()) {
+
+        }
+    }
+
 }

+ 1 - 1
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/schedule/ScheduleTaskConfigService.java

@@ -71,7 +71,7 @@ public class ScheduleTaskConfigService {
                     HashMap<String, Object> data = new HashMap<>();
                     data.put("projectOid", entity.getProjectOid());
                     data.put("id", entity.getId());
-                    data.put("channelType", entity.getChannelType());
+                    data.put("channelType", entity.getChannelType().name());
 
                     taskConfig.setData(data);
                     taskConfig.setDataState(DataState.Enable);

+ 20 - 1
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/schedule/TaskContextService.java

@@ -1,9 +1,15 @@
 package com.zhongshu.card.server.core.service.schedule;
 
+import com.zhongshu.card.client.type.ScheduleType;
+import com.zhongshu.card.server.core.dao.payment.ExpenseFlowDao;
 import com.zhongshu.card.server.core.domain.schedule.ScheduleTaskConfig;
+import com.zhongshu.card.server.core.service.payment.PayCallService;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.HashMap;
+
 /**
  * @author TRX
  * @date 2024/11/6
@@ -12,9 +18,22 @@ import org.springframework.stereotype.Service;
 @Service
 public class TaskContextService {
 
+    @Autowired
+    private PayCallService payCallService;
+
+    /**
+     * 执行接收
+     *
+     * @param taskConfig
+     */
     public void execute(ScheduleTaskConfig taskConfig) {
         log.info("定时任务执行: {}", taskConfig.getScheduleType().getRemark());
-
+        ScheduleType scheduleType = taskConfig.getScheduleType();
+        if (scheduleType == ScheduleType.SettlementTask) {
+            payCallService.settlement(taskConfig);
+        } else {
+            log.error("定时任务为");
+        }
     }
 
 }