TRX il y a 1 an
Parent
commit
bb98d65b31
19 fichiers modifiés avec 422 ajouts et 63 suppressions
  1. 3 0
      FullCardClient/src/main/java/com/zhongshu/card/client/model/devices/DeviceInfoSearch.java
  2. 26 0
      FullCardClient/src/main/java/com/zhongshu/card/client/model/devices/deviceProduct/DeviceProductProvideServeModel.java
  3. 8 0
      FullCardClient/src/main/java/com/zhongshu/card/client/model/devices/deviceProduct/DeviceProductProvideServeParam.java
  4. 27 0
      FullCardClient/src/main/java/com/zhongshu/card/client/model/devices/order/DeviceQrCodeParam.java
  5. 2 0
      FullCardClient/src/main/java/com/zhongshu/card/client/service/school/DeviceInfoService.java
  6. 21 0
      FullCardClient/src/main/java/com/zhongshu/card/client/type/device/ChargingType.java
  7. 33 0
      FullCardClient/src/main/java/com/zhongshu/card/client/type/device/ChargingUnitType.java
  8. 9 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/controller/devices/DeviceInfoController.java
  9. 37 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/controller/payment/OrderController.java
  10. 4 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/devices/DeviceProductBindDeviceDao.java
  11. 8 1
      FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/devices/impl/DeviceInfoDaoImpl.java
  12. 9 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/domain/devices/DeviceProductProvideServe.java
  13. 10 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/domain/devices/DeviceUseRecords.java
  14. 52 36
      FullCardServer/src/main/java/com/zhongshu/card/server/core/domain/payment/ExpenseFlow.java
  15. 18 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/service/devices/DeviceInfoServiceImpl.java
  16. 39 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/service/devices/deviceProduct/DeviceProductBindDeviceService.java
  17. 11 19
      FullCardServer/src/main/java/com/zhongshu/card/server/core/service/devices/permiss/DevicePermissVerifyService.java
  18. 27 6
      FullCardServer/src/main/java/com/zhongshu/card/server/core/service/payment/ExpenseFlowServiceImpl.java
  19. 78 1
      FullCardServer/src/main/java/com/zhongshu/card/server/core/service/payment/OrderService.java

+ 3 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/model/devices/DeviceInfoSearch.java

@@ -64,4 +64,7 @@ public class DeviceInfoSearch extends SuperSearch {
 
     @Schema(description = "商户oid集合")
     private List<String> shopOids = new ArrayList<>();
+
+    @Schema(description = "不存在的设备列表")
+    private List<String> notInDeviceIds = new ArrayList<>();
 }

+ 26 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/model/devices/deviceProduct/DeviceProductProvideServeModel.java

@@ -2,6 +2,8 @@ package com.zhongshu.card.client.model.devices.deviceProduct;
 
 import com.zhongshu.card.client.model.base.SuperModel;
 import com.zhongshu.card.client.type.DataState;
+import com.zhongshu.card.client.type.device.ChargingType;
+import com.zhongshu.card.client.type.device.ChargingUnitType;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.AllArgsConstructor;
 import lombok.Data;
