From fb0cbea2dcfd21ed44600c6706cf2bf84ca2440d Mon Sep 17 00:00:00 2001 From: dashixiong Date: Tue, 10 Feb 2026 14:56:16 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fuint/common/dto/RaffleDto.java | 218 +++++++++ .../com/fuint/common/dto/RaffleItemDto.java | 187 ++++++++ .../com/fuint/common/dto/RaffleTypeDto.java | 40 ++ .../java/com/fuint/common/dto/TaskDto.java | 64 +++ .../com/fuint/common/enums/PrizeTypeEnum.java | 36 ++ .../fuint/common/enums/RaffleTypeEnum.java | 39 ++ .../com/fuint/common/param/RaffleParam.java | 20 + .../fuint/common/param/RaffleTypePage.java | 31 ++ .../java/com/fuint/common/param/TaskPage.java | 30 ++ .../com/fuint/common/service/GrowService.java | 26 + .../fuint/common/service/RaffleService.java | 108 +++++ .../common/service/RaffleTypeService.java | 28 ++ .../com/fuint/common/service/TaskService.java | 59 +++ .../common/service/impl/GrowServiceImpl.java | 137 ++++++ .../service/impl/RaffleServiceImpl.java | 436 +++++++++++++++++ .../service/impl/RaffleTypeServiceImpl.java | 156 ++++++ .../common/service/impl/TaskServiceImpl.java | 435 +++++++++++++++++ .../controller/BackendRaffleController.java | 315 +++++++++++++ .../BackendRaffleTypeController.java | 145 ++++++ .../controller/BackendTaskController.java | 128 +++++ .../controller/ClientGrowController.java | 162 +++++++ .../controller/ClientRaffleController.java | 446 ++++++++++++++++++ .../ClientRaffleTypeController.java | 65 +++ .../controller/ClientTaskController.java | 113 +++++ .../com/fuint/module/schedule/GrowJob.java | 52 ++ .../fuint/repository/mapper/MtGrowMapper.java | 20 + .../repository/mapper/MtRaffleItemMapper.java | 23 + .../repository/mapper/MtRaffleMapper.java | 25 + .../repository/mapper/MtRaffleTypeMapper.java | 15 + .../fuint/repository/mapper/MtTaskMapper.java | 12 + .../repository/mapper/MtTaskRecordMapper.java | 24 + .../com/fuint/repository/model/MtGrow.java | 61 +++ .../com/fuint/repository/model/MtRaffle.java | 94 ++++ .../fuint/repository/model/MtRaffleItem.java | 78 +++ .../fuint/repository/model/MtRaffleType.java | 56 +++ .../com/fuint/repository/model/MtTask.java | 70 +++ .../fuint/repository/model/MtTaskRecord.java | 67 +++ .../main/resources/mapper/MtGrowMapper.xml | 5 + .../resources/mapper/MtRaffleItemMapper.xml | 11 + .../main/resources/mapper/MtRaffleMapper.xml | 5 + .../main/java/com/fuint/utils/AESUtil.java | 135 ++++++ .../opensdk/service/PrintService.java | 205 ++++++++ .../xpyun/platform/opensdk/util/Config.java | 46 ++ .../platform/opensdk/util/HashSignUtil.java | 49 ++ .../platform/opensdk/util/HttpClientUtil.java | 274 +++++++++++ .../platform/opensdk/util/NoteFormatter.java | 278 +++++++++++ .../opensdk/vo/AddPrinterRequest.java | 24 + .../opensdk/vo/AddPrinterRequestItem.java | 35 ++ .../opensdk/vo/DelPrinterRequest.java | 23 + .../opensdk/vo/ObjectRestResponse.java | 95 ++++ .../opensdk/vo/OrderStatisResult.java | 36 ++ .../platform/opensdk/vo/OrderStatusType.java | 43 ++ .../platform/opensdk/vo/PrintRequest.java | 124 +++++ .../platform/opensdk/vo/PrinterRequest.java | 23 + .../platform/opensdk/vo/PrinterResult.java | 57 +++ .../opensdk/vo/PrinterStatusType.java | 43 ++ .../platform/opensdk/vo/PrintersRequest.java | 24 + .../opensdk/vo/QueryOrderStateRequest.java | 23 + .../opensdk/vo/QueryOrderStatisRequest.java | 35 ++ .../platform/opensdk/vo/RestRequest.java | 59 +++ .../opensdk/vo/SetVoiceTypeRequest.java | 37 ++ .../opensdk/vo/UpdPrinterRequest.java | 60 +++ .../platform/opensdk/vo/VoiceRequest.java | 61 +++ 63 files changed, 5831 insertions(+) create mode 100644 fuint-application/src/main/java/com/fuint/common/dto/RaffleDto.java create mode 100644 fuint-application/src/main/java/com/fuint/common/dto/RaffleItemDto.java create mode 100644 fuint-application/src/main/java/com/fuint/common/dto/RaffleTypeDto.java create mode 100644 fuint-application/src/main/java/com/fuint/common/dto/TaskDto.java create mode 100644 fuint-application/src/main/java/com/fuint/common/enums/PrizeTypeEnum.java create mode 100644 fuint-application/src/main/java/com/fuint/common/enums/RaffleTypeEnum.java create mode 100644 fuint-application/src/main/java/com/fuint/common/param/RaffleParam.java create mode 100644 fuint-application/src/main/java/com/fuint/common/param/RaffleTypePage.java create mode 100644 fuint-application/src/main/java/com/fuint/common/param/TaskPage.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/GrowService.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/RaffleService.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/RaffleTypeService.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/TaskService.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/impl/GrowServiceImpl.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/impl/RaffleServiceImpl.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/impl/RaffleTypeServiceImpl.java create mode 100644 fuint-application/src/main/java/com/fuint/common/service/impl/TaskServiceImpl.java create mode 100644 fuint-application/src/main/java/com/fuint/module/backendApi/controller/BackendRaffleController.java create mode 100644 fuint-application/src/main/java/com/fuint/module/backendApi/controller/BackendRaffleTypeController.java create mode 100644 fuint-application/src/main/java/com/fuint/module/backendApi/controller/BackendTaskController.java create mode 100644 fuint-application/src/main/java/com/fuint/module/clientApi/controller/ClientGrowController.java create mode 100644 fuint-application/src/main/java/com/fuint/module/clientApi/controller/ClientRaffleController.java create mode 100644 fuint-application/src/main/java/com/fuint/module/clientApi/controller/ClientRaffleTypeController.java create mode 100644 fuint-application/src/main/java/com/fuint/module/clientApi/controller/ClientTaskController.java create mode 100644 fuint-application/src/main/java/com/fuint/module/schedule/GrowJob.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/mapper/MtGrowMapper.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/mapper/MtRaffleItemMapper.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/mapper/MtRaffleMapper.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/mapper/MtRaffleTypeMapper.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/mapper/MtTaskMapper.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/mapper/MtTaskRecordMapper.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/model/MtGrow.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/model/MtRaffle.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/model/MtRaffleItem.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/model/MtRaffleType.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/model/MtTask.java create mode 100644 fuint-repository/src/main/java/com/fuint/repository/model/MtTaskRecord.java create mode 100644 fuint-repository/src/main/resources/mapper/MtGrowMapper.xml create mode 100644 fuint-repository/src/main/resources/mapper/MtRaffleItemMapper.xml create mode 100644 fuint-repository/src/main/resources/mapper/MtRaffleMapper.xml create mode 100644 fuint-utils/src/main/java/com/fuint/utils/AESUtil.java create mode 100644 fuint-utils/src/main/java/net/xpyun/platform/opensdk/service/PrintService.java create mode 100644 fuint-utils/src/main/java/net/xpyun/platform/opensdk/util/Config.java create mode 100644 fuint-utils/src/main/java/net/xpyun/platform/opensdk/util/HashSignUtil.java create mode 100644 fuint-utils/src/main/java/net/xpyun/platform/opensdk/util/HttpClientUtil.java create mode 100644 fuint-utils/src/main/java/net/xpyun/platform/opensdk/util/NoteFormatter.java create mode 100644 fuint-utils/src/main/java/net/xpyun/platform/opensdk/vo/AddPrinterRequest.java create mode 100644 fuint-utils/src/main/java/net/xpyun/platform/opensdk/vo/AddPrinterRequestItem.java create mode 100644 fuint-utils/src/main/java/net/xpyun/platform/opensdk/vo/DelPrinterRequest.java create mode 100644 fuint-utils/src/main/java/net/xpyun/platform/opensdk/vo/ObjectRestResponse.java create mode 100644 fuint-utils/src/main/java/net/xpyun/platform/opensdk/vo/OrderStatisResult.java create mode 100644 fuint-utils/src/main/java/net/xpyun/platform/opensdk/vo/OrderStatusType.java create mode 100644 fuint-utils/src/main/java/net/xpyun/platform/opensdk/vo/PrintRequest.java create mode 100644 fuint-utils/src/main/java/net/xpyun/platform/opensdk/vo/PrinterRequest.java create mode 100644 fuint-utils/src/main/java/net/xpyun/platform/opensdk/vo/PrinterResult.java create mode 100644 fuint-utils/src/main/java/net/xpyun/platform/opensdk/vo/PrinterStatusType.java create mode 100644 fuint-utils/src/main/java/net/xpyun/platform/opensdk/vo/PrintersRequest.java create mode 100644 fuint-utils/src/main/java/net/xpyun/platform/opensdk/vo/QueryOrderStateRequest.java create mode 100644 fuint-utils/src/main/java/net/xpyun/platform/opensdk/vo/QueryOrderStatisRequest.java create mode 100644 fuint-utils/src/main/java/net/xpyun/platform/opensdk/vo/RestRequest.java create mode 100644 fuint-utils/src/main/java/net/xpyun/platform/opensdk/vo/SetVoiceTypeRequest.java create mode 100644 fuint-utils/src/main/java/net/xpyun/platform/opensdk/vo/UpdPrinterRequest.java create mode 100644 fuint-utils/src/main/java/net/xpyun/platform/opensdk/vo/VoiceRequest.java diff --git a/fuint-application/src/main/java/com/fuint/common/dto/RaffleDto.java b/fuint-application/src/main/java/com/fuint/common/dto/RaffleDto.java new file mode 100644 index 0000000..cee7e09 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/dto/RaffleDto.java @@ -0,0 +1,218 @@ +package com.fuint.common.dto; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.fuint.repository.model.MtUser; +import io.swagger.annotations.ApiModelProperty; + +import java.io.Serializable; +import java.util.Date; + +/** + * 积分记录实体类 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public class RaffleDto implements Serializable { + + + private Integer id; + + private String title; + + private String brief; + + private String hot; + + private String image; + private String raffleType; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getBrief() { + return brief; + } + + public void setBrief(String brief) { + this.brief = brief; + } + + public String getHot() { + return hot; + } + + public void setHot(String hot) { + this.hot = hot; + } + + public String getImage() { + return image; + } + + public void setImage(String image) { + this.image = image; + } + + public String getRaffleType() { + return raffleType; + } + + public void setRaffleType(String raffleType) { + this.raffleType = raffleType; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public Integer getClick() { + return click; + } + + public void setClick(Integer click) { + this.click = click; + } + + public Integer getSort() { + return sort; + } + + public void setSort(Integer sort) { + this.sort = sort; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getOperator() { + return operator; + } + + public void setOperator(String operator) { + this.operator = operator; + } + + private String description; + + private Integer click; + + private Integer sort; + + private Date createTime; + + private Date updateTime; + + private String status; + + private String operator; + + private Integer nowCnt; + + private Integer allCnt; + + private Integer rafflePoint; + + public Integer getRafflePoint() { + return rafflePoint; + } + + public void setRafflePoint(Integer rafflePoint) { + this.rafflePoint = rafflePoint; + } + + public Integer getNowCnt() { + return nowCnt; + } + + public void setNowCnt(Integer nowCnt) { + this.nowCnt = nowCnt; + } + + public Integer getAllCnt() { + return allCnt; + } + + public void setAllCnt(Integer allCnt) { + this.allCnt = allCnt; + } + + private String extraPrize; + + private String extraImage; + + private String extraType; + + private Integer forwardPoint; + + public String getExtraPrize() { + return extraPrize; + } + + public void setExtraPrize(String extraPrize) { + this.extraPrize = extraPrize; + } + + public String getExtraImage() { + return extraImage; + } + + public void setExtraImage(String extraImage) { + this.extraImage = extraImage; + } + + public String getExtraType() { + return extraType; + } + + public void setExtraType(String extraType) { + this.extraType = extraType; + } + + public Integer getForwardPoint() { + return forwardPoint; + } + + public void setForwardPoint(Integer forwardPoint) { + this.forwardPoint = forwardPoint; + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/dto/RaffleItemDto.java b/fuint-application/src/main/java/com/fuint/common/dto/RaffleItemDto.java new file mode 100644 index 0000000..1110180 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/dto/RaffleItemDto.java @@ -0,0 +1,187 @@ +package com.fuint.common.dto; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import io.swagger.annotations.ApiModelProperty; + +import java.util.Date; + +/** + * 抽奖表 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ + +public class RaffleItemDto { + + private Integer id; + + private Integer raffleId; + + private String title; + + private String prize; + + private Integer point; + + private Integer userId; + + private String userNo; + + private String name; + + private String image; + + private Integer win; + + private Integer deal; + + private String description; + + private Date createTime; + + private Date updateTime; + + private String operator; + + private String forwardUserId; + + private String prizeType; + + public String getForwardUserId() { + return forwardUserId; + } + + public void setForwardUserId(String forwardUserId) { + this.forwardUserId = forwardUserId; + } + + public String getPrizeType() { + return prizeType; + } + + public void setPrizeType(String prizeType) { + this.prizeType = prizeType; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Integer getRaffleId() { + return raffleId; + } + + public void setRaffleId(Integer raffleId) { + this.raffleId = raffleId; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getPrize() { + return prize; + } + + public void setPrize(String prize) { + this.prize = prize; + } + + public Integer getPoint() { + return point; + } + + public void setPoint(Integer point) { + this.point = point; + } + + public Integer getUserId() { + return userId; + } + + public void setUserId(Integer userId) { + this.userId = userId; + } + + public String getUserNo() { + return userNo; + } + + public void setUserNo(String userNo) { + this.userNo = userNo; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getImage() { + return image; + } + + public void setImage(String image) { + this.image = image; + } + + public Integer getWin() { + return win; + } + + public void setWin(Integer win) { + this.win = win; + } + + public Integer getDeal() { + return deal; + } + + public void setDeal(Integer deal) { + this.deal = deal; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + public String getOperator() { + return operator; + } + + public void setOperator(String operator) { + this.operator = operator; + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/dto/RaffleTypeDto.java b/fuint-application/src/main/java/com/fuint/common/dto/RaffleTypeDto.java new file mode 100644 index 0000000..cd9994e --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/dto/RaffleTypeDto.java @@ -0,0 +1,40 @@ +package com.fuint.common.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +/** + * 抽奖类型DTO + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class RaffleTypeDto implements Serializable { + + @ApiModelProperty("主键") + private Integer id; + + @ApiModelProperty("商户ID") + private Integer merchantId; + + @ApiModelProperty("店铺ID") + private Integer storeId; + + @ApiModelProperty("类型编码") + private String code; + + @ApiModelProperty("类型名称") + private String name; + + @ApiModelProperty("备注") + private String description; + + @ApiModelProperty("排序") + private Integer sort; + + @ApiModelProperty("状态") + private String status; +} diff --git a/fuint-application/src/main/java/com/fuint/common/dto/TaskDto.java b/fuint-application/src/main/java/com/fuint/common/dto/TaskDto.java new file mode 100644 index 0000000..dc49ebf --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/dto/TaskDto.java @@ -0,0 +1,64 @@ +package com.fuint.common.dto; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + * 任务中心实体 + * + * Created by Codex + */ +@Data +public class TaskDto implements Serializable { + + @ApiModelProperty("自增ID") + private Integer id; + + @ApiModelProperty("所属商户ID") + private Integer merchantId; + + @ApiModelProperty("所属店铺ID") + private Integer storeId; + + @ApiModelProperty("任务编码") + private String taskCode; + + @ApiModelProperty("任务名称") + private String taskName; + + @ApiModelProperty("任务类型") + private String taskType; + + @ApiModelProperty("任务描述") + private String taskDesc; + + @ApiModelProperty("任务跳转链接") + private String jumpUrl; + + @ApiModelProperty("奖励积分") + private Integer rewardPoint; + + @ApiModelProperty("每日可领取次数") + private Integer dailyLimit; + + @ApiModelProperty("排序") + private Integer sort; + + @ApiModelProperty("最后操作人") + private String operator; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @ApiModelProperty("创建时间") + private Date createTime; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @ApiModelProperty("更新时间") + private Date updateTime; + + @ApiModelProperty("状态,A正常;D删除") + private String status; +} diff --git a/fuint-application/src/main/java/com/fuint/common/enums/PrizeTypeEnum.java b/fuint-application/src/main/java/com/fuint/common/enums/PrizeTypeEnum.java new file mode 100644 index 0000000..d31d53e --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/enums/PrizeTypeEnum.java @@ -0,0 +1,36 @@ +package com.fuint.common.enums; + +/** + * 订单类型 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public enum PrizeTypeEnum { + NORMAL("NORMAL", "普通奖"), + EXTRA("EXTRA", "额外奖"); + private String key; + + private String value; + + PrizeTypeEnum(String key, String value) { + this.key = key; + this.value = value; + } + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/enums/RaffleTypeEnum.java b/fuint-application/src/main/java/com/fuint/common/enums/RaffleTypeEnum.java new file mode 100644 index 0000000..702eed6 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/enums/RaffleTypeEnum.java @@ -0,0 +1,39 @@ +package com.fuint.common.enums; + +/** + * 订单类型 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public enum RaffleTypeEnum { + TCG("tcg", "集换式卡牌"), + GK("gk", "手办"), + GAME("game", "主机游戏"), + POPMART("popmart", "泡泡玛特"), + ALL("all", "所有"); + private String key; + + private String value; + + RaffleTypeEnum(String key, String value) { + this.key = key; + this.value = value; + } + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/param/RaffleParam.java b/fuint-application/src/main/java/com/fuint/common/param/RaffleParam.java new file mode 100644 index 0000000..c951e71 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/param/RaffleParam.java @@ -0,0 +1,20 @@ +package com.fuint.common.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +/** + * 卡券列表请求参数 + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class RaffleParam extends PageParam implements Serializable { + + private String dataType; + + + +} diff --git a/fuint-application/src/main/java/com/fuint/common/param/RaffleTypePage.java b/fuint-application/src/main/java/com/fuint/common/param/RaffleTypePage.java new file mode 100644 index 0000000..8983e86 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/param/RaffleTypePage.java @@ -0,0 +1,31 @@ +package com.fuint.common.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +/** + * 抽奖类型分页请求参数 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +public class RaffleTypePage extends PageParam implements Serializable { + + @ApiModelProperty("所属商户ID") + private Integer merchantId; + + @ApiModelProperty("所属店铺ID") + private Integer storeId; + + @ApiModelProperty("类型编码") + private String code; + + @ApiModelProperty("类型名称") + private String name; + + @ApiModelProperty("状态") + private String status; +} diff --git a/fuint-application/src/main/java/com/fuint/common/param/TaskPage.java b/fuint-application/src/main/java/com/fuint/common/param/TaskPage.java new file mode 100644 index 0000000..fb82b95 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/param/TaskPage.java @@ -0,0 +1,30 @@ +package com.fuint.common.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +/** + * 任务中心分页请求参数 + * + * Created by Codex + */ +@Data +public class TaskPage extends PageParam implements Serializable { + + @ApiModelProperty("所属商户ID") + private Integer merchantId; + + @ApiModelProperty("所属店铺ID") + private Integer storeId; + + @ApiModelProperty("任务名称") + private String taskName; + + @ApiModelProperty("任务类型") + private String taskType; + + @ApiModelProperty("状态") + private String status; +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/GrowService.java b/fuint-application/src/main/java/com/fuint/common/service/GrowService.java new file mode 100644 index 0000000..b6606a2 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/GrowService.java @@ -0,0 +1,26 @@ +package com.fuint.common.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fuint.common.dto.PointDto; +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.framework.pagination.PaginationRequest; +import com.fuint.framework.pagination.PaginationResponse; +import com.fuint.repository.model.MtGrow; +import com.fuint.repository.model.MtPoint; + +/** + * 积分业务接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface GrowService extends IService { + + MtGrow querySignInfo(Integer userId); + + boolean doSign(Integer id) throws BusinessCheckException; + + boolean doAdv(Integer id) throws BusinessCheckException; + + void clearAdvNum() throws BusinessCheckException; +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/RaffleService.java b/fuint-application/src/main/java/com/fuint/common/service/RaffleService.java new file mode 100644 index 0000000..dcaf1e3 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/RaffleService.java @@ -0,0 +1,108 @@ +package com.fuint.common.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fuint.common.dto.PointDto; +import com.fuint.common.dto.RaffleDto; +import com.fuint.common.dto.RaffleItemDto; +import com.fuint.common.dto.UserInfo; +import com.fuint.common.param.RaffleParam; +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.framework.pagination.PaginationRequest; +import com.fuint.framework.pagination.PaginationResponse; +import com.fuint.framework.web.ResponseObject; +import com.fuint.repository.model.MtPoint; +import com.fuint.repository.model.MtRaffle; +import com.fuint.repository.model.MtRaffleItem; +import com.fuint.repository.model.MtUser; + +import java.util.List; + +/** + * 抽奖业务接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface RaffleService extends IService { + + /** + * 分页查询抽奖列表 + * + * @param paginationRequest + * @return + */ + PaginationResponse queryListByPagination(PaginationRequest paginationRequest) throws BusinessCheckException; + + + /** + * 保存抽奖 + * + * @param reqRaffleDto + * @return + */ + int addRaffle(MtRaffle reqRaffleDto) throws BusinessCheckException; + + /** + * 保存抽奖明细 + * + * @param reqRaffleItemDto + * @return + */ + void addRaffleItem(MtRaffleItem reqRaffleItemDto) throws BusinessCheckException; + + /** + * 保存抽奖明细 + * + * @param raffleItemDto + * @return + */ + List queryRaffleItemByRaffleId(RaffleItemDto raffleItemDto) throws BusinessCheckException; + List queryRaffleItemByRaffleId2wechat(Integer raffleId) throws BusinessCheckException; + + + List doRaffleByRaffleId(Integer raffleId,Integer num, UserInfo mtUser,Integer forwardUserId) throws BusinessCheckException; + + ResponseObject findRaffleList(RaffleParam raffleParam) throws BusinessCheckException; + + MtRaffle queryRaffle(Integer raffleId) throws BusinessCheckException; + + /** + * 保存抽奖 + * + * @param reqRaffleDto + * @return + */ + int updRaffle(MtRaffle reqRaffleDto) throws BusinessCheckException; + + /** + * 保存抽奖明细 + * + * @param userId + * @return + */ + List queryRaffleItemByUserId(Integer userId) throws BusinessCheckException; + + + boolean tranfer2Point(Integer raffleItemId, Integer userId) throws BusinessCheckException; + + Integer userPoint(Integer userId) throws BusinessCheckException; + + boolean dealRaffleItem(Integer raffleItemId, String name) throws BusinessCheckException; + + /** + * 最新抽奖列表 + * + * @param limit + * @return + */ + List getLatestRaffles(Integer limit) throws BusinessCheckException; + + /** + * 最新中奖列表 + * + * @param limit + * @return + */ + List getLatestWinItems(Integer limit) throws BusinessCheckException; + +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/RaffleTypeService.java b/fuint-application/src/main/java/com/fuint/common/service/RaffleTypeService.java new file mode 100644 index 0000000..2f62b24 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/RaffleTypeService.java @@ -0,0 +1,28 @@ +package com.fuint.common.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fuint.common.param.RaffleTypePage; +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.framework.pagination.PaginationResponse; +import com.fuint.repository.model.MtRaffleType; + +import java.util.List; + +/** + * 抽奖类型服务接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface RaffleTypeService extends IService { + + PaginationResponse queryRaffleTypeListByPagination(RaffleTypePage page) throws BusinessCheckException; + + MtRaffleType addRaffleType(MtRaffleType raffleType) throws BusinessCheckException; + + MtRaffleType getRaffleTypeById(Integer id) throws BusinessCheckException; + + MtRaffleType updateRaffleType(MtRaffleType raffleType) throws BusinessCheckException; + + List getAvailableRaffleType(Integer merchantId, Integer storeId) throws BusinessCheckException; +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/TaskService.java b/fuint-application/src/main/java/com/fuint/common/service/TaskService.java new file mode 100644 index 0000000..7f4ffdf --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/TaskService.java @@ -0,0 +1,59 @@ +package com.fuint.common.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fuint.common.dto.TaskDto; +import com.fuint.common.param.TaskPage; +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.framework.pagination.PaginationResponse; +import com.fuint.repository.model.MtTask; + +import java.util.List; +import java.util.Map; + +/** + * 任务中心业务接口 + * + * Created by Codex + */ +public interface TaskService extends IService { + + /** + * 分页查询列表 + */ + PaginationResponse queryTaskListByPagination(TaskPage taskPage) throws BusinessCheckException; + + /** + * 添加任务 + */ + MtTask addTask(TaskDto taskDto) throws BusinessCheckException; + + /** + * 根据ID获取任务信息 + */ + MtTask queryTaskById(Integer id) throws BusinessCheckException; + + /** + * 更新任务 + */ + MtTask updateTask(TaskDto taskDto) throws BusinessCheckException; + + /** + * 根据条件查询任务列表 + */ + List queryTaskListByParams(Map params) throws BusinessCheckException; + + /** + * 会员端任务列表(含完成/领取进度) + */ + List> queryClientTaskList(Integer merchantId, Integer storeId, Integer userId) throws BusinessCheckException; + + /** + * 完成任务 + */ + Map completeTask(Integer merchantId, Integer storeId, Integer userId, Integer taskId, String operator) throws BusinessCheckException; + + /** + * 领取任务奖励 + */ + Map claimTask(Integer merchantId, Integer storeId, Integer userId, Integer taskId, String operator) throws BusinessCheckException; +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/impl/GrowServiceImpl.java b/fuint-application/src/main/java/com/fuint/common/service/impl/GrowServiceImpl.java new file mode 100644 index 0000000..161ba3f --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/impl/GrowServiceImpl.java @@ -0,0 +1,137 @@ +package com.fuint.common.service.impl; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.fuint.common.dto.PointDto; +import com.fuint.common.enums.StatusEnum; +import com.fuint.common.enums.WxMessageEnum; +import com.fuint.common.service.GrowService; +import com.fuint.common.service.MemberService; +import com.fuint.common.service.PointService; +import com.fuint.common.service.WeixinService; +import com.fuint.common.util.DateUtil; +import com.fuint.framework.annoation.OperationServiceLog; +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.framework.pagination.PaginationRequest; +import com.fuint.framework.pagination.PaginationResponse; +import com.fuint.repository.mapper.MtGrowMapper; +import com.fuint.repository.mapper.MtPointMapper; +import com.fuint.repository.mapper.MtUserMapper; +import com.fuint.repository.model.MtGrow; +import com.fuint.repository.model.MtPoint; +import com.fuint.repository.model.MtRaffleItem; +import com.fuint.repository.model.MtUser; +import com.fuint.utils.StringUtil; +import com.github.pagehelper.Page; +import com.github.pagehelper.PageHelper; +import lombok.AllArgsConstructor; +import org.apache.commons.lang.StringUtils; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.PageRequest; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; + +/** + * 积分管理业务实现类 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Service +@AllArgsConstructor +public class GrowServiceImpl extends ServiceImpl implements GrowService { + + private MtGrowMapper mtGrowMapper; + + private PointService pointService; + + private CouponServiceImpl couponService; + + @Override + public MtGrow querySignInfo(Integer userId) { + LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); + lambdaQueryWrapper.eq(MtGrow::getUserId, userId); + List signInfoList = mtGrowMapper.selectList(lambdaQueryWrapper); + if (signInfoList != null && signInfoList.size() > 0) { + return signInfoList.get(0); + } + MtGrow signInfo = new MtGrow(); + signInfo.setUserId(userId); + signInfo.setAdvNum(0); + signInfo.setAdvTotal(3); + signInfo.setGrowTotal(0); + signInfo.setCreateTime(new Date()); + signInfo.setUpdateTime(new Date()); + signInfo.setOperator("SYSTEM"); + mtGrowMapper.insertForId(signInfo); + + return signInfo; + } + @Override + @Transactional(rollbackFor = Exception.class) + public boolean doSign(Integer id) throws BusinessCheckException { + + // + MtGrow grow = mtGrowMapper.selectById(id); + MtGrow newGrow = new MtGrow(); + newGrow.setId(grow.getId()); + newGrow.setSignTime(new Date()); + newGrow.setUpdateTime(new Date()); + mtGrowMapper.updateById(newGrow); + + MtPoint reqPointDto = new MtPoint(); + reqPointDto.setAmount(1); + reqPointDto.setUserId(grow.getUserId()); + reqPointDto.setDescription("签到1积分"); + reqPointDto.setOperator("系统"); + pointService.addPoint(reqPointDto); + + return true; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean doAdv(Integer id) throws BusinessCheckException { + // + MtGrow grow = mtGrowMapper.selectById(id); + MtGrow newGrow = new MtGrow(); + newGrow.setId(grow.getId()); + newGrow.setAdvNum(grow.getAdvNum()+1); + newGrow.setGrowTotal(grow.getGrowTotal() + 1); + newGrow.setUpdateTime(new Date()); + mtGrowMapper.updateById(newGrow); + + MtPoint reqPointDto = new MtPoint(); + reqPointDto.setAmount(1); + reqPointDto.setUserId(grow.getUserId()); + reqPointDto.setDescription("视频广告1积分"); + reqPointDto.setOperator("系统"); + pointService.addPoint(reqPointDto); + + String uuid = UUID.randomUUID().toString().replaceAll("-", ""); + int nine = (newGrow.getGrowTotal())%9; + if (nine == 0) { + couponService.sendCoupon(13, grow.getUserId(),1,true,uuid,"SYSTEM"); + } + + int eleven = (newGrow.getGrowTotal())%11; + if (eleven == 0) { + couponService.sendCoupon(14, grow.getUserId(),1,true,uuid,"SYSTEM"); + } + return true; + } + + @Override + public void clearAdvNum() { + + MtGrow et = new MtGrow(); + et.setAdvNum(0); + Wrapper ew = new LambdaQueryWrapper<>(); + mtGrowMapper.update(et,ew); + + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/impl/RaffleServiceImpl.java b/fuint-application/src/main/java/com/fuint/common/service/impl/RaffleServiceImpl.java new file mode 100644 index 0000000..3ac266a --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/impl/RaffleServiceImpl.java @@ -0,0 +1,436 @@ +package com.fuint.common.service.impl; + +import com.alibaba.fastjson.JSONArray; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.fuint.common.Constants; +import com.fuint.common.dto.*; +import com.fuint.common.enums.PrizeTypeEnum; +import com.fuint.common.enums.RaffleTypeEnum; +import com.fuint.common.enums.StatusEnum; +import com.fuint.common.enums.WxMessageEnum; +import com.fuint.common.param.RaffleParam; +import com.fuint.common.service.*; +import com.fuint.common.util.DateUtil; +import com.fuint.framework.annoation.OperationServiceLog; +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.framework.pagination.PaginationRequest; +import com.fuint.framework.pagination.PaginationResponse; +import com.fuint.framework.web.ResponseObject; +import com.fuint.module.clientApi.controller.ClientRaffleController; +import com.fuint.repository.mapper.MtPointMapper; +import com.fuint.repository.mapper.MtRaffleItemMapper; +import com.fuint.repository.mapper.MtRaffleMapper; +import com.fuint.repository.mapper.MtUserMapper; +import com.fuint.repository.model.*; +import com.fuint.utils.StringUtil; +import com.github.pagehelper.Page; +import com.github.pagehelper.PageHelper; +import org.apache.commons.lang.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.PageRequest; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.util.*; + +/** + * 积分管理业务实现类 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Service +public class RaffleServiceImpl extends ServiceImpl implements RaffleService { + + private static final Logger logger = LoggerFactory.getLogger(RaffleServiceImpl.class); + + @Resource + private MtRaffleMapper mtRaffleMapper; + @Resource + private MtRaffleItemMapper mtRaffleItemMapper; + @Resource + private MtUserMapper mtUserMapper; + @Resource + private PointService pointService; + @Autowired + private SettingService settingService; + @Resource + private BalanceService balanceService; + + /** + * 分页查询积分列表 + * + * @param paginationRequest + * @return + */ + @Override + public PaginationResponse queryListByPagination(PaginationRequest paginationRequest) throws BusinessCheckException { + Page pageHelper = PageHelper.startPage(paginationRequest.getCurrentPage(), paginationRequest.getPageSize()); + LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); + String status = paginationRequest.getSearchParams().get("status") == null ? "" : paginationRequest.getSearchParams().get("status").toString(); + String title = paginationRequest.getSearchParams().get("title") == null ? "" : paginationRequest.getSearchParams().get("title").toString(); + if (StringUtils.isNotBlank(status)) { + lambdaQueryWrapper.eq(MtRaffle::getStatus, status); + } + if (StringUtils.isNotBlank(title)) { + lambdaQueryWrapper.like(MtRaffle::getTitle, title); + } + lambdaQueryWrapper.orderByDesc(MtRaffle::getCreateTime); + List raffleList = mtRaffleMapper.selectList(lambdaQueryWrapper); + + List dataList = new ArrayList<>(); + for (MtRaffle raffle : raffleList) { + RaffleDto item = new RaffleDto(); + item.setId(raffle.getId()); + item.setBrief(raffle.getBrief()); + item.setTitle(raffle.getTitle()); + item.setDescription(raffle.getDescription()); + item.setRafflePoint(raffle.getRafflePoint()); + item.setImage(raffle.getImage()); + item.setRaffleType(raffle.getRaffleType()); + item.setClick(raffle.getClick()); + item.setHot(raffle.getHot()); + item.setSort(raffle.getSort()); + item.setNowCnt(raffle.getNowCnt()); + item.setAllCnt(raffle.getAllCnt()); + item.setDescription(raffle.getDescription()); + item.setCreateTime(raffle.getCreateTime()); + item.setUpdateTime(raffle.getUpdateTime()); + item.setOperator(raffle.getOperator()); + item.setStatus(raffle.getStatus()); + dataList.add(item); + } + + + PageRequest pageRequest = PageRequest.of(paginationRequest.getCurrentPage(), paginationRequest.getPageSize()); + PageImpl pageImpl = new PageImpl(dataList, pageRequest, pageHelper.getTotal()); + PaginationResponse paginationResponse = new PaginationResponse(pageImpl, RaffleDto.class); + paginationResponse.setTotalPages(pageHelper.getPages()); + paginationResponse.setTotalElements(pageHelper.getTotal()); + paginationResponse.setContent(dataList); + + return paginationResponse; + } + + @Override + public int addRaffle(MtRaffle reqRaffleDto) throws BusinessCheckException { + + return mtRaffleMapper.insertForId(reqRaffleDto); + } + + @Override + public void addRaffleItem(MtRaffleItem reqRaffleItemDto) throws BusinessCheckException { + mtRaffleItemMapper.insert(reqRaffleItemDto); + } + + @Override + public List queryRaffleItemByRaffleId(RaffleItemDto raffleItemDto) throws BusinessCheckException { + LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); + lambdaQueryWrapper.eq(MtRaffleItem::getRaffleId, raffleItemDto.getRaffleId()); + + if (raffleItemDto.getUserId() != null) { + lambdaQueryWrapper.eq(MtRaffleItem::getUserId, raffleItemDto.getUserId()); + } + if (raffleItemDto.getWin() != null) { + lambdaQueryWrapper.eq(MtRaffleItem::getWin, raffleItemDto.getWin()); + } + if (raffleItemDto.getDeal() != null) { + lambdaQueryWrapper.eq(MtRaffleItem::getDeal,raffleItemDto.getDeal()); + } + if (raffleItemDto.getUserNo() != null) { + lambdaQueryWrapper.eq(MtRaffleItem::getUserNo,raffleItemDto.getUserNo()); + } + + List raffleList = mtRaffleItemMapper.selectList(lambdaQueryWrapper); + + return raffleList; + } + @Override + @Transactional(rollbackFor = Exception.class) + public List doRaffleByRaffleId(Integer raffleId, Integer num, UserInfo userinfo, Integer forwardUserId) throws BusinessCheckException { + + MtUser user = mtUserMapper.selectById(userinfo.getId()); + + //获取抽奖信息 + MtRaffle mtRaffle = mtRaffleMapper.selectById(raffleId); + mtRaffle.setNowCnt(mtRaffle.getNowCnt()+num); + mtRaffleMapper.updateById(mtRaffle); + + LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); + lambdaQueryWrapper.eq(MtRaffleItem::getRaffleId, raffleId); + lambdaQueryWrapper.eq(MtRaffleItem::getWin, 0); //奖品状态 1已抽中 0未抽中 + List raffleList = mtRaffleItemMapper.selectList(lambdaQueryWrapper); + + //扣减积分 + MtPoint mtPoint = new MtPoint(); + mtPoint.setUserId(user.getId()); + mtPoint.setAmount(mtRaffle.getRafflePoint()*-1*num); + mtPoint.setDescription("一番赏:"+mtRaffle.getTitle()+ "/" + num+"次"); + pointService.addPoint(mtPoint); + + //更新中奖信息 + String baseImage = settingService.getUploadBasePath(); + + List resultList = new ArrayList<>(); + for (int i = 0; i < num; i++) { + int removeNum = new Random().nextInt(raffleList.size()); + MtRaffleItem mtRaffleItem = raffleList.get(removeNum); + mtRaffleItem.setUserId(user.getId()); + mtRaffleItem.setUserNo(user.getUserNo()); + mtRaffleItem.setWin(1);//奖品状态 1已抽中 0未抽中 + mtRaffleItem.setName(user.getName()); + mtRaffleItem.setUpdateTime(new Date()); + mtRaffleItem.setForwardUserId(forwardUserId); + mtRaffleItemMapper.updateById(mtRaffleItem); + mtRaffleItem.setImage(baseImage + mtRaffleItem.getImage()); + raffleList.remove(removeNum); + resultList.add(mtRaffleItem); + } + //判断额外奖是随机还是最终 + List count = mtRaffleItemMapper.selectList(lambdaQueryWrapper); + if (count.size() == 0 && StringUtil.isNotEmpty(mtRaffle.getExtraPrize())) { + + logger.info(mtRaffle.getTitle()+"抽完准备出赏"); + + MtRaffleItem extraItem = new MtRaffleItem(); + extraItem.setTitle(mtRaffle.getTitle()); + extraItem.setPrize(mtRaffle.getExtraPrize()); + extraItem.setImage(mtRaffle.getExtraImage()); + extraItem.setPoint(mtRaffle.getRafflePoint()); + extraItem.setRaffleId(mtRaffle.getId()); + extraItem.setUserId(user.getId()); + extraItem.setUserNo(user.getUserNo()); + extraItem.setName(user.getName()); + extraItem.setWin(1);//奖品状态 1已抽中 0未抽中 + extraItem.setPrizeType(PrizeTypeEnum.EXTRA.getKey()); + + extraItem.setUpdateTime(new Date()); + if ("L".equals(mtRaffle.getExtraType())) { + extraItem.setUserId(user.getId()); + extraItem.setUserNo(user.getUserNo()); + extraItem.setName(user.getName()); + logger.info(mtRaffle.getTitle()+"最后出赏"); + } else if ("R".equals(mtRaffle.getExtraType())) { + List userIdlist = mtRaffleItemMapper.queryUserIdByRaffleId(mtRaffle.getId()); + logger.info(mtRaffle.getTitle()+"随机出赏"); + logger.info("随机用户ID:" + JSONArray.toJSONString(userIdlist)); + Integer userId = userIdlist.get(new Random().nextInt(userIdlist.size())); + MtUser extraUser = mtUserMapper.selectById(userId); + + extraItem.setUserId(extraUser.getId()); + extraItem.setUserNo(extraUser.getUserNo()); + extraItem.setName(extraUser.getName()); + } + mtRaffleItemMapper.insert(extraItem); + + } + //转发奖励积分 + if (forwardUserId > 0 && forwardUserId != user.getId() && mtRaffle.getForwardPoint() > 0) { + MtPoint forwardUser = new MtPoint(); + forwardUser.setUserId(forwardUserId); + forwardUser.setAmount(mtRaffle.getForwardPoint()*num); + forwardUser.setDescription("推广一番赏:"+mtRaffle.getTitle()+ "/" + num+"次,转发奖励:"+forwardUser.getAmount()+"积分"); + pointService.addPoint(forwardUser); + + +// MtBalance dto = new MtBalance(); +// dto.setUserId(forwardUserId); +// dto.setAmount(BigDecimal.valueOf(mtRaffle.getForwardPoint()*num)); +// dto.setDescription("推广一番赏:"+mtRaffle.getTitle()+ "/" + num+"次,转发奖励:"+dto.getAmount()); +// dto.setOperator("system"); +// balanceService.addBalance(dto); + } + + return resultList; + } + + @Override + public ResponseObject findRaffleList(RaffleParam raffleParam) throws BusinessCheckException { + Integer pageNumber = raffleParam.getPage() == null ? Constants.PAGE_NUMBER : raffleParam.getPage(); + Integer pageSize = raffleParam.getPageSize() == null ? Constants.PAGE_SIZE : raffleParam.getPageSize(); + String dataType = raffleParam.getDataType() == null ? null : raffleParam.getDataType(); + + Page pageHelper = PageHelper.startPage(pageNumber, pageSize); + LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); + lambdaQueryWrapper.eq(MtRaffle::getStatus, StatusEnum.ENABLED.getKey()); + if (dataType != null && !RaffleTypeEnum.ALL.getKey().equals(dataType)) { + lambdaQueryWrapper.eq(MtRaffle::getRaffleType, dataType); + } + lambdaQueryWrapper.orderByDesc(MtRaffle::getCreateTime); + String baseImage = settingService.getUploadBasePath(); + List raffleList = mtRaffleMapper.selectList(lambdaQueryWrapper); + List resultList = new ArrayList<>(); + for (MtRaffle raffle:raffleList) { + RaffleDto dto = new RaffleDto(); + BeanUtils.copyProperties(raffle, dto); + dto.setImage(baseImage+raffle.getImage()); + if (raffle.getExtraImage() != null) { + dto.setExtraImage(baseImage + raffle.getExtraImage()); + } + resultList.add(dto); + } + + PageRequest pageRequest = PageRequest.of(pageNumber, pageSize); + PageImpl pageImpl = new PageImpl(resultList, pageRequest, pageHelper.getTotal()); + PaginationResponse paginationResponse = new PaginationResponse(pageImpl, RaffleDto.class); + paginationResponse.setTotalPages(pageHelper.getPages()); + paginationResponse.setTotalElements(pageHelper.getTotal()); + paginationResponse.setContent(resultList); + + return new ResponseObject(200, "查询成功", paginationResponse); + } + + @Override + public MtRaffle queryRaffle(Integer raffleId) throws BusinessCheckException { + String baseImage = settingService.getUploadBasePath(); + + MtRaffle raffle = mtRaffleMapper.selectById(raffleId); + raffle.setImage(baseImage+raffle.getImage()); + raffle.setExtraImage(baseImage+raffle.getExtraImage()); + return raffle; + } + + @Override + public int updRaffle(MtRaffle reqRaffleDto) throws BusinessCheckException { + + return mtRaffleMapper.updateById(reqRaffleDto); + + } + + @Override + public List queryRaffleItemByUserId(Integer userId) throws BusinessCheckException { + LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); + lambdaQueryWrapper.eq(MtRaffleItem::getUserId, userId); + lambdaQueryWrapper.eq(MtRaffleItem::getWin,1); //1:已抽中 + lambdaQueryWrapper.eq(MtRaffleItem::getDeal,0);//0:未处理 + lambdaQueryWrapper.orderByDesc(MtRaffleItem::getCreateTime); + List raffleList = mtRaffleItemMapper.selectList(lambdaQueryWrapper); + + String baseImage = settingService.getUploadBasePath(); + List resultList = new ArrayList<>(); + for (MtRaffleItem raffle:raffleList) { + RaffleItemDto dto = new RaffleItemDto(); + BeanUtils.copyProperties(raffle, dto); + dto.setImage(baseImage+raffle.getImage()); + resultList.add(dto); + } + + + return resultList; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean tranfer2Point(Integer raffleItemId, Integer userId) throws BusinessCheckException { + + MtUser user = mtUserMapper.selectById(userId); + + MtRaffleItem item = mtRaffleItemMapper.selectById(raffleItemId); + //已转化积分或者已领取 + if (item.getDeal() == 1) { + return false; + } + MtPoint mtPoint = new MtPoint(); + mtPoint.setUserId(user.getId()); + mtPoint.setAmount(item.getPoint()); + mtPoint.setDescription("转化积分:"+item.getTitle()); + pointService.addPoint(mtPoint); + + item.setDeal(1); //1:已处理,2:未处理 + item.setUpdateTime(new Date()); + item.setOperator("操作人:" + userId); + mtRaffleItemMapper.updateById(item); + + return true; + + } + + @Override + public Integer userPoint(Integer userId) throws BusinessCheckException { + MtUser user = mtUserMapper.selectById(userId); + return user.getPoint(); + } + + @Override + public boolean dealRaffleItem(Integer raffleItemId, String name) throws BusinessCheckException { + + MtRaffleItem item = new MtRaffleItem(); + item.setId(raffleItemId); + item.setDeal(1); + item.setOperator("操作人:" + name); + mtRaffleItemMapper.updateById(item); + + return true; + } + + @Override + public List getLatestRaffles(Integer limit) throws BusinessCheckException { + int size = (limit == null || limit <= 0) ? 5 : limit; + LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); + lambdaQueryWrapper.eq(MtRaffle::getStatus, StatusEnum.ENABLED.getKey()); + lambdaQueryWrapper.orderByDesc(MtRaffle::getCreateTime); + lambdaQueryWrapper.last("limit " + size); + + String baseImage = settingService.getUploadBasePath(); + List raffleList = mtRaffleMapper.selectList(lambdaQueryWrapper); + List resultList = new ArrayList<>(); + for (MtRaffle raffle : raffleList) { + RaffleDto dto = new RaffleDto(); + BeanUtils.copyProperties(raffle, dto); + dto.setImage(baseImage + raffle.getImage()); + if (raffle.getExtraImage() != null) { + dto.setExtraImage(baseImage + raffle.getExtraImage()); + } + resultList.add(dto); + } + return resultList; + } + + @Override + public List getLatestWinItems(Integer limit) throws BusinessCheckException { + int size = (limit == null || limit <= 0) ? 20 : limit; + LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); + lambdaQueryWrapper.eq(MtRaffleItem::getWin, 1); + lambdaQueryWrapper.orderByDesc(MtRaffleItem::getCreateTime); + lambdaQueryWrapper.last("limit " + size); + + String baseImage = settingService.getUploadBasePath(); + List raffleList = mtRaffleItemMapper.selectList(lambdaQueryWrapper); + List resultList = new ArrayList<>(); + for (MtRaffleItem raffle : raffleList) { + RaffleItemDto dto = new RaffleItemDto(); + BeanUtils.copyProperties(raffle, dto); + dto.setImage(baseImage + raffle.getImage()); + resultList.add(dto); + } + return resultList; + } + + @Override + public List queryRaffleItemByRaffleId2wechat(Integer raffleId) throws BusinessCheckException { + LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); + lambdaQueryWrapper.eq(MtRaffleItem::getRaffleId, raffleId); + lambdaQueryWrapper.eq(MtRaffleItem::getPrizeType, PrizeTypeEnum.NORMAL.getKey()); + List raffleList = mtRaffleItemMapper.selectList(lambdaQueryWrapper); + List resultList = new ArrayList<>(); + + String baseImage = settingService.getUploadBasePath(); + + for (MtRaffleItem mtRaffleItem:raffleList) { + RaffleItemDto dto = new RaffleItemDto(); + BeanUtils.copyProperties(mtRaffleItem, dto); + dto.setImage(baseImage+mtRaffleItem.getImage()); + resultList.add(dto); + } + + return resultList; + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/impl/RaffleTypeServiceImpl.java b/fuint-application/src/main/java/com/fuint/common/service/impl/RaffleTypeServiceImpl.java new file mode 100644 index 0000000..f317d52 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/impl/RaffleTypeServiceImpl.java @@ -0,0 +1,156 @@ +package com.fuint.common.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.fuint.common.enums.StatusEnum; +import com.fuint.common.param.RaffleTypePage; +import com.fuint.common.service.RaffleTypeService; +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.framework.pagination.PaginationResponse; +import com.fuint.repository.mapper.MtRaffleTypeMapper; +import com.fuint.repository.model.MtRaffleType; +import com.fuint.utils.StringUtil; +import com.github.pagehelper.Page; +import com.github.pagehelper.PageHelper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.PageRequest; +import org.springframework.stereotype.Service; + +import java.util.Date; +import java.util.List; + +/** + * 抽奖类型服务实现类 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Service +public class RaffleTypeServiceImpl extends ServiceImpl implements RaffleTypeService { + + private static final Logger logger = LoggerFactory.getLogger(RaffleTypeServiceImpl.class); + + private MtRaffleTypeMapper mtRaffleTypeMapper; + + public RaffleTypeServiceImpl(MtRaffleTypeMapper mtRaffleTypeMapper) { + this.mtRaffleTypeMapper = mtRaffleTypeMapper; + } + + @Override + public PaginationResponse queryRaffleTypeListByPagination(RaffleTypePage page) { + Page pageHelper = PageHelper.startPage(page.getPage(), page.getPageSize()); + LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); + lambdaQueryWrapper.ne(MtRaffleType::getStatus, StatusEnum.DISABLE.getKey()); + + if (StringUtil.isNotEmpty(page.getName())) { + lambdaQueryWrapper.like(MtRaffleType::getName, page.getName()); + } + if (StringUtil.isNotEmpty(page.getCode())) { + lambdaQueryWrapper.like(MtRaffleType::getCode, page.getCode()); + } + if (StringUtil.isNotEmpty(page.getStatus())) { + lambdaQueryWrapper.eq(MtRaffleType::getStatus, page.getStatus()); + } + if (page.getMerchantId() != null && page.getMerchantId() > 0) { + lambdaQueryWrapper.eq(MtRaffleType::getMerchantId, page.getMerchantId()); + } + if (page.getStoreId() != null) { + lambdaQueryWrapper.and(wq -> wq + .eq(MtRaffleType::getStoreId, 0) + .or() + .eq(MtRaffleType::getStoreId, page.getStoreId())); + } + + lambdaQueryWrapper.orderByAsc(MtRaffleType::getSort); + List dataList = mtRaffleTypeMapper.selectList(lambdaQueryWrapper); + + PageRequest pageRequest = PageRequest.of(page.getPage(), page.getPageSize()); + PageImpl pageImpl = new PageImpl(dataList, pageRequest, pageHelper.getTotal()); + PaginationResponse paginationResponse = new PaginationResponse(pageImpl, MtRaffleType.class); + paginationResponse.setTotalPages(pageHelper.getPages()); + paginationResponse.setTotalElements(pageHelper.getTotal()); + paginationResponse.setContent(dataList); + + return paginationResponse; + } + + @Override + public MtRaffleType addRaffleType(MtRaffleType raffleType) throws BusinessCheckException { + if (raffleType.getMerchantId() == null || raffleType.getMerchantId() <= 0) { + throw new BusinessCheckException("新增抽奖类型失败:所属商户不能为空!"); + } + if (StringUtil.isEmpty(raffleType.getName())) { + throw new BusinessCheckException("抽奖类型名称不能为空!"); + } + if (StringUtil.isEmpty(raffleType.getCode())) { + throw new BusinessCheckException("抽奖类型编码不能为空!"); + } + MtRaffleType entity = new MtRaffleType(); + entity.setMerchantId(raffleType.getMerchantId()); + entity.setStoreId(raffleType.getStoreId() == null ? 0 : raffleType.getStoreId()); + entity.setName(raffleType.getName()); + entity.setCode(raffleType.getCode()); + entity.setDescription(raffleType.getDescription()); + entity.setSort(raffleType.getSort() == null ? 0 : raffleType.getSort()); + entity.setOperator(raffleType.getOperator()); + entity.setStatus(StringUtil.isNotEmpty(raffleType.getStatus()) ? raffleType.getStatus() : StatusEnum.ENABLED.getKey()); + entity.setCreateTime(new Date()); + entity.setUpdateTime(new Date()); + mtRaffleTypeMapper.insert(entity); + return entity; + } + + @Override + public MtRaffleType getRaffleTypeById(Integer id) { + return mtRaffleTypeMapper.selectById(id); + } + + @Override + public MtRaffleType updateRaffleType(MtRaffleType raffleType) throws BusinessCheckException { + MtRaffleType entity = getRaffleTypeById(raffleType.getId()); + if (entity == null) { + throw new BusinessCheckException("抽奖类型不存在"); + } + if (raffleType.getName() != null) { + entity.setName(raffleType.getName()); + } + if (raffleType.getCode() != null) { + entity.setCode(raffleType.getCode()); + } + if (raffleType.getStoreId() != null) { + entity.setStoreId(raffleType.getStoreId()); + } + if (raffleType.getDescription() != null) { + entity.setDescription(raffleType.getDescription()); + } + if (raffleType.getOperator() != null) { + entity.setOperator(raffleType.getOperator()); + } + if (raffleType.getStatus() != null) { + entity.setStatus(raffleType.getStatus()); + } + if (raffleType.getSort() != null) { + entity.setSort(raffleType.getSort()); + } + entity.setUpdateTime(new Date()); + mtRaffleTypeMapper.updateById(entity); + return entity; + } + + @Override + public List getAvailableRaffleType(Integer merchantId, Integer storeId) { + LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); + lambdaQueryWrapper.eq(MtRaffleType::getStatus, StatusEnum.ENABLED.getKey()); + if (merchantId != null && merchantId > 0) { + lambdaQueryWrapper.eq(MtRaffleType::getMerchantId, merchantId); + } + if (storeId != null && storeId > 0) { + lambdaQueryWrapper.and(wq -> wq.eq(MtRaffleType::getStoreId, 0).or().eq(MtRaffleType::getStoreId, storeId)); + } + lambdaQueryWrapper.orderByAsc(MtRaffleType::getSort); + return mtRaffleTypeMapper.selectList(lambdaQueryWrapper); + } +} diff --git a/fuint-application/src/main/java/com/fuint/common/service/impl/TaskServiceImpl.java b/fuint-application/src/main/java/com/fuint/common/service/impl/TaskServiceImpl.java new file mode 100644 index 0000000..7319f09 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/common/service/impl/TaskServiceImpl.java @@ -0,0 +1,435 @@ +package com.fuint.common.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.fuint.common.dto.TaskDto; +import com.fuint.common.enums.StatusEnum; +import com.fuint.common.param.TaskPage; +import com.fuint.common.service.PointService; +import com.fuint.common.service.StoreService; +import com.fuint.common.service.TaskService; +import com.fuint.common.util.DateUtil; +import com.fuint.framework.annoation.OperationServiceLog; +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.framework.pagination.PaginationResponse; +import com.fuint.repository.mapper.MtPointMapper; +import com.fuint.repository.mapper.MtTaskMapper; +import com.fuint.repository.mapper.MtTaskRecordMapper; +import com.fuint.repository.model.MtPoint; +import com.fuint.repository.model.MtStore; +import com.fuint.repository.model.MtTask; +import com.fuint.repository.model.MtTaskRecord; +import com.github.pagehelper.Page; +import com.github.pagehelper.PageHelper; +import lombok.AllArgsConstructor; +import org.apache.commons.lang.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeanUtils; +import org.springframework.context.annotation.Lazy; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.PageRequest; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 任务中心服务实现 + * + * Created by Codex + */ +@Service +@AllArgsConstructor(onConstructor_ = {@Lazy}) +public class TaskServiceImpl extends ServiceImpl implements TaskService { + + private static final Logger logger = LoggerFactory.getLogger(TaskServiceImpl.class); + + private MtTaskMapper mtTaskMapper; + + private MtTaskRecordMapper mtTaskRecordMapper; + + private MtPointMapper mtPointMapper; + + private PointService pointService; + + private StoreService storeService; + + @Override + public PaginationResponse queryTaskListByPagination(TaskPage taskPage) { + Page pageHelper = PageHelper.startPage(taskPage.getPage(), taskPage.getPageSize()); + LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); + lambdaQueryWrapper.ne(MtTask::getStatus, StatusEnum.DISABLE.getKey()); + + if (StringUtils.isNotBlank(taskPage.getTaskName())) { + lambdaQueryWrapper.like(MtTask::getTaskName, taskPage.getTaskName()); + } + if (StringUtils.isNotBlank(taskPage.getTaskType())) { + lambdaQueryWrapper.eq(MtTask::getTaskType, taskPage.getTaskType()); + } + if (StringUtils.isNotBlank(taskPage.getStatus())) { + lambdaQueryWrapper.eq(MtTask::getStatus, taskPage.getStatus()); + } + if (taskPage.getMerchantId() != null) { + lambdaQueryWrapper.eq(MtTask::getMerchantId, taskPage.getMerchantId()); + } + if (taskPage.getStoreId() != null) { + lambdaQueryWrapper.eq(MtTask::getStoreId, taskPage.getStoreId()); + } + + lambdaQueryWrapper.orderByAsc(MtTask::getSort).orderByDesc(MtTask::getId); + List dataList = mtTaskMapper.selectList(lambdaQueryWrapper); + + PageRequest pageRequest = PageRequest.of(taskPage.getPage(), taskPage.getPageSize()); + PageImpl pageImpl = new PageImpl(dataList, pageRequest, pageHelper.getTotal()); + PaginationResponse paginationResponse = new PaginationResponse(pageImpl, MtTask.class); + paginationResponse.setTotalPages(pageHelper.getPages()); + paginationResponse.setTotalElements(pageHelper.getTotal()); + paginationResponse.setContent(dataList); + return paginationResponse; + } + + @Override + @OperationServiceLog(description = "新增任务") + public MtTask addTask(TaskDto taskDto) throws BusinessCheckException { + MtTask mtTask = new MtTask(); + BeanUtils.copyProperties(taskDto, mtTask); + + Integer storeId = taskDto.getStoreId() == null ? 0 : taskDto.getStoreId(); + if (taskDto.getMerchantId() == null || taskDto.getMerchantId() <= 0) { + MtStore mtStore = storeService.queryStoreById(storeId); + if (mtStore != null) { + mtTask.setMerchantId(mtStore.getMerchantId()); + } + } + if (mtTask.getMerchantId() == null || mtTask.getMerchantId() <= 0) { + throw new BusinessCheckException("新增任务失败:所属商户不能为空!"); + } + if (StringUtils.isBlank(mtTask.getTaskCode())) { + throw new BusinessCheckException("任务编码不能为空"); + } + if (StringUtils.isBlank(mtTask.getTaskName())) { + throw new BusinessCheckException("任务名称不能为空"); + } + + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + wrapper.eq(MtTask::getMerchantId, mtTask.getMerchantId()) + .eq(MtTask::getStoreId, storeId) + .eq(MtTask::getTaskCode, mtTask.getTaskCode()) + .ne(MtTask::getStatus, StatusEnum.DISABLE.getKey()); + if (mtTaskMapper.selectCount(wrapper) > 0) { + throw new BusinessCheckException("任务编码已存在,请更换后重试"); + } + + mtTask.setStoreId(storeId); + mtTask.setRewardPoint(mtTask.getRewardPoint() == null ? 0 : mtTask.getRewardPoint()); + mtTask.setDailyLimit(mtTask.getDailyLimit() == null ? 1 : mtTask.getDailyLimit()); + mtTask.setSort(mtTask.getSort() == null ? 0 : mtTask.getSort()); + mtTask.setStatus(StringUtils.isBlank(mtTask.getStatus()) ? StatusEnum.ENABLED.getKey() : mtTask.getStatus()); + mtTask.setCreateTime(new Date()); + mtTask.setUpdateTime(new Date()); + + Integer id = mtTaskMapper.insert(mtTask); + if (id > 0) { + return mtTask; + } + logger.error("新增任务失败."); + throw new BusinessCheckException("抱歉,新增任务失败!"); + } + + @Override + public MtTask queryTaskById(Integer id) { + return mtTaskMapper.selectById(id); + } + + @Override + @Transactional(rollbackFor = Exception.class) + @OperationServiceLog(description = "更新任务") + public MtTask updateTask(TaskDto taskDto) throws BusinessCheckException { + MtTask mtTask = queryTaskById(taskDto.getId()); + if (mtTask == null) { + throw new BusinessCheckException("该任务不存在"); + } + + Integer targetStoreId = taskDto.getStoreId() == null ? mtTask.getStoreId() : taskDto.getStoreId(); + if (StringUtils.isNotBlank(taskDto.getTaskCode())) { + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + wrapper.eq(MtTask::getMerchantId, mtTask.getMerchantId()) + .eq(MtTask::getStoreId, targetStoreId) + .eq(MtTask::getTaskCode, taskDto.getTaskCode()) + .ne(MtTask::getStatus, StatusEnum.DISABLE.getKey()) + .ne(MtTask::getId, mtTask.getId()); + if (mtTaskMapper.selectCount(wrapper) > 0) { + throw new BusinessCheckException("任务编码已存在,请更换后重试"); + } + mtTask.setTaskCode(taskDto.getTaskCode()); + } + if (StringUtils.isNotBlank(taskDto.getTaskName())) { + mtTask.setTaskName(taskDto.getTaskName()); + } + if (taskDto.getStoreId() != null) { + mtTask.setStoreId(targetStoreId); + } + if (StringUtils.isNotBlank(taskDto.getTaskType())) { + mtTask.setTaskType(taskDto.getTaskType()); + } + if (taskDto.getTaskDesc() != null) { + mtTask.setTaskDesc(taskDto.getTaskDesc()); + } + if (taskDto.getJumpUrl() != null) { + mtTask.setJumpUrl(taskDto.getJumpUrl()); + } + if (taskDto.getRewardPoint() != null) { + mtTask.setRewardPoint(taskDto.getRewardPoint()); + } + if (taskDto.getDailyLimit() != null) { + mtTask.setDailyLimit(taskDto.getDailyLimit()); + } + if (taskDto.getSort() != null) { + mtTask.setSort(taskDto.getSort()); + } + if (taskDto.getOperator() != null) { + mtTask.setOperator(taskDto.getOperator()); + } + if (taskDto.getStatus() != null) { + mtTask.setStatus(taskDto.getStatus()); + } + + mtTask.setUpdateTime(new Date()); + mtTaskMapper.updateById(mtTask); + return mtTask; + } + + @Override + public List queryTaskListByParams(Map params) { + String status = params.get("status") == null ? StatusEnum.ENABLED.getKey() : params.get("status").toString(); + String storeId = params.get("storeId") == null ? "" : params.get("storeId").toString(); + String merchantId = params.get("merchantId") == null ? "" : params.get("merchantId").toString(); + + LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); + if (StringUtils.isNotBlank(status)) { + lambdaQueryWrapper.eq(MtTask::getStatus, status); + } + if (StringUtils.isNotBlank(merchantId)) { + lambdaQueryWrapper.eq(MtTask::getMerchantId, merchantId); + } + if (StringUtils.isNotBlank(storeId)) { + lambdaQueryWrapper.and(wq -> wq + .eq(MtTask::getStoreId, 0) + .or() + .eq(MtTask::getStoreId, storeId)); + } + + lambdaQueryWrapper.orderByAsc(MtTask::getSort).orderByDesc(MtTask::getId); + return mtTaskMapper.selectList(lambdaQueryWrapper); + } + + @Override + public List> queryClientTaskList(Integer merchantId, Integer storeId, Integer userId) { + Map params = new HashMap<>(); + params.put("merchantId", merchantId); + params.put("storeId", storeId); + params.put("status", StatusEnum.ENABLED.getKey()); + List taskList = this.queryTaskListByParams(params); + + Map recordMap = new HashMap<>(); + if (userId != null && userId > 0) { + String taskDate = DateUtil.getNow(DateUtil.PATTERN_ISO_DATE); + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + wrapper.eq(MtTaskRecord::getMerchantId, merchantId) + .eq(MtTaskRecord::getUserId, userId) + .eq(MtTaskRecord::getTaskDate, taskDate) + .eq(MtTaskRecord::getStatus, StatusEnum.ENABLED.getKey()); + List recordList = mtTaskRecordMapper.selectList(wrapper); + for (MtTaskRecord record : recordList) { + recordMap.put(record.getTaskId(), record); + } + } + + List> result = new ArrayList<>(); + for (MtTask task : taskList) { + MtTaskRecord record = recordMap.get(task.getId()); + int completeNum = record == null || record.getCompleteNum() == null ? 0 : record.getCompleteNum(); + int claimNum = record == null || record.getClaimNum() == null ? 0 : record.getClaimNum(); + int dailyLimit = task.getDailyLimit() == null ? 1 : task.getDailyLimit(); + int rewardPoint = task.getRewardPoint() == null ? 0 : task.getRewardPoint(); + + Map item = new HashMap<>(); + item.put("id", task.getId()); + item.put("taskCode", task.getTaskCode()); + item.put("taskName", task.getTaskName()); + item.put("taskType", task.getTaskType()); + item.put("taskDesc", task.getTaskDesc()); + item.put("jumpUrl", task.getJumpUrl()); + item.put("rewardPoint", rewardPoint); + item.put("dailyLimit", dailyLimit); + item.put("sort", task.getSort()); + item.put("completeNum", completeNum); + item.put("claimNum", claimNum); + item.put("canComplete", completeNum < dailyLimit); + item.put("canClaim", claimNum < completeNum); + item.put("finished", claimNum >= dailyLimit); + result.add(item); + } + return result; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Map completeTask(Integer merchantId, Integer storeId, Integer userId, Integer taskId, String operator) throws BusinessCheckException { + MtTask taskInfo = queryTaskByScope(merchantId, storeId, taskId); + if (taskInfo == null) { + throw new BusinessCheckException("任务不存在或已下线"); + } + int dailyLimit = taskInfo.getDailyLimit() == null ? 1 : taskInfo.getDailyLimit(); + String taskDate = DateUtil.getNow(DateUtil.PATTERN_ISO_DATE); + Date nowTime = new Date(); + MtTaskRecord record = getOrCreateRecord(merchantId, storeId, userId, taskId, taskDate, operator, nowTime); + + int effect = mtTaskRecordMapper.incrCompleteNum(record.getId(), dailyLimit, nowTime); + if (effect < 1) { + throw new BusinessCheckException("今日任务已达上限"); + } + MtTaskRecord latest = mtTaskRecordMapper.selectById(record.getId()); + return buildTaskProgress(taskInfo, latest); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Map claimTask(Integer merchantId, Integer storeId, Integer userId, Integer taskId, String operator) throws BusinessCheckException { + MtTask taskInfo = queryTaskByScope(merchantId, storeId, taskId); + if (taskInfo == null) { + throw new BusinessCheckException("任务不存在或已下线"); + } + int dailyLimit = taskInfo.getDailyLimit() == null ? 1 : taskInfo.getDailyLimit(); + int rewardPoint = taskInfo.getRewardPoint() == null ? 0 : taskInfo.getRewardPoint(); + if (rewardPoint <= 0) { + throw new BusinessCheckException("该任务未配置奖励积分"); + } + + String taskDate = DateUtil.getNow(DateUtil.PATTERN_ISO_DATE); + Date nowTime = new Date(); + MtTaskRecord record = getOrCreateRecord(merchantId, storeId, userId, taskId, taskDate, operator, nowTime); + int completeNum = record.getCompleteNum() == null ? 0 : record.getCompleteNum(); + int claimNum = record.getClaimNum() == null ? 0 : record.getClaimNum(); + + if (claimNum >= dailyLimit) { + throw new BusinessCheckException("今日奖励已领取完"); + } + if (claimNum >= completeNum) { + throw new BusinessCheckException("请先完成任务后再领取"); + } + + int nextClaimNum = claimNum + 1; + String orderSn = buildOrderSn(taskId, userId, taskDate, nextClaimNum); + LambdaQueryWrapper pointWrapper = Wrappers.lambdaQuery(); + pointWrapper.eq(MtPoint::getUserId, userId) + .eq(MtPoint::getOrderSn, orderSn) + .eq(MtPoint::getStatus, StatusEnum.ENABLED.getKey()); + MtPoint existed = mtPointMapper.selectOne(pointWrapper); + if (existed != null) { + if (claimNum < nextClaimNum) { + mtTaskRecordMapper.incrClaimNumIfMatch(record.getId(), claimNum, nowTime); + record = mtTaskRecordMapper.selectById(record.getId()); + } + return buildTaskProgress(taskInfo, record); + } + + int effect = mtTaskRecordMapper.incrClaimNumIfMatch(record.getId(), claimNum, nowTime); + if (effect < 1) { + MtTaskRecord latest = mtTaskRecordMapper.selectById(record.getId()); + int latestClaimNum = latest.getClaimNum() == null ? 0 : latest.getClaimNum(); + if (latestClaimNum >= nextClaimNum) { + return buildTaskProgress(taskInfo, latest); + } + throw new BusinessCheckException("领取过于频繁,请稍后重试"); + } + + // 幂等发积分:同任务同日期同轮次固定 orderSn,只会发一次 + pointWrapper = Wrappers.lambdaQuery(); + pointWrapper.eq(MtPoint::getUserId, userId) + .eq(MtPoint::getOrderSn, orderSn) + .eq(MtPoint::getStatus, StatusEnum.ENABLED.getKey()); + existed = mtPointMapper.selectOne(pointWrapper); + if (existed == null) { + MtPoint reqPointDto = new MtPoint(); + reqPointDto.setUserId(userId); + reqPointDto.setOrderSn(orderSn); + reqPointDto.setAmount(rewardPoint); + reqPointDto.setDescription("任务奖励:" + taskInfo.getTaskName() + " +" + rewardPoint + "积分"); + reqPointDto.setOperator(operator); + pointService.addPoint(reqPointDto); + } + + MtTaskRecord latest = mtTaskRecordMapper.selectById(record.getId()); + return buildTaskProgress(taskInfo, latest); + } + + private MtTask queryTaskByScope(Integer merchantId, Integer storeId, Integer taskId) { + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + wrapper.eq(MtTask::getId, taskId) + .eq(MtTask::getMerchantId, merchantId) + .eq(MtTask::getStatus, StatusEnum.ENABLED.getKey()); + if (storeId != null && storeId > 0) { + wrapper.and(wq -> wq.eq(MtTask::getStoreId, 0).or().eq(MtTask::getStoreId, storeId)); + } + return mtTaskMapper.selectOne(wrapper); + } + + private MtTaskRecord getOrCreateRecord(Integer merchantId, Integer storeId, Integer userId, Integer taskId, String taskDate, String operator, Date nowTime) { + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + wrapper.eq(MtTaskRecord::getMerchantId, merchantId) + .eq(MtTaskRecord::getTaskId, taskId) + .eq(MtTaskRecord::getUserId, userId) + .eq(MtTaskRecord::getTaskDate, taskDate) + .eq(MtTaskRecord::getStatus, StatusEnum.ENABLED.getKey()); + MtTaskRecord record = mtTaskRecordMapper.selectOne(wrapper); + if (record != null) { + return record; + } + MtTaskRecord insertItem = new MtTaskRecord(); + insertItem.setMerchantId(merchantId); + insertItem.setStoreId(storeId == null ? 0 : storeId); + insertItem.setTaskId(taskId); + insertItem.setUserId(userId); + insertItem.setTaskDate(taskDate); + insertItem.setCompleteNum(0); + insertItem.setClaimNum(0); + insertItem.setCreateTime(nowTime); + insertItem.setUpdateTime(nowTime); + insertItem.setOperator(operator); + insertItem.setStatus(StatusEnum.ENABLED.getKey()); + try { + mtTaskRecordMapper.insert(insertItem); + return insertItem; + } catch (Exception e) { + // 并发下可能已创建,回查最新记录 + return mtTaskRecordMapper.selectOne(wrapper); + } + } + + private String buildOrderSn(Integer taskId, Integer userId, String taskDate, Integer seq) { + return "TASK-" + taskId + "-" + userId + "-" + taskDate.replace("-", "") + "-" + seq; + } + + private Map buildTaskProgress(MtTask taskInfo, MtTaskRecord record) { + int completeNum = record == null || record.getCompleteNum() == null ? 0 : record.getCompleteNum(); + int claimNum = record == null || record.getClaimNum() == null ? 0 : record.getClaimNum(); + int dailyLimit = taskInfo.getDailyLimit() == null ? 1 : taskInfo.getDailyLimit(); + + Map result = new HashMap<>(); + result.put("taskId", taskInfo.getId()); + result.put("completeNum", completeNum); + result.put("claimNum", claimNum); + result.put("dailyLimit", dailyLimit); + result.put("canComplete", completeNum < dailyLimit); + result.put("canClaim", claimNum < completeNum); + result.put("finished", claimNum >= dailyLimit); + return result; + } +} diff --git a/fuint-application/src/main/java/com/fuint/module/backendApi/controller/BackendRaffleController.java b/fuint-application/src/main/java/com/fuint/module/backendApi/controller/BackendRaffleController.java new file mode 100644 index 0000000..c60b8ed --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/module/backendApi/controller/BackendRaffleController.java @@ -0,0 +1,315 @@ +package com.fuint.module.backendApi.controller; + +import com.alibaba.fastjson.JSONArray; +import com.fuint.common.Constants; +import com.fuint.common.dto.*; +import com.fuint.common.enums.*; +import com.fuint.common.param.RechargeParam; +import com.fuint.common.service.*; +import com.fuint.common.util.CommonUtil; +import com.fuint.common.util.TokenUtil; +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.framework.pagination.PaginationRequest; +import com.fuint.framework.pagination.PaginationResponse; +import com.fuint.framework.web.BaseController; +import com.fuint.framework.web.ResponseObject; +import com.fuint.repository.model.*; +import com.fuint.utils.StringUtil; +import io.swagger.annotations.Api; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletRequest; +import java.math.BigDecimal; +import java.util.*; + +/** + * 积分管理controller + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Api(tags="管理端-积分相关接口") +@RestController +@RequestMapping(value = "/backendApi/raffle") +public class BackendRaffleController extends BaseController { + + private static final Logger logger = LoggerFactory.getLogger(BackendRaffleController.class); + + /** + * 积分服务接口 + * */ + @Autowired + private RaffleService raffleService; + /** + * 系统设置服务接口 + * */ + @Autowired + private SettingService settingService; + + + /** + * 积分明细列表查询 + * + * @param request HttpServletRequest对象 + * @return 积分明细列表 + */ + @RequestMapping(value = "/list", method = RequestMethod.GET) + @CrossOrigin + public ResponseObject list(HttpServletRequest request) throws BusinessCheckException { + String token = request.getHeader("Access-Token"); + Integer page = request.getParameter("page") == null ? Constants.PAGE_NUMBER : Integer.parseInt(request.getParameter("page")); + Integer pageSize = request.getParameter("pageSize") == null ? Constants.PAGE_SIZE : Integer.parseInt(request.getParameter("pageSize")); + String status = request.getParameter("status") == null ? StatusEnum.ENABLED.getKey() : request.getParameter("status"); + String title = request.getParameter("title") == null ? "" : request.getParameter("title"); + + AccountInfo accountInfo = TokenUtil.getAccountInfoByToken(token); + if (accountInfo == null) { + return getFailureResult(1001, "请先登录"); + } + PaginationRequest paginationRequest = new PaginationRequest(); + paginationRequest.setCurrentPage(page); + paginationRequest.setPageSize(pageSize); + + Map searchParams = new HashMap<>(); + + if (StringUtil.isNotEmpty(status)) { + searchParams.put("status", status); + } + if (StringUtil.isNotEmpty(title)) { + searchParams.put("title", title); + } + + paginationRequest.setSearchParams(searchParams); + PaginationResponse paginationResponse = raffleService.queryListByPagination(paginationRequest); + + Map result = new HashMap<>(); + result.put("dataList", paginationResponse); + + String imagePath = settingService.getUploadBasePath(); + result.put("imagePath", imagePath); + + + return getSuccessResult(result); + } + + /** + * 提交保存 + * + * @param request HttpServletRequest对象 + * @return + */ + @RequestMapping(value = "/save", method = RequestMethod.POST) + @CrossOrigin + public ResponseObject saveRaffleHandler(HttpServletRequest request, @RequestBody Map param) throws BusinessCheckException { + String token = request.getHeader("Access-Token"); + String title = param.get("title") == null ? "" : param.get("title").toString(); + String brief = param.get("brief") == null ? "" : param.get("brief").toString(); + String status = param.get("status") == null ? "A" : param.get("status").toString(); + String image = param.get("image") == null ? "" : param.get("image").toString(); + String description = param.get("description") == null ? "A" : param.get("description").toString(); + Integer rafflePoint = param.get("rafflePoint") == null ? 0 : Integer.parseInt(param.get("rafflePoint").toString()); + List rafList = param.get("rafData") == null ? new ArrayList<>() : (List) param.get("rafData"); + + String extraImage = param.get("extraImage") == null ? "" : param.get("extraImage").toString(); + String extraType = param.get("extraType") == null ? "L" : param.get("extraType").toString(); + String extraPrize = param.get("extraPrize") == null ? "" : param.get("extraPrize").toString(); + + Integer forwardPoint = 0; + if (StringUtil.isEmpty(param.get("forwardPoint").toString())) { + forwardPoint = Integer.parseInt(param.get("forwardPoint").toString()); + } + String raffleType = param.get("raffleType") == null ? "pokemon" : param.get("raffleType").toString(); + + AccountInfo accountInfo = TokenUtil.getAccountInfoByToken(token); + if (accountInfo == null) { + return getFailureResult(1001, "请先登录"); + } + logger.info(JSONArray.toJSONString(param)); + + MtRaffle dto = new MtRaffle(); + dto.setRaffleType(raffleType); + dto.setTitle(title); + dto.setBrief(brief); + dto.setStatus(status); + dto.setImage(image); + dto.setDescription(description); + dto.setRafflePoint(rafflePoint); + dto.setOperator(accountInfo.getAccountName()); + dto.setCreateTime(new Date()); + + dto.setExtraImage(extraImage); + dto.setExtraType(extraType); + dto.setExtraPrize(extraPrize); + + dto.setForwardPoint(forwardPoint); + + raffleService.addRaffle(dto); + int allCnt = 0; + if (rafList.size() > 0) { + for (LinkedHashMap item: rafList) { + Integer num = Integer.parseInt(item.get("num").toString()); + String raffleTitle = item.get("title") == null ? "" : item.get("title").toString(); + String prize = item.get("prize") == null ? "" : item.get("prize").toString(); + Integer point = item.get("point") == null ? 0 : Integer.parseInt(item.get("point").toString()); + String raffleImage = item.get("image") == null ? "" : item.get("image").toString(); + allCnt = allCnt + num; + for (int i = 0; i < num; i++) { + MtRaffleItem raffleItem = new MtRaffleItem(); + raffleItem.setRaffleId(dto.getId()); + raffleItem.setPrize(prize); + raffleItem.setTitle(raffleTitle); + raffleItem.setPoint(point); + raffleItem.setImage(raffleImage); + raffleItem.setOperator(accountInfo.getAccountName()); + raffleItem.setPrizeType(PrizeTypeEnum.NORMAL.getKey()); + + raffleService.addRaffleItem(raffleItem); + } + } + } + dto.setNowCnt(0); + dto.setAllCnt(allCnt); + raffleService.updRaffle(dto); + + + return getSuccessResult(true); + } + + + /** + * 抽奖明细 + * + * @param request HttpServletRequest对象 + * @return + */ + @RequestMapping(value = "/detail", method = RequestMethod.GET) + @CrossOrigin + public ResponseObject detailRaffleHandler(HttpServletRequest request) throws BusinessCheckException { + String token = request.getHeader("Access-Token"); + + String raffleId = request.getParameter("raffleId") == null ? "" : request.getParameter("raffleId"); + String userId = request.getParameter("userId") == null ? "" : request.getParameter("userId"); + String win = request.getParameter("win") == null ? "" : request.getParameter("win"); + String deal = request.getParameter("deal") == null ? "" : request.getParameter("deal"); + String userNo = request.getParameter("userNo") == null ? "" : request.getParameter("userNo"); + + AccountInfo accountInfo = TokenUtil.getAccountInfoByToken(token); + if (accountInfo == null) { + return getFailureResult(1001, "请先登录"); + } + + RaffleItemDto raffleItemDto = new RaffleItemDto(); + if (StringUtil.isNotEmpty(raffleId)) { + raffleItemDto.setRaffleId(Integer.parseInt(raffleId)); + + } + if (StringUtil.isNotEmpty(userId)) { + raffleItemDto.setUserId(Integer.parseInt(userId)); + } + if (StringUtil.isNotEmpty(win)) { + raffleItemDto.setWin(Integer.parseInt(win)); + } + if (StringUtil.isNotEmpty(deal)) { + raffleItemDto.setDeal(Integer.parseInt(deal)); + } + if (StringUtil.isNotEmpty(userNo)) { + raffleItemDto.setUserNo(userNo); + } + logger.info("raffle detail condition: " + JSONArray.toJSONString(raffleItemDto)); + List raffleList = raffleService.queryRaffleItemByRaffleId(raffleItemDto); + + Map result = new HashMap<>(); + result.put("rafList", raffleList); + + String imagePath = settingService.getUploadBasePath(); + result.put("imagePath", imagePath); + + return getSuccessResult(result); + } + + /** + * 抽奖基础信息 + * + * @param request HttpServletRequest对象 + * @return + */ + @RequestMapping(value = "/info", method = RequestMethod.GET) + @CrossOrigin + public ResponseObject info(HttpServletRequest request) throws BusinessCheckException { + String token = request.getHeader("Access-Token"); + Integer id = request.getParameter("id") == null ? 0 : Integer.parseInt(request.getParameter("id")); + + AccountInfo accountInfo = TokenUtil.getAccountInfoByToken(token); + if (accountInfo == null) { + return getFailureResult(1001, "请先登录"); + } + MtRaffle raffle = raffleService.queryRaffle(id); + if (raffle == null) { + return getFailureResult(201, "抽奖不存在"); + } + + Map result = new HashMap<>(); + result.put("dataList", raffle); + String imagePath = settingService.getUploadBasePath(); + result.put("imagePath", imagePath); + + return getSuccessResult(result); + } + + @RequestMapping(value = "/deal", method = RequestMethod.GET) + @CrossOrigin + public ResponseObject deal(HttpServletRequest request) throws BusinessCheckException { + String token = request.getHeader("Access-Token"); + + Integer id = request.getParameter("id") == null ? 0 : Integer.parseInt(request.getParameter("id")); + + AccountInfo accountInfo = TokenUtil.getAccountInfoByToken(token); + if (accountInfo == null) { + return getFailureResult(1001, "请先登录"); + } + + logger.info("deal id: " + id); + raffleService.dealRaffleItem(id, accountInfo.getAccountName()); + + Map result = new HashMap<>(); + result.put("deal", "succ"); + + return getSuccessResult(result); + } + + /** + * 更新会员状态 + * + * @return + */ + @RequestMapping(value = "/change", method = RequestMethod.GET) + @CrossOrigin + public ResponseObject updateStatus(HttpServletRequest request) throws BusinessCheckException { + String token = request.getHeader("Access-Token"); + Integer id = request.getParameter("id") == null ? 0 : Integer.parseInt(request.getParameter("id").toString()); + String status = request.getParameter("status") == null ? StatusEnum.ENABLED.getKey() : request.getParameter("status").toString(); + + AccountInfo accountInfo = TokenUtil.getAccountInfoByToken(token); + if (accountInfo == null) { + return getFailureResult(1001, "请先登录"); + } + logger.info("changeStatus id="+id + " status=" + status); + MtRaffle raffle = raffleService.queryRaffle(id); + if (raffle == null) { + return getFailureResult(201, "抽奖不存在"); + } + MtRaffle updraffle = new MtRaffle(); + updraffle.setId(id); + updraffle.setStatus(status); + updraffle.setOperator(accountInfo.getAccountName()); + updraffle.setUpdateTime(new Date()); + raffleService.updRaffle(updraffle); + + return getSuccessResult(true); + } + + +} diff --git a/fuint-application/src/main/java/com/fuint/module/backendApi/controller/BackendRaffleTypeController.java b/fuint-application/src/main/java/com/fuint/module/backendApi/controller/BackendRaffleTypeController.java new file mode 100644 index 0000000..fe5ca58 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/module/backendApi/controller/BackendRaffleTypeController.java @@ -0,0 +1,145 @@ +package com.fuint.module.backendApi.controller; + +import com.fuint.common.dto.AccountInfo; +import com.fuint.common.dto.RaffleTypeDto; +import com.fuint.common.enums.StatusEnum; +import com.fuint.common.param.RaffleTypePage; +import com.fuint.common.service.RaffleTypeService; +import com.fuint.common.service.StoreService; +import com.fuint.common.util.TokenUtil; +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.framework.pagination.PaginationResponse; +import com.fuint.framework.web.BaseController; +import com.fuint.framework.web.ResponseObject; +import com.fuint.repository.model.MtRaffleType; +import com.fuint.repository.model.MtStore; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import org.springframework.beans.BeanUtils; +import org.springframework.web.bind.annotation.*; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 抽奖类型管理类controller + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Api(tags="管理端-抽奖类型相关接口") +@RestController +@AllArgsConstructor +@RequestMapping(value = "/backendApi/raffleType") +public class BackendRaffleTypeController extends BaseController { + + /** + * 抽奖类型服务接口 + */ + private RaffleTypeService raffleTypeService; + + /** + * 店铺服务接口 + */ + private StoreService storeService; + + /** + * 抽奖类型列表查询 + */ + @ApiOperation(value = "抽奖类型列表查询") + @RequestMapping(value = "/list", method = RequestMethod.GET) + @CrossOrigin + public ResponseObject list(@ModelAttribute RaffleTypePage page) throws BusinessCheckException { + AccountInfo accountInfo = TokenUtil.getAccountInfo(); + if (accountInfo.getMerchantId() != null && accountInfo.getMerchantId() > 0) { + page.setMerchantId(accountInfo.getMerchantId()); + } + if (accountInfo.getStoreId() != null && accountInfo.getStoreId() > 0) { + page.setStoreId(accountInfo.getStoreId()); + } + + PaginationResponse paginationResponse = raffleTypeService.queryRaffleTypeListByPagination(page); + List storeList = storeService.getMyStoreList(accountInfo.getMerchantId(), accountInfo.getStoreId(), StatusEnum.ENABLED.getKey()); + + Map result = new HashMap<>(); + result.put("dataList", paginationResponse); + result.put("storeList", storeList); + + return getSuccessResult(result); + } + + /** + * 更新抽奖类型状态 + */ + @ApiOperation(value = "更新抽奖类型状态") + @RequestMapping(value = "/updateStatus", method = RequestMethod.POST) + @CrossOrigin + public ResponseObject updateStatus(@RequestBody Map params) throws BusinessCheckException { + String status = params.get("status") != null ? params.get("status").toString() : StatusEnum.ENABLED.getKey(); + Integer typeId = params.get("typeId") == null ? 0 : Integer.parseInt(params.get("typeId").toString()); + + AccountInfo accountInfo = TokenUtil.getAccountInfo(); + MtRaffleType raffleType = raffleTypeService.getRaffleTypeById(typeId); + if (raffleType == null) { + return getFailureResult(201); + } + + raffleType.setOperator(accountInfo.getAccountName()); + raffleType.setStatus(status); + raffleTypeService.updateRaffleType(raffleType); + + return getSuccessResult(true); + } + + /** + * 保存抽奖类型 + */ + @ApiOperation(value = "保存抽奖类型") + @RequestMapping(value = "/save", method = RequestMethod.POST) + @CrossOrigin + public ResponseObject saveHandler(@RequestBody RaffleTypeDto raffleTypeDto) throws BusinessCheckException { + AccountInfo accountInfo = TokenUtil.getAccountInfo(); + if (accountInfo.getMerchantId() == null || accountInfo.getMerchantId() < 1) { + return getFailureResult(5002); + } + + MtRaffleType raffleType = new MtRaffleType(); + BeanUtils.copyProperties(raffleTypeDto, raffleType); + raffleType.setOperator(accountInfo.getAccountName()); + raffleType.setMerchantId(accountInfo.getMerchantId()); + if (accountInfo.getStoreId() != null && accountInfo.getStoreId() > 0) { + raffleType.setStoreId(accountInfo.getStoreId()); + } + if (raffleTypeDto.getId() != null && raffleTypeDto.getId() > 0) { + raffleTypeService.updateRaffleType(raffleType); + } else { + raffleTypeService.addRaffleType(raffleType); + } + + return getSuccessResult(true); + } + + /** + * 获取抽奖类型详情 + */ + @ApiOperation(value = "获取抽奖类型详情") + @RequestMapping(value = "/info/{id}", method = RequestMethod.GET) + @CrossOrigin + public ResponseObject info(@PathVariable("id") Integer id) throws BusinessCheckException { + AccountInfo accountInfo = TokenUtil.getAccountInfo(); + MtRaffleType raffleType = raffleTypeService.getRaffleTypeById(id); + + if (accountInfo.getMerchantId() != null && accountInfo.getMerchantId() > 0) { + if (raffleType != null && !raffleType.getMerchantId().equals(accountInfo.getMerchantId())) { + return getFailureResult(1004); + } + } + + Map result = new HashMap<>(); + result.put("raffleTypeInfo", raffleType); + + return getSuccessResult(result); + } +} diff --git a/fuint-application/src/main/java/com/fuint/module/backendApi/controller/BackendTaskController.java b/fuint-application/src/main/java/com/fuint/module/backendApi/controller/BackendTaskController.java new file mode 100644 index 0000000..4cc4df5 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/module/backendApi/controller/BackendTaskController.java @@ -0,0 +1,128 @@ +package com.fuint.module.backendApi.controller; + +import com.fuint.common.dto.AccountInfo; +import com.fuint.common.dto.TaskDto; +import com.fuint.common.enums.StatusEnum; +import com.fuint.common.param.TaskPage; +import com.fuint.common.service.StoreService; +import com.fuint.common.service.TaskService; +import com.fuint.common.util.TokenUtil; +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.framework.pagination.PaginationResponse; +import com.fuint.framework.web.BaseController; +import com.fuint.framework.web.ResponseObject; +import com.fuint.repository.model.MtStore; +import com.fuint.repository.model.MtTask; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 任务中心管理 controller + * + * Created by Codex + */ +@Api(tags = "管理端-任务中心相关接口") +@RestController +@AllArgsConstructor +@RequestMapping(value = "/backendApi/task") +public class BackendTaskController extends BaseController { + + private TaskService taskService; + + private StoreService storeService; + + @ApiOperation(value = "任务列表查询") + @RequestMapping(value = "/list", method = RequestMethod.GET) + @CrossOrigin + @PreAuthorize("@pms.hasPermission('content:task:index')") + public ResponseObject list(@ModelAttribute TaskPage taskPage) throws BusinessCheckException { + AccountInfo accountInfo = TokenUtil.getAccountInfo(); + if (accountInfo.getMerchantId() != null && accountInfo.getMerchantId() > 0) { + taskPage.setMerchantId(accountInfo.getMerchantId()); + } + if (accountInfo.getStoreId() != null && accountInfo.getStoreId() > 0) { + taskPage.setStoreId(accountInfo.getStoreId()); + } + + PaginationResponse paginationResponse = taskService.queryTaskListByPagination(taskPage); + List storeList = storeService.getMyStoreList(accountInfo.getMerchantId(), accountInfo.getStoreId(), StatusEnum.ENABLED.getKey()); + + Map result = new HashMap<>(); + result.put("dataList", paginationResponse); + result.put("storeList", storeList); + + return getSuccessResult(result); + } + + @ApiOperation(value = "获取任务详情") + @RequestMapping(value = "/info/{id}", method = RequestMethod.GET) + @CrossOrigin + @PreAuthorize("@pms.hasPermission('content:task:index')") + public ResponseObject info(@PathVariable("id") Integer id) throws BusinessCheckException { + AccountInfo accountInfo = TokenUtil.getAccountInfo(); + MtTask taskInfo = taskService.queryTaskById(id); + if (taskInfo == null) { + return getFailureResult(201); + } + if (accountInfo.getMerchantId() != null && accountInfo.getMerchantId() > 0 + && !taskInfo.getMerchantId().equals(accountInfo.getMerchantId())) { + return getFailureResult(1004); + } + + Map result = new HashMap<>(); + result.put("taskInfo", taskInfo); + return getSuccessResult(result); + } + + @ApiOperation(value = "保存任务") + @RequestMapping(value = "/save", method = RequestMethod.POST) + @CrossOrigin + @PreAuthorize("@pms.hasPermission('content:task:add') or @pms.hasPermission('content:task:edit')") + public ResponseObject saveHandler(@RequestBody TaskDto taskDto) throws BusinessCheckException { + AccountInfo accountInfo = TokenUtil.getAccountInfo(); + taskDto.setOperator(accountInfo.getAccountName()); + if (accountInfo.getMerchantId() != null && accountInfo.getMerchantId() > 0) { + taskDto.setMerchantId(accountInfo.getMerchantId()); + } + if (accountInfo.getStoreId() != null && accountInfo.getStoreId() > 0) { + taskDto.setStoreId(accountInfo.getStoreId()); + } + + if (taskDto.getId() != null && taskDto.getId() > 0) { + taskService.updateTask(taskDto); + } else { + taskService.addTask(taskDto); + } + return getSuccessResult(true); + } + + @ApiOperation(value = "更新任务状态") + @RequestMapping(value = "/updateStatus", method = RequestMethod.POST) + @CrossOrigin + @PreAuthorize("@pms.hasPermission('content:task:edit')") + public ResponseObject updateStatus(@RequestBody Map params) throws BusinessCheckException { + String status = params.get("status") != null ? params.get("status").toString() : StatusEnum.ENABLED.getKey(); + Integer id = params.get("id") == null ? 0 : Integer.parseInt(params.get("id").toString()); + + AccountInfo accountInfo = TokenUtil.getAccountInfo(); + MtTask taskInfo = taskService.queryTaskById(id); + if (taskInfo == null) { + return getFailureResult(201); + } + + TaskDto taskDto = new TaskDto(); + taskDto.setId(id); + taskDto.setOperator(accountInfo.getAccountName()); + taskDto.setStatus(status); + taskService.updateTask(taskDto); + + return getSuccessResult(true); + } +} diff --git a/fuint-application/src/main/java/com/fuint/module/clientApi/controller/ClientGrowController.java b/fuint-application/src/main/java/com/fuint/module/clientApi/controller/ClientGrowController.java new file mode 100644 index 0000000..a070117 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/module/clientApi/controller/ClientGrowController.java @@ -0,0 +1,162 @@ +package com.fuint.module.clientApi.controller; + +import com.fuint.common.Constants; +import com.fuint.common.dto.PointDto; +import com.fuint.common.dto.UserInfo; +import com.fuint.common.enums.StatusEnum; +import com.fuint.common.service.GrowService; +import com.fuint.common.service.PointService; +import com.fuint.common.util.DateUtil; +import com.fuint.common.util.TokenUtil; +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.framework.pagination.PaginationRequest; +import com.fuint.framework.pagination.PaginationResponse; +import com.fuint.framework.web.BaseController; +import com.fuint.framework.web.ResponseObject; +import com.fuint.repository.model.MtGrow; +import com.fuint.utils.StringUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletRequest; +import java.math.BigDecimal; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +/** + * 积分相关controller + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Api(tags="会员端-增长相关接口") +@RestController +@AllArgsConstructor +@RequestMapping(value = "/clientApi/grow") +public class ClientGrowController extends BaseController { + + private static final Logger logger = LoggerFactory.getLogger(ClientGrowController.class); + + /** + * 服务接口 + */ + private GrowService growService; + + /** + * 查询我的积分明细 + * + * @param request Request对象 + */ + @ApiOperation(value = "查询我的签到") + @RequestMapping(value = "/sign", method = RequestMethod.GET) + @CrossOrigin + public ResponseObject sign(HttpServletRequest request) throws BusinessCheckException { + String token = request.getHeader("Access-Token"); + + if (StringUtil.isEmpty(token)) { + return getFailureResult(1001); + } + + UserInfo mtUser = TokenUtil.getUserInfoByToken(token); + if (null == mtUser) { + return getFailureResult(1001); + }; + + MtGrow signInfo = growService.querySignInfo(mtUser.getId()); + + Map result = new HashMap<>(); + result.put("growId",signInfo.getId()); + if (signInfo.getSignTime() == null) { + result.put("isSign",false); + } else { + BigDecimal diff = DateUtil.getDiffDays(signInfo.getSignTime(), new Date()); + if (diff.intValue() == 0) { + result.put("isSign",true); + } else { + result.put("isSign",false); + } + } + + if (signInfo.getAdvNum() == null) { + result.put("advNum", 0); + } else { + result.put("advNum", signInfo.getAdvNum()); + } + result.put("advTotal",signInfo.getAdvTotal()); + result.put("growTotal",signInfo.getGrowTotal()); + result.put("growDisp",true); + + return getSuccessResult(result); + } + + /** + * 签到 + * + */ + @ApiOperation(value = "签到") + @RequestMapping(value = "/doSign", method = RequestMethod.GET) + @CrossOrigin + public ResponseObject doSign(HttpServletRequest request) { + String token = request.getHeader("Access-Token"); + if (StringUtil.isEmpty(token)) { + return getFailureResult(1001); + } + + UserInfo mtUser = TokenUtil.getUserInfoByToken(token); + if (null == mtUser) { + return getFailureResult(1001); + } + Integer growId = request.getParameter("growId") == null ? 0:Integer.parseInt(request.getParameter("growId")); +logger.info("dosign growid: " + growId); + try { + growService.doSign(growId); + + return getSuccessResult(true); + + } catch (BusinessCheckException e) { + return getFailureResult(3008, "失败"); + + } + + } + + /** + * 点击广告 + * + */ + @ApiOperation(value = "点击广告") + @RequestMapping(value = "/doAdv", method = RequestMethod.GET) + @CrossOrigin + public ResponseObject doAdv(HttpServletRequest request) { + String token = request.getHeader("Access-Token"); + + if (StringUtil.isEmpty(token)) { + return getFailureResult(1001); + } + Integer growId = request.getParameter("growId") == null ? 0:Integer.parseInt(request.getParameter("growId")); + + UserInfo mtUser = TokenUtil.getUserInfoByToken(token); + + if (null == mtUser) { + return getFailureResult(1001); + } + + logger.info("doAdv growid: " + growId); + + try { + growService.doAdv(growId); + + return getSuccessResult(true); + + } catch (BusinessCheckException e) { + return getFailureResult(3008, "失败"); + + } + + } +} diff --git a/fuint-application/src/main/java/com/fuint/module/clientApi/controller/ClientRaffleController.java b/fuint-application/src/main/java/com/fuint/module/clientApi/controller/ClientRaffleController.java new file mode 100644 index 0000000..ab883c5 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/module/clientApi/controller/ClientRaffleController.java @@ -0,0 +1,446 @@ +package com.fuint.module.clientApi.controller; + +import com.alibaba.fastjson.JSONArray; +import com.fuint.common.dto.OrderDto; +import com.fuint.common.dto.RaffleDto; +import com.fuint.common.dto.RaffleItemDto; +import com.fuint.common.dto.UserInfo; +import com.fuint.common.enums.OrderStatusEnum; +import com.fuint.common.enums.PayStatusEnum; +import com.fuint.common.enums.PayTypeEnum; +import com.fuint.common.enums.YesOrNoEnum; +import com.fuint.common.param.RaffleParam; +import com.fuint.common.param.RechargeParam; +import com.fuint.common.service.MemberService; +import com.fuint.common.service.OrderService; +import com.fuint.common.service.PaymentService; +import com.fuint.common.service.RaffleService; +import com.fuint.common.util.CommonUtil; +import com.fuint.common.util.TokenUtil; +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.framework.web.BaseController; +import com.fuint.framework.web.ResponseObject; +import com.fuint.repository.model.MtOrder; +import com.fuint.repository.model.MtRaffle; +import com.fuint.repository.model.MtRaffleItem; +import com.fuint.repository.model.MtUser; +import com.fuint.utils.StringUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletRequest; +import java.math.BigDecimal; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 抽奖相关controller + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Api(tags="会员端-抽奖相关接口") +@RestController +@RequestMapping(value = "/clientApi/raffle") +public class ClientRaffleController extends BaseController { + + private static final Logger logger = LoggerFactory.getLogger(ClientRaffleController.class); + + /** + * 抽奖服务接口 + */ + @Autowired + private RaffleService raffleService; + /** + * 订单服务接口 + * */ + @Autowired + private OrderService orderService; + + /** + * 会员服务接口 + */ + @Autowired + private MemberService memberService; + + + /** + * 支付服务接口 + * */ + @Autowired + private PaymentService paymentService; + + /** + * 查询我的积分明细 + * + * @param request Request对象 + */ + @ApiOperation(value = "抽奖列表") + @RequestMapping(value = "/list", method = RequestMethod.POST) + @CrossOrigin + public ResponseObject list(HttpServletRequest request, @RequestBody RaffleParam raffleParam) throws BusinessCheckException { + String token = request.getHeader("Access-Token"); + + logger.info("微信一番赏一览数据:" + JSONArray.toJSONString(raffleParam)); + + if (StringUtil.isEmpty(token)) { + return getFailureResult(1001); + } + + UserInfo mtUser = TokenUtil.getUserInfoByToken(token); + if (null == mtUser) { + return getFailureResult(1001); + } + + + ResponseObject rafList = raffleService.findRaffleList(raffleParam); + + return getSuccessResult(rafList.getData()); + + } + + /** + * 最新抽奖 + */ + @ApiOperation(value = "最新抽奖") + @RequestMapping(value = "/latest", method = RequestMethod.GET) + @CrossOrigin + public ResponseObject latest(HttpServletRequest request) throws BusinessCheckException { + String token = request.getHeader("Access-Token"); + + if (StringUtil.isEmpty(token)) { + return getFailureResult(1001); + } + + UserInfo mtUser = TokenUtil.getUserInfoByToken(token); + if (null == mtUser) { + return getFailureResult(1001); + } + + List list = raffleService.getLatestRaffles(5); + return getSuccessResult(list); + } + + /** + * 最新中奖 + */ + @ApiOperation(value = "最新中奖") + @RequestMapping(value = "/latestWins", method = RequestMethod.GET) + @CrossOrigin + public ResponseObject latestWins(HttpServletRequest request) throws BusinessCheckException { + String token = request.getHeader("Access-Token"); + + if (StringUtil.isEmpty(token)) { + return getFailureResult(1001); + } + + UserInfo mtUser = TokenUtil.getUserInfoByToken(token); + if (null == mtUser) { + return getFailureResult(1001); + } + + List list = raffleService.getLatestWinItems(20); + return getSuccessResult(list); + } + + /** + * 抽奖详情 + * + * @param request Request对象 + */ + @ApiOperation(value = "抽奖详情") + @RequestMapping(value = "/detail", method = RequestMethod.GET) + @CrossOrigin + public ResponseObject detailRaffle(HttpServletRequest request) { + String token = request.getHeader("Access-Token"); + + if (StringUtil.isEmpty(token)) { + return getFailureResult(1001); + } + + UserInfo mtUser = TokenUtil.getUserInfoByToken(token); + if (null == mtUser) { + return getFailureResult(1001); + } + Integer raffleId = request.getParameter("raffleId") == null ? 0:Integer.parseInt(request.getParameter("raffleId")); + + try { + Map result = new HashMap<>(); + + List detail = raffleService.queryRaffleItemByRaffleId2wechat(raffleId); + result.put("detail", detail); + + MtRaffle raffle = raffleService.queryRaffle(raffleId); + MtRaffle updClick = new MtRaffle(); + updClick.setId(raffle.getId()); + if (raffle.getClick() == null) { + updClick.setClick(1); + } else { + updClick.setClick(raffle.getClick() + 1); + } + updClick.setUpdateTime(raffle.getUpdateTime()); + raffleService.updRaffle(updClick); + result.put("raffle", raffle); + + Integer point = raffleService.userPoint(mtUser.getId()); + result.put("point", point); + + result.put("userId", mtUser.getId()); + + return getSuccessResult(result); + + } catch (BusinessCheckException e) { + return getFailureResult(3008, e.getMessage()); + } + } + + /** + * 抽一发 + * + * @param request Request对象 + */ + @ApiOperation(value = "抽一发") + @RequestMapping(value = "/doRaffle", method = RequestMethod.GET) + @CrossOrigin + public ResponseObject doRaffle(HttpServletRequest request) { + String token = request.getHeader("Access-Token"); + + if (StringUtil.isEmpty(token)) { + return getFailureResult(1001); + } + + UserInfo mtUser = TokenUtil.getUserInfoByToken(token); + if (null == mtUser) { + return getFailureResult(1001); + } + Integer raffleId = request.getParameter("raffleId") == null ? 0:Integer.parseInt(request.getParameter("raffleId")); + Integer num = request.getParameter("num") == null ? 0:Integer.parseInt(request.getParameter("num")); + + logger.info("抽一抽:"+raffleId+","+ num+"抽"); + + Integer forwardUserId = 0; + try { + forwardUserId = Integer.parseInt(request.getParameter("forwardUserId")); + } catch (NumberFormatException ne) { + logger.info("抽一抽 forwardUserId:"+forwardUserId); + } + logger.info("抽一抽转发人:"+forwardUserId); + + try { + List item = raffleService.doRaffleByRaffleId(raffleId, num, mtUser, forwardUserId); + Map result = new HashMap<>(); + result.put("stat", "yes"); + result.put("item", item); + + return getSuccessResult(result); + + } catch (BusinessCheckException e) { + return getFailureResult(3008, e.getMessage()); + } + } + + /** + * 排队 + * + * @param request Request对象 + */ + @ApiOperation(value = "排队") + @RequestMapping(value = "/doQueue", method = RequestMethod.GET) + @CrossOrigin + public ResponseObject doQueue(HttpServletRequest request) { + String token = request.getHeader("Access-Token"); + + if (StringUtil.isEmpty(token)) { + return getFailureResult(1001); + } + + UserInfo mtUser = TokenUtil.getUserInfoByToken(token); + if (null == mtUser) { + return getFailureResult(1001); + } + Integer raffleId = request.getParameter("raffleId") == null ? 0:Integer.parseInt(request.getParameter("raffleId")); + + try { + + MtRaffle raffle = raffleService.queryRaffle(raffleId); + + long diff = 1000; + if (raffle.getUserTime() != null) { + long userTIme = raffle.getUserTime().getTime(); + long now = new Date().getTime(); + diff = (now - userTIme)/1000; + } + logger.info("diff: " + diff); + Map result = new HashMap<>(); + if (diff <= 60) { + result.put("stat", "no"); + result.put("time", String.valueOf(60-diff)); + return getSuccessResult(result); + + } + + MtRaffle newRaffle = new MtRaffle(); + newRaffle.setId(raffleId); + newRaffle.setUserId(mtUser.getId()); + newRaffle.setUserTime(new Date()); + raffleService.updRaffle(newRaffle); + result.put("stat", "yes"); + result.put("time", "60"); + return getSuccessResult(result); + + + } catch (BusinessCheckException e) { + return getFailureResult(3008, e.getMessage()); + } + } + + + /** + * 背包 + * + * @param request Request对象 + */ + @ApiOperation(value = "背包") + @RequestMapping(value = "/findBag", method = RequestMethod.GET) + @CrossOrigin + public ResponseObject findBag(HttpServletRequest request) { + String token = request.getHeader("Access-Token"); + + if (StringUtil.isEmpty(token)) { + return getFailureResult(1001); + } + + UserInfo mtUser = TokenUtil.getUserInfoByToken(token); + if (null == mtUser) { + return getFailureResult(1001); + } + + try { + List items = raffleService.queryRaffleItemByUserId(mtUser.getId()); + + MtUser member = memberService.queryMemberById(mtUser.getId()); + Map result = new HashMap<>(); + result.put("item", items); + result.put("member", member); + + + return getSuccessResult(items); + + + } catch (BusinessCheckException e) { + return getFailureResult(3008, e.getMessage()); + } + } + + /** + * 转化积分 + * + * @param request Request对象 + */ + @ApiOperation(value = "转化积分") + @RequestMapping(value = "/sellPoint", method = RequestMethod.GET) + @CrossOrigin + public ResponseObject sellPoint(HttpServletRequest request) { + String token = request.getHeader("Access-Token"); + + if (StringUtil.isEmpty(token)) { + return getFailureResult(1001); + } + + UserInfo mtUser = TokenUtil.getUserInfoByToken(token); + if (null == mtUser) { + return getFailureResult(1001); + } + Integer raffleItemId = request.getParameter("raffleItemId") == null ? 0:Integer.parseInt(request.getParameter("raffleItemId")); + + try { + + boolean result = raffleService.tranfer2Point(raffleItemId,mtUser.getId()); + + return getSuccessResult(result); + + + } catch (BusinessCheckException e) { + return getFailureResult(3008, e.getMessage()); + } + } + + + /** + * 充值积分 + * */ + @RequestMapping(value = "/doCharge", method = RequestMethod.POST) + @CrossOrigin + public ResponseObject doCharge(HttpServletRequest request, @RequestBody RechargeParam rechargeParam) throws BusinessCheckException { + Integer storeId = request.getHeader("storeId") == null ? 0 : Integer.parseInt(request.getHeader("storeId")); + String platform = request.getHeader("platform") == null ? "" : request.getHeader("platform"); + + String token = request.getHeader("Access-Token"); + if (StringUtil.isEmpty(token)) { + return getFailureResult(1001); + } + + UserInfo userInfo = TokenUtil.getUserInfoByToken(token); + if (null == userInfo) { + return getFailureResult(1001); + } + + String rechargeAmount = rechargeParam.getRechargeAmount() == null ? "" : rechargeParam.getRechargeAmount(); + String customAmount = rechargeParam.getCustomAmount() == null ? "" : rechargeParam.getCustomAmount(); + if (StringUtil.isEmpty(rechargeAmount) && StringUtil.isEmpty(customAmount)) { + return getFailureResult(2000, "请确认充值金额"); + } + logger.info("rechargeAmount: " + rechargeAmount); + logger.info("customAmount: " + customAmount); + + String ruleParam = ""; + // 自定义充值没有赠送金额 + if (StringUtil.isEmpty(rechargeAmount)) { + ruleParam = customAmount + "_0"; + } + + BigDecimal amount = new BigDecimal(customAmount); + logger.info("amount: " + amount); + + OrderDto orderDto = new OrderDto(); + orderDto.setType("pointChange"); + orderDto.setUserId(userInfo.getId()); + orderDto.setStoreId(storeId); + orderDto.setAmount(amount); + orderDto.setUsePoint(0); + orderDto.setRemark("积分充值"); + orderDto.setParam(ruleParam); + orderDto.setStatus(OrderStatusEnum.CREATED.getKey()); + orderDto.setPayStatus(PayStatusEnum.WAIT.getKey()); + orderDto.setPointAmount(new BigDecimal("0")); + orderDto.setOrderMode(""); + orderDto.setCouponId(0); + orderDto.setPlatform(platform); + + MtOrder orderInfo = orderService.saveOrder(orderDto); + + MtUser mtUser = memberService.queryMemberById(userInfo.getId()); + + String ip = CommonUtil.getIPFromHttpRequest(request); + BigDecimal pay = amount.multiply(new BigDecimal("100")); + orderInfo.setPayType(PayTypeEnum.JSAPI.getKey()); + ResponseObject paymentInfo = paymentService.createPrepayOrder(mtUser, orderInfo, (pay.intValue()), "", 0, ip, platform, YesOrNoEnum.YES.getKey()); + if (paymentInfo.getData() == null) { + return getFailureResult(201, "抱歉,发起支付失败"); + } + + Object payment = paymentInfo.getData(); + + Map data = new HashMap(); + data.put("payment", payment); + data.put("orderInfo", orderInfo); + + return getSuccessResult(data); + } +} diff --git a/fuint-application/src/main/java/com/fuint/module/clientApi/controller/ClientRaffleTypeController.java b/fuint-application/src/main/java/com/fuint/module/clientApi/controller/ClientRaffleTypeController.java new file mode 100644 index 0000000..cb263da --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/module/clientApi/controller/ClientRaffleTypeController.java @@ -0,0 +1,65 @@ +package com.fuint.module.clientApi.controller; + +import com.fuint.common.service.MerchantService; +import com.fuint.common.service.RaffleTypeService; +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.framework.web.BaseController; +import com.fuint.framework.web.ResponseObject; +import com.fuint.repository.model.MtRaffleType; +import com.fuint.utils.StringUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import org.springframework.web.bind.annotation.CrossOrigin; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.http.HttpServletRequest; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 抽奖类型controller + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Api(tags="会员端-抽奖类型相关接口") +@RestController +@AllArgsConstructor +@RequestMapping(value = "/clientApi/raffleType") +public class ClientRaffleTypeController extends BaseController { + + /** + * 抽奖类型服务接口 + */ + private RaffleTypeService raffleTypeService; + + /** + * 商户服务接口 + */ + private MerchantService merchantService; + + /** + * 抽奖类型列表 + */ + @ApiOperation(value = "抽奖类型列表") + @RequestMapping(value = "/list", method = RequestMethod.GET) + @CrossOrigin + public ResponseObject list(HttpServletRequest request) throws BusinessCheckException { + String merchantNo = request.getHeader("merchantNo") == null ? "" : request.getHeader("merchantNo"); + Integer storeId = StringUtil.isEmpty(request.getHeader("storeId")) ? 0 : Integer.parseInt(request.getHeader("storeId")); + + Integer merchantId = 0; + if (StringUtil.isNotEmpty(merchantNo)) { + merchantId = merchantService.getMerchantId(merchantNo); + } + + List typeList = raffleTypeService.getAvailableRaffleType(merchantId, storeId); + Map result = new HashMap<>(); + result.put("typeList", typeList); + return getSuccessResult(result); + } +} diff --git a/fuint-application/src/main/java/com/fuint/module/clientApi/controller/ClientTaskController.java b/fuint-application/src/main/java/com/fuint/module/clientApi/controller/ClientTaskController.java new file mode 100644 index 0000000..170d4f1 --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/module/clientApi/controller/ClientTaskController.java @@ -0,0 +1,113 @@ +package com.fuint.module.clientApi.controller; + +import com.fuint.common.dto.UserInfo; +import com.fuint.common.service.MerchantService; +import com.fuint.common.service.TaskService; +import com.fuint.common.util.TokenUtil; +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.framework.web.BaseController; +import com.fuint.framework.web.ResponseObject; +import com.fuint.utils.StringUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import org.springframework.web.bind.annotation.CrossOrigin; +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; + +import javax.servlet.http.HttpServletRequest; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 任务中心接口 controller + * + * Created by Codex + */ +@Api(tags = "会员端-任务中心相关接口") +@RestController +@AllArgsConstructor +@RequestMapping(value = "/clientApi/task") +public class ClientTaskController extends BaseController { + + private TaskService taskService; + + private MerchantService merchantService; + + @ApiOperation(value = "任务列表") + @RequestMapping(value = "/list", method = RequestMethod.GET) + @CrossOrigin + public ResponseObject list(HttpServletRequest request) throws BusinessCheckException { + String merchantNo = request.getHeader("merchantNo") == null ? "" : request.getHeader("merchantNo"); + Integer storeId = StringUtil.isEmpty(request.getHeader("storeId")) ? 0 : Integer.parseInt(request.getHeader("storeId")); + UserInfo userInfo = TokenUtil.getUserInfo(); + Integer userId = userInfo == null ? 0 : userInfo.getId(); + + Integer merchantId = merchantService.getMerchantId(merchantNo); + if (merchantId <= 0) { + return getFailureResult(201, "商户信息异常"); + } + + List> taskList = taskService.queryClientTaskList(merchantId, storeId, userId); + int totalDailyPoints = 0; + for (Map task : taskList) { + int rewardPoint = task.get("rewardPoint") == null ? 0 : Integer.parseInt(task.get("rewardPoint").toString()); + int dailyLimit = task.get("dailyLimit") == null ? 1 : Integer.parseInt(task.get("dailyLimit").toString()); + totalDailyPoints += rewardPoint * dailyLimit; + } + + Map outParams = new HashMap<>(); + outParams.put("taskList", taskList); + outParams.put("totalDailyPoints", totalDailyPoints); + return getSuccessResult(outParams); + } + + @ApiOperation(value = "完成任务") + @RequestMapping(value = "/complete", method = RequestMethod.POST) + @CrossOrigin + public ResponseObject complete(HttpServletRequest request, @RequestBody Map param) throws BusinessCheckException { + UserInfo userInfo = TokenUtil.getUserInfo(); + if (userInfo == null) { + return getFailureResult(1001); + } + String merchantNo = request.getHeader("merchantNo") == null ? "" : request.getHeader("merchantNo"); + Integer storeId = StringUtil.isEmpty(request.getHeader("storeId")) ? 0 : Integer.parseInt(request.getHeader("storeId")); + Integer taskId = param.get("taskId") == null ? 0 : Integer.parseInt(param.get("taskId").toString()); + if (taskId <= 0) { + return getFailureResult(201, "任务ID不能为空"); + } + Integer merchantId = merchantService.getMerchantId(merchantNo); + if (merchantId <= 0) { + return getFailureResult(201, "商户信息异常"); + } + + Map result = taskService.completeTask(merchantId, storeId, userInfo.getId(), taskId, "USER"); + return getSuccessResult(result); + } + + @ApiOperation(value = "领取任务奖励") + @RequestMapping(value = "/claim", method = RequestMethod.POST) + @CrossOrigin + public ResponseObject claim(HttpServletRequest request, @RequestBody Map param) throws BusinessCheckException { + UserInfo userInfo = TokenUtil.getUserInfo(); + if (userInfo == null) { + return getFailureResult(1001); + } + String merchantNo = request.getHeader("merchantNo") == null ? "" : request.getHeader("merchantNo"); + Integer storeId = StringUtil.isEmpty(request.getHeader("storeId")) ? 0 : Integer.parseInt(request.getHeader("storeId")); + Integer taskId = param.get("taskId") == null ? 0 : Integer.parseInt(param.get("taskId").toString()); + if (taskId <= 0) { + return getFailureResult(201, "任务ID不能为空"); + } + Integer merchantId = merchantService.getMerchantId(merchantNo); + if (merchantId <= 0) { + return getFailureResult(201, "商户信息异常"); + } + + Map result = taskService.claimTask(merchantId, storeId, userInfo.getId(), taskId, "USER"); + return getSuccessResult(result); + } +} diff --git a/fuint-application/src/main/java/com/fuint/module/schedule/GrowJob.java b/fuint-application/src/main/java/com/fuint/module/schedule/GrowJob.java new file mode 100644 index 0000000..cdb15bc --- /dev/null +++ b/fuint-application/src/main/java/com/fuint/module/schedule/GrowJob.java @@ -0,0 +1,52 @@ +package com.fuint.module.schedule; + +import com.fuint.common.enums.PayStatusEnum; +import com.fuint.common.service.CommissionLogService; +import com.fuint.common.service.GrowService; +import com.fuint.common.service.OrderService; +import com.fuint.common.util.DateUtil; +import com.fuint.framework.exception.BusinessCheckException; +import com.fuint.repository.model.MtOrder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.env.Environment; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; + +/** + * 定时任务 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@EnableScheduling +@Component("GrowJob") +public class GrowJob { + + private Logger logger = LoggerFactory.getLogger(GrowJob.class); + + /** + * 系统环境变量 + * */ + @Autowired + private Environment environment; + + @Autowired + private GrowService growService; + + @Scheduled(cron = "${grow.job.time}") + @Transactional(rollbackFor = Exception.class) + public void dealGrow() throws BusinessCheckException { + String theSwitch = environment.getProperty("grow.job.switch"); + if (theSwitch != null && theSwitch.equals("1")) { + logger.info("GrowJobStart!!!"); + growService.clearAdvNum(); + logger.info("GrowJobEnd!!!"); + } + } +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/mapper/MtGrowMapper.java b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtGrowMapper.java new file mode 100644 index 0000000..44d2582 --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtGrowMapper.java @@ -0,0 +1,20 @@ +package com.fuint.repository.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.fuint.repository.model.MtGrow; +import org.apache.ibatis.annotations.Insert; +import org.apache.ibatis.annotations.SelectKey; + +/** + * 积分变化表 Mapper 接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface MtGrowMapper extends BaseMapper { + + @Insert("insert into mt_grow values (#{id},#{userId},#{signTime},#{consecutiveDays},#{createTime},#{updateTime},#{operator},#{status},#{advNum},#{advTotal},#{growTotal})") + @SelectKey(statement="select last_insert_id() from dual",before=false, + resultType = Integer.class, keyColumn="id",keyProperty = "id") + int insertForId(MtGrow signInfo); +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/mapper/MtRaffleItemMapper.java b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtRaffleItemMapper.java new file mode 100644 index 0000000..a4aa8a3 --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtRaffleItemMapper.java @@ -0,0 +1,23 @@ +package com.fuint.repository.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.fuint.repository.model.MtRaffle; +import com.fuint.repository.model.MtRaffleItem; +import org.apache.ibatis.annotations.Param; + +import java.util.Date; +import java.util.List; + +/** + * 会员个人信息 Mapper 接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface MtRaffleItemMapper extends BaseMapper { + public List queryListByRaffleId(@Param("raffleId") Integer raffleId); + + + public List queryUserIdByRaffleId(@Param("raffleId") Integer raffleId); + +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/mapper/MtRaffleMapper.java b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtRaffleMapper.java new file mode 100644 index 0000000..c985d1c --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtRaffleMapper.java @@ -0,0 +1,25 @@ +package com.fuint.repository.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.fuint.repository.model.MtRaffle; +import org.apache.ibatis.annotations.Insert; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.SelectKey; + +import java.util.Date; +import java.util.List; + +/** + * 会员个人信息 Mapper 接口 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public interface MtRaffleMapper extends BaseMapper { + @Insert("insert into mt_raffle values (#{id},#{raffleType},#{title},#{brief},#{hot},#{image},#{description},#{click}," + + "#{nowCnt},#{allCnt},#{extraPrize},#{extraImage},#{extraType},#{createTime},#{updateTime},#{operator}," + + "#{sort},#{status},#{rafflePoint},#{userId},#{userTime},#{forwardPoint})") + @SelectKey(statement="select last_insert_id() from dual",before=false, + resultType = Integer.class, keyColumn="id",keyProperty = "id") + int insertForId(MtRaffle mtRaffle); +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/mapper/MtRaffleTypeMapper.java b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtRaffleTypeMapper.java new file mode 100644 index 0000000..7b8db9f --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtRaffleTypeMapper.java @@ -0,0 +1,15 @@ +package com.fuint.repository.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.fuint.repository.model.MtRaffleType; +import org.apache.ibatis.annotations.Mapper; + +/** + * 抽奖类型 Mapper + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Mapper +public interface MtRaffleTypeMapper extends BaseMapper { +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/mapper/MtTaskMapper.java b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtTaskMapper.java new file mode 100644 index 0000000..24e5b2b --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtTaskMapper.java @@ -0,0 +1,12 @@ +package com.fuint.repository.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.fuint.repository.model.MtTask; + +/** + * 任务中心 Mapper 接口 + * + * Created by Codex + */ +public interface MtTaskMapper extends BaseMapper { +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/mapper/MtTaskRecordMapper.java b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtTaskRecordMapper.java new file mode 100644 index 0000000..19260db --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/mapper/MtTaskRecordMapper.java @@ -0,0 +1,24 @@ +package com.fuint.repository.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.fuint.repository.model.MtTaskRecord; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Update; + +import java.util.Date; + +/** + * 任务记录 Mapper 接口 + * + * Created by Codex + */ +public interface MtTaskRecordMapper extends BaseMapper { + + @Update("UPDATE mt_task_record SET COMPLETE_NUM = COMPLETE_NUM + 1, LAST_COMPLETE_TIME = #{now}, UPDATE_TIME = #{now} " + + "WHERE ID = #{id} AND COMPLETE_NUM < #{dailyLimit}") + int incrCompleteNum(@Param("id") Integer id, @Param("dailyLimit") Integer dailyLimit, @Param("now") Date now); + + @Update("UPDATE mt_task_record SET CLAIM_NUM = CLAIM_NUM + 1, LAST_CLAIM_TIME = #{now}, UPDATE_TIME = #{now} " + + "WHERE ID = #{id} AND CLAIM_NUM = #{oldClaimNum} AND CLAIM_NUM < COMPLETE_NUM") + int incrClaimNumIfMatch(@Param("id") Integer id, @Param("oldClaimNum") Integer oldClaimNum, @Param("now") Date now); +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/model/MtGrow.java b/fuint-repository/src/main/java/com/fuint/repository/model/MtGrow.java new file mode 100644 index 0000000..0d49b1f --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/model/MtGrow.java @@ -0,0 +1,61 @@ +package com.fuint.repository.model; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import java.io.Serializable; +import java.util.Date; + +/** + * 会员积分记录表 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Getter +@Setter +@TableName("mt_grow") +@ApiModel(value = "MtGrow对象", description = "签到记录表") +public class MtGrow implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("自增ID") + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty("用户 ID") + private Integer userId; + + @ApiModelProperty("签到日期") + private Date signTime; + + @ApiModelProperty("连续签到次数") + private Integer consecutiveDays; + + @ApiModelProperty("广告次数") + private Integer advNum; + + @ApiModelProperty("广告总次数") + private Integer advTotal; + + @ApiModelProperty("创建时间") + private Date createTime; + + @ApiModelProperty("更新时间") + private Date updateTime; + + @ApiModelProperty("最后操作人") + private String operator; + + @ApiModelProperty("状态,A正常;D作废") + private String status; + + @ApiModelProperty("成长积分") + private Integer growTotal; +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/model/MtRaffle.java b/fuint-repository/src/main/java/com/fuint/repository/model/MtRaffle.java new file mode 100644 index 0000000..fdd815c --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/model/MtRaffle.java @@ -0,0 +1,94 @@ +package com.fuint.repository.model; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + * 抽奖表 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Getter +@Setter +@TableName("mt_raffle") +@ApiModel(value = "MtRaffle对象", description = "抽奖表") +public class MtRaffle implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("自增ID") + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty("抽奖类型") + private String raffleType; + @ApiModelProperty("标题") + private String title; + + @ApiModelProperty("简介") + private String brief; + + @ApiModelProperty("热度") + private String hot; + + @ApiModelProperty("图片地址") + private String image; + + @ApiModelProperty("额外奖奖品") + private String extraPrize; + + @ApiModelProperty("额外奖图片") + private String extraImage; + + @ApiModelProperty("额外奖类型") + private String extraType; + + @ApiModelProperty("排队人") + private Integer userId; + + @ApiModelProperty("排队时间") + private Date userTime; + + @ApiModelProperty("已抽去数") + private Integer nowCnt; + + @ApiModelProperty("总数") + private Integer allCnt; + + @ApiModelProperty("抽奖积分") + private Integer rafflePoint; + + @ApiModelProperty("描述") + private String description; + + @ApiModelProperty("点击次数") + private Integer click; + + @ApiModelProperty("排序") + private Integer sort; + + @ApiModelProperty("创建时间") + private Date createTime; + + @ApiModelProperty("更新时间") + private Date updateTime; + + @ApiModelProperty("状态") + private String status; + + @ApiModelProperty("最后操作人") + private String operator; + + @ApiModelProperty("转发赠送积分") + private Integer forwardPoint; +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/model/MtRaffleItem.java b/fuint-repository/src/main/java/com/fuint/repository/model/MtRaffleItem.java new file mode 100644 index 0000000..0ff3f3d --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/model/MtRaffleItem.java @@ -0,0 +1,78 @@ +package com.fuint.repository.model; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import java.io.Serializable; +import java.util.Date; + +/** + * 抽奖表 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Getter +@Setter +@TableName("mt_raffle_item") +@ApiModel(value = "MtRaffleItem对象", description = "抽奖明细表") +public class MtRaffleItem implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("自增ID") + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty("抽奖表ID") + private Integer raffleId; + + @ApiModelProperty("抽奖项目") + private String title; + + @ApiModelProperty("抽奖奖品") + private String prize; + + @ApiModelProperty("积分价值") + private Integer point; + + @ApiModelProperty("中奖用户") + private Integer userId; + + @ApiModelProperty("会员号") + private String userNo; + + @ApiModelProperty("称呼") + private String name; + + @ApiModelProperty("图片") + private String image; + @ApiModelProperty("奖品状态") + private Integer win; + + @ApiModelProperty("领取状态") + private Integer deal; + + @ApiModelProperty("描述") + private String description; + + @ApiModelProperty("创建时间") + private Date createTime; + + @ApiModelProperty("更新时间") + private Date updateTime; + + @ApiModelProperty("最后操作人") + private String operator; + + @ApiModelProperty("转发人") + private Integer forwardUserId; + + @ApiModelProperty("奖品类型") + private String prizeType; +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/model/MtRaffleType.java b/fuint-repository/src/main/java/com/fuint/repository/model/MtRaffleType.java new file mode 100644 index 0000000..30ce0e7 --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/model/MtRaffleType.java @@ -0,0 +1,56 @@ +package com.fuint.repository.model; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + * 抽奖类型表 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +@Data +@TableName("mt_raffle_type") +@ApiModel(value = "MtRaffleType对象", description = "MtRaffleType表对象") +public class MtRaffleType implements Serializable { + + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty("商户ID") + private Integer merchantId; + + @ApiModelProperty("店铺ID") + private Integer storeId; + + @ApiModelProperty("类型编码") + private String code; + + @ApiModelProperty("类型名称") + private String name; + + @ApiModelProperty("备注") + private String description; + + @ApiModelProperty("排序") + private Integer sort; + + @ApiModelProperty("操作人") + private String operator; + + @ApiModelProperty("创建时间") + private Date createTime; + + @ApiModelProperty("更新时间") + private Date updateTime; + + @ApiModelProperty("状态") + private String status; +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/model/MtTask.java b/fuint-repository/src/main/java/com/fuint/repository/model/MtTask.java new file mode 100644 index 0000000..aa2112d --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/model/MtTask.java @@ -0,0 +1,70 @@ +package com.fuint.repository.model; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + * 任务中心配置 + * + * Created by Codex + */ +@Data +@TableName("mt_task") +@ApiModel(value = "MtTask对象", description = "MtTask表对象") +public class MtTask implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("自增ID") + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty("所属商户ID") + private Integer merchantId; + + @ApiModelProperty("所属店铺ID") + private Integer storeId; + + @ApiModelProperty("任务编码") + private String taskCode; + + @ApiModelProperty("任务名称") + private String taskName; + + @ApiModelProperty("任务类型") + private String taskType; + + @ApiModelProperty("任务描述") + private String taskDesc; + + @ApiModelProperty("任务跳转链接") + private String jumpUrl; + + @ApiModelProperty("奖励积分") + private Integer rewardPoint; + + @ApiModelProperty("每日可领取次数") + private Integer dailyLimit; + + @ApiModelProperty("排序") + private Integer sort; + + @ApiModelProperty("最后操作人") + private String operator; + + @ApiModelProperty("创建时间") + private Date createTime; + + @ApiModelProperty("更新时间") + private Date updateTime; + + @ApiModelProperty("状态,A正常;D删除") + private String status; +} diff --git a/fuint-repository/src/main/java/com/fuint/repository/model/MtTaskRecord.java b/fuint-repository/src/main/java/com/fuint/repository/model/MtTaskRecord.java new file mode 100644 index 0000000..5646171 --- /dev/null +++ b/fuint-repository/src/main/java/com/fuint/repository/model/MtTaskRecord.java @@ -0,0 +1,67 @@ +package com.fuint.repository.model; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + * 任务完成记录 + * + * Created by Codex + */ +@Data +@TableName("mt_task_record") +@ApiModel(value = "MtTaskRecord对象", description = "任务完成记录表") +public class MtTaskRecord implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("自增ID") + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty("商户ID") + private Integer merchantId; + + @ApiModelProperty("店铺ID") + private Integer storeId; + + @ApiModelProperty("任务ID") + private Integer taskId; + + @ApiModelProperty("会员ID") + private Integer userId; + + @ApiModelProperty("任务日期(yyyy-MM-dd)") + private String taskDate; + + @ApiModelProperty("完成次数") + private Integer completeNum; + + @ApiModelProperty("已领取次数") + private Integer claimNum; + + @ApiModelProperty("最近完成时间") + private Date lastCompleteTime; + + @ApiModelProperty("最近领取时间") + private Date lastClaimTime; + + @ApiModelProperty("创建时间") + private Date createTime; + + @ApiModelProperty("更新时间") + private Date updateTime; + + @ApiModelProperty("最后操作人") + private String operator; + + @ApiModelProperty("状态,A正常;D删除") + private String status; +} diff --git a/fuint-repository/src/main/resources/mapper/MtGrowMapper.xml b/fuint-repository/src/main/resources/mapper/MtGrowMapper.xml new file mode 100644 index 0000000..a7a1e96 --- /dev/null +++ b/fuint-repository/src/main/resources/mapper/MtGrowMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/fuint-repository/src/main/resources/mapper/MtRaffleItemMapper.xml b/fuint-repository/src/main/resources/mapper/MtRaffleItemMapper.xml new file mode 100644 index 0000000..3838cc0 --- /dev/null +++ b/fuint-repository/src/main/resources/mapper/MtRaffleItemMapper.xml @@ -0,0 +1,11 @@ + + + + + + + diff --git a/fuint-repository/src/main/resources/mapper/MtRaffleMapper.xml b/fuint-repository/src/main/resources/mapper/MtRaffleMapper.xml new file mode 100644 index 0000000..73c7481 --- /dev/null +++ b/fuint-repository/src/main/resources/mapper/MtRaffleMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/fuint-utils/src/main/java/com/fuint/utils/AESUtil.java b/fuint-utils/src/main/java/com/fuint/utils/AESUtil.java new file mode 100644 index 0000000..280acfb --- /dev/null +++ b/fuint-utils/src/main/java/com/fuint/utils/AESUtil.java @@ -0,0 +1,135 @@ +package com.fuint.utils; + +import com.sun.org.apache.xerces.internal.impl.dv.util.HexBin; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import java.io.UnsupportedEncodingException; +import java.security.InvalidKeyException; +import java.security.NoSuchAlgorithmException; +import java.security.SecureRandom; +import javax.crypto.*; +import javax.crypto.spec.SecretKeySpec; + +/** + * AES对称加/解密工具类 + * + * Created by FSQ + * CopyRight https://www.fuint.cn + */ +public class AESUtil { + private static final Logger logger = LoggerFactory.getLogger(AESUtil.class); + + //密钥生成算法 + private static String KEY_AES = "AES"; + + //密钥长度 + private static int KEY_LENGTH = 128; + + //默认字符集 + private static final String CHARSET = "UTF-8"; + + /** + * AES加密 + * + * @param data 待加密的内容 + * @param password 加密密码 + * @return byte[] + */ + public static String encrypt(byte[] data, String password) { + try { + SecretKeySpec key = getKey(password); + Cipher cipher = Cipher.getInstance(KEY_AES);// 创建密码器 + cipher.init(Cipher.ENCRYPT_MODE, key);// 初始化 + return HexBin.encode(cipher.doFinal(data)); + } catch (NoSuchAlgorithmException e) { + logger.error(e.getMessage(), e); + } catch (IllegalBlockSizeException e) { + logger.error(e.getMessage(), e); + } catch (InvalidKeyException e) { + logger.error(e.getMessage(), e); + } catch (BadPaddingException e) { + logger.error(e.getMessage(), e); + } catch (NoSuchPaddingException e) { + logger.error(e.getMessage(), e); + } + return null; + } + + /** + * AES加密 + * + * @param data 待加密的内容 + * @param password 加密密码 + * @return String + */ + public static String encrypt(String data, String password) { + try { + return encrypt(data.getBytes(CHARSET), password); + } catch (UnsupportedEncodingException e) { + logger.error(e.getMessage(), e); + } + return null; + } + + /** + * AES解密 + * + * @param data 待解密内容 + * @param password 解密密钥 + * @return byte[] + */ + public static byte[] decrypt(byte[] data, String password) { + try { + SecretKeySpec key = getKey(password); + Cipher cipher = Cipher.getInstance(KEY_AES);// 创建密码器 + cipher.init(Cipher.DECRYPT_MODE, key);// 初始化 + return cipher.doFinal(HexBin.decode(new String(data, CHARSET))); + } catch (NoSuchAlgorithmException e) { + logger.error(e.getMessage(), e); + } catch (IllegalBlockSizeException e) { + logger.error(e.getMessage(), e); + } catch (InvalidKeyException e) { + logger.error(e.getMessage(), e); + } catch (BadPaddingException e) { + logger.error(e.getMessage(), e); + } catch (NoSuchPaddingException e) { + logger.error(e.getMessage(), e); + } catch (UnsupportedEncodingException e) { + logger.error(e.getMessage(), e); + } + + return null; + } + + /** + * AES解密 + * + * @param data 待解密内容 + * @param password 解密密钥 + * @return String + */ + public static String decrypt(String data, String password) { + try { + byte[] bytes = decrypt(data.getBytes(CHARSET), password); + return new String(bytes, CHARSET); + } catch (UnsupportedEncodingException e) { + logger.error(e.getMessage(), e); + } + return null; + } + + /** + * 通过密码计算key + * + * @param password 对称密码 + * @return SecretKeySpec 计算的128位随机key + * @throws NoSuchAlgorithmException + */ + private static SecretKeySpec getKey(String password) throws NoSuchAlgorithmException { + KeyGenerator kgen = KeyGenerator.getInstance(KEY_AES); + kgen.init(KEY_LENGTH, new SecureRandom(password.getBytes())); + SecretKey secretKey = kgen.generateKey(); + byte[] enCodeFormat = secretKey.getEncoded(); + return new SecretKeySpec(enCodeFormat, KEY_AES); + } +} \ No newline at end of file diff --git a/fuint-utils/src/main/java/net/xpyun/platform/opensdk/service/PrintService.java b/fuint-utils/src/main/java/net/xpyun/platform/opensdk/service/PrintService.java new file mode 100644 index 0000000..6ac0202 --- /dev/null +++ b/fuint-utils/src/main/java/net/xpyun/platform/opensdk/service/PrintService.java @@ -0,0 +1,205 @@ +package net.xpyun.platform.opensdk.service; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.TypeReference; +import net.xpyun.platform.opensdk.util.HttpClientUtil; +import net.xpyun.platform.opensdk.vo.*; + +import java.util.List; + +/** + * 云打印相关接口封装类 + * @author JavaLyl + */ +public class PrintService { + + private static String BASE_URL = "https://open.xpyun.net/api/openapi"; + + /** + * 1.批量添加打印机 + * @param restRequest + * @return + */ + public ObjectRestResponse addPrinters(AddPrinterRequest restRequest) { + String url = BASE_URL + "/xprinter/addPrinters"; + String jsonRequest = JSON.toJSONString(restRequest); + String resp = HttpClientUtil.doPostJSON(url, jsonRequest); + ObjectRestResponse result = JSON.parseObject(resp, new TypeReference>(){}); + return result; + } + + /** + * 2.设置打印机语音类型 + * @param restRequest + * @return + */ + public ObjectRestResponse setPrinterVoiceType(SetVoiceTypeRequest restRequest) { + String url = BASE_URL + "/xprinter/setVoiceType"; + String jsonRequest = JSON.toJSONString(restRequest); + String resp = HttpClientUtil.doPostJSON(url, jsonRequest); + ObjectRestResponse result = JSON.parseObject(resp, new TypeReference>(){}); + return result; + } + + /** + * 3.打印小票订单 + * @param restRequest + * @return + */ + public ObjectRestResponse print(PrintRequest restRequest) { + String url = BASE_URL + "/xprinter/print"; + String jsonRequest = JSON.toJSONString(restRequest); + String resp = HttpClientUtil.doPostJSON(url, jsonRequest); + ObjectRestResponse result = JSON.parseObject(resp, new TypeReference>(){}); + return result; + } + + /** + * 4.打印标签订单 + * @param restRequest + * @return + */ + public ObjectRestResponse printLabel(PrintRequest restRequest) { + String url = BASE_URL + "/xprinter/printLabel"; + String jsonRequest = JSON.toJSONString(restRequest); + String resp = HttpClientUtil.doPostJSON(url, jsonRequest); + ObjectRestResponse result = JSON.parseObject(resp, new TypeReference>(){}); + return result; + } + + /** + * 5.批量删除打印机 + * @param restRequest + * @return + */ + public ObjectRestResponse delPrinters(DelPrinterRequest restRequest) { + String url = BASE_URL + "/xprinter/delPrinters"; + String jsonRequest = JSON.toJSONString(restRequest); + String resp = HttpClientUtil.doPostJSON(url, jsonRequest); + ObjectRestResponse result = JSON.parseObject(resp, new TypeReference>(){}); + return result; + } + + /** + * 6.修改打印机信息 + * @param restRequest + * @return + */ + public ObjectRestResponse updPrinter(UpdPrinterRequest restRequest) { + String url = BASE_URL + "/xprinter/updPrinter"; + String jsonRequest = JSON.toJSONString(restRequest); + String resp = HttpClientUtil.doPostJSON(url, jsonRequest); + ObjectRestResponse result = JSON.parseObject(resp, new TypeReference>(){}); + return result; + } + + /** + * 7.清空待打印队列 + * @param restRequest + * @return + */ + public ObjectRestResponse delPrinterQueue(PrinterRequest restRequest) { + String url = BASE_URL + "/xprinter/delPrinterQueue"; + String jsonRequest = JSON.toJSONString(restRequest); + String resp = HttpClientUtil.doPostJSON(url, jsonRequest); + ObjectRestResponse result = JSON.parseObject(resp, new TypeReference>(){}); + return result; + } + + /** + * 8.查询订单是否打印成功 + * @param restRequest + * @return + */ + public ObjectRestResponse queryOrderState(QueryOrderStateRequest restRequest) { + String url = BASE_URL + "/xprinter/queryOrderState"; + String jsonRequest = JSON.toJSONString(restRequest); + String resp = HttpClientUtil.doPostJSON(url, jsonRequest); + ObjectRestResponse result = JSON.parseObject(resp, new TypeReference>(){}); + return result; + } + + /** + * 9.查询打印机某天的订单统计数 + * @param restRequest + * @return + */ + public ObjectRestResponse queryOrderStatis(QueryOrderStatisRequest restRequest) { + String url = BASE_URL + "/xprinter/queryOrderStatis"; + String jsonRequest = JSON.toJSONString(restRequest); + String resp = HttpClientUtil.doPostJSON(url, jsonRequest); + ObjectRestResponse result = JSON.parseObject(resp, new TypeReference>(){}); + return result; + } + + /** + * 10.查询打印机状态 + * + * 0、离线 1、在线正常 2、在线不正常 + * 备注:异常一般是无纸,离线的判断是打印机与服务器失去联系超过30秒 + * @param restRequest + * @return + */ + public ObjectRestResponse queryPrinterStatus(PrinterRequest restRequest) { + String url = BASE_URL + "/xprinter/queryPrinterStatus"; + String jsonRequest = JSON.toJSONString(restRequest); + String resp = HttpClientUtil.doPostJSON(url, jsonRequest); + ObjectRestResponse result = JSON.parseObject(resp, new TypeReference>(){}); + return result; + } + + /** + * 10.批量查询打印机状态 + * + * 0、离线 1、在线正常 2、在线不正常 + * 备注:异常一般是无纸,离线的判断是打印机与服务器失去联系超过30秒 + * @param restRequest + * @return + */ + public ObjectRestResponse> queryPrintersStatus(PrintersRequest restRequest) { + String url = BASE_URL + "/xprinter/queryPrintersStatus"; + String jsonRequest = JSON.toJSONString(restRequest); + String resp = HttpClientUtil.doPostJSON(url, jsonRequest); + ObjectRestResponse> result = JSON.parseObject(resp, new TypeReference>>(){}); + return result; + } + + /** + * 11.云喇叭播放语音 + * @param restRequest + * @return + */ + public ObjectRestResponse playVoice(VoiceRequest restRequest) { + String url = BASE_URL + "/xprinter/playVoice"; + String jsonRequest = JSON.toJSONString(restRequest); + String resp = HttpClientUtil.doPostJSON(url, jsonRequest); + ObjectRestResponse result = JSON.parseObject(resp, new TypeReference>(){}); + return result; + } + + /** + * 12.POS指令 + * @param restRequest + * @return + */ + public ObjectRestResponse pos(PrintRequest restRequest) { + String url = BASE_URL + "/xprinter/pos"; + String jsonRequest = JSON.toJSONString(restRequest); + String resp = HttpClientUtil.doPostJSON(url, jsonRequest); + ObjectRestResponse result = JSON.parseObject(resp, new TypeReference>(){}); + return result; + } + /** + * 13.钱箱控制 + * @param restRequest + * @return + */ + public ObjectRestResponse controlBox(PrintRequest restRequest) { + String url = BASE_URL + "/xprinter/controlBox"; + String jsonRequest = JSON.toJSONString(restRequest); + String resp = HttpClientUtil.doPostJSON(url, jsonRequest); + ObjectRestResponse result = JSON.parseObject(resp, new TypeReference>(){}); + return result; + } + +} diff --git a/fuint-utils/src/main/java/net/xpyun/platform/opensdk/util/Config.java b/fuint-utils/src/main/java/net/xpyun/platform/opensdk/util/Config.java new file mode 100644 index 0000000..3a7f6b7 --- /dev/null +++ b/fuint-utils/src/main/java/net/xpyun/platform/opensdk/util/Config.java @@ -0,0 +1,46 @@ +package net.xpyun.platform.opensdk.util; + +import net.xpyun.platform.opensdk.vo.RestRequest; + +/** + * @author LylJavas + * @create 2021/2/26 15:14 + * @description 公共配置类 + */ +public class Config { + /** + * *必填*:开发者ID :芯烨云后台注册账号(即邮箱地址或开发者ID),开发者用户注册成功之后,登录芯烨云后台,在【个人中心=》账号信息】下可查看开发者ID + * + * 当前【xxxxxxxxxxxxxxx】只是样例,需修改再使用 + */ + public static final String USER_NAME = "zztect@163.com"; + /** + * *必填*:开发者密钥 :芯烨云后台注册账号后自动生成的开发者密钥,开发者用户注册成功之后,登录芯烨云后台,在【个人中心=》账号信息】下可查看开发者密钥 + * + * 当前【xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx】只是样例,需修改再使用 + */ + public static final String USER_KEY = "d963972a67dc4dbf820fab428ac851f8"; + /** + * *必填*:打印机设备编号,必须要在芯烨云管理后台的【打印管理->打印机管理】下添加打印机或调用API接口添加打印机,测试小票机和标签机的时候注意替换打印机编号 + * 打印机设备编号获取方式:在打印机底部会有带PID或SN字样的二维码且PID或SN后面的一串字符即为打印机编号 + * + * 当前【xxxxxxxxxxxxxxx】只是样例,需修改再使用,此处只是作为测试样例,所以打印机编号采用常量化,开发者可根据自己的实际需要进行变量化 + */ + public static final String OK_PRINTER_SN = "xxxxxxxxxxxxxxx"; + /** + * 生成通用的请求头 + * + * @param request 所有请求都必须传递的参数。 + */ + public static void createRequestHeader(RestRequest request) { + //*必填*:芯烨云平台注册用户名(开发者 ID) + request.setUser(USER_NAME); + //*必填*:当前UNIX时间戳 + request.setTimestamp(System.currentTimeMillis() + ""); + //*必填*:对参数 user + UserKEY + timestamp 拼接后(+号表示连接符)进行SHA1加密得到签名,值为40位小写字符串,其中 UserKEY 为用户开发者密钥 + request.setSign(HashSignUtil.sign(request.getUser() + USER_KEY + request.getTimestamp())); + + //debug=1返回非json格式的数据,仅测试时候使用 + request.setDebug("0"); + } +} diff --git a/fuint-utils/src/main/java/net/xpyun/platform/opensdk/util/HashSignUtil.java b/fuint-utils/src/main/java/net/xpyun/platform/opensdk/util/HashSignUtil.java new file mode 100644 index 0000000..cb8a2b2 --- /dev/null +++ b/fuint-utils/src/main/java/net/xpyun/platform/opensdk/util/HashSignUtil.java @@ -0,0 +1,49 @@ +package net.xpyun.platform.opensdk.util; + +import java.io.UnsupportedEncodingException; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.Formatter; + +/** + * 哈稀签名工具类 + * + * @author RabyGao + * @date Aug 9, 2019 + */ +public class HashSignUtil { + + /** + * 哈稀签名 + * @param signSource - 源字符串 + * @return + */ + public static String sign(String signSource) { + String signature = ""; + try { + MessageDigest crypt = MessageDigest.getInstance("SHA-1"); + crypt.reset(); + crypt.update(signSource.getBytes("UTF-8")); + signature = byteToHex(crypt.digest()); + } + catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + return signature; + } + + private static String byteToHex(final byte[] hash) { + Formatter formatter = new Formatter(); + for (byte b : hash) + { + formatter.format("%02x", b); + } + String result = formatter.toString(); + formatter.close(); + return result; + } + +} diff --git a/fuint-utils/src/main/java/net/xpyun/platform/opensdk/util/HttpClientUtil.java b/fuint-utils/src/main/java/net/xpyun/platform/opensdk/util/HttpClientUtil.java new file mode 100644 index 0000000..534580f --- /dev/null +++ b/fuint-utils/src/main/java/net/xpyun/platform/opensdk/util/HttpClientUtil.java @@ -0,0 +1,274 @@ +package net.xpyun.platform.opensdk.util; + +import org.apache.http.HttpEntity; +import org.apache.http.HttpResponse; +import org.apache.http.NameValuePair; +import org.apache.http.client.ClientProtocolException; +import org.apache.http.client.ResponseHandler; +import org.apache.http.client.config.RequestConfig; +import org.apache.http.client.entity.UrlEncodedFormEntity; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.message.BasicNameValuePair; +import org.apache.http.util.EntityUtils; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.util.*; + +/** + * 基于 apache httpClient4.5 的HTTP工具类 + * + * @author RabyGao + * @date Aug 9, 2019 + */ +public class HttpClientUtil { + + public static String doGet(String url) { + return doGet(url, null); + } + + public static String doGet(String url, Map headers) { + CloseableHttpClient httpClient = null; + CloseableHttpResponse response = null; + String result = ""; + try { + // 通过址默认配置创建一个httpClient实例 + httpClient = HttpClients.createDefault(); + // 创建httpGet远程连接实例 + HttpGet httpGet = new HttpGet(url); + if (headers != null && headers.size() > 0) { + for(Map.Entry entry : headers.entrySet()){ + httpGet.addHeader(entry.getKey(), entry.getValue()); + } + } + // 设置配置请求参数 + // 连接主机服务超时时间、请求超时时间、数据读取超时时间 + RequestConfig requestConfig = RequestConfig.custom() + .setConnectTimeout(5000).setConnectionRequestTimeout(5000).setSocketTimeout(10000) + .build(); + // 为httpGet实例设置配置 + httpGet.setConfig(requestConfig); + // 执行get请求得到返回对象 + response = httpClient.execute(httpGet); + // 通过返回对象获取返回数据 + HttpEntity entity = response.getEntity(); + // 通过EntityUtils中的toString方法将结果转换为字符串 + result = EntityUtils.toString(entity); + } catch (ClientProtocolException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } finally { + // 关闭资源 + if (null != response) { + try { + response.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (null != httpClient) { + try { + httpClient.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return result; + } + + public static String doPost(String url, Map paramMap) { + return doPost(url, paramMap, null); + } + + public static String doPost(String url, Map paramMap, Map headers) { + return doPost(url, paramMap, headers, "application/x-www-form-urlencoded", "UTF-8"); + } + + public static String doPost(String url, Map paramMap, Map headers, String contentType, String charset) { + CloseableHttpClient httpClient = null; + CloseableHttpResponse httpResponse = null; + String result = ""; + // 创建httpClient实例 + httpClient = HttpClients.createDefault(); + // 创建httpPost远程连接实例 + HttpPost httpPost = new HttpPost(url); + // 配置请求参数实例 + // 连接主机服务超时时间、请求超时时间、数据读取超时时间 + RequestConfig requestConfig = RequestConfig.custom() + .setConnectTimeout(5000).setConnectionRequestTimeout(5000).setSocketTimeout(10000) + .build(); + // 为httpPost实例设置配置 + httpPost.setConfig(requestConfig); + + // 设置请求头 + httpPost.addHeader("Content-Type", contentType); + if (headers != null && headers.size() > 0) { + for(Map.Entry entry : headers.entrySet()){ + httpPost.addHeader(entry.getKey(), entry.getValue()); + } + } + + // 封装post请求参数 + if (null != paramMap && paramMap.size() > 0) { + List nvps = new ArrayList(); + // 通过map集成entrySet方法获取entity + Set> entrySet = paramMap.entrySet(); + // 循环遍历,获取迭代器 + Iterator> iterator = entrySet.iterator(); + while (iterator.hasNext()) { + Map.Entry mapEntry = iterator.next(); + nvps.add(new BasicNameValuePair(mapEntry.getKey(), mapEntry.getValue().toString())); + } + + // 为httpPost设置封装好的请求参数 + try { + httpPost.setEntity(new UrlEncodedFormEntity(nvps, charset)); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + } + try { + // httpClient对象执行post请求,并返回响应参数对象 + httpResponse = httpClient.execute(httpPost); + // 从响应对象中获取响应内容 + HttpEntity entity = httpResponse.getEntity(); + result = EntityUtils.toString(entity); + } catch (ClientProtocolException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } finally { + // 关闭资源 + if (null != httpResponse) { + try { + httpResponse.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (null != httpClient) { + try { + httpClient.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return result; + } + + public static String doPostJSON(String url, String json) { + return doPostJSON(url, json, null); + } + + public static String doPostJSON(String url, String json, Map headers) { + CloseableHttpClient httpClient = null; + try { + httpClient = HttpClients.createDefault(); + HttpPost httpPost = new HttpPost(url); + RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(5000).setConnectionRequestTimeout(5000).setSocketTimeout(10000).build(); + // 为httpPost实例设置配置 + httpPost.setConfig(requestConfig); + + // 设置请求头 + httpPost.addHeader("Content-Type", "application/json;charset=UTF-8"); + if (headers != null && headers.size() > 0) { + for (String key:headers.keySet()) { + httpPost.addHeader(key, headers.get(key)); + } + } + + // 解决中文乱码问题 + StringEntity stringEntity = new StringEntity(json, "UTF-8"); + stringEntity.setContentEncoding("UTF-8"); + httpPost.setEntity(stringEntity); + + ResponseHandler responseHandler = new ResponseHandler() { + @Override + public String handleResponse(final HttpResponse response) + throws ClientProtocolException, IOException { + int status = response.getStatusLine().getStatusCode(); + if (status >= 200 && status < 300) { + HttpEntity entity = response.getEntity(); + return entity != null ? EntityUtils.toString(entity) : null; + } else { + throw new ClientProtocolException("Unexpected response status: " + status); + } + } + }; + return httpClient.execute(httpPost, responseHandler); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (httpClient != null) { + try { + httpClient.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return null; + } + + public static String doPostGetLocation(String url, Map paramMap) { + CloseableHttpResponse httpResponse = null; + CloseableHttpClient httpClient = HttpClients.createDefault(); + HttpPost httpPost = new HttpPost(url); + RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(5000).setConnectionRequestTimeout(5000).setSocketTimeout(10000).build(); + // 为httpPost实例设置配置 + httpPost.setConfig(requestConfig); + httpPost.addHeader("Content-Type", "application/x-www-form-urlencoded"); + // 封装post请求参数 + if (null != paramMap && paramMap.size() > 0) { + List nvps = new ArrayList(); + Set> entrySet = paramMap.entrySet(); + Iterator> iterator = entrySet.iterator(); + while (iterator.hasNext()) { + Map.Entry mapEntry = iterator.next(); + nvps.add(new BasicNameValuePair(mapEntry.getKey(), mapEntry.getValue().toString())); + } + try { + httpPost.setEntity(new UrlEncodedFormEntity(nvps, "UTF-8")); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + } + + try { + // httpClient对象执行post请求,并返回响应参数对象 + httpResponse = httpClient.execute(httpPost); + if (httpResponse.getStatusLine().getStatusCode() == 302 && httpResponse.getHeaders("Location").length > 0) { + return httpResponse.getHeaders("Location")[0].getValue(); + } + } catch (ClientProtocolException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } finally { + // 关闭资源 + if (null != httpResponse) { + try { + httpResponse.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (null != httpClient) { + try { + httpClient.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return null; + } + +} diff --git a/fuint-utils/src/main/java/net/xpyun/platform/opensdk/util/NoteFormatter.java b/fuint-utils/src/main/java/net/xpyun/platform/opensdk/util/NoteFormatter.java new file mode 100644 index 0000000..1ab2265 --- /dev/null +++ b/fuint-utils/src/main/java/net/xpyun/platform/opensdk/util/NoteFormatter.java @@ -0,0 +1,278 @@ +package net.xpyun.platform.opensdk.util; + +import org.apache.commons.lang.StringUtils; + +import java.io.UnsupportedEncodingException; +import java.text.DecimalFormat; + +/** + * @author LylJavas + * @create 2021/2/26 15:16 + * @description 小票格式化器 + */ +public class NoteFormatter { + /** + * 58mm 系列打印机每行可以打印的字符数 + */ + private static final Integer ROW_MAX_CHAR_LEN = 32; + private static final Integer MAX_NAME_CHAR_LEN = 20; + private static final Integer LAST_ROW_MAX_NAME_CHAR_LEN = 9; + private static final Integer MAX_QUANTITY_CHAR_LEN = 6; + private static final Integer MAX_PRICE_CHAR_LEN = 6; + + /** + * 80mm 系列打印机每行可以打印的字符数 + */ + private static final Integer ROW_MAX_CHAR_LEN80 = 48; + private static final Integer MAX_NAME_CHAR_LEN80 = 36; + private static final Integer LAST_ROW_MAX_NAME_CHAR_LEN80 = 17; + private static final Integer MAX_QUANTITY_CHAR_LEN80 = 6; + private static final Integer MAX_PRICE_CHAR_LEN80 = 6; + private static String orderNameEmpty = StringUtils.repeat(" ", MAX_NAME_CHAR_LEN); + + /** + * 格式化订单数据 80mm打印机使用 + * + * @param foodName + * @param quantity + * @param price + * @return + * @throws Exception + */ + public static String formatPrintOrderItemBy4Column(String foodName, Integer quantity, Double singlePrice, Double price) throws Exception { + StringBuilder builder = new StringBuilder(); + byte[] itemNames = foodName.getBytes("GBK"); + Integer mod = itemNames.length % ROW_MAX_CHAR_LEN; + String quanityStr = quantity.toString(); + byte[] itemQuans = quanityStr.getBytes("GBK"); + String priceStr = roundByTwo(price); + byte[] itemPrices = (priceStr).getBytes("GBK"); + + if (mod <= LAST_ROW_MAX_NAME_CHAR_LEN) { + builder.append("").append(foodName).append(""); + // 在同一行,留4个英文字符的空格 + //if in the same row, fill with 4 spaces at the end of name column + builder.append(StringUtils.repeat(" ", (MAX_NAME_CHAR_LEN - mod))); + builder.append(quanityStr).append(StringUtils.repeat(" ", (MAX_QUANTITY_CHAR_LEN - itemQuans.length))); + builder.append(priceStr).append(StringUtils.repeat(" ", (MAX_PRICE_CHAR_LEN - itemPrices.length))); + } else { + // 对菜名进行猜分 + builder.append(foodName); + // 另起新行 + // new line + builder.append("
"); + builder.append(orderNameEmpty); + builder.append(quanityStr).append(StringUtils.repeat(" ", (MAX_QUANTITY_CHAR_LEN - itemQuans.length))); + builder.append(priceStr).append(StringUtils.repeat(" ", (MAX_PRICE_CHAR_LEN - itemPrices.length))); + } + builder.append("
"); + return builder.toString(); + } + + /** + * 格式化菜名名称,菜名名称打满一行自动换行 + * + * @param foodName + * @param quantity + * @param price + * @return + * @throws Exception + */ + public static String formatPrintOrderItemByFull(String foodName, Integer quantity, Double price) throws Exception { + StringBuilder builder = new StringBuilder(); + byte[] itemNames = foodName.getBytes("GBK"); + Integer mod = itemNames.length % ROW_MAX_CHAR_LEN; + String quanityStr = quantity.toString(); + byte[] itemQuans = quanityStr.getBytes("GBK"); + String priceStr = roundByTwo(price); + byte[] itemPrices = (priceStr).getBytes("GBK"); + + if (mod <= LAST_ROW_MAX_NAME_CHAR_LEN) { + builder.append(foodName); + // 在同一行,留4个英文字符的空格 + //if in the same row, fill with 4 spaces at the end of name column + builder.append(StringUtils.repeat(" ", (MAX_NAME_CHAR_LEN - mod))); + builder.append(quanityStr).append(StringUtils.repeat(" ", (MAX_QUANTITY_CHAR_LEN - itemQuans.length))); + builder.append(priceStr).append(StringUtils.repeat(" ", (MAX_PRICE_CHAR_LEN - itemPrices.length))); + } else { + // 对菜名进行猜分 + builder.append(foodName); + // 另起新行 + // new line + builder.append("
"); + builder.append(orderNameEmpty); + builder.append(quanityStr).append(StringUtils.repeat(" ", (MAX_QUANTITY_CHAR_LEN - itemQuans.length))); + builder.append(priceStr).append(StringUtils.repeat(" ", (MAX_PRICE_CHAR_LEN - itemPrices.length))); + } + builder.append("
"); + return builder.toString(); + } + + /** + * 格式化菜品列表(用于58mm打印机) + * 注意:默认字体排版,若是字体宽度倍大后不适用 + * 58mm打印机一行可打印32个字符 汉子按照2个字符算 + * 分3列: 名称20字符一般用16字符4空格填充 数量6字符 单价6字符,不足用英文空格填充 名称过长换行 + * Format the dish list (for 58 mm printer) + * Note: this is default font typesetting, not applicable if the font width is doubled + * The 58mm printer can print 32 characters per line + * Divided into 3 columns: name(20 characters), quanity(6 characters),price(6 characters) + * The name column is generally filled with 16 your characters and 4 spaces + * Long name column will cause auto line break + * + * @param foodName 菜品名称 + * @param quantity 数量 + * @param price 价格 + * @throws Exception + */ + public static String formatPrintOrderItemForNewLine58(String foodName, Integer quantity, Double price) throws Exception { + StringBuilder builder = new StringBuilder(); + byte[] itemNames = foodName.getBytes("GBK"); + Integer mod = itemNames.length % ROW_MAX_CHAR_LEN; + + if (mod <= LAST_ROW_MAX_NAME_CHAR_LEN) { + builder.append(foodName); + // 在同一行,留4个英文字符的空格 + //if in the same row, fill with 4 spaces at the end of name column + builder.append(StringUtils.repeat(" ", (MAX_NAME_CHAR_LEN - mod))); + + String quanityStr = quantity.toString(); + byte[] itemQuans = quanityStr.getBytes("GBK"); + String priceStr = roundByTwo(price); + byte[] itemPrices = (priceStr).getBytes("GBK"); + builder.append(quanityStr).append(StringUtils.repeat(" ", (MAX_QUANTITY_CHAR_LEN - itemQuans.length))); + builder.append(priceStr).append(StringUtils.repeat(" ", (MAX_PRICE_CHAR_LEN - itemPrices.length))); + } else { + getFoodNameSplit58(foodName, builder, quantity, price); + } + builder.append("
"); + return builder.toString(); + } + + /** + * 格式化菜品列表(用于58mm打印机) + * 注意:默认字体排版,若是字体宽度倍大后不适用 + * 58mm打印机一行可打印32个字符 汉子按照2个字符算 + * 分3列: 名称20字符一般用16字符4空格填充 数量6字符 单价6字符,不足用英文空格填充 名称过长换行 + * Format the dish list (for 58 mm printer) + * Note: this is default font typesetting, not applicable if the font width is doubled + * The 58mm printer can print 32 characters per line + * Divided into 3 columns: name(20 characters), quanity(6 characters),price(6 characters) + * The name column is generally filled with 16 your characters and 4 spaces + * Long name column will cause auto line break + * + * @param foodName 菜品名称 + * @param quantity 数量 + * @param price 价格 + * @throws Exception + */ + public static String formatPrintOrderItemForNewLine80(String foodName, Integer quantity, Double price) throws Exception { + StringBuilder builder = new StringBuilder(); + byte[] itemNames = foodName.getBytes("GBK"); + Integer mod = itemNames.length % ROW_MAX_CHAR_LEN80; + + if (mod <= LAST_ROW_MAX_NAME_CHAR_LEN80) { + builder.append(foodName); + // 在同一行,留4个英文字符的空格 + //if in the same row, fill with 4 spaces at the end of name column + builder.append(StringUtils.repeat(" ", (MAX_NAME_CHAR_LEN80 - mod))); + + String quanityStr = quantity.toString(); + byte[] itemQuans = quanityStr.getBytes("GBK"); + String priceStr = roundByTwo(price); + byte[] itemPrices = (priceStr).getBytes("GBK"); + builder.append(quanityStr).append(StringUtils.repeat(" ", (MAX_QUANTITY_CHAR_LEN80 - itemQuans.length))); + builder.append(priceStr).append(StringUtils.repeat(" ", (MAX_PRICE_CHAR_LEN80 - itemPrices.length))); + } else { + getFoodNameSplit80(foodName, builder, quantity, price); + } + builder.append("
"); + return builder.toString(); + } + + private static void getFoodNameSplit58(String foodName, StringBuilder builder, Integer quantity, Double price) throws UnsupportedEncodingException { + String[] foodNames = string2StringArray(foodName, LAST_ROW_MAX_NAME_CHAR_LEN); + String quanityStr = quantity.toString(); + byte[] itemQuans = quanityStr.getBytes("GBK"); + String priceStr = roundByTwo(price); + byte[] itemPrices = (priceStr).getBytes("GBK"); + for (int i = 0; i < foodNames.length; i++) { + if (i == 0) { + byte[] itemNames = foodNames[i].getBytes("GBK"); + Integer mod = itemNames.length % ROW_MAX_CHAR_LEN; + builder.append(foodNames[i]); + builder.append(StringUtils.repeat(" ", (MAX_NAME_CHAR_LEN - mod))); + builder.append(quanityStr).append(StringUtils.repeat(" ", (MAX_QUANTITY_CHAR_LEN - itemQuans.length))); + builder.append(priceStr).append(StringUtils.repeat(" ", (MAX_PRICE_CHAR_LEN - itemPrices.length))); + } else { + builder.append(foodNames[i]).append("
"); + } + } + } + + private static void getFoodNameSplit80(String foodName, StringBuilder builder, Integer quantity, Double price) throws UnsupportedEncodingException { + String[] foodNames = string2StringArray(foodName, LAST_ROW_MAX_NAME_CHAR_LEN80); + String quanityStr = quantity.toString(); + byte[] itemQuans = quanityStr.getBytes("GBK"); + String priceStr = roundByTwo(price); + byte[] itemPrices = (priceStr).getBytes("GBK"); + for (int i = 0; i < foodNames.length; i++) { + if (i == 0) { + byte[] itemNames = foodNames[i].getBytes("GBK"); + Integer mod = itemNames.length % ROW_MAX_CHAR_LEN80; + builder.append(foodNames[i]); + builder.append(StringUtils.repeat(" ", (MAX_NAME_CHAR_LEN80 - mod))); + builder.append(quanityStr).append(StringUtils.repeat(" ", (MAX_QUANTITY_CHAR_LEN80 - itemQuans.length))); + builder.append(priceStr).append(StringUtils.repeat(" ", (MAX_PRICE_CHAR_LEN80 - itemPrices.length))); + } else { + builder.append(foodNames[i]).append("
"); + } + } + } + + private static String[] string2StringArray(String src, Integer length) { + if (StringUtils.isBlank(src) || length <= 0) { + return null; + } + int n = (src.length() + length - 1) / length; + String[] splits = new String[n]; + for (int i = 0; i < n; i++) { + if (i < (n - 1)) { + splits[i] = src.substring(i * length, (i + 1) * length); + } else { + splits[i] = src.substring(i * length); + } + } + return splits; + } + + /** + * 将double格式化为指定小数位的String,不足小数位用0补全 (小数点后保留2位) + * Format the double as a String with specified decimal places, fill in with 0 if the decimal place is not enough + * + * @param v - 需要格式化的数字 Number to be formatted + * @return 返回指定位数的字符串 Returns a string with a specified number of digits + */ + public static String roundByTwo(double v) { + return roundByScale(v, 2); + } + + /** + * 将double格式化为指定小数位的String,不足小数位用0补全 + * Format the double as a String with specified decimal places, and use 0 to complete the decimal places + * + * @param v - 需要格式化的数字 number to be formatted + * @param scale - 小数点后保留几位 places after the decimal point + * @return 返回指定位数的字符串 Returns a string with a specified number of digits + */ + public static String roundByScale(double v, int scale) { + if (scale == 0) { + return new DecimalFormat("0").format(v); + } + String formatStr = "0."; + for (int i = 0; i < scale; i++) { + formatStr = formatStr + "0"; + } + return new DecimalFormat(formatStr).format(v); + } +} diff --git a/fuint-utils/src/main/java/net/xpyun/platform/opensdk/vo/AddPrinterRequest.java b/fuint-utils/src/main/java/net/xpyun/platform/opensdk/vo/AddPrinterRequest.java new file mode 100644 index 0000000..30c512e --- /dev/null +++ b/fuint-utils/src/main/java/net/xpyun/platform/opensdk/vo/AddPrinterRequest.java @@ -0,0 +1,24 @@ +package net.xpyun.platform.opensdk.vo; + +/** + * 添加打印机请求参数 + * + * @author RabyGao + * @date Aug 7, 2019 + */ +public class AddPrinterRequest extends RestRequest { + + public AddPrinterRequestItem[] getItems() { + return items; + } + + public void setItems(AddPrinterRequestItem[] items) { + this.items = items; + } + + /** + * 请求项集合 + */ + private AddPrinterRequestItem[] items; + +} diff --git a/fuint-utils/src/main/java/net/xpyun/platform/opensdk/vo/AddPrinterRequestItem.java b/fuint-utils/src/main/java/net/xpyun/platform/opensdk/vo/AddPrinterRequestItem.java new file mode 100644 index 0000000..169e56c --- /dev/null +++ b/fuint-utils/src/main/java/net/xpyun/platform/opensdk/vo/AddPrinterRequestItem.java @@ -0,0 +1,35 @@ +package net.xpyun.platform.opensdk.vo; + +/** + * 添加打印机请求项 + * + * @author RabyGao + * @date Aug 7, 2019 + */ +public class AddPrinterRequestItem { + + /** + * 打印机编号 + */ + private String sn; + /** + * 打印机名称 + */ + private String name; + + public String getSn() { + return sn; + } + + public void setSn(String sn) { + this.sn = sn; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/fuint-utils/src/main/java/net/xpyun/platform/opensdk/vo/DelPrinterRequest.java b/fuint-utils/src/main/java/net/xpyun/platform/opensdk/vo/DelPrinterRequest.java new file mode 100644 index 0000000..937c39c --- /dev/null +++ b/fuint-utils/src/main/java/net/xpyun/platform/opensdk/vo/DelPrinterRequest.java @@ -0,0 +1,23 @@ +package net.xpyun.platform.opensdk.vo; + +/** + * 删除打印机请求参数 + * + * @author RabyGao + * @date Aug 7, 2019 + */ +public class DelPrinterRequest extends RestRequest { + + /** + * 打印机编号集合 + */ + private String[] snlist; + + public String[] getSnlist() { + return snlist; + } + + public void setSnlist(String[] snlist) { + this.snlist = snlist; + } +} diff --git a/fuint-utils/src/main/java/net/xpyun/platform/opensdk/vo/ObjectRestResponse.java b/fuint-utils/src/main/java/net/xpyun/platform/opensdk/vo/ObjectRestResponse.java new file mode 100644 index 0000000..210b806 --- /dev/null +++ b/fuint-utils/src/main/java/net/xpyun/platform/opensdk/vo/ObjectRestResponse.java @@ -0,0 +1,95 @@ +package net.xpyun.platform.opensdk.vo; + +/** + * 返回公共参数 + * + * @param + * @author RabyGao + * @date Aug 7, 2019 + */ +public class ObjectRestResponse { + + public static final String REST_RESPONSE_OK = "ok"; + + /** + * 返回码,正确返回0,【注意:结果正确与否的判断请用此返回参数】,错误返回非零 + */ + private int code; + /** + * 结果提示信息,正确返回”ok”,如果有错误,返回错误信息 + */ + private String msg; + /** + * 数据类型和内容详看私有返回参数data,如果有错误,返回null + */ + private T data; + /** + * 服务器程序执行时间,单位:毫秒 + */ + private long serverExecutedTime; + + public ObjectRestResponse() { + this.setCode(0); + this.setMsg(REST_RESPONSE_OK); + } + + public ObjectRestResponse code(int code) { + this.setCode(code); + return this; + } + + public ObjectRestResponse data(T data) { + this.setData(data); + return this; + } + + public ObjectRestResponse msg(String msg) { + this.setMsg(msg); + return this; + } + + public ObjectRestResponse setResult(int code, T data) { + this.setCode(code); + this.setData(data); + return this; + } + + public ObjectRestResponse setResult(int code, T data, String msg) { + this.setCode(code); + this.setData(data); + this.setMsg(msg); + return this; + } + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public String getMsg() { + return msg; + } + + public void setMsg(String msg) { + this.msg = msg; + } + + public T getData() { + return data; + } + + public void setData(T data) { + this.data = data; + } + + public long getServerExecutedTime() { + return serverExecutedTime; + } + + public void setServerExecutedTime(long serverExecutedTime) { + this.serverExecutedTime = serverExecutedTime; + } +} diff --git a/fuint-utils/src/main/java/net/xpyun/platform/opensdk/vo/OrderStatisResult.java b/fuint-utils/src/main/java/net/xpyun/platform/opensdk/vo/OrderStatisResult.java new file mode 100644 index 0000000..25a8220 --- /dev/null +++ b/fuint-utils/src/main/java/net/xpyun/platform/opensdk/vo/OrderStatisResult.java @@ -0,0 +1,36 @@ +package net.xpyun.platform.opensdk.vo; + + +/** + * 订单统计结果 + * + * @author RabyGao + * @date Aug 7, 2019 + */ +public class OrderStatisResult { + + /** + * 已打印订单数 + */ + private int printed; + /** + * 等待打印订单数 + */ + private int waiting; + + public int getPrinted() { + return printed; + } + + public void setPrinted(int printed) { + this.printed = printed; + } + + public int getWaiting() { + return waiting; + } + + public void setWaiting(int waiting) { + this.waiting = waiting; + } +} diff --git a/fuint-utils/src/main/java/net/xpyun/platform/opensdk/vo/OrderStatusType.java b/fuint-utils/src/main/java/net/xpyun/platform/opensdk/vo/OrderStatusType.java new file mode 100644 index 0000000..64ac5e2 --- /dev/null +++ b/fuint-utils/src/main/java/net/xpyun/platform/opensdk/vo/OrderStatusType.java @@ -0,0 +1,43 @@ +package net.xpyun.platform.opensdk.vo; + +/** + * 订单状态 + * + * @author RabyGao + * @date Aug 8, 2019 + */ +public enum OrderStatusType { + + /** + * 处理中 + */ + Processing(0), + /** + * 完成 + */ + Completed(1), + /** + * 失败 + */ + Failed(2); + + private final int val; + + public int getVal() { + return val; + } + + OrderStatusType(int num) { + this.val = num; + } + + public static OrderStatusType getOrderStatusType(int val) { + for (OrderStatusType type : OrderStatusType.values()) { + if (type.getVal() == val) { + return type; + } + } + return Processing; + } + +} diff --git a/fuint-utils/src/main/java/net/xpyun/platform/opensdk/vo/PrintRequest.java b/fuint-utils/src/main/java/net/xpyun/platform/opensdk/vo/PrintRequest.java new file mode 100644 index 0000000..9ba7aba --- /dev/null +++ b/fuint-utils/src/main/java/net/xpyun/platform/opensdk/vo/PrintRequest.java @@ -0,0 +1,124 @@ +package net.xpyun.platform.opensdk.vo; + +/** + * 打印机打印请求参数 + * + * @author RabyGao + * @date Aug 7, 2019 + */ +public class PrintRequest extends RestRequest { + + /** + * 打印机编号 + */ + private String sn; + + /** + * 打印内容,不能超过5000字节 + */ + private String content; + + /** + * 打印份数,默认为1 + */ + private int copies = 1; + + /** + * 打印模式,默认为0 + */ + private int mode = 0; + + /** + * 支付方式41~55:支付宝 微信 ... + */ + private Integer payType; + /** + * 支付与否59~61:退款 到账 消费 + */ + private Integer payMode; + /** + * 支付金额 + */ + private Double money; + /** + * 声音播放模式,0 为取消订单模式,1 为静音模式,2 为来单播放模式,默认为 2 来单播放模式 + */ + private Integer voice; + + /** + * 打印接口回调地址对应标识(取值范围 [ 1 - 5 ] 的整数),对于web管理后台 “功能设置” 菜单设置界面的打印接口回调标识。 + */ + private Integer backurlFlag; + + public String getSn() { + return sn; + } + + public void setSn(String sn) { + this.sn = sn; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + public int getCopies() { + return copies; + } + + public void setCopies(int copies) { + this.copies = copies; + } + + public int getMode() { + return mode; + } + + public void setMode(int mode) { + this.mode = mode; + } + + public Integer getPayType() { + return payType; + } + + public void setPayType(Integer payType) { + this.payType = payType; + } + + public Integer getPayMode() { + return payMode; + } + + public void setPayMode(Integer payMode) { + this.payMode = payMode; + } + + public Double getMoney() { + return money; + } + + public void setMoney(Double money) { + this.money = money; + } + + public Integer getVoice() { + return voice; + } + + public void setVoice(Integer voice) { + this.voice = voice; + } + + public Integer getBackurlFlag() { + return backurlFlag; + } + + public void setBackurlFlag(Integer backurlFlag) { + this.backurlFlag = backurlFlag; + } +} diff --git a/fuint-utils/src/main/java/net/xpyun/platform/opensdk/vo/PrinterRequest.java b/fuint-utils/src/main/java/net/xpyun/platform/opensdk/vo/PrinterRequest.java new file mode 100644 index 0000000..4433a0c --- /dev/null +++ b/fuint-utils/src/main/java/net/xpyun/platform/opensdk/vo/PrinterRequest.java @@ -0,0 +1,23 @@ +package net.xpyun.platform.opensdk.vo; + +/** + * 打印机请求参数 + * + * @author RabyGao + * @date Aug 7, 2019 + */ +public class PrinterRequest extends RestRequest { + + /** + * 打印机编号 + */ + private String sn; + + public String getSn() { + return sn; + } + + public void setSn(String sn) { + this.sn = sn; + } +} diff --git a/fuint-utils/src/main/java/net/xpyun/platform/opensdk/vo/PrinterResult.java b/fuint-utils/src/main/java/net/xpyun/platform/opensdk/vo/PrinterResult.java new file mode 100644 index 0000000..46a2b4c --- /dev/null +++ b/fuint-utils/src/main/java/net/xpyun/platform/opensdk/vo/PrinterResult.java @@ -0,0 +1,57 @@ +package net.xpyun.platform.opensdk.vo; + +import java.util.ArrayList; +import java.util.List; + +/** + * 批量添加或删除打印机结果 + * + * @author RabyGao + * @date Aug 7, 2019 + */ +public class PrinterResult{ + + public PrinterResult() { + success = new ArrayList<>(); + fail = new ArrayList<>(); + failMsg=new ArrayList<>(); + } + + /** + * 成功的打印机编号集合 + */ + private List success; + + /** + * 失败的打印机编号集合 + */ + private List fail; + /** + * 失败原因集合 设备编号:失败原因 + */ + private List failMsg ; + + public List getSuccess() { + return success; + } + + public void setSuccess(List success) { + this.success = success; + } + + public List getFail() { + return fail; + } + + public void setFail(List fail) { + this.fail = fail; + } + + public List getFailMsg() { + return failMsg; + } + + public void setFailMsg(List failMsg) { + this.failMsg = failMsg; + } +} diff --git a/fuint-utils/src/main/java/net/xpyun/platform/opensdk/vo/PrinterStatusType.java b/fuint-utils/src/main/java/net/xpyun/platform/opensdk/vo/PrinterStatusType.java new file mode 100644 index 0000000..ad3c7c7 --- /dev/null +++ b/fuint-utils/src/main/java/net/xpyun/platform/opensdk/vo/PrinterStatusType.java @@ -0,0 +1,43 @@ +package net.xpyun.platform.opensdk.vo; + +/** + * 打印机状态 + * + * @author RabyGao + * @date Aug 8, 2019 + */ +public enum PrinterStatusType { + + /** + * 离线 + */ + Offline(0), + /** + * 在线正常 + */ + OnlinNormal(1), + /** + * 在线缺纸 + */ + OnlineMissingPaper(2); + + private final int val; + + public int getVal() { + return val; + } + + private PrinterStatusType(int num) { + this.val = num; + } + + public static PrinterStatusType getPrinterStatusType(int val) { + for (PrinterStatusType type : PrinterStatusType.values()) { + if (type.getVal() == val) { + return type; + } + } + return Offline; + } + +} diff --git a/fuint-utils/src/main/java/net/xpyun/platform/opensdk/vo/PrintersRequest.java b/fuint-utils/src/main/java/net/xpyun/platform/opensdk/vo/PrintersRequest.java new file mode 100644 index 0000000..c0b4efa --- /dev/null +++ b/fuint-utils/src/main/java/net/xpyun/platform/opensdk/vo/PrintersRequest.java @@ -0,0 +1,24 @@ +package net.xpyun.platform.opensdk.vo; + +import java.util.List; + +/** + * @author LylJavas + * @create 2021/4/14 18:01 + * @description 批量打印机请求参数 + */ +public class PrintersRequest extends RestRequest { + + /** + * 打印机编号列表 + */ + private List snlist; + + public List getSnlist() { + return snlist; + } + + public void setSnlist(List snlist) { + this.snlist = snlist; + } +} diff --git a/fuint-utils/src/main/java/net/xpyun/platform/opensdk/vo/QueryOrderStateRequest.java b/fuint-utils/src/main/java/net/xpyun/platform/opensdk/vo/QueryOrderStateRequest.java new file mode 100644 index 0000000..ce1fb64 --- /dev/null +++ b/fuint-utils/src/main/java/net/xpyun/platform/opensdk/vo/QueryOrderStateRequest.java @@ -0,0 +1,23 @@ +package net.xpyun.platform.opensdk.vo; + +/** + * 查询订单状态请求参数 + * + * @author RabyGao + * @date Aug 7, 2019 + */ +public class QueryOrderStateRequest extends RestRequest { + + /** + * 订单编号 + */ + private String orderId; + + public String getOrderId() { + return orderId; + } + + public void setOrderId(String orderId) { + this.orderId = orderId; + } +} diff --git a/fuint-utils/src/main/java/net/xpyun/platform/opensdk/vo/QueryOrderStatisRequest.java b/fuint-utils/src/main/java/net/xpyun/platform/opensdk/vo/QueryOrderStatisRequest.java new file mode 100644 index 0000000..f3ee9a7 --- /dev/null +++ b/fuint-utils/src/main/java/net/xpyun/platform/opensdk/vo/QueryOrderStatisRequest.java @@ -0,0 +1,35 @@ +package net.xpyun.platform.opensdk.vo; + +/** + * 查询订单统计请求参数 + * + * @author RabyGao + * @date Aug 7, 2019 + */ +public class QueryOrderStatisRequest extends RestRequest { + + /** + * 打印机编号 + */ + private String sn; + /** + * 查询日期,格式YY-MM-DD,如:2016-09-20 + */ + private String date; + + public String getSn() { + return sn; + } + + public void setSn(String sn) { + this.sn = sn; + } + + public String getDate() { + return date; + } + + public void setDate(String date) { + this.date = date; + } +} diff --git a/fuint-utils/src/main/java/net/xpyun/platform/opensdk/vo/RestRequest.java b/fuint-utils/src/main/java/net/xpyun/platform/opensdk/vo/RestRequest.java new file mode 100644 index 0000000..b27d3b0 --- /dev/null +++ b/fuint-utils/src/main/java/net/xpyun/platform/opensdk/vo/RestRequest.java @@ -0,0 +1,59 @@ +package net.xpyun.platform.opensdk.vo; + +/** + * 请求公共参数 + * + * @author RabyGao + * @date Aug 7, 2019 + */ +public class RestRequest { + + /** + * 芯烨云后台注册用户名 + */ + private String user; + /** + * 当前UNIX时间戳,10位,精确到秒 + */ + private String timestamp; + /** + * 对参数 user + UKEY + timestamp 拼接后(+号表示连接符)进行SHA1加密得到签名,值为40位小写字符串 + */ + private String sign; + /** + * debug=1返回非json格式的数据。仅测试时候使用 + */ + private String debug; + + public String getUser() { + return user; + } + + public void setUser(String user) { + this.user = user; + } + + public String getTimestamp() { + return timestamp; + } + + public void setTimestamp(String timestamp) { + this.timestamp = timestamp; + } + + public String getSign() { + return sign; + } + + public void setSign(String sign) { + this.sign = sign; + } + + public String getDebug() { + return debug; + } + + public void setDebug(String debug) { + this.debug = debug; + } +} diff --git a/fuint-utils/src/main/java/net/xpyun/platform/opensdk/vo/SetVoiceTypeRequest.java b/fuint-utils/src/main/java/net/xpyun/platform/opensdk/vo/SetVoiceTypeRequest.java new file mode 100644 index 0000000..459a1b9 --- /dev/null +++ b/fuint-utils/src/main/java/net/xpyun/platform/opensdk/vo/SetVoiceTypeRequest.java @@ -0,0 +1,37 @@ +package net.xpyun.platform.opensdk.vo; + + +/** + * 设置打印机语音类型请求参数 + * + * @author RabyGao + * @date Aug 7, 2019 + */ +public class SetVoiceTypeRequest extends RestRequest { + + /** + * 打印机编号 + */ + private String sn; + + /** + * 声音类型: 0真人语音(大) 1真人语音(中) 2真人语音(小) 3 嘀嘀声 4 静音 + */ + private Integer voiceType; + + public String getSn() { + return sn; + } + + public void setSn(String sn) { + this.sn = sn; + } + + public Integer getVoiceType() { + return voiceType; + } + + public void setVoiceType(Integer voiceType) { + this.voiceType = voiceType; + } +} diff --git a/fuint-utils/src/main/java/net/xpyun/platform/opensdk/vo/UpdPrinterRequest.java b/fuint-utils/src/main/java/net/xpyun/platform/opensdk/vo/UpdPrinterRequest.java new file mode 100644 index 0000000..975af8e --- /dev/null +++ b/fuint-utils/src/main/java/net/xpyun/platform/opensdk/vo/UpdPrinterRequest.java @@ -0,0 +1,60 @@ +package net.xpyun.platform.opensdk.vo; + + +/** + * 修改打印机请求参数 + * + * @author RabyGao + * @date Aug 7, 2019 + */ +public class UpdPrinterRequest extends RestRequest { + + /** + * 打印机编号 + */ + private String sn; + /** + * 打印机名称 + */ + private String name; + /** + * 打印机识别码 + */ + private String idcode; + /** + * 流量卡号码 + */ + private String cardno; + + public String getSn() { + return sn; + } + + public void setSn(String sn) { + this.sn = sn; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getIdcode() { + return idcode; + } + + public void setIdcode(String idcode) { + this.idcode = idcode; + } + + public String getCardno() { + return cardno; + } + + public void setCardno(String cardno) { + this.cardno = cardno; + } +} diff --git a/fuint-utils/src/main/java/net/xpyun/platform/opensdk/vo/VoiceRequest.java b/fuint-utils/src/main/java/net/xpyun/platform/opensdk/vo/VoiceRequest.java new file mode 100644 index 0000000..085314d --- /dev/null +++ b/fuint-utils/src/main/java/net/xpyun/platform/opensdk/vo/VoiceRequest.java @@ -0,0 +1,61 @@ +package net.xpyun.platform.opensdk.vo; + + +/** + * 云喇叭播放语音请求参数 + * + * @author RabyGao + * @date Aug 5, 2020 + */ +public class VoiceRequest extends RestRequest { + + /** + * 打印机编号 + */ + private String sn; + + /** + * 支付方式41~55:支付宝 微信 ... + */ + private Integer payType; + /** + * 支付与否59~61:退款 到账 消费 + */ + private Integer payMode; + /** + * 支付金额 + */ + private Double money; + + public String getSn() { + return sn; + } + + public void setSn(String sn) { + this.sn = sn; + } + + public Integer getPayType() { + return payType; + } + + public void setPayType(Integer payType) { + this.payType = payType; + } + + public Integer getPayMode() { + return payMode; + } + + public void setPayMode(Integer payMode) { + this.payMode = payMode; + } + + public Double getMoney() { + return money; + } + + public void setMoney(Double money) { + this.money = money; + } +}