From 48c7a40602ae52f17437abc69572b496017b9a8c Mon Sep 17 00:00:00 2001 From: "1215525055@qq.com" <1215525055@qq.com> Date: Mon, 3 Mar 2025 18:03:56 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BA=86=E5=85=85=E5=80=BC?= =?UTF-8?q?=E7=9A=84=E9=80=BB=E8=BE=91=20,=20=E4=BF=AE=E6=94=B9=E4=BA=86?= =?UTF-8?q?=E7=99=BB=E5=BD=95=E9=A1=B5=E7=9A=84Logo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../remote/IOperatorPluginRemoteService.java | 27 +- .../operator/remote/PackageInfoAppDTO.java | 138 ++++++++++ .../operator/remote/PackageInfoDTO.java | 251 ++++++++++++++++++ .../operator/remote/PackageOrderDTO.java | 219 +++++++++++++++ .../IAccountRechargeService.java | 2 + .../impl/AccountRechargeServiceImpl.java | 56 +++- .../util/task/WxPayResultCheckTask.java | 30 ++- .../account-recharge-mapper.xml | 3 + .../static/assets/images/headicon1.png | Bin 8895 -> 16191 bytes 9 files changed, 700 insertions(+), 26 deletions(-) create mode 100644 src/main/java/cn/com/tenlion/operator/remote/PackageInfoAppDTO.java create mode 100644 src/main/java/cn/com/tenlion/operator/remote/PackageInfoDTO.java create mode 100644 src/main/java/cn/com/tenlion/operator/remote/PackageOrderDTO.java diff --git a/src/main/java/cn/com/tenlion/operator/remote/IOperatorPluginRemoteService.java b/src/main/java/cn/com/tenlion/operator/remote/IOperatorPluginRemoteService.java index 79ba4f5..b6671e2 100644 --- a/src/main/java/cn/com/tenlion/operator/remote/IOperatorPluginRemoteService.java +++ b/src/main/java/cn/com/tenlion/operator/remote/IOperatorPluginRemoteService.java @@ -9,6 +9,7 @@ import ink.wgink.annotation.rpc.rest.params.RemotePathParams; import ink.wgink.annotation.rpc.rest.params.RemoteQueryParams; import ink.wgink.annotation.rpc.rest.params.RemoteServerParams; import ink.wgink.pojo.result.SuccessResult; +import ink.wgink.pojo.result.SuccessResultData; import java.util.HashMap; import java.util.List; @@ -23,7 +24,7 @@ public interface IOperatorPluginRemoteService { * @return */ @RemotePostMethod("/resource/packageorder/update-close/{packageNo}") - SuccessResult updateClose(@RemoteServerParams String server, + SuccessResultData updateClose(@RemoteServerParams String server, @RemotePathParams("packageNo") String packageNo, @RemoteQueryParams("access_token") String accessToken); @@ -33,10 +34,24 @@ public interface IOperatorPluginRemoteService { * @param accessToken * @return */ - @RemotePostMethod("/resource/packageorder/update-pay/{packageNo}") - SuccessResult updatePay(@RemoteServerParams String server, - @RemotePathParams("packageNo") String packageNo, - @RemoteQueryParams("access_token") String accessToken); + @RemotePostMethod("/resource/packageorder/update-pay/{packageNo}/{packageAccountItem}") + SuccessResultData updatePay(@RemoteServerParams String server, + @RemotePathParams("packageNo") String packageNo, + @RemotePathParams("packageAccountItem") String packageAccountItem, + @RemoteQueryParams("access_token") String accessToken); + + + /** + * 获取套餐包信息 + * @param server + * @param accessToken + * @return + */ + @RemoteGetMethod("/resource/packageorder/getByNo/{packageNo}") + PackageOrderDTO getByNo(@RemoteServerParams String server, + @RemotePathParams("packageNo") String packageNo, + @RemoteQueryParams("access_token") String accessToken); + /** * 创建套餐包购买记录 @@ -46,7 +61,7 @@ public interface IOperatorPluginRemoteService { * @return */ @RemotePostMethod("/resource/packageorder/save") - SuccessResult saveOrder(@RemoteServerParams String server, + SuccessResultData saveOrder(@RemoteServerParams String server, @RemoteJsonBodyParams PackageOrderAppVO appVO, @RemoteQueryParams("access_token") String accessToken); diff --git a/src/main/java/cn/com/tenlion/operator/remote/PackageInfoAppDTO.java b/src/main/java/cn/com/tenlion/operator/remote/PackageInfoAppDTO.java new file mode 100644 index 0000000..2ef6eb6 --- /dev/null +++ b/src/main/java/cn/com/tenlion/operator/remote/PackageInfoAppDTO.java @@ -0,0 +1,138 @@ +package cn.com.tenlion.operator.remote; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * + * @ClassName: PackageInfoAppDTO + * @Description: 套餐包 + * @Author: CodeFactory + * @Date: 2025-02-26 14:46:41 + * @Version: 3.0 + **/ +@ApiModel +public class PackageInfoAppDTO { + + @ApiModelProperty(name = "packageInfoId", value = "套餐ID") + private String packageInfoId; + @ApiModelProperty(name = "packageName", value = "套餐名称") + private String packageName; + @ApiModelProperty(name = "packageType", value = "类型 MATERIAL 写材料 . ALL 全托管") + private String packageType; + @ApiModelProperty(name = "packageMode", value = "可购买次数 single(每个用户可购买1次), all(不限)") + private String packageMode; + @ApiModelProperty(name = "packageOriginalPrice", value = "原价/单位分") + private Integer packageOriginalPrice; + @ApiModelProperty(name = "packageMoney", value = "套餐价/单位分") + private Integer packageMoney; + @ApiModelProperty(name = "packageCount", value = "套餐次数") + private Integer packageCount; + @ApiModelProperty(name = "packageAvgMoney", value = "单次均价/单位分") + private Integer packageAvgMoney; + @ApiModelProperty(name = "packageOrder", value = "排序") + private Integer packageOrder; + @ApiModelProperty(name = "packageDescription", value = "说明") + private String packageDescription; + @ApiModelProperty(name = "packageOnlienTime", value = "发布时间") + private String packageOnlienTime; + @ApiModelProperty(name = "createTime", value = "") + private String createTime; + + public String getPackageOnlienTime() { + return packageOnlienTime == null ? "" : packageOnlienTime.trim(); + } + + public void setPackageOnlienTime(String packageOnlienTime) { + this.packageOnlienTime = packageOnlienTime; + } + + public String getPackageInfoId() { + return packageInfoId == null ? "" : packageInfoId.trim(); + } + + public void setPackageInfoId(String packageInfoId) { + this.packageInfoId = packageInfoId; + } + + public String getPackageName() { + return packageName == null ? "" : packageName.trim(); + } + + public void setPackageName(String packageName) { + this.packageName = packageName; + } + + public String getPackageType() { + return packageType == null ? "" : packageType.trim(); + } + + public void setPackageType(String packageType) { + this.packageType = packageType; + } + + public String getPackageMode() { + return packageMode == null ? "" : packageMode.trim(); + } + + public void setPackageMode(String packageMode) { + this.packageMode = packageMode; + } + + public Integer getPackageOriginalPrice() { + return packageOriginalPrice == null ? 0 : packageOriginalPrice; + } + + public void setPackageOriginalPrice(Integer packageOriginalPrice) { + this.packageOriginalPrice = packageOriginalPrice; + } + + public Integer getPackageMoney() { + return packageMoney == null ? 0 : packageMoney; + } + + public void setPackageMoney(Integer packageMoney) { + this.packageMoney = packageMoney; + } + + public Integer getPackageCount() { + return packageCount == null ? 0 : packageCount; + } + + public void setPackageCount(Integer packageCount) { + this.packageCount = packageCount; + } + + public Integer getPackageAvgMoney() { + return packageAvgMoney == null ? 0 : packageAvgMoney; + } + + public void setPackageAvgMoney(Integer packageAvgMoney) { + this.packageAvgMoney = packageAvgMoney; + } + + public Integer getPackageOrder() { + return packageOrder == null ? 0 : packageOrder; + } + + public void setPackageOrder(Integer packageOrder) { + this.packageOrder = packageOrder; + } + + public String getPackageDescription() { + return packageDescription == null ? "" : packageDescription.trim(); + } + + public void setPackageDescription(String packageDescription) { + this.packageDescription = packageDescription; + } + + public String getCreateTime() { + return createTime == null ? "" : createTime.trim(); + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + +} diff --git a/src/main/java/cn/com/tenlion/operator/remote/PackageInfoDTO.java b/src/main/java/cn/com/tenlion/operator/remote/PackageInfoDTO.java new file mode 100644 index 0000000..6bbe4d9 --- /dev/null +++ b/src/main/java/cn/com/tenlion/operator/remote/PackageInfoDTO.java @@ -0,0 +1,251 @@ +package cn.com.tenlion.operator.remote; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.util.ArrayList; +import java.util.List; + +/** + * + * @ClassName: PackageInfoDTO + * @Description: 套餐包 + * @Author: CodeFactory + * @Date: 2025-02-26 14:46:41 + * @Version: 3.0 + **/ +@ApiModel +public class PackageInfoDTO { + + @ApiModelProperty(name = "packageInfoId", value = "套餐ID") + private String packageInfoId; + @ApiModelProperty(name = "packageName", value = "套餐名称") + private String packageName; + @ApiModelProperty(name = "packageType", value = "类型写材料 . 全托管等的枚举名") + private String packageType; + @ApiModelProperty(name = "packageMode", value = "可购买次数 single(每个用户可购买1次), infinite(不限)") + private String packageMode; + @ApiModelProperty(name = "packageOriginalPrice", value = "原价/单位分") + private Integer packageOriginalPrice; + @ApiModelProperty(name = "packageMoney", value = "套餐价/单位分") + private Integer packageMoney; + @ApiModelProperty(name = "packageCount", value = "套餐次数") + private Integer packageCount; + @ApiModelProperty(name = "packageLimitUsers", value = "限定购买人,为空则不限定") + private String packageLimitUsers; + @ApiModelProperty(name = "packageLimitCount", value = "限定售卖数量,为空则不限定") + private Integer packageLimitCount; + @ApiModelProperty(name = "packageActivity", value = "是否为活动套餐") + private String packageActivity; + @ApiModelProperty(name = "packageActivityStart", value = "活动开始时间") + private String packageActivityStart; + @ApiModelProperty(name = "packageActivityEnd", value = "活动结束时间") + private String packageActivityEnd; + @ApiModelProperty(name = "packageAvgMoney", value = "单次均价/单位分") + private Integer packageAvgMoney; + @ApiModelProperty(name = "packageOrder", value = "排序") + private Integer packageOrder; + @ApiModelProperty(name = "packageDescription", value = "说明") + private String packageDescription; + @ApiModelProperty(name = "packageStatus", value = "发布状态(发布过的不允许再修改)") + private String packageStatus; + @ApiModelProperty(name = "packageOnlien", value = "上架状态") + private String packageOnlien; + @ApiModelProperty(name = "packageOnlienTime", value = "状态改变时间") + private String packageOnlienTime; + @ApiModelProperty(name = "createTime", value = "") + private String createTime; + @ApiModelProperty(name = "creator", value = "") + private String creator; + @ApiModelProperty(name = "gmtModified", value = "") + private String gmtModified; + @ApiModelProperty(name = "modifier", value = "") + private String modifier; + @ApiModelProperty(name = "isDelete", value = "") + private String isDelete; + + public String getPackageInfoId() { + return packageInfoId == null ? "" : packageInfoId.trim(); + } + + public void setPackageInfoId(String packageInfoId) { + this.packageInfoId = packageInfoId; + } + + public String getPackageName() { + return packageName == null ? "" : packageName.trim(); + } + + public void setPackageName(String packageName) { + this.packageName = packageName; + } + + public String getPackageType() { + return packageType == null ? "" : packageType.trim(); + } + + public void setPackageType(String packageType) { + this.packageType = packageType; + } + + public String getPackageMode() { + return packageMode == null ? "" : packageMode.trim(); + } + + public void setPackageMode(String packageMode) { + this.packageMode = packageMode; + } + + public Integer getPackageOriginalPrice() { + return packageOriginalPrice == null ? 0 : packageOriginalPrice; + } + + public void setPackageOriginalPrice(Integer packageOriginalPrice) { + this.packageOriginalPrice = packageOriginalPrice; + } + + public Integer getPackageMoney() { + return packageMoney == null ? 0 : packageMoney; + } + + public void setPackageMoney(Integer packageMoney) { + this.packageMoney = packageMoney; + } + + public Integer getPackageCount() { + return packageCount == null ? 0 : packageCount; + } + + public void setPackageCount(Integer packageCount) { + this.packageCount = packageCount; + } + + public String getPackageLimitUsers() { + return packageLimitUsers == null ? "" : packageLimitUsers.trim(); + } + + public void setPackageLimitUsers(String packageLimitUsers) { + this.packageLimitUsers = packageLimitUsers; + } + + public Integer getPackageLimitCount() { + return packageLimitCount == null ? 0 : packageLimitCount; + } + + public void setPackageLimitCount(Integer packageLimitCount) { + this.packageLimitCount = packageLimitCount; + } + + public String getPackageActivity() { + return packageActivity == null ? "" : packageActivity.trim(); + } + + public void setPackageActivity(String packageActivity) { + this.packageActivity = packageActivity; + } + + public String getPackageActivityStart() { + return packageActivityStart == null ? "" : packageActivityStart.trim(); + } + + public void setPackageActivityStart(String packageActivityStart) { + this.packageActivityStart = packageActivityStart; + } + + public String getPackageActivityEnd() { + return packageActivityEnd == null ? "" : packageActivityEnd.trim(); + } + + public void setPackageActivityEnd(String packageActivityEnd) { + this.packageActivityEnd = packageActivityEnd; + } + + public Integer getPackageAvgMoney() { + return packageAvgMoney == null ? 0 : packageAvgMoney; + } + + public void setPackageAvgMoney(Integer packageAvgMoney) { + this.packageAvgMoney = packageAvgMoney; + } + + public Integer getPackageOrder() { + return packageOrder == null ? 0 : packageOrder; + } + + public void setPackageOrder(Integer packageOrder) { + this.packageOrder = packageOrder; + } + + public String getPackageDescription() { + return packageDescription == null ? "" : packageDescription.trim(); + } + + public void setPackageDescription(String packageDescription) { + this.packageDescription = packageDescription; + } + + public String getPackageStatus() { + return packageStatus == null ? "" : packageStatus.trim(); + } + + public void setPackageStatus(String packageStatus) { + this.packageStatus = packageStatus; + } + + public String getPackageOnlien() { + return packageOnlien == null ? "" : packageOnlien.trim(); + } + + public void setPackageOnlien(String packageOnlien) { + this.packageOnlien = packageOnlien; + } + + public String getPackageOnlienTime() { + return packageOnlienTime == null ? "" : packageOnlienTime.trim(); + } + + public void setPackageOnlienTime(String packageOnlienTime) { + this.packageOnlienTime = packageOnlienTime; + } + + public String getCreateTime() { + return createTime == null ? "" : createTime.trim(); + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getCreator() { + return creator == null ? "" : creator.trim(); + } + + public void setCreator(String creator) { + this.creator = creator; + } + + public String getGmtModified() { + return gmtModified == null ? "" : gmtModified.trim(); + } + + public void setGmtModified(String gmtModified) { + this.gmtModified = gmtModified; + } + + public String getModifier() { + return modifier == null ? "" : modifier.trim(); + } + + public void setModifier(String modifier) { + this.modifier = modifier; + } + + public String getIsDelete() { + return isDelete == null ? "" : isDelete.trim(); + } + + public void setIsDelete(String isDelete) { + this.isDelete = isDelete; + } + + +} diff --git a/src/main/java/cn/com/tenlion/operator/remote/PackageOrderDTO.java b/src/main/java/cn/com/tenlion/operator/remote/PackageOrderDTO.java new file mode 100644 index 0000000..05e9bf3 --- /dev/null +++ b/src/main/java/cn/com/tenlion/operator/remote/PackageOrderDTO.java @@ -0,0 +1,219 @@ +package cn.com.tenlion.operator.remote; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * + * @ClassName: PackageOrderDTO + * @Description: 套餐包-订单 + * @Author: CodeFactory + * @Date: 2025-02-26 14:48:15 + * @Version: 3.0 + **/ +@ApiModel +public class PackageOrderDTO { + + @ApiModelProperty(name = "packageOrderId", value = "套餐订单") + private String packageOrderId; + @ApiModelProperty(name = "packageInfoId", value = "套餐ID") + private String packageInfoId; + @ApiModelProperty(name = "packageName", value = "套餐名称") + private String packageName; + @ApiModelProperty(name = "packageTotalMoney", value = "套餐订单总金额/单位分") + private Integer packageTotalMoney; + @ApiModelProperty(name = "packageTotalCount", value = "套餐订单总次数/单位分") + private Integer packageTotalCount; + @ApiModelProperty(name = "packageTotalAvgMoney", value = "套餐订单单次均价/单位分") + private Integer packageTotalAvgMoney; + @ApiModelProperty(name = "packageTotalSurplusCount", value = "当前剩余次数") + private Integer packageTotalSurplusCount; + @ApiModelProperty(name = "packageNo", value = "充值交易ID") + private String packageNo; + @ApiModelProperty(name = "packagePayStatus", value = "充值到账0未到账,1已到账") + private String packagePayStatus; + @ApiModelProperty(name = "packageAccountItem", value = "充值到账ID") + private String packageAccountItem; + @ApiModelProperty(name = "packagePay", value = "订单付款时间") + private String packagePay; + @ApiModelProperty(name = "creator", value = "订单创建人") + private String creator; + @ApiModelProperty(name = "gmtCreate", value = "下单时间") + private String gmtCreate; + @ApiModelProperty(name = "modifier", value = "") + private String modifier; + @ApiModelProperty(name = "gmtModified", value = "") + private String gmtModified; + @ApiModelProperty(name = "isDelete", value = "状态") + private String isDelete; + @ApiModelProperty(name = "userName", value = "创建者名称") + private String userName; + @ApiModelProperty(name = "userType", value = "创建者类型") + private String userType; + @ApiModelProperty(name = "userUsername", value = "") + private String userUsername; + @ApiModelProperty(name = "packageInfoAppDTO", value = "") + private PackageInfoAppDTO packageInfoAppDTO; + + public PackageInfoAppDTO getPackageInfoAppDTO() { + return packageInfoAppDTO; + } + + public void setPackageInfoAppDTO(PackageInfoAppDTO packageInfoAppDTO) { + this.packageInfoAppDTO = packageInfoAppDTO; + } + + public String getPackagePayStatus() { + return packagePayStatus == null ? "" : packagePayStatus.trim(); + } + + public void setPackagePayStatus(String packagePayStatus) { + this.packagePayStatus = packagePayStatus; + } + + public String getPackageAccountItem() { + return packageAccountItem == null ? "" : packageAccountItem.trim(); + } + + public void setPackageAccountItem(String packageAccountItem) { + this.packageAccountItem = packageAccountItem; + } + + public String getPackageName() { + return packageName == null ? "" : packageName.trim(); + } + + public void setPackageName(String packageName) { + this.packageName = packageName; + } + + public String getUserName() { + return userName == null ? "" : userName.trim(); + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public String getUserType() { + return userType == null ? "" : userType.trim(); + } + + public void setUserType(String userType) { + this.userType = userType; + } + + public String getUserUsername() { + return userUsername == null ? "" : userUsername.trim(); + } + + public void setUserUsername(String userUsername) { + this.userUsername = userUsername; + } + + public String getPackageOrderId() { + return packageOrderId == null ? "" : packageOrderId.trim(); + } + + public void setPackageOrderId(String packageOrderId) { + this.packageOrderId = packageOrderId; + } + + public String getPackageInfoId() { + return packageInfoId == null ? "" : packageInfoId.trim(); + } + + public void setPackageInfoId(String packageInfoId) { + this.packageInfoId = packageInfoId; + } + + public Integer getPackageTotalMoney() { + return packageTotalMoney == null ? 0 : packageTotalMoney; + } + + public void setPackageTotalMoney(Integer packageTotalMoney) { + this.packageTotalMoney = packageTotalMoney; + } + + public Integer getPackageTotalCount() { + return packageTotalCount == null ? 0 : packageTotalCount; + } + + public void setPackageTotalCount(Integer packageTotalCount) { + this.packageTotalCount = packageTotalCount; + } + + public Integer getPackageTotalAvgMoney() { + return packageTotalAvgMoney == null ? 0 : packageTotalAvgMoney; + } + + public void setPackageTotalAvgMoney(Integer packageTotalAvgMoney) { + this.packageTotalAvgMoney = packageTotalAvgMoney; + } + + public Integer getPackageTotalSurplusCount() { + return packageTotalSurplusCount == null ? 0 : packageTotalSurplusCount; + } + + public void setPackageTotalSurplusCount(Integer packageTotalSurplusCount) { + this.packageTotalSurplusCount = packageTotalSurplusCount; + } + + public String getPackageNo() { + return packageNo == null ? "" : packageNo.trim(); + } + + public void setPackageNo(String packageNo) { + this.packageNo = packageNo; + } + + public String getPackagePay() { + return packagePay == null ? "" : packagePay.trim(); + } + + public void setPackagePay(String packagePay) { + this.packagePay = packagePay; + } + + public String getCreator() { + return creator == null ? "" : creator.trim(); + } + + public void setCreator(String creator) { + this.creator = creator; + } + + public String getGmtCreate() { + return gmtCreate == null ? "" : gmtCreate.trim(); + } + + public void setGmtCreate(String gmtCreate) { + this.gmtCreate = gmtCreate; + } + + public String getModifier() { + return modifier == null ? "" : modifier.trim(); + } + + public void setModifier(String modifier) { + this.modifier = modifier; + } + + public String getGmtModified() { + return gmtModified == null ? "" : gmtModified.trim(); + } + + public void setGmtModified(String gmtModified) { + this.gmtModified = gmtModified; + } + + public String getIsDelete() { + return isDelete == null ? "" : isDelete.trim(); + } + + public void setIsDelete(String isDelete) { + this.isDelete = isDelete; + } + + +} diff --git a/src/main/java/cn/com/tenlion/operator/service/accountrecharge/IAccountRechargeService.java b/src/main/java/cn/com/tenlion/operator/service/accountrecharge/IAccountRechargeService.java index f9cf0df..3838e2a 100644 --- a/src/main/java/cn/com/tenlion/operator/service/accountrecharge/IAccountRechargeService.java +++ b/src/main/java/cn/com/tenlion/operator/service/accountrecharge/IAccountRechargeService.java @@ -22,6 +22,8 @@ import java.util.Map; **/ public interface IAccountRechargeService { + List listPOByOnlineNotCheck(String queryOnline); + /** * 新增账户充值 * diff --git a/src/main/java/cn/com/tenlion/operator/service/accountrecharge/impl/AccountRechargeServiceImpl.java b/src/main/java/cn/com/tenlion/operator/service/accountrecharge/impl/AccountRechargeServiceImpl.java index 1d0a7ce..1dcbcdc 100644 --- a/src/main/java/cn/com/tenlion/operator/service/accountrecharge/impl/AccountRechargeServiceImpl.java +++ b/src/main/java/cn/com/tenlion/operator/service/accountrecharge/impl/AccountRechargeServiceImpl.java @@ -11,7 +11,9 @@ import cn.com.tenlion.operator.pojo.dtos.ic.UsericDTO; import cn.com.tenlion.operator.pojo.vos.accountitem.AccountItemVO; import cn.com.tenlion.operator.properties.SystemApiPathProperties; import cn.com.tenlion.operator.remote.IOperatorPluginRemoteService; +import cn.com.tenlion.operator.remote.PackageInfoDTO; import cn.com.tenlion.operator.remote.PackageOrderAppVO; +import cn.com.tenlion.operator.remote.PackageOrderDTO; import cn.com.tenlion.operator.service.account.IAccountService; import cn.com.tenlion.operator.service.accountbank.IAccountBankService; import cn.com.tenlion.operator.service.accountitem.IAccountItemService; @@ -36,6 +38,7 @@ import ink.wgink.module.oauth2.manager.OAuth2ClientTokenManager; import ink.wgink.pojo.ListPage; import ink.wgink.pojo.dtos.user.UserDTO; import ink.wgink.pojo.result.SuccessResult; +import ink.wgink.pojo.result.SuccessResultData; import ink.wgink.pojo.result.SuccessResultList; import ink.wgink.util.date.DateUtil; import ink.wgink.util.map.HashMapUtil; @@ -315,8 +318,11 @@ public class AccountRechargeServiceImpl extends DefaultBaseService implements IA // 创建套餐包关闭支付 if(!StringUtils.isEmpty(dto.getPackageInfoId())) { String accessToken = OAuth2ClientTokenManager.getInstance().getToken().getAccessToken(); - SuccessResult result = operatorPluginRemoteService.updateClose(systemApiPathProperties.getOperatorPlugin(), accountRechargeId, accessToken); - System.out.println("调用套餐包关闭结果 : " + result); + SuccessResultData result = operatorPluginRemoteService.updateClose(systemApiPathProperties.getOperatorPlugin(), accountRechargeId, accessToken); + if (!result.getData().equals("Success")) { + System.out.println("调用套餐包关闭结果 : " + result); + throw new SaveException(result.getData()); + } } } @@ -358,23 +364,41 @@ public class AccountRechargeServiceImpl extends DefaultBaseService implements IA AccountRechargeDTO dto = get(accountRechargeId); // 绑定了套餐包 & 已对账 & 已到账 if(!StringUtils.isEmpty(dto.getPackageInfoId()) && dto.getReconciliationStatus().equals("1") && dto.getRechargeCheck().equals("2")) { - // 远程更改套餐包的付款到账状态 String accessToken = OAuth2ClientTokenManager.getInstance().getToken().getAccessToken(); - SuccessResult result = operatorPluginRemoteService.updatePay(systemApiPathProperties.getOperatorPlugin(), accountRechargeId, accessToken); - System.out.println("调用套餐包到账结果 : " + result); + PackageOrderDTO packageInfoDTO = operatorPluginRemoteService.getByNo(systemApiPathProperties.getOperatorPlugin(), accountRechargeId , accessToken); + /** + * 1. 创建流水 + */ + AccountItemVO vo = new AccountItemVO(); + vo.setType(2); + vo.setMode(2); + vo.setAccountId(dto.getCreator()); + vo.setOrderId(packageInfoDTO.getPackageOrderId()); + vo.setAccountMoney(packageInfoDTO.getPackageTotalMoney()); + vo.setDescription("购买" + (packageInfoDTO.getPackageInfoAppDTO().getPackageType().equals("ALL") ? "全托管" : "写材料" ) + "套餐包 " + packageInfoDTO.getPackageInfoAppDTO().getPackageCount() + " 件:" + packageInfoDTO.getPackageInfoAppDTO().getPackageName()); + String accountItemId1 = iAccountItemService.saveReturnId(vo); + // 远程更改套餐包的付款到账状态 + SuccessResultData result = operatorPluginRemoteService.updatePay(systemApiPathProperties.getOperatorPlugin(), accountRechargeId, accountItemId1, accessToken); + if (!result.getData().equals("Success")) { + System.out.println("调用套餐包到账结果 : " + result); + throw new SaveException(result.getData()); + } } // 绑定了套餐包 & 已对账 & 已关闭 if(!StringUtils.isEmpty(dto.getPackageInfoId()) && dto.getReconciliationStatus().equals("1") && dto.getRechargeCheck().equals("-1")) { String accessToken = OAuth2ClientTokenManager.getInstance().getToken().getAccessToken(); - SuccessResult result = operatorPluginRemoteService.updateClose(systemApiPathProperties.getOperatorPlugin(), accountRechargeId, accessToken); - System.out.println("调用套餐包关闭结果 : " + result); + SuccessResultData result = operatorPluginRemoteService.updateClose(systemApiPathProperties.getOperatorPlugin(), accountRechargeId, accessToken); + if (!result.getData().equals("Success")) { + System.out.println("调用套餐包关闭结果 : " + result); + throw new SaveException(result.getData()); + } } } @Override public AccountRechargePayDTO saveAccount(String thirdParty, AccountRechargeVO accountRechargeVO) { AccountRechargePayDTO payDTO = new AccountRechargePayDTO(); - synchronized (lock) { + // synchronized (lock) { String userId = accountRechargeVO.getUserId(); // 未支付的订单 Integer count = countByUserIdAndRechargeCheck(userId, RechargeCheckEnum.UN_RECHARGE); @@ -432,8 +456,11 @@ public class AccountRechargeServiceImpl extends DefaultBaseService implements IA appVO.setAccountRechargeId(payDTO.getAccountRechargeId()); String accessToken = OAuth2ClientTokenManager.getInstance().getToken().getAccessToken(); - SuccessResult result = operatorPluginRemoteService.saveOrder(systemApiPathProperties.getOperatorPlugin(), appVO, accessToken); - System.out.println("调用套餐包创建结果 : " + result); + SuccessResultData result = operatorPluginRemoteService.saveOrder(systemApiPathProperties.getOperatorPlugin(), appVO, accessToken); + if (!result.getData().equals("Success")) { + System.out.println("调用套餐包创建结果 : " + result); + throw new SaveException(result.getData()); + } } if (ThirdPartyEnum.DGZZ.getValue().equals(thirdParty)) { /** @@ -451,7 +478,7 @@ public class AccountRechargeServiceImpl extends DefaultBaseService implements IA templateParams.put("money", PayUtil.buiderMoney(totalMoney) + ""); TenlionSMS.sendMessage(UUIDUtil.getUUID(), "M00005", templateParams, phoneArray); } - } + // } return payDTO; } @@ -485,6 +512,13 @@ public class AccountRechargeServiceImpl extends DefaultBaseService implements IA return listPO(params); } + @Override + public List listPOByOnlineNotCheck(String queryOnline) { + Map params = getHashMap(2); + params.put("queryOnline", queryOnline); + return listPO(params); + } + /** * 对公转账 * diff --git a/src/main/java/cn/com/tenlion/operator/util/task/WxPayResultCheckTask.java b/src/main/java/cn/com/tenlion/operator/util/task/WxPayResultCheckTask.java index 5d59b11..c3f0346 100644 --- a/src/main/java/cn/com/tenlion/operator/util/task/WxPayResultCheckTask.java +++ b/src/main/java/cn/com/tenlion/operator/util/task/WxPayResultCheckTask.java @@ -40,23 +40,35 @@ public class WxPayResultCheckTask { } /** - * 线上已支付订单的核对(10分钟之内的) + * 线上微信近10分钟未核对的订单 */ - @Scheduled(fixedDelay = 60 * 1000 * 2) - public void updateStatus() { - LOG.debug("检查支付宝和微信,已支付未核对的订单"); + @Scheduled(fixedDelay = 60 * 1000 * 1) + public void updateWxStatus() { + LOG.debug("检查微信近10分钟未核对的订单"); // 未充值的订单 - List accountRechargePOS = iAccountRechargeService.listPOByRechargeCheck(RechargeCheckEnum.RECHARGED); + List accountRechargePOS = iAccountRechargeService.listPOByOnlineNotCheck(ThirdPartyEnum.WX.getValue()); accountRechargePOS.forEach(po -> { - LocalDateTime now = LocalDateTime.now(); - LocalDateTime gmtCreateDateTime = LocalDateTime.parse(po.getGmtCreate(), DateTimeFormatter.ofPattern(ISystemConstant.DATE_FORMATTER_YYYY_MM_DD_HH_MM_SS)); - if (StringUtils.equals(po.getThirdParty(), ThirdPartyEnum.WX.getValue()) && now.isAfter(gmtCreateDateTime.plusMinutes(10))) { + if (StringUtils.equals(po.getThirdParty(), ThirdPartyEnum.WX.getValue())) { PayResultDTO payResultDTO = WXPay.queryPay(po.getAccountRechargeId()); // 成功 if (payResultDTO.getOrderStatus().equals("1") && payResultDTO.getMoney().equals(PayUtil.buiderMoney(po.getRechargeMoney())) ) { iAccountRechargeStaticService.saveConfirmOnline(po.getAccountRechargeId(), payResultDTO.getOrderId(), payResultDTO.getOrderSuccessTime()); } - } else if (StringUtils.equals(po.getThirdParty(), ThirdPartyEnum.ZFB.getValue()) && now.isAfter(gmtCreateDateTime.plusMinutes(10))) { + } + }); + } + + + /** + * 线上支付宝近10分钟未核对的订单 + */ + @Scheduled(fixedDelay = 60 * 1000 * 1) + public void updateZfbStatus() { + LOG.debug("检查支付宝近10分钟未核对的订单"); + // 未充值的订单 + List accountRechargePOS = iAccountRechargeService.listPOByOnlineNotCheck(ThirdPartyEnum.ZFB.getValue()); + accountRechargePOS.forEach(po -> { + if (StringUtils.equals(po.getThirdParty(), ThirdPartyEnum.ZFB.getValue())) { PayResultDTO payResultDTO = ALiPay.queryPay(po.getAccountRechargeId()); // 成功 if (payResultDTO.getOrderStatus().equals("1") && payResultDTO.getMoney().equals(PayUtil.buiderMoney(po.getRechargeMoney())) ) { diff --git a/src/main/resources/mybatis/mapper/accountrecharge/account-recharge-mapper.xml b/src/main/resources/mybatis/mapper/accountrecharge/account-recharge-mapper.xml index dc10486..6527848 100644 --- a/src/main/resources/mybatis/mapper/accountrecharge/account-recharge-mapper.xml +++ b/src/main/resources/mybatis/mapper/accountrecharge/account-recharge-mapper.xml @@ -567,6 +567,9 @@ AND t1.recharge_check = #{rechargeCheck} + + AND (t1.recharge_check = '0' OR t1.recharge_check = '1' ) AND t1.recharge_type = '2' AND t1.third_party = #{queryOnline} AND t1.recharge_final_time = '' >= NOW() - INTERVAL 10 MINUTE + AND t1.account_recharge_id IN diff --git a/src/main/resources/static/assets/images/headicon1.png b/src/main/resources/static/assets/images/headicon1.png index 071acb4f995b8e054e3e7c3865da1983d8f10662..8681960c0b725c4f1bec65b9e5729363fead0e2f 100644 GIT binary patch literal 16191 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

r3QM4i-d#Mq4RRc{g(8>%~3rN6=MD^(5fMhK5aj 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 oRA`laNMrw>Ak@T{IsA;F?u%22M=d(>@2d__l2?