Explorar o código

Merge remote-tracking branch 'origin/master'

wujiefeng hai 1 ano
pai
achega
7ddc0d2743

+ 135 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/openApi/model/DeviceInfoOpenApiModel.java

@@ -0,0 +1,135 @@
+package com.zhongshu.card.client.openApi.model;
+
+import com.github.microservice.models.type.DeviceType;
+import com.zhongshu.card.client.model.org.OrganizationMiniModel;
+import com.zhongshu.card.client.model.org.OrganizationSimpleModel;
+import com.zhongshu.card.client.model.school.AreaSimpleModel;
+import com.zhongshu.card.client.type.DataState;
+import com.zhongshu.card.client.type.OnLineState;
+import com.zhongshu.opengateway.client.model.OpenApiModel;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.apache.commons.lang3.ObjectUtils;
+
+/**
+ * @author TRX
+ * @date 2024/11/12
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class DeviceInfoOpenApiModel extends OpenApiModel {
+
+    @Schema(description = "设备ID、设备编号")
+    private String deviceId;
+
+    @Schema(description = "设备名称")
+    private String deviceName;
+
+    @Schema(description = "设备类型,如 消费机 门禁机")
+    private DeviceType deviceType;
+
+    private String deviceTypeStr;
+
+    public String getDeviceTypeStr() {
+        if (deviceType != null) {
+            return deviceType.getRemark();
+        }
+        return "";
+    }
+
+    @Schema(description = "网关号")
+    private String gateWayId;
+
+    @Schema(description = "设备名称")
+    private String gateWayName;
+
+    @Schema(description = "关联的项目code")
+    private String projectInfoCode;
+
+    @Schema(description = "关联的项目Name")
+    private String projectInfoName;
+
+    @Schema(description = "关联的项目信息")
+    private OrganizationSimpleModel projectInfo;
+
+    @Schema(description = "")
+    private OrganizationMiniModel organization;
+
+    @Schema(description = "所属机构信息")
+    private String beLongOid;
+
+    @Schema(description = "所属机构信息")
+    private String beLongName;
+
+    public String getBeLongOid() {
+        if (organization != null) {
+            return organization.getOid();
+        }
+        return "";
+    }
+
+    public String getBeLongName() {
+        if (organization != null) {
+            return organization.getName();
+        }
+        return "";
+    }
+
+    @Schema(description = "是否在线")
+    private OnLineState onLineState = OnLineState.OnLine;
+
+    private String onLineStateStr;
+
+    public String getOnLineStateStr() {
+        if (onLineState != null) {
+            return onLineState.getRemark();
+        }
+        return "";
+    }
+
+    @Schema(description = "最上线时间")
+    private Long lastOnlineTime;
+
+    @Schema(description = "设备IP地址")
+    private String ip;
+
+    @Schema(description = "数据状态")
+    private DataState state;
+
+    private String stateStr;
+
+    public String getStateStr() {
+        if (state != null) {
+            return state.getRemark();
+        }
+        return "";
+    }
+
+    @Schema(description = "区域信息")
+    private AreaSimpleModel area;
+
+    @Schema(description = "")
+    private String areaId;
+
+    public String getAreaId() {
+        if (ObjectUtils.isNotEmpty(area)) {
+            return area.getId();
+        }
+        return "";
+    }
+
+    private String areaName = "";
+
+    public String getAreaName() {
+        if (ObjectUtils.isNotEmpty(area)) {
+            return area.getName();
+        }
+        return "";
+    }
+
+    private String areaAllName = "";
+
+}

+ 1 - 1
FullCardClient/src/main/java/com/zhongshu/card/client/service/payment/ExpenseFlowService.java

@@ -24,7 +24,7 @@ public interface ExpenseFlowService {
 
     ResultContent<ExpenseFlowAreaModel> getDetail(String id);
 
-    ResultContent<ExpenseFlowModel> getDetailByPaymentNo(String paymentNo);
+    ResultContent<ExpenseFlowAreaModel> getDetailByPaymentNo(String paymentNo);
 
     // 商户的订单列表
     ResultContent<Page<ExpenseFlowModel>> pageBusMainOrder(ExpenseFlowSearch param, Pageable pageable);

+ 19 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/type/payment/SettlementState.java

@@ -0,0 +1,19 @@
+package com.zhongshu.card.client.type.payment;
+
+import lombok.Getter;
+
+/**
+ * 订单结算状态
+ */
+public enum SettlementState {
+    AlreadySettled("已结算"),
+    Unsettled("未结算"),
+    ;
+
+    @Getter
+    private String remark;
+
+    SettlementState(String remark) {
+        this.remark = remark;
+    }
+}

