diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/CommonConstant.java b/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/CommonConstant.java index 9d1c9a4..1b289f5 100644 --- a/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/CommonConstant.java +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/CommonConstant.java @@ -445,4 +445,12 @@ public interface CommonConstant { // 食堂支付人脸数据键名 String FACE_CACHE_PAY = "FACE_CACHE_PAY"; + /** + * 设备状态缓存 key: 设备编号 value 时间戳 + */ + String DEVICE_STATUS = "device_status"; + /** + * 下发信息缓存 key: 设备编号 + */ + String ISSUE_INFORMATION = "issue_information"; } diff --git a/jeecg-module-system/jeecg-system-api/jeecg-system-local-api/pom.xml b/jeecg-module-system/jeecg-system-api/jeecg-system-local-api/pom.xml index a6fad21..4e1857d 100644 --- a/jeecg-module-system/jeecg-system-api/jeecg-system-local-api/pom.xml +++ b/jeecg-module-system/jeecg-system-api/jeecg-system-local-api/pom.xml @@ -10,5 +10,13 @@ 4.0.0 jeecg-system-local-api + + + com.opencsv + opencsv + 5.7.1 + compile + + \ No newline at end of file diff --git a/jeecg-module-system/jeecg-system-api/jeecg-system-local-api/src/main/java/org/jeecg/emp/vo/StUserBalanceVo.java b/jeecg-module-system/jeecg-system-api/jeecg-system-local-api/src/main/java/org/jeecg/emp/vo/StUserBalanceVo.java index 82e4d53..b453c0b 100644 --- a/jeecg-module-system/jeecg-system-api/jeecg-system-local-api/src/main/java/org/jeecg/emp/vo/StUserBalanceVo.java +++ b/jeecg-module-system/jeecg-system-api/jeecg-system-local-api/src/main/java/org/jeecg/emp/vo/StUserBalanceVo.java @@ -46,6 +46,10 @@ public class StUserBalanceVo { * 用户类型 0正式 1非正式 2家庭成员 */ private String userType; + /** + * 家庭成员 对应主用户id + */ + private String mainUserId; /** * 食堂id */ diff --git a/jeecg-module-system/jeecg-system-api/jeecg-system-local-api/src/main/java/org/jeecg/equipment/dto/StEquipmentDto.java b/jeecg-module-system/jeecg-system-api/jeecg-system-local-api/src/main/java/org/jeecg/equipment/dto/StEquipmentDto.java new file mode 100644 index 0000000..7e88d95 --- /dev/null +++ b/jeecg-module-system/jeecg-system-api/jeecg-system-local-api/src/main/java/org/jeecg/equipment/dto/StEquipmentDto.java @@ -0,0 +1,16 @@ +package org.jeecg.equipment.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +public class StEquipmentDto { + + @Schema(title = "设备名称编码") + private String appPackageLocalUrl; + @Schema(title = "所在位置") + private String placement; + @Schema(title = "备注") + private String remark; + +} diff --git a/jeecg-module-system/jeecg-system-api/jeecg-system-local-api/src/main/java/org/jeecg/equipment/entity/StCanteenEquipment.java b/jeecg-module-system/jeecg-system-api/jeecg-system-local-api/src/main/java/org/jeecg/equipment/entity/StCanteenEquipment.java new file mode 100644 index 0000000..03faf47 --- /dev/null +++ b/jeecg-module-system/jeecg-system-api/jeecg-system-local-api/src/main/java/org/jeecg/equipment/entity/StCanteenEquipment.java @@ -0,0 +1,63 @@ +package org.jeecg.equipment.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import org.jeecgframework.poi.excel.annotation.Excel; + +import java.io.Serializable; +import java.util.Date; + +/** + * @Description: 设备管理表 + * @Author: jeecg-boot + * @Date: 2022-08-30 + * @Version: V1.0 + */ +@Data +@TableName("st_canteen_equipment") +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = false) +@Tag(name="st_canteen_equipment对象", description="食堂设备表") +public class StCanteenEquipment implements Serializable { + private static final long serialVersionUID = 1L; + + /**主键*/ + @TableId(type = IdType.ASSIGN_ID) + @Schema(title = "设备编码") + private String equipmentCode; + + /**食堂id*/ + @Schema(title = "食堂id") + private String canteenId; + + @Schema(title = "设备ip") + private String equipmentIp; + /** + * 本地人脸数 + */ + @Schema(title = "本地人脸数") + private Integer faceNum; + /** + * 设备剩余存储量 + */ + @Schema(title = "设备剩余存储量") + private String availableMemory; + /**创建日期*/ + @Schema(title = "创建日期") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private Date createTime; + + /**更新日期*/ + @Schema(title = "更新日期") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private Date updateTime; + +} diff --git a/jeecg-module-system/jeecg-system-api/jeecg-system-local-api/src/main/java/org/jeecg/equipment/entity/StEquipment.java b/jeecg-module-system/jeecg-system-api/jeecg-system-local-api/src/main/java/org/jeecg/equipment/entity/StEquipment.java index c98de08..805d9cd 100644 --- a/jeecg-module-system/jeecg-system-api/jeecg-system-local-api/src/main/java/org/jeecg/equipment/entity/StEquipment.java +++ b/jeecg-module-system/jeecg-system-api/jeecg-system-local-api/src/main/java/org/jeecg/equipment/entity/StEquipment.java @@ -117,4 +117,10 @@ public class StEquipment implements Serializable { /**所属餐道餐道中的顺序*/ @Schema(title = "所属餐道餐道中的顺序") private Integer owningTrackOrder; + + @Schema(title = "所在位置") + private String placement; + + @Schema(title = "备注") + private String remark; } diff --git a/jeecg-module-system/jeecg-system-api/jeecg-system-local-api/src/main/java/org/jeecg/payment/dto/StClientMemberTransactionRecordDTO.java b/jeecg-module-system/jeecg-system-api/jeecg-system-local-api/src/main/java/org/jeecg/payment/dto/StClientMemberTransactionRecordDTO.java index b7c24c3..7d05cd7 100644 --- a/jeecg-module-system/jeecg-system-api/jeecg-system-local-api/src/main/java/org/jeecg/payment/dto/StClientMemberTransactionRecordDTO.java +++ b/jeecg-module-system/jeecg-system-api/jeecg-system-local-api/src/main/java/org/jeecg/payment/dto/StClientMemberTransactionRecordDTO.java @@ -19,6 +19,8 @@ public class StClientMemberTransactionRecordDTO { @DateTimeFormat(pattern="yyyy-MM-dd") @Schema(title ="就餐时间") private String mainTimeDay; + private String startDate; + private String endDate; private String startTime; @@ -82,4 +84,7 @@ public class StClientMemberTransactionRecordDTO { //直接部门ID private String departId; + + @Schema(title ="餐次") + private String dinnerType; } diff --git a/jeecg-module-system/jeecg-system-api/jeecg-system-local-api/src/main/java/org/jeecg/payment/dto/StExceptionRecordDTO.java b/jeecg-module-system/jeecg-system-api/jeecg-system-local-api/src/main/java/org/jeecg/payment/dto/StExceptionRecordDTO.java new file mode 100644 index 0000000..58f51b5 --- /dev/null +++ b/jeecg-module-system/jeecg-system-api/jeecg-system-local-api/src/main/java/org/jeecg/payment/dto/StExceptionRecordDTO.java @@ -0,0 +1,46 @@ +package org.jeecg.payment.dto; + + + +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.Data; + +import java.util.List; + +/** + */ +@Data +@Tag(name= "StExceptionRecordDTO对象", description = "消费异常记录") +public class StExceptionRecordDTO { + + /** + * 时间区间 + */ + private List dates; + private String startTime; + private String endTime; + + @Schema(title ="手机号") + private String phone; + + @Schema(title ="会员姓名") + private String userName; + + @Schema(title ="工号") + private String workNo; + + @Schema(title ="卡号") + private String cardCode; + + //直接部门ID + private String departId; + @Schema(title="部门集合") + private List list; + + @Schema(title ="当前页") + private Integer pageNo; + @Schema(title ="数量/页") + private Integer pageSize; + +} diff --git a/jeecg-module-system/jeecg-system-api/jeecg-system-local-api/src/main/java/org/jeecg/payment/entity/StBbzxOrderInfo.java b/jeecg-module-system/jeecg-system-api/jeecg-system-local-api/src/main/java/org/jeecg/payment/entity/StBbzxOrderInfo.java index 8c0a608..a626abf 100644 --- a/jeecg-module-system/jeecg-system-api/jeecg-system-local-api/src/main/java/org/jeecg/payment/entity/StBbzxOrderInfo.java +++ b/jeecg-module-system/jeecg-system-api/jeecg-system-local-api/src/main/java/org/jeecg/payment/entity/StBbzxOrderInfo.java @@ -43,6 +43,10 @@ public class StBbzxOrderInfo extends JeecgEntity implements Serializable { @Schema(title ="餐次名称") private String dinnerType; + + @Schema(title ="设备编码") + private String deviceCode; + /** * 经营模式、扣费类型(1:固定扣费,2:固定+补贴扣费,3:按量扣费) */ diff --git a/jeecg-module-system/jeecg-system-api/jeecg-system-local-api/src/main/java/org/jeecg/payment/entity/StClientMemberTransactionRecord.java b/jeecg-module-system/jeecg-system-api/jeecg-system-local-api/src/main/java/org/jeecg/payment/entity/StClientMemberTransactionRecord.java index d6c5caf..600214f 100644 --- a/jeecg-module-system/jeecg-system-api/jeecg-system-local-api/src/main/java/org/jeecg/payment/entity/StClientMemberTransactionRecord.java +++ b/jeecg-module-system/jeecg-system-api/jeecg-system-local-api/src/main/java/org/jeecg/payment/entity/StClientMemberTransactionRecord.java @@ -38,6 +38,9 @@ public class StClientMemberTransactionRecord extends JeecgEntity implements Seri @Schema(title ="交易流水号") private String serialNo; + @Schema(title ="设备编码") + private String deviceCode; + /** * 订单号 */ diff --git a/jeecg-module-system/jeecg-system-api/jeecg-system-local-api/src/main/java/org/jeecg/payment/entity/StConsumptionExceptionRecord.java b/jeecg-module-system/jeecg-system-api/jeecg-system-local-api/src/main/java/org/jeecg/payment/entity/StConsumptionExceptionRecord.java new file mode 100644 index 0000000..47ebe97 --- /dev/null +++ b/jeecg-module-system/jeecg-system-api/jeecg-system-local-api/src/main/java/org/jeecg/payment/entity/StConsumptionExceptionRecord.java @@ -0,0 +1,66 @@ +/** + * use shuwei code generator created + */ +package org.jeecg.payment.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + + +@Data +@TableName("st_consumption_exception_record") +@EqualsAndHashCode(callSuper = false) +@Tag(name= "StConsumptionExceptionRecord对象", description = "异常消费流水") +public class StConsumptionExceptionRecord implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(type = IdType.ASSIGN_ID) + @Schema(title ="ID") + private String id; + @Schema(title ="用户id") + private String userId; + @Schema(title ="设备编码") + private String deviceCode; + @Schema(title ="食堂ID") + private String canteenId; + @Schema(title ="卡号") + private String cardCode; + @Schema(title ="支付唯一id") + private String payId; + @Schema(title ="消费时间(时间戳)") + private String dateTime; + @Schema(title ="消费时间") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private Date payTime; + @Schema(title ="消费金额") + private BigDecimal spendMoney; + @Schema(title ="二次扣费标记 1 是; 0 否") + private Integer secondChargeFlag; + @Schema(title ="自定义扣费标记 1 是 ; 0 否") + private Integer isCustom; + @Schema(title ="恢复标记 1 是; 0 否") + private Integer isRestore; + + + /**创建日期*/ + @Schema(title = "创建日期") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private Date createTime; + + /**更新日期*/ + @Schema(title = "更新日期") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private Date updateTime; + +} diff --git a/jeecg-module-system/jeecg-system-api/jeecg-system-local-api/src/main/java/org/jeecg/payment/vo/StCanteenEquipmentVo.java b/jeecg-module-system/jeecg-system-api/jeecg-system-local-api/src/main/java/org/jeecg/payment/vo/StCanteenEquipmentVo.java new file mode 100644 index 0000000..bdb14e2 --- /dev/null +++ b/jeecg-module-system/jeecg-system-api/jeecg-system-local-api/src/main/java/org/jeecg/payment/vo/StCanteenEquipmentVo.java @@ -0,0 +1,34 @@ +package org.jeecg.payment.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +public class StCanteenEquipmentVo { + + @Schema(description = "食堂id") + private String canteenId; + @Schema(description = "食堂名称") + private String restName; + @Schema(description = "设备名称") + private String equipmentName; + @Schema(description = "设备编码") + private String equipmentCode; + @Schema(description = "设备编码(前端展示)") + private String appPackageLocalUrl; + @Schema(description = "所在位置") + private String placement; + @Schema(description = "设备描述") + private String remark; + @Schema(description = "设备ip") + private String equipmentIp; + @Schema(description = "本地人脸数") + private Integer faceNum; + @Schema(description = "设备剩余存储量") + private String availableMemory; + @Schema(description = "设备状态: 0离线 1在线") + private String status; + @Schema(description = "上传数量") + private Integer totalNum; + +} diff --git a/jeecg-module-system/jeecg-system-api/jeecg-system-local-api/src/main/java/org/jeecg/payment/vo/StExceptionRecordVo.java b/jeecg-module-system/jeecg-system-api/jeecg-system-local-api/src/main/java/org/jeecg/payment/vo/StExceptionRecordVo.java new file mode 100644 index 0000000..4da6be5 --- /dev/null +++ b/jeecg-module-system/jeecg-system-api/jeecg-system-local-api/src/main/java/org/jeecg/payment/vo/StExceptionRecordVo.java @@ -0,0 +1,51 @@ +package org.jeecg.payment.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import org.jeecg.common.util.BigDecimalSerialize; + +import java.math.BigDecimal; +import java.util.Date; + +@Data +public class StExceptionRecordVo { + + @Schema(title ="id") + private String id; + + @Schema(title ="卡号") + private String cardCode; + + @Schema(title ="会员姓名") + private String userName; + @Schema(title ="会员电话") + private String phone; + @Schema(title ="工号") + private String workNo; + @Schema(title ="本次扣费金额") + private BigDecimal spendMoney; + @Schema(title ="自定义扣费标记 1 是 ; 0 否") + private Integer isCustom; + @Schema(title ="恢复标记 1 已恢复; 0 否") + private Integer isRestore; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @Schema(title ="消费时间") + private Date payTime; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @Schema(title ="数据上传时间") + private Date createTime; + + @Schema(title ="食堂名称") + private String restName; + + @Schema(title ="餐次名称") + private String dinnerType; + + @Schema(title ="部门名称") + private String deptName; + +} diff --git a/jeecg-module-system/jeecg-system-api/jeecg-system-local-api/src/main/java/org/jeecg/payment/vo/StRecordNumVo.java b/jeecg-module-system/jeecg-system-api/jeecg-system-local-api/src/main/java/org/jeecg/payment/vo/StRecordNumVo.java new file mode 100644 index 0000000..10d4a9a --- /dev/null +++ b/jeecg-module-system/jeecg-system-api/jeecg-system-local-api/src/main/java/org/jeecg/payment/vo/StRecordNumVo.java @@ -0,0 +1,14 @@ +package org.jeecg.payment.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +public class StRecordNumVo { + + @Schema(description = "数量") + private Integer num; + + @Schema(description = "设备编码") + private String deviceCode; +} diff --git a/jeecg-module-system/jeecg-system-api/jeecg-system-local-api/src/main/java/org/jeecg/payment/vo/StRfidVo.java b/jeecg-module-system/jeecg-system-api/jeecg-system-local-api/src/main/java/org/jeecg/payment/vo/StRfidVo.java index 4802f19..84a8ea3 100644 --- a/jeecg-module-system/jeecg-system-api/jeecg-system-local-api/src/main/java/org/jeecg/payment/vo/StRfidVo.java +++ b/jeecg-module-system/jeecg-system-api/jeecg-system-local-api/src/main/java/org/jeecg/payment/vo/StRfidVo.java @@ -1,5 +1,6 @@ package org.jeecg.payment.vo; +import com.opencsv.bean.CsvBindByName; import lombok.Data; import javax.validation.constraints.NotEmpty; @@ -14,6 +15,7 @@ import java.math.BigDecimal; @Data public class StRfidVo { // @NotEmpty(message = "用户ID不能为空") + @CsvBindByName(column = "user_id") private String userId; @NotEmpty(message = "设备编码不能为空") private String deviceCode; @@ -22,25 +24,35 @@ public class StRfidVo { /** * 卡号 */ + @CsvBindByName(column = "card_code") private String cardCode; /** * 闸机记录的支付唯一id(用于判断防止重复支付的标记) */ + @CsvBindByName(column = "pay_id") private String payId; //===离线扣费场景参数 //消费时间(时间戳) + @CsvBindByName(column = "date_time") private String dateTime; //本次扣费金额(后端根据规则计算) + @CsvBindByName(column = "spend_money") private BigDecimal spendMoney; /** * 二次扣费标记 1 是; 0 否 */ + @CsvBindByName(column = "second_charge_flag") private Integer secondChargeFlag; /** * 自定义扣费标记 1 是 ; 0 否 */ + @CsvBindByName(column = "is_custom") private Integer isCustom; + /** + * 恢复标记 1 是; 0 否 + */ + private Integer isRestore; } diff --git a/jeecg-module-system/jeecg-system-api/jeecg-system-local-api/src/main/java/org/jeecg/system/vo/SwHeartbeatFaceVo.java b/jeecg-module-system/jeecg-system-api/jeecg-system-local-api/src/main/java/org/jeecg/system/vo/SwHeartbeatFaceVo.java new file mode 100644 index 0000000..7bd5350 --- /dev/null +++ b/jeecg-module-system/jeecg-system-api/jeecg-system-local-api/src/main/java/org/jeecg/system/vo/SwHeartbeatFaceVo.java @@ -0,0 +1,20 @@ +package org.jeecg.system.vo; + +import lombok.Data; +import org.jeecg.user.entity.StUserFaceimgSubIncremInfo; + +import java.util.List; + +@Data +public class SwHeartbeatFaceVo { + + /** + * 是否下发 + */ + private boolean isIssue; + + /** + * 人脸数据 + */ + private List faceList; +} diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/emp/mapper/xml/CqBaseEmployeeMapper.xml b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/emp/mapper/xml/CqBaseEmployeeMapper.xml index 7dc6e1f..e50c409 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/emp/mapper/xml/CqBaseEmployeeMapper.xml +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/emp/mapper/xml/CqBaseEmployeeMapper.xml @@ -521,6 +521,34 @@ limit 1 diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/equipment/controller/StEquipmentController.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/equipment/controller/StEquipmentController.java deleted file mode 100644 index 6e21167..0000000 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/equipment/controller/StEquipmentController.java +++ /dev/null @@ -1,24 +0,0 @@ -package org.jeecg.equipment.controller; - -import io.swagger.v3.oas.annotations.tags.Tag; -import lombok.extern.slf4j.Slf4j; -import org.jeecg.common.system.base.controller.JeecgController; -import org.jeecg.equipment.entity.StEquipment; -import org.jeecg.equipment.service.IStEquipmentService; -import org.springframework.web.bind.annotation.*; - - /** - * @Description: 设备管理表 - * @Author: jeecg-boot - * @Date: 2022-08-30 - * @Version: V1.0 - */ -@Tag(name="设备管理表") -@RestController -@RequestMapping("/equipment/stEquipment") -@Slf4j -public class StEquipmentController extends JeecgController { - - - -} diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/equipment/controller/StRestaurantEquipmentController.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/equipment/controller/StRestaurantEquipmentController.java index 0def169..33abd79 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/equipment/controller/StRestaurantEquipmentController.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/equipment/controller/StRestaurantEquipmentController.java @@ -1,18 +1,26 @@ package org.jeecg.equipment.controller; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.jeecg.common.api.vo.Result; import org.jeecg.common.aspect.annotation.AutoLog; -import org.jeecg.common.system.base.controller.JeecgController; +import org.jeecg.common.constant.CommonConstant; import org.jeecg.common.system.util.JwtUtil; +import org.jeecg.common.util.RedisUtil; +import org.jeecg.equipment.dto.StEquipmentDto; import org.jeecg.equipment.entity.StEquipment; +import org.jeecg.equipment.service.IStCanteenEquipmentService; import org.jeecg.equipment.service.IStEquipmentService; +import org.jeecg.payment.vo.StCanteenEquipmentVo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; import java.util.List; /** @@ -25,9 +33,13 @@ import java.util.List; @RestController @RequestMapping("/restaurant/equipment/stEquipment") @Slf4j -public class StRestaurantEquipmentController extends JeecgController { +public class StRestaurantEquipmentController { @Autowired private IStEquipmentService stEquipmentService; + @Resource + private IStCanteenEquipmentService stCanteenEquipmentService; + @Resource + private RedisUtil redisUtil; /** @@ -52,4 +64,65 @@ public class StRestaurantEquipmentController extends JeecgController> getEquipmentListByCanteenId(@RequestParam(name = "canteenId", required = true) String canteenId) { + if(StringUtils.isBlank(canteenId)){ + return Result.error("参数异常"); + } + List stEquipmentList = stEquipmentService.getEquipmentList(canteenId); + return Result.OK(stEquipmentList); + } + + /** + * 保存设备 + * @param dto 设备信息 + * @return 保存结果 + */ + @Operation(summary = "保存设备", description = "保存设备") + @PostMapping("/saveEquipment") + @AutoLog(value = "保存设备") + public Result saveEquipment(@RequestBody StEquipmentDto dto) { + if(StringUtils.isBlank(dto.getAppPackageLocalUrl())){ + return Result.error("设备编码不能为空"); + } + LambdaUpdateWrapper stEquipmentLambdaUpdateWrapper = new LambdaUpdateWrapper<>(); + stEquipmentLambdaUpdateWrapper + .eq(StEquipment::getAppPackageLocalUrl, dto.getAppPackageLocalUrl()) + .set(StEquipment::getPlacement, dto.getPlacement()) + .set(StEquipment::getRemark, dto.getRemark()); + stEquipmentService.update(stEquipmentLambdaUpdateWrapper); + return Result.OK("操作成功"); + } + + /** + * 设备管理列表 + * @param canteenId 食堂id + * @param appPackageLocalUrl 设备编码 + * @param pageNo 页码 + * @param pageSize 每页条数 + * @return 设备管理列表 + */ + @Operation(summary = "设备管理列表", description = "设备管理列表") + @GetMapping("/pageList") + @AutoLog(value = "设备管理列表") + public Result> pageList(@RequestParam(name = "canteenId",required = false) String canteenId, + @RequestParam(name = "appPackageLocalUrl",required = false) String appPackageLocalUrl, + @RequestParam(name = "pageNo",required = false,defaultValue = "1") Integer pageNo, + @RequestParam(name = "pageSize",required = false,defaultValue = "10") Integer pageSize){ + + return Result.OK(stCanteenEquipmentService.pageList(canteenId,appPackageLocalUrl,pageNo,pageSize)); + } + + @Operation(summary = "下发用户信息", description = "下发用户信息") + @GetMapping("/issueInformation") + @AutoLog(value = "下发用户信息") + public Result issueInformation(@RequestParam(name = "equipmentCode") String equipmentCode){ + redisUtil.hset(CommonConstant.ISSUE_INFORMATION,equipmentCode,"1"); + return Result.OK("命令发送成功"); + } } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/equipment/mapper/StCanteenEquipmentMapper.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/equipment/mapper/StCanteenEquipmentMapper.java new file mode 100644 index 0000000..be77be2 --- /dev/null +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/equipment/mapper/StCanteenEquipmentMapper.java @@ -0,0 +1,23 @@ +package org.jeecg.equipment.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; +import org.jeecg.equipment.entity.StCanteenEquipment; +import org.jeecg.payment.vo.StCanteenEquipmentVo; +import org.jeecg.payment.vo.StRecordNumVo; + +import java.util.List; + + +public interface StCanteenEquipmentMapper extends BaseMapper { + + + IPage pageList(@Param("page") Page page, @Param("canteenId") String canteenId,@Param("appPackageLocalUrl") String appPackageLocalUrl); + + List getNormalNum(@Param("list") List deviceCodes); + + List getAbnormalNum(@Param("list") List deviceCodes); + +} diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/equipment/mapper/StEquipmentMapper.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/equipment/mapper/StEquipmentMapper.java index 77679b7..ef86de5 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/equipment/mapper/StEquipmentMapper.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/equipment/mapper/StEquipmentMapper.java @@ -1,8 +1,11 @@ package org.jeecg.equipment.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Param; import org.jeecg.equipment.entity.StEquipment; +import java.util.List; + /** * @Description: 设备管理表 * @Author: jeecg-boot @@ -11,4 +14,5 @@ import org.jeecg.equipment.entity.StEquipment; */ public interface StEquipmentMapper extends BaseMapper { + List getEquipmentList(@Param("canteenId") String canteenId); } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/equipment/mapper/xml/StCanteenEquipmentMapper.xml b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/equipment/mapper/xml/StCanteenEquipmentMapper.xml new file mode 100644 index 0000000..05738e0 --- /dev/null +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/equipment/mapper/xml/StCanteenEquipmentMapper.xml @@ -0,0 +1,58 @@ + + + + + + + + \ No newline at end of file diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/equipment/mapper/xml/StEquipmentMapper.xml b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/equipment/mapper/xml/StEquipmentMapper.xml index 36a6c7b..65b77d0 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/equipment/mapper/xml/StEquipmentMapper.xml +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/equipment/mapper/xml/StEquipmentMapper.xml @@ -2,4 +2,13 @@ + \ No newline at end of file diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/equipment/service/IStCanteenEquipmentService.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/equipment/service/IStCanteenEquipmentService.java new file mode 100644 index 0000000..a5309ff --- /dev/null +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/equipment/service/IStCanteenEquipmentService.java @@ -0,0 +1,16 @@ +package org.jeecg.equipment.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; +import org.jeecg.equipment.entity.StCanteenEquipment; +import org.jeecg.equipment.entity.StEquipment; +import org.jeecg.payment.vo.StCanteenEquipmentVo; + +import java.util.List; + + +public interface IStCanteenEquipmentService extends IService { + + IPage pageList(String canteenId, String appPackageLocalUrl, Integer pageNo, Integer pageSize); + +} diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/equipment/service/IStEquipmentService.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/equipment/service/IStEquipmentService.java index 28735d9..00cdf4f 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/equipment/service/IStEquipmentService.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/equipment/service/IStEquipmentService.java @@ -3,6 +3,8 @@ package org.jeecg.equipment.service; import com.baomidou.mybatisplus.extension.service.IService; import org.jeecg.equipment.entity.StEquipment; +import java.util.List; + /** * @Description: 设备管理表 * @Author: jeecg-boot @@ -11,4 +13,5 @@ import org.jeecg.equipment.entity.StEquipment; */ public interface IStEquipmentService extends IService { + List getEquipmentList(String canteenId); } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/equipment/service/impl/StCanteenEquipmentServiceImpl.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/equipment/service/impl/StCanteenEquipmentServiceImpl.java new file mode 100644 index 0000000..d8c745a --- /dev/null +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/equipment/service/impl/StCanteenEquipmentServiceImpl.java @@ -0,0 +1,64 @@ +package org.jeecg.equipment.service.impl; + + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.apache.commons.collections4.CollectionUtils; +import org.jeecg.common.constant.CommonConstant; +import org.jeecg.common.util.RedisUtil; +import org.jeecg.equipment.entity.StCanteenEquipment; +import org.jeecg.equipment.mapper.StCanteenEquipmentMapper; +import org.jeecg.equipment.service.IStCanteenEquipmentService; +import org.jeecg.payment.vo.StCanteenEquipmentVo; +import org.jeecg.payment.vo.StRecordNumVo; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + + +@Service +public class StCanteenEquipmentServiceImpl extends ServiceImpl implements IStCanteenEquipmentService { + + @Resource + private RedisUtil redisUtil; + @Override + public IPage pageList(String canteenId,String appPackageLocalUrl,Integer pageNo,Integer pageSize){ + Page page = new Page<>(pageNo, pageSize); + IPage stCanteenEquipmentVoIPage = baseMapper.pageList(page, canteenId, appPackageLocalUrl); + if(CollectionUtils.isNotEmpty(stCanteenEquipmentVoIPage.getRecords())){ + List collect = stCanteenEquipmentVoIPage.getRecords().stream().map(StCanteenEquipmentVo::getEquipmentCode).collect(Collectors.toList()); + List normalNum = baseMapper.getNormalNum(collect); + List abnormalNum = baseMapper.getAbnormalNum(collect); + Map normalNumMap = normalNum.stream().collect(Collectors.toMap(StRecordNumVo::getDeviceCode, StRecordNumVo::getNum)); + Map abnormalNumMap = abnormalNum.stream().collect(Collectors.toMap(StRecordNumVo::getDeviceCode,StRecordNumVo::getNum)); + + Map hmget = redisUtil.hmget(CommonConstant.DEVICE_STATUS); + long oneMinuteMs = 2 * 60 * 1000; + stCanteenEquipmentVoIPage.getRecords().forEach(equipment ->{ + //设备上传数据量 + Integer a = normalNumMap.get(equipment.getEquipmentCode()) == null ? 0 : normalNumMap.get(equipment.getEquipmentCode()); + Integer b = abnormalNumMap.get(equipment.getEquipmentCode()) == null ? 0 : abnormalNumMap.get(equipment.getEquipmentCode()); + equipment.setTotalNum(a+b); + equipment.setStatus("离线"); + //设备状态 + Object o = hmget.get(equipment.getEquipmentCode()); + if(o != null){ + //对比设备心跳时间与当前时间, 如果时间差小于2分钟 , 视为在线 + long deviceTime = Long.parseLong((String) o); + long now = new Date().getTime(); + if(now - deviceTime > oneMinuteMs){ + equipment.setStatus("在线"); + } + } + }); + } + return stCanteenEquipmentVoIPage; + } + + +} diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/equipment/service/impl/StEquipmentServiceImpl.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/equipment/service/impl/StEquipmentServiceImpl.java index 39bdbd4..e599303 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/equipment/service/impl/StEquipmentServiceImpl.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/equipment/service/impl/StEquipmentServiceImpl.java @@ -1,5 +1,6 @@ package org.jeecg.equipment.service.impl; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import org.jeecg.equipment.entity.StEquipment; import org.jeecg.equipment.mapper.StEquipmentMapper; import org.jeecg.equipment.service.IStEquipmentService; @@ -7,6 +8,8 @@ import org.springframework.stereotype.Service; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import java.util.List; + /** * @Description: 设备管理表 * @Author: jeecg-boot @@ -16,4 +19,8 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @Service public class StEquipmentServiceImpl extends ServiceImpl implements IStEquipmentService { + @Override + public List getEquipmentList(String canteenId) { + return baseMapper.getEquipmentList(canteenId); + } } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/pay/controller/StPayController.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/pay/controller/StPayController.java index 648037f..200753b 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/pay/controller/StPayController.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/pay/controller/StPayController.java @@ -112,13 +112,89 @@ public class StPayController { @AutoLog(value = "获取用户类型,余额信息") public Result getUserBalanceList(@RequestParam(name = "pageNo", required = false) Integer pageNo, @RequestParam(name = "pageSize", required = false) Integer pageSize, - @RequestParam(name = "timestamp", required = false) Long timestamp){ + @RequestParam(name = "timestamp", required = false, defaultValue = "0") Long timestamp){ if(null == pageNo || pageSize == 0){ + log.error("getUserBalanceList 用户信息,分页调用全量数据"); return Result.OK(cqBaseEmployeeService.getUserBalanceList(timestamp)); }else { + log.error("getUserBalanceList 用户信息心跳 时间戳,timestamp={},date = {}", JSONObject.toJSONString(timestamp), DateUtil.format(new Date(timestamp), "yyyy-MM-dd HH:mm:ss")); return Result.OK(cqBaseEmployeeService.getUserBalanceList(pageNo, pageSize, timestamp)); } } + + + /** + * 离线人脸扣费v3 ,加自定义金额、卡号扣款 + * @param stRfidoffLineVo + * @return + */ + @Operation(summary = "离线人脸扣费v3", description = "离线人脸扣费v2") + @PostMapping(value = "/payUser/offline/v3") + @AutoLog(value = "离线人脸扣费v3") + public Result bindUserOfflineV3(@RequestBody StRfidoffLineVo stRfidoffLineVo) { + return iStClientMemberLevelDeductRuleService. + bindUserOfflineCardCode(stRfidoffLineVo,false); + } + + + /** + * 在线扣费 + * @return + */ + @Operation(summary = "在线扣费", description = "在线扣费") + @PostMapping(value = "/payUser/online") + @AutoLog(value = "在线扣费") + public Result bindUserOnline(@RequestBody StRfidVo stRfidVo) { + StRfidoffLineVo stRfidoffLineVo = new StRfidoffLineVo(); + stRfidoffLineVo.setDeviceCode(stRfidVo.getDeviceCode()); + stRfidoffLineVo.setVoList(Collections.singletonList(stRfidVo)); + stRfidoffLineVo.setRestId(stRfidVo.getRestId()); + return iStClientMemberLevelDeductRuleService.bindUserOfflineCardCode(stRfidoffLineVo,true); + } + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -243,35 +319,6 @@ public class StPayController { return Result.OK("扣费成功"); } - /** - * 离线人脸扣费v3 ,加自定义金额、卡号扣款 - * @param stRfidoffLineVo - * @return - */ - @Operation(summary = "离线人脸扣费v3", description = "离线人脸扣费v2") - @PostMapping(value = "/payUser/offline/v3") - @AutoLog(value = "离线人脸扣费v3") - public Result bindUserOfflineV3(@RequestBody StRfidoffLineVo stRfidoffLineVo) { - return iStClientMemberLevelDeductRuleService. - bindUserOfflineCardCode(stRfidoffLineVo); - } - - - /** - * 在线扣费 - * @return - */ - @Operation(summary = "在线扣费", description = "在线扣费") - @PostMapping(value = "/payUser/online") - @AutoLog(value = "在线扣费") - public Result bindUserOnline(@RequestBody StRfidVo stRfidVo) { - StRfidoffLineVo stRfidoffLineVo = new StRfidoffLineVo(); - stRfidoffLineVo.setDeviceCode(stRfidVo.getDeviceCode()); - stRfidoffLineVo.setVoList(Collections.singletonList(stRfidVo)); - stRfidoffLineVo.setRestId(stRfidVo.getRestId()); - return iStClientMemberLevelDeductRuleService.bindUserOfflineCardCode(stRfidoffLineVo); - } - /** diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/payment/controller/StBbzxOrderInfoController.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/payment/controller/StBbzxOrderInfoController.java index ed7c5b9..d8ccdb3 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/payment/controller/StBbzxOrderInfoController.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/payment/controller/StBbzxOrderInfoController.java @@ -344,6 +344,7 @@ public class StBbzxOrderInfoController { StClientMemberTransactionRecordVO stClientMemberTransactionRecordVO = new StClientMemberTransactionRecordVO();//只汇总交易金额 stClientMemberTransactionRecordVO.setSerialNo("总计"); stClientMemberTransactionRecordVO.setTransactionAmount(sumResult.getTransactionAmount()); + stClientMemberTransactionRecordVO.setAvailableBalance(sumResult.getAvailableBalance()); return Result.OK(stClientMemberTransactionRecordVO); } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/payment/controller/StClientMemberBalanceController.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/payment/controller/StClientMemberBalanceController.java index c1f006d..b9b492c 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/payment/controller/StClientMemberBalanceController.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/payment/controller/StClientMemberBalanceController.java @@ -512,6 +512,12 @@ public class StClientMemberBalanceController { query.setStartTime(split[0]); query.setEndTime(split[1]); } + if(StringUtils.isNotBlank(query.getStartDate())){ + query.setStartTime(query.getStartDate()); + } + if(StringUtils.isNotBlank(query.getEndDate())){ + query.setStartTime(query.getEndDate()); + } LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); //餐品总库只查询内置食堂 if(sysUser.getUserIdentity().equals(CommonConstant.USER_IDENTITY_0) || sysUser.getUserIdentity().equals(CommonConstant.USER_IDENTITY_1)){ diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/payment/controller/StConsumptionExceptionRecordController.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/payment/controller/StConsumptionExceptionRecordController.java new file mode 100644 index 0000000..f7ae258 --- /dev/null +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/payment/controller/StConsumptionExceptionRecordController.java @@ -0,0 +1,122 @@ +package org.jeecg.payment.controller; + +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.jeecg.common.api.vo.Result; +import org.jeecg.common.aspect.annotation.AutoLog; +import org.jeecg.payment.dto.StExceptionRecordDTO; +import org.jeecg.payment.entity.StConsumptionExceptionRecord; +import org.jeecg.payment.service.IStClientMemberLevelDeductRuleService; +import org.jeecg.payment.service.IStConsumptionExceptionRecordService; +import org.jeecg.payment.utils.ExcelUtils; +import org.jeecg.payment.vo.*; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.util.Collections; +import java.util.List; + +@RestController +@RequestMapping("/payment/exceptionRecord") +@Tag(name = "消费异常流水") +public class StConsumptionExceptionRecordController { + + @Resource + private IStConsumptionExceptionRecordService stConsumptionExceptionRecordService; + + @Resource + private IStClientMemberLevelDeductRuleService iStClientMemberLevelDeductRuleService; + + @RequestMapping("/restore") + @Tag(name = "恢复") + @AutoLog(value = "恢复") + public Result restore(String id) { + StConsumptionExceptionRecord record = stConsumptionExceptionRecordService.getById(id); + StRfidVo stRfidVo = new StRfidVo(); + stRfidVo.setUserId(record.getUserId()); + stRfidVo.setDeviceCode(record.getDeviceCode()); + stRfidVo.setRestId(record.getCanteenId()); + stRfidVo.setCardCode(record.getCardCode()); + stRfidVo.setPayId(record.getPayId()); + stRfidVo.setDateTime(record.getDateTime()); + stRfidVo.setSpendMoney(record.getSpendMoney()); + stRfidVo.setSecondChargeFlag(record.getSecondChargeFlag()); + stRfidVo.setIsCustom(record.getIsCustom()); + stRfidVo.setIsRestore(1); + StRfidoffLineVo stRfidoffLineVo = new StRfidoffLineVo(); + stRfidoffLineVo.setDeviceCode(stRfidVo.getDeviceCode()); + stRfidoffLineVo.setVoList(Collections.singletonList(stRfidVo)); + stRfidoffLineVo.setRestId(stRfidVo.getRestId()); + //防止循环调用, 写在Controller层 + //走扣费逻辑 + Result result = iStClientMemberLevelDeductRuleService.bindUserOfflineCardCode(stRfidoffLineVo,true); + if (result.isSuccess()) { + //更新恢复状态 + stConsumptionExceptionRecordService.update(new LambdaUpdateWrapper() + .set(StConsumptionExceptionRecord::getIsRestore, 1) + .eq(StConsumptionExceptionRecord::getId, id)); + } + return result; + } + + @PostMapping("/pageList") + @Tag(name = "异常流水列表") + @AutoLog(value = "异常流水列表") + public Result> pageList(@RequestBody StExceptionRecordDTO query){ + return Result.OK(stConsumptionExceptionRecordService.exceptionRecordPage(query)); + } + + @GetMapping("/export") + @AutoLog(value = "异常流水列表导出") + public void getSpendingOrRechargeInfoListExport(HttpServletResponse response, + @RequestParam(name = "startDate", required = false) String startDate, + @RequestParam(name = "endDate", required = false) String endDate) { + StExceptionRecordDTO query = new StExceptionRecordDTO(); + if(StringUtils.isNotBlank(startDate)){ + query.setStartTime(startDate); + } + if(StringUtils.isNotBlank(startDate)){ + query.setEndTime(endDate); + } + + List stExceptionRecordVos = stConsumptionExceptionRecordService.exceptionRecordPageExport(query); + if(CollectionUtils.isNotEmpty(stExceptionRecordVos)){ + String exportFields = "userName|姓名,phone|手机号,workNo|工号,cardCode|卡号,spendMoney|本次扣费金额,payTime|消费时间,createTime|创建时间"; + ExcelUtils.export(response, "异常消费流水", stExceptionRecordVos, exportFields, "yyyy-MM-dd HH:mm",true); + } + } + + + /** + * 导入消费记录: 针对刷脸机设备出现问题时,从刷脸机导出数据,然后通过导入消费记录,重新计算用户余额 + * @param file 文件 + * @param canteenId 所属食堂 + * @param deviceCode 设备编码 + */ + @AutoLog(value = "导入消费记录 刷脸机设备出现问题时 ") + @PostMapping("/importRechargeData") + public Result importRechargeData(@RequestParam(name ="file", required = true) MultipartFile file, + @RequestParam(name = "deviceCode") String deviceCode, + @RequestParam(name = "canteenId") String canteenId) { + + try { + List stRfidVos = stConsumptionExceptionRecordService.parse(file, deviceCode, canteenId); + StRfidoffLineVo stRfidoffLineVo = new StRfidoffLineVo(); + stRfidoffLineVo.setDeviceCode(deviceCode); + stRfidoffLineVo.setVoList(stRfidVos); + stRfidoffLineVo.setRestId(canteenId); + //离线扣费 + Result result = iStClientMemberLevelDeductRuleService.bindUserOfflineCardCode(stRfidoffLineVo,false); + return result; + } catch (Exception e) { + // 异常处理 + return Result.error("导入异常"); + } + } + +} diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/payment/mapper/StConsumptionExceptionRecordMapper.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/payment/mapper/StConsumptionExceptionRecordMapper.java new file mode 100644 index 0000000..a6be331 --- /dev/null +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/payment/mapper/StConsumptionExceptionRecordMapper.java @@ -0,0 +1,18 @@ +package org.jeecg.payment.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; +import org.jeecg.payment.dto.StExceptionRecordDTO; +import org.jeecg.payment.entity.StConsumptionExceptionRecord; +import org.jeecg.payment.vo.StExceptionRecordVo; + +import java.util.List; + + +public interface StConsumptionExceptionRecordMapper extends BaseMapper { + + IPage exceptionRecordPage(@Param("page") Page page, @Param("query") StExceptionRecordDTO query); + List exceptionRecordPage(@Param("query") StExceptionRecordDTO query); +} diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/payment/mapper/xml/StClientMemberTransactionRecordMapper.xml b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/payment/mapper/xml/StClientMemberTransactionRecordMapper.xml index 5a4208b..b967d23 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/payment/mapper/xml/StClientMemberTransactionRecordMapper.xml +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/payment/mapper/xml/StClientMemberTransactionRecordMapper.xml @@ -120,6 +120,9 @@ and a.canteen_id = #{vo.canteenId} + + and sboi.dinner_type = #{vo.dinnerType} + and pay.depart_ids in diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/payment/mapper/xml/StConsumptionExceptionRecordMapper.xml b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/payment/mapper/xml/StConsumptionExceptionRecordMapper.xml new file mode 100644 index 0000000..0fb0e45 --- /dev/null +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/payment/mapper/xml/StConsumptionExceptionRecordMapper.xml @@ -0,0 +1,53 @@ + + + + + + diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/payment/service/IStClientMemberLevelDeductRuleService.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/payment/service/IStClientMemberLevelDeductRuleService.java index f227428..52c0844 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/payment/service/IStClientMemberLevelDeductRuleService.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/payment/service/IStClientMemberLevelDeductRuleService.java @@ -44,8 +44,13 @@ public interface IStClientMemberLevelDeductRuleService extends JeecgService bindUserOfflineCardCode(@RequestBody StRfidoffLineVo stRfidoffLineVo); + /** + * + * @param stRfidoffLineVo + * @param onlineStatus true 在线扣费 false 离线扣费 + * @return + */ + Result bindUserOfflineCardCode(@RequestBody StRfidoffLineVo stRfidoffLineVo,boolean onlineStatus); /** diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/payment/service/IStConsumptionExceptionRecordService.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/payment/service/IStConsumptionExceptionRecordService.java new file mode 100644 index 0000000..92a2f83 --- /dev/null +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/payment/service/IStConsumptionExceptionRecordService.java @@ -0,0 +1,24 @@ +package org.jeecg.payment.service; + + + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; +import org.jeecg.payment.dto.StExceptionRecordDTO; +import org.jeecg.payment.entity.StConsumptionExceptionRecord; +import org.jeecg.payment.vo.StExceptionRecordVo; +import org.jeecg.payment.vo.StRfidVo; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.util.List; + + +public interface IStConsumptionExceptionRecordService extends IService { + + IPage exceptionRecordPage(StExceptionRecordDTO query); + + List exceptionRecordPageExport(StExceptionRecordDTO query); + + List parse(MultipartFile file, String defaultDeviceCode, String defaultRestId) throws IOException; +} diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/payment/service/impl/StBbzxOrderInfoServiceImpl.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/payment/service/impl/StBbzxOrderInfoServiceImpl.java index e6cef60..e1fc975 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/payment/service/impl/StBbzxOrderInfoServiceImpl.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/payment/service/impl/StBbzxOrderInfoServiceImpl.java @@ -775,6 +775,7 @@ public class StBbzxOrderInfoServiceImpl extends JeecgServiceImpl processUserMealDataSimplified(List dataList) { + //非二次扣费, 只保留一条正常扣费, 剩下的数据添加到消费异常记录表中 + public List processUserMealDataSimplified(List dataList,String restId) { if (dataList == null || dataList.isEmpty()) { return new ArrayList<>(); } - String restId = dataList.get(0).getRestId(); + List dinnerTimeList = stBaseDinnerTimeService.list(new LambdaQueryWrapper() .eq(SlBaseDinnerTime::getRestId, restId) .orderByAsc(SlBaseDinnerTime::getEndTime)); - + //异常数据 + List unselectedData = new ArrayList<>(); // 按用户ID、日期、餐次分组,然后处理每组数据 - return dataList.stream() + List collect = dataList.stream() .collect(Collectors.groupingBy(vo -> - vo.getUserId() + "_" + DateUtils.formatDate(new Date(Long.parseLong(vo.getDateTime())), "yyyy-MM-dd") + "_" + getDinnerType(dinnerTimeList,vo.getDateTime()))) + vo.getUserId() + "_" + DateUtils.formatDate(new Date(Long.parseLong(vo.getDateTime())), "yyyy-MM-dd") + "_" + getDinnerType(dinnerTimeList, vo.getDateTime()))) .values() .stream() .flatMap(group -> { @@ -331,12 +335,46 @@ public class StClientMemberLevelDeductRuleServiceImpl extends JeecgServiceImpl compareByDateTime(vo1.getDateTime(), vo2.getDateTime())) .orElse(nonSecondCharge.get(0)); resultGroup.add(stRfidVo); + + List remaining = nonSecondCharge.stream() + .filter(vo -> !vo.equals(stRfidVo)) + .collect(Collectors.toList()); + unselectedData.addAll(remaining); } resultGroup.addAll(secondCharge); return resultGroup.stream(); }) .collect(Collectors.toList()); + + //保存异常消费数据 + if(CollectionUtils.isNotEmpty(unselectedData)){ + saveExceptionRecord(unselectedData); + } + return collect; + } + + //保存异常消费数据 + private void saveExceptionRecord(List unselectedData){ + List unselectedEntities = unselectedData.stream() + .map(vo -> { + StConsumptionExceptionRecord entity = new StConsumptionExceptionRecord(); + entity.setUserId(vo.getUserId()); + entity.setDeviceCode(vo.getDeviceCode()); + entity.setCanteenId(vo.getRestId()); + entity.setCardCode(vo.getCardCode()); + entity.setPayId(vo.getPayId()); + entity.setDateTime(vo.getDateTime()); + entity.setSpendMoney(vo.getSpendMoney()); + entity.setSecondChargeFlag(vo.getSecondChargeFlag()); + entity.setIsCustom(vo.getIsCustom()); + entity.setPayTime(new Date(Long.parseLong(vo.getDateTime()))); + entity.setCreateTime(new Date()); + entity.setUpdateTime(new Date()); + return entity; + }) + .collect(Collectors.toList()); + stConsumptionExceptionRecordService.saveBatch(unselectedEntities); } /** @@ -369,7 +407,7 @@ public class StClientMemberLevelDeductRuleServiceImpl extends JeecgServiceImpl bindUserOfflineCardCode(StRfidoffLineVo stRfidoffLineVo) { + public Result bindUserOfflineCardCode(StRfidoffLineVo stRfidoffLineVo,boolean onlineStatus) { String deviceCode = stRfidoffLineVo.getDeviceCode(); String restId = stRfidoffLineVo.getRestId(); List voListAll = stRfidoffLineVo.getVoList(); @@ -379,7 +417,7 @@ public class StClientMemberLevelDeductRuleServiceImpl extends JeecgServiceImpl> userListMaps = voListAll.stream().collect(Collectors.groupingBy(StRfidVo::getUserId)); for (Map.Entry> userListMap : userListMaps.entrySet()) { @@ -400,7 +438,7 @@ public class StClientMemberLevelDeductRuleServiceImpl extends JeecgServiceImpl 1){//离线扣费 + if(!onlineStatus){//离线扣费 //加异步处理 List finalVoListAll = value; CompletableFuture.runAsync(() -> { @@ -443,11 +481,20 @@ public class StClientMemberLevelDeductRuleServiceImpl extends JeecgServiceImpl> stringListMap = groupByMeal(voListAll, restId); StMiniMineBalanceVo stMiniMineBalanceVoOnline = new StMiniMineBalanceVo(); + List unselectedData = new ArrayList<>(); + for (Map.Entry> entry : stringListMap.entrySet()) { List voList = entry.getValue(); - + //数据排序: 防止 离线数据 一次正常扣费, 多次二次扣费, 导致数据添加有问题 + voList.sort((o1, o2) -> + Long.compare( + Long.parseLong(o1.getDateTime()), + Long.parseLong(o2.getDateTime()) + ) + ); for (StRfidVo stRfidVo : voList) { // 改用普通for循环,方便控制流程 //判断用户本餐是否已经有数据 + System.out.println("二次扣费标记" + stRfidVo.getSecondChargeFlag()); if(stRfidVo.getSecondChargeFlag() == null || stRfidVo.getSecondChargeFlag() == 0){ long count = iStBbzxOrderInfoService.count(new LambdaQueryWrapper() .eq(StBbzxOrderInfo::getMemberId, stRfidVo.getUserId()) @@ -457,8 +504,12 @@ public class StClientMemberLevelDeductRuleServiceImpl extends JeecgServiceImpl 0){ - errorMessages = "用户本餐已扣费"; - continue; + if(stRfidVo.getIsRestore() == null){ + unselectedData.add(stRfidVo); + errorMessages = "用户本餐已扣费"; + System.out.println("用户本餐已扣费"); + continue; + } } } stRfidVo.setDeviceCode(deviceCode); @@ -486,6 +537,7 @@ public class StClientMemberLevelDeductRuleServiceImpl extends JeecgServiceImpl implements IStConsumptionExceptionRecordService { + + @Resource + private ISysPayDepartService iSysPayDepartService; + + private static final Validator validator = Validation.buildDefaultValidatorFactory().getValidator(); + + @Override + public IPage exceptionRecordPage(StExceptionRecordDTO query){ + //处理时间 + if(CollectionUtils.isNotEmpty(query.getDates())){ + query.setStartTime(query.getDates().get(0)); + query.setEndTime(query.getDates().get(1)); + } + if(StringUtils.isNotBlank(query.getDepartId())){ + List allCascadeDeptIds = iSysPayDepartService.getAllCascadeDeptIds(query.getDepartId()); + if(org.apache.commons.collections4.CollectionUtils.isNotEmpty(allCascadeDeptIds)){ + query.setList(allCascadeDeptIds); + } + } + Page page = new Page<>(query.getPageNo(), query.getPageSize()); + return baseMapper.exceptionRecordPage(page, query); + } + + @Override + public List exceptionRecordPageExport(StExceptionRecordDTO query){ + //处理时间 + if(CollectionUtils.isNotEmpty(query.getDates())){ + query.setStartTime(query.getDates().get(0)); + query.setEndTime(query.getDates().get(1)); + } + if(StringUtils.isNotBlank(query.getDepartId())){ + List allCascadeDeptIds = iSysPayDepartService.getAllCascadeDeptIds(query.getDepartId()); + if(org.apache.commons.collections4.CollectionUtils.isNotEmpty(allCascadeDeptIds)){ + query.setList(allCascadeDeptIds); + } + } + return baseMapper.exceptionRecordPage(query); + } + + + /** + * 解析CSV文件到StRfidVo列表 + * @param file 上传的CSV文件 + * @param defaultDeviceCode 默认设备编码(必填字段) + * @param defaultRestId 默认食堂ID(必填字段) + * @return 解析后的对象列表 + * @throws IOException 文件读取异常 + */ + @Override + public List parse(MultipartFile file, String defaultDeviceCode, String defaultRestId) throws IOException { + // 检查文件类型 + if (!file.getOriginalFilename().endsWith(".csv")) { + throw new IllegalArgumentException("仅支持CSV文件"); + } + + try (BufferedReader reader = new BufferedReader( + new InputStreamReader(file.getInputStream(), StandardCharsets.UTF_8))) { + + // 使用自定义映射策略 + HeaderColumnNameMappingStrategy strategy = new HeaderColumnNameMappingStrategy<>(); + strategy.setType(StRfidVo.class); + + // 解析CSV + CsvToBean csvToBean = new CsvToBeanBuilder(reader) + .withMappingStrategy(strategy) + .withIgnoreLeadingWhiteSpace(true) + .withIgnoreEmptyLine(true) + .build(); + + List result = new ArrayList<>(); + + // 逐行处理并验证 + csvToBean.forEach(vo -> { + // 设置必填字段 + vo.setDeviceCode(defaultDeviceCode); + if (vo.getRestId() == null) { + vo.setRestId(defaultRestId); + } + + // 验证对象 + validateStRfidVo(vo); + + result.add(vo); + }); + + return result; + } + } + + + private static void validateStRfidVo(StRfidVo vo) { + Set> violations = validator.validate(vo); + if (!violations.isEmpty()) { + String errorMsg = violations.stream() + .map(v -> v.getPropertyPath() + " " + v.getMessage()) + .collect(Collectors.joining(", ")); + throw new IllegalArgumentException("数据验证失败: " + errorMsg); + } + } +} diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/restaurant/controller/StBaseRestaurantDeptController.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/restaurant/controller/StBaseRestaurantDeptController.java index bd44fec..0ea0f3c 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/restaurant/controller/StBaseRestaurantDeptController.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/restaurant/controller/StBaseRestaurantDeptController.java @@ -55,5 +55,23 @@ public class StBaseRestaurantDeptController { } } + @Operation(summary = "获得食堂数据", description= "获得食堂数据") + @GetMapping(value = "/getAllRestaurantList") + public Result getAllRestaurantList() { + List screenVoArrayList = new ArrayList<>(); + List slBaseRestaurantList = slBaseRestaurantService.list(); + if(CollectionUtils.isNotEmpty(slBaseRestaurantList)){ + slBaseRestaurantList.forEach(slBaseRestaurant -> { + if(!"0".equals(slBaseRestaurant.getId())){ + ScreenVo screenVo = new ScreenVo(); + screenVo.setId(slBaseRestaurant.getId()); + screenVo.setRestName(slBaseRestaurant.getRestName()); + screenVoArrayList.add(screenVo); + } + }); + } + return Result.OK(screenVoArrayList); + + } } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/system/controller/SwUserFaceimgSubController.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/system/controller/SwUserFaceimgSubController.java index e7af6e8..9313c26 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/system/controller/SwUserFaceimgSubController.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/system/controller/SwUserFaceimgSubController.java @@ -9,10 +9,15 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.jeecg.common.api.vo.Result; import org.jeecg.common.aspect.annotation.AutoLog; +import org.jeecg.common.constant.CommonConstant; import org.jeecg.common.system.base.controller.JeecgController; import org.jeecg.common.util.DateUtils; +import org.jeecg.common.util.RedisUtil; +import org.jeecg.equipment.entity.StCanteenEquipment; +import org.jeecg.equipment.service.IStCanteenEquipmentService; import org.jeecg.system.service.IStUserFaceimgSubIncremInfoService; import org.jeecg.system.service.ISwUserFaceimgSubService; +import org.jeecg.system.vo.SwHeartbeatFaceVo; import org.jeecg.user.entity.StUserFaceimgSubIncremInfo; import org.jeecg.user.entity.SwUserFaceimgSub; import org.springframework.beans.factory.annotation.Autowired; @@ -42,6 +47,10 @@ public class SwUserFaceimgSubController extends JeecgController */ @Operation(summary = "扣费闸机心跳", description = "扣费闸机心跳") @GetMapping("/heartbeat/interface") @AutoLog(value = "扣费闸机心跳") public Result heartbeatInterface(@RequestParam(name = "restId", required = false) String restId, @RequestParam(name = "qrcodeId", required = false) String qrcodeId, - @RequestParam(name = "timeDate", required = false) String timeDate) { + @RequestParam(name = "timeDate", required = false) String timeDate, + @RequestParam(name = "faceNum", required = false) Integer faceNum, + @RequestParam(name = "availableMemory", required = false) String availableMemory, + @RequestParam(name = "ip", required = false) String ip) { + SwHeartbeatFaceVo vo = new SwHeartbeatFaceVo(); + vo.setIssue(false); + Object hget = redisUtil.hget(CommonConstant.ISSUE_INFORMATION, qrcodeId); + if(hget != null){ + vo.setIssue(true); + //删除下发指令标记 + redisUtil.hdel(CommonConstant.ISSUE_INFORMATION, qrcodeId); + } if(StringUtils.isNotBlank(timeDate)){ LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); Date date = new Date(Long.parseLong(timeDate)); @@ -81,9 +113,21 @@ public class SwUserFaceimgSubController extends JeecgController list = iStUserFaceimgSubIncremInfoService.list(lambdaQueryWrapper); - return Result.OK(list); + + // 保存食堂设备关联表 + StCanteenEquipment stCanteenEquipment = new StCanteenEquipment(); + stCanteenEquipment.setEquipmentCode(qrcodeId); + stCanteenEquipment.setCanteenId(restId); + stCanteenEquipment.setEquipmentIp(ip); + stCanteenEquipment.setFaceNum(faceNum); + stCanteenEquipment.setAvailableMemory(availableMemory); + stCanteenEquipmentService.saveOrUpdate(stCanteenEquipment); + redisUtil.hset(CommonConstant.DEVICE_STATUS, qrcodeId, timeDate); + + vo.setFaceList(list); + return Result.OK(vo); } - return Result.OK(Collections.emptyList()); + return Result.OK(vo); } }