Просмотр исходного кода

Merge remote-tracking branch 'origin/master'

wujiefeng 1 год назад
Родитель
Сommit
a253ae64ac
28 измененных файлов с 593 добавлено и 396 удалено
  1. 0 3
      FullCardClient/src/main/java/com/zhongshu/card/client/model/base/SuperSearch.java
  2. 2 1
      FullCardClient/src/main/java/com/zhongshu/card/client/model/login/LoginCommonModel.java
  3. 6 1
      FullCardClient/src/main/java/com/zhongshu/card/client/model/org/orgUser/OrganizationUserAuditParam.java
  4. 14 1
      FullCardClient/src/main/java/com/zhongshu/card/client/model/org/orgUser/OrganizationUserModel.java
  5. 13 0
      FullCardClient/src/main/java/com/zhongshu/card/client/model/org/orgUser/OrganizationUserSearch.java
  6. 1 1
      FullCardClient/src/main/java/com/zhongshu/card/client/model/org/orgUser/OrganizationUserSimpleModel.java
  7. 0 1
      FullCardClient/src/main/java/com/zhongshu/card/client/model/school/ExcelUserParam.java
  8. 25 0
      FullCardClient/src/main/java/com/zhongshu/card/client/openApi/model/order/MarkPaidParam.java
  9. 14 0
      FullCardClient/src/main/java/com/zhongshu/card/client/openApi/model/order/OrderCreateParam.java
  10. 20 0
      FullCardClient/src/main/java/com/zhongshu/card/client/openApi/params/CloseOrderParam.java
  11. 20 0
      FullCardClient/src/main/java/com/zhongshu/card/client/openApi/params/OrderNoParam.java
  12. 1 1
      FullCardClient/src/main/java/com/zhongshu/card/client/openApi/params/PaymentNoParam.java
  13. 2 1
      FullCardClient/src/main/java/com/zhongshu/card/client/service/org/DepartmentService.java
  14. 1 1
      FullCardClient/src/main/java/com/zhongshu/card/client/type/user/OrgUserState.java
  15. 27 7
      FullCardServer/src/main/java/com/zhongshu/card/server/core/controller/openAPI/order/ExpenseFlowOpenApiController.java
  16. 6 1
      FullCardServer/src/main/java/com/zhongshu/card/server/core/controller/org/OrganizationUserController.java
  17. 4 83
      FullCardServer/src/main/java/com/zhongshu/card/server/core/controller/user/IndexController.java
  18. 25 3
      FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/org/impl/OrganizationUserDaoImpl.java
  19. 3 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/payment/ExpenseFlowDao.java
  20. 3 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/domain/org/OrganizationUser.java
  21. 16 3
      FullCardServer/src/main/java/com/zhongshu/card/server/core/domain/payment/ExpenseFlow.java
  22. 0 137
      FullCardServer/src/main/java/com/zhongshu/card/server/core/service/openAPI/ExpenseFlowOpenApiService.java
  23. 286 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/service/openAPI/order/OrderOpenApiService.java
  24. 50 136
      FullCardServer/src/main/java/com/zhongshu/card/server/core/service/org/IndexService.java
  25. 32 10
      FullCardServer/src/main/java/com/zhongshu/card/server/core/service/org/OrganizationUserServiceImpl.java
  26. 13 1
      FullCardServer/src/main/java/com/zhongshu/card/server/core/service/payment/ExpenseFlowServiceImpl.java
  27. 2 2
      FullCardServer/src/main/java/com/zhongshu/card/server/core/service/user/DepartmentServiceImpl.java
  28. 7 2
      FullCardServer/src/main/java/com/zhongshu/card/server/core/service/user/UserAccountServiceImpl.java

+ 0 - 3
FullCardClient/src/main/java/com/zhongshu/card/client/model/base/SuperSearch.java