+ 6 - 5
FullCardServer/src/main/java/com/zhongshu/card/server/core/controller/feign/ExpenseFlowFeignController.java

@@ -1,14 +1,17 @@
 package com.zhongshu.card.server.core.controller.feign;
 
 import com.github.microservice.net.ResultContent;
-import com.zhongshu.card.client.model.payment.ExpenseFlowModel;
+import com.zhongshu.card.client.model.payment.ExpenseFlowAreaModel;
 import com.zhongshu.card.client.service.payment.ExpenseFlowService;
 import io.swagger.v3.oas.annotations.Hidden;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Parameter;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.*;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
 
 /**
  * @author TRX
@@ -25,9 +28,7 @@ public class ExpenseFlowFeignController {
 
     @Operation(summary = "查询订单信息", description = "查询订单信息")
     @RequestMapping(value = "manager/getDetailByPaymentNo", method = {RequestMethod.GET})
-    public ResultContent<ExpenseFlowModel> getDetailByPaymentNo(
-            @Parameter(name = "paymentNo", description = "paymentNo", required = false)
-            @RequestParam(name = "paymentNo") String paymentNo) {
+    public ResultContent<ExpenseFlowAreaModel> getDetailByPaymentNo(@Parameter(name = "paymentNo", description = "paymentNo", required = false) @RequestParam(name = "paymentNo") String paymentNo) {
         return expenseFlowService.getDetailByPaymentNo(paymentNo);
     }
 

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

@@ -54,4 +54,11 @@ public class ExpenseFlowOpenApiController {
         return expenseFlowOpenApiService.getDetailByPaymentNo(param);
     }
 
+    @ResourceAuth(value = "user", type = AuthType.User)
+    @Operation(summary = "关闭订单", description = "关闭订单")
+    @RequestMapping(value = {"closeOrder"}, method = {RequestMethod.POST})
+    public ResultContent<ExpenseFlowOpenApiModel> closeOrder(@RequestBody PaymentNoParam param) {
+        return expenseFlowOpenApiService.closeOrder(param);
+    }
+
 }

+ 8 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/controller/payment/ExpenseFlowController.java

@@ -9,6 +9,7 @@ import com.zhongshu.card.client.model.payment.*;
 import com.zhongshu.card.client.model.payment.statistic.BusinessMainStatisticModel;
 import com.zhongshu.card.client.model.payment.statistic.StatisticSearch;
 import com.github.microservice.net.ResultContent;
+import com.zhongshu.card.client.openApi.params.PaymentNoParam;
 import com.zhongshu.card.client.service.payment.ExpenseFlowService;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Parameter;
@@ -67,6 +68,13 @@ public class ExpenseFlowController {
         return this.expenseFlowService.getDetail(param.getId());
     }
 
+    @ResourceAuth(value = "user", type = AuthType.User)
+    @Operation(summary = "消费详情--支付订单号查询", description = "消费详情")
+    @RequestMapping(value = "getDetailByPaymentNo", method = {RequestMethod.POST})
+    public ResultContent<ExpenseFlowAreaModel> getDetailByPaymentNo(@RequestBody PaymentNoParam param) {
+        return this.expenseFlowService.getDetailByPaymentNo(param.getPaymentNo());
+    }
+
     @ResourceAuth(value = "user", type = AuthType.User)
     @Operation(summary = "统计消费总数(当前用户)", description = "统计消费总数")
     @RequestMapping(value = {"countPayment"}, method = {RequestMethod.POST})

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

@@ -7,6 +7,7 @@ import com.github.microservice.types.OrderModeType;
 import com.github.microservice.types.OrderState;
 import com.zhongshu.card.client.model.school.AreaSimpleModel;
 import com.zhongshu.card.client.type.RefundState;
+import com.zhongshu.card.client.type.payment.SettlementState;
 import com.zhongshu.card.server.core.domain.base.SuperMain;
 import com.zhongshu.card.server.core.domain.org.UserAccount;
 import com.zhongshu.card.server.core.domain.school.CardInfo;
@@ -229,4 +230,12 @@ public class ExpenseFlow extends SuperMain {
     @Schema(description = "退款账单流量")
     private List<String> refundTransactionIds = new ArrayList<String>();
 
+    //-------------------------结算信息 start ----------------
+
+    @Schema(description = "结算状态")
+    private SettlementState settlementState = SettlementState.Unsettled;
+
+    @Schema(description = "结算时间")
+    private Long settlementTime;
+    
 }

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

@@ -0,0 +1,111 @@
+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.devices.DeviceInfoModel;
+import com.zhongshu.card.client.model.devices.DeviceInfoSearch;
+import com.zhongshu.card.client.model.org.OrganizationMiniModel;
+import com.zhongshu.card.client.model.payment.ExpenseFlowSearch;
+import com.zhongshu.card.client.model.school.AreaSimpleModel;
+import com.zhongshu.card.client.openApi.model.DeviceInfoOpenApiModel;
+import com.zhongshu.card.client.openApi.model.ExpenseFlowOpenApiModel;
+import com.zhongshu.card.client.openApi.params.ExpenseFlowOpenApiSearch;
+import com.zhongshu.card.client.openApi.params.PaymentNoParam;
+import com.zhongshu.card.server.core.dao.devices.DeviceInfoDao;
+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.payment.ExpenseFlow;
+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;
+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.util.Collections;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 设备权限相关的 openAPI
+ *
+ * @author TRX
+ * @date 2024/11/12
+ */
+@Slf4j
+@Service
+public class DevicePermissOpenApiService extends SuperService {
+
+
+    @Autowired
+    private ExpenseFlowDao expenseFlowDao;
+
+    @Autowired
+    private OrganizationManagerServiceImpl organizationManagerService;
+
+    @Autowired
+    private OrganizationServiceImpl organizationServiceImpl;
+
+    @Autowired
+    private AreaServiceImpl areaService;
+
+    @Autowired
+    private DeviceInfoDao deviceInfoDao;
+
+    /**
+     * 设备列表
+     *
+     * @param apiSearch
+     * @return
+     */
+    public ResultContent<Page<DeviceInfoOpenApiModel>> page(ExpenseFlowOpenApiSearch apiSearch) {
+        if (StringUtils.isEmpty(apiSearch.getProjectCode())) {
+            return ResultContent.buildFail("projectCode不能为空");
+        }
+        DeviceInfoSearch param = new DeviceInfoSearch();
+
+
+        Pageable pageable = PageRequest.of(apiSearch.getNumber(), apiSearch.getSize());
+        Page<DeviceInfo> page = deviceInfoDao.page(pageable, param);
+        return ResultContent.buildSuccess(PageEntityUtil.concurrent2PageModel(page, this::toModel));
+    }
+
+    /**
+     * 设备基础信息
+     *
+     * @param entity
+     * @return
+     */
+    public DeviceInfoOpenApiModel toModel(DeviceInfo entity) {
+        DeviceInfoOpenApiModel model = null;
+        if (ObjectUtils.isNotEmpty(entity)) {
+            model = new DeviceInfoOpenApiModel();
+            // 所属机构信息
+            OrganizationMiniModel miniModel = organizationManagerService.toMiniModel(entity.getOrganization());
+            model.setOrganization(miniModel);
+
+            BeanUtils.copyProperties(entity, model);
+            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));
+            }
+        }
+        return model;
+    }
+
+}

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

