diff --git a/mallinkAdmin/src/main/java/com/iformall/controller/market/WxCouponController.java b/mallinkAdmin/src/main/java/com/iformall/controller/market/WxCouponController.java index 40871032b..e52ff2f5c 100644 --- a/mallinkAdmin/src/main/java/com/iformall/controller/market/WxCouponController.java +++ b/mallinkAdmin/src/main/java/com/iformall/controller/market/WxCouponController.java @@ -8,9 +8,11 @@ import com.iformall.common.ResultData; import com.iformall.controller.base.BaseController; import com.iformall.domain.po.WxCoupon; import com.iformall.domain.po.WxCouponChannel; +import com.iformall.domain.po.WxCouponPassword; import com.iformall.domain.vo.WxCouponStatisVo; import com.iformall.enums.*; import com.iformall.mapper.WxCouponChannelMapper; +import com.iformall.service.WxCouponPasswordService; import com.iformall.service.WxCouponService; import com.iformall.service.WxFlowService; import com.iformall.utils.DateUtils; @@ -24,6 +26,9 @@ 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 javax.servlet.http.HttpServletResponse; import java.util.*; @RestController @@ -35,6 +40,8 @@ public class WxCouponController extends BaseController { @Autowired private WxCouponService wxCouponService; @Autowired + private WxCouponPasswordService couponPasswordService; + @Autowired private WxCouponChannelMapper wxCouponChannelMapper; @Autowired private WxFlowService wxFlowService; @@ -79,6 +86,7 @@ public class WxCouponController extends BaseController { @SystemControllerLog(description = "券投放-新增") public ResultData add(@RequestBody WxCoupon wxCoupon) { logger.debug("[" + getIpAddr() + "] WxCouponController::add"); + wxCoupon.setTenantId(getTenantId()); ResultData resultData = wxCouponService.saveOrUpdate(wxCoupon); if(resultData.code != 200){ @@ -257,7 +265,7 @@ public class WxCouponController extends BaseController { @ApiImplicitParam(name = "id", value = "id", dataType = "Long", paramType = "query", required = true) @SystemControllerLog(description = "券投放-查询") public ResultData findById(@RequestParam Long id) { - logger.debug("[" + getIpAddr() + "] WxCouponController::findById");; + logger.debug("[" + getIpAddr() + "] WxCouponController::findById"); return new ResultData(wxCouponService.getVoById(id)); } @@ -334,4 +342,15 @@ public class WxCouponController extends BaseController { return new ResultData(pages); } + @GetMapping("exportCouponPassword") + @SystemControllerLog(description = "卡券兑换码-导出数据") + public void exportCouponPassword(@ModelAttribute WxCouponPassword wxCouponPassword, HttpServletRequest request, HttpServletResponse response) { + wxCouponPassword.setTenantId(getTenantId()); + wxCouponPassword.setExpireDate(new Date()); + if (wxCouponPassword.getCouponId() == null) { + wxCouponPassword.setCouponId(0L); + } + couponPasswordService.exportData(request, response, wxCouponPassword); + } + } diff --git a/mallinkAdmin/src/main/java/com/iformall/controller/market/WxCouponPasswordController.java b/mallinkAdmin/src/main/java/com/iformall/controller/market/WxCouponPasswordController.java new file mode 100644 index 000000000..ebcd99cf2 --- /dev/null +++ b/mallinkAdmin/src/main/java/com/iformall/controller/market/WxCouponPasswordController.java @@ -0,0 +1,62 @@ +package com.iformall.controller.market; + +import com.github.pagehelper.PageInfo; +import com.iformall.annotation.SystemControllerLog; +import com.iformall.common.Result; +import com.iformall.common.ResultData; +import com.iformall.controller.base.BaseController; +import com.iformall.domain.po.BaseEntity; +import com.iformall.domain.po.WxCouponPassword; +import com.iformall.domain.vo.WxCouponPasswordCountInfoVO; +import com.iformall.service.WxCouponPasswordService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +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.GetMapping; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +/** + * @author gongbiao + */ +@RestController +@RequestMapping("couponPassword") +@Api(description = "免费卡接口") +public class WxCouponPasswordController extends BaseController { + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Autowired + private WxCouponPasswordService wxCouponPasswordService; + + @ApiOperation("分页列表接口") + @GetMapping("/list") + @ApiImplicitParams({ + @ApiImplicitParam(name = "pageNum", value = "页数", dataType = "int", paramType = "query", required = true), + @ApiImplicitParam(name = "pageSize", value = "每页条数", dataType = "int", paramType = "query", required = true)}) + @SystemControllerLog(description = "列表") + public ResultData list(@ModelAttribute WxCouponPassword wxCouponPassword, Integer pageNum, Integer pageSize) { + logger.debug("[" + getIpAddr() + "] WxCouponPasswordController::list"); + wxCouponPassword.setTenantId(getTenantId()); + wxCouponPassword.setSortColumns(BaseEntity.SortField.CreateDate_DESC, BaseEntity.SortField.Id_DESC); + final PageInfo page = wxCouponPasswordService.listAsPage(wxCouponPassword, pageNum, pageSize); + return new ResultData(page); + } + + @ApiOperation("可发送卡数据") + @GetMapping("/findCouponList") + @SystemControllerLog(description = "可发送卡数据") + public ResultData findCouponList() { + logger.debug("[" + getIpAddr() + "] WxCouponPasswordController::findCouponList"); + List voList = wxCouponPasswordService.findCouponList(getTenantId()); + return new ResultData(Result.SUCCESS, "查询成功", voList); + } + + +} diff --git a/mallinkAdmin/src/main/java/com/iformall/controller/market/WxCouponPresentController.java b/mallinkAdmin/src/main/java/com/iformall/controller/market/WxCouponPresentController.java new file mode 100644 index 000000000..c07cc5c23 --- /dev/null +++ b/mallinkAdmin/src/main/java/com/iformall/controller/market/WxCouponPresentController.java @@ -0,0 +1,78 @@ +package com.iformall.controller.market; + +import com.github.pagehelper.PageInfo; +import com.iformall.annotation.SystemControllerLog; +import com.iformall.common.ErrorCode; +import com.iformall.common.ResultData; +import com.iformall.controller.base.BaseController; +import com.iformall.domain.po.BaseEntity; +import com.iformall.domain.po.MallUserInfo; +import com.iformall.domain.po.WxCouponPresent; +import com.iformall.service.WxCouponPresentService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +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.*; + +/** + * @author gongbiao + */ +@RestController +@RequestMapping("couponPresent") +@Api(description = "卡投放接口") +public class WxCouponPresentController extends BaseController { + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Autowired + private WxCouponPresentService wxCouponPresentService; + + @ApiOperation("分页列表接口") + @GetMapping("/list") + @ApiImplicitParams({ + @ApiImplicitParam(name = "pageNum", value = "页数", dataType = "int", paramType = "query", required = true), + @ApiImplicitParam(name = "pageSize", value = "每页条数", dataType = "int", paramType = "query", required = true)}) + @SystemControllerLog(description = "列表") + public ResultData list(@ModelAttribute WxCouponPresent wxCouponPresent, Integer pageNum, Integer pageSize) { + logger.debug("[" + getIpAddr() + "] WxCouponPresentController::list"); + wxCouponPresent.setTenantId(getTenantId()); + wxCouponPresent.setSortColumns(BaseEntity.SortField.CreateTime_DESC, BaseEntity.SortField.Id_DESC); + final PageInfo page = wxCouponPresentService.listAsPage(wxCouponPresent, pageNum, pageSize); + return new ResultData(page); + } + + @ApiOperation("根据id查询接口") + @GetMapping("/findById") + @ApiImplicitParam(name = "id", value = "id", dataType = "Long", paramType = "query", required = true) + @SystemControllerLog(description = "查询") + public ResultData findById(@RequestParam Long id) { + logger.debug("[" + getIpAddr() + "] WxCouponPresentController::findById"); + return new ResultData(wxCouponPresentService.findById(id)); + } + + + @ApiOperation("新增接口") + @PostMapping("add") + @SystemControllerLog(description = "新增") + public ResultData add(@RequestBody WxCouponPresent wxCouponPresent) { + logger.debug("[" + getIpAddr() + "] WxCouponInjectController::add"); + + if (wxCouponPresent.getCouponId() == null) { + return new ResultData(ErrorCode.SYS_PARAMETER_ERROR.getCode(), "请选择卡"); + } + + if (wxCouponPresent.getPhones().isEmpty()) { + return new ResultData(ErrorCode.SYS_PARAMETER_ERROR.getCode(), "请填写手机号"); + } + + MallUserInfo user = getUser(); + wxCouponPresent.setTenantId(user.getTenantId()); + wxCouponPresent.setUserId(user.getId()); + + return wxCouponPresentService.add(wxCouponPresent); + } + +} diff --git a/mallinkAdmin/src/main/java/com/iformall/controller/market/WxOrderController.java b/mallinkAdmin/src/main/java/com/iformall/controller/market/WxOrderController.java index 2fa18983d..8e5928e14 100644 --- a/mallinkAdmin/src/main/java/com/iformall/controller/market/WxOrderController.java +++ b/mallinkAdmin/src/main/java/com/iformall/controller/market/WxOrderController.java @@ -164,7 +164,7 @@ public class WxOrderController extends BaseController { if (!wxOrderService.checkCouponIsFree(coupon)) return new ResultData(ErrorCode.COUPON_IS_NOT_FREE); // 免费券 - order = wxOrderService.saveFreeOrderForCoupon(user, coupon, orderSaveDto.getCouponChannelId(), orderSaveDto.getFormId()); + order = wxOrderService.saveFreeOrderForCoupon(user, coupon, orderSaveDto.getCouponChannelId(), orderSaveDto.getFormId(), null); return new ResultData(order); } catch (MallinkException e) { logger.error(e.getMessage()); diff --git a/mallinkAdmin/src/main/resources/db/migration/V201909170450__G_COUPON_PRESENT_CHANGED.sql b/mallinkAdmin/src/main/resources/db/migration/V201909170450__G_COUPON_PRESENT_CHANGED.sql new file mode 100644 index 000000000..b04fe25c4 --- /dev/null +++ b/mallinkAdmin/src/main/resources/db/migration/V201909170450__G_COUPON_PRESENT_CHANGED.sql @@ -0,0 +1,2 @@ +alter table wx_coupon_present +add column send_amount int(11) default 0 not null comment '发送数量'; \ No newline at end of file diff --git a/mallinkAdmin/src/main/resources/db/migration/V201909170451__G_MSG_CALLBACK.sql b/mallinkAdmin/src/main/resources/db/migration/V201909170451__G_MSG_CALLBACK.sql new file mode 100644 index 000000000..20e5d9d1c --- /dev/null +++ b/mallinkAdmin/src/main/resources/db/migration/V201909170451__G_MSG_CALLBACK.sql @@ -0,0 +1,2 @@ +alter table wx_msg_callback +add column business_id bigint(20) default 0 not null comment '业务ID'; diff --git a/mallinkCApi/src/main/java/com/iformall/controller/WxCouponPasswordController.java b/mallinkCApi/src/main/java/com/iformall/controller/WxCouponPasswordController.java new file mode 100644 index 000000000..ce0d8aad0 --- /dev/null +++ b/mallinkCApi/src/main/java/com/iformall/controller/WxCouponPasswordController.java @@ -0,0 +1,95 @@ +package com.iformall.controller; + +import com.iformall.common.ErrorCode; +import com.iformall.common.ResultData; +import com.iformall.domain.po.*; +import com.iformall.enums.*; +import com.iformall.exception.MallinkException; +import com.iformall.service.*; +import com.iformall.utils.Constant; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.Date; +import java.util.Map; + +@RestController +@RequestMapping("/api/couponPassword") +@Api(description = "卡密相关接口") +public class WxCouponPasswordController extends BaseController { + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Autowired + private WxCouponPasswordService couponPasswordService; + + @Autowired + private WxCouponService couponService; + @Autowired + private WxOrderService orderService; + + + @ApiOperation(value = "根据卡密领卡", notes = "{\"password\":\"String\",\"formId\":\"String\"}") + @PostMapping("getCouponOrderByPassword") + public ResultData getCouponOrderByPassword(@RequestBody Map params) { + logger.info("getCouponOrderByPassword: " + getIpAddr() + params.toString()); + String password = params.get("password"); + String formId = params.get("formId"); + if (StringUtils.isBlank(password) || password.equalsIgnoreCase(Constant.UNDEFINED)) { + return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "password不能为空"); + } + // 1. 根据password获取领取的couponId + WxCouponPassword couponPasswordQ = new WxCouponPassword(); + couponPasswordQ.setTenantId(getTenantId()); + couponPasswordQ.setPassword(password); + couponPasswordQ.setExpireDate(new Date()); + WxCouponPassword couponPassword = null; + try { + couponPassword = couponPasswordService.getByObj(couponPasswordQ); + } catch (MallinkException e) { + logger.error(e.getMessage()); + return new ResultData(e.getErrorCode(), e.getMessage()); + } catch (Exception e) { + logger.error(e.getMessage()); + return new ResultData(500, e.getMessage()); + } + + WxCUser cuUser = getUser(); + WxCoupon coupon = couponService.getById(couponPassword.getCouponId()); + if (coupon == null) { + return new ResultData(ErrorCode.COUPON_IS_EMPTY); + } + if (coupon.getStatus().equals(EnumCouponStatus.COUPON_STATUS_TAKE_OFFF.getCode())) { + logger.error("此券已作废:" + coupon.getId()); + return new ResultData(ErrorCode.COUPON_IS_TAKE_OFF); + } + + // 2. 设置已使用 + try { + WxCouponPassword updateCouponPwd = new WxCouponPassword(); + updateCouponPwd.setId(couponPassword.getId()); + updateCouponPwd.setStatus(EnumCouponPasswordStatus.USED.getCode()); + couponPassword.setStatus(EnumCouponPasswordStatus.USED.getCode()); + couponPasswordService.saveOrUpdate(updateCouponPwd); + } catch (Exception e) { + logger.error(e.getMessage()); + return new ResultData(ErrorCode.DB_FAIL); + } + + // 3. 领取free coupon + try { + WxOrder order = orderService.saveFreeOrderForCoupon(cuUser, coupon, null, formId, couponPassword.getId()); + } catch (MallinkException e) { + logger.error(e.getMessage()); + return new ResultData(e.getErrorCode(), e.getMessage()); + } catch (Exception e) { + logger.error(e.getMessage()); + return new ResultData(500, e.getMessage()); + } + return new ResultData(); + } +} diff --git a/mallinkCApi/src/main/java/com/iformall/controller/WxOrderController.java b/mallinkCApi/src/main/java/com/iformall/controller/WxOrderController.java index 2eef41fd1..cea078e18 100644 --- a/mallinkCApi/src/main/java/com/iformall/controller/WxOrderController.java +++ b/mallinkCApi/src/main/java/com/iformall/controller/WxOrderController.java @@ -83,6 +83,9 @@ public class WxOrderController extends BaseController { if (coupon == null) { return new ResultData(ErrorCode.COUPON_IS_EMPTY); } + if (coupon.getStatus().equals(EnumCouponStatus.COUPON_STATUS_TAKE_OFFF.getCode())) { + return new ResultData(ErrorCode.COUPON_IS_TAKE_OFF); + } WxOrder order = wxOrderService.saveOrderForCoupon(user, coupon, orderSaveDto, isPress); return new ResultData(order); } catch (MallinkException e) { diff --git a/mallinkCallback/src/main/java/com/iformall/controller/callback/WxCarTJDCallBackController.java b/mallinkCallback/src/main/java/com/iformall/controller/callback/WxCarTJDCallBackController.java index 176030b78..7bf56d7e7 100644 --- a/mallinkCallback/src/main/java/com/iformall/controller/callback/WxCarTJDCallBackController.java +++ b/mallinkCallback/src/main/java/com/iformall/controller/callback/WxCarTJDCallBackController.java @@ -12,7 +12,7 @@ import com.iformall.enums.EnumCouponSendSendType; import com.iformall.enums.EnumETCPCode; import com.iformall.service.*; import com.iformall.utils.DateUtils; -import com.iformall.utils.car.ETCPUtil; +import com.iformall.utils.car.TJDCarUtil; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; @@ -139,7 +139,7 @@ public class WxCarTJDCallBackController extends BaseController { WxCarCmdLog wxCarCmdLog = new WxCarCmdLog(); wxCarCmdLog.setTenantId(park.getTenantId()); wxCarCmdLog.setVendorType(EnumCarVendor.CAR_TJD.getCode()); - wxCarCmdLog.setCmdType(EnumCarCmd.CAR_ETCP_CALLBACK_PARK_IN.getCode()); + wxCarCmdLog.setCmdType(EnumCarCmd.CAR_TJD_CALLBACK_PARK_IN.getCode()); wxCarCmdLog.setCmdJson(JSON.toJSONString(paramMap)); wxCarCmdLog.setCreateDate(currentDate); wxCarCmdLog.setUpdateDate(currentDate); @@ -185,7 +185,7 @@ public class WxCarTJDCallBackController extends BaseController { Date currentDate = new Date(); WxCarCmdLog wxCarCmdLog = new WxCarCmdLog(); wxCarCmdLog.setVendorType(EnumCarVendor.CAR_TJD.getCode()); - wxCarCmdLog.setCmdType(EnumCarCmd.CAR_ETCP_CALLBACK_PARK_OUT.getCode()); + wxCarCmdLog.setCmdType(EnumCarCmd.CAR_TJD_CALLBACK_PARK_OUT.getCode()); wxCarCmdLog.setCmdJson(JSON.toJSONString(paramMap)); wxCarCmdLog.setCreateDate(currentDate); wxCarCmdLog.setUpdateDate(currentDate); diff --git a/mallinkService/src/main/java/com/iformall/common/ErrorCode.java b/mallinkService/src/main/java/com/iformall/common/ErrorCode.java index 53b2703dc..1e478befe 100644 --- a/mallinkService/src/main/java/com/iformall/common/ErrorCode.java +++ b/mallinkService/src/main/java/com/iformall/common/ErrorCode.java @@ -219,8 +219,12 @@ public enum ErrorCode{ COUPON_PRESS_IS_OVERTIME(9071, "砍价已超时"), COUPON_PRESS_IS_EXIST(9072, "此人已参与此次砍价"), - - + /** + * 卡密 + */ + COUPON_PASSWORD_NOT_FOUND(9501, "兑换码未找到"), + COUPON_PASSWORD_HAD_USED(9502, "兑换码已失效"), + COUPON_PASSWORD_IS_CANCELED(9503, "兑换码已失效"), /** * 微信 diff --git a/mallinkService/src/main/java/com/iformall/domain/po/WxCoupon.java b/mallinkService/src/main/java/com/iformall/domain/po/WxCoupon.java index f9906be73..a0406f4f9 100644 --- a/mallinkService/src/main/java/com/iformall/domain/po/WxCoupon.java +++ b/mallinkService/src/main/java/com/iformall/domain/po/WxCoupon.java @@ -139,6 +139,9 @@ public class WxCoupon extends BaseEntity { @io.swagger.annotations.ApiModelProperty(value="最后一次审批操作类型,取值同EnumFlowKey",name="approvalType") private Integer approvalType; + @io.swagger.annotations.ApiModelProperty(value="卡密是否支持(0:不支持,1支持)",name="passwordSupport") + private Integer passwordSupport; + @TableField(exist = false) private String merchantParams; diff --git a/mallinkService/src/main/java/com/iformall/domain/po/WxCouponPassword.java b/mallinkService/src/main/java/com/iformall/domain/po/WxCouponPassword.java new file mode 100644 index 000000000..487f3fd6f --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/domain/po/WxCouponPassword.java @@ -0,0 +1,43 @@ +package com.iformall.domain.po; + +import cn.afterturn.easypoi.excel.annotation.Excel; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.Date; + +@TableName(value = "wx_coupon_password") +@Data +@EqualsAndHashCode(callSuper = true) +public class WxCouponPassword extends BaseEntity { + + protected Long id; + + @io.swagger.annotations.ApiModelProperty(value="租户ID",name="tenantId") + private String tenantId; + @io.swagger.annotations.ApiModelProperty(value="卡券ID",name="couponId") + private Long couponId; + @io.swagger.annotations.ApiModelProperty(value="卡券短ID",name="couponShort") + private String couponShort; + @Excel(name = "兑换码", width = 20, orderNum = "1") + @io.swagger.annotations.ApiModelProperty(value="商户名称",name="password") + private String password; + @io.swagger.annotations.ApiModelProperty(value="卡密状态: 0初始1信息发出中2信息已发出3已使用",name="status") + private Integer status; + @io.swagger.annotations.ApiModelProperty(value="卡密发送到手机",name="sendedPhone") + private String sendedPhone; + @io.swagger.annotations.ApiModelProperty(value="卡包ID(coupon_order_id/card_id)",name="cardId") + private Long cardId; + @io.swagger.annotations.ApiModelProperty(value="创建时间",name="createDate") + private Date createDate; + @io.swagger.annotations.ApiModelProperty(value="更新时间",name="updateDate") + private Date updateDate; + @io.swagger.annotations.ApiModelProperty(value="过期时间",name="expireDate") + private Date expireDate; + + @TableField(exist = false) + private String statusStr; + +} diff --git a/mallinkService/src/main/java/com/iformall/domain/po/WxCouponPresent.java b/mallinkService/src/main/java/com/iformall/domain/po/WxCouponPresent.java new file mode 100644 index 000000000..15f2b6b7c --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/domain/po/WxCouponPresent.java @@ -0,0 +1,41 @@ +package com.iformall.domain.po; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.Date; + +@TableName(value = "wx_coupon_present") +@Data +@EqualsAndHashCode(callSuper = true) +public class WxCouponPresent extends BaseEntity { + + protected Long id; + + @ApiModelProperty(value = "租户ID", name = "tenantId") + private String tenantId; + @ApiModelProperty(value = "用户ID", name = "userId") + private Long userId; + @ApiModelProperty(value = "卡券ID", name = "couponId") + private Long couponId; + @ApiModelProperty(value = "卡券名称", name = "couponName") + private String couponName; + @ApiModelProperty(value = "手机", name = "phones") + private String phones; + @ApiModelProperty(value = "创建时间", name = "createDate") + private Date createTime; + @ApiModelProperty(value = "更新时间", name = "updateDate") + private Date updateTime; + @ApiModelProperty(value = "发送数量", name = "sendAmount") + private Integer sendAmount; + + @TableField(exist = false) + protected Date sendTimeStart; + + @TableField(exist = false) + protected Date sendTimeEnd; + +} diff --git a/mallinkService/src/main/java/com/iformall/domain/po/WxMsgCallback.java b/mallinkService/src/main/java/com/iformall/domain/po/WxMsgCallback.java index 538d12e66..21ed6c011 100644 --- a/mallinkService/src/main/java/com/iformall/domain/po/WxMsgCallback.java +++ b/mallinkService/src/main/java/com/iformall/domain/po/WxMsgCallback.java @@ -46,4 +46,7 @@ public class WxMsgCallback extends BaseEntity { @io.swagger.annotations.ApiModelProperty(value="msgId",name="msgId") private Long msgId; + @io.swagger.annotations.ApiModelProperty(value = "业务ID", name = "businessId") + private Long businessId; + } diff --git a/mallinkService/src/main/java/com/iformall/domain/vo/WxCouponPasswordCountInfoVO.java b/mallinkService/src/main/java/com/iformall/domain/vo/WxCouponPasswordCountInfoVO.java new file mode 100644 index 000000000..acbd15f6c --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/domain/vo/WxCouponPasswordCountInfoVO.java @@ -0,0 +1,14 @@ +package com.iformall.domain.vo; + +import lombok.Data; + +/** + * @author gongbiao + */ +@Data +public class WxCouponPasswordCountInfoVO { + + private Long couponId; + private String couponName; + private Long couponCount; +} diff --git a/mallinkService/src/main/java/com/iformall/enums/EnumCardPasswordStatus.java b/mallinkService/src/main/java/com/iformall/enums/EnumCouponPasswordStatus.java similarity index 66% rename from mallinkService/src/main/java/com/iformall/enums/EnumCardPasswordStatus.java rename to mallinkService/src/main/java/com/iformall/enums/EnumCouponPasswordStatus.java index e12f05091..6b99f6986 100644 --- a/mallinkService/src/main/java/com/iformall/enums/EnumCardPasswordStatus.java +++ b/mallinkService/src/main/java/com/iformall/enums/EnumCouponPasswordStatus.java @@ -3,16 +3,17 @@ package com.iformall.enums; /** * Created by Stormeye on 2019/09/17. */ -public enum EnumCardPasswordStatus { +public enum EnumCouponPasswordStatus { INIT(0, "初始"), MSG_SENDING(1, "消息发送中"), MSG_SENDED(2, "消息已发送"), - USED(3, "已使用"); + USED(3, "已使用"), + CANCEL(4, "已作废"); - public static EnumCardPasswordStatus getEnum(Integer code) { - for (EnumCardPasswordStatus value : values()) { + public static EnumCouponPasswordStatus getEnum(Integer code) { + for (EnumCouponPasswordStatus value : values()) { if (value.getCode().equals(code)) { return value; } @@ -23,7 +24,7 @@ public enum EnumCardPasswordStatus { private Integer code; private String message; - EnumCardPasswordStatus(Integer code, String message) { + EnumCouponPasswordStatus(Integer code, String message) { this.code = code; this.message = message; } diff --git a/mallinkService/src/main/java/com/iformall/enums/EnumCouponPasswordSupport.java b/mallinkService/src/main/java/com/iformall/enums/EnumCouponPasswordSupport.java new file mode 100644 index 000000000..7024ae8cf --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/enums/EnumCouponPasswordSupport.java @@ -0,0 +1,36 @@ +package com.iformall.enums; + +/** + * Created by Stormeye on 2018/08/09. + */ +public enum EnumCouponPasswordSupport { + + NOT_SUPPORT(0, "不支持"), + SUPPORTED(1, "支持"), + ; + + public static EnumCouponPasswordSupport getEnum(Integer code) { + for (EnumCouponPasswordSupport value : values()) { + if (value.getCode().equals(code)) { + return value; + } + } + return null; + } + + private Integer code; + private String message; + + EnumCouponPasswordSupport(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return code; + } + + public String getMessage() { + return message; + } +} diff --git a/mallinkService/src/main/java/com/iformall/enums/EnumMsgModel.java b/mallinkService/src/main/java/com/iformall/enums/EnumMsgModel.java index 28d473235..6c6906fc6 100644 --- a/mallinkService/src/main/java/com/iformall/enums/EnumMsgModel.java +++ b/mallinkService/src/main/java/com/iformall/enums/EnumMsgModel.java @@ -34,6 +34,8 @@ public enum EnumMsgModel { //会员生日券 COUPON_BIRTHDAY_OPENED(28, "会员生日券倍率开启"), COUPON_BIRTHDAY_OPENED_NO(29, "会员生日券倍率未开启"), + + COUPON_CARD_SEND(30, "系统发卡"), ; public static EnumMsgModel getEnum(Integer code) { diff --git a/mallinkService/src/main/java/com/iformall/mapper/WxCUserBasicInfoMapper.java b/mallinkService/src/main/java/com/iformall/mapper/WxCUserBasicInfoMapper.java index e0a840590..7d4910979 100644 --- a/mallinkService/src/main/java/com/iformall/mapper/WxCUserBasicInfoMapper.java +++ b/mallinkService/src/main/java/com/iformall/mapper/WxCUserBasicInfoMapper.java @@ -44,5 +44,11 @@ public interface WxCUserBasicInfoMapper extends CommonMapper selectNotCUserList(); } diff --git a/mallinkService/src/main/java/com/iformall/mapper/WxCouponPasswordMapper.java b/mallinkService/src/main/java/com/iformall/mapper/WxCouponPasswordMapper.java new file mode 100644 index 000000000..82a910167 --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/mapper/WxCouponPasswordMapper.java @@ -0,0 +1,23 @@ +package com.iformall.mapper; + +import com.iformall.common.CommonMapper; +import com.iformall.domain.po.WxCouponPassword; +import com.iformall.domain.vo.WxCouponPasswordCountInfoVO; + +import java.util.List; + +public interface WxCouponPasswordMapper extends CommonMapper { + + List findList(WxCouponPassword wxCouponPassword); + + List findAvaPasswordListByCouponId(WxCouponPassword wxCouponPassword); + + void insertCouponPasswds(List pwdlist); + int updateStatusByCouponId(Long couponId); + List findCouponGroupList(WxCouponPassword wxCouponPassword); + + List findCouponCountInfo(WxCouponPassword wxCouponPassword); + + void updateStatus(List tempList); + +} diff --git a/mallinkService/src/main/java/com/iformall/mapper/WxCouponPresentMapper.java b/mallinkService/src/main/java/com/iformall/mapper/WxCouponPresentMapper.java new file mode 100644 index 000000000..aefc18519 --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/mapper/WxCouponPresentMapper.java @@ -0,0 +1,13 @@ +package com.iformall.mapper; + +import com.iformall.common.CommonMapper; +import com.iformall.domain.po.WxCouponPassword; +import com.iformall.domain.po.WxCouponPresent; + +import java.util.List; + +public interface WxCouponPresentMapper extends CommonMapper { + + List findList(WxCouponPresent wxCouponPresent); + +} diff --git a/mallinkService/src/main/java/com/iformall/mapper/WxCreditHistoryMapper.java b/mallinkService/src/main/java/com/iformall/mapper/WxCreditHistoryMapper.java index ab5146988..c1ce58961 100644 --- a/mallinkService/src/main/java/com/iformall/mapper/WxCreditHistoryMapper.java +++ b/mallinkService/src/main/java/com/iformall/mapper/WxCreditHistoryMapper.java @@ -4,6 +4,7 @@ import com.iformall.common.CommonMapper; import com.iformall.domain.po.WxCreditHistory; import com.iformall.domain.vo.WxCreditHistoryNewIdVo; import com.iformall.domain.vo.WxCreditHistoryVo; +import org.apache.ibatis.annotations.Param; import java.util.Date; import java.util.List; @@ -31,4 +32,6 @@ public interface WxCreditHistoryMapper extends CommonMapper findListAfter(Integer creditType, String dateTime); + + List findListByIds(@Param("userIds") List userIds); } diff --git a/mallinkService/src/main/java/com/iformall/service/WxCouponPasswordService.java b/mallinkService/src/main/java/com/iformall/service/WxCouponPasswordService.java new file mode 100644 index 000000000..5cd6a7559 --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/service/WxCouponPasswordService.java @@ -0,0 +1,72 @@ +package com.iformall.service; + +import com.github.pagehelper.PageInfo; +import com.iformall.domain.po.WxCouponPassword; +import com.iformall.domain.vo.WxCouponPasswordCountInfoVO; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +public interface WxCouponPasswordService { + + /** + * 根据实体查询分页列表 + * + * @param record + * @param pageIndex + * @param pageSize + * @return + */ + PageInfo listAsPage(WxCouponPassword record, Integer pageIndex, Integer pageSize); + + /** + * 根据Id获得实体 + * + * @param id + * @return + */ + WxCouponPassword getById(Long id); + + /** + * 根据密码获取卡密信息 + * + * @param obj + * @return + */ + WxCouponPassword getByObj(WxCouponPassword obj); + + /** + * 保存或更新实体 + * + * @param record + */ + void saveOrUpdate(WxCouponPassword record); + + /** + * 根据Id删除实体 + * + * @param id + */ + void deleteById(Long id); + + /** + * 生产卡密 + * @param tenantId + * @param couponId + * @param inventory + */ + void mkPasswords(String tenantId, Long couponId, Integer inventory); + + + List findCouponList(String tenantId); + + /** + * 导出兑换码 + * @param request + * @param response + * @param couponPassword + */ + void exportData(HttpServletRequest request, HttpServletResponse response, WxCouponPassword couponPassword); + +} diff --git a/mallinkService/src/main/java/com/iformall/service/WxCouponPresentService.java b/mallinkService/src/main/java/com/iformall/service/WxCouponPresentService.java new file mode 100644 index 000000000..e54cb7dc7 --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/service/WxCouponPresentService.java @@ -0,0 +1,19 @@ +package com.iformall.service; + +import com.github.pagehelper.PageInfo; +import com.iformall.common.ResultData; +import com.iformall.domain.po.WxCouponPresent; + +/** + * @author gongbiao + */ +public interface WxCouponPresentService { + + + PageInfo listAsPage(WxCouponPresent wxCouponPresent, Integer pageNum, Integer pageSize); + + WxCouponPresent findById(Long id); + + ResultData add(WxCouponPresent wxCouponPresent); + +} diff --git a/mallinkService/src/main/java/com/iformall/service/WxMsgValidationcodeService.java b/mallinkService/src/main/java/com/iformall/service/WxMsgValidationcodeService.java index 3deb81378..6347f6177 100644 --- a/mallinkService/src/main/java/com/iformall/service/WxMsgValidationcodeService.java +++ b/mallinkService/src/main/java/com/iformall/service/WxMsgValidationcodeService.java @@ -4,8 +4,6 @@ import com.github.pagehelper.PageInfo; import com.iformall.common.ResultData; import com.iformall.domain.po.WxMsgValidationcode; -import java.util.Map; - public interface WxMsgValidationcodeService { /** * 根据实体查询分页列表 @@ -44,6 +42,6 @@ public interface WxMsgValidationcodeService { ResultData hasvalidationcode(WxMsgValidationcode record); - void addMsgCallback(WxMsgValidationcode wxmsg, String batchNo); + void addMsgCallback(WxMsgValidationcode wxmsg, String batchNo, String id); } diff --git a/mallinkService/src/main/java/com/iformall/service/WxOrderService.java b/mallinkService/src/main/java/com/iformall/service/WxOrderService.java index 6158c90eb..0c8b197bf 100644 --- a/mallinkService/src/main/java/com/iformall/service/WxOrderService.java +++ b/mallinkService/src/main/java/com/iformall/service/WxOrderService.java @@ -176,7 +176,7 @@ public interface WxOrderService { boolean checkCouponIsFree(WxCoupon coupon); // 2. 创建免费订单, 领取 couponOrder - WxOrder saveFreeOrderForCoupon(WxCUser user, WxCoupon coupon, Long couponChannelId, String formId); + WxOrder saveFreeOrderForCoupon(WxCUser user, WxCoupon coupon, Long couponChannelId, String formId, Long couponPasswordId); // 3. 创建有价订单 WxOrder saveNoFreeOrderForCoupon(WxCUser user, WxCoupon coupon, Long couponChannelId, boolean isPress, Long orderGroupId, String formId); diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxCouponPasswordServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxCouponPasswordServiceImpl.java new file mode 100644 index 000000000..80dd5b7df --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxCouponPasswordServiceImpl.java @@ -0,0 +1,178 @@ +package com.iformall.service.impl; + +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import com.iformall.common.IdWorker; +import com.iformall.domain.po.WxCouponPassword; +import com.iformall.enums.EnumCouponPasswordStatus; +import com.iformall.domain.vo.WxCouponPasswordCountInfoVO; +import com.iformall.common.ErrorCode; +import com.iformall.exception.MallinkException; +import com.iformall.mapper.WxCouponPasswordMapper; +import com.iformall.service.ExcelService; +import com.iformall.service.WxCouponPasswordService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Random; + +@Service +public class WxCouponPasswordServiceImpl implements WxCouponPasswordService { + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Autowired + WxCouponPasswordMapper wxCouponPasswordMapper; + + @Autowired + ExcelService excelService; + + + @Override + public PageInfo listAsPage(WxCouponPassword record, Integer pageIndex, Integer pageSize) { + return PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> wxCouponPasswordMapper.findList(record)); + } + + @Override + public WxCouponPassword getById(Long id) { + return wxCouponPasswordMapper.selectById(id); + } + + @Override + public WxCouponPassword getByObj(WxCouponPassword obj) { + List pwdList = wxCouponPasswordMapper.findList(obj); + if (pwdList.size() <= 0) { + throw new MallinkException(ErrorCode.COUPON_PASSWORD_NOT_FOUND); + } + WxCouponPassword password = null; + Integer errCode = EnumCouponPasswordStatus.INIT.getCode(); + for( WxCouponPassword pwd: pwdList) { + if (pwd.getStatus().equals(EnumCouponPasswordStatus.USED.getCode())) { + errCode = EnumCouponPasswordStatus.USED.getCode(); + continue; + } + if (!pwd.getStatus().equals(EnumCouponPasswordStatus.USED.getCode()) && + !pwd.getStatus().equals(EnumCouponPasswordStatus.CANCEL.getCode())) { + password = pwd; + } + } + if (password == null) { + if (errCode.equals(EnumCouponPasswordStatus.USED.getCode())) { + logger.error("卡券已使用"); + throw new MallinkException(ErrorCode.COUPON_PASSWORD_HAD_USED); + } else { + logger.error("卡券已过期或已作废"); + throw new MallinkException(ErrorCode.COUPON_PASSWORD_IS_CANCELED); + } + } + return password; + } + + @Override + public void saveOrUpdate(WxCouponPassword record) { + if (record.getId() == null) { + //record.setId(UUID.randomUUID().toString().replaceAll("-", "")); + final IdWorker idWorker = IdWorker.get(); + record.setId(idWorker.nextId()); + wxCouponPasswordMapper.insert(record); + } else { + wxCouponPasswordMapper.updateById(record); + } + } + + @Override + public void deleteById(Long id) { + wxCouponPasswordMapper.deleteById(id); + } + + @Override + public List findCouponList(String tenantId) { + WxCouponPassword wxCouponPassword = new WxCouponPassword(); + wxCouponPassword.setTenantId(tenantId); + return wxCouponPasswordMapper.findCouponCountInfo(wxCouponPassword); + } + + @Override + public void mkPasswords(String tenantId, Long couponId, Integer inventory) { + String strAll = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; + // 1.获取 coupon short 1 + int couponShort = 0; + String couponShortStr = "0"; + WxCouponPassword pwQ = new WxCouponPassword(); + pwQ.setTenantId(tenantId); + List pwgList = wxCouponPasswordMapper.findCouponGroupList(pwQ); + couponShort = pwgList.size(); + couponShortStr = String.valueOf(strAll.charAt(couponShort)); + // 2.随机字符 + Random rand = new Random(); + List pwList = new ArrayList<>(); + while (true) { + StringBuilder sb = new StringBuilder(); + for (int j = 0; j < 9; j++) { + int f = (int) (Math.random() * 62); + sb.append(strAll.charAt(f)); + if (j == 4) { + sb.append(couponShortStr); + } + } + String pwd = sb.toString(); + if (!pwList.stream().anyMatch(oPwd->oPwd.equals(pwd))) { + pwList.add(pwd); + } else { + continue; + } + + if (pwList.size() >= inventory) { + break; + } + } + // 3. save to db + final IdWorker idWorker = IdWorker.get(); + Date curDate = new Date(); + List couponPasswords = new ArrayList<>(); + for (int i=0;i pwdList = wxCouponPasswordMapper.findAvaPasswordListByCouponId(couponPassword); + if (pwdList.isEmpty()) { + throw new MallinkException(ErrorCode.COUPON_PASSWORD_NOT_FOUND); + } + excelService.exportExcel(pwdList, null, "兑换码", WxCouponPassword.class, "卡兑换码.xlsx", response, false); + + } + + /* + public static void main(String[] args) { + WxCouponPasswordServiceImpl ll = new WxCouponPasswordServiceImpl(); + long startTime = System.currentTimeMillis(); + System.out.println(startTime); + ll.mkPasswords("456", 12345L, 100); + long endTime = System.currentTimeMillis(); + System.out.println(endTime); + long usedTime = (endTime-startTime)/1000; + System.out.println("耗时:" + usedTime + "s"); + } + */ + + +} diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxCouponPresentServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxCouponPresentServiceImpl.java new file mode 100644 index 000000000..aee11eda9 --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxCouponPresentServiceImpl.java @@ -0,0 +1,148 @@ +package com.iformall.service.impl; + +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import com.iformall.common.ErrorCode; +import com.iformall.common.IdWorker; +import com.iformall.common.ResultData; +import com.iformall.domain.po.WxAppinfo; +import com.iformall.domain.po.WxCoupon; +import com.iformall.domain.po.WxCouponPassword; +import com.iformall.domain.po.WxCouponPresent; +import com.iformall.domain.po.msg.WxMsgRecord; +import com.iformall.enums.*; +import com.iformall.exception.MallinkException; +import com.iformall.mapper.WxCouponPasswordMapper; +import com.iformall.mapper.WxCouponPresentMapper; +import com.iformall.mq.MqBaseProducer; +import com.iformall.service.PushLimitService; +import com.iformall.service.WxAppinfoService; +import com.iformall.service.WxCouponPresentService; +import com.iformall.service.WxCouponService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.*; + +/** + * @author gongbiao + */ +@Service +public class WxCouponPresentServiceImpl implements WxCouponPresentService { + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Autowired + WxCouponPresentMapper wxCouponPresentMapper; + + @Autowired + PushLimitService pushLimitService; + + @Autowired + WxCouponService wxCouponService; + + @Autowired + WxCouponPasswordMapper wxCouponPasswordMapper; + + @Autowired + WxAppinfoService wxAppinfoService; + + @Autowired + private MqBaseProducer mqBaseProducer; + + @Override + public PageInfo listAsPage(WxCouponPresent record, Integer pageIndex, Integer pageSize) { + return PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> wxCouponPresentMapper.findList(record)); + } + + @Override + public WxCouponPresent findById(Long id) { + return wxCouponPresentMapper.selectById(id); + } + + @Override + public ResultData add(WxCouponPresent record) { + String tenantId = record.getTenantId(); + try { + pushLimitService.checkSendTime(tenantId); + } catch (MallinkException e) { + logger.error(e.getMessage()); + return new ResultData(e.getErrorCode(), e.getMessage()); + } + WxCoupon wxCoupon = wxCouponService.getById(record.getCouponId()); + if (wxCoupon.getValidType().equals(EnumCouponValidType.BETWEEN_TWO_TIME.getCode())) { //时间范围 + if (new Date().after(wxCoupon.getValidEndDate())) { + return new ResultData(ErrorCode.COUPON_IS_EXPIRED); + } + } + if (!wxCoupon.getStatus().equals(EnumCouponStatus.COUPON_STATUS_THROW_IN.getCode())) { + return new ResultData(ErrorCode.COUPON_IS_TAKE_OFF); + } + //获取手机号 + record.setCouponName(wxCoupon.getTitle()); + String phones = record.getPhones(); + String[] phoneSplit = phones.split(","); + Set phoneSet = new HashSet<>(phoneSplit.length); + for (String phone : phoneSplit) { + if (!phone.isEmpty()) { + phoneSet.add(phone); + } + } + + //查询有效券数量 + WxCouponPassword wxCouponPassword = new WxCouponPassword(); + wxCouponPassword.setTenantId(tenantId); + wxCouponPassword.setCouponId(record.getCouponId()); + wxCouponPassword.setStatus(EnumCouponPasswordStatus.INIT.getCode()); + List list = wxCouponPasswordMapper.findList(wxCouponPassword); + if (phoneSet.size() > list.size()) { + return new ResultData(ErrorCode.REMAIN_IS_EMPTY); + } + //添加记录 + final IdWorker idWorker = IdWorker.get(); + record.setId(idWorker.nextId()); + record.setCouponName(wxCoupon.getTitle()); + record.setSendAmount(phoneSet.size()); + wxCouponPresentMapper.insert(record); + //小程序 + WxAppinfo appInfo = wxAppinfoService.getCAppInfo(tenantId); + String priceStr = wxCoupon.getPriceStr(); + String name = appInfo.getName(); + List tempList = wxCouponPasswordMapper.findList(wxCouponPassword); + //循环发送 + int i = 0; + for (String phone : phoneSet) { + WxCouponPassword couponPassword = list.get(i); + //发送 + sendMsg(tenantId, phone, priceStr, name, couponPassword.getPassword()); + //记录发送数据便于更新状态 + couponPassword.setSendedPhone(phone); + tempList.add(couponPassword); + i++; + } + //修改状态 + wxCouponPasswordMapper.updateStatus(tempList); + return new ResultData(); + } + + private void sendMsg(String tenantId, String phone, String money, String appName, String password) { + logger.info("》》》》》》》》》》》"); + logger.info("系统发卡发送短信开始"); + logger.info("》》》》》》》》》》》"); + Map msgReplaceMap = new HashMap(); + msgReplaceMap.put("app", appName); + msgReplaceMap.put("money", money); + msgReplaceMap.put("password", password); + WxMsgRecord wxMsgRecord = new WxMsgRecord(); + wxMsgRecord.setMsgType(EnumMsgRecordType.SMS.getCode()); + wxMsgRecord.setModelType(EnumMsgModel.COUPON_CARD_SEND.getCode()); + wxMsgRecord.setReceiver(phone); + wxMsgRecord.setTenantId(tenantId); + wxMsgRecord.setDynamicContentMap(msgReplaceMap); + mqBaseProducer.sendMessage(wxMsgRecord, EnumMsgMqTopic.DEFAULT.getCode(), EnumMsgMqTag.DEFAULT.getCode(), EnumMsgMqKey.DEFAULT.getCode()); + logger.info("》》》》》》》》》》》"); + logger.info("系统发卡发送短信结束"); + logger.info("》》》》》》》》》》》"); + } +} diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxCouponServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxCouponServiceImpl.java index 9d871034d..bee1e1f98 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxCouponServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxCouponServiceImpl.java @@ -64,6 +64,12 @@ import java.util.stream.Collectors; @Autowired WxCardInfoMapper wxCardInfoMapper; + @Autowired + WxCouponPasswordMapper couponPasswordMapper; + + @Autowired + WxCouponPasswordService couponPasswordService; + @Override public ResultData list(WxCoupon wxCoupon, Integer pageNum, Integer pageSize) { if (null == wxCoupon) wxCoupon = new WxCoupon(); @@ -326,6 +332,11 @@ import java.util.stream.Collectors; return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL); } + if (record.getPasswordSupport() != null && record.getPasswordSupport().equals(EnumCouponPasswordSupport.SUPPORTED.getCode())) { + // 如果用户启用卡密,生成数据并保存 + couponPasswordService.mkPasswords(record.getTenantId(), record.getId(), record.getInventory()); + } + record.setCreateDate(new Date()); record.setUpdateDate(new Date()); wxCouponMapper.insert(record); @@ -408,9 +419,10 @@ import java.util.stream.Collectors; wxScreenAdService.updateStatusByCouponId(record.getId(), record.getTenantId(), EnumScreenAdStatus.INVALID.getCode()); //下架拼团券 wxOrderService.updateOrderGroupStatusByCouponId(record.getId(), record.getTenantId(), EnumOrderStatus.ORDER_STATUS_COOPERATING_CANCEL.getCode()); - //修改卡状态 + // 卡下架后,转赠找不到卡相关信息,所以修改卡转赠状态为不可转赠 wxCardInfoMapper.updateTransferStatusByCouponId(record.getId()); - + // 卡券下架,未使用的卡密要下架 + couponPasswordMapper.updateStatusByCouponId(record.getId()); } record.setUpdateDate(new Date()); wxCouponMapper.updateById(record); diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxMsgCallbackServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxMsgCallbackServiceImpl.java index 3dedc0bce..3c4f379bc 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxMsgCallbackServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxMsgCallbackServiceImpl.java @@ -4,10 +4,8 @@ import com.alibaba.fastjson.JSONArray; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import com.iformall.common.IdWorker; -import com.iformall.domain.po.WxMsgCallback; -import com.iformall.domain.po.WxMsgConfig; -import com.iformall.domain.po.WxMsgModel; -import com.iformall.domain.po.WxMsgValidationcodeModel; +import com.iformall.domain.po.*; +import com.iformall.enums.EnumCouponPasswordStatus; import com.iformall.enums.EnumMsgSendStatus; import com.iformall.mapper.*; import com.iformall.service.WxMsgCallbackService; @@ -38,6 +36,9 @@ public class WxMsgCallbackServiceImpl implements WxMsgCallbackService { @Autowired WxMsgMapper wxMsgMapper; + @Autowired + WxCouponPasswordMapper wxCouponPasswordMapper; + @Override public PageInfo listAsPage(WxMsgCallback record, Integer pageIndex, Integer pageSize) { return PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> wxMsgCallbackMapper.findList(record)); @@ -93,6 +94,14 @@ public class WxMsgCallbackServiceImpl implements WxMsgCallbackService { callback.setCallbackId(wxMsgCallback.getId()); callback.setUpdatetime(new Date()); wxMsgCallbackMapper.updateById(callback); + //更新业务 + if (!callback.getBusinessId().equals(0L)) { + WxCouponPassword couponPassword = new WxCouponPassword(); + couponPassword.setId(callback.getBusinessId()); + couponPassword.setStatus(EnumCouponPasswordStatus.MSG_SENDED.getCode()); + couponPassword.setUpdateDate(new Date()); + wxCouponPasswordMapper.updateById(couponPassword); + } }else{ Long callbackId = wxMsgCallback.getId(); wxMsgCallback.setId(idWorker.nextId()); diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxMsgValidationcodeServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxMsgValidationcodeServiceImpl.java index a5cfa4419..724af92a4 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxMsgValidationcodeServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxMsgValidationcodeServiceImpl.java @@ -6,8 +6,7 @@ import com.iformall.common.ErrorCode; import com.iformall.common.IdWorker; import com.iformall.common.Result; import com.iformall.common.ResultData; -import com.iformall.domain.po.WxMsgCallback; -import com.iformall.domain.po.WxMsgValidationcode; +import com.iformall.domain.po.*; import com.iformall.domain.po.msg.WxMsgRecord; import com.iformall.enums.*; import com.iformall.mapper.*; @@ -15,6 +14,7 @@ import com.iformall.mq.MqBaseProducer; import com.iformall.service.WxMsgValidationcodeService; import com.iformall.utils.DateUtils; import org.apache.commons.collections.map.HashedMap; +import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -117,7 +117,7 @@ public class WxMsgValidationcodeServiceImpl implements WxMsgValidationcodeServic } @Override - public void addMsgCallback(WxMsgValidationcode wxmsg, String batchNo){ + public void addMsgCallback(WxMsgValidationcode wxmsg, String batchNo, String id) { logger.info("验证码发送时主动添加回调记录开始..."); String phone = wxmsg.getPhone(); final IdWorker idWorker = IdWorker.get(); @@ -129,6 +129,9 @@ public class WxMsgValidationcodeServiceImpl implements WxMsgValidationcodeServic wxMsgCallback.setMsgId(wxmsg.getId()); wxMsgCallback.setStatus(EnumMsgSendStatus.MSG_SEND_FAIL.getCode()); wxMsgCallback.setCreatetime(new Date()); + if (StringUtils.isNotEmpty(id)) { + wxMsgCallback.setBusinessId(Long.parseLong(id)); + } wxMsgCallbackMapper.insert(wxMsgCallback); logger.info("验证码发送时主动添加回调记录结束..."); } diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxOrderServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxOrderServiceImpl.java index 389bd386f..7b61efa7d 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxOrderServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxOrderServiceImpl.java @@ -119,6 +119,8 @@ public class WxOrderServiceImpl implements WxOrderService { @Autowired private WxMsgLimitService wxMsgLimitService; + @Autowired + private WxCouponPasswordMapper couponPasswordMapper; @Override public PageInfo listAsPage(WxOrder record, Integer pageIndex, Integer pageSize) { @@ -637,7 +639,7 @@ public class WxOrderServiceImpl implements WxOrderService { * @param order * @param coupon */ - private WxCouponOrder createCouponOrder(WxOrder order, WxCUser user, WxCoupon coupon) { + private WxCouponOrder createCouponOrder(WxOrder order, WxCUser user, WxCoupon coupon, Long couponPasswordId) { Date curr = new Date(); Date valid_date = null; int limit_days = Constant.WX_LIMIT_DAYS; @@ -721,6 +723,12 @@ public class WxOrderServiceImpl implements WxOrderService { cardInfo.setShareFeeAmount(0); cardInfo.setRemainingShareFeeAmount(0); cardInfo.setRateAmount(0); + if (coupon.getPasswordSupport().equals(EnumCouponPasswordSupport.SUPPORTED.getCode())) { + WxCouponPassword updateCPwd = new WxCouponPassword(); + updateCPwd.setId(couponPasswordId); + updateCPwd.setStatus(EnumCouponPasswordStatus.USED.getCode()); + couponPasswordMapper.updateById(updateCPwd); + } } cardInfo.setServiceFeeAmount(fee); @@ -813,7 +821,7 @@ public class WxOrderServiceImpl implements WxOrderService { // 创建couponOrder WxCouponOrder couponOrder = null; try { - couponOrder = createCouponOrder(record, user, coupon); + couponOrder = createCouponOrder(record, user, coupon, null); } catch (Exception e) { logger.error("保存订单:" + e.getMessage()); throw new MallinkException(ErrorCode.COUPON_ORDER_SAVE_ERR.getCode(), coupon.getTitle() + ErrorCode.COUPON_ORDER_SAVE_ERR.getMessage()); @@ -860,7 +868,7 @@ public class WxOrderServiceImpl implements WxOrderService { // 创建couponOrder try { - createCouponOrder(updateOrder, user, coupon); + createCouponOrder(updateOrder, user, coupon, null); } catch (Exception e) { logger.error("创建券包:" + e.getMessage()); throw new MallinkException(ErrorCode.COUPON_ORDER_SAVE_ERR); @@ -1361,7 +1369,7 @@ public class WxOrderServiceImpl implements WxOrderService { WxOrder order = null; if (checkCouponIsFree(coupon)) { // 免费券 - order = saveFreeOrderForCoupon(user, coupon, orderSaveDto.getCouponChannelId(), orderSaveDto.getFormId()); + order = saveFreeOrderForCoupon(user, coupon, orderSaveDto.getCouponChannelId(), orderSaveDto.getFormId(), null); if(order != null) { // 6. 下订单完成,发送内部消息 // 下订单完成,发送内部消息 @@ -1395,7 +1403,7 @@ public class WxOrderServiceImpl implements WxOrderService { @Override @Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class}) - public WxOrder saveFreeOrderForCoupon(WxCUser user, WxCoupon coupon, Long couponChannelId, String formId) { + public WxOrder saveFreeOrderForCoupon(WxCUser user, WxCoupon coupon, Long couponChannelId, String formId, Long couponPasswordId) { // 1. check user info and coupon info userCouponMerchantCheck(user, coupon); if (coupon.checkIsCreditCoupon()) { @@ -1435,7 +1443,7 @@ public class WxOrderServiceImpl implements WxOrderService { // 5. 创建couponOrder try { - createCouponOrder(record, user, coupon); + createCouponOrder(record, user, coupon, couponPasswordId); } catch (Exception e) { logger.error("couponOrder失败:" + e.getMessage()); throw new MallinkException(ErrorCode.COUPON_ORDER_SAVE_ERR); diff --git a/mallinkService/src/main/java/com/iformall/service/msg/impl/SendSmsServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/msg/impl/SendSmsServiceImpl.java index b84c4f5cb..c3fb47844 100644 --- a/mallinkService/src/main/java/com/iformall/service/msg/impl/SendSmsServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/msg/impl/SendSmsServiceImpl.java @@ -56,7 +56,7 @@ public class SendSmsServiceImpl implements MsgSendService { throw new MallinkException(ErrorCode.MSG_CONFIG_NOT_FOUND); } wxMsgConfig = wxMsgConfigs.get(0); - if(wxMsgConfig.getRemains() <=0l){ + if (wxMsgConfig.getRemains() <= 0L) { throw new MallinkException(ErrorCode.MSG_CONFIG_ACCOUNT); } @@ -106,9 +106,10 @@ public class SendSmsServiceImpl implements MsgSendService { wxMsgValidationcode.setExpiretime(expiredate); } wxMsgValidationcodeMapper.insert(wxMsgValidationcode); - wxMsgValidationcodeService.addMsgCallback(wxMsgValidationcode,batchNo); + String id = record.getDynamicContentMap().get("id"); + wxMsgValidationcodeService.addMsgCallback(wxMsgValidationcode, batchNo, id); //扣减剩余条数 - wxMsgConfig.setRemains(1l); + wxMsgConfig.setRemains(1L); wxMsgConfigMapper.updateRemains(wxMsgConfig); }else{ throw new MallinkException(1001,"运营商返回失败:"+result); diff --git a/mallinkService/src/main/resources/mapper/WxCUserBasicInfoMapper.xml b/mallinkService/src/main/resources/mapper/WxCUserBasicInfoMapper.xml index 8a0a4530e..744248dc7 100644 --- a/mallinkService/src/main/resources/mapper/WxCUserBasicInfoMapper.xml +++ b/mallinkService/src/main/resources/mapper/WxCUserBasicInfoMapper.xml @@ -526,5 +526,8 @@ UPDATE wx_c_user_basic_info set act_record = act_record +1 where id = #{id} + diff --git a/mallinkService/src/main/resources/mapper/WxCouponMapper.xml b/mallinkService/src/main/resources/mapper/WxCouponMapper.xml index 4eddf76f7..2a192f5f6 100644 --- a/mallinkService/src/main/resources/mapper/WxCouponMapper.xml +++ b/mallinkService/src/main/resources/mapper/WxCouponMapper.xml @@ -43,6 +43,7 @@ + diff --git a/mallinkService/src/main/resources/mapper/WxCouponPasswordMapper.xml b/mallinkService/src/main/resources/mapper/WxCouponPasswordMapper.xml new file mode 100644 index 000000000..58389a5cc --- /dev/null +++ b/mallinkService/src/main/resources/mapper/WxCouponPasswordMapper.xml @@ -0,0 +1,143 @@ + + + + + + + + + + + + + + + + + + + `id`,`tenant_id`,`coupon_id`,`coupon_short`,`password`,`status`,`sended_phone`,`card_id`,`create_date`,`update_date`,`expire_date` + + + + where 1 = 1 + + and `id` = #{id} + + + and `tenant_id` = #{tenantId} + + + and `coupon_id` = #{couponId} + + + and `coupon_short` = #{couponShort} + + + and `password` = #{password} + + + and `status` = #{status} + + + and `sended_phone` = #{sendedPhone} + + + and `card_id` = #{cardId} + + + and `create_date` = #{createDate} + + + and `update_date` = #{updateDate} + + + and `expire_date` > #{expireDate} + + + and id in + + #{idItem} + + + + + and status in (${statusStr}) + + + order by ${sortColumns} + + + + + + + + INSERT INTO wx_coupon_password (`id`,`coupon_id`,`coupon_short`,`password`,`status`,`create_date`,`update_date`) + VALUES + + ( + #{item.id},#{item.couponId},#{item.couponShort},#{item.password},#{item.status}, + #{item.createDate},#{item.updateDate} + ) + + + + + update wx_coupon_password + set status=4, update_date=now() + where status != 3 and tenant_id = #{tenantId} and coupon_id=#{couponId} + + + + + + + + + + + + + + + + update wx_coupon_password set status=1,send_phone=#{sendPhone},update_date=now() where id = ${item.id} + + + + diff --git a/mallinkService/src/main/resources/mapper/WxCouponPresentMapper.xml b/mallinkService/src/main/resources/mapper/WxCouponPresentMapper.xml new file mode 100644 index 000000000..fba10885a --- /dev/null +++ b/mallinkService/src/main/resources/mapper/WxCouponPresentMapper.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + `id`,`tenant_id`,`coupon_id`,`coupon_name`,`user_id`,`create_time`,`update_time`,`send_amount` + + + + where 1 = 1 + + and `id` = #{id} + + + and `tenant_id` = #{tenantId} + + + and `coupon_id` = #{couponId} + + + and `coupon_name` like concat('%', #{couponName},'%') + + + and `phones` like concat('%', #{phones},'%') + + + and `create_date` between #{sendTimeStart} and #{sendTimeEnd} + + + and `update_date` = #{updateTime} + + + and id in + + #{idItem} + + + order by ${sortColumns} + + + + + diff --git a/mallinkService/src/main/resources/mapper/WxCreditHistoryMapper.xml b/mallinkService/src/main/resources/mapper/WxCreditHistoryMapper.xml index acbddbc96..c89e7fd7a 100644 --- a/mallinkService/src/main/resources/mapper/WxCreditHistoryMapper.xml +++ b/mallinkService/src/main/resources/mapper/WxCreditHistoryMapper.xml @@ -213,7 +213,7 @@ select credit.credit_amount as amount,credit.c_user_id from wx_credit_history credit INNER join (select max(create_date) create_date,credit.c_user_id from wx_credit_history credit group by credit.c_user_id) credit_max_id - on credit.create_date=credit_max_id.create_date + on credit.create_date=credit_max_id.create_date and credit.c_user_id=credit_max_id.c_user_id INNER JOIN wx_c_user_basic_info basic ON basic.id = credit.c_user_id LEFT JOIN wx_merchant merchant ON credit.merchant_id = merchant.id @@ -253,4 +253,13 @@ select from wx_credit_history where create_date > #{dateTime} and credit_type = #{creditType} + + diff --git a/mallinkSysAdmin/src/main/java/com/iformall/controller/sys/DataInitController.java b/mallinkSysAdmin/src/main/java/com/iformall/controller/sys/DataInitController.java index 03c8ffcb6..d75af0454 100644 --- a/mallinkSysAdmin/src/main/java/com/iformall/controller/sys/DataInitController.java +++ b/mallinkSysAdmin/src/main/java/com/iformall/controller/sys/DataInitController.java @@ -1,6 +1,8 @@ package com.iformall.controller.sys; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.google.common.base.Function; +import com.google.common.collect.*; import com.iformall.common.ErrorCode; import com.iformall.common.IdWorker; import com.iformall.common.ResultData; @@ -14,14 +16,17 @@ import com.iformall.mapper.*; import com.iformall.service.WxCreditHistoryService; import com.iformall.utils.DateUtils; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; +import org.apache.commons.collections.CollectionUtils; +import org.checkerframework.checker.nullness.qual.Nullable; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; +import java.math.BigDecimal; import java.util.*; +import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; /** @@ -100,6 +105,28 @@ public class DataInitController extends BaseController { return new ResultData(); } + + /** + * 修复wx_c_user_basic_info积分数据 + * + * @return + */ + @GetMapping("/fixCredit4CUserBasic") + public ResultData fixCredit4CUserBasic() { + try { + MallUserInfo userInfo = getUser(); + if (userInfo.isFmSuperAdmin()) { + doFixCredit4CUserBasic(); + return new ResultData(); + } + } catch (Exception e) { + log.error("DataInitController::fixCredit4CUserBasic error ", e); + return new ResultData(ErrorCode.MSG_METHOD_REQUEST_ERROR, e.getMessage()); + } + + return new ResultData(); + } + /** * 核销积分数据修复 * @@ -121,6 +148,47 @@ public class DataInitController extends BaseController { return new ResultData(); } + @Transactional(rollbackFor = Exception.class) + public void doFixCredit4CUserBasic() { + log.debug("cUserBasic积分更新, begin --------------》"); + // 1 查找c_user_basic中c_user不存在且积分为null的用户用户 + List userBasicInfoList = cUserBasicInfoMapper.selectNotCUserList(); + List ids = userBasicInfoList.stream().map(WxCUserBasicInfo::getId).collect(Collectors.toList()); + //log.debug("ids {}", JSON.toJSONString(ids)); + + // 2 获取对应用户的积分记录 + List creditList = creditHistoryMapper.findListByIds(ids); + ImmutableListMultimap userCreditHistory = Multimaps.index(creditList, new Function() { + @Nullable + @Override + public Long apply(@Nullable WxCreditHistory input) { + return input.getCUserId(); + } + }); + + //3 将历史记录最好积分重设积分 + AtomicInteger count = new AtomicInteger(0); + userBasicInfoList.forEach(wxCUserBasicInfo -> { + ImmutableList historyList = userCreditHistory.get(wxCUserBasicInfo.getId()); + WxCUserBasicInfo toUpdateUser = new WxCUserBasicInfo(); + toUpdateUser.setId(wxCUserBasicInfo.getId()); + //用户积分不存在,跳过 + if (CollectionUtils.isEmpty(historyList)) { + //log.debug("cUserBasic积分更新,id: {} 积分记录不存在", wxCUserBasicInfo.getId()); + return; + } + //积分记录存在,使用最新的总积分重新赋值 + WxCreditHistory wxCreditHistory = historyList.get(0); + toUpdateUser.setCredit(wxCreditHistory.getCreditAmount()); + cUserBasicInfoMapper.updateById(toUpdateUser); + log.debug("cUserBasic积分更新,id: {},原积分: {},新积分: {}, 积分时间: {}", wxCUserBasicInfo.getId(), wxCUserBasicInfo.getCredit(), toUpdateUser.getCredit(), DateUtils.format(wxCreditHistory.getCreateDate())); + count.getAndIncrement(); + }); + + log.debug("cUserBasic积分更新,更新用户 {}", count.intValue()); + log.debug("cUserBasic积分更新, end --------------》"); + } + @Transactional(rollbackFor = Exception.class) public void doFixCredit() { // 1 获取积分记录 @@ -144,7 +212,7 @@ public class DataInitController extends BaseController { return; } //根据商户id和花费金额计算需要新增的积分 - Map result = creditHistoryService.findByMerchantIdAndSpend(wxCreditHistory.getMerchantId(), String.valueOf(wxCreditHistory.getSpend()), wxCreditHistory.getCUserId(),wxCreditHistory.getTenantId()); + Map result = creditHistoryService.findByMerchantIdAndSpend(wxCreditHistory.getMerchantId(), String.valueOf(new BigDecimal(wxCreditHistory.getSpend()/100)), wxCreditHistory.getCUserId(),wxCreditHistory.getTenantId()); //Map result = creditHistoryService.findByMerchantIdAndSpend(wxCreditHistory.getMerchantId(), String.valueOf(wxCreditHistory.getSpend()), wxCreditHistory.getCUserId(), wxCreditHistory.getTenantId()); Integer creditDB = wxCreditHistory.getCreditNum();