@@ -24,9 +24,6 @@ public class SuperSearch implements Serializable {
     @JsonProperty("oid")
     private String oid;
 
-//    @Schema(description = "epId")
-//    private String epId;
-
     @Schema(description = "所属项目oid")
     private String projectOid;
 

+ 2 - 1
FullCardClient/src/main/java/com/zhongshu/card/client/model/login/LoginCommonModel.java

@@ -2,6 +2,7 @@ package com.zhongshu.card.client.model.login;
 
 import com.zhongshu.card.client.model.org.OrganizationSimpleModel;
 import com.zhongshu.card.client.model.org.UserCountModel;
+import com.zhongshu.card.client.model.org.UserCountSimpleModel;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.AllArgsConstructor;
 import lombok.Data;
@@ -33,7 +34,7 @@ public class LoginCommonModel {
     private String scope;
 
     @Schema(description = "用户基本信息")
-    private UserCountModel userInfo;
+    private UserCountSimpleModel userInfo;
 
     @Schema(description = "平台的oid")
     private String platformOid;

+ 6 - 1
FullCardClient/src/main/java/com/zhongshu/card/client/model/org/orgUser/OrganizationUserAuditParam.java

@@ -6,6 +6,9 @@ import jakarta.validation.constraints.NotEmpty;
 import jakarta.validation.constraints.NotNull;
 import lombok.Data;
 
+import java.util.ArrayList;
+import java.util.List;
+
 /**
  * @author TRX
  * @date 2025/2/24
@@ -13,10 +16,12 @@ import lombok.Data;
 @Data
 public class OrganizationUserAuditParam {
 
-    @NotEmpty
     @Schema(description = "数据id")
     private String id;
 
+    @Schema(description = "数据id集合")
+    private List<String> ids = new ArrayList<>();
+
     @NotNull
     @Schema(description = "数据状态")
     private OrgUserState orgUserState;

+ 14 - 1
FullCardClient/src/main/java/com/zhongshu/card/client/model/org/orgUser/OrganizationUserModel.java

@@ -63,6 +63,18 @@ public class OrganizationUserModel extends SuperModel {
     @Schema(description = "审核用户")
     private String reViewUserId;
 
+    @Schema(description = "审核用户名称")
+    private String reViewUserName;
+
+    private UserCountSimpleModel reViewUser;
+
+    public String getReViewUserName() {
+        if (reViewUser != null) {
+            return reViewUser.getName();
+        }
+        return "";
+    }
+
     @Schema(description = "审核时间")
     private Long reViewTime;
 
@@ -238,5 +250,6 @@ public class OrganizationUserModel extends SuperModel {
     }
 
     @Schema(description = "部门信息所有级")
-    private List<DepartmentModel> departments = new ArrayList<>();
+    private List<DepartmentSimpleModel> departments = new ArrayList<>();
+
 }

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

@@ -78,4 +78,17 @@ public class OrganizationUserSearch extends SuperSearch {
 
     @Schema(description = "")
     private String openid;
+
+    @Schema(description = "审核用户")
+    private String reViewUserId;
+
+    @Schema(description = "审核用户名称")
+    private String reViewUserName;
+
+    @Schema(description = "审核开始")
+    private Long startReViewTime;
+
+    @Schema(description = "审核结束")
+    private Long endReViewTime;
+
 }

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

@@ -54,7 +54,7 @@ public class OrganizationUserSimpleModel {
     private DepartmentSimpleModel department;
 
     @Schema(description = "部门信息所有级")
-    private List<DepartmentModel> departments = new ArrayList<>();
+    private List<DepartmentSimpleModel> departments = new ArrayList<>();
 
     @Schema(description = "职位")
     private DictInfoSimpleModel position;

+ 0 - 1
FullCardClient/src/main/java/com/zhongshu/card/client/model/school/ExcelUserParam.java

@@ -1,7 +1,6 @@
 package com.zhongshu.card.client.model.school;
 
 import cn.afterturn.easypoi.excel.annotation.Excel;
-import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;

+ 25 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/openApi/model/order/MarkPaidParam.java

@@ -0,0 +1,25 @@
+package com.zhongshu.card.client.openApi.model.order;
+
+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 MarkPaidParam {
+
+    @Schema(description = "支付订单号")
+    private String orderNo;
+
+    @Schema(description = "支付结果备注,返回给设备展示")
+    private String payRemark;
+
+    @Schema(description = "支付用户的userId")
+    private String userId;
+}

+ 14 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/openApi/model/order/OrderCreateParam.java

@@ -1,8 +1,11 @@
 package com.zhongshu.card.client.openApi.model.order;
 
 import com.zhongshu.card.client.openApi.base.ProjectCodeParam;
+import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 
+import java.math.BigDecimal;
+
 /**
  * openAPI 创建订单
  * @author TRX
@@ -11,5 +14,16 @@ import lombok.Data;
 @Data
 public class OrderCreateParam extends ProjectCodeParam {
 
+    @Schema(description = "设备id")
+    private String deviceId;
+
+    @Schema(description = "消费号(用于识别上传数据不重复")
+    private String orderNo;
+
+    @Schema(description = "金额,单位:元")
+    private BigDecimal amount;
+
+    @Schema(description = "创建订单用户userId")
+    private String createUserId;
 
 }

+ 20 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/openApi/params/CloseOrderParam.java

@@ -0,0 +1,20 @@
+package com.zhongshu.card.client.openApi.params;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ *
+ * @author TRX
+ * @date 2025/3/12
+ */
+@Data
+public class CloseOrderParam {
+
+    @Schema(description = "")
+    private String closeReason;
+
+    @Schema(description = "")
+    private String closeUserId;
+
+}

+ 20 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/openApi/params/OrderNoParam.java

@@ -0,0 +1,20 @@
+package com.zhongshu.card.client.openApi.params;
+
+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 OrderNoParam extends CloseOrderParam {
+
+    @Schema(description = "支付订单号")
+    private String orderNo;
+
+}

+ 1 - 1
FullCardClient/src/main/java/com/zhongshu/card/client/openApi/params/PaymentNoParam.java

@@ -12,7 +12,7 @@ import lombok.NoArgsConstructor;
 @Data
 @AllArgsConstructor
 @NoArgsConstructor
-public class PaymentNoParam {
+public class PaymentNoParam extends CloseOrderParam {
 
     @Schema(description = "支付订单号")
     private String paymentNo;

+ 2 - 1
FullCardClient/src/main/java/com/zhongshu/card/client/service/org/DepartmentService.java

@@ -3,6 +3,7 @@ package com.zhongshu.card.client.service.org;
 import com.github.microservice.net.ResultContent;
 import com.zhongshu.card.client.model.org.DepartmentModel;
 import com.zhongshu.card.client.model.org.DepartmentParam;
+import com.zhongshu.card.client.model.org.DepartmentSimpleModel;
 import com.zhongshu.card.client.utils.ITree;
 
 import java.util.List;
@@ -18,7 +19,7 @@ public interface DepartmentService {
     ResultContent<List<ITree>> getDepartmentTree(String oid);
 
     // 查询所有上级部门
-    List<DepartmentModel> getParents(String id);
+    List<DepartmentSimpleModel> getParents(String id);
 
     // 删除部门
     ResultContent deleteDepartment(String id);

+ 1 - 1
FullCardClient/src/main/java/com/zhongshu/card/client/type/user/OrgUserState.java

@@ -8,7 +8,7 @@ import lombok.Getter;
 public enum OrgUserState {
     Unaudited("审核中"),
     Refusal("已拒绝"),
-    Formal("正式"),
+    Formal("已通过"),
     ;
 
     @Getter

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

@@ -3,10 +3,12 @@ package com.zhongshu.card.server.core.controller.openAPI.order;
 import com.github.microservice.net.ResultContent;
 import com.github.microservice.staticVariable.OpenApiMark;
 import com.zhongshu.card.client.openApi.model.ExpenseFlowOpenApiModel;
+import com.zhongshu.card.client.openApi.model.order.MarkPaidParam;
 import com.zhongshu.card.client.openApi.model.order.OrderCreateParam;
 import com.zhongshu.card.client.openApi.params.ExpenseFlowOpenApiSearch;
+import com.zhongshu.card.client.openApi.params.OrderNoParam;
 import com.zhongshu.card.client.openApi.params.PaymentNoParam;
-import com.zhongshu.card.server.core.service.openAPI.ExpenseFlowOpenApiService;
+import com.zhongshu.card.server.core.service.openAPI.order.OrderOpenApiService;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -26,7 +28,7 @@ import org.springframework.web.bind.annotation.RestController;
 public class ExpenseFlowOpenApiController {
 
     @Autowired
-    private ExpenseFlowOpenApiService expenseFlowOpenApiService;
+    private OrderOpenApiService expenseFlowOpenApiService;
 
     @Operation(summary = "创建订单", description = "创建订单")
     @RequestMapping(value = {"createOrder"}, method = {RequestMethod.POST})
@@ -40,16 +42,34 @@ public class ExpenseFlowOpenApiController {
         return expenseFlowOpenApiService.page(param);
     }
 
-    @Operation(summary = "订单详情", description = "订单详情")
+    @Operation(summary = "订单详情(支付订单号)", description = "订单详情")
     @RequestMapping(value = {"getDetailByPaymentNo"}, method = {RequestMethod.POST})
     public ResultContent<ExpenseFlowOpenApiModel> getDetailByPaymentNo(@RequestBody PaymentNoParam param) {
         return expenseFlowOpenApiService.getDetailByPaymentNo(param);
     }
 
-    @Operation(summary = "关闭订单", description = "关闭订单")
-    @RequestMapping(value = {"closeOrder"}, method = {RequestMethod.POST})
-    public ResultContent<ExpenseFlowOpenApiModel> closeOrder(@RequestBody PaymentNoParam param) {
-        return expenseFlowOpenApiService.closeOrder(param);
+    @Operation(summary = "订单详情(订单号查询)", description = "订单详情")
+    @RequestMapping(value = {"getDetailByOrderNo"}, method = {RequestMethod.POST})
+    public ResultContent<ExpenseFlowOpenApiModel> getDetailByOrderNo(@RequestBody OrderNoParam param) {
+        return expenseFlowOpenApiService.getDetailByOrderNo(param);
+    }
+
+    @Operation(summary = "关闭订单(支付订单号)", description = "关闭订单")
+    @RequestMapping(value = {"closeOrderByPaymentNo"}, method = {RequestMethod.POST})
+    public ResultContent closeOrderByPaymentNo(@RequestBody PaymentNoParam param) {
+        return expenseFlowOpenApiService.closeOrderByPaymentNo(param);
+    }
+
+    @Operation(summary = "关闭订单(订单号)", description = "关闭订单")
+    @RequestMapping(value = {"closeOrderByOrderNo"}, method = {RequestMethod.POST})
+    public ResultContent closeOrderByOrderNo(@RequestBody OrderNoParam param) {
+        return expenseFlowOpenApiService.closeOrderByOrderNo(param);
+    }
+
+    @Operation(summary = "标记订单已支付(订单号)", description = "标记订单已支付")
+    @RequestMapping(value = {"markOrderPaid"}, method = {RequestMethod.POST})
+    public ResultContent markOrderPaid(@RequestBody MarkPaidParam param) {
+        return expenseFlowOpenApiService.markOrderPaid(param);
     }
 
 }

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

@@ -171,7 +171,6 @@ public class OrganizationUserController {
     @Operation(summary = "小程序注册用户", description = "小程序注册用户")
     @RequestMapping(value = {"registerProjectUser"}, method = {RequestMethod.POST})
     public ResultContent registerProjectUser(@RequestBody UserCountRegisterParam param) {
-        Assert.hasText(param.getProjectOid(), "projectOid不能为空");
         Assert.hasText(param.getPhone(), "phone不能为空");
         return organizationUserService.registerProjectUser(param);
     }
@@ -196,5 +195,11 @@ public class OrganizationUserController {
         return organizationUserService.auditOrgUser(param);
     }
 
+    @ResourceAuth(value = "user", type = AuthType.User)
+    @Operation(summary = "审核项目注册用户(多个)", description = "审核项目注册用户(多个)")
+    @RequestMapping(value = {"auditOrgUsers"}, method = {RequestMethod.POST})
+    public ResultContent auditOrgUsers(@RequestBody @Valid OrganizationUserAuditParam param) {
+        return organizationUserService.auditOrgUsers(param);
+    }
 
 }

+ 4 - 83
FullCardServer/src/main/java/com/zhongshu/card/server/core/controller/user/IndexController.java

@@ -43,18 +43,6 @@ public class IndexController {
     public ResultContent iotLogin(@RequestBody LoginParam param, HttpServletRequest request, HttpServletResponse response) {
         param.setLoginFromType(LoginFromType.Platform);
         ResultContent result = indexService.iotLogin(param);
-        if (result.isSuccess()) {
-        }
-        return result;
-    }
-
-    @Operation(summary = "商户小程序登录", description = "商户小程序登录")
-    @RequestMapping(value = "busLogin", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
-    public ResultContent busLogin(@RequestBody LoginParam param, HttpServletRequest request, HttpServletResponse response) {
-        param.setLoginFromType(LoginFromType.Shop);
-        ResultContent result = indexService.busLogin(param);
-        if (result.isSuccess()) {
-        }
         return result;
     }
 
@@ -99,77 +87,10 @@ public class IndexController {
         return result;
     }
 
-    @Operation(summary = "登录-用户名密码登录平台端", description = "登录--用户名密码登录平台端")
-    @RequestMapping(value = "loginPlatform", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
-    public ResultContent loginPlatform(@RequestBody LoginParam param, HttpServletRequest request, HttpServletResponse response) {
-        if (param.getLoginFromType() == null) {
-            return ResultContent.buildFail("loginFromType 不能为空");
-        }
-        ResultContent result = indexService.loginPlatform(param);
-        if (result.isSuccess()) {
-            LoginPlatformTokenModel tokenModel = (LoginPlatformTokenModel) result.getContent();
-            response.setHeader("accessToken", tokenModel.getAccess_token());
-            Cookie cookie = new Cookie("accessToken", tokenModel.getAccess_token());
-            cookie.setMaxAge(60 * 60 * 24 * 3);
-            cookie.setPath("/");
-            response.addCookie(cookie);
-        }
-        return result;
-    }
-
-    /**
-     * 普通用户端 (如云芯客)
-     *
-     * @param param
-     * @return
-     */
-    @Operation(summary = "登录-微信普通用户端", description = "登录--微信普通用户端")
-    @RequestMapping(value = "wxUserLogin", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
-    public ResultContent wxUserLogin(@RequestBody LoginParam param, HttpServletRequest request, HttpServletResponse response) {
-        param.setLoginFromType(LoginFromType.Student);
-        return indexService.wxUserLogin(param);
-    }
-
-    /**
-     * 微信商户端 (如云芯商)
-     *
-     * @param param
-     * @return
-     */
-    @Operation(summary = "登录-微信商户端", description = "登录--微信商户端")
-    @RequestMapping(value = "wxBusLogin", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
-    public ResultContent wxBusLogin(@RequestBody LoginParam param, HttpServletRequest request, HttpServletResponse response) {
-        if (param.getLoginFromType() == null) {
-            return ResultContent.buildFail("loginFromType 不能为空");
-        }
-        ResultContent result = indexService.login(param);
-        if (result.isSuccess()) {
-            LoginTokenModel tokenModel = (LoginTokenModel) result.getContent();
-            response.setHeader("accessToken", tokenModel.getAccess_token());
-            Cookie cookie = new Cookie("accessToken", tokenModel.getAccess_token());
-            cookie.setMaxAge(60 * 60 * 24 * 3);
-            cookie.setPath("/");
-            response.addCookie(cookie);
-        }
-        return result;
-    }
-
-    @Operation(summary = "登录某个机构 + 用户名密码登录", description = "登录某个机构 + 用户名密码登录")
-    @RequestMapping(value = "loginToOid", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
-    public ResultContent loginToOid(@RequestBody LoginParam param, HttpServletRequest request, HttpServletResponse response) {
-        if (param.getLoginFromType() == null) {
-            return ResultContent.buildFail("loginFromType 不能为空");
-        }
-        Assert.hasText(param.getOid(), "oid不能为空");
-        ResultContent result = indexService.loginToOid(param);
-        if (result.isSuccess()) {
-            LoginPlatformTokenModel tokenModel = (LoginPlatformTokenModel) result.getContent();
-            response.setHeader("accessToken", tokenModel.getAccess_token());
-            Cookie cookie = new Cookie("accessToken", tokenModel.getAccess_token());
-            cookie.setMaxAge(60 * 60 * 24 * 3);
-            cookie.setPath("/");
-            response.addCookie(cookie);
-        }
+    @Operation(summary = "登录-用户名密码登录(小程序)", description = "登录--用户名密码登录")
+    @RequestMapping(value = "wxXcxlogin", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
+    public ResultContent wxXcxlogin(@RequestBody LoginParam param, HttpServletRequest request, HttpServletResponse response) {
+        ResultContent result = indexService.wxXcxlogin(param);
         return result;
     }
 

+ 25 - 3
FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/org/impl/OrganizationUserDaoImpl.java

@@ -9,6 +9,7 @@ import com.zhongshu.card.server.core.dao.org.extend.OrganizationUserDaoExtend;
 import com.zhongshu.card.server.core.domain.org.Department;
 import com.zhongshu.card.server.core.domain.org.OrganizationUser;
 import com.zhongshu.card.server.core.domain.org.Role;
+import com.zhongshu.card.server.core.util.CommonUtil;
 import org.apache.commons.lang3.ObjectUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -78,7 +79,7 @@ public class OrganizationUserDaoImpl extends BaseImpl implements OrganizationUse
             criteria.and("state").is(param.getState());
         }
 
-        // 用户加入状态
+        // 用户加入状态(审核状态)
         if (param.getOrgUserState() != null) {
             criteria.and("orgUserState").is(param.getOrgUserState());
         }
@@ -132,8 +133,8 @@ public class OrganizationUserDaoImpl extends BaseImpl implements OrganizationUse
         // 部门
         List<String> departmentIds = param.getDepartmentIds();
         if (ObjectUtils.isNotEmpty(departmentIds)) {
-            List<Department> roles = departmentDao.findByIdIn(departmentIds);
-            criteria.and("departments").in(roles);
+            List<Department> departments = departmentDao.findByIdIn(departmentIds);
+            criteria.and("department").in(departments);
         }
 
         // 搜索项目的用户
@@ -146,6 +147,23 @@ public class OrganizationUserDaoImpl extends BaseImpl implements OrganizationUse
             criteria.and("isOrg").is(param.getIsOrg());
         }
 
+        if (param.getAddType() != null) {
+            criteria.and("addType").is(param.getAddType());
+        }
+
+        if (StringUtils.isNotEmpty(param.getReViewUserId())) {
+            criteria.and("reviewUserId").is(param.getReViewUserId());
+        }
+
+        // 审核时间
+        if (!CommonUtil.longIsEmpty(param.getStartReViewTime()) && !CommonUtil.longIsEmpty(param.getEndReViewTime())) {
+            criteria.and("reViewTime").gte(param.getStartReViewTime()).lte(param.getEndReViewTime());
+        } else if (!CommonUtil.longIsEmpty(param.getStartReViewTime()) && CommonUtil.longIsEmpty(param.getEndReViewTime())) {
+            criteria.and("reViewTime").gte(param.getStartReViewTime());
+        } else if (CommonUtil.longIsEmpty(param.getStartReViewTime()) && !CommonUtil.longIsEmpty(param.getEndReViewTime())) {
+            criteria.and("reViewTime").lte(param.getEndReViewTime());
+        }
+
         // 模糊搜索
         List<Criteria> criterias = new ArrayList<>();
         // 用户名称
@@ -163,6 +181,10 @@ public class OrganizationUserDaoImpl extends BaseImpl implements OrganizationUse
             Pattern pattern = Pattern.compile("^.*" + param.getPhone() + ".*$");
             criterias.add(Criteria.where("phone").is(pattern));
         }
+        if (StringUtils.isNotEmpty(param.getReViewUserName())) {
+            Pattern pattern = Pattern.compile("^.*" + param.getReViewUserName() + ".*$");
+            criterias.add(Criteria.where("reViewUserName").is(pattern));
+        }
         if (!CollectionUtils.isEmpty(criterias)) {
             criteria.andOperator(criterias.toArray(new Criteria[]{}));
         }

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

@@ -24,4 +24,7 @@ public interface ExpenseFlowDao extends MongoDao<ExpenseFlow>, ExpenseFlowDaoExt
     ExpenseFlow findTopByOrderNoOrderByCreateTimeDesc(String orderNo);
 
     ExpenseFlow findTopByRefundNo(String refundNo);
+
+    void deleteByOrderNo(String orderNo);
+
 }

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

@@ -58,6 +58,9 @@ public class OrganizationUser extends SuperMain {
     @Schema(description = "审核用户")
     private String reViewUserId;
 
+    @Schema(description = "审核用户名称")
+    private String reViewUserName;
+
     @Schema(description = "审核时间")
     private Long reViewTime;
 

+ 16 - 3
FullCardServer/src/main/java/com/zhongshu/card/server/core/domain/payment/ExpenseFlow.java

@@ -1,11 +1,11 @@
 package com.zhongshu.card.server.core.domain.payment;
 
 import cn.hutool.json.JSONObject;
-import com.github.microservice.types.deviceUse.DeviceType;
-import com.github.microservice.types.deviceUse.OrderFromType;
 import com.github.microservice.pay.client.model.ledger.TransactionLogModel;
 import com.github.microservice.types.OrderModeType;
 import com.github.microservice.types.OrderState;
+import com.github.microservice.types.deviceUse.DeviceType;
+import com.github.microservice.types.deviceUse.OrderFromType;
 import com.github.microservice.types.payment.ChargeableType;
 import com.github.microservice.types.payment.PaymentDeviceType;
 import com.github.microservice.types.payment.PaymentType;
@@ -130,7 +130,20 @@ public class ExpenseFlow extends SuperMain {
     @Schema(description = "订单所属的商户")
     private String shopOid;
 
-    //------------------------------消费关联的卡片信息 ---------------------
+    //------------------------------自动关闭订单 start---------------
+    @Schema(description = "是否已关闭")
+    private Boolean isClosed = Boolean.FALSE;
+
+    @Schema(description = "")
+    private String closeUserId;
+
+    @Schema(description = "")
+    private String closeReason;
+
+    @Schema(description = "关闭时间")
+    private Long closeTime;
+
+    //------------------------------消费关联的卡片信息 ---------------
 
     @Schema(description = "支付设备和方式")
     private PaymentDeviceType paymentDeviceType;

+ 0 - 137
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/openAPI/ExpenseFlowOpenApiService.java

@@ -1,137 +0,0 @@
-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.github.microservice.types.OrderModeType;
-import com.github.microservice.types.OrderState;
-import com.zhongshu.card.client.model.payment.ExpenseFlowSearch;
-import com.zhongshu.card.client.openApi.model.ExpenseFlowOpenApiModel;
-import com.zhongshu.card.client.openApi.model.order.OrderCreateParam;
-import com.zhongshu.card.client.openApi.params.ExpenseFlowOpenApiSearch;
-import com.zhongshu.card.client.openApi.params.PaymentNoParam;
-import com.zhongshu.card.server.core.dao.payment.ExpenseFlowDao;
-import com.zhongshu.card.server.core.domain.payment.ExpenseFlow;
-import com.zhongshu.card.server.core.service.base.CommonService;
-import com.zhongshu.card.server.core.service.base.SuperService;
-import com.zhongshu.card.server.core.util.BeanUtils;
-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.PageRequest;
-import org.springframework.data.domain.Pageable;
-import org.springframework.stereotype.Service;
-
-/**
- * 订单相关的 openAPI
- *
- * @author TRX
- * @date 2024/11/12
- */
-@Slf4j
-@Service
-public class ExpenseFlowOpenApiService extends SuperService {
-
-    @Autowired
-    private ExpenseFlowDao expenseFlowDao;
-
-    @Autowired
-    private CommonService commonService;
-
-    /**
-     * 创建订单
-     * @param param
-     * @return
-     */
-    public ResultContent createOrder(OrderCreateParam param) {
-        String projectCode = param.getProjectCode();
-        ResultContent<String> resultContent = commonService.checkProjectCanUserByCode(projectCode);
-        if (resultContent.isFailed()) {
-            return ResultContent.buildFail(resultContent.getMsg());
-        }
-        String projectOid = resultContent.getContent();
-
-
-
-        return ResultContent.buildSuccess();
-    }
-
-    /**
-     * 订单列表
-     *
-     * @param apiSearch
-     * @return
-     */
-    public ResultContent<Page<ExpenseFlowOpenApiModel>> page(ExpenseFlowOpenApiSearch apiSearch) {
-        // 检查项目信息
-        ResultContent<String> resultContent = commonService.checkProjectCanUserByCode(apiSearch.getProjectCode());
-        if (resultContent.isFailed()) {
-            return ResultContent.buildFail(resultContent.getMsg());
-        }
-        String projectOid = resultContent.getContent();
-
-        ExpenseFlowSearch param = new ExpenseFlowSearch();
-        BeanUtils.copyProperties(apiSearch, param);
-        param.setOrderModeType(OrderModeType.Consume);
-        param.setProjectOid(projectOid);
-
-        Pageable pageable = PageRequest.of(apiSearch.getNumber(), apiSearch.getSize());
-        Page<ExpenseFlow> page = expenseFlowDao.page(pageable, param);
-        return ResultContent.buildSuccess(PageEntityUtil.concurrent2PageModel(page, this::toModel));
-    }
-
-    /**
-     * 根据订单号 查询详情
-     *
-     * @param param
-     * @return
-     */
-    public ResultContent<ExpenseFlowOpenApiModel> getDetailByPaymentNo(PaymentNoParam param) {
-        if (StringUtils.isEmpty(param.getPaymentNo())) {
-            return ResultContent.buildFail("paymentNo不能为空");
-        }
-        ExpenseFlow expenseFlow = expenseFlowDao.findTopByPaymentNo(param.getPaymentNo());
-        if (ObjectUtils.isEmpty(expenseFlow)) {
-            return ResultContent.buildFail("订单不存在");
-        }
-        return ResultContent.buildSuccess(toModel(expenseFlow));
-    }
-
-    /**
-     * 关闭订单
-     *
-     * @param param
-     * @return
-     */
-    public ResultContent closeOrder(PaymentNoParam param) {
-        if (StringUtils.isEmpty(param.getPaymentNo())) {
-            return ResultContent.buildFail("paymentNo不能为空");
-        }
-        ExpenseFlow expenseFlow = expenseFlowDao.findTopByPaymentNo(param.getPaymentNo());
-        if (ObjectUtils.isEmpty(expenseFlow)) {
-            return ResultContent.buildFail("订单不存在");
-        }
-        OrderState orderType = expenseFlow.getOrderState();
-        if (orderType == OrderState.CLOSED) {
-            return ResultContent.buildFail("订单已关闭");
-        }
-        if (expenseFlow.getIsPaySuccess() != null && expenseFlow.getIsPaySuccess()) {
-            return ResultContent.buildFail("订单已支付成功,不能关闭");
-        }
-        expenseFlow.setOrderState(OrderState.CLOSED);
-        expenseFlowDao.save(expenseFlow);
-        return ResultContent.buildSuccess();
-    }
-
-    //----------------------------数据默认转换 start-----------------
-
-    public ExpenseFlowOpenApiModel toModel(ExpenseFlow entity) {
-        ExpenseFlowOpenApiModel model = new ExpenseFlowOpenApiModel();
-        if (ObjectUtils.isNotEmpty(entity)) {
-            BeanUtils.copyProperties(entity, model);
-        }
-        return model;
-    }
-
-}

+ 286 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/openAPI/order/OrderOpenApiService.java

@@ -0,0 +1,286 @@
+package com.zhongshu.card.server.core.service.openAPI.order;
+
+import com.github.microservice.components.data.base.util.PageEntityUtil;
+import com.github.microservice.net.ResultContent;
+import com.github.microservice.types.OrderModeType;
+import com.github.microservice.types.OrderState;
+import com.github.microservice.types.deviceUse.OrderFromType;
+import com.github.microservice.types.payment.ChargeableType;
+import com.zhongshu.card.client.model.payment.CreateOrderParam;
+import com.zhongshu.card.client.model.payment.ExpenseFlowSearch;
+import com.zhongshu.card.client.openApi.model.ExpenseFlowOpenApiModel;
+import com.zhongshu.card.client.openApi.model.order.MarkPaidParam;
+import com.zhongshu.card.client.openApi.model.order.OrderCreateParam;
+import com.zhongshu.card.client.openApi.params.CloseOrderParam;
+import com.zhongshu.card.client.openApi.params.ExpenseFlowOpenApiSearch;
+import com.zhongshu.card.client.openApi.params.OrderNoParam;
+import com.zhongshu.card.client.openApi.params.PaymentNoParam;
+import com.zhongshu.card.server.core.dao.devices.DeviceInfoDao;
+import com.zhongshu.card.server.core.dao.org.UserCountDao;
+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.org.UserAccount;
+import com.zhongshu.card.server.core.domain.payment.ExpenseFlow;
+import com.zhongshu.card.server.core.service.base.CommonService;
+import com.zhongshu.card.server.core.service.base.SuperService;
+import com.zhongshu.card.server.core.service.payment.ExpenseFlowServiceImpl;
+import com.zhongshu.card.server.core.util.BeanUtils;
+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.PageRequest;
+import org.springframework.data.domain.Pageable;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+
+/**
+ * 订单相关的 openAPI
+ *
+ * @author TRX
+ * @date 2024/11/12
+ */
+@Slf4j
+@Service
+public class OrderOpenApiService extends SuperService {
+
+    @Autowired
+    private ExpenseFlowDao expenseFlowDao;
+
+    @Autowired
+    private CommonService commonService;
+
+    @Autowired
+    private DeviceInfoDao deviceInfoDao;
+
+    @Autowired
+    private ExpenseFlowServiceImpl expenseFlowService;
+
+    @Autowired
+    private UserCountDao userCountDao;
+
+    /**
+     * 创建订单
+     * @param param
+     * @return
+     */
+    public ResultContent createOrder(OrderCreateParam param) {
+        String projectCode = param.getProjectCode();
+        ResultContent<String> resultContent = commonService.checkProjectCanUserByCode(projectCode);
+        if (resultContent.isFailed()) {
+            return ResultContent.buildFail(resultContent.getMsg());
+        }
+        if (StringUtils.isEmpty(param.getOrderNo())) {
+            return ResultContent.buildFail("orderNo不能为空");
+        }
+        if (StringUtils.isEmpty(param.getDeviceId())) {
+            return ResultContent.buildFail("deviceId不能为空");
+        }
+        DeviceInfo deviceInfo = deviceInfoDao.findTopByDeviceId(param.getDeviceId());
+        if (ObjectUtils.isEmpty(deviceInfo)) {
+            return ResultContent.buildFail("设备不存在");
+        }
+        if (!deviceInfo.getProjectInfoCode().equals(projectCode)) {
+            return ResultContent.buildFail(String.format("设备不属定项目:%s", projectCode));
+        }
+        if (param.getAmount() == null || BigDecimal.ZERO.compareTo(param.getAmount()) >= 0) {
+            return ResultContent.buildFail("消费金额不能为空或小于等于0");
+        }
+        ExpenseFlow temp = expenseFlowDao.findTopByOrderNoOrderByCreateTimeDesc(param.getOrderNo());
+        if (ObjectUtils.isNotEmpty(temp)) {
+            return ResultContent.buildFail(String.format("订单已存在:%s", param.getOrderNo()));
+        }
+        String mqttDataId = param.getOrderNo();
+        ExpenseFlow expenseFlow = expenseFlowService.init(mqttDataId);
+        if (ObjectUtils.isEmpty(expenseFlow)) {
+            return ResultContent.buildFail("订单生成失败,请稍后再试");
+        }
+        String projectOid = resultContent.getContent();
+        UserAccount userAccount = null;
+        if (StringUtils.isNotEmpty(param.getCreateUserId())) {
+            userAccount = userCountDao.findTopByUserId(param.getCreateUserId());
+            if (ObjectUtils.isEmpty(userAccount)) {
+                return ResultContent.buildFail("创建订单用户不存在");
+            }
+        }
+        ExpenseFlow tempOrderNo = expenseFlowDao.findTopByOrderNoOrderByCreateTimeDesc(param.getOrderNo());
+        if (ObjectUtils.isNotEmpty(tempOrderNo)) {
+            return ResultContent.buildFail(String.format("消费号已存在:%s", param.getOrderNo()));
+        }
+        String amount = param.getAmount().toPlainString();
+
+        CreateOrderParam orderParam = new CreateOrderParam();
+        orderParam.setDeviceId(deviceInfo.getDeviceId());
+        if (userAccount != null) {
+            orderParam.setUserId(userAccount.getUserId());
+        }
+        orderParam.setOrderNo(param.getOrderNo());
+        orderParam.setAmount(amount);
+        // 扫码下单
+        orderParam.setOrderFromType(OrderFromType.OpenApi);
+        // 是否可以匿名消费
+        orderParam.setIsAnonymous(Boolean.TRUE);
+        // 是否是浮动计费 计费方式
+        orderParam.setChargeableType(ChargeableType.Specified);
+        // 不指定支付方式
+        orderParam.setAppointPaymentType(Boolean.FALSE);
+        // 创建订单 (判断是否创建成功)
+        ResultContent<ExpenseFlow> content = expenseFlowService.createOrder(orderParam, expenseFlow);
+        expenseFlow = expenseFlowService.saveInfo(expenseFlow);
+        if (!expenseFlow.getVerifyParamIsSuccess()) {
+            expenseFlowService.deleteOrderByOrderNo(expenseFlow.getOrderNo());
+            return ResultContent.buildFail(expenseFlow.getVerifyParamMsg());
+        }
+        return expenseFlowService.getOrderPayDetail(expenseFlow.getId());
+    }
+
+    /**
+     * 订单列表
+     *
+     * @param apiSearch
+     * @return
+     */
+    public ResultContent<Page<ExpenseFlowOpenApiModel>> page(ExpenseFlowOpenApiSearch apiSearch) {
+        // 检查项目信息
+        ResultContent<String> resultContent = commonService.checkProjectCanUserByCode(apiSearch.getProjectCode());
+        if (resultContent.isFailed()) {
+            return ResultContent.buildFail(resultContent.getMsg());
+        }
+        String projectOid = resultContent.getContent();
+
+        ExpenseFlowSearch param = new ExpenseFlowSearch();
+        BeanUtils.copyProperties(apiSearch, param);
+        param.setOrderModeType(OrderModeType.Consume);
+        param.setProjectOid(projectOid);
+
+        Pageable pageable = PageRequest.of(apiSearch.getNumber(), apiSearch.getSize());
+        Page<ExpenseFlow> page = expenseFlowDao.page(pageable, param);
+        return ResultContent.buildSuccess(PageEntityUtil.concurrent2PageModel(page, this::toModel));
+    }
+
+    /**
+     * 根据订单号 查询详情
+     *
+     * @param param
+     * @return
+     */
+    public ResultContent<ExpenseFlowOpenApiModel> getDetailByPaymentNo(PaymentNoParam param) {
+        if (StringUtils.isEmpty(param.getPaymentNo())) {
+            return ResultContent.buildFail("paymentNo不能为空");
+        }
+        ExpenseFlow expenseFlow = expenseFlowDao.findTopByPaymentNo(param.getPaymentNo());
+        if (ObjectUtils.isEmpty(expenseFlow)) {
+            return ResultContent.buildFail("订单不存在");
+        }
+        return ResultContent.buildSuccess(toModel(expenseFlow));
+    }
+
+    /**
+     * 订单号查询详情
+     * @param param
+     * @return
+     */
+    public ResultContent<ExpenseFlowOpenApiModel> getDetailByOrderNo(OrderNoParam param) {
+        if (StringUtils.isEmpty(param.getOrderNo())) {
+            return ResultContent.buildFail("orderNo不能为空");
+        }
+        ExpenseFlow expenseFlow = expenseFlowDao.findTopByOrderNoOrderByCreateTimeDesc(param.getOrderNo());
+        if (ObjectUtils.isEmpty(expenseFlow)) {
+            return ResultContent.buildFail("订单不存在");
+        }
+        return ResultContent.buildSuccess(toModel(expenseFlow));
+    }
+
+    /**
+     * 关闭订单
+     *
+     * @param param
+     * @return
+     */
+    public ResultContent closeOrderByPaymentNo(PaymentNoParam param) {
+        if (StringUtils.isEmpty(param.getPaymentNo())) {
+            return ResultContent.buildFail("paymentNo不能为空");
+        }
+        ExpenseFlow expenseFlow = expenseFlowDao.findTopByPaymentNo(param.getPaymentNo());
+        return closeOrder(expenseFlow, param);
+    }
+
+    public ResultContent closeOrderByOrderNo(OrderNoParam param) {
+        if (StringUtils.isEmpty(param.getOrderNo())) {
+            return ResultContent.buildFail("orderNo不能为空");
+        }
+        ExpenseFlow expenseFlow = expenseFlowDao.findTopByOrderNoOrderByCreateTimeDesc(param.getOrderNo());
+        return closeOrder(expenseFlow, param);
+    }
+
+    public ResultContent closeOrder(ExpenseFlow expenseFlow, CloseOrderParam param) {
+        if (ObjectUtils.isEmpty(expenseFlow)) {
+            return ResultContent.buildFail("订单不存在");
+        }
+        OrderState orderType = expenseFlow.getOrderState();
+        if (orderType == OrderState.CLOSED) {
+            return ResultContent.buildFail("订单已关闭");
+        }
+        if (expenseFlow.getIsPaySuccess() != null && expenseFlow.getIsPaySuccess()) {
+            return ResultContent.buildFail("订单已支付成功,不能关闭");
+        }
+        expenseFlow.setOrderState(OrderState.CLOSED);
+        expenseFlow.setCloseTime(System.currentTimeMillis());
+        if (param != null) {
+            expenseFlow.setCloseUserId(param.getCloseUserId());
+            expenseFlow.setCloseReason(param.getCloseReason());
+        }
+        expenseFlowDao.save(expenseFlow);
+        return ResultContent.buildSuccess();
+    }
+
+    /**
+     * 标记订单已支付
+     * @return
+     */
+    public ResultContent markOrderPaid(MarkPaidParam param) {
+        if (StringUtils.isEmpty(param.getOrderNo())) {
+            return ResultContent.buildFail("orderNo不能为空");
+        }
+        if (StringUtils.isEmpty(param.getUserId())) {
+            return ResultContent.buildFail("userId不能为空");
+        }
+        ExpenseFlow expenseFlow = expenseFlowDao.findTopByOrderNoOrderByCreateTimeDesc(param.getOrderNo());
+        if (ObjectUtils.isEmpty(expenseFlow)) {
+            return ResultContent.buildFail(String.format("订单不存在:%s", param.getOrderNo()));
+        }
+        if (expenseFlow.getOrderState() != OrderState.WAIT_PAYMENT) {
+            String stateStr = "";
+            if (expenseFlow.getOrderState() != null) {
+                stateStr = expenseFlow.getOrderState().getRemark();
+            }
+            return ResultContent.buildFail(String.format("订单不能支付:%s", stateStr));
+        }
+        if (expenseFlow.getVerifyParamIsSuccess() == null || !expenseFlow.getVerifyParamIsSuccess()) {
+            return ResultContent.buildFail(String.format("订单不能支付:%s", expenseFlow.getVerifyParamMsg()));
+        }
+
+        expenseFlow.setOrderState(OrderState.HAVE_PAID);
+        expenseFlow.setPayRemark(param.getPayRemark());
+        expenseFlow.setIsPaySuccess(Boolean.TRUE);
+        expenseFlow.setPaymentStatus("已支付");
+        expenseFlow.setPayUserId(param.getUserId());
+        expenseFlow.setIsPaid(Boolean.TRUE);
+
+        expenseFlowDao.save(expenseFlow);
+        return ResultContent.buildSuccess();
+    }
+
+    //----------------------------数据默认转换 start-----------------
+
+    public ExpenseFlowOpenApiModel toModel(ExpenseFlow entity) {
+        ExpenseFlowOpenApiModel model = new ExpenseFlowOpenApiModel();
+        if (ObjectUtils.isNotEmpty(entity)) {
+            BeanUtils.copyProperties(entity, model);
+        }
+        return model;
+    }
+
+}

+ 50 - 136
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/org/IndexService.java

@@ -10,21 +10,22 @@ import com.github.microservice.auth.security.model.AuthDetails;
 import com.github.microservice.auth.security.type.AuthType;
 import com.github.microservice.components.data.mongo.mongo.helper.DBHelper;
 import com.github.microservice.core.util.net.IPUtil;
-import com.zhongshu.card.client.model.login.LoginBusModel;
+import com.github.microservice.net.ResultContent;
 import com.zhongshu.card.client.model.login.LoginCommonModel;
-import com.zhongshu.card.client.model.org.*;
-import com.zhongshu.card.client.model.org.orgUser.OrganizationUserModel;
+import com.zhongshu.card.client.model.org.GetPhoneModel;
+import com.zhongshu.card.client.model.org.LoginParam;
+import com.zhongshu.card.client.model.org.UserCountSimpleModel;
 import com.zhongshu.card.client.model.setting.PlatFormLoginConfig;
 import com.zhongshu.card.client.model.wechat.PhoneModel;
 import com.zhongshu.card.client.model.wechat.WechatPhoneNumber;
-import com.github.microservice.net.ResultContent;
 import com.zhongshu.card.client.type.LoginFromType;
-import com.zhongshu.card.client.type.OrganizationState;
 import com.zhongshu.card.client.type.UserState;
 import com.zhongshu.card.client.type.setting.SettingType;
+import com.zhongshu.card.client.type.user.OrgUserState;
 import com.zhongshu.card.server.core.dao.org.*;
 import com.zhongshu.card.server.core.domain.org.*;
 import com.zhongshu.card.server.core.service.base.RedisService;
+import com.zhongshu.card.server.core.service.base.SuperService;
 import com.zhongshu.card.server.core.service.setting.PlatFormConfigInfoService;
 import com.zhongshu.card.server.core.service.user.RoleServiceImpl;
 import com.zhongshu.card.server.core.service.user.UserAccountServiceImpl;
@@ -41,7 +42,11 @@ import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 import org.springframework.util.StopWatch;
 
-import java.util.*;
+import java.util.Date;
+import java.util.List;
+import java.util.Objects;
+import java.util.Set;
+import java.util.stream.Collectors;
 
 /**
  * @author TRX
@@ -49,7 +54,7 @@ import java.util.*;
  */
 @Slf4j
 @Service
-public class IndexService {
+public class IndexService extends SuperService {
 
     @Autowired
     private UserCountDao userCountDao;
@@ -102,6 +107,9 @@ public class IndexService {
     @Autowired
     PlatFormConfigInfoService platFormConfigInfoService;
 
+    @Autowired
+    private OrganizationUserServiceImpl organizationUserServiceImpl;
+
     /**
      * 物联网登录
      *
@@ -114,7 +122,7 @@ public class IndexService {
 
         String phone = param.getLoginValue();
         UserAccount userAccount = userCountDao.findTopByLoginName(phone);
-        UserCountModel userCountModel = userAccountService.toModel(userAccount);
+        UserCountSimpleModel userCountModel = userAccountService.toSimpleModel(userAccount);
 
         UserAuthLoginModel userAuthLoginModel = new UserAuthLoginModel();
         BeanUtils.copyProperties(param, userAuthLoginModel);
@@ -156,53 +164,6 @@ public class IndexService {
         return ResultContent.buildSuccess(commonModel);
     }
 
-    /**
-     * 商户小程序登录
-     *
-     * @param param
-     * @return
-     */
-    public ResultContent<LoginBusModel> busLogin(LoginParam param) {
-        StopWatch stopWatch = new StopWatch();
-        stopWatch.start("1");
-
-        UserAuthLoginModel userAuthLoginModel = new UserAuthLoginModel();
-        BeanUtils.copyProperties(param, userAuthLoginModel);
-        // 登录
-        ResultContent<LoginTokenModel> resultContent = commonLogin(userAuthLoginModel);
-        if (resultContent.isFailed()) {
-            return ResultContent.buildFail(resultContent.getMsg());
-        }
-
-        String phone = param.getLoginValue();
-        UserAccount userAccount = userCountDao.findTopByLoginName(phone);
-        UserCountModel userCountModel = userAccountService.toModel(userAccount);
-
-        // 用户加入的商户列表
-        List<UserJoinBusOrgModel> busModels = organizationService.getUserAboutShopList(userAccount.getUserId());
-        if (ObjectUtils.isEmpty(busModels)) {
-            return ResultContent.buildFail("用户未关联商户,登录失败");
-        }
-
-        LoginBusModel commonModel = new LoginBusModel();
-        LoginTokenModel loginTokenModel = resultContent.getContent();
-        com.zhongshu.card.server.core.util.BeanUtils.copyProperties(loginTokenModel, commonModel);
-        stopWatch.stop();
-        commonModel.setBusList(busModels);
-
-        stopWatch.start("2");
-        commonModel.setUserInfo(userCountModel);
-        stopWatch.stop();
-
-        stopWatch.start("3");
-        // 用户所有的权限
-//        Set<String> auth = roleServiceImpl.getUserAllAuths(userAccount.getUserId());
-//        commonModel.setAuths(auth);
-        stopWatch.stop();
-        log.info(stopWatch.prettyPrint());
-        return ResultContent.buildSuccess(commonModel);
-    }
-
     /**
      * 通用用户登录(返回所有权限数据)
      *
@@ -234,7 +195,7 @@ public class IndexService {
         stopWatch.start("2");
 
         UserAccount userAccount = userCountDao.findTopByLoginName(phone);
-        UserCountModel userCountModel = userAccountService.toModel(userAccount);
+        UserCountSimpleModel userCountModel = userAccountService.toSimpleModel(userAccount);
         commonModel.setUserInfo(userCountModel);
 
         // 平台信息
@@ -293,100 +254,53 @@ public class IndexService {
     }
 
     /**
-     * 微信普通用户登录
-     *
-     * @param param
-     * @return
-     */
-    public ResultContent wxUserLogin(LoginParam param) {
-        return login(param);
-    }
-
-    /**
-     * 平台端用户登录
-     *
+     * 小程序登录
      * @param param
      * @return
      */
-    public ResultContent loginPlatform(LoginParam param) {
-        String phone = param.getLoginValue();
-        UserAuthLoginModel userAuthLoginModel = new UserAuthLoginModel();
-        BeanUtils.copyProperties(param, userAuthLoginModel);
-        ResultContent<LoginTokenModel> resultContent = commonLogin(userAuthLoginModel);
-        if (resultContent.isFailed()) {
-            return resultContent;
+    public ResultContent wxXcxlogin(LoginParam param) {
+        String projectOid = getCurrentProjectOid();
+        if (ObjectUtils.isEmpty(projectOid)) {
+            return ResultContent.buildFail("当前项目信息为空");
         }
-        Organization organization = organizationDao.findTopByAuthType(AuthType.Platform);
-        if (ObjectUtils.isEmpty(organization)) {
-            return ResultContent.buildFail(String.format("平台未初始化,请联系管理员"));
+        String phone = param.getLoginValue();
+        UserAccount userAccount = userCountDao.findTopByLoginName(phone);
+        if (ObjectUtils.isEmpty(userAccount)) {
+            return ResultContent.buildFail("用户名或密码错误.");
         }
-        if (organization.getState() == OrganizationState.Locked || organization.getState() == OrganizationState.Frozen) {
-            return ResultContent.buildFail(String.format("平台已被锁定,不能登录"));
+        List<OrganizationUser> list = organizationUserServiceImpl.getUserOrgList(userAccount.getUserId(), projectOid);
+        if (ObjectUtils.isEmpty(list)) {
+            return ResultContent.buildFail("用户未加入项目");
         }
-        UserAccount userAccount = userCountDao.findTopByLoginName(phone);
-        OrganizationUser organizationUser = organizationUserDao.findTopByOrganizationAndUser(organization, userAccount);
-        if (ObjectUtils.isEmpty(organizationUser)) {
-            return ResultContent.buildFail(String.format("该用户不属于平台端用户:%s", phone));
+        if (list.size() == 1) {
+            OrgUserState orgUserState = list.get(0).getOrgUserState();
+            if (orgUserState == OrgUserState.Unaudited) {
+                return ResultContent.buildFail("用户正在审核中,登录失败");
+            }
+            if (orgUserState == OrgUserState.Refusal) {
+                return ResultContent.buildFail("用户已拒绝,登录失败");
+            }
         }
-        LoginTokenModel loginTokenModel = resultContent.getContent();
-        LoginPlatformTokenModel tokenModel = new LoginPlatformTokenModel();
-        com.zhongshu.card.server.core.util.BeanUtils.copyProperties(loginTokenModel, tokenModel);
-
-        tokenModel.setPlatformOid(organization.getOid());
-
-        OrganizationUserModel userModel = userAccountService.toOrgUserModel(organizationUser);
-        tokenModel.setUserInfo(userModel);
+        list = list.stream().filter(it -> {
+            if (it.getOrgUserState() == null || it.getOrgUserState() == OrgUserState.Formal) {
+                return true;
+            }
+            return false;
+        }).collect(Collectors.toUnmodifiableList());
 
-        return ResultContent.buildSuccess(tokenModel);
-    }
+        if (ObjectUtils.isEmpty(list)) {
+            return ResultContent.buildFail("用户未加入项目.");
+        }
 
-    /**
-     * 登录--验证用户名和密码 + 是否在指定的机构
-     *
-     * @param param
-     * @return
-     */
-    public ResultContent loginToOid(LoginParam param) {
-        String phone = param.getLoginValue();
+        // 验证用户名密码
         UserAuthLoginModel userAuthLoginModel = new UserAuthLoginModel();
         BeanUtils.copyProperties(param, userAuthLoginModel);
-        ResultContent<LoginTokenModel> resultContent = commonLogin(userAuthLoginModel);
+        ResultContent resultContent = commonLogin(userAuthLoginModel);
+
         if (resultContent.isFailed()) {
             return resultContent;
         }
-        // web 端的登录用户数据验证
-        UserAccount userAccount = userCountDao.findTopByLoginName(phone);
-        Organization organization = organizationDao.findTopByOid(param.getOid());
-        if (ObjectUtils.isEmpty(organization)) {
-            return ResultContent.buildFail(String.format("oid不存在:%s", param.getOid()));
-        }
-        OrganizationUser organizationUser = organizationUserDao.findTopByOrganizationAndUserAndState(organization, userAccount, UserState.Normal);
-        if (ObjectUtils.isEmpty(organizationUser)) {
-            String msg = String.format("用户不属于该机构:%s", organization.getName());
-            if (param.getLoginFromType() == LoginFromType.Platform) {
-                msg = String.format("用户不属于平台端用户,登录失败:%s", organization.getName());
-            } else if (param.getLoginFromType() == LoginFromType.School) {
-                msg = String.format("用户不属于学校端用户,登录失败:%s", organization.getName());
-            } else if (param.getLoginFromType() == LoginFromType.Shop) {
-                msg = String.format("用户不属于商户端用户,登录失败:%s", organization.getName());
-            }
-            return ResultContent.buildFail(msg);
-        }
-        LoginTokenModel loginTokenModel = resultContent.getContent();
-        LoginPlatformTokenModel tokenModel = new LoginPlatformTokenModel();
-        com.zhongshu.card.server.core.util.BeanUtils.copyProperties(loginTokenModel, tokenModel);
-        tokenModel.setPlatformOid(organization.getOid());
-
-        // 查询用户信息
-        OrganizationUserModel userModel = userAccountService.toOrgUserModel(organizationUser);
-        tokenModel.setUserInfo(userModel);
-
-        // 得到用户在企业的权限列表
-        ResultContent<Set<String>> authContent = roleServiceImpl.getOrganizationAuth(organization.getOid(), userModel.getUserId());
-        if (authContent.isSuccess()) {
-            tokenModel.setAuths(authContent.getContent());
-        }
-        return ResultContent.buildSuccess(tokenModel);
+        return resultContent;
     }
 
     /**

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

@@ -10,6 +10,7 @@ import com.github.microservice.core.util.bean.BeanUtil;
 import com.github.microservice.net.ResultContent;
 import com.github.microservice.net.ResultMessage;
 import com.google.common.collect.Lists;
+import com.zhongshu.card.client.model.base.OutNumberModel;
 import com.zhongshu.card.client.model.base.ProjectOidParam;
 import com.zhongshu.card.client.model.org.*;
 import com.zhongshu.card.client.model.org.orgUser.OrganizationUserAuditParam;
@@ -385,6 +386,28 @@ public class OrganizationUserServiceImpl extends SuperService {
         return ResultContent.buildSuccess();
     }
 
+    /**
+     * 批量审核
+     * @param param
+     * @return
+     */
+    public ResultContent auditOrgUsers(OrganizationUserAuditParam param) {
+        if (ObjectUtils.isEmpty(param.getIds())) {
+            return ResultContent.buildFail("ids is empty");
+        }
+        OutNumberModel numberModel = new OutNumberModel();
+        for (String id : param.getIds()) {
+            param.setId(id);
+            ResultContent content = auditOrgUser(param);
+            if (content.isSuccess()) {
+                numberModel.addSuccess(id);
+            } else {
+                numberModel.addFail(id, content.getMsg());
+            }
+        }
+        return ResultContent.buildSuccess(numberModel);
+    }
+
     /**
      * 用户审核
      *
@@ -395,7 +418,7 @@ public class OrganizationUserServiceImpl extends SuperService {
         if (ObjectUtils.isEmpty(organizationUser)) {
             return ResultContent.buildFail(String.format(ResultMessage.DATA_NOT_EXIST, param.getId()));
         }
-        if (param.getOrgUserState() != OrgUserState.Unaudited) {
+        if (organizationUser.getOrgUserState() != OrgUserState.Unaudited) {
             return ResultContent.buildFail("数据已审核");
         }
         BeanUtils.copyProperties(param, organizationUser);
@@ -406,10 +429,12 @@ public class OrganizationUserServiceImpl extends SuperService {
             // 拒绝
             organizationUser.setState(UserState.Locked);
         }
-        organizationUser.setReViewUserId(getCurrentUserId());
+
+        UserAccount userAccount = getCurrentUserAccount();
+        organizationUser.setReViewUserId(userAccount.getUserId());
+        organizationUser.setReViewUserName(userAccount.getCreateUserName());
         organizationUser.setReViewTime(System.currentTimeMillis());
         organizationUserDao.save(organizationUser);
-
         return ResultContent.buildSuccess();
     }
 
@@ -426,10 +451,6 @@ public class OrganizationUserServiceImpl extends SuperService {
         if (StringUtils.isEmpty(param.getUserId())) {
             return ResultContent.buildFail("userId不能为空");
         }
-        // 绑定的机构可以为空 02-24
-//        if (StringUtils.isEmpty(param.getOrgOid())) {
-//            return ResultContent.buildFail("orgOid不能为空");
-//        }
 
         UserAccount userAccount = userCountDao.findTopByUserId(param.getUserId());
         if (ObjectUtils.isEmpty(userAccount)) {
@@ -474,7 +495,7 @@ public class OrganizationUserServiceImpl extends SuperService {
                 return ResultContent.buildFail(String.format("code已存在:%s", param.getCode()));
             }
             organizationUser = new OrganizationUser();
-            initEntity(organizationUser);
+            initEntityNoCheckOid(organizationUser);
             BeanUtils.copyProperties(param, organizationUser);
 
             // 在机构中的用户类型
@@ -520,7 +541,7 @@ public class OrganizationUserServiceImpl extends SuperService {
         if (ObjectUtils.isNotEmpty(param.getDepartmentId())) {
             department = departmentDao.findTopById(param.getDepartmentId());
         }
-        // 位信息
+        // 位信息
         DictInfo position = null;
         if (StringUtils.isNotEmpty(param.getPositionId())) {
             position = dictInfoDao.findTopById(param.getPositionId());
@@ -1127,7 +1148,8 @@ public class OrganizationUserServiceImpl extends SuperService {
             if (ObjectUtils.isNotEmpty(entity.getDepartment())) {
                 DepartmentSimpleModel departmentModel = departmentService.toSimpleModel(entity.getDepartment());
                 model.setDepartment(departmentModel);
-                List<DepartmentModel> departmentModels = departmentService.getParents(entity.getDepartment().getId());
+
+                List<DepartmentSimpleModel> departmentModels = departmentService.getParents(entity.getDepartment().getId());
                 model.setDepartments(departmentModels);
             }
             model.setPosition(dictInfoService.toSimpleModel(entity.getPosition()));

+ 13 - 1
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/payment/ExpenseFlowServiceImpl.java

@@ -487,7 +487,6 @@ public class ExpenseFlowServiceImpl extends SuperService implements ExpenseFlowS
                         List<TransactionLogModel> list = content.getContent();
                         expenseFlow.setTransactionIds(list);
                         expenseFlow.setPaymentStatus(msg);
-                        expenseFlow.setPayRemark(msg);
                     } else {
                         expenseFlow.setPayRemark(String.format("调用支付中心失败: {}", content.getMsg()));
                     }
@@ -731,6 +730,19 @@ public class ExpenseFlowServiceImpl extends SuperService implements ExpenseFlowS
         }
     }
 
+    /**
+     * 删除
+     * @param orderNo
+     * @return
+     */
+    public ResultContent deleteOrderByOrderNo(String orderNo) {
+        if (ObjectUtils.isEmpty(orderNo)) {
+            return ResultContent.buildFail("orderNo为空");
+        }
+        expenseFlowDao.deleteByOrderNo(orderNo);
+        return ResultContent.buildSuccess();
+    }
+
     /**
      * 商户订单查询
      *

+ 2 - 2
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/user/DepartmentServiceImpl.java

@@ -171,10 +171,10 @@ public class DepartmentServiceImpl extends SuperService implements DepartmentSer
      * @param id
      * @return
      */
-    public List<DepartmentModel> getParents(String id) {
+    public List<DepartmentSimpleModel> getParents(String id) {
         List<Department> list = new ArrayList<>();
         loopLoad(id, list);
-        List<DepartmentModel> models = list.stream().map(this::toModel).collect(Collectors.toList());
+        List<DepartmentSimpleModel> models = list.stream().map(this::toSimpleModel).collect(Collectors.toList());
         if (ObjectUtils.isNotEmpty(models)) {
             Collections.reverse(models);
         }

+ 7 - 2
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/user/UserAccountServiceImpl.java

@@ -768,9 +768,13 @@ public class UserAccountServiceImpl extends SuperService implements UserAccountS
             if (ObjectUtils.isNotEmpty(entity.getDepartment())) {
                 DepartmentSimpleModel departmentModel = departmentService.toSimpleModel(entity.getDepartment());
                 model.setDepartment(departmentModel);
-                List<DepartmentModel> departmentModels = departmentService.getParents(entity.getDepartment().getId());
+
+                List<DepartmentSimpleModel> departmentModels = departmentService.getParents(entity.getDepartment().getId());
                 model.setDepartments(departmentModels);
             }
+            if (StringUtils.isNotEmpty(entity.getReViewUserId())) {
+                model.setReViewUser(toSimpleModel(entity.getReViewUserId()));
+            }
         }
         return model;
     }
@@ -812,7 +816,8 @@ public class UserAccountServiceImpl extends SuperService implements UserAccountS
             if (ObjectUtils.isNotEmpty(entity.getDepartment())) {
                 DepartmentSimpleModel departmentModel = departmentService.toSimpleModel(entity.getDepartment());
                 model.setDepartment(departmentModel);
-                List<DepartmentModel> departmentModels = departmentService.getParents(entity.getDepartment().getId());
+
+                List<DepartmentSimpleModel> departmentModels = departmentService.getParents(entity.getDepartment().getId());
                 model.setDepartments(departmentModels);
             }
         }