@@ -3,6 +3,7 @@ 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.params.ExpenseFlowOpenApiSearch;
@@ -75,6 +76,32 @@ public class ExpenseFlowOpenApiService extends SuperService {
         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.getOrderType();
+        if (orderType == OrderState.CLOSED) {
+            return ResultContent.buildFail("订单已关闭");
+        }
+        if (expenseFlow.getIsPaySuccess() != null && expenseFlow.getIsPaySuccess()) {
+            return ResultContent.buildFail("订单已支付成功,不能关闭");
+        }
+        expenseFlow.setOrderType(OrderState.CLOSED);
+        expenseFlowDao.save(expenseFlow);
+        return ResultContent.buildSuccess();
+    }
+
     //----------------------------数据默认转换 start-----------------
 
     public ExpenseFlowOpenApiModel toModel(ExpenseFlow entity) {

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

@@ -26,6 +26,7 @@ import com.zhongshu.card.client.service.payment.ExpenseFlowService;
 import com.zhongshu.card.client.type.DataState;
 import com.zhongshu.card.client.type.StatisticType;
 import com.zhongshu.card.client.type.UserState;
+import com.zhongshu.card.client.type.payment.SettlementState;
 import com.zhongshu.card.client.type.school.CardState;
 import com.zhongshu.card.client.utils.DateUtils;
 import com.zhongshu.card.server.core.dao.devices.DeviceInfoDao;
@@ -145,7 +146,8 @@ public class ExpenseFlowServiceImpl extends SuperService implements ExpenseFlowS
         expenseFlow.setPaymentDeviceType(PaymentDeviceType.HxzConsumTransactions);
 
         expenseFlow.setOrderType(OrderState.WAIT_PAYMENT);
-
+        // 默认未结算状态
+        expenseFlow.setSettlementState(SettlementState.Unsettled);
         // 验证参数、填充数据
         commonVerifyExpenseFlow(expenseFlow);
         return ResultContent.buildSuccess(expenseFlow);
@@ -173,7 +175,7 @@ public class ExpenseFlowServiceImpl extends SuperService implements ExpenseFlowS
             if (entity.getMode() == 0) {
                 entity.setOrderModeType(OrderModeType.Consume);
                 // 支付
-                payCallService.pay(entity);
+                payCallService.payOrder(entity);
                 expenseFlowDao.save(entity);
             } else if (entity.getMode() == 2) {
                 // 查询余额模式
@@ -727,12 +729,12 @@ public class ExpenseFlowServiceImpl extends SuperService implements ExpenseFlowS
      * @param paymentNo
      * @return
      */
-    public ResultContent<ExpenseFlowModel> getDetailByPaymentNo(String paymentNo) {
+    public ResultContent<ExpenseFlowAreaModel> getDetailByPaymentNo(String paymentNo) {
         ExpenseFlow entity = expenseFlowDao.findTopByPaymentNo(paymentNo);
         if (ObjectUtils.isEmpty(entity)) {
             return ResultContent.buildSuccess(String.format(ResultMessage.DATA_NOT_EXIST, paymentNo));
         }
-        ExpenseFlowModel model = toModel(entity);
+        ExpenseFlowModel model = toAreaModel(entity);
         return ResultContent.buildSuccess(model);
     }
 
@@ -750,6 +752,9 @@ public class ExpenseFlowServiceImpl extends SuperService implements ExpenseFlowS
         if (expenseFlow.getOrderType() != OrderState.HAVE_PAID) {
             return ResultContent.buildFail(String.format("未支付成功,不能退款"));
         }
+        if (expenseFlow.getSettlementState() == SettlementState.AlreadySettled) {
+            return ResultContent.buildFail("订单已结算,不能退款");
+        }
         ResultContent resultContent = payCallService.refund(expenseFlow, param);
         if (resultContent.isFailed()) {
             return ResultContent.buildFail(resultContent.getMsg());

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

@@ -50,8 +50,13 @@ public class PayCallService extends SuperService {
      * @param entity
      * @return
      */
-    public ResultContent pay(ExpenseFlow entity) {
+    public ResultContent payOrder(ExpenseFlow entity) {
         PaymentType paymentType = entity.getPaymentType();
+        OrderState orderType = entity.getOrderType();
+        if (orderType != OrderState.WAIT_PAYMENT) {
+            return ResultContent.buildFail(String.format("订单不能支付:%s", orderType.getRemark()));
+        }
+        // 判断支付渠道
         if (paymentType == PaymentType.UserWallet) {
             return balancePay(entity);
         }