소스 검색

更新!

TRX 1 년 전
부모
커밋
90801d828c

+ 5 - 1
FullCardClient/src/main/java/com/zhongshu/card/client/model/payment/CreateOrderParam.java

@@ -34,7 +34,7 @@ public class CreateOrderParam {
     @Schema(description = "订单计费方式,定额支付")
     private ChargeableType chargeableType = ChargeableType.Specified;
 
-    @Schema(description = "支付来源")
+    @Schema(description = "订单来源、支付来源")
     private OrderFromType orderFromType;
 
     @Schema(description = "服务id、商品id")
@@ -69,4 +69,8 @@ public class CreateOrderParam {
 
     @Schema(description = "订单支付有效期时间,毫秒")
     private Long expirationTime;
+
+    @Schema(description = "微信小程序的openId")
+    private String openId;
+
 }

+ 15 - 1
FullCardClient/src/main/java/com/zhongshu/card/client/model/payment/ExpenseFlowSearch.java

@@ -1,9 +1,9 @@
 package com.zhongshu.card.client.model.payment;
 
 import com.github.microservice.types.OrderModeType;
+import com.github.microservice.types.OrderState;
 import com.github.microservice.types.payment.PaymentType;
 import com.zhongshu.card.client.model.base.SuperSearch;
-import com.github.microservice.types.OrderState;
 import com.zhongshu.card.client.type.RefundState;
 import com.zhongshu.card.client.type.StatisticType;
 import io.swagger.v3.oas.annotations.media.Schema;
@@ -23,9 +23,15 @@ import java.util.List;
 @NoArgsConstructor
 public class ExpenseFlowSearch extends SuperSearch {
 
+    @Schema(description = "订单所属的openId")
+    private String openId;
+
     @Schema(description = "用户userId")
     private String userId;
 
+    @Schema(description = "付款用户userId")
+    private String payUserId;
+
     @Schema(description = "订单类型")
     private OrderModeType orderModeType = OrderModeType.Consume;
 
@@ -41,6 +47,9 @@ public class ExpenseFlowSearch extends SuperSearch {
     @Schema(description = "消费类型,如:餐饮消费")
     private String payType;
 
+    @Schema(description = "消费类型 编码")
+    private String payTypeCode;
+
     @Schema(description = "年份,如:2024")
     private Integer year;
 
@@ -103,4 +112,9 @@ public class ExpenseFlowSearch extends SuperSearch {
     @Schema(description = "group 字段名称", hidden = true)
     private String fieldName = "";
 
+    @Schema(description = "是否已支付")
+    private Boolean isPaid;
+
+    @Schema(description = "是否必须支付,当是离线的时候,是先在边缘计算,再后面付款,则这个订单用户必须支付")
+    private Boolean isMustPay;
 }

+ 30 - 7
FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/payment/impl/ExpenseFlowDaoImpl.java

@@ -49,10 +49,29 @@ public class ExpenseFlowDaoImpl extends BaseImpl implements ExpenseFlowDaoExtend
     private Criteria buildSearcCriteria(ExpenseFlowSearch param) {
         Criteria criteria = buildCriteriaNotOid(param);
 
+        // 订单所属用户
         if (StringUtils.isNotEmpty(param.getUserId())) {
             criteria.and("userId").is(param.getUserId());
         }
 
+        if (StringUtils.isNotEmpty(param.getOpenId())) {
+            criteria.and("openId").is(param.getOpenId());
+        }
+
+        // 付款用户
+        if (StringUtils.isNotEmpty(param.getPayUserId())) {
+            criteria.and("payUserId").is(param.getPayUserId());
+        }
+
+        // 消费类型
+        if (StringUtils.isNotEmpty(param.getPayType())) {
+            criteria.and("payType").is(param.getPayType());
+        }
+
+        if (StringUtils.isNotEmpty(param.getPayTypeCode())) {
+            criteria.and("payTypeCode").is(param.getPayTypeCode());
+        }
+
         // 年
         if (param.getYear() != null) {
             criteria.and("year").is(param.getYear());
@@ -113,11 +132,19 @@ public class ExpenseFlowDaoImpl extends BaseImpl implements ExpenseFlowDaoExtend
             criteria.and("orderModeType").is(param.getOrderModeType());
         }
 
+        if (param.getIsPaid() != null) {
+            criteria.and("isPaid").is(param.getIsPaid());
+        }
+
         // 是否退款
         if (param.getIsRefund() != null) {
             criteria.and("isRefund").is(param.getIsRefund());
         }
 
+        if (param.getIsMustPay() != null) {
+            criteria.and("isMustPay").is(param.getIsMustPay());
+        }
+
         // 订单状态
         if (ObjectUtils.isNotEmpty(param.getOrderTypes())) {
             criteria.and("orderTypes").in(param.getOrderTypes());
@@ -282,13 +309,9 @@ public class ExpenseFlowDaoImpl extends BaseImpl implements ExpenseFlowDaoExtend
         ExpenseFlow doc = null;
         try {
             Query query = Query.query(Criteria.where("mqttDataId").is(mqttDataId).and("token").isNull());
-            Update update = new Update()
-                    .set("token", token)
-                    .set("createTime", System.currentTimeMillis());
-            FindAndModifyOptions options = new FindAndModifyOptions().upsert(true)
-                    .returnNew(true);
-            doc = mongoTemplate.findAndModify(query, update, options,
-                    ExpenseFlow.class);
+            Update update = new Update().set("token", token).set("createTime", System.currentTimeMillis());
+            FindAndModifyOptions options = new FindAndModifyOptions().upsert(true).returnNew(true);
+            doc = mongoTemplate.findAndModify(query, update, options, ExpenseFlow.class);
         } catch (Exception e) {
             log.error("init {}", e.getMessage());
         }

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

@@ -14,6 +14,7 @@ import com.zhongshu.card.client.type.RefundState;
 import com.zhongshu.card.client.type.payment.SettlementState;
 import com.zhongshu.card.client.utils.DateUtils;
 import com.zhongshu.card.server.core.domain.base.SuperMain;
+import com.zhongshu.card.server.core.domain.org.OrganizationUser;
 import com.zhongshu.card.server.core.domain.org.UserAccount;
 import com.zhongshu.card.server.core.domain.school.CardInfo;
 import io.swagger.v3.oas.annotations.media.Schema;
@@ -95,7 +96,11 @@ public class ExpenseFlow extends SuperMain {
     private Boolean isAnonymous = Boolean.FALSE;
 
     //----------------------------消费关联的用户信息 start ----------------------
-    @Schema(description = "消费的用户userId")
+    // 有可能是游客下的订单
+    @Schema(description = "订单所属的openId")
+    private String openId;
+
+    @Schema(description = "消费的用户userId/ 订单所属用户")
     private String userId;
 
     @Schema(description = "用户名称")
@@ -105,7 +110,7 @@ public class ExpenseFlow extends SuperMain {
     @DBRef(lazy = true)
     private UserAccount userAccount;
 
-    //-----------------------修复关联的设备信息 start--------------------
+    //-----------------------关联的设备信息 start--------------------
 
     @Schema(description = "是否是设备订单")
     private Boolean isDeviceOrder = Boolean.TRUE;
@@ -177,6 +182,20 @@ public class ExpenseFlow extends SuperMain {
 
     //------------------支付结果 start-------------------------
 
+    @Schema(description = "付款用户userId")
+    private String payUserId;
+
+    @Schema(description = "付款用户名称")
+    private String payUserName;
+
+    @Schema(description = "付款用户信息")
+    @DBRef(lazy = true)
+    private UserAccount payUserAccount;
+
+    @Schema(description = "付款项目用户信息")
+    @DBRef(lazy = true)
+    private OrganizationUser payOrganizationUser;
+
     @Schema(description = "失败时的重复次数")
     private Integer repeatTime = 0;
 

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

@@ -353,7 +353,7 @@ public class ExpenseFlowServiceImpl extends SuperService implements ExpenseFlowS
             return;
         }
 
-        // 验证用户信息
+        // 如果规定不可以匿名下单,则验证用户信息
         if ((entity.getIsAnonymous() == null || !entity.getIsAnonymous())) {
             if (StringUtils.isEmpty(userId)) {
                 entity.setVerifyError("订单未找到用户");
@@ -373,7 +373,10 @@ public class ExpenseFlowServiceImpl extends SuperService implements ExpenseFlowS
                 entity.setVerifyError("用户已锁定");
                 return;
             }
+        }
 
+        // 如果有用户信息,验证用户的权限
+        if (StringUtils.isNotEmpty(entity.getUserId())) {
             if (entity.getIsDeviceOrder() != null && entity.getIsDeviceOrder()) {
                 // 判断用户是否有设备使用权限
                 ResultContent<String> verifyDeviceContent = devicePermissVerifyService.verifyDevice(entity.getUserId(), entity.getDeviceId(), null);

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

@@ -92,10 +92,13 @@ public class OrderService extends SuperService {
         if (ObjectUtils.isEmpty(expenseFlow)) {
             return ResultContent.buildFail("订单生成失败,请稍后再试");
         }
+        String openId = getOpenId();
         String amount = param.getAmount().toPlainString();
         CreateOrderParam orderParam = new CreateOrderParam();
         orderParam.setDeviceId(deviceInfo.getDeviceId());
-        orderParam.setUserId(userAccount.getUserId());
+        if (userAccount != null) {
+            orderParam.setUserId(userAccount.getUserId());
+        }
         orderParam.setOrderNo(CommonUtil.UUID());
         orderParam.setAmount(amount);
         orderParam.setProductProvideId(param.getProductProvideId());
@@ -109,6 +112,7 @@ public class OrderService extends SuperService {
         // 指定支付方式 而且是微信渠道
         orderParam.setAppointPaymentType(Boolean.TRUE);
         orderParam.setPaymentType(PaymentType.WeChatPay);
+        orderParam.setOpenId(openId);
 
         // 创建订单 (判断是否创建成功)
         ResultContent<ExpenseFlow> content = expenseFlowService.createOrder(orderParam, expenseFlow);

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

@@ -26,6 +26,7 @@ import com.zhongshu.card.server.core.dao.payment.ExpenseFlowDao;
 import com.zhongshu.card.server.core.dao.payment.PaymentProcessDao;
 import com.zhongshu.card.server.core.dataConfig.OrderConfig;
 import com.zhongshu.card.server.core.domain.org.Organization;
+import com.zhongshu.card.server.core.domain.org.UserAccount;
 import com.zhongshu.card.server.core.domain.paySetting.ProjectMainPaySetting;
 import com.zhongshu.card.server.core.domain.paySetting.ProjectOrgPaySettingInfo;
 import com.zhongshu.card.server.core.domain.payment.ExpenseFlow;
@@ -37,6 +38,7 @@ 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.devices.DeviceUseRecordService;
 import com.zhongshu.card.server.core.service.mqtt.MqttServiceImpl;
+import com.zhongshu.card.server.core.service.org.OrganizationUserServiceImpl;
 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.ChinaumsSenselessPayService;
@@ -112,6 +114,9 @@ public class PayCallService extends SuperService {
     @Autowired
     private DeviceUseRecordService deviceUseRecordService;
 
+    @Autowired
+    private OrganizationUserServiceImpl organizationUserService;
+
     /**
      * 统一调用支付服务 (无感方式,直接后台 扣款)
      *
@@ -159,6 +164,13 @@ public class PayCallService extends SuperService {
         int maxTime = 5 * 1000;
         int stepTime = 110;
         boolean b = false;
+        UserAccount userAccount = getCurrentUserAccount();
+        if (ObjectUtils.isNotEmpty(userAccount)) {
+            entity.setPayUserId(userAccount.getUserId());
+            entity.setPayUserName(userAccount.getName());
+            entity.setPayUserAccount(userAccount);
+            entity.setPayOrganizationUser(organizationUserService.getUserInProjectBindOrgUserInfo(entity.getProjectOid(), userAccount));
+        }
         for (PaymentType paymentType : paymentTypes) {
             entity = expenseFlowDao.findTopById(entity.getId());
             entity.setPaymentType(paymentType);

+ 20 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/util/ValidateUtils.java

@@ -205,7 +205,27 @@ public class ValidateUtils {
      * @return
      */
     public static boolean isContainsUppercaseAndLowercase(String str) {
+        if (StringUtils.isEmpty(str)) {
+            return false;
+        }
         String regex = "(?=.*[A-Z])(?=.*[a-z])";
         return str.matches(regex);
     }
+
+    /**
+     * 判断是否是车牌号码
+     *
+     * @param carNumber
+     * @return
+     */
+    public static boolean isCarNumber(String carNumber) {
+        if (StringUtils.isEmpty(carNumber)) {
+            return false;
+        }
+        carNumber = carNumber.replace(".", "");
+        carNumber = carNumber.trim().toUpperCase();
+        String regex = "^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-HJ-NP-Z][A-HJ-NP-Z0-9]{4,5}[A-HJ-NP-Z0-9挂学警港澳]$";
+        return carNumber.matches(regex);
+    }
+
 }