@@ -30,6 +32,30 @@ public class DeviceProductProvideServeModel extends SuperModel {
     @Schema(description = "价格")
     private BigDecimal price = BigDecimal.ZERO;
 
+    @Schema(description = "收费模式")
+    private ChargingType chargingType;
+
+    private String chargingTypeStr;
+
+    public String getChargingTypeStr() {
+        if (chargingType != null) {
+            return chargingType.getRemark();
+        }
+        return "";
+    }
+
+    @Schema(description = "价格 单位")
+    private ChargingUnitType chargingUnitType;
+
+    private String chargingUnitTypeStr;
+
+    public String getChargingUnitTypeStr() {
+        if (chargingUnitType != null) {
+            return chargingUnitType.getRemark();
+        }
+        return "";
+    }
+
     @Schema(description = "其他参数")
     private Object param;
 

+ 8 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/model/devices/deviceProduct/DeviceProductProvideServeParam.java

@@ -2,6 +2,8 @@ package com.zhongshu.card.client.model.devices.deviceProduct;
 
 import com.zhongshu.card.client.model.base.SuperParam;
 import com.zhongshu.card.client.type.DataState;
+import com.zhongshu.card.client.type.device.ChargingType;
+import com.zhongshu.card.client.type.device.ChargingUnitType;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.AllArgsConstructor;
 import lombok.Data;
@@ -30,6 +32,12 @@ public class DeviceProductProvideServeParam extends SuperParam {
     @Schema(description = "价格")
     private BigDecimal price = BigDecimal.ZERO;
 
+    @Schema(description = "收费模式")
+    private ChargingType chargingType;
+
+    @Schema(description = "价格 单位")
+    private ChargingUnitType chargingUnitType;
+
     @Schema(description = "其他参数")
     private Object param;
 

+ 27 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/model/devices/order/DeviceQrCodeParam.java

@@ -0,0 +1,27 @@
+package com.zhongshu.card.client.model.devices.order;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+
+/**
+ * @author TRX
+ * @date 2025/1/15
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class DeviceQrCodeParam {
+
+    @Schema(description = "设备id")
+    private String deviceId;
+
+    @Schema(description = "服务id、商品id")
+    private String productProvideId;
+
+    @Schema(description = "金额,单位:元")
+    private BigDecimal amount;
+}

+ 2 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/service/school/DeviceInfoService.java

@@ -22,6 +22,8 @@ public interface DeviceInfoService {
 
     ResultContent<Page<DeviceInfoModel>> busPage(DeviceInfoSearch param, Pageable pageable);
 
+    ResultContent<Page<DeviceInfoModel>> pageBindDevices(DeviceInfoSearch param, Pageable pageable);
+
     ResultContent deleteDeviceInfo(String id);
 
     ResultContent<DeviceInfoMoreModel> getDeviceDetail(String id);

+ 21 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/type/device/ChargingType.java

@@ -0,0 +1,21 @@
+package com.zhongshu.card.client.type.device;
+
+import lombok.Getter;
+
+/**
+ * 收费模式
+ */
+public enum ChargingType {
+    Frequency("按次"),
+    Time("按时"),
+    Capacity("按量"),
+    Weight("按重量"),
+    ;
+
+    @Getter
+    private String remark;
+
+    ChargingType(String remark) {
+        this.remark = remark;
+    }
+}

+ 33 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/type/device/ChargingUnitType.java

@@ -0,0 +1,33 @@
+package com.zhongshu.card.client.type.device;
+
+import lombok.Getter;
+
+/**
+ * 收费模式
+ */
+public enum ChargingUnitType {
+    Frequency("次", ChargingType.Frequency),
+    Day("天", ChargingType.Time),
+    Hour("小时", ChargingType.Time),
+    Minute("分钟", ChargingType.Time),
+    Second("秒", ChargingType.Time),
+
+    CubicMeter("立方米", ChargingType.Capacity),
+    L("升", ChargingType.Capacity),
+    Ml("毫升", ChargingType.Capacity),
+    Ton("吨", ChargingType.Weight),
+    Kg("千克", ChargingType.Weight),
+    G("克", ChargingType.Weight),
+    ;
+
+    @Getter
+    private String remark;
+
+    @Getter
+    private ChargingType chargingType;
+
+    ChargingUnitType(String remark, ChargingType chargingType) {
+        this.remark = remark;
+        this.chargingType = chargingType;
+    }
+}

+ 9 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/controller/devices/DeviceInfoController.java

@@ -94,4 +94,13 @@ public class DeviceInfoController {
 
     //----------------------------设备基础信息 end--------------------------
 
+    @ResourceAuth(value = "user", type = AuthType.User)
+    @Operation(summary = "产品绑定可用的设备列表-分页查询", description = "产品绑定可用的设备列表-分页查询")
+    @RequestMapping(value = {"pageBindDevices"}, method = {RequestMethod.POST})
+    public ResultContent<Page<DeviceInfoModel>> pageBindDevices(@Parameter(hidden = true) @PageableDefault(page = 0, size = 10) Pageable pageable,
+            @Parameter(required = false) DeviceInfoSearch param) {
+        Assert.hasText(param.getProjectOid(), "projectOid不能为空");
+        return deviceInfoService.pageBindDevices(param, pageable);
+    }
+
 }

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

@@ -0,0 +1,37 @@
+package com.zhongshu.card.server.core.controller.payment;
+
+
+import com.github.microservice.auth.security.annotations.ResourceAuth;
+import com.github.microservice.auth.security.type.AuthType;
+import com.github.microservice.net.ResultContent;
+import com.zhongshu.card.client.model.devices.order.DeviceQrCodeParam;
+import com.zhongshu.card.server.core.service.payment.OrderService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RestController;
+
+@Slf4j
+@RestController
+@RequestMapping("orderManager")
+@Tag(name = "订单管理")
+public class OrderController {
+
+    @Autowired
+    private OrderService orderService;
+
+    /**
+     * 扫设备码下单
+     */
+    @ResourceAuth(value = "user", type = AuthType.User)
+    @Operation(summary = "扫设备码下单")
+    @RequestMapping(value = {"cToBqrCodeBCreateOrder"}, method = {RequestMethod.POST})
+    public ResultContent cToBqrCodeBCreateOrder(@RequestBody DeviceQrCodeParam param) {
+        return orderService.cToBqrCodeBCreateOrder(param);
+    }
+
+}

+ 4 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/devices/DeviceProductBindDeviceDao.java

@@ -17,10 +17,14 @@ public interface DeviceProductBindDeviceDao extends MongoDao<DeviceProductBindDe
 
     DeviceProductBindDevice findTopById(String id);
 
+    DeviceProductBindDevice findTopByDeviceIdOrderByCreateTimeDesc(String deviceId);
+
     DeviceProductBindDevice findTopByDeviceProductAndDeviceId(DeviceProduct deviceProduct, String deviceId);
 
     List<DeviceProductBindDevice> findByIdIn(List<String> ids);
 
+    List<DeviceProductBindDevice> findByProjectOid(String projectOid);
+
     void deleteByDeviceProductId(String deviceProductId);
 
     long countByDeviceProductId(String deviceProductId);

+ 8 - 1
FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/devices/impl/DeviceInfoDaoImpl.java

@@ -93,8 +93,15 @@ public class DeviceInfoDaoImpl extends BaseImpl implements DeviceInfoDaoExtend {
             criteria.and("beLongOid").in(param.getShopOids());
         }
 
+
         if (ObjectUtils.isNotEmpty(param.getDeviceIds())) {
-            criteria.and("deviceId").in(param.getDeviceIds());
+            if (ObjectUtils.isNotEmpty(param.getNotInDeviceIds())) {
+                criteria.and("deviceIds").in(param.getDeviceIds()).nin(param.getNotInDeviceIds());
+            } else {
+                criteria.and("deviceIds").is(param.getDeviceIds());
+            }
+        } else if (ObjectUtils.isNotEmpty(param.getNotInDeviceIds())) {
+            criteria.and("deviceId").nin(param.getNotInDeviceIds());
         }
 
         // 模糊搜索

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

@@ -1,6 +1,8 @@
 package com.zhongshu.card.server.core.domain.devices;
 
 import com.zhongshu.card.client.type.DataState;
+import com.zhongshu.card.client.type.device.ChargingType;
+import com.zhongshu.card.client.type.device.ChargingUnitType;
 import com.zhongshu.card.server.core.domain.base.SuperMain;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.AllArgsConstructor;
@@ -35,11 +37,18 @@ public class DeviceProductProvideServe extends SuperMain {
     @Schema(description = "服务名称")
     private String name;
 
+    @Schema(description = "服务关联的图片")
     private List<String> images = new ArrayList<>();
 
     @Schema(description = "价格")
     private BigDecimal price = BigDecimal.ZERO;
 
+    @Schema(description = "收费模式")
+    private ChargingType chargingType;
+
+    @Schema(description = "价格 单位")
+    private ChargingUnitType chargingUnitType;
+
     @Schema(description = "其他参数")
     private Object param;
 

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

@@ -2,6 +2,7 @@ package com.zhongshu.card.server.core.domain.devices;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.github.microservice.models.type.DeviceType;
+import com.github.microservice.types.deviceUse.DeviceUseState;
 import com.github.microservice.types.deviceUse.OperateState;
 import com.github.microservice.types.deviceUse.OperateType;
 import com.zhongshu.card.client.model.devices.DeviceInfoStoreModel;
@@ -40,6 +41,9 @@ public class DeviceUseRecords extends SuperMain {
     @Schema(description = "关联的项目名称")
     private String projectName;
 
+    @Schema(description = "设备使用状态")
+    private DeviceUseState useState = DeviceUseState.Finish;
+
     //----------------------------设备信息start ---------------------
 
     @Schema(description = "操作模式,卡片、人脸、密码、指纹...")
@@ -48,6 +52,12 @@ public class DeviceUseRecords extends SuperMain {
     @Schema(description = "操作记录结果, 成功、失败、未知")
     private OperateState operateState;
 
+    @Schema(description = "使用开始时间")
+    private Long startTime;
+
+    @Schema(description = "使用结束时间")
+    private Long endTime;
+
     @Schema(description = "设备ID")
     private String deviceId;
 

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

@@ -5,6 +5,7 @@ import com.github.microservice.models.type.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.payment.ChargeableType;
 import com.github.microservice.types.payment.PaymentDeviceType;
 import com.github.microservice.types.payment.PaymentType;
 import com.zhongshu.card.client.model.school.AreaSimpleModel;
@@ -45,6 +46,7 @@ public class ExpenseFlow extends SuperMain {
     @Schema(description = "mqtt推送生成的业务数据ID")
     private String mqttDataId;
 
+    @Schema(description = "")
     private String token;
 
     @Indexed
@@ -57,6 +59,9 @@ public class ExpenseFlow extends SuperMain {
     @Schema(description = "消费类型,如:餐饮消费、水费、电费 等等")
     private String payType;
 
+    @Schema(description = "订单计费方式")
+    private ChargeableType chargeableType = ChargeableType.Specified;
+
     @Indexed
     @Schema(description = "支付方式")
     private PaymentType paymentType;
@@ -64,9 +69,22 @@ public class ExpenseFlow extends SuperMain {
     @Schema(description = "支付来源:刷卡 二维码 刷脸")
     private OrderFromType orderFromType;
 
+    @Schema(description = "订单生效时间")
+    private Long startTime;
+
     @Schema(description = "订单失效时间")
     private Long expirationTime;
 
+    @Schema(description = "消费金额(单位:分)")
+    @Indexed
+    private BigDecimal payAmount;
+
+    @Schema(description = "服务id、商品id")
+    private String productProvideId;
+
+    @Schema(description = "是否允许匿名下单")
+    private Boolean isAnonymous = Boolean.FALSE;
+
     //----------------------------消费关联的用户信息 start ----------------------
     @Schema(description = "消费的用户userId")
     private String userId;
@@ -102,38 +120,6 @@ public class ExpenseFlow extends SuperMain {
     @Schema(description = "卡片信息")
     private CardInfo cardInfo;
 
-    @Schema(description = "年份,如:2024")
-    private Integer year;
-
-    @Schema(description = "月份,如:6")
-    private Integer month;
-
-    @Schema(description = "当前月的第几天")
-    private Integer dayOfMonth;
-
-    @Schema(description = "今年第几周,如:32")
-    private Integer week;
-
-    @Schema(description = "当前年的第几天")
-    private Integer dayOfYear;
-
-    @Schema(description = "当前的第几小时")
-    private Integer hourOfDay;
-
-    @Schema(description = "消费创建时间 yyyy-MM-dd HH:mm:ss SSS")
-    private String paymentTime;
-
-    public void setTimes() {
-        this.year = DateUtils.getCurrentYear();
-        this.month = DateUtils.getCurrentMonthInYear();
-        this.dayOfMonth = DateUtils.getCurrentDayInMonth();
-        this.hourOfDay = DateUtils.getCurrentHourOfDay();
-
-        this.dayOfYear = DateUtils.getCurrentDayInYear();
-        this.week = DateUtils.getCurrentWeekInYear();
-        this.paymentTime = DateUtils.paresTime(System.currentTimeMillis(), DateUtils.patternyyyySSS);
-    }
-
     @Schema(description = "消费订单号")
     private String orderNo;
 
@@ -144,10 +130,6 @@ public class ExpenseFlow extends SuperMain {
     @Schema(description = "付款码内容")
     private String qr;
 
-    @Schema(description = "消费金额(单位:分)")
-    @Indexed
-    private BigDecimal payAmount;
-
     @Schema(description = "关联信息")
     @Indexed
     private Object param;
@@ -268,4 +250,38 @@ public class ExpenseFlow extends SuperMain {
         this.orderState = OrderState.PAID_ERROR;
         this.isPaid = Boolean.TRUE;
     }
+
+    //------------------------------时间信息 start--------------------
+    @Schema(description = "年份,如:2024")
+    private Integer year;
+
+    @Schema(description = "月份,如:6")
+    private Integer month;
+
+    @Schema(description = "当前月的第几天")
+    private Integer dayOfMonth;
+
+    @Schema(description = "今年第几周,如:32")
+    private Integer week;
+
+    @Schema(description = "当前年的第几天")
+    private Integer dayOfYear;
+
+    @Schema(description = "当前的第几小时")
+    private Integer hourOfDay;
+
+    @Schema(description = "消费创建时间 yyyy-MM-dd HH:mm:ss SSS")
+    private String paymentTime;
+
+    public void setTimes() {
+        this.year = DateUtils.getCurrentYear();
+        this.month = DateUtils.getCurrentMonthInYear();
+        this.dayOfMonth = DateUtils.getCurrentDayInMonth();
+        this.hourOfDay = DateUtils.getCurrentHourOfDay();
+
+        this.dayOfYear = DateUtils.getCurrentDayInYear();
+        this.week = DateUtils.getCurrentWeekInYear();
+        this.paymentTime = DateUtils.paresTime(System.currentTimeMillis(), DateUtils.patternyyyySSS);
+    }
+    //------------------------------时间信息 end----------------------
 }

+ 18 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/devices/DeviceInfoServiceImpl.java

@@ -21,6 +21,7 @@ import com.zhongshu.card.server.core.domain.org.Organization;
 import com.zhongshu.card.server.core.domain.school.Area;
 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.deviceProduct.DeviceProductBindDeviceService;
 import com.zhongshu.card.server.core.service.devices.permiss.DevicePermissEventService;
 import com.zhongshu.card.server.core.service.org.OrganizationServiceImpl;
 import com.zhongshu.card.server.core.service.orgManager.OrganizationManagerServiceImpl;
@@ -77,6 +78,9 @@ public class DeviceInfoServiceImpl extends SuperService implements DeviceInfoSer
     @Autowired
     private DevicePermissEventService devicePermissEventService;
 
+    @Autowired
+    private DeviceProductBindDeviceService deviceProductBindDeviceService;
+
     /**
      * 同步设备 (设备基础信息)
      *
@@ -167,6 +171,20 @@ public class DeviceInfoServiceImpl extends SuperService implements DeviceInfoSer
         return ResultContent.buildSuccess(PageEntityUtil.concurrent2PageModel(page, this::toModel));
     }
 
+    /**
+     * 产品绑定设备(可见的设备列表)
+     *
+     * @param param
+     * @param pageable
+     * @return
+     */
+    @Override
+    public ResultContent<Page<DeviceInfoModel>> pageBindDevices(DeviceInfoSearch param, Pageable pageable) {
+        // 去掉已绑定的设备
+        param.setNotInDeviceIds(deviceProductBindDeviceService.getAllBindDeviceIds(param.getProjectOid()));
+        return page(param, pageable);
+    }
+
     @Override
     public ResultContent<Page<DeviceInfoModel>> busPage(DeviceInfoSearch param, Pageable pageable) {
         // 完善所属项目

+ 39 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/devices/deviceProduct/DeviceProductBindDeviceService.java

@@ -3,6 +3,7 @@ package com.zhongshu.card.server.core.service.devices.deviceProduct;
 import com.github.microservice.components.data.base.util.PageEntityUtil;
 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.IDsParam;
 import com.zhongshu.card.client.model.devices.deviceProduct.DeviceProductBindDeviceBind;
 import com.zhongshu.card.client.model.devices.deviceProduct.DeviceProductBindDeviceModel;
@@ -27,6 +28,7 @@ import org.springframework.stereotype.Service;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * @author TRX
@@ -69,7 +71,15 @@ public class DeviceProductBindDeviceService extends SuperService {
         if (ObjectUtils.isNotEmpty(list)) {
             List<DeviceProductBindDevice> saveList = new ArrayList<>();
             for (DeviceInfo deviceInfo : list) {
+                // 检查是否已绑定
+                DeviceProductBindDevice old = deviceProductBindDeviceDao.findTopByDeviceIdOrderByCreateTimeDesc(deviceInfo.getDeviceId());
                 DeviceProductBindDevice deviceProductBindDevice = deviceProductBindDeviceDao.findTopByDeviceProductAndDeviceId(deviceProduct, deviceInfo.getDeviceId());
+                if (ObjectUtils.isNotEmpty(old) && (ObjectUtils.isEmpty(deviceProductBindDevice))
+                        || !deviceProductBindDevice.getId().equals(old.getId())) {
+                    // 已绑定,将不能继续绑定
+                    continue;
+                }
+
                 if (ObjectUtils.isEmpty(deviceProductBindDevice)) {
                     deviceProductBindDevice = new DeviceProductBindDevice();
                     deviceProductBindDevice.setDeviceProduct(deviceProduct);
@@ -133,6 +143,35 @@ public class DeviceProductBindDeviceService extends SuperService {
         return ResultContent.buildSuccess(PageEntityUtil.concurrent2PageModel(page, this::toModel));
     }
 
+    /**
+     * 检查设备是否绑定了产品
+     *
+     * @param deviceId
+     * @return
+     */
+    public ResultContent<DeviceProduct> checkAndGetDeviceProduct(String deviceId) {
+        DeviceProductBindDevice deviceProductBindDevice = deviceProductBindDeviceDao.findTopByDeviceIdOrderByCreateTimeDesc(deviceId);
+        if (ObjectUtils.isEmpty(deviceProductBindDevice)) {
+            return ResultContent.buildFail("设备未配置产品信息");
+        }
+        return ResultContent.buildSuccess(deviceProductBindDevice.getDeviceProduct());
+    }
+
+    /**
+     * 得到所有已绑定的设备
+     *
+     * @param projectOid
+     * @return
+     */
+    public List<String> getAllBindDeviceIds(String projectOid) {
+        List<DeviceProductBindDevice> list = deviceProductBindDeviceDao.findByProjectOid(projectOid);
+        if (ObjectUtils.isNotEmpty(list)) {
+            return list.parallelStream().map(it -> it.getDeviceId()).collect(Collectors.toList());
+        }
+        return Lists.newArrayList();
+    }
+
+
     private DeviceProductBindDeviceModel toModel(DeviceProductBindDevice entity) {
         DeviceProductBindDeviceModel model = new DeviceProductBindDeviceModel();
         if (ObjectUtils.isNotEmpty(entity)) {

+ 11 - 19
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/devices/permiss/DevicePermissVerifyService.java

@@ -12,15 +12,15 @@ import com.zhongshu.card.client.type.UserState;
 import com.zhongshu.card.client.type.device.TimeSlotType;
 import com.zhongshu.card.client.type.device.WeekDayType;
 import com.zhongshu.card.client.utils.DateUtils;
-import com.zhongshu.card.server.core.dao.devices.*;
-import com.zhongshu.card.server.core.dao.org.OrganizationUserDao;
+import com.zhongshu.card.server.core.dao.devices.DeviceInfoDao;
+import com.zhongshu.card.server.core.dao.devices.DevicePermissDao;
+import com.zhongshu.card.server.core.dao.devices.PermissSettingListDao;
+import com.zhongshu.card.server.core.dao.devices.PermissTimeSlotDao;
 import com.zhongshu.card.server.core.dao.org.UserCountDao;
-import com.zhongshu.card.server.core.dao.org.UserGroupToUserDao;
 import com.zhongshu.card.server.core.domain.devices.DeviceInfo;
 import com.zhongshu.card.server.core.domain.devices.permiss.DevicePermiss;
 import com.zhongshu.card.server.core.domain.devices.permiss.PermissTimeSlot;
 import com.zhongshu.card.server.core.domain.org.UserAccount;
-import com.zhongshu.card.server.core.service.org.OrganizationUserServiceImpl;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.ObjectUtils;
 import org.apache.commons.lang3.StringUtils;
@@ -49,9 +49,6 @@ public class DevicePermissVerifyService {
     @Autowired
     private UserCountDao userCountDao;
 
-    @Autowired
-    private OrganizationUserDao organizationUserDao;
-
     @Autowired
     private DeviceInfoDao deviceInfoDao;
 
@@ -61,15 +58,6 @@ public class DevicePermissVerifyService {
     @Autowired
     private PermissTimeSlotDao permissTimeSlotDao;
 
-    @Autowired
-    private DeviceGroupToDeviceDao deviceGroupToDeviceDao;
-
-    @Autowired
-    private OrganizationUserServiceImpl organizationUserService;
-
-    @Autowired
-    private UserGroupToUserDao userGroupToUserDao;
-
     @Autowired
     private UserPermissDataCacheService userPermissDataCacheService;
 
@@ -84,8 +72,10 @@ public class DevicePermissVerifyService {
         if (StringUtils.isEmpty(userId)) {
             return ResultContent.buildFail("未包含用户信息");
         }
-        deviceUserParam.setUserId(userId);
-        deviceUserParam.setDeviceId(deviceId);
+        if (ObjectUtils.isNotEmpty(deviceUserParam)) {
+            deviceUserParam.setUserId(userId);
+            deviceUserParam.setDeviceId(deviceId);
+        }
 
         StopWatch stopWatch = new StopWatch();
         stopWatch.start("用户信息");
@@ -188,7 +178,9 @@ public class DevicePermissVerifyService {
                 }
             }
         }
-        deviceUserParam.setUseTime(stopWatch.getTotalTimeMillis());
+        if (ObjectUtils.isNotEmpty(deviceUserParam)) {
+            deviceUserParam.setUseTime(stopWatch.getTotalTimeMillis());
+        }
         log.info("权限验证:{} {}", stopWatch.prettyPrint(), msg);
         if (!hasPermission) {
             return ResultContent.buildFail(msg);

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

@@ -125,7 +125,19 @@ public class ExpenseFlowServiceImpl extends SuperService implements ExpenseFlowS
      * @return
      */
     public ResultContent<ExpenseFlow> createExpenseFlowByHxz(ConsumTransactionsModel iotParam, ExpenseFlow expenseFlow) {
+        BeanUtils.copyProperties(iotParam, expenseFlow, "id");
+
+        expenseFlow.setUserId(iotParam.getUserId());
+
+        // 订单产生 类型、方式(订单来源)
+        expenseFlow.setOrderFromType(iotParam.getOrderFromType());
+        // 订单关联的商品信息
+        expenseFlow.setProductProvideId(iotParam.getProductProvideId());
+        // 订单计费方式
+        expenseFlow.setChargeableType(iotParam.getChargeableType());
+
         expenseFlow.setMqttDataId(iotParam.getMqttDataId());
+
         expenseFlow.setTimes();
         // 消费订单号
         expenseFlow.setOrderNo(iotParam.getOrder());
@@ -139,17 +151,17 @@ public class ExpenseFlowServiceImpl extends SuperService implements ExpenseFlowS
         BigDecimal amount = CommonUtil.turnMoney2BigDecimal(iotParam.getAmount());
         expenseFlow.setPayAmount(amount);
 
-        String deviceId = iotParam.getDeviceId();
-        expenseFlow.setDeviceId(deviceId);
-        // 支付来源  刷卡  二维码  刷脸
-        expenseFlow.setOrderFromType(iotParam.getOrderFromType());
+        expenseFlow.setDeviceId(iotParam.getDeviceId());
+
         // 传过来的参数
         expenseFlow.setParam(iotParam);
-        // 支付来源设备产品类型
-        expenseFlow.setPaymentDeviceType(PaymentDeviceType.HxzConsumTransactions);
+
+        // 来源设备产品类型
+        expenseFlow.setPaymentDeviceType(iotParam.getPaymentDeviceType());
 
         // 订单支付状态
         expenseFlow.setOrderState(OrderState.WAIT_PAYMENT);
+
         // 默认未结算状态
         expenseFlow.setSettlementState(SettlementState.Unsettled);
 
@@ -158,6 +170,7 @@ public class ExpenseFlowServiceImpl extends SuperService implements ExpenseFlowS
         return ResultContent.buildSuccess(expenseFlow);
     }
 
+
     /**
      * 订单支付
      *
@@ -357,6 +370,13 @@ public class ExpenseFlowServiceImpl extends SuperService implements ExpenseFlowS
         entity.setVerifyParamMsg("参数验证成功");
     }
 
+    public ExpenseFlow saveInfo(ExpenseFlow entity) {
+        if (ObjectUtils.isNotEmpty(entity)) {
+            expenseFlowDao.save(entity);
+        }
+        return entity;
+    }
+
     /**
      * 消费机 B扫C的支付
      *
@@ -761,6 +781,7 @@ public class ExpenseFlowServiceImpl extends SuperService implements ExpenseFlowS
         return ResultContent.buildSuccess();
     }
 
+
     /**
      * 模型转换
      *

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

@@ -1,8 +1,24 @@
 package com.zhongshu.card.server.core.service.payment;
 
+import com.github.microservice.models.gateDoor.use.GateDoorUseParam;
+import com.github.microservice.models.hxz.ConsumTransactionsModel;
+import com.github.microservice.models.type.OrderFromType;
 import com.github.microservice.net.ResultContent;
+import com.github.microservice.types.payment.ChargeableType;
+import com.zhongshu.card.client.model.devices.order.DeviceQrCodeParam;
+import com.zhongshu.card.server.core.dao.devices.DeviceInfoDao;
+import com.zhongshu.card.server.core.domain.devices.DeviceInfo;
+import com.zhongshu.card.server.core.domain.devices.DeviceProduct;
+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.SuperService;
+import com.zhongshu.card.server.core.service.devices.deviceProduct.DeviceProductBindDeviceService;
+import com.zhongshu.card.server.core.service.devices.permiss.DevicePermissVerifyService;
+import com.zhongshu.card.server.core.util.CommonUtil;
 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.stereotype.Service;
 
 /**
@@ -15,12 +31,73 @@ import org.springframework.stereotype.Service;
 @Service
 public class OrderService extends SuperService {
 
+    @Autowired
+    private DeviceProductBindDeviceService deviceProductBindDeviceService;
+
+    @Autowired
+    private DeviceInfoDao deviceInfoDao;
+
+    @Autowired
+    private DevicePermissVerifyService devicePermissVerifyService;
+
+    @Autowired
+    private ExpenseFlowServiceImpl expenseFlowService;
+
     /**
      * 小程序扫 设备码 下单
      *
      * @return
      */
-    public ResultContent cqrCodeBCreateOrder() {
+    public ResultContent cToBqrCodeBCreateOrder(DeviceQrCodeParam param) {
+        if (StringUtils.isEmpty(param.getDeviceId())) {
+            return ResultContent.buildFail("deviceId不能为空");
+        }
+        UserAccount userAccount = getCurrentUserAccount();
+        DeviceInfo deviceInfo = deviceInfoDao.findTopByDeviceId(param.getDeviceId());
+        if (ObjectUtils.isEmpty(deviceInfo)) {
+            return ResultContent.buildFail("设备不存在");
+        }
+        // 检查用户设备权限
+        GateDoorUseParam param1 = new GateDoorUseParam();
+        ResultContent<String> verifyDeviceContent = devicePermissVerifyService.verifyDevice(userAccount.getUserId(), param.getDeviceId(), param1);
+        if (verifyDeviceContent.isFailed()) {
+            return ResultContent.buildFail(verifyDeviceContent.getMsg());
+        }
+
+        // 检查设备是否绑定产品
+        ResultContent<DeviceProduct> deviceProductResultContent = deviceProductBindDeviceService.checkAndGetDeviceProduct(deviceInfo.getDeviceId());
+        if (deviceProductResultContent.isFailed()) {
+            return ResultContent.buildFail(deviceProductResultContent.getMsg());
+        }
+        DeviceProduct deviceProduct = deviceProductResultContent.getContent();
+        if (ObjectUtils.isEmpty(deviceProduct)) {
+            return ResultContent.buildFail("设备未绑定产品信息不存在");
+        }
+        if (StringUtils.isEmpty(param.getProductProvideId()) && CommonUtil.bigDecimalIsEmpty(param.getAmount())) {
+            return ResultContent.buildFail("消费金额不能为空");
+        }
+
+        String mqttDataId = CommonUtil.UUID();
+        ExpenseFlow expenseFlow = expenseFlowService.init(mqttDataId);
+        if (ObjectUtils.isEmpty(expenseFlow)) {
+            return ResultContent.buildFail("订单生成失败,请稍后再试");
+        }
+        String amount = param.getAmount().toPlainString();
+        ConsumTransactionsModel orderParam = new ConsumTransactionsModel();
+        orderParam.setDeviceId(deviceInfo.getDeviceId());
+        orderParam.setUserId(userAccount.getUserId());
+        orderParam.setOrder(CommonUtil.UUID());
+        orderParam.setAmount(amount);
+        orderParam.setProductProvideId(param.getProductProvideId());
+        // 扫码下单
+        orderParam.setOrderFromType(OrderFromType.C2BQrCode);
+        // 是否可以匿名消费
+        orderParam.setIsAnonymous(Boolean.FALSE);
+        // 是否是浮动计费 计费方式
+        orderParam.setChargeableType(ChargeableType.Specified);
+
+        ResultContent<ExpenseFlow> content = expenseFlowService.createExpenseFlowByHxz(orderParam, expenseFlow);
+        expenseFlow = expenseFlowService.saveInfo(expenseFlow);
 
         return ResultContent.buildSuccess();
     }